
(function($){$.fn.timePicker=function(options){var settings=$.extend({},$.fn.timePicker.defaults,options);return this.each(function(){$.timePicker(this,settings);});};$.timePicker=function(elm,settings){var e=$(elm)[0];return e.timePicker||(e.timePicker=new jQuery._timePicker(e,settings));};$._timePicker=function(elm,settings){var tpOver=false;var keyDown=true;var startTime=timeToDate(settings.startTime,settings);var endTime=timeToDate(settings.endTime,settings);$(elm).attr('autocomplete','OFF');var times=[];var time=new Date(startTime);while(time<=endTime){times[times.length]=formatTime(time,settings);time=new Date(time.setMinutes(time.getMinutes()+settings.step));}
var $tpDiv=$('<div class="time-picker'+(settings.show24Hours?'':' time-picker-12hours')+'"></div>');var $tpList=$('<ul></ul>');for(var i=0;i<times.length;i++){$tpList.append("<li>"+times[i]+"</li>");}
$tpDiv.append($tpList);var elmOffset=$(elm).offset();$tpDiv.appendTo('body').css({'top':elmOffset.top,'left':elmOffset.left}).hide();$tpDiv.mouseover(function(){tpOver=true;}).mouseout(function(){tpOver=false;});$("li",$tpList).mouseover(function(){if(!keyDown){$("li.selected",$tpDiv).removeClass("selected");$(this).addClass("selected");}}).mousedown(function(){tpOver=true;}).click(function(){setTimeVal(elm,this,$tpDiv,settings);tpOver=false;});var showPicker=function(){if($tpDiv.is(":visible")){return false;}
$("li",$tpDiv).removeClass("selected");$tpDiv.show();var time=elm.value?timeStringToDate(elm.value,settings):startTime;var startMin=startTime.getHours()*60+startTime.getMinutes();var min=(time.getHours()*60+time.getMinutes())-startMin;var steps=Math.round(min/settings.step);var roundTime=normaliseTime(new Date(0,0,0,0,(steps*settings.step+startMin),0));roundTime=(startTime<roundTime&&roundTime<=endTime)?roundTime:startTime;var $matchedTime=$("li:contains("+formatTime(roundTime,settings)+")",$tpDiv);if($matchedTime.length){$matchedTime.addClass("selected");$tpDiv[0].scrollTop=$matchedTime[0].offsetTop;}
return true;};$(elm).focus(showPicker).click(showPicker);$(elm).blur(function(){if(!tpOver){$tpDiv.hide();}});var event=($.browser.opera||$.browser.mozilla)?'keypress':'keydown';$(elm)[event](function(e){var $selected;keyDown=true;var top=$tpDiv[0].scrollTop;switch(e.keyCode){case 38:if(showPicker()){return false;};$selected=$("li.selected",$tpList);var prev=$selected.prev().addClass("selected")[0];if(prev){$selected.removeClass("selected");if(prev.offsetTop<top){$tpDiv[0].scrollTop=top-prev.offsetHeight;}}else{$selected.removeClass("selected");prev=$("li:last",$tpList).addClass("selected")[0];$tpDiv[0].scrollTop=prev.offsetTop-prev.offsetHeight;}
return false;break;case 40:if(showPicker()){return false;};$selected=$("li.selected",$tpList);var next=$selected.next().addClass("selected")[0];if(next){$selected.removeClass("selected");if(next.offsetTop+next.offsetHeight>top+$tpDiv[0].offsetHeight){$tpDiv[0].scrollTop=top+next.offsetHeight;}}else{$selected.removeClass("selected");next=$("li:first",$tpList).addClass("selected")[0];$tpDiv[0].scrollTop=0;}
return false;break;case 13:if($tpDiv.is(":visible")){var sel=$("li.selected",$tpList)[0];setTimeVal(elm,sel,$tpDiv,settings);}
return false;break;case 27:$tpDiv.hide();return false;break;}
return true;});$(elm).keyup(function(e){keyDown=false;});this.getTime=function(){return timeStringToDate(elm.value,settings);};this.setTime=function(time){elm.value=formatTime(normaliseTime(time),settings);$(elm).change();};};$.fn.timePicker.defaults={step:15,startTime:new Date(0,0,0,8,0,0),endTime:new Date(0,0,0,22,0,0),separator:':',show24Hours:true};function setTimeVal(elm,sel,$tpDiv,settings){elm.value=$(sel).text();$(elm).change();if(!$.browser.msie){elm.focus();}
$tpDiv.hide();}
function formatTime(time,settings){var h=time.getHours();var hours=settings.show24Hours?h:(((h+11)%12)+1);var minutes=time.getMinutes();return formatNumber(hours)+settings.separator+formatNumber(minutes)+(settings.show24Hours?'':((h<12)?' AM':' PM'));}
function formatNumber(value){return(value<10?'0':'')+value;}
function timeToDate(input,settings){return(typeof input=='object')?normaliseTime(input):timeStringToDate(input,settings);}
function timeStringToDate(input,settings){if(input){var array=input.split(settings.separator);var hours=parseFloat(array[0]);var minutes=parseFloat(array[1]);if(!settings.show24Hours){if(hours===12&&input.substr('AM')!==-1){hours=0;}else if(hours!==12&&input.indexOf('PM')!==-1){hours+=12;}}
var time=new Date(0,0,0,hours,minutes,0);return normaliseTime(time);}
return null;}
function normaliseTime(time){time.setFullYear(2001);time.setMonth(0);time.setDate(0);return time;}})(jQuery);;
