timepicker 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,204 +1,198 @@
1
1
  /*!
2
- * jquery-timepicker v1.14.0 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.
2
+ * jquery-timepicker v1.15.0 - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.
3
3
  * Copyright (c) 2021 Jon Thornton - https://www.jonthornton.com/jquery-timepicker/
4
4
  * License: MIT
5
5
  */
6
6
  (function () {
7
7
  'use strict';
8
8
 
9
- function _typeof(obj) {
10
- "@babel/helpers - typeof";
11
-
12
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
13
- _typeof = function (obj) {
14
- return typeof obj;
15
- };
16
- } else {
17
- _typeof = function (obj) {
18
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
19
- };
20
- }
21
-
22
- return _typeof(obj);
23
- }
24
-
25
- function _classCallCheck(instance, Constructor) {
26
- if (!(instance instanceof Constructor)) {
27
- throw new TypeError("Cannot call a class as a function");
28
- }
29
- }
30
-
31
- function _defineProperties(target, props) {
32
- for (var i = 0; i < props.length; i++) {
33
- var descriptor = props[i];
34
- descriptor.enumerable = descriptor.enumerable || false;
35
- descriptor.configurable = true;
36
- if ("value" in descriptor) descriptor.writable = true;
37
- Object.defineProperty(target, descriptor.key, descriptor);
38
- }
39
- }
40
-
41
- function _createClass(Constructor, protoProps, staticProps) {
42
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
43
- if (staticProps) _defineProperties(Constructor, staticProps);
44
- return Constructor;
45
- }
46
-
47
- function _defineProperty(obj, key, value) {
48
- if (key in obj) {
49
- Object.defineProperty(obj, key, {
50
- value: value,
51
- enumerable: true,
52
- configurable: true,
53
- writable: true
54
- });
55
- } else {
56
- obj[key] = value;
57
- }
58
-
59
- return obj;
9
+ function _arrayLikeToArray(r, a) {
10
+ (null == a || a > r.length) && (a = r.length);
11
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
12
+ return n;
60
13
  }
61
-
62
- function ownKeys(object, enumerableOnly) {
63
- var keys = Object.keys(object);
64
-
65
- if (Object.getOwnPropertySymbols) {
66
- var symbols = Object.getOwnPropertySymbols(object);
67
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
68
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
69
- });
70
- keys.push.apply(keys, symbols);
71
- }
72
-
73
- return keys;
14
+ function _classCallCheck(a, n) {
15
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
74
16
  }
75
-
76
- function _objectSpread2(target) {
77
- for (var i = 1; i < arguments.length; i++) {
78
- var source = arguments[i] != null ? arguments[i] : {};
79
-
80
- if (i % 2) {
81
- ownKeys(Object(source), true).forEach(function (key) {
82
- _defineProperty(target, key, source[key]);
83
- });
84
- } else if (Object.getOwnPropertyDescriptors) {
85
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
86
- } else {
87
- ownKeys(Object(source)).forEach(function (key) {
88
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
89
- });
90
- }
17
+ function _defineProperties(e, r) {
18
+ for (var t = 0; t < r.length; t++) {
19
+ var o = r[t];
20
+ o.enumerable = o.enumerable || false, o.configurable = true, "value" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);
91
21
  }
92
-
93
- return target;
94
- }
95
-
96
- function _unsupportedIterableToArray(o, minLen) {
97
- if (!o) return;
98
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
99
- var n = Object.prototype.toString.call(o).slice(8, -1);
100
- if (n === "Object" && o.constructor) n = o.constructor.name;
101
- if (n === "Map" || n === "Set") return Array.from(o);
102
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
103
22
  }
104
-
105
- function _arrayLikeToArray(arr, len) {
106
- if (len == null || len > arr.length) len = arr.length;
107
-
108
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
109
-
110
- return arr2;
23
+ function _createClass(e, r, t) {
24
+ return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
25
+ writable: false
26
+ }), e;
111
27
  }
112
-
113
- function _createForOfIteratorHelper(o, allowArrayLike) {
114
- var it;
115
-
116
- if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
117
- if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
118
- if (it) o = it;
119
- var i = 0;
120
-
121
- var F = function () {};
122
-
28
+ function _createForOfIteratorHelper(r, e) {
29
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
30
+ if (!t) {
31
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {
32
+ t && (r = t);
33
+ var n = 0,
34
+ F = function () {};
123
35
  return {
124
36
  s: F,
125
37
  n: function () {
126
- if (i >= o.length) return {
38
+ return n >= r.length ? {
127
39
  done: true
128
- };
129
- return {
40
+ } : {
130
41
  done: false,
131
- value: o[i++]
42
+ value: r[n++]
132
43
  };
133
44
  },
134
- e: function (e) {
135
- throw e;
45
+ e: function (r) {
46
+ throw r;
136
47
  },
137
48
  f: F
138
49
  };
139
50
  }
140
-
141
51
  throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
142
52
  }
143
-
144
- var normalCompletion = true,
145
- didErr = false,
146
- err;
53
+ var o,
54
+ a = true,
55
+ u = false;
147
56
  return {
148
57
  s: function () {
149
- it = o[Symbol.iterator]();
58
+ t = t.call(r);
150
59
  },
151
60
  n: function () {
152
- var step = it.next();
153
- normalCompletion = step.done;
154
- return step;
61
+ var r = t.next();
62
+ return a = r.done, r;
155
63
  },
156
- e: function (e) {
157
- didErr = true;
158
- err = e;
64
+ e: function (r) {
65
+ u = true, o = r;
159
66
  },
160
67
  f: function () {
161
68
  try {
162
- if (!normalCompletion && it.return != null) it.return();
69
+ a || null == t.return || t.return();
163
70
  } finally {
164
- if (didErr) throw err;
71
+ if (u) throw o;
165
72
  }
166
73
  }
167
74
  };
168
75
  }
76
+ function _defineProperty(e, r, t) {
77
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
78
+ value: t,
79
+ enumerable: true,
80
+ configurable: true,
81
+ writable: true
82
+ }) : e[r] = t, e;
83
+ }
84
+ function ownKeys(e, r) {
85
+ var t = Object.keys(e);
86
+ if (Object.getOwnPropertySymbols) {
87
+ var o = Object.getOwnPropertySymbols(e);
88
+ r && (o = o.filter(function (r) {
89
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
90
+ })), t.push.apply(t, o);
91
+ }
92
+ return t;
93
+ }
94
+ function _objectSpread2(e) {
95
+ for (var r = 1; r < arguments.length; r++) {
96
+ var t = null != arguments[r] ? arguments[r] : {};
97
+ r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
98
+ _defineProperty(e, r, t[r]);
99
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
100
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
101
+ });
102
+ }
103
+ return e;
104
+ }
105
+ function _toPrimitive(t, e) {
106
+ if ("object" != typeof t || !t) return t;
107
+ var r;
108
+ if ("undefined" != typeof Symbol && void 0 !== (r = t[Symbol.toPrimitive])) {
109
+ var i = r.call(t, e);
110
+ if ("object" != typeof i) return i;
111
+ throw new TypeError("@@toPrimitive must return a primitive value.");
112
+ }
113
+ return (String )(t);
114
+ }
115
+ function _toPropertyKey(t) {
116
+ var i = _toPrimitive(t, "string");
117
+ return "symbol" == typeof i ? i : i + "";
118
+ }
119
+ function _typeof(o) {
120
+ "@babel/helpers - typeof";
121
+
122
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
123
+ return typeof o;
124
+ } : function (o) {
125
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
126
+ }, _typeof(o);
127
+ }
128
+ function _unsupportedIterableToArray(r, a) {
129
+ if (r) {
130
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
131
+ var t = {}.toString.call(r).slice(8, -1);
132
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
133
+ }
134
+ }
169
135
 
170
136
  var ONE_DAY = 86400;
137
+ var EVENT_DEFAULTS = {
138
+ bubbles: true,
139
+ cancelable: false,
140
+ detail: null
141
+ };
171
142
 
172
143
  var roundingFunction = function roundingFunction(seconds, settings) {
144
+ var _settings$minTime;
173
145
  if (seconds === null) {
174
146
  return null;
175
147
  }
176
148
 
149
+ // Steps are counted from minTime, the same way the dropdown is built.
150
+ // Times before minTime belong to the next day when the list wraps past
151
+ // midnight.
152
+ var start = (_settings$minTime = settings.minTime()) !== null && _settings$minTime !== void 0 ? _settings$minTime : 0;
153
+ if (seconds < start) {
154
+ seconds += ONE_DAY;
155
+ }
177
156
  var i = 0;
178
- var nextVal = 0;
179
-
157
+ var nextVal = start;
180
158
  while (nextVal < seconds) {
181
159
  i++;
182
160
  nextVal += settings.step(i) * 60;
183
161
  }
184
-
185
162
  var prevVal = nextVal - settings.step(i - 1) * 60;
186
-
187
163
  if (seconds - prevVal < nextVal - seconds) {
188
164
  return moduloSeconds(prevVal, settings);
189
165
  } else {
190
166
  return moduloSeconds(nextVal, settings);
191
167
  }
192
168
  };
