// jQuery TimePicker plugin - http://github.com/wvega/timepicker
//
// A jQuery plugin to enhance standard form input fields helping users to select
// (or type) times.
//
// Copyright (c) 2010 Willington Vega <wvega@wvega.com>
// Dual licensed under the MIT or GPL Version 2 licenses.

if(typeof jQuery!="undefined"){(function(b,d){function c(g,e,f){return Array(f+1-g.length).join(e)+g}function a(){if(arguments.length==1){return new Date(1988,7,24,arguments[0].getHours(),arguments[0].getMinutes(),0)}else{if(arguments.length==2){return new Date(1988,7,24,arguments[0],arguments[1],0)}else{return new Date(1988,7,24)}}}b.TimePicker=function(){var e=this;e.ui=b("ul.ui-timepicker");if(e.ui.length==0){e.ui=b("<ul></ul>").addClass("ui-timepicker ui-timepicker-hidden").addClass("ui-widget ui-widget-content ui-menu").addClass("ui-corner-all ui-helper-hidden").appendTo("body");if(b.fn.jquery>="1.4.2"){e.ui.delegate("a","mouseenter.timepicker",function(f){e.activate(false,b(this).parent())}).delegate("a","mouseleave.timepicker",function(f){e.deactivate(false)}).delegate("a","click.timepicker",function(f){f.preventDefault();e.select(false,b(this).parent())})}e.ui.bind("click.timepicker, scroll.timepicker",function(f){clearTimeout(e.closing)})}};b.TimePicker.count=0;b.TimePicker.instance=function(){if(!b.TimePicker._instance){b.TimePicker._instance=new b.TimePicker()}return b.TimePicker._instance};b.TimePicker.prototype={keyCode:{ALT:18,BLOQ_MAYUS:20,CTRL:17,DOWN:40,END:35,ENTER:13,HOME:36,LEFT:37,NUMPAD_ENTER:108,PAGE_DOWN:34,PAGE_UP:33,RIGHT:39,SHIFT:16,TAB:9,UP:38},_items:function(g,h){var k=this,f=b("<ul></ul>"),j=null,l,e;if(h){l=a(h)}else{if(g.options.startTime){l=a(g.options.startTime)}else{l=a(g.options.startHour,g.options.startMinutes)}}e=new Date(l.getTime()+24*60*60*1000);while(l<e){if(k._isValidTime(g,l)){j=b("<li>").addClass("ui-menu-item").appendTo(f);b("<a>").addClass("ui-corner-all").text(b.fn.timepicker.formatTime(g.options.timeFormat,l)).appendTo(j);j.data("time-value",l)}l=new Date(l.getTime()+g.options.interval*60*1000)}return f.children()},_isValidTime:function(g,h){var f=null,e=null;h=a(h);if(g.options.minTime!==null){f=a(g.options.minTime)}else{if(g.options.minHour!==null||g.options.minMinutes!==null){f=a(g.options.minHour,g.options.minMinutes)}}if(g.options.maxTime!==null){e=a(g.options.maxTime)}else{if(g.options.maxHour!==null||g.options.maxMinutes!==null){e=a(g.options.maxHour,g.options.maxMinutes)}}if(f!==null&&e!==null){return h>=f&&h<=e}else{if(f!==null){return h>=f}else{if(e!==null){return h<=e}}}return true},_hasScroll:function(){return this.ui.height()<this.ui.attr("scrollHeight")},_move:function(e,j,g){var h=this;if(h.closed()){h.open(e)}if(!h.active){h.activate(e,h.ui.children(g));return}var f=h.active[j+"All"](".ui-menu-item").eq(0);if(f.length){h.activate(e,f)}else{h.activate(e,h.ui.children(g))}},register:function(g,e){var h=this,f={};f.element=b(g);if(f.element.data("TimePicker")){return}f.element.data("TimePicker",f);f.options=b.metadata?b.extend({},e,f.element.metadata()):e;f.widget=h;f.selectedTime=b.fn.timepicker.parseTime(f.element.val());b.extend(f,{next:function(){return h.next(f)},previous:function(){return h.previous(f)},first:function(){return h.first(f)},last:function(){return h.last(f)},selected:function(){return h.selected(f)},open:function(){return h.open(f)},close:function(i){return h.close(f,i)},closed:function(){return h.closed(f)},destroy:function(){return h.destroy(f)},getTime:function(){return h.getTime(f)},setTime:function(i){return h.setTime(f,i)}});f.element.bind("keydown.timepicker",function(i){switch(i.which||i.keyCode){case h.keyCode.ENTER:case h.keyCode.NUMPAD_ENTER:i.preventDefault();if(h.closed()){f.element.trigger("change.timepicker")}else{h.select(f,h.active)}break;case h.keyCode.UP:f.previous();break;case h.keyCode.DOWN:f.next();break;default:if(!h.closed()){f.close(true)}break}}).bind("focus.timepicker",function(i){f.open()}).bind("blur.timepicker",function(i){f.close()}).bind("change.timepicker",function(i){if(f.closed()){f.setTime(b.fn.timepicker.parseTime(f.element.val()))}})},select:function(f,g){var h=this,e=f===false?h.instance:f;clearTimeout(h.closing);h.setTime(e,b.fn.timepicker.parseTime(g.children("a").text()));h.close(e,true)},activate:function(h,j){var k=this,g=h===false?k.instance:h;if(g!==k.instance){return}else{k.deactivate()}if(k._hasScroll()){var l=j.offset().top-k.ui.offset().top,f=k.ui.scrollTop(),e=k.ui.height();if(l<0){k.ui.scrollTop(f+l)}else{if(l>=e){k.ui.scrollTop(f+l-e+j.height())}}}k.active=j.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-item").end()},deactivate:function(){var e=this;if(!e.active){return}e.active.children("a").removeClass("ui-state-hover").removeAttr("id");e.active=null},next:function(e){if(this.closed()||this.instance===e){this._move(e,"next",".ui-menu-item:first")}},previous:function(e){if(this.closed()||this.instance===e){this._move(e,"prev",".ui-menu-item:last")}},first:function(e){if(this.instance===e){return this.active&&!this.active.prevAll(".ui-menu-item").length}return false},last:function(e){if(this.instance===e){return this.active&&!this.active.nextAll(".ui-menu-item").length}return false},selected:function(e){if(this.instance===e){return this.active?this.active:null}return null},open:function(f){var g=this,e;if(!f.items||(f.options.dynamic&&f.selectedTime)){f.items=g._items(f)}if(g.instance!==f||(f.options.dynamic&&f.selectedTime)){if(b.fn.jquery<"1.4.2"){g.ui.children().remove();g.ui.append(f.items);g.ui.find("a").bind("mouseover.timepicker",function(h){g.activate(f,b(this).parent())}).bind("mouseout.timepicker",function(h){g.deactivate(f)}).bind("click.timepicker",function(h){h.preventDefault();g.select(f,b(this).parent())})}else{g.ui.children().detach();g.ui.append(f.items)}}g.ui.removeClass("ui-helper-hidden ui-timepicker-hidden ui-timepicker-standard ui-timepicker-corners").show();switch(f.options.theme){case"standard":g.ui.addClass("ui-timepicker-standard");break;case"standard-rounded-corners":g.ui.addClass("ui-timepicker-standard ui-timepicker-corners");break;default:break}g.ui.css(b.extend(f.element.offset(),{width:f.element.innerWidth(),zIndex:f.options.zindex?f.options.zindex:f.element.offsetParent().css("z-index")}));g.ui.css("top",parseInt(g.ui.css("top"),10)+f.element.outerHeight());g.instance=f;if(f.selectedTime){f.items.each(function(){var h=b(this),i;if(b.fn.jquery<"1.4.2"){i=b.fn.timepicker.parseTime(h.find("a").text())}else{i=h.data("time-value")}if(i.getTime()==f.selectedTime.getTime()){g.activate(f,h);return false}return true})}else{g.deactivate(f)}return f.element},close:function(e,g){var f=this;if(f.closed()||g){clearTimeout(f.closing);if(f.instance===e){f.ui.scrollTop(0).addClass("ui-helper-hidden ui-timepicker-hidden").hide();f.ui.children().removeClass("ui-state-hover")}}else{f.closing=setTimeout(function(){f.close(e,true)},150)}return e.element},closed:function(){return this.ui.is(":hidden")},destroy:function(e){var f=this;f.close(e,true);return e.element.unbind(".timepicker").data("TimePicker",null)},getTime:function(e){return e.selectedTime?e.selectedTime:null},setTime:function(e,g){var f=this;if(g&&g.getMinutes){e.selectedTime=g;e.element.val(b.fn.timepicker.formatTime(e.options.timeFormat,g));e.element.trigger("time-change",[g]);if(b.isFunction(e.options.change)){e.options.change.apply(e.element,[g])}}else{e.selectedTime=null}}};b.TimePicker.defaults={timeFormat:"hh:mm p",minHour:null,minMinutes:null,minTime:null,maxHour:null,maxMinutes:null,maxTime:null,startHour:null,startMinutes:null,startTime:null,interval:30,dynamic:true,theme:"standard",zindex:null,change:function(e){}};b.fn.timepicker=function(e){if(b.fn.jquery<"1.3"){return this}if(this.length==1&&this.data("TimePicker")){return this.data("TimePicker")}var f=b.extend({},b.TimePicker.defaults,e);return this.each(function(){b.TimePicker.instance().register(this,f)})};b.fn.timepicker.formatTime=function(n,e){var l=e.getHours(),i=l%12,h=e.getMinutes(),m=e.getSeconds(),f={hh:c((i===0?12:i).toString(),"0",2),HH:c(l.toString(),"0",2),mm:c(h.toString(),"0",2),ss:c(m.toString(),"0",2),h:(i===0?12:i),H:l,m:h,s:m,p:l>11?"PM":"AM"},j=n,g="";for(g in f){if(f.hasOwnProperty(g)){j=j.replace(new RegExp(g,"g"),f[g])}}return j};b.fn.timepicker.parseTime=(function(f){var e=[[/^(\d+)$/,"$1"],[/^:(\d)$/,"$10"],[/^:(\d+)/,"$1"],[/^(\d):([7-9])$/,"0$10$2"],[/^(\d):(\d\d)$/,"$1$2"],[/^(\d):(\d{1,})$/,"0$1$20"],[/^(\d\d):([7-9])$/,"$10$2"],[/^(\d\d):(\d)$/,"$1$20"],[/^(\d\d):(\d*)$/,"$1$2"],[/^(\d{3,}):(\d)$/,"$10$2"],[/^(\d{3,}):(\d{2,})/,"$1$2"],[/^(\d):(\d):(\d)$/,"0$10$20$3"],[/^(\d{1,2}):(\d):(\d\d)/,"$10$2$3"]];return function(q){var p=a(new Date()),o=false,j=false,n=false,g=false,l=false,i=0;q=q.toLowerCase();o=/a/.test(q);j=o?false:/p/.test(q);q=q.replace(/[^0-9:]/g,"").replace(/:+/g,":");for(i in e){if(e[i][0].test(q)){q=q.replace(e[i][0],e[i][1]);break}}q=q.replace(/:/g,"");if(q.length==1){n=q}else{if(q.length==2){n=q}else{if(q.length==3||q.length==5){n=q.substr(0,1);g=q.substr(1,2);l=q.substr(3,2)}else{if(q.length==4||q.length>5){n=q.substr(0,2);g=q.substr(2,2);l=q.substr(4,2)}}}}if(q.length>0&&q.length<5){if(q.length<3){g=0}l=0}if(n===false||g===false||l===false){return false}n=parseInt(n,10);g=parseInt(g,10);l=parseInt(l,10);if(o&&n==12){n=0}else{if(j&&n<12){n=n+12}}if(n>24&&(n%10)<=6&&g<=60&&l<=60){return b.fn.timepicker.parseTime(q+"0"+(o?"a":"")+(j?"p":""))}else{if(n<=24&&g<=60&&l<=60){p.setHours(n,g,l);return p}else{return false}}}})()})(jQuery)};

