|
1 |
| -/* |
| 1 | +/* |
2 | 2 | * jQuery timepicker addon
|
3 | 3 | * By: Trent Richardson [http://trentrichardson.com]
|
4 | 4 | * Version 0.6
|
5 |
| -* Last Modified: 9/1/2010 |
| 5 | +* Last Modified: 9/15/2010 |
6 | 6 | *
|
7 | 7 | * Copyright 2010 Trent Richardson
|
8 | 8 | * Dual licensed under the MIT and GPL licenses.
|
|
16 | 16 | */
|
17 | 17 |
|
18 | 18 | (function($) {
|
19 |
| - function Timepicker() { } |
| 19 | + function Timepicker(singleton) { |
| 20 | + if(typeof(singleton) === 'boolean' && singleton == true) { |
| 21 | + this.regional = []; // Available regional settings, indexed by language code |
| 22 | + this.regional[''] = { // Default regional settings |
| 23 | + ampm: false, |
| 24 | + timeFormat: 'hh:mm tt' |
| 25 | + }; |
| 26 | + this.defaults = { // Global defaults for all the datetime picker instances |
| 27 | + holdDatepickerOpen: true, |
| 28 | + showButtonPanel: true, |
| 29 | + timeOnly: false, |
| 30 | + showHour: true, |
| 31 | + showMinute: true, |
| 32 | + showSecond: false, |
| 33 | + showTime: true, |
| 34 | + stepHour: 0.05, |
| 35 | + stepMinute: 0.05, |
| 36 | + stepSecond: 0.05, |
| 37 | + hour: 0, |
| 38 | + minute: 0, |
| 39 | + second: 0, |
| 40 | + alwaysSetTime: true |
| 41 | + }; |
| 42 | + $.extend(this.defaults, this.regional['']); |
| 43 | + } else { |
| 44 | + this.defaults = $.extend({}, $.timepicker.defaults); |
| 45 | + } |
| 46 | + |
| 47 | + } |
20 | 48 |
|
21 | 49 | Timepicker.prototype = {
|
22 | 50 | $input: null,
|
|
33 | 61 | formattedTime: '',
|
34 | 62 | formattedDateTime: '',
|
35 | 63 |
|
36 |
| - defaults: { |
37 |
| - holdDatepickerOpen: true, |
38 |
| - showButtonPanel: true, |
39 |
| - timeOnly: false, |
40 |
| - showHour: true, |
41 |
| - showMinute: true, |
42 |
| - showSecond: false, |
43 |
| - showTime: true, |
44 |
| - stepHour: 0.05, |
45 |
| - stepMinute: 0.05, |
46 |
| - stepSecond: 0.05, |
47 |
| - ampm: false, |
48 |
| - hour: 0, |
49 |
| - minute: 0, |
50 |
| - second: 0, |
51 |
| - timeFormat: 'hh:mm tt', |
52 |
| - alwaysSetTime: true |
53 |
| - }, |
54 |
| - |
55 | 64 | //########################################################################
|
56 | 65 | // add our sliders to the calendar
|
57 | 66 | //########################################################################
|
|
101 | 110 |
|
102 | 111 | tp_inst.timeDefined = (treg) ? true : false;
|
103 | 112 |
|
| 113 | + if (typeof(dp_inst.stay_open) !== 'boolean' || dp_inst.stay_open === false) { |
104 | 114 | // wait for datepicker to create itself.. 60% of the time it works every time..
|
105 |
| - setTimeout(function() { |
106 |
| - tp_inst.injectTimePicker(dp_inst, tp_inst); |
107 |
| - }, 10); |
| 115 | + setTimeout(function() { |
| 116 | + tp_inst.injectTimePicker(dp_inst, tp_inst); |
| 117 | + }, 10); |
| 118 | + } else { |
| 119 | + tp_inst.injectTimePicker(dp_inst, tp_inst); |
| 120 | + } |
108 | 121 |
|
109 | 122 | },
|
110 | 123 |
|
|
174 | 187 | slide: function(event, ui) {
|
175 | 188 | tp_inst.hour_slider.slider( "option", "value", ui.value );
|
176 | 189 | tp_inst.onTimeChange(dp_inst, tp_inst);
|
177 |
| - }, |
| 190 | + } |
178 | 191 | });
|
179 | 192 |
|
180 | 193 | // Updated by Peter Medeiros:
|
|
189 | 202 | // update the global minute slider instance value with the current slider value
|
190 | 203 | tp_inst.minute_slider.slider( "option", "value", ui.value );
|
191 | 204 | tp_inst.onTimeChange(dp_inst, tp_inst);
|
192 |
| - }, |
| 205 | + } |
193 | 206 | });
|
194 | 207 |
|
195 | 208 | tp_inst.second_slider = $tp.find('#ui_tpicker_second').slider({
|
|
201 | 214 | slide: function(event, ui) {
|
202 | 215 | tp_inst.second_slider.slider( "option", "value", ui.value );
|
203 | 216 | tp_inst.onTimeChange(dp_inst, tp_inst);
|
204 |
| - }, |
| 217 | + } |
205 | 218 | });
|
206 | 219 |
|
207 | 220 | $dp.find('.ui-datepicker-calendar').after($tp);
|
|
299 | 312 |
|
300 | 313 | this.formattedDateTime = formattedDateTime;
|
301 | 314 | this.$input.val(formattedDateTime);
|
302 |
| - } |
| 315 | + }, |
| 316 | + |
| 317 | + setDefaults: function(settings) { |
| 318 | + extendRemove(this.defaults, settings || {}); |
| 319 | + return this; |
| 320 | + } |
303 | 321 | };
|
304 | 322 |
|
305 | 323 | //########################################################################
|
|
340 | 358 | tp.defaults = $.extend({}, tp.defaults, opts, {
|
341 | 359 | beforeShow: beforeShowFunc,
|
342 | 360 | onChangeMonthYear: onChangeMonthYearFunc,
|
343 |
| - onClose: onCloseFunc, |
| 361 | + onClose: onCloseFunc |
344 | 362 | });
|
345 | 363 |
|
346 | 364 | $(this).datepicker(tp.defaults);
|
|
363 | 381 | var target = $(id);
|
364 | 382 | var inst = this._getInst(target[0]);
|
365 | 383 | inst.inline = true;
|
| 384 | + inst.stay_open = true; |
366 | 385 | $.datepicker._selectDateOverload(id, dateStr);
|
| 386 | + inst.stay_open = false; |
367 | 387 | inst.inline = false;
|
368 | 388 | this._notifyChange(inst);
|
369 | 389 | this._updateDatepicker(inst);
|
|
372 | 392 | $.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
|
373 | 393 | //#############################################################################################
|
374 | 394 | // second bad hack :/ override datepicker so it triggers an event when changing the input field
|
| 395 | + // and does not redraw the datepicker on every selectDate event |
375 | 396 | //#############################################################################################
|
376 | 397 | // Generate the date picker content.
|
377 | 398 | $.datepicker._updateDatepicker = function(inst) {
|
378 |
| - this._base_updateDatepicker(inst); |
379 |
| - // Reload the time control when changing something in the input text field. |
380 |
| - this._beforeShow(inst.input, inst); |
| 399 | + if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) { |
| 400 | + this._base_updateDatepicker(inst); |
| 401 | + // Reload the time control when changing something in the input text field. |
| 402 | + this._beforeShow(inst.input, inst); |
| 403 | + } |
381 | 404 | };
|
382 | 405 |
|
383 | 406 | $.datepicker._beforeShow = function(input, inst) {
|
384 | 407 | var beforeShow = this._get(inst, 'beforeShow');
|
385 | 408 | if (beforeShow) {
|
| 409 | + inst.stay_open = true; |
386 | 410 | beforeShow.apply((inst.input ? inst.input[0] : null), [inst.input, inst]);
|
| 411 | + inst.stay_open = false; |
387 | 412 | }
|
388 | 413 | };
|
389 | 414 |
|
|
400 | 425 | return event.ctrlKey || (chr < ' ' || !dateChars || dateChars.indexOf(chr) > -1 || event.keyCode == 58 || event.keyCode == 32);
|
401 | 426 | }
|
402 | 427 | };
|
403 |
| - |
| 428 | + |
| 429 | +/* jQuery extend now ignores nulls! */ |
| 430 | +function extendRemove(target, props) { |
| 431 | + $.extend(target, props); |
| 432 | + for (var name in props) |
| 433 | + if (props[name] == null || props[name] == undefined) |
| 434 | + target[name] = props[name]; |
| 435 | + return target; |
| 436 | +}; |
| 437 | + |
| 438 | +$.timepicker = new Timepicker(true); // singleton instance |
404 | 439 | })(jQuery);
|
0 commit comments