193
-
194
169
  function moduloSeconds(seconds, settings) {
195
170
  if (seconds == ONE_DAY && settings.show2400) {
196
171
  return seconds;
197
172
  }
198
-
199
173
  return seconds % ONE_DAY;
200
174
  }
201
175
 
176
+ // The span of times the dropdown covers. minTime defaults to midnight and
177
+ // maxTime to 24 hours after minTime; end is pushed into the next day when the
178
+ // range wraps past midnight.
179
+ function timeWindow(settings) {
180
+ var _settings$minTime2, _settings$maxTime;
181
+ var start = (_settings$minTime2 = settings.minTime()) !== null && _settings$minTime2 !== void 0 ? _settings$minTime2 : 0;
182
+ var end = (_settings$maxTime = settings.maxTime()) !== null && _settings$maxTime !== void 0 ? _settings$maxTime : start + ONE_DAY - 1;
183
+ if (end < start) {
184
+ end += ONE_DAY;
185
+ }
186
+ if (end === ONE_DAY - 1 && typeof settings.timeFormat === "string" && settings.show2400) {
187
+ // include a 24:00 option when using military time
188
+ end = ONE_DAY;
189
+ }
190
+ return {
191
+ start: start,
192
+ end: end
193
+ };
194
+ }
195
+
202
196
  var DEFAULT_SETTINGS = {
203
197
  appendTo: "body",
204
198
  className: null,
@@ -239,43 +233,31 @@
239
233
  hrs: "hrs"
240
234
  };
241
235
 
