/**
 * CalendarView for jQuery
 *
 * Based on CalendarView for Prototype http://calendarview.org/ which is based
 * on Dynarch DHTML Calendar http://www.dynarch.com/projects/calendar/old/.
 *
 * CalendarView is licensed under the terms of the GNU Lesser General
 * Public License (LGPL)
 *
 * Usage:
 *   jQuery(document).ready(function() {
 *     $('#date_input').calendar();
 *   }
 *
 *   jQuery(document).ready(function() {
 *     $('#date_input').calendar({triggerElement: '#date_input_trigger'});
 *   }
 *
 *   jQuery(document).ready(function() {
 *     $('#date_input').calendar({parentElement: '#calendar_container'});
 *   }
 *
 * Default options:
 *   triggerElement: null, // Popup calendar
 *   parentElement: null, // Inline calendar
 *   minYear: 1900,
 *   maxYear: 2100,
 *   firstDayOfWeek: 1, // Monday
 *   weekend: "0,6", // Sunday and Saturday
 *   dateFormat: '%Y-%m-%d',
 *   selectHandler: null, // Will use default select handler
 *   closeHandler: null // Will use default close handler
 */
(function(j){var g=function(){this.date=new Date};g.VERSION="1.2";g.TODAY="Today";g.DAY_NAMES=Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");g.SHORT_DAY_NAMES=Array("Su","Mo","Tu","We","Th","Fr","Sa");g.MONTH_NAMES=Array("January","February","March","April","May","June","July","August","September","October","November","December");g.SHORT_MONTH_NAMES=Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");g.NAV_PREVIOUS_YEAR=-2;g.NAV_PREVIOUS_MONTH=
-1;g.NAV_TODAY=0;g.NAV_NEXT_MONTH=1;g.NAV_NEXT_YEAR=2;g._checkCalendar=function(a){if(!window._popupCalendar)return false;if(j(a.target).parents().index(j(window._popupCalendar.container))>=0)return false;window._popupCalendar.callCloseHandler();return a.preventDefault()};g.handleMouseDownEvent=function(a){j(document).mouseup(g.handleMouseUpEvent);a.preventDefault()};g.handleMouseUpEvent=function(a){var c=a.target,d=c.calendar,b=false;if(!d)return false;if(typeof c.navAction=="undefined"){if(d.currentDateElement){d.currentDateElement.removeClass("selected");
j(c).addClass("selected");d.shouldClose=d.currentDateElement==j(c);if(!d.shouldClose)d.currentDateElement=j(c)}d.date.setDateOnly(c.date);b=true;d.shouldClose=!j(c).hasClass("otherDay");!d.shouldClose&&d.update(d.date)}else{var f=new Date(d.date);c.navAction==g.NAV_TODAY&&f.setDateOnly(new Date);var h=f.getFullYear(),e=f.getMonth(),m=function(i){var k=f.getDate(),l=f.getMonthDays(i);k>l&&f.setDate(l);f.setMonth(i)};switch(c.navAction){case g.NAV_PREVIOUS_YEAR:h>d.minYear&&f.setFullYear(h-1);break;
case g.NAV_PREVIOUS_MONTH:if(e>0)m(e-1);else if(h-- >d.minYear){f.setFullYear(h);m(11)}break;case g.NAV_TODAY:break;case g.NAV_NEXT_MONTH:if(e<11)m(e+1);else if(h<d.maxYear){f.setFullYear(h+1);m(0)}break;case g.NAV_NEXT_YEAR:h<d.maxYear&&f.setFullYear(h+1);break}if(f.equalsTo(d.date)){if(c.navAction==0)b=d.shouldClose=true}else{d.shouldClose=false;d.setDate(f);b=true}}b&&a&&d.callSelectHandler();d.shouldClose&&a&&d.callCloseHandler();j(document).unbind("mouseup",g.handleMouseUpEvent);return a.preventDefault()};
g.defaultSelectHandler=function(a){if(!a.dateField)return false;a.dateField.attr("tagName")=="INPUT"?a.dateField.val(a.date.print(a.dateFormat)):a.dateField.html(a.date.print(a.dateFormat));a.dateField.trigger("change");a.shouldClose&&a.callCloseHandler();return true};g.defaultCloseHandler=function(a){a.hide()};g.prototype={container:null,date:null,currentDateElement:null,shouldClose:false,isPopup:true,update:function(a){var c=this,d=new Date,b=d.getFullYear(),f=d.getMonth(),h=d.getDate(),e=a.getMonth(),
m=a.getDate();if(a.getFullYear()<this.minYear)a.setFullYear(this.minYear);else a.getFullYear()>this.maxYear&&a.setFullYear(this.maxYear);this.date=new Date(a);a.setDate(1);d=(a.getDay()-this.firstDayOfWeek)%7;if(d<0)d+=7;a.setDate(-d);a.setDate(a.getDate()+1);j("tbody tr",this.container).each(function(){var i=false;j(this).children().each(function(){var k=a.getDate(),l=a.getDay(),n=a.getMonth()==e;cell=j(this);cell.removeAttr("class");cell[0].date=new Date(a);cell.html(k);if(n)i=true;else cell.addClass("otherDay");
if(n&&k==m){cell.addClass("selected");c.currentDateElement=cell}a.getFullYear()==b&&a.getMonth()==f&&k==h&&cell.addClass("today");c.weekend.indexOf(l.toString())!=-1&&cell.addClass("weekend");a.setDate(k+1)});!i?j(this).hide():j(this).show()});j("td.title",this.container).html(g.MONTH_NAMES[e]+" "+c.date.getFullYear())},create:function(a){this.isPopup=false;if(!a){a=j("body");this.isPopup=true}var c=j("<table />"),d=j("<thead />");c.append(d);var b=j("<tr />"),f=j('<td colspan="7" class="title" />');
b.append(f);d.append(b);b=j("<tr />");this._drawButtonCell(b,"&#x00ab;",1,g.NAV_PREVIOUS_YEAR);this._drawButtonCell(b,"&#x2039;",1,g.NAV_PREVIOUS_MONTH);this._drawButtonCell(b,g.TODAY,3,g.NAV_TODAY);this._drawButtonCell(b,"&#x203a;",1,g.NAV_NEXT_MONTH);this._drawButtonCell(b,"&#x00bb;",1,g.NAV_NEXT_YEAR);d.append(b);b=j("<tr />");for(var h=0;h<7;++h){var e=(h+this.firstDayOfWeek)%7;f=j("<th />").html(g.SHORT_DAY_NAMES[e]);this.weekend.indexOf(e.toString())!=-1&&f.addClass("weekend");b.append(f)}d.append(b);
d=c.append(j("<tbody />"));for(h=6;h>0;--h){b=j("<tr />").addClass("days");d.append(b);for(e=7;e>0;--e){f=j("<td />");f[0].calendar=this;b.append(f)}}this.container=j("<div />").addClass("calendar").append(c);this.isPopup&&this.container.css({position:"absolute",display:"none"}).addClass("popup");this.update(this.date);this.container.mousedown(g.handleMouseDownEvent);a.append(this.container)},_drawButtonCell:function(a,c,d,b){var f=j("<td />");if(d>1)f[0].colSpan=d;f.addClass("button").html(c).attr("unselectable",
"on");f[0].calendar=this;f[0].navAction=b;a.append(f);return f},callSelectHandler:function(){this.selectHandler&&this.selectHandler(this,this.date.print(this.dateFormat))},callCloseHandler:function(){this.closeHandler&&this.closeHandler(this)},show:function(){this.container.show();if(this.isPopup){window._popupCalendar=this;j(document).mousedown(g._checkCalendar)}},showAt:function(a,c){this.container.css({left:a+"px",top:c+"px"});this.show()},showAtElement:function(a){a=a.offset();this.showAt(a.left,
a.top)},hide:function(){this.isPopup&&j(document).unbind("mousedown",g._checkCalendar);this.container.hide()},parseDate:function(a,c){if(!c)c=this.dateFormat;this.setDate(Date.parseDate(a,c))},setDate:function(a){a.equalsTo(this.date)||this.update(a)},setRange:function(a,c){this.minYear=a;this.maxYear=c}};window._popupCalendar=null;Date.DAYS_IN_MONTH=Array(31,28,31,30,31,30,31,31,30,31,30,31);Date.SECOND=1E3;Date.MINUTE=60*Date.SECOND;Date.HOUR=60*Date.MINUTE;Date.DAY=24*Date.HOUR;Date.WEEK=7*Date.DAY;
Date.parseDate=function(a,c){var d=new Date,b=0,f=-1,h=0,e=a.split(/\W+/),m=c.match(/%./g),i=0,k=0,l=0,n=0;for(i=0;i<e.length;++i)if(e[i])switch(m[i]){case "%d":case "%e":h=parseInt(e[i],10);break;case "%m":f=parseInt(e[i],10)-1;break;case "%Y":case "%y":b=parseInt(e[i],10);b<100&&(b+=b>29?1900:2E3);break;case "%b":case "%B":for(k=0;k<12;++k)if(g.MONTH_NAMES[k].substr(0,e[i].length).toLowerCase()==e[i].toLowerCase()){f=k;break}break;case "%H":case "%I":case "%k":case "%l":l=parseInt(e[i],10);break;
case "%P":case "%p":if(/pm/i.test(e[i])&&l<12)l+=12;else if(/am/i.test(e[i])&&l>=12)l-=12;break;case "%M":n=parseInt(e[i],10);break}if(isNaN(b))b=d.getFullYear();if(isNaN(f))f=d.getMonth();if(isNaN(h))h=d.getDate();if(isNaN(l))l=d.getHours();if(isNaN(n))n=d.getMinutes();if(b!=0&&f!=-1&&h!=0)return new Date(b,f,h,l,n,0);b=0;f=-1;for(i=h=0;i<e.length;++i)if(e[i].search(/[a-zA-Z]+/)!=-1){m=-1;for(k=0;k<12;++k)if(g.MONTH_NAMES[k].substr(0,e[i].length).toLowerCase()==e[i].toLowerCase()){m=k;break}if(m!=
-1){if(f!=-1)h=f+1;f=m}}else if(parseInt(e[i],10)<=12&&f==-1)f=e[i]-1;else if(parseInt(e[i],10)>31&&b==0){b=parseInt(e[i],10);b<100&&(b+=b>29?1900:2E3)}else if(h==0)h=e[i];if(b==0)b=d.getFullYear();if(f!=-1&&h!=0)return new Date(b,f,h,l,n,0);return d};Date.prototype.getMonthDays=function(a){var c=this.getFullYear();if(typeof a=="undefined")a=this.getMonth();return 0==c%4&&(0!=c%100||0==c%400)&&a==1?29:Date.DAYS_IN_MONTH[a]};Date.prototype.getDayOfYear=function(){var a=new Date(this.getFullYear(),
this.getMonth(),this.getDate(),0,0,0),c=new Date(this.getFullYear(),0,0,0,0,0);return Math.floor((a-c)/Date.DAY)};Date.prototype.getWeekNumber=function(){var a=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0),c=a.getDay();a.setDate(a.getDate()-(c+6)%7+3);c=a.valueOf();a.setMonth(0);a.setDate(4);return Math.round((c-a.valueOf())/6048E5)+1};Date.prototype.equalsTo=function(a){return this.getFullYear()==a.getFullYear()&&this.getMonth()==a.getMonth()&&this.getDate()==a.getDate()&&this.getHours()==
a.getHours()&&this.getMinutes()==a.getMinutes()};Date.prototype.setDateOnly=function(a){a=new Date(a);this.setDate(1);this.setFullYear(a.getFullYear());this.setMonth(a.getMonth());this.setDate(a.getDate())};Date.prototype.print=function(a){var c=this.getMonth(),d=this.getDate(),b=this.getFullYear(),f=this.getWeekNumber(),h=this.getDay(),e={},m=this.getHours(),i=m>=12,k=i?m-12:m,l=this.getDayOfYear();if(k==0)k=12;var n=this.getMinutes(),o=this.getSeconds();e["%a"]=g.SHORT_DAY_NAMES[h];e["%A"]=g.DAY_NAMES[h];
e["%b"]=g.SHORT_MONTH_NAMES[c];e["%B"]=g.MONTH_NAMES[c];e["%C"]=1+Math.floor(b/100);e["%d"]=d<10?"0"+d:d;e["%e"]=d;e["%H"]=m<10?"0"+m:m;e["%I"]=k<10?"0"+k:k;e["%j"]=l<100?l<10?"00"+l:"0"+l:l;e["%k"]=m;e["%l"]=k;e["%m"]=c<9?"0"+(1+c):1+c;e["%M"]=n<10?"0"+n:n;e["%n"]="\n";e["%p"]=i?"PM":"AM";e["%P"]=i?"pm":"am";e["%s"]=Math.floor(this.getTime()/1E3);e["%S"]=o<10?"0"+o:o;e["%t"]="\t";e["%U"]=e["%W"]=e["%V"]=f<10?"0"+f:f;e["%u"]=h+1;e["%w"]=h;e["%y"]=(""+b).substr(2,2);e["%Y"]=b;e["%%"]="%";c=/%./g;d=
a.match(c);for(b=0;b<d.length;b++)if(f=e[d[b]]){c=RegExp(d[b],"g");a=a.replace(c,f)}return a};Date.prototype.__msh_oldSetFullYear=Date.prototype.setFullYear;Date.prototype.setFullYear=function(a){var c=new Date(this);c.__msh_oldSetFullYear(a);c.getMonth()!=this.getMonth()&&this.setDate(28);this.__msh_oldSetFullYear(a)};j.fn.calendar=function(a){var c=j.extend({},{triggerElement:null,parentElement:null,minYear:1900,maxYear:2100,firstDayOfWeek:1,weekend:"0,6",dateFormat:"%Y-%m-%d",dateField:null,selectHandler:null,
closeHandler:null},a);this.each(function(){var d=j(this),b=new g;b.minYear=c.minYear;b.maxYear=c.maxYear;b.firstDayOfWeek=c.firstDayOfWeek;b.weekend=c.weekend;b.dateFormat=c.dateFormat;b.dateField=c.dateField||d;b.selectHandler=c.selectHandler||g.defaultSelectHandler;var f=d.html()||d.val();if(c.parentElement){b.create(j(c.parentElement));f&&b.parseDate(f);b.show()}else{b.create();f&&b.parseDate(f);var h=j(c.triggerElement||d);h.click(function(){b.closeHandler=c.closeHandler||g.defaultCloseHandler;
b.showAtElement(h)})}});return this}})(jQuery);
