/************************ jquery-timepicker v1.2.12 http://jonthornton.github.com/jquery-timepicker/ requires jQuery 1.7+ ************************/ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else { // Browser globals factory(jQuery); } }(function ($) { var _baseDate = _generateBaseDate(); var _ONE_DAY = 86400; var _defaults = { className: null, minTime: null, maxTime: null, durationTime: null, step: 30, showDuration: false, timeFormat: 'g:ia', scrollDefaultNow: false, scrollDefaultTime: false, selectOnBlur: false, disableTouchKeyboard: false, forceRoundTime: false, appendTo: 'body', disableTimeRanges: [], closeOnWindowScroll: false, disableTextInput: false, typeaheadHighlight: true }; var _lang = { decimal: '.', mins: 'mins', hr: 'hr', hrs: 'hrs' }; var methods = { init: function(options) { return this.each(function() { var self = $(this); // convert dropdowns to text input if (self[0].tagName == 'SELECT') { 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; } var input = $('', attrs); self.replaceWith(input); self = input; } var settings = $.extend({}, _defaults); if (options) { settings = $.extend(settings, options); } if (settings.lang) { _lang = $.extend(_lang, settings.lang); } settings = _parseSettings(settings); self.data('timepicker-settings', settings); self.prop('autocomplete', 'off'); self.on('click.timepicker focus.timepicker', methods.show); self.on('change.timepicker', _formatValue); self.on('keydown.timepicker', _keydownhandler); self.on('keyup.timepicker', _keyuphandler); self.addClass('ui-timepicker-input'); _formatValue.call(self.get(0)); }); }, show: function(e) { var self = $(this); var settings = self.data('timepicker-settings'); if (_hideKeyboard(self)) { // block the keyboard on mobile devices self.blur(); } var list = self.data('timepicker-list'); // check if input is readonly if (self.prop('readonly')) { return; } // check if list needs to be rendered if (!list || list.length === 0 || typeof settings.durationTime === 'function') { _render(self); list = self.data('timepicker-list'); } if (list.is(':visible')) { return; } // make sure other pickers are hidden methods.hide(); list.show(); if ((self.offset().top + self.outerHeight(true) + list.outerHeight()) > $(window).height() + $(window).scrollTop()) { // position the dropdown on top list.offset({ 'left': self.offset().left + parseInt(list.css('marginLeft').replace('px', ''), 10), 'top': self.offset().top - list.outerHeight() + parseInt(list.css('marginTop').replace('px', ''), 10) }); } else { // put it under the input list.offset({ 'left':self.offset().left + parseInt(list.css('marginLeft').replace('px', ''), 10), 'top': self.offset().top + self.outerHeight() + parseInt(list.css('marginTop').replace('px', ''), 10) }); } // position scrolling var selected = list.find('.ui-timepicker-selected'); if (!selected.length) { if (_getTimeValue(self)) { selected = _findRow(self, list, _time2int(_getTimeValue(self))); } else if (settings.scrollDefaultNow) { selected = _findRow(self, list, _time2int(new Date())); } else if (settings.scrollDefaultTime !== false) { selected = _findRow(self, list, _time2int(settings.scrollDefaultTime)); } } if (selected && selected.length) { var topOffset = list.scrollTop() + selected.position().top - selected.outerHeight(); list.scrollTop(topOffset); } else { list.scrollTop(0); } // attach close handlers $('body').on('touchstart.ui-timepicker mousedown.ui-timepicker', _closeHandler); if (settings.closeOnWindowScroll) { $(window).on('scroll.ui-timepicker', _closeHandler); } self.trigger('showTimepicker'); }, hide: function(e) { $('.ui-timepicker-wrapper:visible').each(function() { var list = $(this); var self = list.data('timepicker-input'); var settings = self.data('timepicker-settings'); if (settings && settings.selectOnBlur) { _selectValue(self); } list.hide(); self.trigger('hideTimepicker'); }); }, option: function(key, value) { var self = this; var settings = self.data('timepicker-settings'); var list = self.data('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]; } settings = _parseSettings(settings); self.data('timepicker-settings', settings); if (list) { list.remove(); self.data('timepicker-list', false); } return self; }, getSecondsFromMidnight: function() { return _time2int(_getTimeValue(this)); }, getTime: function(relative_date) { var self = this; if (!relative_date) { relative_date = new Date(); } relative_date.setHours(0, 0, 0, 0); return new Date(relative_date.valueOf() + (_time2int(_getTimeValue(self))*1000)); }, setTime: function(value) { var self = this; var prettyTime = _int2time(_time2int(value), self.data('timepicker-settings').timeFormat); _setTimeValue(self, prettyTime); if (self.data('timepicker-list')) { _setSelected(self, self.data('timepicker-list')); } }, remove: function() { var self = this; // check if this element is a timepicker if (!self.hasClass('ui-timepicker-input')) { return; } self.removeAttr('autocomplete', 'off'); self.removeClass('ui-timepicker-input'); self.removeData('timepicker-settings'); self.off('.timepicker'); // timepicker-list won't be present unless the user has interacted with this timepicker if (self.data('timepicker-list')) { self.data('timepicker-list').remove(); } self.removeData('timepicker-list'); } }; // private methods function _parseSettings(settings) { if (settings.minTime) { settings.minTime = _time2int(settings.minTime); } if (settings.maxTime) { settings.maxTime = _time2int(settings.maxTime); } if (settings.durationTime && typeof settings.durationTime !== 'function') { settings.durationTime = _time2int(settings.durationTime); } if (settings.disableTimeRanges.length > 0) { // convert string times to integers for (var i in settings.disableTimeRanges) { settings.disableTimeRanges[i] = [ _time2int(settings.disableTimeRanges[i][0]), _time2int(settings.disableTimeRanges[i][1]) ]; } // sort by starting time settings.disableTimeRanges = settings.disableTimeRanges.sort(function(a, b){ return a[0] - b[0]; }); // merge any overlapping ranges for (var i = settings.disableTimeRanges.length-1; i > 0; i--) { if (settings.disableTimeRanges[i][0] <= settings.disableTimeRanges[i-1][1]) { settings.disableTimeRanges[i-1] = [ Math.min(settings.disableTimeRanges[i][0], settings.disableTimeRanges[i-1][0]), Math.max(settings.disableTimeRanges[i][1], settings.disableTimeRanges[i-1][1]) ]; settings.disableTimeRanges.splice(i, 1); } } } return settings; } function _render(self) { var settings = self.data('timepicker-settings'); var list = self.data('timepicker-list'); if (list && list.length) { list.remove(); self.data('timepicker-list', false); } list = $('