242
- var EVENT_DEFAULTS = {
243
- bubbles: true,
244
- cancelable: false,
245
- detail: null
246
- };
247
-
248
236
  var Timepicker = /*#__PURE__*/function () {
249
237
  function Timepicker(targetEl) {
250
238
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
251
-
252
239
  _classCallCheck(this, Timepicker);
253
-
254
240
  this._handleFormatValue = this._handleFormatValue.bind(this);
255
241
  this._handleKeyUp = this._handleKeyUp.bind(this);
256
242
  this.targetEl = targetEl;
257
243
  var attrOptions = Timepicker.extractAttrOptions(targetEl, Object.keys(DEFAULT_SETTINGS));
258
244
  this.settings = this.parseSettings(_objectSpread2(_objectSpread2(_objectSpread2({}, DEFAULT_SETTINGS), options), attrOptions));
259
245
  }
260
-
261
- _createClass(Timepicker, [{
246
+ return _createClass(Timepicker, [{
262
247
  key: "hideMe",
263
248
  value: function hideMe() {
264
249
  if (this.settings.useSelect) {
265
250
  this.targetEl.blur();
266
251
  return;
267
252
  }
268
-
269
253
  if (!this.list || !Timepicker.isVisible(this.list)) {
270
254
  return;
271
255
  }
272
-
273
256
  if (this.settings.selectOnBlur) {
274
257
  this._selectValue();
275
258
  }
276
-
277
259
  this.list.hide();
278
- var hideTimepickerEvent = new CustomEvent('hideTimepicker', EVENT_DEFAULTS);
260
+ var hideTimepickerEvent = new CustomEvent("hideTimepicker", EVENT_DEFAULTS);
279
261
  this.targetEl.dispatchEvent(hideTimepickerEvent);
280
262
  }
281
263
  }, {
@@ -284,21 +266,16 @@
284
266
  if (!value && value !== 0) {
285
267
  return false;
286
268
  }
287
-
288
269
  var out = false;
289
270
  var value = this.settings.roundingFunction(value, this.settings);
290
-
291
271
  if (!this.list) {
292
272
  return false;
293
273
  }
294
-
295
274
  this.list.find("li").each(function (i, obj) {
296
275
  var parsed = parseInt(obj.dataset.time);
297
-
298
276
  if (isNaN(parsed)) {
299
277
  return;
300
278
  }
301
-
302
279
  if (parsed == value) {
303
280
  out = obj;
304
281
  return false;
@@ -318,24 +295,19 @@
318
295
  if (value !== null || this.targetEl.value != "") {
319
296
  this.targetEl.value = value;
320
297
  }
321
-
322
298
  var tp = this;
323
299
  var settings = tp.settings;
324
-
325
300
  if (settings.useSelect && source != "select" && tp.list) {
326
- tp.list.val(tp._roundAndFormatTime(tp.anytime2int(value)));
301
+ tp.list.val(settings.roundingFunction(tp.anytime2int(value), settings));
327
302
  }
328
303
  }
329
-
330
- var selectTimeEvent = new CustomEvent('selectTime', EVENT_DEFAULTS);
331
-
304
+ var selectTimeEvent = new CustomEvent("selectTime", EVENT_DEFAULTS);
332
305
  if (this.selectedValue != value) {
333
306
  this.selectedValue = value;
334
- var changeTimeEvent = new CustomEvent('changeTime', EVENT_DEFAULTS);
335
- var changeEvent = new CustomEvent('change', Object.assign(EVENT_DEFAULTS, {
336
- detail: 'timepicker'
307
+ var changeTimeEvent = new CustomEvent("changeTime", EVENT_DEFAULTS);
308
+ var changeEvent = new CustomEvent("change", Object.assign(EVENT_DEFAULTS, {
309
+ detail: "timepicker"
337
310
  }));
338
-
339
311
  if (source == "select") {
340
312
  this.targetEl.dispatchEvent(selectTimeEvent);
341
313
  this.targetEl.dispatchEvent(changeTimeEvent);
@@ -343,13 +315,11 @@
343
315
  } else if (["error", "initial"].indexOf(source) == -1) {
344
316
  this.targetEl.dispatchEvent(changeTimeEvent);
345
317
  }
346
-
347
318
  return true;
348
319
  } else {
349
320
  if (["error", "initial"].indexOf(source) == -1) {
350
321
  this.targetEl.dispatchEvent(selectTimeEvent);
351
322
  }
352
-
353
323
  return false;
354
324
  }
355
325
  }
@@ -370,45 +340,39 @@
370
340
  tp.settings;
371
341
  var list = tp.list;
372
342
  var cursor = list.find(".ui-timepicker-selected");
373
-
374
343
  if (cursor.hasClass("ui-timepicker-disabled")) {
375
344
  return false;
376
345
  }
377
-
378
346
  if (!cursor.length) {
379
347
  return true;
380
348
  }
349
+ var timeValue = cursor.get(0).dataset.time;
381
350
 
382
- var timeValue = cursor.get(0).dataset.time; // selected value found
383
-
351
+ // selected value found
384
352
  if (timeValue) {
385
353
  var parsedTimeValue = parseInt(timeValue);
386
-
387
354
  if (!isNaN(parsedTimeValue)) {
388
355
  timeValue = parsedTimeValue;
389
356
  }
390
357
  }
391
-
392
358
  if (timeValue !== null) {
393
359
  if (typeof timeValue != "string") {
394
360
  timeValue = tp._int2time(timeValue);
395
361
  }
396
-
397
362
  tp._setTimeValue(timeValue, "select");
398
363
  }
399
-
400
364
  return true;
401
365
  }
402
366
  }, {
403
367
  key: "anytime2int",
404
368
  value: function anytime2int(input) {
405
- if (typeof input === 'number') {
369
+ if (typeof input === "number") {
406
370
  return input;
407
- } else if (typeof input === 'string') {
371
+ } else if (typeof input === "string") {
408
372
  return this.time2int(input);
409
- } else if (_typeof(input) === 'object' && input instanceof Date) {
373
+ } else if (_typeof(input) === "object" && input instanceof Date) {
410
374
  return input.getHours() * 3600 + input.getMinutes() * 60 + input.getSeconds();
411
- } else if (typeof input == 'function') {
375
+ } else if (typeof input == "function") {
412
376
  return input();
413
377
  } else {
414
378
  return null;
@@ -420,56 +384,44 @@
420
384
  if (timeString === "" || timeString === null || timeString === undefined) {
421
385
  return null;
422
386
  }
423
-
424
- if (timeString === 'now') {
387
+ if (timeString === "now") {
425
388
  return this.anytime2int(new Date());
426
389
  }
427
-
428
390
  if (typeof timeString != "string") {
429
391
  return timeString;
430
392
  }
393
+ timeString = timeString.toLowerCase().replace(/[\s\.]/g, "");
431
394
 
432
- timeString = timeString.toLowerCase().replace(/[\s\.]/g, ""); // if the last character is an "a" or "p", add the "m"
433
-
434
- if (timeString.slice(-1) == "a" || timeString.slice(-1) == "p") {
395
+ // if the last character is an "a" or "p", add the "m"
396
+ if (this.settings.lang.am === "am" && (timeString.slice(-1) == "a" || timeString.slice(-1) == "p")) {
435
397
  timeString += "m";
436
398
  }
437
-
438
399
  var pattern = /^(([^0-9]*))?([0-9]?[0-9])(([0-5][0-9]))?(([0-5][0-9]))?(([^0-9]*))$/;
439
400
  var hasDelimetersMatch = timeString.match(/\W/);
440
-
441
401
  if (hasDelimetersMatch) {
442
402
  pattern = /^(([^0-9]*))?([0-9]?[0-9])(\W+([0-5][0-9]?))?(\W+([0-5][0-9]))?(([^0-9]*))$/;
443
403
  }
444
-
445
404
  var time = timeString.match(pattern);
446
-
447
405
  if (!time) {
448
406
  return null;
449
407
  }
450
-
451
408
  var hour = parseInt(time[3] * 1, 10);
452
409
  var ampm = time[2] || time[9];
453
410
  var minutes = this.parseMinuteString(time[5]);
454
411
  var seconds = time[7] * 1 || 0;
455
-
456
412
  if (!ampm && time[3].length == 2 && time[3][0] == "0") {
457
413
  // preceding '0' implies AM
458
414
  ampm = "am";
459
415
  }
460
-
461
416
  if (hour > 24 && !minutes) {
462
417
  // if someone types in something like "83", turn it into "8h 30m"
463
418
  hour = time[3][0] * 1;
464
419
  minutes = this.parseMinuteString(time[3][1]);
465
420
  }
466
-
467
421
  var hours = hour;
468
-
469
422
  if (hour <= 12 && ampm) {
470
423
  ampm = ampm.trim();
471
424
  var isPm = ampm == this.settings.lang.pm || ampm == this.settings.lang.PM;
472
-
473
425
  if (hour == 12) {
474
426
  hours = isPm ? 12 : 0;
475
427
  } else {
@@ -477,26 +429,34 @@
477
429
  }
478
430
  } else {
479
431
  var t = hour * 3600 + minutes * 60 + seconds;
480
-
481
432
  if (t >= ONE_DAY + (this.settings.show2400 ? 1 : 0)) {
482
433
  if (this.settings.wrapHours === false) {
483
434
  return null;
484
435
  }
485
-
486
436
  hours = hour % 24;
487
437
  }
488
438
  }
489
-
490
- var timeInt = hours * 3600 + minutes * 60 + seconds; // if no am/pm provided, intelligently guess based on the scrollDefault
491
-
492
- if (hour < 12 && !ampm && this.settings._twelveHourTime && this.settings.scrollDefault()) {
493
- var delta = timeInt - this.settings.scrollDefault();
494
-
495
- if (delta < 0 && delta >= ONE_DAY / -2) {
496
- timeInt = (timeInt + ONE_DAY / 2) % ONE_DAY;
439
+ var timeInt = hours * 3600 + minutes * 60 + seconds;
440
+
441
+ // if no am/pm provided, intelligently guess based on the scrollDefault
442
+ if (hour < 12 && !ampm && this.settings._twelveHourTime &&
443
+ // scrollDefault can itself be an am/pm-less string, which would send us
444
+ // back into time2int; parse it literally rather than recursing forever
445
+ !this._resolvingScrollDefault) {
446
+ this._resolvingScrollDefault = true;
447
+ var scrollDefault;
448
+ try {
449
+ scrollDefault = this.settings.scrollDefault();
450
+ } finally {
451
+ this._resolvingScrollDefault = false;
452
+ }
453
+ if (scrollDefault) {
454
+ var delta = timeInt - scrollDefault;
455
+ if (delta < 0 && delta >= ONE_DAY / -2) {
456
+ timeInt = (timeInt + ONE_DAY / 2) % ONE_DAY;
457
+ }
497
458
  }
498
459
  }
499
-
500
460
  return timeInt;
501
461
  }
502
462
  }, {
@@ -505,25 +465,21 @@
505
465
  if (!minutesString) {
506
466
  minutesString = 0;
507
467
  }
508
-
509
468
  var multiplier = 1;
510
-
511
469
  if (minutesString.length == 1) {
512
470
  multiplier = 10;
513
471
  }
514
-
515
472
  return parseInt(minutesString) * multiplier || 0;
516
473
  }
517
474
  }, {
518
475
  key: "intStringDateOrFunc2func",
519
476
  value: function intStringDateOrFunc2func(input) {
520
477
  var _this = this;
521
-
522
478
  if (input === null || input === undefined) {
523
479
  return function () {
524
480
  return null;
525
481
  };
526
- } else if (typeof input === 'function') {
482
+ } else if (typeof input === "function") {
527
483
  return function () {
528
484
  return _this.anytime2int(input());
529
485
  };
@@ -536,47 +492,38 @@
536
492
  }, {
537
493
  key: "parseSettings",
538
494
  value: function parseSettings(settings) {
539
- settings.lang = _objectSpread2(_objectSpread2({}, DEFAULT_LANG), settings.lang); // lang is used by other functions the rest of this depends on
540
- // todo: unwind circular dependency on lang
495
+ settings.lang = _objectSpread2(_objectSpread2({}, DEFAULT_LANG), settings.lang);
541
496
 
497
+ // lang is used by other functions the rest of this depends on
498
+ // todo: unwind circular dependency on lang
542
499
  this.settings = settings;
543
-
544
500
  if (settings.listWidth) {
545
501
  settings.listWidth = this.anytime2int(settings.listWidth);
546
502
  }
547
-
548
503
  settings.minTime = this.intStringDateOrFunc2func(settings.minTime);
549
504
  settings.maxTime = this.intStringDateOrFunc2func(settings.maxTime);
550
505
  settings.durationTime = this.intStringDateOrFunc2func(settings.durationTime);
551
-
552
506
  if (settings.scrollDefault) {
553
507
  settings.scrollDefault = this.intStringDateOrFunc2func(settings.scrollDefault);
554
508
  } else {
555
509
  settings.scrollDefault = settings.minTime;
556
510
  }
557
-
558
511
  if (typeof settings.timeFormat === "string" && settings.timeFormat.match(/[gh]/)) {
559
512
  settings._twelveHourTime = true;
560
513
  }
561
-
562
- if (typeof settings.step != 'function') {
514
+ if (typeof settings.step != "function") {
563
515
  var curryStep = settings.step;
564
-
565
516
  settings.step = function () {
566
517
  return curryStep;
567
518
  };
568
519
  }
569
-
570
520
  settings.disableTimeRanges = this._parseDisableTimeRanges(settings.disableTimeRanges);
571
-
572
521
  if (settings.closeOnWindowScroll && !settings.closeOnScroll) {
573
522
  settings.closeOnScroll = settings.closeOnWindowScroll;
574
523
  }
575
-
576
524
  if (settings.closeOnScroll === true) {
577
525
  settings.closeOnScroll = window.document;
578
526
  }
579
-
580
527
  return settings;
581
528
  }
582
529
  }, {
@@ -584,41 +531,39 @@
584
531
  value: function _parseDisableTimeRanges(disableTimeRanges) {
585
532
  if (!disableTimeRanges || disableTimeRanges.length == 0) {
586
533
  return [];
587
- } // convert string times to integers
588
-
534
+ }
589
535
 
536
+ // convert string times to integers
590
537
  for (var i in disableTimeRanges) {
591
538
  disableTimeRanges[i] = [this.anytime2int(disableTimeRanges[i][0]), this.anytime2int(disableTimeRanges[i][1])];
592
- } // sort by starting time
593
-
539
+ }
594
540
 
541
+ // sort by starting time
595
542
  disableTimeRanges = disableTimeRanges.sort(function (a, b) {
596
543
  return a[0] - b[0];
597
- }); // merge any overlapping ranges
544
+ });
598
545
 
546
+ // merge any overlapping ranges
599
547
  for (var i = disableTimeRanges.length - 1; i > 0; i--) {
600
548
  if (disableTimeRanges[i][0] <= disableTimeRanges[i - 1][1]) {
601
549
  disableTimeRanges[i - 1] = [Math.min(disableTimeRanges[i][0], disableTimeRanges[i - 1][0]), Math.max(disableTimeRanges[i][1], disableTimeRanges[i - 1][1])];
602
550
  disableTimeRanges.splice(i, 1);
603
551
  }
604
552
  }
605
-
606
553
  return disableTimeRanges;
607
554
  }
555
+
608
556
  /*
609
557
  * Filter freeform input
610
558
  */
611
-
612
559
  }, {
613
560
  key: "_disableTextInputHandler",
614
561
  value: function _disableTextInputHandler(e) {
615
562
  switch (e.keyCode) {
616
563
  case 13: // return
617
-
618
564
  case 9:
619
565
  //tab
620
566
  return;
621
-
622
567
  default:
623
568
  e.preventDefault();
624
569
  }
@@ -628,31 +573,30 @@
628
573
  value: function _int2duration(seconds, step) {
629
574
  seconds = Math.abs(seconds);
630
575
  var minutes = Math.round(seconds / 60),
631
- duration = [],
632
- hours,
633
- mins;
634
-
576
+ duration = [],
577
+ hours,
578
+ mins;
635
579
  if (minutes < 60) {
636
580
  // Only show (x mins) under 1 hour
637
581
  duration = [minutes, this.settings.lang.mins];
638
582
  } else {
639
583
  hours = Math.floor(minutes / 60);
640
- mins = minutes % 60; // Show decimal notation (eg: 1.5 hrs) for 30 minute steps
584
+ mins = minutes % 60;
641
585
 
586
+ // Show decimal notation (eg: 1.5 hrs) for 30 minute steps
642
587
  if (step == 30 && mins == 30) {
643
588
  hours += this.settings.lang.decimal + 5;
644
589
  }
645
-
646
590
  duration.push(hours);
647
- duration.push(hours == 1 ? this.settings.lang.hr : this.settings.lang.hrs); // Show remainder minutes notation (eg: 1 hr 15 mins) for non-30 minute steps
648
- // and only if there are remainder minutes to show
591
+ duration.push(hours == 1 ? this.settings.lang.hr : this.settings.lang.hrs);
649
592
 
593
+ // Show remainder minutes notation (eg: 1 hr 15 mins) for non-30 minute steps
594
+ // and only if there are remainder minutes to show
650
595
  if (step != 30 && mins) {
651
596
  duration.push(mins);
652
597
  duration.push(this.settings.lang.mins);
653
598
  }
654
599
  }
655
-
656
600
  return duration.join(" ");
657
601
  }
658
602
  }, {
@@ -660,7 +604,6 @@
660
604
  value: function _roundAndFormatTime(seconds) {
661
605
  // console.log('_roundAndFormatTime')
662
606
  seconds = this.settings.roundingFunction(seconds, this.settings);
663
-
664
607
  if (seconds !== null) {
665
608
  return this._int2time(seconds);
666
609
  }
@@ -671,83 +614,65 @@
671
614
  if (typeof timeInt != "number") {
672
615
  return null;
673
616
  }
674
-
675
617
  var seconds = parseInt(timeInt % 60),
676
- minutes = parseInt(timeInt / 60 % 60),
677
- hours = parseInt(timeInt / (60 * 60) % 24);
618
+ minutes = parseInt(timeInt / 60 % 60),
619
+ hours = parseInt(timeInt / (60 * 60) % 24);
678
620
  var time = new Date(1970, 0, 2, hours, minutes, seconds, 0);
679
-
680
621
  if (isNaN(time.getTime())) {
681
622
  return null;
682
623
  }
683
-
684
624
  if (typeof this.settings.timeFormat === "function") {
685
625
  return this.settings.timeFormat(time);
686
626
  }
687
-
688
627
  var output = "";
689
628
  var hour, code;
690
-
691
629
  for (var i = 0; i < this.settings.timeFormat.length; i++) {
692
630
  code = this.settings.timeFormat.charAt(i);
693
-
694
631
  switch (code) {
695
632
  case "a":
696
633
  output += time.getHours() > 11 ? this.settings.lang.pm : this.settings.lang.am;
697
634
  break;
698
-
699
635
  case "A":
700
636
  output += time.getHours() > 11 ? this.settings.lang.PM : this.settings.lang.AM;
701
637
  break;
702
-
703
638
  case "g":
704
639
  hour = time.getHours() % 12;
705
640
  output += hour === 0 ? "12" : hour;
706
641
  break;
707
-
708
642
  case "G":
709
643
  hour = time.getHours();
710
644
  if (timeInt === ONE_DAY) hour = this.settings.show2400 ? 24 : 0;
711
645
  output += hour;
712
646
  break;
713
-
714
647
  case "h":
715
648
  hour = time.getHours() % 12;
716
-
717
649
  if (hour !== 0 && hour < 10) {
718
650
  hour = "0" + hour;
719
651
  }
720
-
721
652
  output += hour === 0 ? "12" : hour;
722
653
  break;
723
-
724
654
  case "H":
725
655
  hour = time.getHours();
726
656
  if (timeInt === ONE_DAY) hour = this.settings.show2400 ? 24 : 0;
727
657
  output += hour > 9 ? hour : "0" + hour;
728
658
  break;
729
-
730
659
  case "i":
731
660
  var minutes = time.getMinutes();
732
661
  output += minutes > 9 ? minutes : "0" + minutes;
733
662
  break;
734
-
735
663
  case "s":
736
664
  seconds = time.getSeconds();
737
665
  output += seconds > 9 ? seconds : "0" + seconds;
738
666
  break;
739
-
740
667
  case "\\":
741
668
  // escape character; add the next character and skip ahead
742
669
  i++;
743
670
  output += this.settings.timeFormat.charAt(i);
744
671
  break;
745
-
746
672
  default:
747
673
  output += code;
748
674
  }
749
675
  }
750
-
751
676
  return output;
752
677
  }
753
678
  }, {
@@ -756,27 +681,21 @@
756
681
  var list = this.list;
757
682
  list.find("li").removeClass("ui-timepicker-selected");
758
683
  var timeValue = this.anytime2int(this._getTimeValue());
759
-
760
684
  if (timeValue === null) {
761
685
  return;
762
686
  }
763
-
764
687
  var selected = this._findRow(timeValue);
765
-
766
688
  if (selected) {
767
689
  var selectedRect = selected.getBoundingClientRect();
768
690
  var listRect = list.get(0).getBoundingClientRect();
769
691
  var topDelta = selectedRect.top - listRect.top;
770
-
771
692
  if (topDelta + selectedRect.height > listRect.height || topDelta < 0) {
772
693
  var newScroll = list.scrollTop() + (selectedRect.top - listRect.top) - selectedRect.height;
773
694
  list.scrollTop(newScroll);
774
695
  }
775
-
776
696
  var parsed = parseInt(selected.dataset.time);
777
-
778
697
  if (this.settings.forceRoundTime || parsed === timeValue) {
779
- selected.classList.add('ui-timepicker-selected');
698
+ selected.classList.add("ui-timepicker-selected");
780
699
  }
781
700
  }
782
701
  }
@@ -791,7 +710,6 @@
791
710
  if (e && e.detail == "timepicker") {
792
711
  return;
793
712
  }
794
-
795
713
  this._formatValue(e);
796
714
  }
797
715
  }, {
@@ -799,74 +717,71 @@
799
717
  value: function _formatValue(e, origin) {
800
718
  if (this.targetEl.value === "") {
801
719
  this._setTimeValue(null, origin);
802
-
803
720
  return;
804
- } // IE fires change event before blur
805
-
721
+ }
806
722
 
723
+ // IE fires change event before blur
807
724
  if (this._isFocused(this.targetEl) && (!e || e.type != "change")) {
808
725
  return;
809
726
  }
810
-
811
727
  var settings = this.settings;
812
728
  var seconds = this.anytime2int(this.targetEl.value);
813
-
814
729
  if (seconds === null) {
815
- var timeFormatErrorEvent = new CustomEvent('timeFormatError', EVENT_DEFAULTS);
730
+ var timeFormatErrorEvent = new CustomEvent("timeFormatError", EVENT_DEFAULTS);
816
731
  this.targetEl.dispatchEvent(timeFormatErrorEvent);
817
732
  return;
818
733
  }
819
-
820
- var rangeError = false; // check that the time in within bounds
821
-
822
- if (settings.minTime !== null && settings.maxTime !== null && (seconds < settings.minTime() || seconds > settings.maxTime())) {
823
- rangeError = true;
824
- } // check that time isn't within disabled time ranges
825
-
826
-
827
- var _iterator = _createForOfIteratorHelper(settings.disableTimeRanges),
828
- _step;
829
-
830
- try {
831
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
832
- var range = _step.value;
833
-
834
- if (seconds >= range[0] && seconds < range[1]) {
835
- rangeError = true;
836
- break;
837
- }
838
- }
839
- } catch (err) {
840
- _iterator.e(err);
841
- } finally {
842
- _iterator.f();
843
- }
844
-
734
+ var rangeError = this._isTimeRangeError(seconds, settings);
845
735
  if (settings.forceRoundTime) {
846
736
  var roundSeconds = settings.roundingFunction(seconds, settings);
847
-
848
737
  if (roundSeconds != seconds) {
849
738
  seconds = roundSeconds;
850
739
  origin = null;
851
740
  }
852
741
  }
853
-
854
742
  var prettyTime = this._int2time(seconds);
855
-
856
743
  if (rangeError) {
857
744
  this._setTimeValue(prettyTime);
858
-
859
- var timeRangeErrorEvent = new CustomEvent('timeRangeError', EVENT_DEFAULTS);
745
+ var timeRangeErrorEvent = new CustomEvent("timeRangeError", EVENT_DEFAULTS);
860
746
  this.targetEl.dispatchEvent(timeRangeErrorEvent);
861
747
  } else {
862
748
  this._setTimeValue(prettyTime, origin);
863
749
  }
864
750
  }
751
+ }, {
752
+ key: "_isTimeRangeError",
753
+ value: function _isTimeRangeError(seconds, settings) {
754
+ // check that the time is within the span the dropdown covers. Times
755
+ // before the start belong to the next day.
756
+ var _timeWindow = timeWindow(settings),
757
+ start = _timeWindow.start,
758
+ end = _timeWindow.end;
759
+ var offset = seconds < start ? seconds + ONE_DAY : seconds;
760
+ if (offset > end) {
761
+ return true;
762
+ }
763
+
764
+ // check that time isn't within disabled time ranges
765
+ var _iterator = _createForOfIteratorHelper(settings.disableTimeRanges),
766
+ _step;
767
+ try {
768
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
769
+ var range = _step.value;
770
+ if (seconds >= range[0] && seconds < range[1]) {
771
+ return true;
772
+ }
773
+ }
774
+ } catch (err) {
775
+ _iterator.e(err);
776
+ } finally {
777
+ _iterator.f();
778
+ }
779
+ return false;
780
+ }
865
781
  }, {
866
782
  key: "_generateNoneElement",
867
783
  value: function _generateNoneElement(optionValue, useSelect) {
868
784
  var label, className, value;
869
-
870
785
  if (_typeof(optionValue) == "object") {
871
786
  label = optionValue.label;
872
787
  className = optionValue.className;
@@ -877,9 +792,7 @@
877
792
  } else {
878
793
  $.error("Invalid noneOption value");
879
794
  }
880
-
881
795
  var el;
882
-
883
796
  if (useSelect) {
884
797
  el = document.createElement("option");
885
798
  el.value = value;
@@ -887,24 +800,21 @@
887
800
  el = document.createElement("li");
888
801
  el.dataset.time = String(value);
889
802
  }
890
-
891
803
  el.innerText = label;
892
804
  el.classList.add(className);
893
805
  return el;
894
806
  }
807
+
895
808
  /*
896
809
  * Time typeahead
897
810
  */
898
-
899
811
  }, {
900
812
  key: "_handleKeyUp",
901
813
  value: function _handleKeyUp(e) {
902
814
  var _this2 = this;
903
-
904
815
  if (!this.list || !Timepicker.isVisible(this.list) || this.settings.disableTextInput) {
905
816
  return true;
906
817
  }
907
-
908
818
  if (e.type === "paste" || e.type === "cut") {
909
819
  var handler = function handler() {
910
820
  if (_this2.settings.typeaheadHighlight) {
@@ -913,14 +823,11 @@
913
823
  _this2.list.hide();
914
824
  }
915
825
  };
916
-
917
826
  setTimeout(handler, 0);
918
827
  return;
919
828
  }
920
-
921
829
  switch (e.keyCode) {
922
830
  case 96: // numpad numerals
923
-
924
831
  case 97:
925
832
  case 98:
926
833
  case 99:
@@ -931,7 +838,6 @@
931
838
  case 104:
932
839
  case 105:
933
840
  case 48: // numerals
934
-
935
841
  case 49:
936
842
  case 50:
937
843
  case 51:
@@ -942,15 +848,10 @@
942
848
  case 56:
943
849
  case 57:
944
850
  case 65: // a
945
-
946
851
  case 77: // m
947
-
948
852
  case 80: // p
949
-
950
853
  case 186: // colon
951
-
952
854
  case 8: // backspace
953
-
954
855
  case 46:
955
856
  // delete
956
857
  if (this.settings.typeaheadHighlight) {
@@ -958,7 +859,6 @@
958
859
  } else {
959
860
  this.list.hide();
960
861
  }
961
-
962
862
  break;
963
863
  }
964
864
  }
@@ -966,14 +866,11 @@
966
866
  key: "extractAttrOptions",
967
867
  value: function extractAttrOptions(element, keys) {
968
868
  var output = {};
969
-
970
869
  var _iterator2 = _createForOfIteratorHelper(keys),
971
- _step2;
972
-
870
+ _step2;
973
871
  try {
974
872
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
975
873
  var key = _step2.value;
976
-
977
874
  if (key in element.dataset) {
978
875
  output[key] = element.dataset[key];
979
876
  }
@@ -983,7 +880,6 @@
983
880
  } finally {
984
881
  _iterator2.f();
985
882
  }
986
-
987
883
  return output;
988
884
  }
989
885
  }, {
@@ -995,14 +891,12 @@
995
891
  }, {
996
892
  key: "hideAll",
997
893
  value: function hideAll() {
998
- var _iterator3 = _createForOfIteratorHelper(document.getElementsByClassName('ui-timepicker-input')),
999
- _step3;
1000
-
894
+ var _iterator3 = _createForOfIteratorHelper(document.getElementsByClassName("ui-timepicker-input")),
895
+ _step3;
1001
896
  try {
1002
897
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1003
898
  var el = _step3.value;
1004
899
  var tp = el.timepickerObj;
1005
-
1006
900
  if (tp) {
1007
901
  tp.hideMe();
1008
902
  }
@@ -1014,25 +908,18 @@
1014
908
  }
1015
909
  }
1016
910
  }]);
1017
-
1018
- return Timepicker;
1019
911
  }(); // IE9-11 polyfill for CustomEvent
1020
-
1021
-
1022
912
  (function () {
1023
913
  if (typeof window.CustomEvent === "function") return false;
1024
-
1025
914
  function CustomEvent(event, params) {
1026
915
  if (!params) {
1027
916
  params = {};
1028
917
  }
1029
-
1030
918
  params = Object.assign(EVENT_DEFAULTS, params);
1031
- var evt = document.createEvent('CustomEvent');
919
+ var evt = document.createEvent("CustomEvent");
1032
920
  evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
1033
921
  return evt;
1034
922
  }
1035
-
1036
923
  window.CustomEvent = CustomEvent;
1037
924
  })();
1038
925
 
@@ -1040,90 +927,60 @@
1040
927
  if (!settings.noneOption) {
1041
928
  return [];
1042
929
  }
1043
-
1044
930
  var noneOptions = _getNoneOptionItemsHelper(settings.noneOption);
1045
-
1046
931
  if (Array.isArray(settings.noneOption)) {
1047
932
  return noneOptions;
1048
933
  } else {
1049
934
  return [noneOptions];
1050
935
  }
1051
936
  }
1052
-
1053
937
  function _getNoneOptionItemsHelper(noneOption) {
1054
938
  if (Array.isArray(noneOption)) {
1055
939
  return noneOption.map(_getNoneOptionItemsHelper);
1056
940
  }
1057
-
1058
941
  if (noneOption === true) {
1059
942
  return {
1060
- 'label': 'None',
1061
- 'value': ''
943
+ label: "None",
944
+ value: ""
1062
945
  };
1063
946
  }
1064
-
1065
- if (_typeof(noneOption) === 'object') {
947
+ if (_typeof(noneOption) === "object") {
1066
948
  return noneOption;
1067
949
  }
1068
-
1069
950
  return {
1070
- 'label': noneOption,
1071
- 'value': ''
951
+ label: noneOption,
952
+ value: ""
1072
953
  };
1073
954
  }
1074
-
1075
955
  function _getDropdownTimes(tp) {
1076
- var _settings$minTime, _settings$maxTime;
1077
-
1078
956
  var settings = tp.settings;
1079
- var start = (_settings$minTime = settings.minTime()) !== null && _settings$minTime !== void 0 ? _settings$minTime : 0;
1080
- var end = (_settings$maxTime = settings.maxTime()) !== null && _settings$maxTime !== void 0 ? _settings$maxTime : start + ONE_DAY - 1;
1081
-
1082
- if (end < start) {
1083
- // make sure the end time is greater than start time, otherwise there will be no list to show
1084
- end += ONE_DAY;
1085
- }
1086
-
1087
- if (end === ONE_DAY - 1 && typeof settings.timeFormat === 'string' && settings.show2400) {
1088
- // show a 24:00 option when using military time
1089
- end = ONE_DAY;
1090
- }
1091
-
957
+ var _timeWindow = timeWindow(settings),
958
+ start = _timeWindow.start,
959
+ end = _timeWindow.end;
1092
960
  var output = [];
1093
-
1094
961
  for (var i = start, j = 0; i <= end; j++, i += settings.step(j) * 60) {
1095
962
  var timeInt = i;
1096
-
1097
963
  var timeString = tp._int2time(timeInt);
1098
-
1099
- var className = timeInt % ONE_DAY < ONE_DAY / 2 ? 'ui-timepicker-am' : 'ui-timepicker-pm';
964
+ var className = timeInt % ONE_DAY < ONE_DAY / 2 ? "ui-timepicker-am" : "ui-timepicker-pm";
1100
965
  var item = {
1101
- 'label': timeString,
1102
- 'value': moduloSeconds(timeInt, settings),
1103
- 'className': className
966
+ label: timeString,
967
+ value: moduloSeconds(timeInt, settings),
968
+ className: className
1104
969
  };
1105
-
1106
970
  if ((settings.minTime() !== null || settings.durationTime() !== null) && settings.showDuration) {
1107
971
  var _settings$durationTim;
1108
-
1109
972
  var durStart = (_settings$durationTim = settings.durationTime()) !== null && _settings$durationTim !== void 0 ? _settings$durationTim : settings.minTime();
1110
-
1111
973
  if (durStart > i) {
1112
974
  durStart -= ONE_DAY;
1113
975
  }
1114
-
1115
976
  var durationString = tp._int2duration(i - durStart, settings.step());
1116
-
1117
977
  item.duration = durationString;
1118
978
  }
1119
-
1120
979
  var _iterator = _createForOfIteratorHelper(settings.disableTimeRanges),
1121
- _step;
1122
-
980
+ _step;
1123
981
  try {
1124
982
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
1125
983
  var range = _step.value;
1126
-
1127
984
  if (timeInt % ONE_DAY >= range[0] && timeInt % ONE_DAY < range[1]) {
1128
985
  item.disabled = true;
1129
986
  break;
@@ -1134,68 +991,52 @@
1134
991
  } finally {
1135
992
  _iterator.f();
1136
993
  }
1137
-
1138
994
  output.push(item);
1139
995
  }
1140
-
1141
996
  return output;
1142
997
  }
1143
-
1144
998
  function _renderSelectItem(item) {
1145
- var el = document.createElement('option');
1146
- el.value = item.label;
1147
-
999
+ var _item$value;
1000
+ var el = document.createElement("option");
1001
+ el.value = (_item$value = item.value) !== null && _item$value !== void 0 ? _item$value : item.label;
1148
1002
  if (item.duration) {
1149
- el.appendChild(document.createTextNode(item.label + ' (' + item.duration + ')'));
1003
+ el.appendChild(document.createTextNode(item.label + " (" + item.duration + ")"));
1150
1004
  } else {
1151
1005
  el.appendChild(document.createTextNode(item.label));
1152
1006
  }
1153
-
1154
1007
  if (item.disabled) {
1155
1008
  el.disabled = true;
1156
1009
  }
1157
-
1158
1010
  return el;
1159
1011
  }
1160
-
1161
1012
  function _renderStandardItem(item) {
1162
- var el = document.createElement('li');
1163
- el.dataset['time'] = item.value;
1164
-
1013
+ var el = document.createElement("li");
1014
+ el.dataset["time"] = item.value;
1165
1015
  if (item.className) {
1166
1016
  el.classList.add(item.className);
1167
1017
  }
1168
-
1169
1018
  el.className = item.className;
1170
1019
  el.appendChild(document.createTextNode(item.label));
1171
-
1172
1020
  if (item.duration) {
1173
- var durationEl = document.createElement('span');
1174
- durationEl.appendChild(document.createTextNode('(' + item.duration + ')'));
1175
- durationEl.classList.add('ui-timepicker-duration');
1021
+ var durationEl = document.createElement("span");
1022
+ durationEl.appendChild(document.createTextNode("(" + item.duration + ")"));
1023
+ durationEl.classList.add("ui-timepicker-duration");
1176
1024
  el.appendChild(durationEl);
1177
1025
  }
1178
-
1179
1026
  if (item.disabled) {
1180
- el.classList.add('ui-timepicker-disabled');
1027
+ el.classList.add("ui-timepicker-disabled");
1181
1028
  }
1182
-
1183
1029
  return el;
1184
1030
  }
1185
-
1186
1031
  function _renderStandardList(items) {
1187
- var list = document.createElement('ul');
1188
- list.classList.add('ui-timepicker-list');
1189
-
1032
+ var list = document.createElement("ul");
1033
+ list.classList.add("ui-timepicker-list");
1190
1034
  var _iterator2 = _createForOfIteratorHelper(items),
1191
- _step2;
1192
-
1035
+ _step2;
1193
1036
  try {
1194
1037
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1195
1038
  var item = _step2.value;
1196
-
1197
1039
  var itemEl = _renderStandardItem(item);
1198
-
1199
1040
  list.appendChild(itemEl);
1200
1041
  }
1201
1042
  } catch (err) {
@@ -1203,33 +1044,26 @@
1203
1044
  } finally {
1204
1045
  _iterator2.f();
1205
1046
  }
1206
-
1207
- var wrapper = document.createElement('div');
1208
- wrapper.classList.add('ui-timepicker-wrapper');
1047
+ var wrapper = document.createElement("div");
1048
+ wrapper.classList.add("ui-timepicker-wrapper");
1209
1049
  wrapper.tabIndex = -1;
1210
- wrapper.style.display = 'none';
1211
- wrapper.style.position = 'absolute';
1050
+ wrapper.style.display = "none";
1051
+ wrapper.style.position = "absolute";
1212
1052
  wrapper.appendChild(list);
1213
1053
  return wrapper;
1214
1054
  }
1215
-
1216
1055
  function _renderSelectList(items, targetName) {
1217
- var el = document.createElement('select');
1218
- el.classList.add('ui-timepicker-select');
1219
-
1056
+ var el = document.createElement("select");
1057
+ el.classList.add("ui-timepicker-select");
1220
1058
  if (targetName) {
1221
- el.name = 'ui-timepicker-' + targetName;
1059
+ el.name = "ui-timepicker-" + targetName;
1222
1060
  }
1223
-
1224
1061
  var _iterator3 = _createForOfIteratorHelper(items),
1225
- _step3;
1226
-
1062
+ _step3;
1227
1063
  try {
1228
1064
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1229
1065
  var item = _step3.value;
1230
-
1231
1066
  var itemEl = _renderSelectItem(item);
1232
-
1233
1067
  el.appendChild(itemEl);
1234
1068
  }
1235
1069
  } catch (err) {
@@ -1237,24 +1071,19 @@
1237
1071
  } finally {
1238
1072
  _iterator3.f();
1239
1073
  }
1240
-
1241
1074
  return el;
1242
1075
  }
1243
-
1244
1076
  function renderHtml(tp) {
1245
1077
  var items = [].concat(_getNoneOptionItems(tp.settings), _getDropdownTimes(tp));
1246
1078
  var el;
1247
-
1248
1079
  if (tp.settings.useSelect) {
1249
1080
  el = _renderSelectList(items, tp.targetEl.name);
1250
1081
  } else {
1251
1082
  el = _renderStandardList(items);
1252
1083
  }
1253
-
1254
1084
  if (tp.settings.className) {
1255
- var _iterator4 = _createForOfIteratorHelper(tp.settings.className.split(' ')),
1256
- _step4;
1257
-
1085
+ var _iterator4 = _createForOfIteratorHelper(tp.settings.className.split(" ")),
1086
+ _step4;
1258
1087
  try {
1259
1088
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
1260
1089
  var token = _step4.value;
@@ -1266,12 +1095,10 @@
1266
1095
  _iterator4.f();
1267
1096
  }
1268
1097
  }
1269
-
1270
1098
  if (tp.settings.showDuration && (tp.settings.minTime !== null || tp.settings.durationTime !== null)) {
1271
1099
  el.classList.add("ui-timepicker-with-duration");
1272
1100
  el.classList.add("ui-timepicker-step-" + tp.settings.step());
1273
1101
  }
1274
-
1275
1102
  return el;
1276
1103
  }
1277
1104
 
@@ -1296,29 +1123,23 @@
1296
1123
  settings.lang;
1297
1124
  this.timepickerObj = tp;
1298
1125
  self.addClass("ui-timepicker-input");
1299
-
1300
1126
  if (settings.useSelect) {
1301
1127
  _render(self);
1302
1128
  } else {
1303
1129
  self.prop("autocomplete", "off");
1304
-
1305
1130
  if (settings.showOn) {
1306
1131
  for (var i in settings.showOn) {
1307
1132
  self.on(settings.showOn[i] + ".timepicker", methods.show);
1308
1133
  }
1309
1134
  }
1310
-
1311
1135
  self.on("change.timepicker", tp._handleFormatValue);
1312
1136
  self.on("keydown.timepicker", _keydownhandler);
1313
1137
  self.on("keyup.timepicker", tp._handleKeyUp);
1314
-
1315
1138
  if (settings.disableTextInput) {
1316
1139
  self.on("keydown.timepicker", tp._disableTextInputHandler);
1317
1140
  }
1318
-
1319
1141
  self.on("cut.timepicker", tp._handleKeyUp);
1320
1142
  self.on("paste.timepicker", tp._handleKeyUp);
1321
-
1322
1143
  tp._formatValue(null, "initial");
1323
1144
  }
1324
1145
  });
@@ -1327,53 +1148,44 @@
1327
1148
  var self = $(this);
1328
1149
  var tp = self[0].timepickerObj;
1329
1150
  var settings = tp.settings;
1330
-
1331
1151
  if (e) {
1332
1152
  e.preventDefault();
1333
1153
  }
1334
-
1335
1154
  if (settings.useSelect) {
1336
- tp.list.trigger('focus');
1155
+ tp.list.trigger("focus");
1337
1156
  return;
1338
1157
  }
1339
-
1340
1158
  if (tp._hideKeyboard()) {
1341
1159
  // block the keyboard on mobile devices
1342
- self.trigger('blur');
1160
+ self.trigger("blur");
1343
1161
  }
1162
+ var list = tp.list;
1344
1163
 
1345
- var list = tp.list; // check if input is readonly
1346
-
1164
+ // check if input is readonly
1347
1165
  if (self.prop("readonly")) {
1348
1166
  return;
1349
- } // check if list needs to be rendered
1350
-
1167
+ }
1351
1168
 
1169
+ // check if list needs to be rendered
1352
1170
  _render(self);
1353
-
1354
1171
  list = tp.list;
1355
-
1356
1172
  if (Timepicker.isVisible(list)) {
1357
1173
  return;
1358
1174
  }
1359
-
1360
- if (self.is('input')) {
1175
+ if (self.is("input")) {
1361
1176
  tp.selectedValue = self.val();
1362
1177
  }
1178
+ tp._setSelected();
1363
1179
 
1364
- tp._setSelected(); // make sure other pickers are hidden
1365
-
1366
-
1180
+ // make sure other pickers are hidden
1367
1181
  Timepicker.hideAll();
1368
-
1369
1182
  if (typeof settings.listWidth == "number") {
1370
1183
  list.width(self.outerWidth() * settings.listWidth);
1371
- } // position the dropdown relative to the input
1372
-
1184
+ }
1373
1185
 
1186
+ // position the dropdown relative to the input
1374
1187
  list.show();
1375
1188
  var listOffset = {};
1376
-
1377
1189
  if (settings.orientation.match(/r/)) {
1378
1190
  // right-align the dropdown
1379
1191
  listOffset.left = self.offset().left + self.outerWidth() - list.outerWidth() + parseInt(list.css("marginLeft").replace("px", ""), 10);
@@ -1384,9 +1196,7 @@
1384
1196
  // center-align the dropdown
1385
1197
  listOffset.left = self.offset().left + (self.outerWidth() - list.outerWidth()) / 2 + parseInt(list.css("marginLeft").replace("px", ""), 10);
1386
1198
  }
1387
-
1388
1199
  var verticalOrientation;
1389
-
1390
1200
  if (settings.orientation.match(/t/)) {
1391
1201
  verticalOrientation = "t";
1392
1202
  } else if (settings.orientation.match(/b/)) {
@@ -1396,7 +1206,6 @@
1396
1206
  } else {
1397
1207
  verticalOrientation = "b";
1398
1208
  }
1399
-
1400
1209
  if (verticalOrientation == "t") {
1401
1210
  // position the dropdown on top
1402
1211
  list.addClass("ui-timepicker-positioned-top");
@@ -1406,60 +1215,53 @@
1406
1215
  list.removeClass("ui-timepicker-positioned-top");
1407
1216
  listOffset.top = self.offset().top + self.outerHeight() + parseInt(list.css("marginTop").replace("px", ""), 10);
1408
1217
  }
1218
+ list.offset(listOffset);
1409
1219
 
1410
- list.offset(listOffset); // position scrolling
1411
-
1220
+ // position scrolling
1412
1221
  var selected = list.find(".ui-timepicker-selected");
1413
-
1414
1222
  if (!selected.length) {
1415
1223
  var timeInt = tp.anytime2int(tp._getTimeValue());
1416
-
1417
1224
  if (timeInt !== null) {
1418
1225
  selected = $(tp._findRow(timeInt));
1419
1226
  } else if (settings.scrollDefault()) {
1420
1227
  selected = $(tp._findRow(settings.scrollDefault()));
1421
1228
  }
1422
- } // if not found or disabled, intelligently find first selectable element
1423
-
1229
+ }
1424
1230
 
1231
+ // if not found or disabled, intelligently find first selectable element
1425
1232
  if (!selected.length || selected.hasClass("ui-timepicker-disabled")) {
1426
1233
  selected = list.find("li:not(.ui-timepicker-disabled):first");
1427
1234
  }
1428
-
1429
1235
  if (selected && selected.length) {
1430
1236
  var topOffset = list.scrollTop() + selected.position().top - selected.outerHeight();
1431
1237
  list.scrollTop(topOffset);
1432
1238
  } else {
1433
1239
  list.scrollTop(0);
1434
- } // prevent scroll propagation
1435
-
1240
+ }
1436
1241
 
