Events.Calendar=Class.create(Event.Dispatcher,{initialize:function(c,a,b){this.events=$H();c=$(c);this._today=(new Date()).fullDay();this.options=Object.extend({firstDayInWeek:1,autoChangeMonth:true},a||{});this.selectors=Object.extend({days:"tbody td",alldays:"tbody",month:"span.month",next:"img.small-forward-button",previous:"img.small-backward-button",today:".legend .today",selected:".legend .selected",close:"img.small-close-button"},b||{});this.elements={container:c,days:c.select(this.selectors.days),alldays:c.down(this.selectors.alldays),month:c.down(this.selectors.month)};this._initEvents();if(this.options.date){this.setDate(this.options.date)}this.setDisplayedMonth(this.date)},_initEvents:function(){$w("next previous").each(function(c){var b=this.elements.container.down(this.selectors[c]);b.observe("click",function(d){d.stop();this.setDisplayedMonth(this.displayedMonth[c+"Month"]())}.bind(this))}.bind(this));var a=$H({today:function(){this.setDisplayedMonth(this._today)},selected:function(){this.setDisplayedMonth(this.date)},close:function(){this.elements.container.hide()}});a.each(function(c){var b=this.elements.container.down(this.selectors[c.key]);(b&&b.observe("click",c.value.bind(this)))}.bind(this));this.elements.alldays.observe("mousedown",function(b){var c=Event.element(b);if(c.tagName.toLowerCase()=="td"){this._dayElementClicked(c)}}.bind(this))},setDisplayedMonth:function(a){var b=(a||this._today).fullMonth();if(b.equals(this.displayedMonth)){return}this.displayedMonth=b;this.render()},_dayElementClicked:function(b){var a;this.elements.days.each(function(c,d){if(c==b){a=d}}.bind(this));this.date=this._firstDisplayedDate.clone();this.date.setDate(this.date.getDate()+a);this.setDate(this.date)},setDate:function(a){this.date=a&&a.fullDay();var b=!(a&&this.displayedMonth&&this.displayedMonth.equals(this.date.fullMonth()));if(b&&this.options.autoChangeMonth){this.setDisplayedMonth(a)}else{this.updateMonthDisplay()}this.dispatch("change",a);return this.date},updateMonthDisplay:function(){var a=this._firstDisplayedDate.clone();this.elements.days.each(function(b){if(this.date&&this.date.equals(a)){b.addClassName("selected")}else{b.removeClassName("selected")}a=a.nextDay()}.bind(this))},render:function(){var f=this.displayedMonth;var c=Date.MONTH_NAMES[f.getMonth()]+" "+f.getFullYear();this.elements.month.innerHTML=c;var g=f.firstOfMonth();var b=g.clone();b.setDate(-g.getDay()+1+this.options.firstDayInWeek);if(b.getDate()>1&&b.getDate()<7){b.setDate(b.getDay()-6)}this._firstDisplayedDate=b;var e=function(i,j){return{when:function(k){if(k){i.addClassName(j)}else{i.removeClassName(j)}}}};var h=this.elements.days.length,d=0;while(d<h){var a=this.elements.days[d];a.innerHTML=b.getDate();e(a,"not_in_month").when(!(b.getMonth()==f.getMonth()));e(a,"today").when(b.equals(this._today));e(a,"selected").when(this.date&&this.date.equals(b));this.dispatch("render_day",b,this.elements.days[d]);b=b.nextDay();d++}}});
