var MooCalendar=new Class({Implements:[Options,Events],options:{minDate:null,maxDate:null,className:"moocalendar",weekDays:["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],outputDateFormat:"dd/mm/yyyy",inputDateFormat:"d/m/y",useFadeEffect:false,anchor:"BL"},initialize:function(B){this.setOptions(B);this.container=document.getElement("body");this.state="closed";if(this.options.minDate){this.options.minDate=this.removeTime(this.parseDate(this.options.minDate))}if(this.options.maxDate){this.options.maxDate=this.removeTime(this.parseDate(this.options.maxDate))}this._buildCalendar();var A=new Date();this.currentMonth=A.getMonth();this.currentYear=A.getFullYear();this.selectedDate=null;this.attachedElement=null;this._populateTable();if(this.options.useFadeEffect){this.fadeEffect=new Fx.Morph(this.calendarElement,{duration:200});this.fadeEffect.addEvent("complete",this._resetPosition.bind(this));this.fadeEffect.set({opacity:0})}else{this.calendarElement.setStyle("visibility","hidden")}this.calendarElement.inject(this.container);if(Browser.Engine.trident4){this._createScreen()}this.calendarElement.addEvents({click:this.insideClick.bindWithEvent(this),mouseover:this.mouseHover.bindWithEvent(this),mouseout:this.mouseHover.bindWithEvent(this)});document.addEvent("mousemove",this.mouseMove.bindWithEvent(this));document.addEvent("click",this.outsideClick.bindWithEvent(this))},_buildCalendar:function(){this.calendarElement=new Element("div",{"class":this.options.className,styles:{"z-index":100}});this.prevControl=new Element("span",{"class":"previous",text:"Previous"}).inject(this.calendarElement);this.nextControl=new Element("span",{"class":"next",text:"Next"}).inject(this.calendarElement);this.monthDisplay=new Element("span",{"class":"current-month"}).inject(this.calendarElement);var B,A;this.table=new Element("table");var D=new Element("thead").inject(this.table);var C=new Element("tr").inject(D);for(B=0;B<this.options.weekDays.length;B++){A=new Element("th").set("text",this.options.weekDays[B].substr(0,2)).inject(C);A.set("title",this.options.weekDays[B])}this.table.inject(this.calendarElement)},_populateTable:function(){var K=this.table.getElement("tbody");if(K){K.dispose()}K=new Element("tbody");var A=new Date(this.currentYear,this.currentMonth,1);var I=this.getRealDayNumber(A.getDay());var G=this.getDaysInMonth(this.currentMonth,this.currentYear);var C,J,B=1;var L=new Element("tr");for(C=0;C<I;C++){L.adopt(this._getEmptyCell())}var E=I;var F=new Date();F=this.removeTime(F);var D=A;var H=0;for(C=1;C<=G;C++){J=new Element("td",{text:C,id:"day-"+C}).inject(L);D.setDate(C);if(this.options.minDate&&this.compareDates(D,this.options.minDate)==-1){J.addClass("outOfRange")}if(this.options.maxDate&&this.compareDates(D,this.options.maxDate)==1){J.addClass("outOfRange")}if(this.compareDates(D,F)===0){J.addClass("today")}if(this.selectedDate!==null&&this.compareDates(D,this.selectedDate)===0){J.addClass("selected")}if(E>4){J.addClass("weekend")}if(++E==7){L.inject(K);L=new Element("tr");E=0;H++}}if(E>0){for(C=E;C<7;C++){L.adopt(this._getEmptyCell())}L.inject(K);H++}if(H<6){L=new Element("tr");for(C=0;C<7;C++){L.adopt(this._getEmptyCell())}L.inject(K)}K.inject(this.table);if(Browser.Engine.trident4&&this.state=="open"){this.iScreen.setStyle("height",this.calendarElement.getCoordinates().height+"px")}this._updateDisplay.delay(10,this)},_getEmptyCell:function(){var A=new Element("td").addClass("empty");A.set("html","&nbsp;");return A},_createScreen:function(){this.iScreen=new Element("iframe").setStyles({position:"absolute",display:"none",border:"none",padding:0,margin:0,"z-index":99}).inject(this.container)},_updateDisplay:function(){this.monthDisplay.set("html",this.options.monthNames[this.currentMonth].substr(0,3)+" "+this.currentYear)},nextMonth:function(){var A=this.currentMonth,B=this.currentYear;if(A==11){A=0;B=this.currentYear+1}else{A=this.currentMonth+1}if(this.options.maxDate&&this.compareDates(this.options.maxDate,new Date(B,A,1))==-1){return }this.currentMonth=A;this.currentYear=B;this._populateTable()},previousMonth:function(){var B=this.currentMonth,A=this.currentYear;if(B===0){B=11;A=this.currentYear-1}else{B=this.currentMonth-1}if(this.options.minDate&&this.compareDates(this.options.minDate,new Date(A,B+1,0))>0){return }this.currentMonth=B;this.currentYear=A;this._populateTable()},attach:function(A){this.attachedElement=$(A)},toggle:function(){if(this.state=="open"){this.hide()}else{this.show()}},show:function(G){if(this.state=="open"){return }if(G){if(typeof G=="string"){this.selectedDate=this.parseDate(G)}else{this.selectedDate=G}}else{if(this.attachedElement){this.selectedDate=this.parseDate(this.attachedElement.get("value"))}}if(this.selectedDate){this.currentMonth=this.selectedDate.getMonth();this.currentYear=this.selectedDate.getFullYear();this._populateTable()}var B={};if(this.attachedElement){var C=this.attachedElement.getCoordinates();switch(this.options.anchor){case"TR":B={top:C.top+"px",left:C.left+C.width+"px"};break;case"BL":B={top:C.top+C.height+"px",left:C.left+"px"};break}}else{var I=this.calendarElement.getSize();var F=window.getSize();var H=window.getScroll();var A=this.mouse.x+5;var D=this.mouse.y+5;if(A+I.x>F.x){A-=(I.x+10)}if(D+I.y>(H.y+F.y)){D-=(I.y+10)}B={top:D+"px",left:A+"px"}}this.calendarElement.setStyles(B);if(Browser.Engine.trident4){var E=this.calendarElement.getCoordinates();B.display="block";B.width=E.width+"px";B.height=E.height+"px";this.iScreen.setStyles(B)}if(this.options.useFadeEffect){this.fadeEffect.start({opacity:[0,1]})}else{this.calendarElement.setStyle("visibility","visible")}(function(){this.state="open"}).delay(100,this)},hide:function(){if(this.state=="closed"){return }if(this.options.useFadeEffect){this.fadeEffect.start({opacity:[1,0]})}else{this.calendarElement.setStyles({visibility:"hidden",top:0,left:0})}if(Browser.Engine.trident4){this.iScreen.setStyle("display","none")}this.state="closed"},_resetPosition:function(){if(this.state=="open"){return }this.calendarElement.setStyles({top:0,left:0})},outsideClick:function(A){if(this.attachedElement&&($(A.target)==this.attachedElement)){this.toggle()}else{this.hide()}},mouseMove:function(A){this.mouse=A.page},insideClick:function(B){var C=$(B.target);B.stop();if(C.get("tag")=="span"){if(C.hasClass("next")){this.nextMonth();return }if(C.hasClass("previous")){this.previousMonth();return }}if(C.get("tag")!="td"||C.hasClass("empty")||C.hasClass("outOfRange")){return }var A=this.table.getElement(".selected");if(A){A.removeClass("selected")}C.addClass("selected");this.selectedDate=new Date(this.currentYear,this.currentMonth,C.innerHTML);if(this.attachedElement){this.attachedElement.value=this.formatDate(this.selectedDate)}this.fireEvent("onSelect",[this.selectedDate]);this.hide()},mouseHover:function(A){var B=$(A.target);if(B.get("tag")=="td"&&!B.hasClass("empty")&&!B.hasClass("outOfRange")){B.toggleClass("hover")}},getDaysInMonth:function(C,B){var A=new Date(B,C+1,0);return A.getDate()},getRealDayNumber:function(A){return A===0?6:A-1},compareDates:function(B,A){if(B<A){return -1}if(B>A){return 1}return 0},formatDate:function(B,A){A=(A||this.options.outputDateFormat).toLowerCase();return A.replace(/(yyyy|yy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/gi,(function(C){switch(C.toLowerCase()){case"yyyy":return B.getFullYear();case"yy":return B.getFullYear().toString().substring(2,4);case"mmmm":return this.options.monthNames[B.getMonth()];case"mmm":return this.options.monthNames[B.getMonth()].substr(0,3);case"mm":return this.padNumber(B.getMonth()+1);case"dddd":return this.options.weekDays[this.getRealDayNumber(B.getDay())];case"ddd":return this.options.weekDays[this.getRealDayNumber(B.getDay())].substr(0,3);case"dd":return this.padNumber(B.getDate())}}).bind(this))},parseDate:function(B){if($type(B)!="string"){return B}var A=B.split("/");if(A.length!=3){return null}switch(this.options.inputDateFormat.toLowerCase()){case"d/m/y":if(A[2]<2000){A[2]=["20",A[2]].join("")}return new Date(A[2],A[1]-1,A[0]);case"m/d/y":return new Date(A[2],A[0]-1,A[1])}},padNumber:function(C,B){if(B===undefined){B=2}var A=C.toString();while(A.length<B){A="0"+A}return A},removeTime:function(A){return new Date(A.getFullYear(),A.getMonth(),A.getDate())}});