1242
+ // prevent scroll propagation
1437
1243
  if (settings.stopScrollPropagation) {
1438
1244
  $(document).on("wheel.ui-timepicker", ".ui-timepicker-wrapper", function (e) {
1439
1245
  e.preventDefault();
1440
1246
  var currentScroll = $(this).scrollTop();
1441
1247
  $(this).scrollTop(currentScroll + e.originalEvent.deltaY);
1442
1248
  });
1443
- } // attach close handlers
1444
-
1249
+ }
1445
1250
 
1251
+ // attach close handlers
1446
1252
  $(document).on("mousedown.ui-timepicker", _closeHandler);
1447
- window.addEventListener('resize', _closeHandler);
1448
-
1253
+ window.addEventListener("resize", _closeHandler);
1449
1254
  if (settings.closeOnScroll) {
1450
1255
  $(settings.closeOnScroll).on("scroll.ui-timepicker", _closeHandler);
1451
1256
  }
1452
-
1453
1257
  self.trigger("showTimepicker");
1454
1258
  return this;
1455
1259
  },
1456
1260
  hide: function hide(e) {
1457
1261
  var tp = this[0].timepickerObj;
1458
-
1459
1262
  if (tp) {
1460
1263
  tp.hideMe();
1461
1264
  }
1462
-
1463
1265
  Timepicker.hideAll();
1464
1266
  return this;
1465
1267
  },
