Object.extend(Date.prototype,{monthnames:["January","February","March","April","May","June","July","August","September","October","November","December"],daynames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],succ:function(){var a=new Date(this.getFullYear(),this.getMonth(),this.getDate()+1);a.setHours(this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());return a},firstofmonth:function(){return new Date(this.getFullYear(),this.getMonth(),1)},lastofmonth:function(){return new Date(this.getFullYear(),this.getMonth()+1,0)},formatPadding:true,format:function(c){if(!this.valueOf())return"&nbsp;";var a=this,b={yyyy:a.getFullYear(),mmmm:this.monthnames[a.getMonth()],mmm:this.monthnames[a.getMonth()].substr(0,3),mm:this.formatPadding?a.getMonth().succ().toPaddedString(2):a.getMonth().succ(),dddd:this.daynames[a.getDay()],ddd:this.daynames[a.getDay()].substr(0,3),dd:a.getDate().toPaddedString(2),hh:h=a.getHours()%12?h:12,nn:a.getMinutes(),ss:a.getSeconds(),"a/p":a.getHours()<12?"a":"p"};return c.gsub(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/i,function(a){return b[a[0].toLowerCase()]})}});var scal={};scal=Class.create();scal.prototype={initialize:function(b,c){this.element=$(b);var a=Try.these(function(){if(!Object.isUndefined(Effect))return"Effect"},function(){return"Element"});this.options=Object.extend({oncalchange:Prototype.emptyFunction,daypadding:false,titleformat:"mmmm yyyy",updateformat:"yyyy-mm-dd",closebutton:"X",prevbutton:"&laquo;",nextbutton:"&raquo;",yearnext:"&raquo;&raquo;",yearprev:"&laquo;&laquo;",openeffect:a=="Effect"?Effect.Appear:Element.show,closeeffect:a=="Effect"?Effect.Fade:Element.hide,exactweeks:false,dayheadlength:2,weekdaystart:0,planner:false,tabular:false},arguments[2]||{});this.table=false;this.thead=false;this.startdate=this._setStartDate(arguments[2]);if(this.options.planner)this.planner=this._setupPlanner(this.options.planner);if(this.options.tabular){this.table=new Element("table",{"class":"cal_table",border:0,cellspacing:0,cellpadding:0});this.thead=new Element("thead");this.table.insert(this.thead);this.element.insert(this.table)}this.updateelement=c;this._setCurrentDate(this.startdate);this.initDate=new Date(this.currentdate);this.controls=this._buildControls();this.title.setAttribute("title",this.initDate.format(this.options.titleformat));this._updateTitles();this[this.table?"thead":"element"].insert(this.controls);this.cal_wrapper=this._buildHead();this.cells=[];this._buildCal()},_setStartDate:function(){var a=arguments[0],b=new Date;this.options.month=a&&a.month&&Object.isNumber(a.month)?a.month-1:b.getMonth();this.options.year=a&&a.year&&Object.isNumber(a.year)?a.year:b.getFullYear();this.options.day=a&&a.day&&Object.isNumber(a.day)?a.day:this.options.month!=b.getMonth()?1:b.getDate();b.setHours(0,0,0,0);b.setDate(this.options.day);b.setMonth(this.options.month);b.setFullYear(this.options.year);return b},_emptyCells:function(){if(this.cells.size()>0){this.cells.invoke("stopObserving");this.cells.invoke("remove");this.cells=[]}},_buildCal:function(){this._emptyCells();!(Object.isUndefined(this.cal_weeks_wrapper)||this.table)&&this.cal_weeks_wrapper.remove();this.cal_weeks_wrapper=this._buildWrapper();if(this.table){this.table.select("tbody tr.weekbox:not(.weekboxname)").invoke("remove");this.table.select("tbody.cal_wrapper").invoke("remove");this.cal_weeks_wrapper.each(function(a){this.cal_wrapper.insert(a)}.bind(this))}else this.cal_wrapper.insert(this.cal_weeks_wrapper.insert(new Element("div",{"class":"clear"})));this[this.table?"table":"element"].insert(this.cal_wrapper)},_click:function(a,b){this.element.select(".dayselected").invoke("removeClassName","dayselected");(a.target.hasClassName("daybox")?a.target:a.target.up()).addClassName("dayselected");this._setCurrentDate(this.dateRange[b]);this._updateExternal(a)},_updateExternal:function(b){if(Object.isFunction(this.updateelement))this.updateelement(this.currentdate,b);else{var a=$(this.updateelement);a[a.tagName=="INPUT"?"setValue":"update"](this.currentdate.format(this.options.updateformat))}},_buildHead:function(){var b=new Element(this.table?"tbody":"div",{"class":"cal_wrapper"}),a=new Element(this.table?"tr":"div",{"class":"weekbox weekboxname"});Date.prototype.daynames.sortBy(function(b,a){a-=this.options.weekdaystart;if(a<0)a+=7;return a}.bind(this)).each(function(d,c){var b=new Element(this.table?"td":"div",{"class":"cal_day_name_"+c});b.addClassName("daybox").addClassName("dayboxname").update(d.substr(0,this.options.dayheadlength));c==6&&b.addClassName("endweek");a.insert(b)}.bind(this));return b.insert(a)},_buildWrapper:function(){var a=new Date(this.firstofmonth.getFullYear(),this.firstofmonth.getMonth(),this.firstofmonth.getDate()),h=new Date(this.lastofmonth.getFullYear(),this.lastofmonth.getMonth(),this.lastofmonth.getDate());if(this.options.weekdaystart-a.getDay()<a.getDate())a.setDate(a.getDate()-a.getDay()+this.options.weekdaystart);else a.setDate(a.getDate()-(a.getDay()+7-this.options.weekdaystart));var j=$A($R(a,h)),e=this.table?[]:new Element("div",{"class":"calweekswrapper"}),c,b,g;this.dateRange=[];this.indicators=[];var i=function(a){b.insert(this._buildDay(c,a));g=a}.bind(this);j.eachSlice(7,function(a,d){c=d;b=(new Element(this.table?"tr":"div",{"class":"cal_week_"+c})).addClassName("weekbox");while(a.length<7)a.push(a.last().succ());a.map(i);e[this.table?"push":"insert"](b)}.bind(this));if(!this.options.exactweeks){var d=42-this.cells.size(),f=Math.ceil(d/7);if(f>0)d=d/f;$R(1,f).each(function(){c+=1;b=(new Element(this.table?"tr":"div",{"class":"cal_week_"+c})).addClassName("weekbox");$R(1,d).each(function(){var a=g.succ();b.insert(this._buildDay(c,a));e[this.table?"push":"insert"](b);g=a}.bind(this))}.bind(this))}return e},_compareDates:function(a,b,c){return this.indicators.indexOf(c)>=0?false:Object.isUndefined(["getMonth","getDate","getFullYear"].find(function(c){return a[c]()!=b[c]()}))},_buildDay:function(g,b){this.dateRange.push(b);var c="cal_day_"+g+"_"+b.getDay(),a=new Element(this.table?"td":"div",{"class":c}),f=(new Element("div",{"class":c+"_date"})).addClassName("dayboxdate").update(this.options.daypadding?b.getDate().toPaddedString(2):b.getDate()),e=(new Element("div",{"class":c+"_value"})).addClassName("dayboxvalue");this.options.planner&&this._updatePlanner(b,a,e);a.insert(f).insert(e).addClassName("daybox").addClassName("daybox"+b.format("dddd").toLowerCase());if(this._compareDates(b,this.currentdate,"dayselected")){a.addClassName("dayselected");this.indicators.push("dayselected")}if(this._compareDates(b,new Date,"today")){a.addClassName("today");this.indicators.push("today")}b.getDay()==6&&a.addClassName("endweek");var d=b.getMonth()!=this.currentdate.getMonth()?["dayoutmonth","dayinmonth"]:["dayinmonth","dayoutmonth"];a.addClassName(d[0]);a.hasClassName(d[1])&&a.removeClassName(d[1]);this.cells.push(a);return a.observe("click",this._click.bindAsEventListener(this,this.cells.size()-1))},_updateTitles:function(){var b=this.currentdate.getFullYear(),a=this.currentdate.getMonth(),c={calprevmonth:Date.prototype.monthnames[a-1==-1?11:a-1],calprevyear:b-1,calnextyear:b+1,calnextmonth:Date.prototype.monthnames[a+1==12?0:a+1]};this.controls.select(".calcontrol").each(function(b){var a=c[b.className.split(" ")[0]];!Object.isUndefined(a)&&b.setAttribute("title",a)})},_buildControls:function(){var a=[{p:"calclose",u:this.options.closebutton,f:this.toggleCalendar.bindAsEventListener(this)},{p:"calprevmonth",u:this.options.prevbutton,f:this._switchCal.bindAsEventListener(this,"monthdown")},{p:"calprevyear",u:this.options.yearprev,f:this._switchCal.bindAsEventListener(this,"yeardown")},{p:"calnextyear",u:this.options.yearnext,f:this._switchCal.bindAsEventListener(this,"yearup")},{p:"calnextmonth",u:this.options.nextbutton,f:this._switchCal.bindAsEventListener(this,"monthup")},{p:"caltitle",u:this.currentdate.format(this.options.titleformat),f:this._switchCal.bindAsEventListener(this,"init")}];if(this.table)a=[a[1],a[2],a[5],a[3],a[4],a[0]];var b=new Element(this.table?"tr":"div",{"class":"calheader"});a.each(function(a){var c=new Element(this.table?"td":"div",{"class":a.p});if(a.p=="caltitle"){this.title=c;this.table&&c.writeAttribute({colspan:2});c.update(a.u).observe("click",a.f)}else{c.addClassName("calcontrol");c[typeof a.u=="object"?"insert":"update"](a.u).observe("click",a.f)}b.insert(c)}.bind(this));return b},_switchCal:function(){if(arguments[1]){var c=arguments[0],a=arguments[1];c.date=this.dateRange[10]}else var a=arguments[0];var b={f:"setTime",p:this.initDate.getTime()};if(a!="init"){var d=c.date[a.include("month")?"getMonth":"getFullYear"]();b={f:a.include("month")?"setMonth":"setYear",p:a.include("up")?d+1:d-1}}this.currentdate[b.f](b.p);if(arguments[1])this.options.oncalchange(c);this._update()},_update:function(){this._setCurrentDate(arguments[0]?arguments[0]:this.currentdate);this.title.update(this.currentdate.format(this.options.titleformat));this._buildCal();this._updateTitles()},_setCurrentDate:function(a){this.currentdate=new Date(a.getFullYear(),a.getMonth(),a.getDate());this.firstofmonth=this.currentdate.firstofmonth();this.lastofmonth=this.currentdate.lastofmonth()},_getCellIndexByDate:function(c){var b=c.getTime(),a=0;this.dateRange.each(function(c,d){if(c.getTime()==b){a=d;throw $break;}});return a},update:function(){this._update()},destroy:function(){this._emptyCells();if(this.table)this.table.remove();else this.cal_weeks_wrapper.remove();this.controls.descendants().invoke("stopObserving");[this.cal_wrapper,this.controls].invoke("remove")},setCurrentDate:function(a){this[a instanceof Date?"_update":"_switchCal"](a);!arguments[1]&&this._updateExternal();return this.currentdate},toggleCalendar:function(){this.options[this.element.visible()?"closeeffect":"openeffect"](this.element)},getElementByDate:function(a){return this.cells[this._getCellIndexByDate(a)]},getElementsByWeek:function(a){return this.element.select(".weekbox:nth-of-type("+(a+1)+") .daybox:not(.dayboxname)")},getSelectedElement:function(){return this.element.select(".dayselected")[0]},getTodaysElement:function(){return this.element.select(".today")[0]},getDateByElement:function(a){return this.dateRange[this.cells.indexOf(a)]},_setupPlanner:Prototype.emptyFunction,_updatePlanner:Prototype.emptyFunction,openCalendar:function(){!this.isOpen()&&this.toggleCalendar()},closeCalendar:function(){this.isOpen()&&this.toggleCalendar()},isOpen:function(){return this.element.visible()}}
