/* http://keith-wood.name/timeEntry.html
   Time entry for jQuery v1.2.6.
   Written by Keith Wood (kbwood@iprimus.com.au) June 2007.
   Dual licensed under the GPL (http://www.gnu.org/licenses/gpl-3.0.txt) and 
   CC (http://creativecommons.org/licenses/by/3.0/) licenses. 
   "Share or Remix it but please Attribute the authors." */
(function($){function TimeEntry(){this._nextId=0;this._inst=[];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],useMouseWheel:true,minTime:null,maxTime:null,spinnerImage:'/Portals/_default/Skins/MBI/css/timeEntry.png',spinnerSize:[20,20,8],spinnerIncDecOnly:false,spinnerRepeat:[500,250],beforeShow:null};$.extend(this._defaults,this.regional[''])}$.extend(TimeEntry.prototype,{markerClassName:'hasTimeEntry',_register:function(inst){var id=this._nextId++;this._inst[id]=inst;return id},_getInst:function(id){return this._inst[id]||id},setDefaults:function(settings){extendRemove(this._defaults,settings||{})},_doFocus:function(target){var input=(target.nodeName&&target.nodeName.toLowerCase()=='input'?target:this);if($.timeEntry._lastInput==input){return}if($.timeEntry.isDisabled(input)){return}var inst=$.timeEntry._getInst(input._timeId);inst._input=$(input);$.timeEntry._lastInput=input;$.timeEntry._blurredInput=null;var beforeShow=inst._get('beforeShow');extendRemove(inst._settings,(beforeShow?beforeShow(input):{}));inst._parseTime()},_doBlur:function(event){$.timeEntry._blurredInput=$.timeEntry._lastInput;$.timeEntry._lastInput=null},_doDblClick:function(event){var input=event.target;var inst=$.timeEntry._getInst(input._timeId);var fieldSize=inst._get('separator').length+2;inst._field=0;if($.browser.mozilla){var offset=event.rangeOffset;inst._field=(offset>Math.max(1,inst._secondField)*fieldSize+2?inst._ampmField:Math.floor(offset/fieldSize))}else if($.browser.msie){var value=input.value;for(var field=0;field<=Math.max(1,inst._secondField,inst._ampmField);field++){var end=(field!=inst._ampmField?(field*fieldSize)+2:(inst._ampmField*fieldSize)+inst._get('ampmPrefix').length+inst._get('ampmNames')[0].length);input.value=value.substring(0,end);var range=input.createTextRange();if(event.offsetX<range.boundingWidth){inst._field=field;break}}input.value=value}else if($.browser.opera||$.browser.safari){var value=input.value;for(var field=0;field<=Math.max(1,inst._secondField,inst._ampmField);field++){var start=(field!=inst._ampmField?(field*fieldSize):(inst._ampmField*fieldSize)+inst._get('ampmPrefix').length);if(start>=input.selectionStart){inst._field=field;break}}}inst._showField()},_doKeyDown:function(event){if(event.keyCode>=48){return true}var inst=$.timeEntry._getInst(this._timeId);switch(event.keyCode){case 9:return(event.shiftKey?inst._previousField(true):inst._nextField(true));case 35:if(event.ctrlKey){inst._setValue('')}else{inst._field=Math.max(1,inst._secondField,inst._ampmField);inst._adjustField(0)}break;case 36:if(event.ctrlKey){inst._setTime()}else{inst._field=0;inst._adjustField(0)}break;case 37:inst._previousField(false);break;case 38:inst._adjustField(+1);break;case 39:inst._nextField(false);break;case 40:inst._adjustField(-1);break;case 46:inst._setValue('');break}return false},_doKeyPress:function(event){var chr=String.fromCharCode(event.charCode==undefined?event.keyCode:event.charCode);if(chr<' '){return true}var inst=$.timeEntry._getInst(this._timeId);inst._handleKeyPress(chr);return false},_doMouseWheel:function(event,delta){delta=($.browser.opera?-delta/Math.abs(delta):delta);var inst=$.timeEntry._getInst(this._timeId);inst._adjustField(delta);event.preventDefault()},_connectTimeEntry:function(target,inst){var input=$(target);if(this._hasClass(input,this.markerClassName)){return}var spinnerImage=inst._get('spinnerImage');var spinnerText=inst._get('spinnerText');var spinnerSize=inst._get('spinnerSize');var appendText=inst._get('appendText');var spinner=(!spinnerImage?null:$('<span class="timeEntry_control" _timeid="'+inst._id+'" style="display: inline-block; background: url(\''+spinnerImage+'\') 0 0 no-repeat; '+'width: '+spinnerSize[0]+'px; height: '+spinnerSize[1]+'px;'+($.browser.mozilla?' padding-left: '+spinnerSize[0]+'px; padding-top: '+(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).focus(this._doFocus).blur(this._doBlur).dblclick(this._doDblClick).keydown(this._doKeyDown).keypress(this._doKeyPress);if($.browser.mozilla){input.bind('input',function(event){inst._parseTime()})}if($.browser.msie){input.bind('paste',function(event){setTimeout(function(){inst._parseTime()},1)})}if(inst._get('useMouseWheel')&&$.fn.mousewheel){input.mousewheel(this._doMouseWheel)}input[0]._timeId=inst._id;if(spinner){spinner.mousedown(this._handleSpinner).mouseup(this._endSpinner).mouseout(this._endSpinner).mousemove(this._describeSpinner);spinner[0]._timeId=inst._id}},_hasClass:function(element,className){var classes=element.attr('class');return(classes&&classes.indexOf(className)>-1)},enableFor:function(inputs){this._disableFor(inputs,false)},disableFor:function(inputs){this._disableFor(inputs,true)},_disableFor:function(inputs,disable){inputs=(inputs.jquery?inputs:$(inputs));inputs.each(function(){this.disabled=disable;var inst=$.timeEntry._getInst(this._timeId);if(this.nextSibling&&this.nextSibling.nodeName.toLowerCase()=='span'){$.timeEntry._changeSpinner(inst,this.nextSibling,(disable?5:-1))}var $this=this;$.timeEntry._disabledInputs=$.map($.timeEntry._disabledInputs,function(value){return(value==$this?null:value)});if(disable){$.timeEntry._disabledInputs[$.timeEntry._disabledInputs.length]=this}})},isDisabled:function(input){input=(input.jquery?input[0]:(typeof input=='string'?$(input)[0]:input));for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]==input){return true}}return false},reconfigureFor:function(input,settings){input=(input.jquery?input:$(input))[0];var inst=this._getInst(input._timeId);if(inst){var currentTime=inst._extractTime();extendRemove(inst._settings,settings||{});if(currentTime){inst._setTime(new Date(0,0,0,currentTime[0],currentTime[1],currentTime[2]))}}},setTimeFor:function(input,time){input=(input.jquery?input[0]:(typeof input=='string'?$(input)[0]:input));var inst=this._getInst(input._timeId);if(inst){inst._input=$(input);inst._setTime(time)}},getTimeFor:function(input){input=(input.jquery?input[0]:(typeof input=='string'?$(input)[0]:input));var inst=this._getInst(input._timeId);var currentTime=(inst?inst._extractTime():null);return(!currentTime?null:new Date(0,0,0,currentTime[0],currentTime[1],currentTime[2]))},_describeSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var inst=$.timeEntry._getInst(spinner._timeId);spinner.title=inst._get('spinnerTexts')[$.timeEntry._getSpinnerRegion(inst,event)]},_handleSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var input=spinner.previousSibling;if($.timeEntry.isDisabled(input)){return}if(input==$.timeEntry._blurredInput){$.timeEntry._lastInput=input;$.timeEntry._blurredInput=null}var inst=$.timeEntry._getInst(input._timeId);$.timeEntry._doFocus(input);var region=$.timeEntry._getSpinnerRegion(inst,event);$.timeEntry._changeSpinner(inst,spinner,region);$.timeEntry._actionSpinner(inst,region);var spinnerRepeat=inst._get('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){switch(region){case 0:inst._setTime();break;case 1:inst._previousField(false);break;case 2:inst._nextField(false);break;case 3:inst._adjustField(+1);break;case 4:inst._adjustField(-1);break}},_repeatSpinner:function(inst,region){$.timeEntry._lastInput=$.timeEntry._blurredInput;this._actionSpinner(inst,region);this._timer=setTimeout(function(){$.timeEntry._repeatSpinner(inst,region)},inst._get('spinnerRepeat')[1])},_releaseSpinner:function(event){clearTimeout($.timeEntry._timer)},_endSpinner:function(event){var spinner=$.timeEntry._getSpinnerTarget(event);var inst=$.timeEntry._getInst(spinner._timeId);if(!$.timeEntry.isDisabled(spinner.previousSibling)){$.timeEntry._changeSpinner(inst,spinner,-1)}if(!$.browser.opera){$.timeEntry._lastInput=$.timeEntry._blurredInput}if($.timeEntry._lastInput){inst._showField()}},_getSpinnerTarget:function(event){return(event.target?event.target:event.srcElement)},_getSpinnerRegion:function(inst,event){var spinner=this._getSpinnerTarget(event);var pos=this._findPos(spinner);var scrolled=this._findScroll(spinner);var spinnerIncDecOnly=inst._get('spinnerIncDecOnly');var left=(spinnerIncDecOnly?99:event.clientX+scrolled[0]-pos[0]-($.browser.msie?1:0));var top=event.clientY+scrolled[1]-pos[1]-($.browser.msie?1:0);var spinnerSize=inst._get('spinnerSize');var right=(spinnerIncDecOnly?99:spinnerSize[0]-left);var bottom=spinnerSize[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)*inst._get('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[curLeft,curTop]},_findScroll:function(obj){var isFixed=false;$(obj).parents().each(function(){isFixed|=$(this).css('position')=='fixed'});if(isFixed&&!$.browser.opera){return[0,0]}var scrollLeft=($.browser.opera?document.body.scrollLeft:obj.scrollLeft);var scrollTop=($.browser.opera?document.body.scrollTop:obj.scrollTop);if(!$.browser.opera){while(obj=obj.parentNode){scrollLeft+=obj.scrollLeft||0;scrollTop+=obj.scrollTop||0}}return[scrollLeft,scrollTop]}});function TimeEntryInstance(settings){this._id=$.timeEntry._register(this);this._selectedHour=0;this._selectedMinute=0;this._selectedSecond=0;this._input=null;this._settings=extendRemove({},settings||{})}$.extend(TimeEntryInstance.prototype,{_get:function(name){return(this._settings[name]!=null?this._settings[name]:$.timeEntry._defaults[name])},_parseTime:function(){var currentTime=this._extractTime();var showSeconds=this._get('showSeconds');if(currentTime){this._selectedHour=currentTime[0];this._selectedMinute=currentTime[1];this._selectedSecond=currentTime[2]}else{var now=this._constrainTime();this._selectedHour=now[0];this._selectedMinute=now[1];this._selectedSecond=(showSeconds?now[2]:0)}this._secondField=(showSeconds?2:-1);this._ampmField=(this._get('show24Hours')?-1:(showSeconds?3:2));this._lastChr='';this._field=0;if(this._input.val()!=''){this._showTime()}},_extractTime:function(){var value=(this._input?this._input.val():'');var separator=this._get('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('ampmNames');if(currentTime.length>=2){var isAM=(value.indexOf(ampmNames[0])>-1);var isPM=(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('showSeconds')?0:second);return[hour,minute,second]}return null},_constrainTime:function(fields){var specified=(fields!=null);if(!specified){var now=new Date();fields=[now.getHours(),now.getMinutes(),now.getSeconds()]}var reset=false;var timeSteps=this._get('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=!specified}}return fields},_showTime:function(){var show24Hours=this._get('show24Hours');var separator=this._get('separator');var currentTime=(this._formatNumber(show24Hours?this._selectedHour:((this._selectedHour+11)%12)+1)+separator+this._formatNumber(this._selectedMinute)+(this._get('showSeconds')?separator+this._formatNumber(this._selectedSecond):'')+(show24Hours?'':this._get('ampmPrefix')+this._get('ampmNames')[(this._selectedHour<12?0:1)]));this._setValue(currentTime);this._showField()},_showField:function(){if(!this._input){return}var input=this._input[0];var separator=this._get('separator');var fieldSize=separator.length+2;var start=(this._field!=this._ampmField?(this._field*fieldSize):(this._ampmField*fieldSize)-separator.length+this._get('ampmPrefix').length);var end=start+(this._field!=this._ampmField?2:this._get('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-this._input.val().length);range.select()}if(!input.disabled){input.focus()}},_formatNumber:function(value){return(value<10?'0':'')+value},_setValue:function(value){this._input.val(value);this._input.trigger('change')},_previousField:function(moveOut){var atFirst=(this._input.val()==''||this._field==0);if(!atFirst){this._field--}this._showField();this._lastChr='';return(atFirst&&moveOut)},_nextField:function(moveOut){var atLast=(this._input.val()==''||this._field==Math.max(1,this._secondField,this._ampmField));if(!atLast){this._field++}this._showField();this._lastChr='';return(atLast&&moveOut)},_adjustField:function(offset){if(this._input.val()==''){offset=0}var timeSteps=this._get('timeSteps');this._setTime(new Date(0,0,0,this._selectedHour+(this._field==0?offset*timeSteps[0]:0)+(this._field==this._ampmField?offset*12:0),this._selectedMinute+(this._field==1?offset*timeSteps[1]:0),this._selectedSecond+(this._field==this._secondField?offset*timeSteps[2]:0)))},_setTime:function(time){if(!time){var now=this._constrainTime();time=new Date(0,0,0,now[0],now[1],now[2])}var time=this._normaliseTime(time);var minTime=this._normaliseTime(this._get('minTime'));var maxTime=this._normaliseTime(this._get('maxTime'));time=(minTime&&time<minTime?minTime:(maxTime&&time>maxTime?maxTime:time));this._selectedHour=time.getHours();this._selectedMinute=time.getMinutes();this._selectedSecond=time.getSeconds();this._showTime()},_normaliseTime:function(time){if(!time){return null}time.setFullYear(2001);time.setMonth(1-1);time.setDate(26);return time},_handleKeyPress:function(chr){if(chr==this._get('separator')){this._nextField(false)}else if(chr>='0'&&chr<='9'){var value=(this._lastChr+chr)*1;var hour=(this._field==0&&((this._get('show24Hours')&&value<24)||(value>=1&&value<=12))?value:this._selectedHour);var minute=(this._field==1&&value<60?value:this._selectedMinute);var second=(this._field==this._secondField&&value<60?value:this._selectedSecond);var fields=this._constrainTime([hour,minute,second]);this._setTime(new Date(0,0,0,fields[0],fields[1],fields[2]));this._lastChr=chr}else if(!this._get('show24Hours')){var ampmNames=this._get('ampmNames');if((chr==ampmNames[0].substring(0,1).toLowerCase()&&this._selectedHour>=12)||(chr==ampmNames[1].substring(0,1).toLowerCase()&&this._selectedHour<12)){var saveField=this._field;this._field=this._ampmField;this._adjustField(+1);this._field=saveField;this._showField()}}}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null){target[name]=null}}return target}$.fn.timeEntry=function(settings){return this.each(function(){var nodeName=this.nodeName.toLowerCase();if(nodeName=='input'){var inlineSettings=null;for(attrName in $.timeEntry._defaults){var attrValue=this.getAttribute('time:'+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var inst=(inst&&!inlineSettings?inst:new TimeEntryInstance(!inlineSettings?settings:$.extend(inlineSettings,settings)));$.timeEntry._connectTimeEntry(this,inst)}})};$(document).ready(function(){$.timeEntry=new TimeEntry()})})(jQuery);