@@ -1468,31 +1270,25 @@
1468
1270
  var tp = this[0].timepickerObj;
1469
1271
  return tp.settings[key];
1470
1272
  }
1471
-
1472
1273
  return this.each(function () {
1473
1274
  var self = $(this);
1474
1275
  var tp = self[0].timepickerObj;
1475
1276
  var settings = tp.settings;
1476
1277
  var list = tp.list;
1477
-
1478
1278
  if (_typeof(key) == "object") {
1479
1279
  settings = $.extend(settings, key);
1480
1280
  } else if (typeof key == "string") {
1481
1281
  settings[key] = value;
1482
1282
  }
1483
-
1484
1283
  settings = tp.parseSettings(settings);
1485
1284
  tp.settings = settings;
1486
-
1487
1285
  tp._formatValue({
1488
1286
  type: "change"
1489
1287
  }, "initial");
1490
-
1491
1288
  if (list) {
1492
1289
  list.remove();
1493
1290
  tp.list = null;
1494
1291
  }
1495
-
1496
1292
  if (settings.useSelect) {
1497
1293
  _render(self);
1498
1294
  }
@@ -1504,24 +1300,19 @@
1504
1300
  },
1505
1301
  getTime: function getTime(relative_date) {
1506
1302
  var tp = this[0].timepickerObj;
1507
-
1508
1303
  var time_string = tp._getTimeValue();
1509
-
1510
1304
  if (!time_string) {
1511
1305
  return null;
1512
1306
  }
1513
-
1514
1307
  var offset = tp.anytime2int(time_string);
1515
-
1516
1308
  if (offset === null) {
1517
1309
  return null;
1518
1310
  }
1519
-
1520
1311
  if (!relative_date) {
1521
1312
  relative_date = new Date();
1522
- } // construct a Date from relative date, and offset's time
1523
-
1313
+ }
1524
1314
 
1315
+ // construct a Date from relative date, and offset's time
1525
1316
  var time = new Date(relative_date);
1526
1317
  time.setHours(offset / 3600);
1527
1318
  time.setMinutes(offset % 3600 / 60);
@@ -1536,108 +1327,121 @@
1536
1327
  setTime: function setTime(value) {
1537
1328
  var tp = this[0].timepickerObj;
1538
1329
  var settings = tp.settings;
1539
-
1330
+ var seconds = tp.anytime2int(value);
1331
+ if (tp._isTimeRangeError(seconds, settings)) {
1332
+ var timeRangeErrorEvent = new CustomEvent("timeRangeError", EVENT_DEFAULTS);
1333
+ tp.targetEl.dispatchEvent(timeRangeErrorEvent);
1334
+ }
1540
1335
  if (settings.forceRoundTime) {
1541
- var prettyTime = tp._roundAndFormatTime(tp.anytime2int(value));
1336
+ var prettyTime = tp._roundAndFormatTime(seconds);
1542
1337
  } else {
1543
- var prettyTime = tp._int2time(tp.anytime2int(value));
1338
+ var prettyTime = tp._int2time(seconds);
1544
1339
  }
1545
-
1546
1340
  if (value && prettyTime === null && settings.noneOption) {
1547
1341
  prettyTime = value;
1548
1342
  }
1549
-
1550
1343
  tp._setTimeValue(prettyTime, "initial");
1551
-
1552
1344
  tp._formatValue({
1553
1345
  type: "change"
1554
1346
  }, "initial");
1555
-
1556
1347
  if (tp && tp.list) {
1557
1348
  tp._setSelected();
1558
1349
  }
1559
-
1560
1350
  return this;
1561
1351
  },
1562
1352
  remove: function remove() {
1563
- var self = this; // check if this element is a timepicker
1353
+ var self = this;
1564
1354
 
1355
+ // check if this element is a timepicker
1565
1356
  if (!self.hasClass("ui-timepicker-input")) {
1566
1357
  return;
1567
1358
  }
1568
-
1569
1359
  var tp = self[0].timepickerObj;
1570
1360
  var settings = tp.settings;
1571
1361
  self.removeAttr("autocomplete", "off");
1572
1362
  self.removeClass("ui-timepicker-input");
1573
1363
  self.removeData("timepicker-obj");
1574
- self.off(".timepicker"); // timepicker-list won't be present unless the user has interacted with this timepicker
1364
+ self.off(".timepicker");
1575
1365
 
1366
+ // timepicker-list won't be present unless the user has interacted with this timepicker
1576
1367
  if (tp.list) {
1577
1368
  tp.list.remove();
1578
1369
  }
1579
-
1580
1370
  if (settings.useSelect) {
1581
1371
  self.show();
1582
1372
  }
1583
-
1373
+ if (tp.requiredMoved) {
1374
+ self.prop("required", true);
1375
+ }
1584
1376
  tp.list = null;
1585
1377
  return this;
1586
1378
  }
1587
- }; // private methods
1379
+ };
1380
+
1381
+ // private methods
1588
1382
 
