var Calendar=Class.create({initialize:function(wrapperElement,element,inputDateElement){this.today=new Date();this.wrapperElement=wrapperElement;this.element=element;this.inputDateElement=inputDateElement;this.suffix=this.inputDateElement.id.charAt(0).toUpperCase()+this.inputDateElement.id.substring(1);this.firstDateLine=this.element.down('.dayList').down('tr');this.setBoundaries();if(!this.year||!this.month){if(this.minDate&&this.today<this.minDate){this.year=this.minDate.getFullYear();this.month=this.minDate.getMonth()+1}else if(this.maxDate&&this.today>this.maxDate){this.year=this.maxDate.getFullYear();this.month=this.maxDate.getMonth()+1}else{this.year=this.today.getFullYear();this.month=this.today.getMonth()+1}}this.setNumberOfDaysInMonth();this.setDateFromInput();this.setPosition()},setBoundaries:function(){var minDateElement=this.element.down('input#calendarMinDate'+this.suffix);if(minDateElement){var minDate=minDateElement.value;this.minDate=new Date(minDate.substr(0,4),minDate.substr(5,2)-1,minDate.substr(8,2))}var maxDateElement=this.element.down('input#calendarMaxDate'+this.suffix);if(maxDateElement){var maxDate=maxDateElement.value;this.maxDate=new Date(maxDate.substr(0,4),maxDate.substr(5,2)-1,maxDate.substr(8,2))}},setDateFromInput:function(){if(this.inputDateElement.value.match(/\d{2}\/\d{2}\/\d{4}/)){var inputDay=Number(this.inputDateElement.value.substr(0,2));var inputMonth=Number(this.inputDateElement.value.substr(3,2));var inputYear=Number(this.inputDateElement.value.substr(6,4));if(inputDay&&inputMonth&&inputYear){this.year=inputYear;this.month=inputMonth;if(!this.currentChosenDay){this.currentChosenDay=new Date()}this.currentChosenDay.setFullYear(inputYear);this.currentChosenDay.setMonth(inputMonth-1);this.currentChosenDay.setDate(inputDay);this.setNumberOfDaysInMonth();this.updateDisplay()}}},adjustDateWithBoundaries:function(){if(this.maxDate||this.minDate){if(this.currentChosenDay)var date=new Date(this.year,this.month-1,this.currentChosenDay.getDate());else var date=new Date(this.year,this.month-1,1);if(this.maxDate&&this.maxDate-date<0){this.year=this.maxDate.getFullYear();this.month=this.maxDate.getMonth()+1;return true}if(this.minDate&&this.minDate-date>0){this.year=this.minDate.getFullYear();this.month=this.minDate.getMonth()+1;return true}}return false},setMonth:function(month){this.month=month;this.adjustDateWithBoundaries();this.setNumberOfDaysInMonth();this.updateDisplay()},increaseMonth:function(){this.month++;if(this.month==13){this.month=1;this.year++}this.adjustDateWithBoundaries();this.setNumberOfDaysInMonth();this.updateDisplay()},decreaseMonth:function(){this.month--;if(this.month==0){this.month=12;this.year--}this.adjustDateWithBoundaries();this.setNumberOfDaysInMonth();this.updateDisplay()},setYear:function(year){this.year=year;this.adjustDateWithBoundaries();this.setNumberOfDaysInMonth();this.updateDisplay()},increaseYear:function(){this.setYear(this.year+1)},decreaseYear:function(){this.setYear(this.year-1)},setPosition:function(){var inputDatePosition=this.inputDateElement.positionedOffset();this.wrapperElement.style.top=(inputDatePosition.top+this.inputDateElement.offsetHeight+3)+'px';this.wrapperElement.style.left=inputDatePosition.left+'px'},updateDisplay:function(){var thead=this.element.down('thead');thead.down('.currentMonth').value=this.month;thead.down('.currentYear').value=this.year;var firstDay=new Date(this.year,this.month-1,1);var weekDay=firstDay.getDay();weekDay=(weekDay+6)%7;var day=1;var pos=0;var content;var className;var date=new Date(this.year,this.month-1,day);var tr=this.firstDateLine;for(var i=0;i<6;i++){if(i!=0){tr=tr.nextSibling;while(tr.nodeType!=1&&tr.nodeName!='tr')tr=tr.nextSibling}var td=tr.down('td');for(var j=0;j<7;j++){if(pos>=37)break;if(j!=0){td=td.nextSibling;while(td.nodeType!=1&&td.nodeName!='td')td=td.nextSibling}className='';if(pos>=weekDay&&day<=this.numberOfDaysInMonth){if(day==this.today.getDate()&&this.month==this.today.getMonth()+1&&this.year==this.today.getFullYear())className='today';if(this.currentChosenDay&&day==this.currentChosenDay.getDate()&&this.currentChosenDay.getMonth()==this.month-1&&this.currentChosenDay.getFullYear()==this.year)className+=' current';if((this.minDate&&date-this.minDate<0)||(this.maxDate&&this.maxDate-date<0)){className+=' outOfRange';td.onclick=''}else{td.onclick=this.chooseDate}content=day++;date.setDate(day)}else{content='&nbsp;';td.onclick=''}td.className=className;td.innerHTML=content;pos++}}},chooseDate:function(){var calendar=CalendarHandler.getCalendarFromWrapper(this.up('.calendarWrapper'));var stringDay=this.innerHTML;if(!isNaN(parseInt(stringDay))){if(stringDay.length==1){stringDay='0'+stringDay}}var stringMonth=calendar.month.toString();if(stringMonth.length==1){stringMonth='0'+stringMonth}var stringYear=calendar.year.toString();calendar.inputDateElement.value=stringDay+'/'+stringMonth+'/'+stringYear;calendar.wrapperElement.style.display='none'},setNumberOfDaysInMonth:function(){switch(this.month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:this.numberOfDaysInMonth=31;break;case 4:case 6:case 9:case 11:this.numberOfDaysInMonth=30;break;case 2:if((this.year%4==0&&this.year%100!=0)||(this.year%400==0))this.numberOfDaysInMonth=29;else this.numberOfDaysInMonth=28;break}}});var CalendarHandler={getCalendar:function(inputDateId){var object=calendarObjects.get(inputDateId);if(object)return object;else return null},getCalendarFromWrapper:function(wrapperElement){var inputDateElementName=wrapperElement.id.substr(0,wrapperElement.id.length-3);return this.getCalendar(inputDateElementName)},hide:function(){var calendar=CalendarHandler.getCalendar(this.id);calendar.element.hide()}};var calendarObjects=new Hash();function initCalendar(inputElement,wrapperId){if(typeof inputElement!='object'){inputElement=$(inputElement);if(!inputElement)return}var calendar=CalendarHandler.getCalendar(inputElement.id);if(calendar)return;var calWrapper=$(wrapperId);var calendarElement=calWrapper.down('.calendar');Element.extend(inputElement);inputElement.observe('keyup',function(event){if(event.keyCode>=48&&this.value.match(/\d{2}\/\d{2}\/\d{4}/)){var calendar=CalendarHandler.getCalendar(this.id);calendar.setDateFromInput();calendar.updateDisplay()}else if(event.keyCode==27){var calendar=CalendarHandler.getCalendar(this.id);calendar.element.hide()}});calendar=new Calendar(calWrapper,calendarElement,inputElement);calendarObjects.set(inputElement.id,calendar);closeElement=calendarElement.down('.close');if(closeElement){imgElement=closeElement.down('img');if(imgElement){imgElement.onclick=function(){this.up('div.calendarWrapper').style.display='none'}}}}function inputDateClick(inputElement){if(typeof inputElement!='object'){var calendar=CalendarHandler.getCalendar(inputElement)}else{var calendar=CalendarHandler.getCalendar(inputElement.id)}calendar.setDateFromInput();calendar.setNumberOfDaysInMonth();calendar.updateDisplay();calendar.wrapperElement.style.display='block'}