var Calendar=new Class({Implements:[Events,Options],options:{dayLabelLength:2,blocked:[],bounds:{start:null,end:null},classes:{calendar:"calendar",prev:"prev",next:"next",month:"month",year:"year",today:"today",invalid:"invalid",valid:"valid",inactive:"inactive",active:"active",hover:"hover",hilite:"hilite"},days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],direction:0,draggable:true,months:["January","February","March","April","May","June","July","August","September","October","November","December"],navigation:1,offset:0,onHideStart:$empty,onHideComplete:$empty,onShowStart:$empty,onShowComplete:$empty,onValuesStart:$empty,pad:1,tweak:{x:0,y:0}},initialize:function(e,a){if(!e){return false}this.setOptions(a);this.classes=this.options.classes;this.calendar=new Element("div",{"class":this.classes.calendar,styles:{left:"-1000px",opacity:0,position:"absolute",top:"-1000px",zIndex:1000}}).inject(document.body);this.calendar.coord=this.calendar.getCoordinates();if(Browser.Engine.trident4){this.iframe=new IFrame({styles:{left:"-1000px",position:"absolute",top:"-1000px",zIndex:999}}).inject(document.body);this.iframe.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"}this.fx=new Fx.Tween(this.calendar,{link:"chain",duration:"short",onStart:function(){if(this.calendar.getStyle("opacity")==0){this.fireEvent("onShowStart",this.element)}else{this.fireEvent("onHideStart",this.element)}}.bind(this),onComplete:function(){if(this.calendar.getStyle("opacity")==0){if(Browser.Engine.trident4){this.iframe.setStyles({left:"-1000px",top:"-1000px"})}this.fireEvent("onHideComplete",this.element)}else{this.fireEvent("onShowComplete",this.element)}}.bind(this)});if(window.Drag&&this.options.draggable){this.drag=new Drag.Move(this.calendar,{onDrag:function(){if(Browser.Engine.trident4){this.iframe.setStyles({left:this.calendar.getStyle("left"),top:this.calendar.getStyle("top")})}}.bind(this)})}this.calendars=[];var g=0;var f=new Date();f.setDate(f.getDate()+this.options.direction.toInt());for(var b in e){var c={button:new Element("button",{type:"button"}),el:$(b),els:[],id:g++,month:f.getMonth(),visible:false,year:f.getFullYear()};if(!this.element(b,e[b],c)){continue}this.fn=function(i,h){i.stop();this.toggle(h)}.create({"arguments":c,bind:this,event:true});c.el.addClass(this.classes.calendar);c.button.addClass(this.classes.calendar).addEvent("click",this.fn).inject(c.el,"after");c.val=this.read(c);$extend(c,this.bounds(c));$extend(c,this.values(c));this.rebuild(c);this.calendars.push(c)}return this},blocked:function(c){var a=[];var e=new Date(c.year,c.month,1).getDay();var b=new Date(c.year,c.month+1,0).getDate();this.options.blocked.each(function(h){var g=h.split(" ");for(var j=0;j<3;j++){if(!g[j]){g[j]="*"}g[j]=g[j].contains(",")?g[j].split(","):new Array(g[j])}if(g[2].contains(c.year+"")||g[2].contains("*")){if(g[1].contains(c.month+1+"")||g[1].contains("*")){g[0].each(function(i){if(i>0){a.push(i.toInt())}});if(g[3]){g[3]=g[3].contains(",")?g[3].split(","):new Array(g[3]);for(var j=0;j<b;j++){var f=(j+e)%7;if(g[3].contains(f+"")){a.push(j+1)}}}}}},this);return a},bounds:function(c){if($defined(this.options.bounds.start)&&$defined(this.options.bounds.end)){if($type(this.options.bounds.end)=="date"&&$type(this.options.bounds.start)=="date"&&this.options.bounds.end>=this.options.bounds.start){return{start:this.options.bounds.start,end:this.options.bounds.end}}}var e=new Date(1000,0,1);var a=new Date(2999,11,31);var b=new Date().getDate()+this.options.direction.toInt();if(this.options.direction>0){e=new Date();e.setDate(b+this.options.pad*c.id)}if(this.options.direction<0){a=new Date();a.setDate(b-this.options.pad*(this.calendars.length-c.id-1))}c.els.each(function(g){if(g.get("tag")=="select"){if(g.retrieve("format").test("(y|Y)")){var f=[];g.getChildren().each(function(k){var j=this.unformat(k.get("value"),g.retrieve("format"));if(!f.contains(j[0])){f.push(j[0])}},this);f.sort(this.sort);if(f[0]>e.getFullYear()){d=new Date(f[0],e.getMonth()+1,0);if(e.getDate()>d.getDate()){e.setDate(d.getDate())}e.setYear(f[0])}if(f.getLast()<a.getFullYear()){d=new Date(f.getLast(),a.getMonth()+1,0);if(a.getDate()>d.getDate()){a.setDate(d.getDate())}a.setYear(f.getLast())}}if(g.retrieve("format").test("(F|m|M|n)")){var h=[];var i=[];g.getChildren().each(function(k){var j=this.unformat(k.get("value"),g.retrieve("format"));if($type(j[0])!="number"||j[0]==f[0]){if(!h.contains(j[1])){h.push(j[1])}}if($type(j[0])!="number"||j[0]==f.getLast()){if(!i.contains(j[1])){i.push(j[1])}}},this);h.sort(this.sort);i.sort(this.sort);if(h[0]>e.getMonth()){d=new Date(e.getFullYear(),h[0]+1,0);if(e.getDate()>d.getDate()){e.setDate(d.getDate())}e.setMonth(h[0])}if(i.getLast()<a.getMonth()){d=new Date(e.getFullYear(),i.getLast()+1,0);if(a.getDate()>d.getDate()){a.setDate(d.getDate())}a.setMonth(i.getLast())}}}},this);return{start:e,end:a}},caption:function(h){var a={prev:{month:true,year:true},next:{month:true,year:true}};if(h.year==h.start.getFullYear()){a.prev.year=false;if(h.month==h.start.getMonth()&&this.options.navigation==1){a.prev.month=false}}if(h.year==h.end.getFullYear()){a.next.year=false;if(h.month==h.end.getMonth()&&this.options.navigation==1){a.next.month=false}}if($type(h.months)=="array"){if(h.months.length==1&&this.options.navigation==2){a.prev.month=a.next.month=false}}var b=new Element("caption");var f=new Element("a").addClass(this.classes.prev).appendText("\x3c");var e=new Element("a").addClass(this.classes.next).appendText("\x3e");if(this.options.navigation==2){var g=new Element("span").addClass(this.classes.month).inject(b);if(a.prev.month){f.clone().addEvent("click",function(i){this.navigate(i,"m",-1)}.pass(h,this)).inject(g)}g.adopt(new Element("span").appendText(this.options.months[h.month]));if(a.next.month){e.clone().addEvent("click",function(i){this.navigate(i,"m",1)}.pass(h,this)).inject(g)}var c=new Element("span").addClass(this.classes.year).inject(b);if(a.prev.year){f.clone().addEvent("click",function(i){this.navigate(i,"y",-1)}.pass(h,this)).inject(c)}c.adopt(new Element("span").appendText(h.year));if(a.next.year){e.clone().addEvent("click",function(i){this.navigate(i,"y",1)}.pass(h,this)).inject(c)}}else{if(a.prev.month&&this.options.navigation){f.clone().addEvent("click",function(i){this.navigate(i,"m",-1)}.pass(h,this)).inject(b)}b.adopt(new Element("span").addClass(this.classes.month).appendText(this.options.months[h.month]));b.adopt(new Element("span").addClass(this.classes.year).appendText(h.year));if(a.next.month&&this.options.navigation){e.clone().addEvent("click",function(i){this.navigate(i,"m",1)}.pass(h,this)).inject(b)}}return b},changed:function(a){a.val=this.read(a);$extend(a,this.values(a));this.rebuild(a);if(!a.val){return}if(a.val.getDate()<a.days[0]){a.val.setDate(a.days[0])}if(a.val.getDate()>a.days.getLast()){a.val.setDate(a.days.getLast())}a.els.each(function(b){b.set("value",this.format(a.val,b.retrieve("format")))},this);this.check(a);this.calendars.each(function(b){if(b.visible){this.display(b)}},this)},check:function(a){this.calendars.each(function(e,b){if(e.val){var f=false;if(b<a.id){var c=new Date(Date.parse(a.val));c.setDate(c.getDate()-(this.options.pad*(a.id-b)));if(c<e.val){f=true}}if(b>a.id){var c=new Date(Date.parse(a.val));c.setDate(c.getDate()+(this.options.pad*(b-a.id)));if(c>e.val){f=true}}if(f){if(e.start>c){c=e.start}if(e.end<c){c=e.end}e.month=c.getMonth();e.year=c.getFullYear();$extend(e,this.values(e));e.val=e.days.contains(c.getDate())?c:null;this.write(e);if(e.visible){this.display(e)}}}},this)},clicked:function(c,a,b){b.val=(this.value(b)==a)?null:new Date(b.year,b.month,a);this.write(b);if(!b.val){b.val=this.read(b)}if(b.val){this.check(b);this.toggle(b)}else{c.addClass(this.classes.valid);c.removeClass(this.classes.active)}},display:function(m){this.calendar.empty();this.calendar.className=this.classes.calendar+" "+this.options.months[m.month].toLowerCase();var e=this.displayHead(m);if($defined(e)&&$defined(e.inject)){e.inject(this.calendar)}var n=new Element("div").inject(this.calendar);var u=new Element("table").inject(n).adopt(this.caption(m));var t=new Element("thead").inject(u);var b=new Element("tr").inject(t);for(var s=0;s<=6;s++){var g=this.options.days[(s+this.options.offset)%7];b.adopt(new Element("th",{title:g}).appendText(g.substr(0,this.options.dayLabelLength)))}var a=new Element("tbody").inject(u);var b=new Element("tr").inject(a);var w=new Date(m.year,m.month,1);var f=((w.getDay()-this.options.offset)+7)%7;var l=new Date(m.year,m.month+1,0).getDate();var o=new Date(m.year,m.month,0).getDate();var h=this.value(m);var q=m.days;var p=[];var j=[];this.calendars.each(function(A,z){if(A!=m&&A.val){if(m.year==A.val.getFullYear()&&m.month==A.val.getMonth()){p.push(A.val.getDate())}if(m.val){for(var y=1;y<=l;y++){w.setDate(y);if((z<m.id&&w>A.val&&w<m.val)||(z>m.id&&w>m.val&&w<A.val)){if(!j.contains(y)){j.push(y)}}}}}},this);var w=new Date();var v=new Date(w.getFullYear(),w.getMonth(),w.getDate()).getTime();for(var s=1;s<43;s++){if((s-1)%7==0){b=new Element("tr").inject(a)}var k=new Element("td").inject(b);var r=s-f;var x=new Date(m.year,m.month,r);var c="";if(r===h){c=this.classes.active}else{if(p.contains(r)){c=this.classes.inactive}else{if(q.contains(r)){c=this.classes.valid}else{if(r>=1&&r<=l){c=this.classes.invalid}}}}if(x.getTime()==v){c=c+" "+this.classes.today}if(j.contains(r)){c=c+" "+this.classes.hilite}k.addClass(c);if(q.contains(r)){k.set("title",this.format(x,"D M jS Y"));k.addEvents({click:function(z,i,y){this.clicked(z,i,y)}.pass([k,r,m],this),mouseover:function(y,i){y.addClass(i)}.pass([k,this.classes.hover]),mouseout:function(y,i){y.removeClass(i)}.pass([k,this.classes.hover])})}if(r<1){r=o+r}else{if(r>l){r=r-l}}k.appendText(r)}e=this.displayFooter(m);if($defined(e)&&$defined(e.inject)){e.inject(this.calendar)}this.calendar.coord=this.calendar.getCoordinates()},displayHead:function(a){},displayFooter:function(a){},element:function(b,c,e){if($type(c)=="object"){for(var a in c){if(!this.element(a,c[a],e)){return false}}return true}b=$(b);if(!b){return false}b.store("format",c);if(b.get("tag")=="select"){b.addEvent("change",function(f){this.changed(f)}.pass(e,this))}else{b.set("readonly","readonly");b.addEvent("focus",function(f){this.toggle(f)}.pass(e,this))}e.els.push(b);return true},format:function(a,j){var h="";if(a){var l=a.getDate();var p=this.options.days[a.getDay()];var b=a.getMonth()+1;var k=this.options.months[a.getMonth()];var o=a.getFullYear()+"";for(var e=0;e<j.length;e++){var n=j.charAt(e);switch(n){case"y":o=o.substr(2);case"Y":h+=o;break;case"m":if(b<10){b="0"+b}case"n":h+=b;break;case"M":k=k.substr(0,3);case"F":h+=k;break;case"d":if(l<10){l="0"+l}case"j":h+=l;break;case"D":p=p.substr(0,3);case"l":h+=p;break;case"S":if(l%10==1&&l!="11"){h+="st"}else{if(l%10==2&&l!="12"){h+="nd"}else{if(l%10==3&&l!="13"){h+="rd"}else{h+="th"}}}break;default:h+=n}}}return h},navigate:function(c,b,e){switch(b){case"m":if($type(c.months)=="array"){var a=c.months.indexOf(c.month)+e;if(a<0||a==c.months.length){if(this.options.navigation==1){this.navigate(c,"y",e)}a=(a<0)?c.months.length-1:0}c.month=c.months[a]}else{var a=c.month+e;if(a<0||a==12){if(this.options.navigation==1){this.navigate(c,"y",e)}a=(a<0)?11:0}c.month=a}break;case"y":if($type(c.years)=="array"){var a=c.years.indexOf(c.year)+e;c.year=c.years[a]}else{c.year+=e}break}$extend(c,this.values(c));if($type(c.months)=="array"){var a=c.months.indexOf(c.month);if(a<0){c.month=c.months[0]}}this.display(c)},read:function(c){var a=[null,null,null];c.els.each(function(g){var f=this.unformat(g.get("value"),g.retrieve("format"));f.each(function(j,h){if($type(j)=="number"){a[h]=j}})},this);if($type(a[0])=="number"){c.year=a[0]}if($type(a[1])=="number"){c.month=a[1]}var e=null;if(a.every(function(f){return $type(f)=="number"})){var b=new Date(a[0],a[1]+1,0).getDate();if(a[2]>b){a[2]=b}e=new Date(a[0],a[1],a[2])}return(c.val==e)?null:e},rebuild:function(a){a.els.each(function(b){if(b.get("tag")=="select"&&b.retrieve("format").test("^(d|j)$")){var c=this.value(a);if(!c){c=b.get("value").toInt()}b.empty();a.days.each(function(e){var f=new Element("option",{value:((b.retrieve("format")=="d"&&e<10)?"0"+e:e)}).appendText(e).inject(b);if(c==e){f.set("selected","selected")}},this)}},this)},sort:function(e,c){return e-c},toggle:function(c){document.removeEvent("mousedown",this.fn);if(c.visible){c.visible=false;c.button.removeClass(this.classes.active);this.fx.start("opacity",0)}else{this.fn=function(k,j){var i=new Event(k);var h=$(i.target);var g=false;while(h!=document.body&&h.nodeType==1){if(h==this.calendar){g=true}this.calendars.each(function(l){if(l.button==h||l.els.contains(h)){g=true}});if(g){k.stop();return false}else{h=h.getParent()}}this.toggle(j)}.create({"arguments":c,bind:this,event:true});document.addEvent("mousedown",this.fn);this.calendars.each(function(g){if(g==c){g.visible=true;g.button.addClass(this.classes.active)}else{g.visible=false;g.button.removeClass(this.classes.active)}},this);this.display(c);var b=window.getScrollSize();var f=c.button.getCoordinates();var a=f.right+this.options.tweak.x;var e=f.top+this.options.tweak.y;if(a+this.calendar.coord.width>b.x){a-=(a+this.calendar.coord.width-b.x)}if(e+this.calendar.coord.height>b.y){e-=(e+this.calendar.coord.height-b.y)}this.calendar.setStyles({left:a+"px",top:e+"px"});if(Browser.Engine.trident4){this.iframe.setStyles({left:a+"px",top:e+"px",height:this.calendar.coord.height+"px",width:this.calendar.coord.width+"px"})}this.fx.start("opacity",1)}},unformat:function(b,l){l=l.escapeRegExp();var n={d:"([0-9]{2})",j:"([0-9]{1,2})",D:"("+this.options.days.map(function(c){return c.substr(0,3)}).join("|")+")",l:"("+this.options.days.join("|")+")",S:"(st|nd|rd|th)",F:"("+this.options.months.join("|")+")",m:"([0-9]{2})",M:"("+this.options.months.map(function(c){return c.substr(0,3)}).join("|")+")",N:"([0-9]{1,2})",n:"([0-9]{1,2})",Y:"([0-9]{4})",y:"([0-9]{2})"};var j=[];var k="";for(var e=0;e<l.length;e++){var m=l.charAt(e);if(n[m]){j.push(m);k+=n[m]}else{k+=m}}var h=b.match("^"+k+"$");var a=new Array(3);if(h){h=h.slice(1);j.each(function(g,f){f=h[f];switch(g){case"y":f="19"+f;case"Y":a[0]=f.toInt();break;case"F":f=f.substr(0,3);case"M":f=this.options.months.map(function(c){return c.substr(0,3)}).indexOf(f)+1;case"m":case"n":a[1]=f.toInt()-1;break;case"d":case"j":a[2]=f.toInt();break}},this)}return a},value:function(b){var a=null;if(b.val){if(b.year==b.val.getFullYear()&&b.month==b.val.getMonth()){a=b.val.getDate()}}return a},values:function(g){this.fireEvent("onValuesStart",this.element);var e,a,j;g.els.each(function(i){if(i.get("tag")=="select"){if(i.retrieve("format").test("(y|Y)")){e=[];i.getChildren().each(function(l){var k=this.unformat(l.get("value"),i.retrieve("format"));if(!e.contains(k[0])){e.push(k[0])}},this);e.sort(this.sort)}if(i.retrieve("format").test("(F|m|M|n|N)")){a=[];i.getChildren().each(function(l){var k=this.unformat(l.get("value"),i.retrieve("format"));if($type(k[0])!="number"||k[0]==g.year){if(!a.contains(k[1])){a.push(k[1])}}},this);a.sort(this.sort)}if(i.retrieve("format").test("(d|j)")&&!i.retrieve("format").test("^(d|j)$")){j=[];i.getChildren().each(function(l){var k=this.unformat(l.get("value"),i.retrieve("format"));if(k[0]==g.year&&k[1]==g.month){if(!j.contains(k[2])){j.push(k[2])}}},this)}}},this);var h=1;var f=new Date(g.year,g.month+1,0).getDate();if(g.year==g.start.getFullYear()){if(a==null&&this.options.navigation==2){a=[];for(var c=0;c<12;c++){if(c>=g.start.getMonth()){a.push(c)}}}if(g.month==g.start.getMonth()){h=g.start.getDate()}}if(g.year==g.end.getFullYear()){if(a==null&&this.options.navigation==2){a=[];for(var c=0;c<12;c++){if(c<=g.end.getMonth()){a.push(c)}}}if(g.month==g.end.getMonth()){f=g.end.getDate()}}var b=this.blocked(g);if($type(j)=="array"){j=j.filter(function(i){if(i>=h&&i<=f&&!b.contains(i)){return i}})}else{j=[];for(var c=h;c<=f;c++){if(!b.contains(c)){j.push(c)}}}j.sort(this.sort);return{days:j,months:a,years:e}},write:function(a){this.rebuild(a);a.els.each(function(b){b.set("value",this.format(a.val,b.retrieve("format")))},this)}});
