
DateInput=(function($){function DateInput(el,opts){if(typeof(opts)!="object")opts={};$.extend(this,DateInput.DEFAULT_OPTS,opts);this.input=$(el);this.bindMethodsToObj("show","hide","hideIfClickOutside","hideOnEsc","selectDate","prevMonth","nextMonth");this.build();this.selectDate();this.hide();};DateInput.DEFAULT_OPTS={month_names:["January","February","March","April","May","June","July","August","September","October","November","December"],short_month_names:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],short_day_names:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],start_of_week:1};DateInput.prototype={build:function(){this.monthNameSpan=$('<span class="month_name"></span>');var monthNav=$('<p class="month_nav"></p>').append($('<a href="#" class="prev">&laquo;</a> ').click(this.prevMonth),this.monthNameSpan,$(' <a href="#" class="next">&raquo;</a>').click(this.nextMonth));var tableShell="<table><thead><tr>";$(this.adjustDays(this.short_day_names)).each(function(){tableShell+="<th>"+this+"</th>";});tableShell+="</tr></thead><tbody></tbody></table>";this.dateSelector=this.rootLayers=$('<div class="date_selector"></div>').append(monthNav,tableShell).insertAfter(this.input);if($.browser.msie&&$.browser.version<7){this.ieframe=$('<iframe class="date_selector_ieframe" frameborder="0" src="#"></iframe>').insertBefore(this.dateSelector);this.rootLayers=this.rootLayers.add(this.ieframe);};this.tbody=$("tbody",this.dateSelector);this.input.change(this.bindToObj(function(){this.selectDate();}));},selectMonth:function(date){this.currentMonth=new Date(date.getFullYear(),date.getMonth(),1);var rangeStart=this.rangeStart(date),rangeEnd=this.rangeEnd(date);var numDays=this.daysBetween(rangeStart,rangeEnd);var dayCells="";for(var i=0;i<=numDays;i++){var currentDay=new Date(rangeStart.getFullYear(),rangeStart.getMonth(),rangeStart.getDate()+i,12,00);if(this.isFirstDayOfWeek(currentDay))dayCells+="<tr>";if(currentDay.getMonth()==date.getMonth()){dayCells+='<td date="'+this.dateToString(currentDay)+'"><a href="#">'+currentDay.getDate()+'</a></td>';}else{dayCells+='<td class="unselected_month" date="'+this.dateToString(currentDay)+'">'+currentDay.getDate()+'</td>';};if(this.isLastDayOfWeek(currentDay))dayCells+="</tr>";};this.monthNameSpan.empty().append(this.monthName(date)+" "+date.getFullYear());this.tbody.empty().append(dayCells);$("a",this.tbody).click(this.bindToObj(function(event){this.selectDate(this.stringToDate($(event.target).parent().attr("date")));this.hide();return false;}));$("td[date="+this.dateToString(new Date())+"]",this.tbody).addClass("today");},selectDate:function(date){if(typeof(date)=="undefined"){date=this.stringToDate(this.input.val());};if(date){this.selectedDate=date;this.selectMonth(date);var stringDate=this.dateToString(date);$('td[date='+stringDate+']',this.tbody).addClass("selected");if(this.input.val()!=stringDate){this.input.val(stringDate).change();};}else{this.selectMonth(new Date());};},show:function(){this.rootLayers.css("display","block");this.setPosition();this.input.unbind("focus",this.show);$("a:last",this.dateSelector).blur(this.hide);$([window,document.body]).click(this.hideIfClickOutside).keyup(this.hideOnEsc);},hide:function(){this.rootLayers.css("display","none");$([window,document.body]).unbind("click",this.hideIfClickOutside).unbind("keyup",this.hideOnEsc);$("a:last",this.dateSelector).unbind("blur",this.hide);this.input.focus(this.show);},hideIfClickOutside:function(event){if(event.target!=this.input[0]&&!this.insideSelector(event)){this.hide();};},hideOnEsc:function(event){if(event.keyCode==27){this.hide();};},stringToDate:function(string){var matches;if(matches=string.match(/^(\d{1,2}) ([^\s]+) (\d{4,4})$/)){return new Date(matches[3],this.shortMonthNum(matches[2]),matches[1],12,00);}else{return null;};},dateToString:function(date){return date.getDate()+" "+this.short_month_names[date.getMonth()]+" "+date.getFullYear();},setPosition:function(){var offset=this.input.position();var top;if($.browser.msie){top=offset.top-this.dateSelector.outerHeight();left=offset.left;this.rootLayers.css({width:this.dateSelector.outerHeight()});}else{var width=this.dateSelector.outerHeight();top=offset.top-this.dateSelector.outerHeight()/2;left=offset.left+width/2;this.rootLayers.css({width:width});}
this.rootLayers.css({top:top,left:left});if(this.ieframe){this.ieframe.css({width:this.dateSelector.outerWidth(),height:this.dateSelector.outerHeight()});};},moveMonthBy:function(amount){this.selectMonth(new Date(this.currentMonth.setMonth(this.currentMonth.getMonth()+amount)));},prevMonth:function(){this.moveMonthBy(-1);return false;},nextMonth:function(){this.moveMonthBy(1);return false;},monthName:function(date){return this.month_names[date.getMonth()];},insideSelector:function(event){var offset=this.dateSelector.offset();offset.right=offset.left+this.dateSelector.outerWidth();offset.bottom=offset.top+this.dateSelector.outerHeight();return event.pageY<offset.bottom&&event.pageY>offset.top&&event.pageX<offset.right&&event.pageX>offset.left;},bindToObj:function(fn){var self=this;return function(){return fn.apply(self,arguments)};},bindMethodsToObj:function(){for(var i=0;i<arguments.length;i++){this[arguments[i]]=this.bindToObj(this[arguments[i]]);};},indexFor:function(array,value){for(var i=0;i<array.length;i++){if(value==array[i])return i;};},monthNum:function(month_name){return this.indexFor(this.month_names,month_name);},shortMonthNum:function(month_name){return this.indexFor(this.short_month_names,month_name);},shortDayNum:function(day_name){return this.indexFor(this.short_day_names,day_name);},daysBetween:function(start,end){start=Date.UTC(start.getFullYear(),start.getMonth(),start.getDate());end=Date.UTC(end.getFullYear(),end.getMonth(),end.getDate());return(end-start)/86400000;},changeDayTo:function(to,date,direction){var difference=direction*(Math.abs(date.getDay()-to-(direction*7))%7);return new Date(date.getFullYear(),date.getMonth(),date.getDate()+difference);},rangeStart:function(date){return this.changeDayTo(this.start_of_week,new Date(date.getFullYear(),date.getMonth()),-1);},rangeEnd:function(date){return this.changeDayTo((this.start_of_week-1)%7,new Date(date.getFullYear(),date.getMonth()+1,0),1);},isFirstDayOfWeek:function(date){return date.getDay()==this.start_of_week;},isLastDayOfWeek:function(date){return date.getDay()==(this.start_of_week-1)%7;},adjustDays:function(days){var newDays=[];for(var i=0;i<days.length;i++){newDays[i]=days[(i+this.start_of_week)%7];};return newDays;}};$.fn.date_input=function(opts){return this.each(function(){new DateInput(this,opts);});};$.date_input={initialize:function(opts){$("input.date_input").date_input(opts);}};return DateInput;})(jQuery);