1589
1383
  function _render(self) {
1590
1384
  var tp = self[0].timepickerObj;
1591
1385
  var list = tp.list;
1592
1386
  var settings = tp.settings;
1593
-
1594
1387
  if (list && list.length) {
1595
1388
  list.remove();
1596
1389
  tp.list = null;
1597
1390
  }
1598
-
1599
1391
  var wrapped_list = $(renderHtml(tp));
1600
-
1601
1392
  if (settings.useSelect) {
1602
1393
  list = wrapped_list;
1603
1394
  } else {
1604
- list = wrapped_list.children('ul');
1395
+ list = wrapped_list.children("ul");
1605
1396
  }
1606
-
1607
1397
  wrapped_list.data("timepicker-input", self);
1608
1398
  tp.list = wrapped_list;
1609
-
1610
1399
  if (settings.useSelect) {
1611
1400
  if (self.val()) {
1612
- list.val(tp._roundAndFormatTime(tp.anytime2int(self.val())));
1401
+ list.val(settings.roundingFunction(tp.anytime2int(self.val()), settings));
1402
+ } else {
1403
+ // don't let the browser default to the first time; this selects a
1404
+ // noneOption with an empty value, or nothing if there isn't one
1405
+ list.val("");
1613
1406
  }
1614
-
1615
1407
  list.on("focus", function () {
1616
1408
  $(this).data("timepicker-input").trigger("showTimepicker");
1617
1409
  });
1618
1410
  list.on("blur", function () {
1619
1411
  $(this).data("timepicker-input").trigger("hideTimepicker");
1620
1412
  });
1413
+ // time options hold seconds; noneOption values pass through as-is
1414
+ var selectedTime = function selectedTime() {
1415
+ var value = list.val();
1416
+ var seconds = parseInt(value);
1417
+ return isNaN(seconds) ? value : tp._int2time(seconds);
1418
+ };
1621
1419
  list.on("change", function () {
1622
- tp._setTimeValue($(this).val(), "select");
1420
+ tp._setTimeValue(selectedTime(), "select");
1623
1421
  });
1624
1422
 
1625
- tp._setTimeValue(list.val(), "initial");
1423
+ // the input gets hidden, and a hidden required field blocks
1424
+ // submission without showing an error, so the select takes it over
1425
+ if (self.prop("required")) {
1426
+ tp.requiredMoved = true;
1427
+ self.prop("required", false);
1428
+ }
1429
+ list.prop("required", !!tp.requiredMoved);
1626
1430
 
1431
+ // a value that isn't in the list leaves the select blank; keep the
1432
+ // input's value instead of overwriting it with nothing
1433
+ var initialTime = list.val() === null ? self.val() : selectedTime();
1434
+ tp._setTimeValue(initialTime, "initial");
1627
1435
  self.hide().after(list);
1628
1436
  } else {
1629
1437
  var appendTo = settings.appendTo;
1630
-
1631
1438
  if (typeof appendTo === "string") {
1632
1439
  appendTo = $(appendTo);
1633
1440
  } else if (typeof appendTo === "function") {
1634
1441
  appendTo = appendTo(self);
1635
1442
  }
1636
-
1637
1443
  appendTo.append(wrapped_list);
1638
-
1639
1444
  tp._setSelected();
1640
-
1641
1445
  list.on("mousedown click", "li", function (e) {
1642
1446
  // hack: temporarily disable the focus handler
1643
1447
  // to deal with the fact that IE fires 'focus'
@@ -1647,15 +1451,13 @@
1647
1451
  self.off("focus.timepicker-ie-hack");
1648
1452
  self.on("focus.timepicker", methods.show);
1649
1453
  });
1650
-
1651
1454
  if (!tp._hideKeyboard()) {
1652
1455
  self[0].focus();
1653
- } // make sure only the clicked row is selected
1654
-
1456
+ }
1655
1457
 
1458
+ // make sure only the clicked row is selected
1656
1459
  list.find("li").removeClass("ui-timepicker-selected");
1657
1460
  $(this).addClass("ui-timepicker-selected");
1658
-
1659
1461
  if (tp._selectValue()) {
1660
1462
  self.trigger("hideTimepicker");
1661
1463
  list.on("mouseup.timepicker click.timepicker", "li", function (e) {
@@ -1665,50 +1467,43 @@
1665
1467
  }
1666
1468
  });
1667
1469
  }
