/* http://keith-wood.name/dateEntry.html Date entry for jQuery v1.0.3. 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:$(''));d.wrap('').after(i?''+i+'':'').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($.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||$.dateEntry._isDisabledDateEntry(b)){$.dateEntry._focussed=false;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);setTimeout(function(){$.dateEntry._showField(c)},10)},_doBlur:function(a){$.dateEntry._blurredInput=$.dateEntry._lastInput;$.dateEntry._lastInput=null},_doClick:function(b){var c=b.target;var d=$.data(c,m);if(!$.dateEntry._focussed){var e=$.dateEntry._get(d,'dateFormat');d._field=0;if(c.selectionStart!=null){var f=0;for(var g=0;g<3;g++){f+=$.dateEntry._fieldLength(d,g,e)+1;d._field=g;if(c.selectionStart=48){return true}var b=$.data(a.target,m);switch(a.keyCode){case 9:return(a.shiftKey?$.dateEntry._changeField(b,-1,true):$.dateEntry._changeField(b,+1,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._changeField(b,-1,false);break;case 38:$.dateEntry._adjustField(b,+1);break;case 39:$.dateEntry._changeField(b,+1,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);c.input.focus();if(!c.input.val()){$.dateEntry._parseDate(c)}$.dateEntry._adjustField(c,b);a.preventDefault()},_expandSpinner:function(b){var c=$.dateEntry._getSpinnerTarget(b);var d=$.data($.dateEntry._getInput(c),m);var e=$.dateEntry._get(d,'spinnerBigImage');if(e){d._expanded=true;var f=$(c).offset();var g=null;$(c).parents().each(function(){var a=$(this);if(a.css('position')=='relative'||a.css('position')=='absolute'){g=a.offset()}return!g});var h=$.dateEntry._get(d,'spinnerSize');var i=$.dateEntry._get(d,'spinnerBigSize');$('
').mousedown($.dateEntry._handleSpinner).mouseup($.dateEntry._endSpinner).mouseout($.dateEntry._endExpand).mousemove($.dateEntry._describeSpinner).insertAfter(c)}},_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;$.dateEntry._handlingSpinner=true;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._changeField(a,-1,false);break;case 2:this._changeField(a,+1,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._expanded=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($.dateEntry._handlingSpinner){$.dateEntry._lastInput=$.dateEntry._blurredInput}if($.dateEntry._lastInput&&$.dateEntry._handlingSpinner){$.dateEntry._showField(d)}$.dateEntry._handlingSpinner=false},_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;id?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){a=a.toLowerCase();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);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._changeField(a,+1,false)}else if(b>='0'&&b<='9'){var d=c.charAt(a._field);var e=parseInt(b,10);var f=parseInt(a._lastChr+b,10);var g=(d!='y'?a._selectedYear:f);var h=(d!='m'&&d!='n'&&d!='N'?a._selectedMonth+1:(f>=1&&f<=12?f:(e>0?e:a._selectedMonth+1)));var i=(d!='d'&&d!='w'&&d!='W'?a._selectedDay:(f>=1&&f<=this._getDaysInMonth(g,h-1)?f:(e>0?e:a._selectedDay)));this._setDate(a,new Date(g,h-1,i));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(c){var d=Array.prototype.slice.call(arguments,1);if(typeof c=='string'&&(c=='isDisabled'||c=='getDate')){return $.dateEntry['_'+c+'DateEntry'].apply($.dateEntry,[this[0]].concat(d))}return this.each(function(){var a=this.nodeName.toLowerCase();if(a=='input'){if(typeof c=='string'){$.dateEntry['_'+c+'DateEntry'].apply($.dateEntry,[this].concat(d))}else{var b=($.fn.metadata?$(this).metadata():{});$.dateEntry._connectDateEntry(this,$.extend(b,c))}}})};$.dateEntry=new DateEntry()})(jQuery);