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