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(f){if(!this.valueOf()){return'&nbsp;'}var d=this;var b={'yyyy':d.getFullYear(),'mmmm':this.monthnames[d.getMonth()],'mmm':this.monthnames[d.getMonth()].substr(0,3),'mm':this.formatPadding?((d.getMonth()).succ()).toPaddedString(2):(d.getMonth()).succ(),'dddd':this.daynames[d.getDay()],'ddd':this.daynames[d.getDay()].substr(0,3),'dd':d.getDate().toPaddedString(2),'hh':h=d.getHours()%12?h:12,'nn':d.getMinutes(),'ss':d.getSeconds(),'a/p':d.getHours()<12?'a':'p'};return f.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(a,b){this.element=$(a);var c=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:c=='Effect'?Effect.Appear:Element.show,closeeffect:c=='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._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=b;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];var 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();if(!(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)}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()},_updateExternal:function(){if(Object.isFunction(this.updateelement)){this.updateelement(this.currentdate)}else{var a=$(this.updateelement);a[a.tagName=='INPUT'?'setValue':'update'](this.currentdate.format(this.options.updateformat))}},_buildHead:function(){var c=new Element(this.table?'tbody':'div',{'class':'cal_wrapper'});var d=new Element(this.table?'tr':'div',{'class':'weekbox weekboxname'});Date.prototype.daynames.sortBy(function(s,i){i-=this.options.weekdaystart;if(i<0){i+=7}return i}.bind(this)).each(function(a,i){var b=new Element(this.table?'td':'div',{'class':'cal_day_name_'+i});b.addClassName('daybox').addClassName('dayboxname').update(a.substr(0,this.options.dayheadlength));if(i==6){b.addClassName('endweek')}d.insert(b)}.bind(this));return c.insert(d)},_buildWrapper:function(){var b=new Date(this.firstofmonth.getFullYear(),this.firstofmonth.getMonth(),this.firstofmonth.getDate());var c=new Date(this.lastofmonth.getFullYear(),this.lastofmonth.getMonth(),this.lastofmonth.getDate());if(this.options.weekdaystart-b.getDay()<b.getDate()){b.setDate(b.getDate()-b.getDay()+this.options.weekdaystart)}else{b.setDate(b.getDate()-(b.getDay()+7-this.options.weekdaystart))}var e=$A($R(b,c));var f=this.table?[]:new Element('div',{'class':'calweekswrapper'});var g;var h;var j;this.dateRange=[];this.indicators=[];var k=function(a){h.insert(this._buildDay(g,a));j=a}.bind(this);e.eachSlice(7,function(a,i){g=i;h=new Element(this.table?'tr':'div',{'class':'cal_week_'+g}).addClassName('weekbox');while(a.length<7){a.push(a.last().succ())}a.map(k);f[this.table?'push':'insert'](h)}.bind(this));if(!this.options.exactweeks){var l=42-this.cells.size();var m=Math.ceil(l/7);if(m>0){l=l/m}$R(1,m).each(function(w){g+=1;h=new Element(this.table?'tr':'div',{'class':'cal_week_'+g}).addClassName('weekbox');$R(1,l).each(function(i){var d=j.succ();h.insert(this._buildDay(g,d));f[this.table?'push':'insert'](h);j=d}.bind(this))}.bind(this))}return f},_compareDates:function(a,b,c){return(this.indicators.indexOf(c)>=0)?false:Object.isUndefined(['getMonth','getDate','getFullYear'].find(function(n){return a[n]()!=b[n]()}))},_buildDay:function(a,b){this.dateRange.push(b);var c='cal_day_'+a+'_'+b.getDay();var d=new Element(this.table?'td':'div',{'class':c});var e=new Element('div',{'class':c+'_date'}).addClassName('dayboxdate').update(this.options.daypadding?((b.getDate()).toPaddedString(2)):b.getDate());var f=new Element('div',{'class':c+'_value'}).addClassName('dayboxvalue');if(this.options.planner){this._updatePlanner(b,f)}d.insert(e).insert(f).addClassName('daybox').addClassName('daybox'+b.format('dddd').toLowerCase());if(this._compareDates(b,this.currentdate,'dayselected')){d.addClassName('dayselected');this.indicators.push('dayselected')}if(this._compareDates(b,new Date(),'today')){d.addClassName('today');this.indicators.push('today')}if(b.getDay()==6){d.addClassName('endweek')}var g=b.getMonth()!=this.currentdate.getMonth()?['dayoutmonth','dayinmonth']:['dayinmonth','dayoutmonth'];d.addClassName(g[0]);if(d.hasClassName(g[1])){d.removeClassName(g[1])}this.cells.push(d);return d.observe('click',this._click.bindAsEventListener(this,this.cells.size()-1))},_updateTitles:function(){var c=this.currentdate.getFullYear();var d=this.currentdate.getMonth();var e={calprevmonth:Date.prototype.monthnames[(d-1)==-1?11:d-1],calprevyear:c-1,calnextyear:c+1,calnextmonth:Date.prototype.monthnames[(d+1)==12?0:d+1]};this.controls.select('.calcontrol').each(function(a){var b=e[a.className.split(' ')[0]];if(!Object.isUndefined(b)){a.setAttribute('title',b)}})},_buildControls:function(){var c=[{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){c=[c[1],c[2],c[5],c[3],c[4],c[0]]}var d=new Element(this.table?'tr':'div',{'class':'calheader'});c.each(function(a){var b=new Element(this.table?'td':'div',{'class':a.p});if(a.p=='caltitle'){this.title=b;if(this.table){b.writeAttribute({colspan:2})}b.update(a.u).observe('click',a.f)}else{b.addClassName('calcontrol');b[typeof(a.u)=='object'?'insert':'update'](a.u).observe('click',a.f)}d.insert(b)}.bind(this));return d},_switchCal:function(){if(arguments[1]){var a=arguments[0];var b=arguments[1];a.date=this.currentdate}else{var b=arguments[0]}var c={f:'setTime',p:this.initDate.getTime()};var e=this.currentdate.getDate();if(b!='init'){var d=this.currentdate[b.include('month')?'getMonth':'getFullYear']();c={f:b.include('month')?'setMonth':'setYear',p:b.include('up')?d+1:d-1}}this.currentdate[c.f](c.p);if(this.currentdate.getDate()!=e){this.currentdate.setDate(0)}if(arguments[1]){this.options.oncalchange(a)}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(d){var b=d.getTime();var c=0;this.dateRange.each(function(a,i){if(a.getTime()==b){c=i;throw $break;}});return c},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);if(!arguments[1]){this._updateExternal()}return this.currentdate},toggleCalendar:function(){this.options[this.element.visible()?'closeeffect':'openeffect'](this.element)},getElementByDate:function(d){return this.cells[this._getCellIndexByDate(d)]},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(){if(!this.isOpen()){this.toggleCalendar()}},closeCalendar:function(){if(this.isOpen()){this.toggleCalendar()}},isOpen:function(){return this.element.visible()}};
