
(function($){$.fn.timePicker=function(options){var settings=$.extend({},$.fn.timePicker.defaults,options);return this.each(function(){$.timePicker(this,settings);});};$.timePicker=function(elm,settings){var elm=$(elm)[0];return elm.timePicker||(elm.timePicker=new jQuery._timePicker(elm,settings));};$._timePicker=function(elm,settings){var tpOver=false;var startTime=normaliseTime(settings.startTime);var endTime=normaliseTime(settings.endTime);$(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();$("li",$tpList).unbind().mouseover(function(){$("li.selected",$tpDiv).removeClass("selected");$(this).addClass("selected");}).mousedown(function(){tpOver=true;}).click(function(){setTimeVal(elm,this,$tpDiv,settings);tpOver=false;});var showPicker=function(){var position=$(this).offset();$tpDiv.appendTo('body').css({'top':position.top,'left':position.left});$tpDiv.show();$tpDiv.mouseover(function(){tpOver=true;}).mouseout(function(){tpOver=false;});$("li",$tpDiv).removeClass("selected");var time=this.value?timeStringToDate(this.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(2001,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;}};$(elm).unbind().focus(showPicker).click(showPicker).blur(function(){if(!tpOver&&$tpDiv[0].parentNode){$tpDiv.hide();}}).keypress(function(e){switch(e.keyCode){case 38:case 63232:var $selected=$("li.selected",$tpList);var prev=$selected.prev().addClass("selected")[0];if(prev){$selected.removeClass("selected");$tpDiv[0].scrollTop=prev.offsetTop;}
return false;break;case 40:case 63233:var $selected=$("li.selected",$tpList);var next=$selected.length?$selected.next().addClass("selected")[0]:$("li:first").addClass("selected")[0];if(next){$selected.removeClass("selected");$tpDiv[0].scrollTop=next.offsetTop;}
return false;break;case 13:if(!$tpDiv.is(":hidden")){var sel=$("li.selected",$tpList)[0];setTimeVal(elm,sel,$tpDiv,settings);return false;}
break;}});this.getTime=function(){return timeStringToDate(elm.value,settings);};this.setTime=function(time){elm.value=formatTime(normaliseTime(time),settings);$(elm).change();};};$.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,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 timeStringToDate(input,settings){if(input){var array=input.split(settings.separator);var hours=parseFloat(array[0]);var minutes=parseFloat(array[1]);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);