/************************ jquery-timepicker http://jonthornton.github.com/jquery-timepicker/ requires jQuery 1.6+ ************************/ (function($) { var _tzOffset = new Date().getTimezoneOffset(); var _defaults = { className: null, minTime: null, step: 30, showDuration: false, timeFormat: 'g:ia', onSelect: function() { } }; var methods = { init: function(options) { return this.each(function() { var self = $(this); // convert dropdowns to text input if (self[0].tagName == 'SELECT') { var input = $(''); var attrs = { 'type': 'text', 'value': self.val() }; var raw_attrs = self[0].attributes; for (var i=0; i < raw_attrs.length; i++) { attrs[raw_attrs[i].nodeName] = raw_attrs[i].nodeValue; } input.attr(attrs); self.replaceWith(input); self = input; } var settings = $.extend({}, _defaults); if (options) { settings = $.extend(settings, options); } if (settings.minTime) { settings.minTime = _time2int(settings.minTime); } self.data("settings", settings); self.attr('autocomplete', 'off'); self.click(methods.show).focus(methods.show).keydown(_keyhandler); self.addClass('ui-timepicker-input'); if (self.val()) { var prettyTime = _int2time(_time2int(self.val()), settings.timeFormat); self.val(prettyTime); } var container = $(''); self.wrap(container); // close the dropdown when container loses focus $("body").attr("tabindex", -1).focusin(function(e) { if ($(e.target).closest('.ui-timepicker-container').length == 0) { methods.hide(); } }); }); }, show: function(e) { var self = $(this); var list = self.siblings('.ui-timepicker-list'); // check if a flag was set to close this picker if (self.hasClass('ui-timepicker-hideme')) { self.removeClass('ui-timepicker-hideme'); list.hide(); return; } if (list.is(':visible')) { return; } // make sure other pickers are hidden methods.hide(); // check if list needs to be rendered if (list.length == 0) { _render(self); list = self.siblings('.ui-timepicker-list'); } if ((self.offset().top + self.outerHeight(true) + list.outerHeight()) > $(window).height() + $(window).scrollTop()) { // position the dropdown on top list.css({"top":self.position().top - list.outerHeight()}); } else { // put it under the input list.css({"top":self.position().top+self.outerHeight(true)}); } list.show(); // position scrolling var selected = list.find('.ui-timepicker-selected'); if (selected.length) { var topOffset = list.scrollTop() + selected.position().top - selected.outerHeight(); list.scrollTop(topOffset); } }, hide: function(e) { $('.ui-timepicker-list:visible').each(function() { var list = $(this); var self = list.siblings('.ui-timepicker-input'); _selectValue(self); list.hide(); }); }, option: function(key, value) { var self = $(this); var settings = self.data("settings"); var list = self.siblings('.ui-timepicker-list'); if (typeof key == 'object') { settings = $.extend(settings, key); } else if (typeof key == 'string' && typeof value != 'undefined') { settings[key] = value; } else if (typeof key == 'string') { return settings[key]; } if (settings.minTime) { settings.minTime = _time2int(settings.minTime); } self.data("settings", settings); list.remove(); }, getSecondsFromMidnight: function() { return _time2int($(this).val()); }, setTime: function(value) { var self = $(this); var prettyTime = _int2time(_time2int(value), self.data('settings').timeFormat); self.val(prettyTime); } }; // private methods function _render(self) { var settings = self.data("settings"); var list = self.siblings('.ui-timepicker-list'); if (list && list.length) { list.remove(); } list = $('