var DatePicker=new Class({Implements:Options,d:"",today:"",choice:{},bodysize:{},limit:{},attachTo:null,picker:null,slider:null,oldContents:null,newContents:null,input:null,visual:null,options:{pickerClass:"datepicker",days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],dayShort:2,monthShort:3,startDay:1,timePicker:false,timePickerOnly:false,yearPicker:true,yearsPerPage:20,format:"d-m-Y",allowEmpty:false,inputOutputFormat:"U",animationDuration:400,useFadeInOut:!Browser.Engine.trident,startView:"month",positionOffset:{x:0,y:0},minDate:null,maxDate:null,debug:false,toggleElements:null,onShow:$empty,onClose:$empty,onSelect:$empty},initialize:function(B,A){this.attachTo=B;this.setOptions(A).attach();if(this.options.timePickerOnly){this.options.timePicker=true;this.options.startView="time"}this.formatMinMaxDates();document.addEvent("mousedown",this.close.bind(this))},formatMinMaxDates:function(){if(this.options.minDate&&this.options.minDate.format){this.options.minDate=this.unformat(this.options.minDate.date,this.options.minDate.format)}if(this.options.maxDate&&this.options.maxDate.format){this.options.maxDate=this.unformat(this.options.maxDate.date,this.options.maxDate.format);this.options.maxDate.setHours(23);this.options.maxDate.setMinutes(59);this.options.maxDate.setSeconds(59)}},attach:function(){if($chk(this.options.toggleElements)){var A=$$(this.options.toggleElements);document.addEvents({keydown:function(B){if(B.key=="tab"){this.close(null,true)}}.bind(this)})}$$(this.attachTo).each(function(D,C){if(D.retrieve("datepicker")){return }if($chk(D.get("value"))){var B=this.format(new Date(this.unformat(D.get("value"),this.options.inputOutputFormat)),this.options.format)}else{if(!this.options.allowEmpty){var B=this.format(new Date(),this.options.format)}else{var B=""}}var E=D.getStyle("display");var F=D.setStyle("display",this.options.debug?E:"none").store("datepicker",true).clone().store("datepicker",true).removeProperty("name").setStyle("display",E).set("value",B).inject(D,"after");if($chk(this.options.toggleElements)){A[C].setStyle("cursor","pointer").addEvents({click:function(G){this.onFocus(D,F)}.bind(this)});F.addEvents({blur:function(){D.set("value",F.get("value"))}})}else{F.addEvents({keydown:function(G){if(this.options.allowEmpty&&(G.key=="delete"||G.key=="backspace")){D.set("value","");G.target.set("value","");this.close(null,true)}else{if(G.key=="tab"){this.close(null,true)}else{G.stop()}}}.bind(this),focus:function(G){this.onFocus(D,F)}.bind(this)})}}.bind(this))},onFocus:function(B,A){var C,D=A.getCoordinates();if($chk(B.get("value"))){C=this.unformat(B.get("value"),this.options.inputOutputFormat).valueOf()}else{C=new Date();if($chk(this.options.maxDate)&&C.valueOf()>this.options.maxDate.valueOf()){C=new Date(this.options.maxDate.valueOf())}if($chk(this.options.minDate)&&C.valueOf()<this.options.minDate.valueOf()){C=new Date(this.options.minDate.valueOf())}}this.show({left:D.left+this.options.positionOffset.x,top:D.top+D.height+this.options.positionOffset.y},C);this.input=B;this.visual=A;this.options.onShow()},dateToObject:function(A){return{year:A.getFullYear(),month:A.getMonth(),day:A.getDate(),hours:A.getHours(),minutes:A.getMinutes(),seconds:A.getSeconds()}},dateFromObject:function(A){var B=new Date();B.setDate(1);["year","month","day","hours","minutes","seconds"].each(function(D){var C=A[D];if(!$chk(C)){return }switch(D){case"day":B.setDate(C);break;case"month":B.setMonth(C);break;case"year":B.setFullYear(C);break;case"hours":B.setHours(C);break;case"minutes":B.setMinutes(C);break;case"seconds":B.setSeconds(C);break}});return B},show:function(A,B){this.formatMinMaxDates();if($chk(B)){this.d=new Date(B)}else{this.d=new Date()}this.today=new Date();this.choice=this.dateToObject(this.d);this.mode=(this.options.startView=="time"&&!this.options.timePicker)?"month":this.options.startView;this.render();this.picker.setStyles(A)},render:function(B){if(!$chk(this.picker)){this.constructPicker()}else{var C=this.oldContents;this.oldContents=this.newContents;this.newContents=C;this.newContents.empty()}var A=new Date(this.d.getTime());this.limit={right:false,left:false};if(this.mode=="decades"){this.renderDecades()}else{if(this.mode=="year"){this.renderYear()}else{if(this.mode=="time"){this.renderTime();this.limit={right:true,left:true}}else{this.renderMonth()}}}this.picker.getElement(".previous").setStyle("visibility",this.limit.left?"hidden":"visible");this.picker.getElement(".next").setStyle("visibility",this.limit.right?"hidden":"visible");this.picker.getElement(".titleText").setStyle("cursor",this.allowZoomOut()?"pointer":"default");this.d=A;if(this.picker.getStyle("opacity")==0){this.picker.tween("opacity",0,1)}if($chk(B)){this.fx(B)}},fx:function(A){if(A=="right"){this.oldContents.setStyles({left:0,opacity:1});this.newContents.setStyles({left:this.bodysize.x,opacity:1});this.slider.setStyle("left",0).tween("left",0,-this.bodysize.x)}else{if(A=="left"){this.oldContents.setStyles({left:this.bodysize.x,opacity:1});this.newContents.setStyles({left:0,opacity:1});this.slider.setStyle("left",-this.bodysize.x).tween("left",-this.bodysize.x,0)}else{if(A=="fade"){this.slider.setStyle("left",0);this.oldContents.setStyle("left",0).set("tween",{duration:this.options.animationDuration/2}).tween("opacity",1,0);this.newContents.setStyles({opacity:0,left:0}).set("tween",{duration:this.options.animationDuration}).tween("opacity",0,1)}}}},constructPicker:function(){this.picker=new Element("div",{"class":this.options.pickerClass}).inject(document.body);if(this.options.useFadeInOut){this.picker.setStyle("opacity",0).set("tween",{duration:this.options.animationDuration})}var C=new Element("div",{"class":"header"}).inject(this.picker);var B=new Element("div",{"class":"title"}).inject(C);new Element("div",{"class":"previous"}).addEvent("click",this.previous.bind(this)).set("text","«").inject(C);new Element("div",{"class":"next"}).addEvent("click",this.next.bind(this)).set("text","»").inject(C);new Element("div",{"class":"closeButton"}).addEvent("click",this.close.bindWithEvent(this,true)).set("text","x").inject(C);new Element("span",{"class":"titleText"}).addEvent("click",this.zoomOut.bind(this)).inject(B);var A=new Element("div",{"class":"body"}).inject(this.picker);this.bodysize=A.getSize();this.slider=new Element("div",{styles:{position:"absolute",top:0,left:0,width:2*this.bodysize.x,height:this.bodysize.y}}).set("tween",{duration:this.options.animationDuration,transition:Fx.Transitions.Quad.easeInOut}).inject(A);this.oldContents=new Element("div",{styles:{position:"absolute",top:0,left:this.bodysize.x,width:this.bodysize.x,height:this.bodysize.y}}).inject(this.slider);this.newContents=new Element("div",{styles:{position:"absolute",top:0,left:0,width:this.bodysize.x,height:this.bodysize.y}}).inject(this.slider)},renderTime:function(){var A=new Element("div",{"class":"time"}).inject(this.newContents);if(this.options.timePickerOnly){this.picker.getElement(".titleText").set("text","Select a time")}else{this.picker.getElement(".titleText").set("text",this.format(this.d,"j M, Y"))}new Element("input",{type:"text","class":"hour"}).set("value",this.leadZero(this.d.getHours())).addEvents({mousewheel:function(D){var C=D.target,B=C.get("value").toInt();C.focus();if(D.wheel>0){B=(B<23)?B+1:0}else{B=(B>0)?B-1:23}C.set("value",this.leadZero(B));D.stop()}.bind(this)}).set("maxlength",2).inject(A);new Element("input",{type:"text","class":"minutes"}).set("value",this.leadZero(this.d.getMinutes())).addEvents({mousewheel:function(D){var C=D.target,B=C.get("value").toInt();C.focus();if(D.wheel>0){B=(B<59)?B+1:0}else{B=(B>0)?B-1:59}C.set("value",this.leadZero(B));D.stop()}.bind(this)}).set("maxlength",2).inject(A);new Element("div",{"class":"separator"}).set("text",":").inject(A);new Element("input",{type:"submit",value:"OK","class":"ok"}).addEvents({click:function(B){B.stop();this.select($merge(this.dateToObject(this.d),{hours:this.picker.getElement(".hour").get("value").toInt(),minutes:this.picker.getElement(".minutes").get("value").toInt()}))}.bind(this)}).set("maxlength",2).inject(A)},renderMonth:function(){var F=this.d.getMonth();this.picker.getElement(".titleText").set("text",this.options.months[F]+" "+this.d.getFullYear());this.d.setDate(1);while(this.d.getDay()!=this.options.startDay){this.d.setDate(this.d.getDate()-1)}var A=new Element("div",{"class":"days"}).inject(this.newContents);var E=new Element("div",{"class":"titles"}).inject(A);var H,D,C,G,J;for(H=this.options.startDay;H<(this.options.startDay+7);H++){new Element("div",{"class":"title day day"+(H%7)}).set("text",this.options.days[(H%7)].substring(0,this.options.dayShort)).inject(E)}var B=false;var K=this.today.toDateString();var I=this.dateFromObject(this.choice).toDateString();for(D=0;D<42;D++){C=[];C.push("day");C.push("day"+this.d.getDay());if(this.d.toDateString()==K){C.push("today")}if(this.d.toDateString()==I){C.push("selected")}if(this.d.getMonth()!=F){C.push("otherMonth")}if(D%7==0){J=new Element("div",{"class":"week week"+(Math.floor(D/7))}).inject(A)}G=new Element("div",{"class":C.join(" ")}).set("text",this.d.getDate()).inject(J);if(this.limited("date")){G.addClass("unavailable");if(B){this.limit.right=true}else{if(this.d.getMonth()==F){this.limit.left=true}}}else{B=true;G.addEvent("click",function(L,M){if(this.options.timePicker){this.d.setDate(M.day);this.d.setMonth(M.month);this.mode="time";this.render("fade")}else{this.select(M)}}.bindWithEvent(this,{day:this.d.getDate(),month:this.d.getMonth(),year:this.d.getFullYear()}))}this.d.setDate(this.d.getDate()+1)}if(!B){this.limit.right=true}},renderYear:function(){var F=this.today.getMonth();var C=this.d.getFullYear()==this.today.getFullYear();var G=this.d.getFullYear()==this.choice.year;this.picker.getElement(".titleText").set("text",this.d.getFullYear());this.d.setMonth(0);var B,E;var D=false;var A=new Element("div",{"class":"months"}).inject(this.newContents);for(B=0;B<=11;B++){E=new Element("div",{"class":"month month"+(B+1)+(B==F&&C?" today":"")+(B==this.choice.month&&G?" selected":"")}).set("text",this.options.monthShort?this.options.months[B].substring(0,this.options.monthShort):this.options.months[B]).inject(A);if(this.limited("month")){E.addClass("unavailable");if(D){this.limit.right=true}else{this.limit.left=true}}else{D=true;E.addEvent("click",function(H,I){this.d.setDate(1);this.d.setMonth(I);this.mode="month";this.render("fade")}.bindWithEvent(this,B))}this.d.setMonth(B)}if(!D){this.limit.right=true}},renderDecades:function(){while(this.d.getFullYear()%this.options.yearsPerPage>0){this.d.setFullYear(this.d.getFullYear()-1)}this.picker.getElement(".titleText").set("text",this.d.getFullYear()+"-"+(this.d.getFullYear()+this.options.yearsPerPage-1));var B,E,D;var C=false;var A=new Element("div",{"class":"years"}).inject(this.newContents);if($chk(this.options.minDate)&&this.d.getFullYear()<=this.options.minDate.getFullYear()){this.limit.left=true}for(B=0;B<this.options.yearsPerPage;B++){E=this.d.getFullYear();D=new Element("div",{"class":"year year"+B+(E==this.today.getFullYear()?" today":"")+(E==this.choice.year?" selected":"")}).set("text",E).inject(A);if(this.limited("year")){D.addClass("unavailable");if(C){this.limit.right=true}else{this.limit.left=true}}else{C=true;D.addEvent("click",function(F,G){this.d.setFullYear(G);this.mode="year";this.render("fade")}.bindWithEvent(this,E))}this.d.setFullYear(this.d.getFullYear()+1)}if(!C){this.limit.right=true}if($chk(this.options.maxDate)&&this.d.getFullYear()>=this.options.maxDate.getFullYear()){this.limit.right=true}},limited:function(C){var B=$chk(this.options.minDate);var D=$chk(this.options.maxDate);if(!B&&!D){return false}switch(C){case"year":return(B&&this.d.getFullYear()<this.options.minDate.getFullYear())||(D&&this.d.getFullYear()>this.options.maxDate.getFullYear());case"month":var A=(""+this.d.getFullYear()+this.leadZero(this.d.getMonth())).toInt();return B&&A<(""+this.options.minDate.getFullYear()+this.leadZero(this.options.minDate.getMonth())).toInt()||D&&A>(""+this.options.maxDate.getFullYear()+this.leadZero(this.options.maxDate.getMonth())).toInt();case"date":return(B&&this.d<this.options.minDate)||(D&&this.d>this.options.maxDate)}},allowZoomOut:function(){if(this.mode=="time"&&this.options.timePickerOnly){return false}if(this.mode=="decades"){return false}if(this.mode=="year"&&!this.options.yearPicker){return false}return true},zoomOut:function(){if(!this.allowZoomOut()){return }if(this.mode=="year"){this.mode="decades"}else{if(this.mode=="time"){this.mode="month"}else{this.mode="year"}}this.render("fade")},previous:function(){if(this.mode=="decades"){this.d.setFullYear(this.d.getFullYear()-this.options.yearsPerPage)}else{if(this.mode=="year"){this.d.setFullYear(this.d.getFullYear()-1)}else{if(this.mode=="month"){this.d.setMonth(this.d.getMonth()-1)}}}this.render("left")},next:function(){if(this.mode=="decades"){this.d.setFullYear(this.d.getFullYear()+this.options.yearsPerPage)}else{if(this.mode=="year"){this.d.setFullYear(this.d.getFullYear()+1)}else{if(this.mode=="month"){this.d.setMonth(this.d.getMonth()+1)}}}this.render("right")},close:function(C,B){if(!$(this.picker)){return }var A=($chk(C)&&C.target!=this.picker&&!this.picker.hasChild(C.target)&&C.target!=this.visual);if(B||A){if(this.options.useFadeInOut){this.picker.set("tween",{duration:this.options.animationDuration/2,onComplete:this.destroy.bind(this)}).tween("opacity",1,0)}else{this.destroy()}}},destroy:function(){this.picker.destroy();this.picker=null;this.options.onClose()},select:function(A){this.choice=$merge(this.choice,A);var B=this.dateFromObject(this.choice);this.input.set("value",this.format(B,this.options.inputOutputFormat));this.visual.set("value",this.format(B,this.options.format));this.options.onSelect(B);this.close(null,true)},leadZero:function(A){return A<10?"0"+A:A},format:function(C,F){var E="";var D=C.getHours();var A=C.getMonth();for(var B=0;B<F.length;B++){switch(F.charAt(B)){case"\\":B++;E+=F.charAt(B);break;case"y":E+=(100+C.getYear()+"").substring(1);break;case"Y":E+=C.getFullYear();break;case"m":E+=this.leadZero(A+1);break;case"n":E+=(A+1);break;case"M":E+=this.options.months[A].substring(0,this.options.monthShort);break;case"F":E+=this.options.months[A];break;case"d":E+=this.leadZero(C.getDate());break;case"j":E+=C.getDate();break;case"D":E+=this.options.days[C.getDay()].substring(0,this.options.dayShort);break;case"l":E+=this.options.days[C.getDay()];break;case"G":E+=D;break;case"H":E+=this.leadZero(D);break;case"g":E+=(D%12?D%12:12);break;case"h":E+=this.leadZero(D%12?D%12:12);break;case"a":E+=(D>11?"pm":"am");break;case"A":E+=(D>11?"PM":"AM");break;case"i":E+=this.leadZero(C.getMinutes());break;case"s":E+=this.leadZero(C.getSeconds());break;case"U":E+=Math.floor(C.valueOf()/1000);break;default:E+=F.charAt(B)}}return E},unformat:function(E,F){var G=new Date();var B={};var H,A;E=E.toString();for(var D=0;D<F.length;D++){H=F.charAt(D);switch(H){case"\\":r=null;D++;break;case"y":r="[0-9]{2}";break;case"Y":r="[0-9]{4}";break;case"m":r="0[1-9]|1[012]";break;case"n":r="[1-9]|1[012]";break;case"M":r="[A-Za-z]{"+this.options.monthShort+"}";break;case"F":r="[A-Za-z]+";break;case"d":r="0[1-9]|[12][0-9]|3[01]";break;case"j":r="[1-9]|[12][0-9]|3[01]";break;case"D":r="[A-Za-z]{"+this.options.dayShort+"}";break;case"l":r="[A-Za-z]+";break;case"G":case"H":case"g":case"h":r="[0-9]{1,2}";break;case"a":r="(am|pm)";break;case"A":r="(AM|PM)";break;case"i":case"s":r="[012345][0-9]";break;case"U":r="-?[0-9]+$";break;default:r=null}if($chk(r)){A=E.match("^"+r);if($chk(A)){B[H]=A[0];E=E.substring(B[H].length)}else{if(this.options.debug){alert("Fatal Error in DatePicker\n\nUnexpected format at: '"+E+"' expected format character '"+H+"' (pattern '"+r+"')")}return G}}else{E=E.substring(1)}}for(H in B){var C=B[H];switch(H){case"y":G.setFullYear(C<30?2000+C.toInt():1900+C.toInt());break;case"Y":G.setFullYear(C);break;case"m":case"n":G.setMonth(C-1);break;case"M":C=this.options.months.filter(function(J,I){return J.substring(0,this.options.monthShort)==C}.bind(this))[0];case"F":G.setMonth(this.options.months.indexOf(C));break;case"d":case"j":G.setDate(C);break;case"G":case"H":G.setHours(C);break;case"g":case"h":if(B.a=="pm"||B.A=="PM"){G.setHours(C==12?0:C.toInt()+12)}else{G.setHours(C)}break;case"i":G.setMinutes(C);break;case"s":G.setSeconds(C);break;case"U":G=new Date(C.toInt()*1000)}}return G}});