/* http://keith-wood.name/dateEntry.html
   Time entry for jQuery v1.0.0.
   Written by Keith Wood (kbwood{at}iinet.com.au) March 2009.
   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and 
   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. 
   Please attribute the author if you use it. */
(function($){function DateEntry(){this._disabledInputs=[];this.regional=[];this.regional['']={dateFormat:'mdy/',monthNames:['January','February','March','April','May','June','July','August','September','October','November','December'],monthNamesShort:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],dayNames:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],dayNamesShort:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],spinnerTexts:['Today','Previous field','Next field','Increment','Decrement']};this._defaults={appendText:'',initialField:0,useMouseWheel:true,defaultDate:null,minDate:null,maxDate:null,spinnerImage:'spinnerDefault.png',spinnerSize:[20,20,8],spinnerBigImage:'',spinnerBigSize:[40,40,16],spinnerIncDecOnly:false,spinnerRepeat:[500,250],beforeShow:null};$.extend(this._defaults,this.regional[''])}var m='dateEntry';$.extend(DateEntry.prototype,{markerClassName:'hasDateEntry',setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_connectDateEntry:function(b,c){var d=$(b);if(d.hasClass(this.markerClassName)){return}var e={};e.options=$.extend({},c);e._selectedYear=0;e._selectedMonth=0;e._selectedDay=0;e._field=0;e.input=$(b);$.data(b,m,e);var f=this._get(e,'spinnerImage');var g=this._get(e,'spinnerText');var h=this._get(e,'spinnerSize');var i=this._get(e,'appendText');var j=(!f?null:$('<span class="dateEntry_control" style="display: inline-block; '+'background: url(\''+f+'\') 0 0 no-repeat; '+'width: '+h[0]+'px; height: '+h[1]+'px;'+($.browser.mozilla&&$.browser.version<'1.9'?' padding-left: '+h[0]+'px; padding-bottom: '+(h[1]-18)+'px;':'')+'"></span>'));d.wrap('<span class="dateEntry_wrap"></span>').after(i?'<span class="dateEntry_append">'+i+'</span>':'').after(j||'');d.addClass(this.markerClassName).bind('focus.dateEntry',this._doFocus).bind('blur.dateEntry',this._doBlur).bind('click.dateEntry',this._doClick).bind('keydown.dateEntry',this._doKeyDown).bind('keypress.dateEntry',this._doKeyPress);if($.browser.mozilla){d.bind('input.dateEntry',function(a){$.dateEntry._parseDate(e)})}if($.browser.msie){d.bind('paste.dateEntry',function(a){setTimeout(function(){$.dateEntry._parseDate(e)},1)})}if(this._get(e,'useMouseWheel')&&$.fn.mousewheel){d.mousewheel(this._doMouseWheel)}if(j){j.mousedown(this._handleSpinner).mouseup(this._endSpinner).mouseover(this._expandSpinner).mouseout(this._endSpinner).mousemove(this._describeSpinner)}},_enableDateEntry:function(a){this._enableDisable(a,false)},_disableDateEntry:function(a){this._enableDisable(a,true)},_enableDisable:function(b,c){var d=$.data(b,m);if(!d){return}b.disabled=c;if(b.nextSibling&&b.nextSibling.nodeName.toLowerCase()=='span'){$.dateEntry._changeSpinner(d,b.nextSibling,(c?5:-1))}$.dateEntry._disabledInputs=$.map($.dateEntry._disabledInputs,function(a){return(a==b?null:a)});if(c){$.dateEntry._disabledInputs.push(b)}},_isDisabledDateEntry:function(a){return $.inArray(a,this._disabledInputs)>-1},_changeDateEntry:function(a,b){var c=$.data(a,m);if(c){var d=this._extractDate(c);extendRemove(c.options,b||{});if(d){this._setDate(c,d)}}$.data(a,m,c)},_destroyDateEntry:function(b){$input=$(b);if(!$input.hasClass(this.markerClassName)){return}$input.removeClass(this.markerClassName).unbind('.dateEntry');if($.browser.mozilla){$input.unbind('input.dateEntry')}if($.browser.msie){$input.unbind('paste.dateEntry')}if($.fn.mousewheel){$input.unmousewheel()}this._disabledInputs=$.map(this._disabledInputs,function(a){return(a==b?null:a)});$input.parent().replaceWith($input);$.removeData(b,m)},_setDateDateEntry:function(a,b){var c=$.data(a,m);if(c){this._setDate(c,b?(typeof b=='object'?new Date(b.getTime()):b):null)}},_getDateDateEntry:function(a){var b=$.data(a,m);return(b?this._extractDate(b):null)},_doFocus:function(a){var b=(a.nodeName&&a.nodeName.toLowerCase()=='input'?a:this);if($.dateEntry._lastInput==b){return}if($.dateEntry._isDisabledDateEntry(b)){return}var c=$.data(b,m);$.dateEntry._focussed=true;$.dateEntry._lastInput=b;$.dateEntry._blurredInput=null;var d=$.dateEntry._get(c,'beforeShow');extendRemove(c.options,(d?d.apply(b,[b]):{}));$.data(b,m,c);$.dateEntry._parseDate(c)},_doBlur:function(a){$.dateEntry._blurredInput=$.dateEntry._lastInput;$.dateEntry._lastInput=null},_doClick:function(a){var b=a.target;var c=$.data(b,m);if(!$.dateEntry._focussed){var d=$.dateEntry._get(c,'dateFormat');c._field=0;if($.browser.msie){var e=b.value;var f=a.clientX+document.documentElement.scrollLeft-$(a.srcElement).offset().left;var g=0;for(var h=0;h<3;h++){g+=$.dateEntry._fieldLength(c,h,d)+1;b.value=e.substring(0,g);var i=b.createTextRange();if(f<i.boundingWidth){c._field=h;break}}b.value=e}else{var g=0;for(var h=0;h<3;h++){g+=$.dateEntry._fieldLength(c,h,d)+1;if(b.selectionStart<g){c._field=h;break}}}}$.data(b,m,c);$.dateEntry._showField(c);$.dateEntry._focussed=false},_doKeyDown:function(a){if(a.keyCode>=48){return true}var b=$.data(a.target,m);switch(a.keyCode){case 9:return(a.shiftKey?$.dateEntry._previousField(b,true):$.dateEntry._nextField(b,true));case 35:if(a.ctrlKey){$.dateEntry._setValue(b,'')}else{b._field=2;$.dateEntry._adjustField(b,0)}break;case 36:if(a.ctrlKey){$.dateEntry._setDate(b)}else{b._field=0;$.dateEntry._adjustField(b,0)}break;case 37:$.dateEntry._previousField(b,false);break;case 38:$.dateEntry._adjustField(b,+1);break;case 39:$.dateEntry._nextField(b,false);break;case 40:$.dateEntry._adjustField(b,-1);break;case 46:$.dateEntry._setValue(b,'');break}return false},_doKeyPress:function(a){var b=String.fromCharCode(a.charCode==undefined?a.keyCode:a.charCode);if(b<' '){return true}var c=$.data(a.target,m);$.dateEntry._handleKeyPress(c,b);return false},_doMouseWheel:function(a,b){if($.dateEntry._isDisabledDateEntry(a.target)){return}b=($.browser.opera?-b/Math.abs(b):($.browser.safari?b/Math.abs(b):b));var c=$.data(a.target,m);if(!c.input.val()){$.dateEntry._parseDate(c)}$.dateEntry._adjustField(c,b);a.preventDefault()},_expandSpinner:function(a){var b=$.dateEntry._getSpinnerTarget(a);var c=$.data($.dateEntry._getInput(b),m);var d=$.dateEntry._get(c,'spinnerBigImage');if(d){c._expanded=true;var e=$(b).offset();var f=$.dateEntry._get(c,'spinnerSize');var g=$.dateEntry._get(c,'spinnerBigSize');$('<div class="dateEntry_expand" style="position: absolute; left: '+(e.left-(g[0]-f[0])/2)+'px; top: '+(e.top-(g[1]-f[1])/2)+'px; width: '+g[0]+'px; height: '+g[1]+'px; background: #fff url('+d+') no-repeat 0px 0px; z-index: 10;"></div>').mousedown($.dateEntry._handleSpinner).mouseup($.dateEntry._endSpinner).mouseout($.dateEntry._endExpand).mousemove($.dateEntry._describeSpinner).insertAfter(b)}},_getInput:function(a){return $(a).siblings('.'+$.dateEntry.markerClassName)[0]},_describeSpinner:function(a){var b=$.dateEntry._getSpinnerTarget(a);var c=$.data($.dateEntry._getInput(b),m);b.title=$.dateEntry._get(c,'spinnerTexts')[$.dateEntry._getSpinnerRegion(c,a)]},_handleSpinner:function(a){var b=$.dateEntry._getSpinnerTarget(a);var c=$.dateEntry._getInput(b);if($.dateEntry._isDisabledDateEntry(c)){return}if(c==$.dateEntry._blurredInput){$.dateEntry._lastInput=c;$.dateEntry._blurredInput=null}var d=$.data(c,m);$.dateEntry._doFocus(c);var e=$.dateEntry._getSpinnerRegion(d,a);$.dateEntry._changeSpinner(d,b,e);$.dateEntry._actionSpinner(d,e);$.dateEntry._timer=null;var f=$.dateEntry._get(d,'spinnerRepeat');if(e>=3&&f[0]){$.dateEntry._timer=setTimeout(function(){$.dateEntry._repeatSpinner(d,e)},f[0]);$(b).one('mouseout',$.dateEntry._releaseSpinner).one('mouseup',$.dateEntry._releaseSpinner)}},_actionSpinner:function(a,b){if(!a.input.val()){$.dateEntry._parseDate(a)}switch(b){case 0:this._setDate(a);break;case 1:this._previousField(a,false);break;case 2:this._nextField(a,false);break;case 3:this._adjustField(a,+1);break;case 4:this._adjustField(a,-1);break}},_repeatSpinner:function(a,b){if(!$.dateEntry._timer){return}$.dateEntry._lastInput=$.dateEntry._blurredInput;this._actionSpinner(a,b);this._timer=setTimeout(function(){$.dateEntry._repeatSpinner(a,b)},this._get(a,'spinnerRepeat')[1])},_releaseSpinner:function(a){clearTimeout($.dateEntry._timer);$.dateEntry._timer=null},_endExpand:function(a){$.dateEntry._timer=null;var b=$.dateEntry._getSpinnerTarget(a);var c=$.dateEntry._getInput(b);var d=$.data(c,m);$(b).remove();d._expand=false},_endSpinner:function(a){$.dateEntry._timer=null;var b=$.dateEntry._getSpinnerTarget(a);var c=$.dateEntry._getInput(b);var d=$.data(c,m);if(!$.dateEntry._isDisabledDateEntry(c)){$.dateEntry._changeSpinner(d,b,-1)}if(!$.browser.opera){$.dateEntry._lastInput=$.dateEntry._blurredInput}if($.dateEntry._lastInput){$.dateEntry._showField(d)}},_getSpinnerTarget:function(a){return a.target||a.srcElement},_getSpinnerRegion:function(a,b){var c=this._getSpinnerTarget(b);var d=($.browser.opera||$.browser.safari?$.dateEntry._findPos(c):$(c).offset());var e=($.browser.safari?$.dateEntry._findScroll(c):[document.documentElement.scrollLeft||document.body.scrollLeft,document.documentElement.scrollTop||document.body.scrollTop]);var f=this._get(a,'spinnerIncDecOnly');var g=(f?99:b.clientX+e[0]-d.left-($.browser.msie?2:0));var h=b.clientY+e[1]-d.top-($.browser.msie?2:0);var i=this._get(a,(a._expanded?'spinnerBigSize':'spinnerSize'));var j=(f?99:i[0]-1-g);var k=i[1]-1-h;if(i[2]>0&&Math.abs(g-j)<=i[2]&&Math.abs(h-k)<=i[2]){return 0}var l=Math.min(g,h,j,k);return(l==g?1:(l==j?2:(l==h?3:4)))},_changeSpinner:function(a,b,c){$(b).css('background-position','-'+((c+1)*this._get(a,(a._expanded?'spinnerBigSize':'spinnerSize'))[0])+'px 0px')},_findPos:function(a){var b=curTop=0;if(a.offsetParent){b=a.offsetLeft;curTop=a.offsetTop;while(a=a.offsetParent){var c=b;b+=a.offsetLeft;if(b<0){b=c}curTop+=a.offsetTop}}return{left:b,top:curTop}},_findScroll:function(a){var b=false;$(a).parents().each(function(){b|=$(this).css('position')=='fixed'});if(b){return[0,0]}var c=a.scrollLeft;var d=a.scrollTop;while(a=a.parentNode){c+=a.scrollLeft||0;d+=a.scrollTop||0}return[c,d]},_get:function(a,b){return(a.options[b]!=null?a.options[b]:$.dateEntry._defaults[b])},_parseDate:function(a){var b=this._extractDate(a)||this._normaliseDate(this._determineDate(this._get(a,'defaultDate'))||new Date());var c=this._get(a,'dateFormat');a._selectedYear=b.getFullYear();a._selectedMonth=b.getMonth();a._selectedDay=b.getDate();a._lastChr='';a._field=Math.max(0,Math.min(2,this._get(a,'initialField')));if(a.input.val()!=''){this._showDate(a)}},_extractDate:function(a){var b=a.input.val();var c=this._get(a,'dateFormat');var d=b.split(c.charAt(3));var e=0;var f=0;var g=0;for(var i=0;i<3;i++){var h=parseInt(d[i],10);h=(isNaN(h)?0:h);var j=c.charAt(i);switch(j){case'y':e=h;break;case'm':f=h;break;case'n':case'N':f=$.inArray(d[i],this._get(a,(j=='N'?'monthNames':'monthNamesShort')))+1;break;case'w':case'W':if(c.charAt(3)==' '){d.splice(i,1);h=parseInt(d[i],10)}else{h=parseInt(d[i].substr(this._get(a,(j=='W'?'dayNames':'dayNamesShort'))[0].length+1),10)}h=(isNaN(h)?0:h);case'd':g=h;break}}return(e&&f&&g?new Date(e,f-1,g):null)},_showDate:function(a){var b=this._get(a,'dateFormat');var c='';for(var i=0;i<3;i++){c+=(i==0?'':b.charAt(3));var d=b.charAt(i);switch(d){case'y':c+=this._formatNumber(a._selectedYear);break;case'm':c+=this._formatNumber(a._selectedMonth+1);break;case'n':case'N':c+=this._get(a,(d=='N'?'monthNames':'monthNamesShort'))[a._selectedMonth];break;case'd':c+=this._formatNumber(a._selectedDay);break;case'w':case'W':c+=this._get(a,(d=='W'?'dayNames':'dayNamesShort'))[new Date(a._selectedYear,a._selectedMonth,a._selectedDay).getDay()]+' '+this._formatNumber(a._selectedDay);break}}this._setValue(a,c);this._showField(a)},_showField:function(a){var b=a.input[0];if(a.input.is(':hidden')||$.dateEntry._lastInput!=b){return}var c=this._get(a,'dateFormat');var d=0;for(var i=0;i<a._field;i++){d+=this._fieldLength(a,i,c)+1}var e=d+this._fieldLength(a,i,c);if(b.setSelectionRange){b.setSelectionRange(d,e)}else if(b.createTextRange){var f=b.createTextRange();f.moveStart('character',d);f.moveEnd('character',e-a.input.val().length);f.select()}if(!b.disabled){b.focus()}},_fieldLength:function(a,b,c){b=c.charAt(b);switch(b){case'y':return 4;case'n':case'N':return this._get(a,(b=='N'?'monthNames':'monthNamesShort'))[a._selectedMonth].length;case'w':case'W':return this._get(a,(b=='W'?'dayNames':'dayNamesShort'))[new Date(a._selectedYear,a._selectedMonth,a._selectedDay).getDay()].length+3;default:return 2}},_formatNumber:function(a){return(a<10?'0':'')+a},_setValue:function(a,b){a.input.val(b).trigger('change')},_previousField:function(a,b){var c=(a.input.val()==''||a._field==0);if(!c){a._field--}this._showField(a);a._lastChr='';$.data(a.input[0],m,a);return(c&&b)},_nextField:function(a,b){var c=(a.input.val()==''||a._field==2);if(!c){a._field++}this._showField(a);a._lastChr='';$.data(a.input[0],m,a);return(c&&b)},_adjustField:function(a,b){if(a.input.val()==''){b=0}var c=this._get(a,'dateFormat').charAt(a._field);var d=a._selectedYear+(c=='y'?b:0);var e=a._selectedMonth+(c=='m'||c=='n'||c=='N'?b:0);var f=(c=='d'||c=='w'||c=='W'?a._selectedDay+b:Math.min(a._selectedDay,this._getDaysInMonth(d,e)));this._setDate(a,new Date(d,e,f))},_getDaysInMonth:function(a,b){return 32-new Date(a,b,32).getDate()},_setDate:function(a,b){b=this._normaliseDate(this._determineDate(b||this._get(a,'defaultDate'))||new Date());var c=this._normaliseDate(this._determineDate(this._get(a,'minDate')));var d=this._normaliseDate(this._determineDate(this._get(a,'maxDate')));b=(c&&b<c?c:(d&&b>d?d:b));a._selectedYear=b.getFullYear();a._selectedMonth=b.getMonth();a._selectedDay=b.getDate();this._showDate(a);$.data(a.input[0],m,a)},_determineDate:function(h){var i=function(a){var b=new Date();b.setDate(b.getDate()+a);return b};var j=function(a){var b=new Date();var c=b.getFullYear();var d=b.getMonth();var e=b.getDate();var f=/([+-]?[0-9]+)\s*(d|w|m|y)?/g;var g=f.exec(a.toLowerCase());while(g){switch(g[2]||'d'){case'd':e+=parseInt(g[1],10);break;case'w':e+=parseInt(g[1],10)*7;break;case'm':d+=parseInt(g[1],10);break;case'y':c+=parseInt(g[1],10);break}g=f.exec(a)}return new Date(c,d,e)};return(h?(typeof h=='string'?j(h):(typeof h=='number'?i(h):h)):null)},_normaliseDate:function(a){if(!a){return null}a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a},_handleKeyPress:function(a,b){var c=this._get(a,'dateFormat');if(b==c.charAt(3)){this._nextField(a,false)}else if(b>='0'&&b<='9'){var d=c.charAt(a._field);var e=parseInt(a._lastChr+b,10);var f=(d=='y'?e:a._selectedYear);var g=((d=='m'||d=='n'||d=='N')&&e>=1&&e<=12?e:a._selectedMonth+1);var h=((d=='d'||d=='w'||d=='W')&&e>=1&&e<=this._getDaysInMonth(f,g-1)?e:a._selectedDay);this._setDate(a,new Date(f,g-1,h));a._lastChr=(d!='y'?'':a._lastChr.substr(Math.max(0,a._lastChr.length-2)))+b}}});function extendRemove(a,b){$.extend(a,b);for(var c in b){if(b[c]==null){a[c]=null}}return a}$.fn.dateEntry=function(d){var e=Array.prototype.slice.call(arguments,1);if(typeof d=='string'&&(d=='isDisabled'||d=='getDate')){return $.dateEntry['_'+d+'DateEntry'].apply($.dateEntry,[this[0]].concat(e))}return this.each(function(){var a=this.nodeName.toLowerCase();if(a=='input'){if(typeof d=='string'){$.dateEntry['_'+d+'DateEntry'].apply($.dateEntry,[this].concat(e))}else{var b={};for(attrName in $.dateEntry._defaults){var c=this.getAttribute('date:'+attrName);if(c){b=b||{};try{b[attrName]=eval(c)}catch(err){b[attrName]=c}}}$.dateEntry._connectDateEntry(this,$.extend(b,d))}}})};$.dateEntry=new DateEntry()})(jQuery);