/** * GRAPPELLI TIMEPICKER * works pretty similar to ui.datepicker: * adds a button to the element * creates a node (div) at the bottom called ui-timepicker * element.onClick fills the ui-timepicker node with the time_list (all times you can select) */ (function($) { $.widget("ui.grp_timepicker", { // default options options: { // template for the container of the timepicker template: '
', // selector to get the ui-timepicker once it's added to the dom timepicker_selector: "#ui-timepicker", // needed offset of the container from the element offset: { top: 0 }, // if time_list wasn't sent when calling the timepicker we use this default_time_list: [ 'now', '00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00' ], // leave this empty!!! // NOTE: you can't set a default for time_list because if you call: // $("node").timepicker({time_list: ["01:00", "02:00"]}) // ui.widget will extend/merge the options.time_list with the one you sent. time_list: [] }, // init timepicker for a specific element _create: function() { // for the events var self = this; // to close timpicker if you click somewhere in the document $(document).on("mousedown", function(evt) { if (self.timepicker.is(":visible")) { var $target = $(evt.target); if ($target[0].id != self.timepicker[0].id && $target.parents(self.options.timepicker_selector).length === 0 && !$target.hasClass('hasTimepicker') && !$target.hasClass('ui-timepicker-trigger')) { self.timepicker.hide(); } } }); // close on esc $(document).on("keyup", function(e) { if (e.keyCode == 27) { self.timepicker.hide(); } }); // get/create timepicker's container if ($(this.options.timepicker_selector).length === 0) { $(this.options.template).appendTo('body'); } this.timepicker = $(this.options.timepicker_selector); this.timepicker.hide(); // modify the element and create the button this.element.addClass("hasTimepicker"); this.button = $(''); this.element.after(this.button); // disable button if element is disabled if (this.element.prop("disabled")) { this.button.prop("disabled", true); } else { // register event this.button.on("click", function() { self._toggleTimepicker(); }); } }, // called when button is clicked _toggleTimepicker: function() { if (this.timepicker.is(":visible")) { this.timepicker.hide(); } else { this.element.trigger("focus"); this._generateTimepickerContents(); this._showTimepicker(); } }, // fills timepicker with time_list of element and shows it. // called by _toggleTimepicker _generateTimepickerContents: function() { var self = this, template_str = "