
jQuery.fn.clockpick=function(options,callback){var settings={starthour:8,endhour:18,showminutes:true,minutedivisions:4,military:false,event:'click',layout:'vertical',valuefield:null,useBgiframe:false,hoursopacity:1,minutesopacity:1};if(options){jQuery.extend(settings,options);};var callback=callback||function(){},v=(settings.layout=='vertical');errorcheck();jQuery(this)[settings.event](function(e){var self=this,$self=jQuery(this),$body=jQuery("body");if(!settings.valuefield){$self.unbind("keydown").bind("keydown",keyhandler);}
else{var inputfield=jQuery("[name="+settings.valuefield+"]");inputfield.unbind("keydown").bind("keydown",keyhandler)[0].focus();inputfield.bind("click",function(){inputfield.unbind("keydown");});}
jQuery("#CP_hourcont,#CP_minutecont").remove();$hourcont=jQuery("<div id='CP_hourcont' class='CP' />").appendTo($body);!settings.useBgiframe?$hourcont.css("opacity",settings.hoursopacity):null;binder($hourcont);$hourcol1=jQuery("<div class='CP_hourcol' id='hourcol1' />").appendTo($body);$hourcol2=jQuery("<div class='CP_hourcol' id='hourcol2' />").appendTo($body);if(settings.showminutes){$mc=jQuery("<div id='CP_minutecont' class='CP' />").appendTo($body);!settings.useBgiframe?$mc.css("opacity",settings.minutesopacity):null;binder($mc);}
if(!v){$hourcont.css("width","auto");$mc.css("width","auto");}
else{$hourcol1.addClass('floatleft');$hourcol2.addClass('floatleft');}
renderhours();putcontainer();function renderhours(){var c=1;for(h=settings.starthour;h<=settings.endhour;h++){if(h==12){c=1;}
displayhours=((!settings.military&&h>12)?h-12:h);if(!settings.military&&h==0){displayhours='12';}
if(settings.military&&h<10){displayhours='0'+displayhours;}
$hd=jQuery("<div class='CP_hour' id='hr_"+h+"_"+c+"'>"+displayhours+set_tt(h)+"</div>");if(settings.military){$hd.width(20);}
binder($hd);if(!v){$hd.css("float","left");}
(h<12)?$hourcol1.append($hd):$hourcol2.append($hd);c++;}
$hourcont.append($hourcol1);!v?$hourcont.append("<div style='clear:left' />"):'';$hourcont.append($hourcol2);}
function renderminutes(h){realhours=h;displayhours=(!settings.military&&h>12)?h-12:h;if(!settings.military&&h==0){displayhours='12';}
if(settings.military&&h<10){displayhours='0'+displayhours;}
$mc.empty();var n=60/settings.minutedivisions,tt=set_tt(realhours),counter=1;for(m=0;m<60;m=m+n){$md=jQuery("<div class='CP_minute' id='"+realhours+"_"+m+"'>"
+displayhours+":"+((m<10)?"0":"")+m+tt
+"</div>");if(!v){$md.css("float","left");if(settings.minutedivisions>6&&counter==settings.minutedivisions/2+1){$mc.append("<div style='clear:left' />");}}
$mc.append($md);binder($md);counter++;}}
function set_tt(realhours){if(!settings.military){return(realhours>=12)?' PM':' AM';}
else{return'';}}
function putcontainer(){if(e.type!='focus'){$hourcont.css("left",e.pageX-5+'px').css("top",e.pageY-(Math.floor($hourcont.height()/2))+'px');rectify($hourcont);}
else{$self.after($hourcont);}
$hourcont.slideDown('fast');if(settings.useBgiframe)
bgi($hourcont);}
function rectify($obj){var ph=document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight;var pw=document.documentElement.clientWidth?document.documentElement.clientWidth:document.body.clientWidth;var t=parseInt($obj.css("top"));var l=parseInt($obj.css("left"));var st=document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop;if(t<=st&&!$obj.is("#CP_minutecont")){$obj.css("top",st+10+'px');}
else if(t+$obj.height()-st>ph){$obj.css("top",st+ph-$obj.height()-10+'px');}
if(l<=0){$obj.css("left",'10px');}}
function bgi(ob){if(typeof jQuery.fn.bgIframe=='function')
ob.bgIframe();else
alert('bgIframe plugin not loaded.');}
function binder($obj){if($obj.attr("id")=='CP_hourcont'){$obj.mouseout(function(e){hourcont_out(e)});}
else if($obj.attr("id")=='CP_minutecont'){$obj.mouseout(function(e){minutecont_out(e)});}
else if($obj.attr("class")=='CP_hour'){$obj.mouseover(function(e){hourdiv_over($obj,e)});$obj.mouseout(function(){hourdiv_out($obj)});$obj.click(function(){hourdiv_click($obj)});}
else if($obj.attr("class")=='CP_minute'){$obj.mouseover(function(){minutediv_over($obj)});$obj.mouseout(function(){minutediv_out($obj)});$obj.click(function(){minutediv_click($obj)});}};function hourcont_out(e){try{t=(e.toElement)?e.toElement:e.relatedTarget;if(!(jQuery(t).is("div[class^=CP], iframe"))){cleardivs();}}
catch(e){cleardivs();}}
function minutecont_out(e){try{t=(e.toElement)?e.toElement:e.relatedTarget;if(!(jQuery(t).is("div[class^=CP], iframe"))){cleardivs();}}
catch(e){cleardivs();}}
function hourdiv_over($obj,e){var h=$obj.attr("id").split('_')[1],i=$obj.attr("id").split('_')[2],l,t;$obj.addClass("CP_over");if(settings.showminutes){$mc.hide();renderminutes(h);if(v){t=e.type=='mouseover'?e.pageY-15:$hourcont.offset().top+2+($obj.height()*i);if(h<12)
l=$hourcont.offset().left-$mc.width()-2;else
l=$hourcont.offset().left+$hourcont.width()+2;}
else{l=(e.type=='mouseover')?e.pageX-10:$hourcont.offset().left+($obj.width()-5)*i;if(h<12){t=$hourcont.offset().top-$mc.height()-2;}
else{t=$hourcont.offset().top+$hourcont.height();}}
$mc.css("left",l+'px').css("top",t+'px');rectify($mc);$mc.show();if(settings.useBgiframe)
bgi($mc);}
return false;}
function hourdiv_out($obj){$obj.removeClass("CP_over");return false;}
function hourdiv_click($obj){h=$obj.attr("id").split('_')[1];tt=set_tt(h);str=$obj.text();if(str.indexOf(' ')!=-1){cleanstr=str.substring(0,str.indexOf(' '));}
else{cleanstr=str;}
$obj.text(cleanstr+':00'+tt);setval($obj);cleardivs();}
function minutediv_over($obj){$obj.addClass("CP_over");return false;}
function minutediv_out($obj){$obj.removeClass("CP_over");return false;}
function minutediv_click($obj){setval($obj);cleardivs();}
function setval($obj){if(!settings.valuefield){self.value=$obj.text();}
else{jQuery("input[name="+settings.valuefield+"]").val($obj.text());}
callback.apply($self,[$obj.text()]);$self.unbind("keydown",keyhandler);}
function cleardivs(){if(settings.showminutes){$mc.hide();}
$hourcont.slideUp('fast');$self.unbind("keydown",keyhandler);}
function keyhandler(e){var $obj=$("div.CP_over").size()?$("div.CP_over"):$("div.CP_hour:first"),divtype=$obj.is(".CP_hour")?'hour':'minute',hi=(divtype=='hour')?$obj[0].id.split('_')[2]:0,h=(divtype=='minute')?$obj[0].id.split('_')[0]:$obj[0].id.split('_')[1];if(divtype=='minute')
{var curloc=h<12?'m1':'m2'}
else
{var curloc=h<12?'h1':'h2'}
function divprev($obj){if($obj.prev().size()){eval(divtype+'div_out($obj)');eval(divtype+'div_over($obj.prev(), e)');}
else{return false;}}
function divnext($obj){if($obj.next().size()){eval(divtype+'div_out($obj)');eval(divtype+'div_over($obj.next(), e)');}
else{return false;}}
function hourtohour($obj){var ctx=h>=12?'#hourcol1':'#hourcol2';$newobj=jQuery(".CP_hour[id$=_"+hi+"]",ctx);if($newobj.size()){hourdiv_out($obj);hourdiv_over($newobj,e);}
else{return false;}}
function hourtominute($obj){hourdiv_out($obj);minutediv_over($(".CP_minute:first"));}
function minutetohour($obj){minutediv_out($obj);var ctx=h>=12?'#hourcol2':'#hourcol1';var $newobj=jQuery(".CP_hour[id^=hr_"+h+"]",ctx);hourdiv_over($newobj,e);}
switch(e.keyCode){case 37:if(v){switch(curloc){case'm1':return false;break;case'm2':minutetohour($obj);break;case'h1':hourtominute($obj);break;case'h2':hourtohour($obj);break;}}
else{divprev($obj);}
break;case 38:if(v){divprev($obj);}
else{switch(curloc){case'm1':return false;break;case'm2':minutetohour($obj);break;case'h1':hourtominute($obj);break;case'h2':hourtohour($obj);break;}}
break;case 39:if(v){switch(curloc){case'm1':minutetohour($obj);break;case'm2':return false;break;case'h1':hourtohour($obj);break;case'h2':hourtominute($obj);break;}}
else{divnext($obj);}
break;case 40:if(v){divnext($obj);}
else{switch(curloc){case'm1':minutetohour($obj);break;case'm2':return false;break;case'h1':hourtohour($obj);break;case'h2':hourtominute($obj);break;}}
break;case 13:eval(divtype+'div_click($obj)');break;default:return true;}
return false;}
return false;});function errorcheck(){if(settings.starthour>=settings.endhour){alert('Error - start hour must be less than end hour.');return false;}
else if(60%settings.minutedivisions!=0){alert('Error - param minutedivisions must divide evenly into 60.');return false;}}
return this;}