
jQuery.fn.clockpick=function(options,callback){
var settings={
starthour:0,
endhour:23,
showminutes:true,
minutedivisions:4,
military:true,
event:'click',
layout:'vertical',
valuefield:null};
if(options){
jQuery.extend(settings,options);};
var callback=callback||function(){};
errorcheck();
jQuery(this)[settings.event](function(e){
var self=this;
jQuery("#CP_hourcont").remove();
jQuery("#CP_minutecont").remove();
$hourcont=jQuery("<div id='CP_hourcont' class='CP' />");
jQuery("body").append($hourcont);
binder($hourcont);
if(settings.layout=='vertical'){
$hourcol1=jQuery("<div class='CP_hourcol' />");
jQuery("body").append($hourcol1);
$hourcol2=jQuery("<div class='CP_hourcol' />");
jQuery("body").append($hourcol2);}
if(settings.showminutes){
$mc=jQuery("<div id='CP_minutecont' class='CP' />");
jQuery("body").append($mc);
binder($mc);}
if(settings.layout=='horizontal'){
$hourcont.css("width","auto");
$mc.css("width","auto");}
renderhours();
putcontainer();
function renderhours(){
for(h=settings.starthour;h<=settings.endhour;h++){
displayhours=((!settings.military&&h>12)?h-12:h)+set_tt(h)+':00';
if(!settings.military&&h==0){
displayhours='12'+set_tt(h);}
$hd=jQuery("<div class='CP_hour' id='hr_"+h+"'>"+displayhours+"</div>");
if(settings.military){$hd.width(30);}
binder($hd);
if(settings.layout=='horizontal'){
$hd.css("float","left");
if(h==12){$hourcont.append("<div style='clear:left' />");}
$hourcont.append($hd);}
else{
if(h<12){$hourcol1.append($hd);}
else{$hourcol2.append($hd);}}}
if(settings.layout=='vertical'){
$hourcont.append($hourcol1).append($hourcol2);}}
function renderminutes(h){
realhours=h;
displayhours=(!settings.military&&h>12)?h-12:h;
if(!settings.military&&h==0){
displayhours='12';}
$mc.empty();
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(settings.layout=='horizontal'){
$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':(realhours==12)?'':' AM';}
else{
return '';}}
function putcontainer(){
$hourcont.css("left",e.pageX-5);
$hourcont.css("top",e.pageY-(Math.floor($hourcont.height()/2)));
rectify($hourcont);
$hourcont.fadeIn(100);}
function rectify($obj){
var ph=document.documentElement.clientHeight;
var pw=document.documentElement.clientWidth;
var t=parseInt($obj.css("top"));
var l=parseInt($obj.css("left"));
var st=document.documentElement.scrollTop;
if(t<=st){
$obj.css("top",st+10);}
else if(t+$obj.height()>ph){
$obj.css("top",ph-$obj.height()-10);}}
function binder($obj){
if($obj.attr("id")=='CP_hourcont'){
$obj.mouseout(function(e){
t=(e.toElement)?e.toElement:e.relatedTarget;
if(!(jQuery(t).is("div[@class^=CP]"))){
cleardivs();}});}
else if($obj.attr("id")=='CP_minutecont'){
$obj.mouseout(function(e){
t=(e.toElement)?e.toElement:e.relatedTarget;
if(!(jQuery(t).is("div[@class^=CP]"))){
cleardivs();}});}
else if($obj.attr("class")=='CP_hour'){
$obj.mouseover(function(e){
h=$obj.attr("id").split('_')[1];
jQuery(this).addClass("CP_over");
if(settings.showminutes){
$mc.hide();
renderminutes(h);
if(settings.layout=='vertical'){
t=e.pageY-10;
if(h<12){
l=parseInt($hourcont.css("left"))-$mc.width();}
else{
l=parseInt($hourcont.css("left"))+$hourcont.width();}}
else{
l=e.pageX-10;
if(h<12){
t=parseInt($hourcont.css("top"))-$mc.height();}
else{
t=parseInt($hourcont.css("top"))+$hourcont.height();}}
$mc.css("left",l).css("top",t);
rectify($mc);
$mc.show();}
return false;});
$obj.mouseout(function(){
jQuery(this).removeClass("CP_over");
return false;});
$obj.click(function(){
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+tt);
setval($obj);
cleardivs();});}
else if($obj.attr("class")=='CP_minute'){
$obj.mouseover(function(){
jQuery(this).addClass("CP_over");});
$obj.mouseout(function(e){
jQuery(this).removeClass("CP_over");});
$obj.click(function(){
setval($obj);
cleardivs();});}};
function setval($obj){
if(!settings.valuefield){
self.value=$obj.text();}
else{
jQuery("input[@name="+settings.valuefield+"]").val($obj.text());}
callback.apply(jQuery(self));
jQuery(self).focus();
try{
self.value=self.value;}
catch(e){}}
function cleardivs(){
if(settings.showminutes){
$mc.remove();}
$hourcont.remove();}
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);}