1668
- } // event handler to decide whether to close timepicker
1669
-
1470
+ }
1670
1471
 
1472
+ // event handler to decide whether to close timepicker
1671
1473
  function _closeHandler(e) {
1672
- if (e.type == 'focus' && e.target == window) {
1474
+ if (e.type == "focus" && e.target == window) {
1673
1475
  // mobile Chrome fires focus events against window for some reason
1674
1476
  return;
1675
1477
  }
1676
-
1677
1478
  var target = $(e.target);
1678
-
1679
1479
  if (target.closest(".ui-timepicker-input").length || target.closest(".ui-timepicker-wrapper").length) {
1680
1480
  // active timepicker was focused. ignore
1681
1481
  return;
1682
1482
  }
1683
-
1684
1483
  Timepicker.hideAll();
1685
1484
  $(document).off(".ui-timepicker");
1686
1485
  $(window).off(".ui-timepicker");
1687
1486
  }
1487
+
1688
1488
  /*
1689
1489
  * Keyboard navigation via arrow keys
1690
1490
  */
1691
-
1692
-
1693
1491
  function _keydownhandler(e) {
1694
1492
  var self = $(this);
1695
1493
  var tp = self[0].timepickerObj;
1696
1494
  var list = tp.list;
1697
-
1698
1495
  if (!list || !Timepicker.isVisible(list)) {
1699
1496
  if (e.keyCode == 40) {
1700
1497
  // show the list!
1701
1498
  methods.show.call(self.get(0));
1702
1499
  list = tp.list;
1703
-
1704
1500
  if (!tp._hideKeyboard()) {
1705
- self.trigger('focus');
1501
+ self.trigger("focus");
1706
1502
  }
1707
1503
  } else {
1708
1504
  return true;
1709
1505
  }
1710
1506
  }
1711
-
1712
1507
  switch (e.keyCode) {
1713
1508
  case 13:
1714
1509
  // return
@@ -1716,17 +1511,13 @@
1716
1511
  tp._formatValue({
1717
1512
  type: "change"
1718
1513
  });
1719
-
1720
1514
  tp.hideMe();
1721
1515
  }
1722
-
1723
1516
  e.preventDefault();
1724
1517
  return false;
1725
-
1726
1518
  case 38:
1727
1519
  // up
1728
1520
  var selected = list.find(".ui-timepicker-selected");
1729
-
1730
1521
  if (!selected.length) {
1731
1522
  list.find("li").each(function (i, obj) {
1732
1523
  if ($(obj).position().top > 0) {
@@ -1738,18 +1529,14 @@
1738
1529
  } else if (!selected.is(":first-child")) {
1739
1530
  selected.removeClass("ui-timepicker-selected");
1740
1531
  selected.prev().addClass("ui-timepicker-selected");
1741
-
1742
1532
  if (selected.prev().position().top < selected.outerHeight()) {
1743
1533
  list.scrollTop(list.scrollTop() - selected.outerHeight());
1744
1534
  }
1745
1535
  }
1746
-
1747
1536
  return false;
1748
-
1749
1537
  case 40:
1750
1538
  // down
1751
1539
  selected = list.find(".ui-timepicker-selected");
1752
-
1753
1540
  if (selected.length === 0) {
1754
1541
  list.find("li").each(function (i, obj) {
1755
1542
  if ($(obj).position().top > 0) {
@@ -1761,50 +1548,43 @@
1761
1548
  } else if (!selected.is(":last-child")) {
1762
1549
  selected.removeClass("ui-timepicker-selected");
1763
1550
  selected.next().addClass("ui-timepicker-selected");
1764
-
1765
1551
  if (selected.next().position().top + 2 * selected.outerHeight() > list.outerHeight()) {
1766
1552
  list.scrollTop(list.scrollTop() + selected.outerHeight());
1767
1553
  }
1768
1554
  }
1769
-
1770
1555
  return false;
1771
-
1772
1556
  case 27:
1773
1557
  // escape
1774
1558
  list.find("li").removeClass("ui-timepicker-selected");
1775
1559
  tp.hideMe();
1776
1560
  break;
1777
-
1778
1561
  case 9:
1779
1562
  //tab
1780
1563
  tp.hideMe();
1781
1564
  break;
1782
-
1783
1565
  default:
1784
1566
  return true;
1785
1567
  }
1786
- } // Plugin entry
1787
-
1568
+ }
1788
1569
 
1570
+ // Plugin entry
1789
1571
  $.fn.timepicker = function (method) {
1790
1572
  if (!this.length) return this;
1791
-
1792
1573
  if (methods[method]) {
1793
1574
  // check if this element is a timepicker
1794
1575
  if (!this.hasClass("ui-timepicker-input")) {
1795
1576
  return this;
1796
1577
  }
1797
-
1798
1578
  return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
1799
1579
  } else if (_typeof(method) === "object" || !method) {
1800
1580
  return methods.init.apply(this, arguments);
1801
1581
  } else {
1802
1582
  $.error("Method " + method + " does not exist on jQuery.timepicker");
1803
1583
  }
1804
- }; // Default plugin options.
1805
-
1584
+ };
1806
1585
 
1586
+ // Default plugin options.
1807
1587
  $.fn.timepicker.defaults = DEFAULT_SETTINGS;
1808
1588
  });
1809
1589
 
1810
- }());
1590
+ })();