(function($){function TimeEntry(){this._disabledInputs=[];this.regional=[];this.regional['']={show24Hours:false,separator:':',ampmPrefix:'',ampmNames:['AM','PM'],spinnerTexts:['Now','Previous field','Next field','Increment','Decrement']};this._defaults={appendText:'',showSeconds:false,timeSteps:[1,1,1],initialField:0,useMouseWheel:true,defaultTime:null,minTime:null,maxTime:null,spinnerImage:'spinnerDefault.png',spinnerSize:[20,20,8],spinnerBigImage:'',spinnerBigSize:[40,40,16],spinnerIncDecOnly:false,spinnerRepeat:[500,250],beforeShow:null,beforeSetTime:null};$.extend(this._defaults,this.regional['']);}var PROP_NAME='timeEntry';$.extend(TimeEntry.prototype,{markerClassName:'hasTimeEntry',setDefaults:function(options){extendRemove(this._defaults,options||{});return this;},_connectTimeEntry:function(target,options){var input=$(target);if(input.hasClass(this.markerClassName)){return;}var inst={};inst.options=$.extend({},options);inst._selectedHour=0;inst._selectedMinute=0;inst._selectedSecond=0;inst._field=0;inst.input=$(target);$.data(target,PROP_NAME,inst);var spinnerImage=this._get(inst,'spinnerImage');var spinnerText=this._get(inst,'spinnerText');var spinnerSize=this._get(inst,'spinnerSize');var appendText=this._get(inst,'appendText');var spinner=(!spinnerImage?null:$('<span class="timeEntry_control" style="display: inline-block; '+'background: url(\''+spinnerImage+'\') 0 0 no-repeat; '+'width: '+spinnerSize[0]+'px; height: '+spinnerSize[1]+'px;'+($.browser.mozilla&&$.browser.version<'1.9'?' padding-left: '+spinnerSize[0]+'px; padding-bottom: '+(spinnerSize[1]-18)+'px;':'')+'"></span>'));input.wrap('<span class="timeEntry_wrap"></span>').after(appendText?'<span class="timeEntry_append">'+appendText+'</span>':'').after(spinner||'');input.addClass(this.markerClassName).bind('focus.timeEntry',this._doFocus).bind('blur.timeEntry',this._doBlur).bind('click.timeEntry',this._doClick).bind('keydown.timeEntry',this._doKeyDown).bind('keypress.timeEntry',this._doKeyPress);if($.browser.mozilla){input.bind('input.timeEntry',function(event){$.timeentry._parseTime(inst);});}if($.browser.msie){input.bind('paste.timeEntry',function(event){setTimeout(function(){$.timeentry._parseTime(inst);},1);});}if(this._get(inst,'useMouseWheel')&&$.fn.mousewheel){input.mousewheel(this._doMouseWheel);}if(spinner){spinner.mousedown(this._handleSpinner).mouseup(this._endSpinner).mouseover(this._expandSpinner).mouseout(this._endSpinner).mousemove(this._describeSpinner);}},_enableTimeEntry:function(input){this._enableDisable(input,false);},_disableTimeEntry:function(input){this._enableDisable(input,true);},_enableDisable:function(input,disable){var inst=$.data(input,PROP_NAME);if(!inst){return;}input.disabled=disable;if(input.nextSibling&&input.nextSibling.nodeName.toLowerCase()=='span'){$.timeEntry._changeSpinner(inst,input.nextSibling,(disable?5:-1));}$.timeEntry._disabledInputs=$.map($.timeEntry._disabledInputs,function(value){return(value==input?null:value);});if(disable){$.timeEntry._disabledInputs.push(input);}},_isDisabledTimeEntry:function(input){return $.inArray(input,this._disabledInputs)>-1;},_changeTimeEntry:function(input,options){var inst=$.data(input,PROP_NAME);if(inst){var currentTime=this._extractTime(inst);extendRemove(inst.options,options||{});if(currentTime){this._setTime(inst,new Date(0,0,0,currentTime[0],currentTime[1],currentTime[2]));}}$.data(input,PROP_NAME,inst);},_destroyTimeEntry:function(input){$input=$(input);if(!$input.hasClass(this.markerClassName)){return;}$input.removeClass(this.markerClassName).unbind('.timeEntry');if($.fn.mousewheel){$input.unmousewheel();}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==input?null:value);});$input.parent().replaceWith($input);$.removeData(input,PROP_NAME);},_setTimeTimeEntry:function(input,time){var inst=$.data(input,PROP_NAME);if(inst){this._setTime(inst,time?(typeof time=='object'?new Date(time.getTime()):time):null);}},_getTimeTimeEntry:function(input){var inst=$.data(input,PROP_NAME);var currentTime=(inst?this._extractTime(inst):null);return(!currentTime?null:new Date(0,0,0,currentTime[0],currentTime[1],currentTime[2]));},_doFocus:function(target){var input=(target.nodeName&&target.nodeName.toLowerCase()=='input'?target:this);if($.timeEntry._lastInput==input||$.timeEntry._isDisabledTimeEntry(input)){$.timeEntry._focussed=false;return;}var inst=$.data(input,PROP_NAME);$.timeEntry._focussed=true;$.timeEntry._lastInput=input;$.timeEntry._blurredInput=null;var beforeShow=$.timeEntry._get(inst,'beforeShow');extendRemove(inst.options,(beforeShow?beforeShow.apply(input,[input]):{}));$.data(input,PROP_NAME,inst);$.timeEntry._parseTime(inst);setTimeout(function(){$.timeEntry._showField(inst);},10);},_doBlur:function(event){$.timeEntry._blurredInput=$.timeEntry._lastInput;$.timeEntry._lastInput=null;},_doClick:function(event){var input=event.target;var inst=$.data(input,PROP_NAME);if(!$.timeEntry._focussed){var fieldSize=$.timeEntry._get(inst,'separator').length+2;inst._field=0;if(input.selectionStart!=null){for(var field=0;field<=Math.max(1,inst._secondField,inst._ampmField);field++){var end=(field!=inst._ampmField?(field*fieldSize)+2:(inst._ampmField*fieldSize)+$.timeEntry._get(inst,'ampmPrefix').length+$.timeEntry._get(inst,'ampmNames')[0].length);inst._field=field;if(input.selectionStart<end){break;}}}else if(input.createTextRange){var src=$(event.srcElement);var range=input.createTextRange();var convert=function(value){return{thin:2,medium:4,thick:6}[value]||value;};var offsetX=event.clientX+document.documentElement.scrollLeft-(src.offset().left+parseInt(convert(src.css('border-left-width')),10))-range.offsetLeft;for(var field=0;field<=Math.max(1,inst._secondField,inst._ampmField);field++){var end=(field!=inst._ampmField?(field*fieldSize)+2:(inst._ampmField*fieldSize)+$.timeEntry._get(inst,'ampmPrefix').length+$.timeEntry._get(inst,'ampmNames')[0].length);range.collapse();range.moveEnd('character',end);inst._field=field;if(offsetX<range.boundingWidth){break;}}}}$.data(input,PROP_NAME,inst);$.timeEntry._showField(inst);$.timeEntry._focussed=false;},_doKeyDown:function(event){if(event.keyCode>=48){return true;}var inst=$.data(event.target,PROP_NAME);switch(event.keyCode){case 9:return(event.shiftKey?$.timeEntry._changeField(inst,-1,true):$.timeEntry._changeField(inst,+1,true));case 35:if(event.ctrlKey){$.timeEntry._setValue(inst,'');}else{inst._field=Math.max(1,inst._secondField,inst._ampmField);$.timeEntry._adjustField(inst,0);}break;case 36:if(event.ctrlKey){$.timeEntry._setTime(inst);}else{inst._field=0;$.timeEntry._adjustField(inst,0);}break;case 37:$.timeEntry._changeField(inst,-1,false);break;case 38:$.timeEntry._adjustField(inst,+1);break;case 39:$.timeEntry._changeField(inst,+1,false);break;case 40:$.timeEntry._adjustField(inst,-1);break;case 46:$.timeEntry._setValue(inst,'');break;}return false;},_doKeyPress:function(event){var chr=String.fromCharCode(event.charCode==undefined?event.keyCode:event.charCode);if(chr<' '){return true;}var inst=$.data(event.target,PROP_NAME);$.timeEntry._handleKeyPress(inst,chr);return false;},_doMouseWheel:function(event,delta){if($.timeEntry._isDisabledTimeEntry(event.target)){return;}delta=($.browser.opera?-delta/Math.abs(delta):($.browser.safari?delta/Math.abs(delta):delta));var inst=$.data(event.target,PROP_NAME);inst.input.focus();if(!inst.input.val()){$.timeEntry._parseTime(inst);}$.timeEntry._adjustField(inst,delta);event.preventDefault();},_expandSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var inst=$.data($.timeEntry._getInput(spinner),PROP_NAME);var spinnerBigImage=$.timeEntry._get(inst,'spinnerBigImage');if(spinnerBigImage){inst._expanded=true;var offset=$(spinner).offset();var relative=null;$(spinner).parents().each(function(){var parent=$(this);if(parent.css('position')=='relative'||parent.css('position')=='absolute'){relative=parent.offset();}return!relative;});var spinnerSize=$.timeEntry._get(inst,'spinnerSize');var spinnerBigSize=$.timeEntry._get(inst,'spinnerBigSize');$('<div class="timeEntry_expand" style="position: absolute; left: '+(offset.left-(spinnerBigSize[0]-spinnerSize[0])/2-(relative?relative.left:0))+'px; top: '+(offset.top-(spinnerBigSize[1]-spinnerSize[1])/2-(relative?relative.top:0))+'px; width: '+spinnerBigSize[0]+'px; height: '+spinnerBigSize[1]+'px; background: transparent url('+spinnerBigImage+') no-repeat 0px 0px; z-index: 10;"></div>').mousedown($.timeEntry._handleSpinner).mouseup($.timeEntry._endSpinner).mouseout($.timeEntry._endExpand).mousemove($.timeEntry._describeSpinner).insertAfter(spinner);}},_getInput:function(spinner){return $(spinner).siblings('.'+$.timeEntry.markerClassName)[0];},_describeSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var inst=$.data($.timeEntry._getInput(spinner),PROP_NAME);spinner.title=$.timeEntry._get(inst,'spinnerTexts')[$.timeEntry._getSpinnerRegion(inst,event)];},_handleSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var input=$.timeEntry._getInput(spinner);if($.timeEntry._isDisabledTimeEntry(input)){return;}if(input==$.timeEntry._blurredInput){$.timeEntry._lastInput=input;$.timeEntry._blurredInput=null;}var inst=$.data(input,PROP_NAME);$.timeEntry._doFocus(input);var region=$.timeEntry._getSpinnerRegion(inst,event);$.timeEntry._changeSpinner(inst,spinner,region);$.timeEntry._actionSpinner(inst,region);$.timeEntry._timer=null;$.timeEntry._handlingSpinner=true;var spinnerRepeat=$.timeEntry._get(inst,'spinnerRepeat');if(region>=3&&spinnerRepeat[0]){$.timeEntry._timer=setTimeout(function(){$.timeEntry._repeatSpinner(inst,region);},spinnerRepeat[0]);$(spinner).one('mouseout',$.timeEntry._releaseSpinner).one('mouseup',$.timeEntry._releaseSpinner);}},_actionSpinner:function(inst,region){if(!inst.input.val()){$.timeEntry._parseTime(inst);}switch(region){case 0:this._setTime(inst);break;case 1:this._changeField(inst,-1,false);break;case 2:this._changeField(inst,+1,false);break;case 3:this._adjustField(inst,+1);break;case 4:this._adjustField(inst,-1);break;}},_repeatSpinner:function(inst,region){if(!$.timeEntry._timer){return;}$.timeEntry._lastInput=$.timeEntry._blurredInput;this._actionSpinner(inst,region);this._timer=setTimeout(function(){$.timeEntry._repeatSpinner(inst,region);},this._get(inst,'spinnerRepeat')[1]);},_releaseSpinner:function(event){clearTimeout($.timeEntry._timer);$.timeEntry._timer=null;},_endExpand:function(event){$.timeEntry._timer=null;var spinner=$.timeEntry._getSpinnerTarget(event);var input=$.timeEntry._getInput(spinner);var inst=$.data(input,PROP_NAME);$(spinner).remove();inst._expanded=false;},_endSpinner:function(event){$.timeEntry._timer=null;var spinner=$.timeEntry._getSpinnerTarget(event);var input=$.timeEntry._getInput(spinner);var inst=$.data(input,PROP_NAME);if(!$.timeEntry._isDisabledTimeEntry(input)){$.timeEntry._changeSpinner(inst,spinner,-1);}if($.timeEntry._handlingSpinner){$.timeEntry._lastInput=$.timeEntry._blurredInput;}if($.timeEntry._lastInput&&$.timeEntry._handlingSpinner){$.timeEntry._showField(inst);}$.timeEntry._handlingSpinner=false;},_getSpinnerTarget:function(event){return event.target||event.srcElement;},_getSpinnerRegion:function(inst,event){var spinner=this._getSpinnerTarget(event);var pos=($.browser.opera||$.browser.safari?$.timeEntry._findPos(spinner):$(spinner).offset());var scrolled=($.browser.safari?$.timeEntry._findScroll(spinner):[document.documentElement.scrollLeft||document.body.scrollLeft,document.documentElement.scrollTop||document.body.scrollTop]);var spinnerIncDecOnly=this._get(inst,'spinnerIncDecOnly');var left=(spinnerIncDecOnly?99:event.clientX+scrolled[0]-pos.left-($.browser.msie?2:0));var top=event.clientY+scrolled[1]-pos.top-($.browser.msie?2:0);var spinnerSize=this._get(inst,(inst._expanded?'spinnerBigSize':'spinnerSize'));var right=(spinnerIncDecOnly?99:spinnerSize[0]-1-left);var bottom=spinnerSize[1]-1-top;if(spinnerSize[2]>0&&Math.abs(left-right)<=spinnerSize[2]&&Math.abs(top-bottom)<=spinnerSize[2]){return 0;}var min=Math.min(left,top,right,bottom);return(min==left?1:(min==right?2:(min==top?3:4)));},_changeSpinner:function(inst,spinner,region){$(spinner).css('background-position','-'+((region+1)*this._get(inst,(inst._expanded?'spinnerBigSize':'spinnerSize'))[0])+'px 0px');},_findPos:function(obj){var curLeft=curTop=0;if(obj.offsetParent){curLeft=obj.offsetLeft;curTop=obj.offsetTop;while(obj=obj.offsetParent){var origCurLeft=curLeft;curLeft+=obj.offsetLeft;if(curLeft<0){curLeft=origCurLeft;}curTop+=obj.offsetTop;}}return{left:curLeft,top:curTop};},_findScroll:function(obj){var isFixed=false;$(obj).parents().each(function(){isFixed|=$(this).css('position')=='fixed';});if(isFixed){return[0,0];}var scrollLeft=obj.scrollLeft;var scrollTop=obj.scrollTop;while(obj=obj.parentNode){scrollLeft+=obj.scrollLeft||0;scrollTop+=obj.scrollTop||0;}return[scrollLeft,scrollTop];},_get:function(inst,name){return(inst.options[name]!=null?inst.options[name]:$.timeEntry._defaults[name]);},_parseTime:function(inst){var currentTime=this._extractTime(inst);var showSeconds=this._get(inst,'showSeconds');if(currentTime){inst._selectedHour=currentTime[0];inst._selectedMinute=currentTime[1];inst._selectedSecond=currentTime[2];}else{var now=this._constrainTime(inst);inst._selectedHour=now[0];inst._selectedMinute=now[1];inst._selectedSecond=(showSeconds?now[2]:0);}inst._secondField=(showSeconds?2:-1);inst._ampmField=(this._get(inst,'show24Hours')?-1:(showSeconds?3:2));inst._lastChr='';inst._field=Math.max(0,Math.min(Math.max(1,inst._secondField,inst._ampmField),this._get(inst,'initialField')));if(inst.input.val()!=''){this._showTime(inst);}},_extractTime:function(inst){var value=inst.input.val();var separator=this._get(inst,'separator');var currentTime=value.split(separator);if(separator==''&&value!=''){currentTime[0]=value.substring(0,2);currentTime[1]=value.substring(2,4);currentTime[2]=value.substring(4,6);}var ampmNames=this._get(inst,'ampmNames');var show24Hours=this._get(inst,'show24Hours');if(currentTime.length>=2){var isAM=!show24Hours&&(value.indexOf(ampmNames[0])>-1);var isPM=!show24Hours&&(value.indexOf(ampmNames[1])>-1);var hour=parseInt(currentTime[0],10);hour=(isNaN(hour)?0:hour);hour=((isAM||isPM)&&hour==12?0:hour)+(isPM?12:0);var minute=parseInt(currentTime[1],10);minute=(isNaN(minute)?0:minute);var second=(currentTime.length>=3?parseInt(currentTime[2],10):0);second=(isNaN(second)||!this._get(inst,'showSeconds')?0:second);return this._constrainTime(inst,[hour,minute,second]);}return null;},_constrainTime:function(inst,fields){var specified=(fields!=null);if(!specified){var now=this._determineTime(this._get(inst,'defaultTime'))||new Date();fields=[now.getHours(),now.getMinutes(),now.getSeconds()];}var reset=false;var timeSteps=this._get(inst,'timeSteps');for(var i=0;i<timeSteps.length;i++){if(reset){fields[i]=0;}else if(timeSteps[i]>1){fields[i]=Math.round(fields[i]/timeSteps[i])*timeSteps[i];reset=true;}}return fields;},_showTime:function(inst){var show24Hours=this._get(inst,'show24Hours');var separator=this._get(inst,'separator');var currentTime=(this._formatNumber(show24Hours?inst._selectedHour:((inst._selectedHour+11)%12)+1)+separator+this._formatNumber(inst._selectedMinute)+(this._get(inst,'showSeconds')?separator+this._formatNumber(inst._selectedSecond):'')+(show24Hours?'':this._get(inst,'ampmPrefix')+this._get(inst,'ampmNames')[(inst._selectedHour<12?0:1)]));this._setValue(inst,currentTime);this._showField(inst);},_showField:function(inst){var input=inst.input[0];if(inst.input.is(':hidden')||$.timeEntry._lastInput!=input){return;}var separator=this._get(inst,'separator');var fieldSize=separator.length+2;var start=(inst._field!=inst._ampmField?(inst._field*fieldSize):(inst._ampmField*fieldSize)-separator.length+this._get(inst,'ampmPrefix').length);var end=start+(inst._field!=inst._ampmField?2:this._get(inst,'ampmNames')[0].length);if(input.setSelectionRange){input.setSelectionRange(start,end);}else if(input.createTextRange){var range=input.createTextRange();range.moveStart('character',start);range.moveEnd('character',end-inst.input.val().length);range.select();}if(!input.disabled){input.focus();}},_formatNumber:function(value){return(value<10?'0':'')+value;},_setValue:function(inst,value){if(value!=inst.input.val()){inst.input.val(value).trigger('change');}},_changeField:function(inst,offset,moveOut){var atFirstLast=(inst.input.val()==''||inst._field==(offset==-1?0:Math.max(1,inst._secondField,inst._ampmField)));if(!atFirstLast){inst._field+=offset;}this._showField(inst);inst._lastChr='';$.data(inst.input[0],PROP_NAME,inst);return(atFirstLast&&moveOut);},_adjustField:function(inst,offset){if(inst.input.val()==''){offset=0;}var timeSteps=this._get(inst,'timeSteps');this._setTime(inst,new Date(0,0,0,inst._selectedHour+(inst._field==0?offset*timeSteps[0]:0)+(inst._field==inst._ampmField?offset*12:0),inst._selectedMinute+(inst._field==1?offset*timeSteps[1]:0),inst._selectedSecond+(inst._field==inst._secondField?offset*timeSteps[2]:0)));},_setTime:function(inst,time){time=this._determineTime(time);var fields=this._constrainTime(inst,time?[time.getHours(),time.getMinutes(),time.getSeconds()]:null);time=new Date(0,0,0,fields[0],fields[1],fields[2]);var time=this._normaliseTime(time);var minTime=this._normaliseTime(this._determineTime(this._get(inst,'minTime')));var maxTime=this._normaliseTime(this._determineTime(this._get(inst,'maxTime')));time=(minTime&&time<minTime?minTime:(maxTime&&time>maxTime?maxTime:time));var beforeSetTime=this._get(inst,'beforeSetTime');if(beforeSetTime){time=beforeSetTime.apply(inst.input[0],[this._getTimeTimeEntry(inst.input[0]),time,minTime,maxTime]);}inst._selectedHour=time.getHours();inst._selectedMinute=time.getMinutes();inst._selectedSecond=time.getSeconds();this._showTime(inst);$.data(inst.input[0],PROP_NAME,inst);},_determineTime:function(setting){var offsetNumeric=function(offset){var time=new Date();time.setTime(time.getTime()+offset*1000);return time;};var offsetString=function(offset){var time=new Date();var hour=time.getHours();var minute=time.getMinutes();var second=time.getSeconds();var pattern=/([+-]?[0-9]+)\s*(s|S|m|M|h|H)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||'s'){case's':case'S':second+=parseInt(matches[1],10);break;case'm':case'M':minute+=parseInt(matches[1],10);break;case'h':case'H':hour+=parseInt(matches[1],10);break;}matches=pattern.exec(offset);}time=new Date(0,0,10,hour,minute,second,0);if(/^!/.test(offset)){if(time.getDate()>10){time=new Date(0,0,10,23,59,59);}else if(time.getDate()<10){time=new Date(0,0,10,0,0,0);}}return time;};return(setting?(typeof setting=='string'?offsetString(setting):(typeof setting=='number'?offsetNumeric(setting):setting)):null);},_normaliseTime:function(time){if(!time){return null;}time.setFullYear(1900);time.setMonth(0);time.setDate(0);return time;},_handleKeyPress:function(inst,chr){if(chr==this._get(inst,'separator')){this._changeField(inst,+1,false);}else if(chr>='0'&&chr<='9'){var key=parseInt(chr,10);var value=parseInt(inst._lastChr+chr,10);var show24Hours=this._get(inst,'show24Hours');var hour=(inst._field!=0?inst._selectedHour:(show24Hours?(value<24?value:key):(value>=1&&value<=12?value:(key>0?key:inst._selectedHour))%12+(inst._selectedHour>=12?12:0)));var minute=(inst._field!=1?inst._selectedMinute:(value<60?value:key));var second=(inst._field!=inst._secondField?inst._selectedSecond:(value<60?value:key));var fields=this._constrainTime(inst,[hour,minute,second]);this._setTime(inst,new Date(0,0,0,fields[0],fields[1],fields[2]));inst._lastChr=chr;}else if(!this._get(inst,'show24Hours')){var ampmNames=this._get(inst,'ampmNames');if((chr==ampmNames[0].substring(0,1).toLowerCase()&&inst._selectedHour>=12)||(chr==ampmNames[1].substring(0,1).toLowerCase()&&inst._selectedHour<12)){var saveField=inst._field;inst._field=inst._ampmField;this._adjustField(inst,+1);inst._field=saveField;this._showField(inst);}}}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null){target[name]=null;}}return target;}$.fn.timeEntry=function(options){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=='string'&&(options=='isDisabled'||options=='getTime')){return $.timeEntry['_'+options+'TimeEntry'].apply($.timeEntry,[this[0]].concat(otherArgs));}return this.each(function(){var nodeName=this.nodeName.toLowerCase();if(nodeName=='input'){if(typeof options=='string'){$.timeEntry['_'+options+'TimeEntry'].apply($.timeEntry,[this].concat(otherArgs));}else{var inlineSettings=($.fn.metadata?$(this).metadata():{});$.timeEntry._connectTimeEntry(this,$.extend(inlineSettings,options));}}});};$.timeEntry=new TimeEntry();})(jQuery);
