flatpickr 2.4.8.0 → 2.4.9.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.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/lib/flatpickr/version.rb +1 -1
  3. data/vendor/assets/javascripts/flatpickr.js +307 -230
  4. data/vendor/assets/javascripts/flatpickr/l10n/gr.js +31 -0
  5. data/vendor/assets/javascripts/flatpickr/l10n/nl.js +4 -4
  6. data/vendor/assets/stylesheets/flatpickr.css +4 -4
  7. data/vendor/assets/stylesheets/flatpickr/rtl/flatpickr.min.css +13 -0
  8. data/vendor/assets/stylesheets/flatpickr/rtl/themes/airbnb.rtl.css +332 -49
  9. data/vendor/assets/stylesheets/flatpickr/rtl/themes/base16_flat.rtl.css +291 -36
  10. data/vendor/assets/stylesheets/flatpickr/rtl/themes/confetti.rtl.css +294 -38
  11. data/vendor/assets/stylesheets/flatpickr/rtl/themes/dark.rtl.css +294 -39
  12. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_blue.rtl.css +301 -45
  13. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_green.rtl.css +301 -45
  14. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_orange.rtl.css +301 -45
  15. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_red.rtl.css +301 -45
  16. data/vendor/assets/stylesheets/flatpickr/themes/airbnb.css +308 -72
  17. data/vendor/assets/stylesheets/flatpickr/themes/base16_flat.css +267 -59
  18. data/vendor/assets/stylesheets/flatpickr/themes/confetti.css +270 -61
  19. data/vendor/assets/stylesheets/flatpickr/themes/dark.css +270 -62
  20. data/vendor/assets/stylesheets/flatpickr/themes/material_blue.css +277 -68
  21. data/vendor/assets/stylesheets/flatpickr/themes/material_green.css +277 -68
  22. data/vendor/assets/stylesheets/flatpickr/themes/material_orange.css +277 -68
  23. data/vendor/assets/stylesheets/flatpickr/themes/material_red.css +277 -68
  24. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 844eceb664e44b93ce50dde2774c1ebb8f193b89
4
- data.tar.gz: b60bfc6f0717e983004d4ff33700ece0cf0a7b15
3
+ metadata.gz: 33093b7a0d2abc52114461f6fbb3938ae69fb5f9
4
+ data.tar.gz: 73449d002ee949526b352c3c43391fad49f88652
5
5
  SHA512:
6
- metadata.gz: 242ae8fc941374c10f186c579c4767e4da00c65358f0f9dc7b09874a9c051d95ab9f91571685ddbad6cd50ac8f37d96aeaf8dd1601fabb7e3b70c65908ab1e29
7
- data.tar.gz: ef33f75bf97f9382721df6391bdaf39ed957d06dbb4cf429b8b66dde21d9154bf7ca05656f460e319f51dcde68c4d9e0ead110efa052ce4d2bf422710ec6a2f5
6
+ metadata.gz: 34589fe924dba58d1897abe91072bbc9028cea557b3f23a1f8528bf02577f07f35d2e256f4515eb6607bd925706ce907349b8d098fdd23b9c6e59bee90ddb4b4
7
+ data.tar.gz: dbbcbe66b55fc4eae32da2d24e797e9b51b2c15b9b79781332608cade9f29fc120720bad1bd2ca3f5909d7f2d3e409e5c93907eeaba4a968072be971aac6b151
@@ -1,3 +1,3 @@
1
1
  module Flatpickr
2
- VERSION = '2.4.8.0'
2
+ VERSION = '2.4.9.0'
3
3
  end
@@ -2,10 +2,12 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
2
2
 
3
3
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
4
 
5
- /*! flatpickr v2.4.8, @license MIT */
5
+ /*! flatpickr v2.4.9, @license MIT */
6
6
  function Flatpickr(element, config) {
7
7
  var self = this;
8
8
 
9
+ self._ = {};
10
+ self._.afterDayAnim = afterDayAnim;
9
11
  self.changeMonth = changeMonth;
10
12
  self.changeYear = changeYear;
11
13
  self.clear = clear;
@@ -37,7 +39,7 @@ function Flatpickr(element, config) {
37
39
  setupDates();
38
40
  setupHelperFunctions();
39
41
 
40
- self.isOpen = self.config.inline;
42
+ self.isOpen = false;
41
43
 
42
44
  self.isMobile = !self.config.disableMobile && !self.config.inline && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && !self.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
43
45
 
@@ -53,18 +55,18 @@ function Flatpickr(element, config) {
53
55
  }
54
56
 
55
57
  if (self.config.weekNumbers) {
56
- self.calendarContainer.style.width = self.days.clientWidth + self.weekWrapper.clientWidth + "px";
58
+ self.calendarContainer.style.width = self.daysContainer.clientWidth + self.weekWrapper.clientWidth + "px";
57
59
  }
58
60
 
59
61
  self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;
60
62
 
61
63
  if (!self.isMobile) positionCalendar();
64
+
62
65
  triggerEvent("Ready");
63
66
  }
64
67
 
65
68
  function bindToInstance(fn) {
66
- if (fn && fn.bind) return fn.bind(self);
67
- return fn;
69
+ return fn.bind(self);
68
70
  }
69
71
 
70
72
  function updateTime(e) {
@@ -142,11 +144,6 @@ function Flatpickr(element, config) {
142
144
  }
143
145
  }
144
146
 
145
- function onMonthScroll(e) {
146
- e.preventDefault();
147
- self.changeMonth(Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)));
148
- }
149
-
150
147
  function bind() {
151
148
  if (self.config.wrap) {
152
149
  ["open", "close", "toggle", "clear"].forEach(function (el) {
@@ -170,9 +167,11 @@ function Flatpickr(element, config) {
170
167
  };
171
168
  self.debouncedChange = debounce(self.triggerChange, 300);
172
169
 
173
- if (self.config.mode === "range" && self.days) self.days.addEventListener("mouseover", onMouseOver);
170
+ if (self.config.mode === "range" && self.daysContainer) self.daysContainer.addEventListener("mouseover", function (e) {
171
+ return onMouseOver(e.target);
172
+ });
174
173
 
175
- self.calendarContainer.addEventListener("keydown", onKeyDown);
174
+ document.body.addEventListener("keydown", onKeyDown);
176
175
 
177
176
  if (!self.config.static) (self.altInput || self.input).addEventListener("keydown", onKeyDown);
178
177
 
@@ -193,12 +192,13 @@ function Flatpickr(element, config) {
193
192
  return changeMonth(1);
194
193
  });
195
194
 
196
- self.currentMonthElement.addEventListener("wheel", function (e) {
197
- return debounce(onMonthScroll(e), 50);
198
- });
199
- self.currentYearElement.addEventListener("wheel", function (e) {
200
- return debounce(yearScroll(e), 50);
195
+ self.monthNav.addEventListener("wheel", function (e) {
196
+ e.preventDefault();
201
197
  });
198
+
199
+ self.monthNav.addEventListener("wheel", debounce(onMonthNavScroll, 10));
200
+ self.monthNav.addEventListener("click", onMonthNavClick);
201
+
202
202
  self.currentYearElement.addEventListener("focus", function () {
203
203
  self.currentYearElement.select();
204
204
  });
@@ -206,14 +206,21 @@ function Flatpickr(element, config) {
206
206
  self.currentYearElement.addEventListener("input", onYearInput);
207
207
  self.currentYearElement.addEventListener("increment", onYearInput);
208
208
 
209
- self.days.addEventListener("click", selectDate);
209
+ self.daysContainer.addEventListener("click", selectDate);
210
+
211
+ if (self.config.animate) {
212
+ self.daysContainer.addEventListener("animationend", animateDays);
213
+ self.monthNav.addEventListener("animationend", animateMonths);
214
+
215
+ self.daysContainer.addEventListener("webkitAnimationEnd", animateDays);
216
+ self.monthNav.addEventListener("webkitAnimationEnd", animateMonths);
217
+ }
210
218
  }
211
219
 
212
220
  if (self.config.enableTime) {
213
- self.timeContainer.addEventListener("transitionend", positionCalendar);
214
- self.timeContainer.addEventListener("wheel", function (e) {
215
- return debounce(updateTime(e), 5);
216
- });
221
+ self.timeContainer.addEventListener("wheel", updateTime);
222
+
223
+ self.timeContainer.addEventListener("click", timeIncrement);
217
224
  self.timeContainer.addEventListener("input", updateTime);
218
225
  self.timeContainer.addEventListener("increment", updateTime);
219
226
  self.timeContainer.addEventListener("increment", self.debouncedChange);
@@ -243,6 +250,41 @@ function Flatpickr(element, config) {
243
250
  }
244
251
  }
245
252
 
253
+ function animateDays(e) {
254
+ if (self.daysContainer.childNodes.length > 1) {
255
+ switch (e.animationName) {
256
+ case "slideLeft":
257
+ self.daysContainer.lastChild.classList.remove("slideLeftNew");
258
+ self.daysContainer.removeChild(self.daysContainer.firstChild);
259
+ self.days = self.daysContainer.firstChild;
260
+
261
+ break;
262
+
263
+ case "slideRight":
264
+ self.daysContainer.firstChild.classList.remove("slideRightNew");
265
+ self.daysContainer.removeChild(self.daysContainer.lastChild);
266
+ self.days = self.daysContainer.firstChild;
267
+
268
+ break;
269
+
270
+ default:
271
+ break;
272
+ }
273
+ }
274
+ }
275
+
276
+ function animateMonths(e) {
277
+ switch (e.animationName) {
278
+ case "slideLeft":
279
+ case "slideRight":
280
+ self.navigationCurrentMonth.classList.remove("slideLeftNew");
281
+ self.navigationCurrentMonth.classList.remove("slideRightNew");
282
+ self.monthNav.removeChild(self.oldCurMonth);
283
+ self.oldCurMonth = null;
284
+ break;
285
+ }
286
+ }
287
+
246
288
  function jumpToDate(jumpDate) {
247
289
  jumpDate = jumpDate ? self.parseDate(jumpDate) : self.latestSelectedDateObj || (self.config.minDate > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate < self.now ? self.config.maxDate : self.now);
248
290
 
@@ -259,6 +301,10 @@ function Flatpickr(element, config) {
259
301
  self.redraw();
260
302
  }
261
303
 
304
+ function timeIncrement(e) {
305
+ if (~e.target.className.indexOf("arrow")) incrementNumInput(e, e.target.classList.contains("arrowUp") ? 1 : -1);
306
+ }
307
+
262
308
  function incrementNumInput(e, delta, inputElem) {
263
309
  var input = inputElem || e.target.parentNode.childNodes[0];
264
310
  var ev = void 0;
@@ -282,22 +328,18 @@ function Flatpickr(element, config) {
282
328
 
283
329
  numInput.type = "text";
284
330
  numInput.pattern = "\\d*";
331
+
285
332
  wrapper.appendChild(numInput);
286
333
  wrapper.appendChild(arrowUp);
287
334
  wrapper.appendChild(arrowDown);
288
335
 
289
- arrowUp.addEventListener("click", function (e) {
290
- return incrementNumInput(e, 1);
291
- });
292
- arrowDown.addEventListener("click", function (e) {
293
- return incrementNumInput(e, -1);
294
- });
295
336
  return wrapper;
296
337
  }
297
338
 
298
339
  function build() {
299
340
  var fragment = window.document.createDocumentFragment();
300
341
  self.calendarContainer = createElement("div", "flatpickr-calendar");
342
+ self.calendarContainer.tabIndex = -1;
301
343
  self.numInputType = navigator.userAgent.indexOf("MSIE 9.0") > 0 ? "text" : "number";
302
344
 
303
345
  if (!self.config.noCalendar) {
@@ -309,13 +351,13 @@ function Flatpickr(element, config) {
309
351
  self.rContainer = createElement("div", "flatpickr-rContainer");
310
352
  self.rContainer.appendChild(buildWeekdays());
311
353
 
312
- if (!self.days) {
313
- self.days = createElement("div", "flatpickr-days");
314
- self.days.tabIndex = -1;
354
+ if (!self.daysContainer) {
355
+ self.daysContainer = createElement("div", "flatpickr-days");
356
+ self.daysContainer.tabIndex = -1;
315
357
  }
316
358
 
317
359
  buildDays();
318
- self.rContainer.appendChild(self.days);
360
+ self.rContainer.appendChild(self.daysContainer);
319
361
 
320
362
  self.innerContainer.appendChild(self.rContainer);
321
363
  fragment.appendChild(self.innerContainer);
@@ -323,7 +365,8 @@ function Flatpickr(element, config) {
323
365
 
324
366
  if (self.config.enableTime) fragment.appendChild(buildTime());
325
367
 
326
- if (self.config.mode === "range") self.calendarContainer.classList.add("rangeMode");
368
+ toggleClass(self.calendarContainer, "rangeMode", self.config.mode === "range");
369
+ toggleClass(self.calendarContainer, "animate", self.config.animate);
327
370
 
328
371
  self.calendarContainer.appendChild(fragment);
329
372
 
@@ -396,26 +439,42 @@ function Flatpickr(element, config) {
396
439
  }
397
440
 
398
441
  function focusOnDay(currentIndex, offset) {
399
- if (currentIndex === undefined) return (self.todayDateElem || self.days.childNodes[0]).focus();
400
-
401
442
  var newIndex = currentIndex + offset || 0,
402
- targetNode = self.days.childNodes[newIndex];
443
+ targetNode = currentIndex !== undefined ? self.days.childNodes[newIndex] : self.selectedDateElem || self.todayDateElem || self.days.childNodes[0],
444
+ focus = function focus() {
445
+ targetNode = targetNode || self.days.childNodes[newIndex];
446
+ targetNode.focus();
403
447
 
404
- if (targetNode) targetNode.focus();else if (offset > 0) {
405
- self.changeMonth(1);
406
- self.days.childNodes[newIndex % 42].focus();
407
- } else {
408
- self.changeMonth(-1);
409
- self.days.childNodes[42 + newIndex].focus();
448
+ if (self.config.mode === "range") onMouseOver(targetNode);
449
+ };
450
+
451
+ if (targetNode === undefined && offset !== 0) {
452
+ if (offset > 0) {
453
+ self.changeMonth(1);
454
+ newIndex = newIndex % 42;
455
+ } else if (offset < 0) {
456
+ self.changeMonth(-1);
457
+ newIndex += 42;
458
+ }
459
+
460
+ return afterDayAnim(focus);
410
461
  }
462
+
463
+ focus();
411
464
  }
412
465
 
413
- function buildDays(year, month) {
466
+ function afterDayAnim(fn) {
467
+ if (self.config.animate) return setTimeout(fn, self._.daysAnimDuration + 1);
468
+ fn();
469
+ }
470
+
471
+ function buildDays(delta) {
414
472
  var firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7,
415
473
  isRangeMode = self.config.mode === "range";
416
474
 
417
475
  self.prevMonthDays = self.utils.getDaysinMonth((self.currentMonth - 1 + 12) % 12);
418
- self.todayDateElem = null;
476
+ self.selectedDateElem = undefined;
477
+ self.todayDateElem = undefined;
419
478
 
420
479
  var daysInMonth = self.utils.getDaysinMonth(),
421
480
  days = window.document.createDocumentFragment();
@@ -431,8 +490,6 @@ function Flatpickr(element, config) {
431
490
  self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - firstOfMonth) % daysInMonth);
432
491
  }
433
492
 
434
- if (self.days.firstChild) self.days.textContent = "";
435
-
436
493
  // prepend days from the ending of previous month
437
494
  for (; dayNumber <= self.prevMonthDays; dayNumber++, dayIndex++) {
438
495
  days.appendChild(createDay("prevMonthDay", new Date(self.currentYear, self.currentMonth - 1, dayNumber), dayNumber, dayIndex));
@@ -454,8 +511,25 @@ function Flatpickr(element, config) {
454
511
  self._hideNextMonthArrow = self._hideNextMonthArrow || self.maxRangeDate < new Date(self.currentYear, self.currentMonth + 1, 1);
455
512
  } else updateNavigationCurrentMonth();
456
513
 
457
- self.days.appendChild(days);
458
- return self.days;
514
+ var dayContainer = createElement("div", "dayContainer");
515
+ dayContainer.appendChild(days);
516
+
517
+ if (!self.config.animate || delta === undefined) clearNode(self.daysContainer);else {
518
+ while (self.daysContainer.childNodes.length > 1) {
519
+ self.daysContainer.removeChild(self.daysContainer.firstChild);
520
+ }
521
+ }
522
+
523
+ if (delta >= 0) self.daysContainer.appendChild(dayContainer);else self.daysContainer.insertBefore(dayContainer, self.daysContainer.firstChild);
524
+
525
+ self.days = self.daysContainer.firstChild;
526
+ return self.daysContainer;
527
+ }
528
+
529
+ function clearNode(node) {
530
+ while (node.firstChild) {
531
+ node.removeChild(node.firstChild);
532
+ }
459
533
  }
460
534
 
461
535
  function buildMonthNav() {
@@ -606,9 +680,10 @@ function Flatpickr(element, config) {
606
680
  return self.weekWrapper;
607
681
  }
608
682
 
609
- function changeMonth(value, is_offset) {
610
- is_offset = typeof is_offset === "undefined" || is_offset;
683
+ function changeMonth(value, is_offset, animate) {
684
+ is_offset = is_offset === undefined || is_offset;
611
685
  var delta = is_offset ? value : value - self.currentMonth;
686
+ var skipAnimations = !self.config.animate || animate === false;
612
687
 
613
688
  if (delta < 0 && self._hidePrevMonthArrow || delta > 0 && self._hideNextMonthArrow) return;
614
689
 
@@ -621,10 +696,43 @@ function Flatpickr(element, config) {
621
696
  triggerEvent("YearChange");
622
697
  }
623
698
 
699
+ buildDays(!skipAnimations ? delta : undefined);
700
+
701
+ if (skipAnimations) {
702
+ triggerEvent("MonthChange");
703
+ return updateNavigationCurrentMonth();
704
+ }
705
+
706
+ self.oldCurMonth = self.navigationCurrentMonth;
707
+ self.navigationCurrentMonth = self.monthNav.insertBefore(self.oldCurMonth.cloneNode(true), delta > 0 ? self.oldCurMonth.nextSibling : self.oldCurMonth);
708
+
709
+ if (delta > 0) {
710
+ self.daysContainer.firstChild.classList.add("slideLeft");
711
+ self.daysContainer.lastChild.classList.add("slideLeftNew");
712
+
713
+ self.oldCurMonth.classList.add("slideLeft");
714
+ self.navigationCurrentMonth.classList.add("slideLeftNew");
715
+ } else if (delta < 0) {
716
+ self.daysContainer.firstChild.classList.add("slideRightNew");
717
+ self.daysContainer.lastChild.classList.add("slideRight");
718
+
719
+ self.oldCurMonth.classList.add("slideRight");
720
+ self.navigationCurrentMonth.classList.add("slideRightNew");
721
+ }
722
+
723
+ self.currentMonthElement = self.navigationCurrentMonth.firstChild;
724
+ self.currentYearElement = self.navigationCurrentMonth.lastChild.childNodes[0];
725
+
624
726
  updateNavigationCurrentMonth();
625
- buildDays();
727
+ self.oldCurMonth.firstChild.textContent = self.utils.monthToStr(self.currentMonth - delta);
728
+
729
+ if (self._.daysAnimDuration === undefined) {
730
+ var compStyle = window.getComputedStyle(self.daysContainer.lastChild);
731
+
732
+ var duration = compStyle.getPropertyValue("animation-duration") || compStyle.getPropertyValue("-webkit-animation-duration");
626
733
 
627
- triggerEvent("MonthChange");
734
+ self._.daysAnimDuration = parseInt(/(\d+)s/.exec(duration)[1]);
735
+ }
628
736
  }
629
737
 
630
738
  function clear(triggerChangeEvent) {
@@ -666,8 +774,6 @@ function Flatpickr(element, config) {
666
774
  window.document.removeEventListener("touchstart", documentClick);
667
775
  window.document.removeEventListener("blur", documentClick);
668
776
 
669
- if (instance.timeContainer) instance.timeContainer.removeEventListener("transitionend", positionCalendar);
670
-
671
777
  if (instance.mobileInput) {
672
778
  if (instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);
673
779
  delete instance.mobileInput;
@@ -735,14 +841,11 @@ function Flatpickr(element, config) {
735
841
  }
736
842
 
737
843
  function isEnabled(date, timeless) {
738
- var ltmin = compareDates(date, self.config.minDate, typeof timeless !== "undefined" ? timeless : !self.minDateHasTime) < 0;
739
- var gtmax = compareDates(date, self.config.maxDate, typeof timeless !== "undefined" ? timeless : !self.maxDateHasTime) > 0;
740
-
741
- if (ltmin || gtmax) return false;
844
+ if (self.config.minDate && compareDates(date, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0 || self.config.maxDate && compareDates(date, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0) return false;
742
845
 
743
846
  if (!self.config.enable.length && !self.config.disable.length) return true;
744
847
 
745
- var dateToCheck = self.parseDate(date, true); // timeless
848
+ var dateToCheck = self.parseDate(date, null, true); // timeless
746
849
 
747
850
  var bool = self.config.enable.length > 0,
748
851
  array = bool ? self.config.enable : self.config.disable;
@@ -753,7 +856,7 @@ function Flatpickr(element, config) {
753
856
  if (d instanceof Function && d(dateToCheck)) // disabled by function
754
857
  return bool;else if (d instanceof Date && d.getTime() === dateToCheck.getTime())
755
858
  // disabled by date
756
- return bool;else if (typeof d === "string" && self.parseDate(d, true).getTime() === dateToCheck.getTime())
859
+ return bool;else if (typeof d === "string" && self.parseDate(d, null, true).getTime() === dateToCheck.getTime())
757
860
  // disabled by date string
758
861
  return bool;else if ( // disabled by range
759
862
  (typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= d.from && dateToCheck <= d.to) return bool;
@@ -763,10 +866,17 @@ function Flatpickr(element, config) {
763
866
  }
764
867
 
765
868
  function onKeyDown(e) {
766
- if (e.target === (self.altInput || self.input) && e.key === "Enter") selectDate(e);else if (self.isOpen || self.config.inline) {
869
+ var isInput = e.target === (self.altInput || self.input);
870
+ var calendarElem = isCalendarElem(e.target);
871
+
872
+ if (e.key === "Enter" && self.config.allowInput && isInput) {
873
+ self.setDate((self.altInput || self.input).value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat);
874
+ return e.target.blur();
875
+ } else if (self.isOpen || self.config.inline && (isInput || calendarElem)) {
876
+ var isTimeObj = self.timeContainer && self.timeContainer.contains(e.target);
767
877
  switch (e.key) {
768
878
  case "Enter":
769
- if (self.timeContainer && self.timeContainer.contains(e.target)) updateValue();else selectDate(e);
879
+ if (isTimeObj) updateValue();else selectDate(e);
770
880
 
771
881
  break;
772
882
 
@@ -777,38 +887,36 @@ function Flatpickr(element, config) {
777
887
  break;
778
888
 
779
889
  case "ArrowLeft":
780
- e.preventDefault();
781
- if (!e.ctrlKey) focusOnDay(e.target.$i, -1);else {
782
- changeMonth(-1, true);
783
- focusOnDay(e.target.$i, 0);
784
- }
785
-
786
- break;
787
-
788
890
  case "ArrowRight":
789
891
  e.preventDefault();
790
- if (!e.ctrlKey) focusOnDay(e.target.$i, 1);else {
791
- changeMonth(1, true);
792
- focusOnDay(e.target.$i, 0);
793
- }
794
892
 
795
- break;
893
+ if (self.daysContainer) {
894
+ var _delta = e.key === "ArrowRight" ? 1 : -1;
796
895
 
797
- case "ArrowUp":
798
- e.preventDefault();
799
- if (e.ctrlKey) {
800
- changeYear(self.currentYear + 1);
801
- focusOnDay(e.target.$i, 0);
802
- } else if (!self.timeContainer || !self.timeContainer.contains(e.target)) focusOnDay(e.target.$i, -7);else updateTime(e);
896
+ if (!e.ctrlKey) focusOnDay(e.target.$i, _delta);else {
897
+ changeMonth(_delta, true);
898
+ afterDayAnim(function () {
899
+ focusOnDay(e.target.$i, 0);
900
+ });
901
+ }
902
+ } else if (self.config.enableTime && !isTimeObj) self.hourElement.focus();
803
903
 
804
904
  break;
805
905
 
906
+ case "ArrowUp":
806
907
  case "ArrowDown":
807
908
  e.preventDefault();
808
- if (e.ctrlKey) {
809
- changeYear(self.currentYear - 1);
810
- focusOnDay(e.target.$i, 0);
811
- } else if (!self.timeContainer || !self.timeContainer.contains(e.target)) focusOnDay(e.target.$i, 7);else updateTime(e);
909
+ var delta = e.key === "ArrowDown" ? 1 : -1;
910
+
911
+ if (self.daysContainer) {
912
+ if (e.ctrlKey) {
913
+ changeYear(self.currentYear - delta);
914
+ focusOnDay(e.target.$i, 0);
915
+ } else if (!isTimeObj) focusOnDay(e.target.$i, delta * 7);
916
+ } else if (self.config.enableTime) {
917
+ if (!isTimeObj) self.hourElement.focus();
918
+ updateTime(e);
919
+ }
812
920
 
813
921
  break;
814
922
 
@@ -848,11 +956,11 @@ function Flatpickr(element, config) {
848
956
  }
849
957
  }
850
958
 
851
- function onMouseOver(e) {
852
- if (self.selectedDates.length !== 1 || !e.target.classList.contains("flatpickr-day")) return;
959
+ function onMouseOver(elem) {
960
+ if (self.selectedDates.length !== 1 || !elem.classList.contains("flatpickr-day")) return;
853
961
 
854
- var hoverDate = e.target.dateObj,
855
- initialDate = self.parseDate(self.selectedDates[0], true),
962
+ var hoverDate = elem.dateObj,
963
+ initialDate = self.parseDate(self.selectedDates[0], null, true),
856
964
  rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
857
965
  rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
858
966
  containsDisabled = false;
@@ -865,26 +973,29 @@ function Flatpickr(element, config) {
865
973
  }
866
974
 
867
975
  var _loop = function _loop(timestamp, i) {
868
- var outOfRange = timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime();
976
+ var outOfRange = timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime(),
977
+ dayElem = self.days.childNodes[i];
869
978
 
870
979
  if (outOfRange) {
871
980
  self.days.childNodes[i].classList.add("notAllowed");
872
981
  ["inRange", "startRange", "endRange"].forEach(function (c) {
873
- self.days.childNodes[i].classList.remove(c);
982
+ dayElem.classList.remove(c);
874
983
  });
875
984
  return "continue";
876
985
  } else if (containsDisabled && !outOfRange) return "continue";
877
986
 
878
987
  ["startRange", "inRange", "endRange", "notAllowed"].forEach(function (c) {
879
- self.days.childNodes[i].classList.remove(c);
988
+ dayElem.classList.remove(c);
880
989
  });
881
990
 
882
991
  var minRangeDate = Math.max(self.minRangeDate.getTime(), rangeStartDate),
883
992
  maxRangeDate = Math.min(self.maxRangeDate.getTime(), rangeEndDate);
884
993
 
885
- e.target.classList.add(hoverDate < self.selectedDates[0] ? "startRange" : "endRange");
994
+ elem.classList.add(hoverDate < self.selectedDates[0] ? "startRange" : "endRange");
886
995
 
887
- if (initialDate > hoverDate && timestamp === initialDate.getTime()) self.days.childNodes[i].classList.add("endRange");else if (initialDate < hoverDate && timestamp === initialDate.getTime()) self.days.childNodes[i].classList.add("startRange");else if (timestamp >= minRangeDate && timestamp <= maxRangeDate) self.days.childNodes[i].classList.add("inRange");
996
+ if (initialDate < hoverDate && timestamp === initialDate.getTime()) dayElem.classList.add("startRange");else if (initialDate > hoverDate && timestamp === initialDate.getTime()) dayElem.classList.add("endRange");
997
+
998
+ if (timestamp >= minRangeDate && timestamp <= maxRangeDate) dayElem.classList.add("inRange");
888
999
  };
889
1000
 
890
1001
  for (var timestamp = self.days.childNodes[0].dateObj.getTime(), i = 0; i < 42; i++, timestamp += self.utils.duration.DAY) {
@@ -942,7 +1053,7 @@ function Flatpickr(element, config) {
942
1053
  updateValue();
943
1054
  }
944
1055
 
945
- if (self.days) {
1056
+ if (self.daysContainer) {
946
1057
  redraw();
947
1058
 
948
1059
  if (isValidDate) self.currentYearElement[type] = dateObj.getFullYear();else self.currentYearElement.removeAttribute(type);
@@ -999,7 +1110,7 @@ function Flatpickr(element, config) {
999
1110
  var pluginConf = self.config.plugins[_i2](self) || {};
1000
1111
  for (var key in pluginConf) {
1001
1112
 
1002
- if (Array.isArray(self.config[key]) || ~hooks.indexOf(key)) {
1113
+ if ((self.config[key] || ~hooks.indexOf(key)) instanceof Array) {
1003
1114
  self.config[key] = arrayify(pluginConf[key]).map(bindToInstance).concat(self.config[key]);
1004
1115
  } else if (typeof userConfig[key] === "undefined") self.config[key] = pluginConf[key];
1005
1116
  }
@@ -1014,8 +1125,8 @@ function Flatpickr(element, config) {
1014
1125
  self.l10n = _extends(Object.create(Flatpickr.l10ns.default), _typeof(self.config.locale) === "object" ? self.config.locale : self.config.locale !== "default" ? Flatpickr.l10ns[self.config.locale] || {} : {});
1015
1126
  }
1016
1127
 
1017
- function positionCalendar(e) {
1018
- if (e && e.target !== self.timeContainer) return;
1128
+ function positionCalendar() {
1129
+ if (self.calendarContainer === undefined) return;
1019
1130
 
1020
1131
  var calendarHeight = self.calendarContainer.offsetHeight,
1021
1132
  calendarWidth = self.calendarContainer.offsetWidth,
@@ -1063,15 +1174,12 @@ function Flatpickr(element, config) {
1063
1174
  e.preventDefault();
1064
1175
  e.stopPropagation();
1065
1176
 
1066
- if (self.config.allowInput && e.key === "Enter" && e.target === (self.altInput || self.input)) {
1067
- self.setDate((self.altInput || self.input).value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat);
1068
- return e.target.blur();
1069
- }
1070
-
1071
1177
  if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
1072
1178
 
1073
1179
  var selectedDate = self.latestSelectedDateObj = new Date(e.target.dateObj.getTime());
1074
1180
 
1181
+ var shouldChangeMonth = selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range";
1182
+
1075
1183
  self.selectedDateElem = e.target;
1076
1184
 
1077
1185
  if (self.config.mode === "single") self.selectedDates = [selectedDate];else if (self.config.mode === "multiple") {
@@ -1090,7 +1198,7 @@ function Flatpickr(element, config) {
1090
1198
 
1091
1199
  setHoursFromInputs();
1092
1200
 
1093
- if (selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range") {
1201
+ if (shouldChangeMonth) {
1094
1202
  var isNewYear = self.currentYear !== selectedDate.getFullYear();
1095
1203
  self.currentYear = selectedDate.getFullYear();
1096
1204
  self.currentMonth = selectedDate.getMonth();
@@ -1106,13 +1214,13 @@ function Flatpickr(element, config) {
1106
1214
 
1107
1215
  updateValue();
1108
1216
 
1109
- setTimeout(function () {
1217
+ if (self.config.enableTime) setTimeout(function () {
1110
1218
  return self.showTimeInput = true;
1111
1219
  }, 50);
1112
1220
 
1113
1221
  if (self.config.mode === "range") {
1114
1222
  if (self.selectedDates.length === 1) {
1115
- onMouseOver(e);
1223
+ onMouseOver(e.target);
1116
1224
 
1117
1225
  self._hidePrevMonthArrow = self._hidePrevMonthArrow || self.minRangeDate > self.days.childNodes[0].dateObj;
1118
1226
 
@@ -1123,13 +1231,18 @@ function Flatpickr(element, config) {
1123
1231
  }
1124
1232
  }
1125
1233
 
1234
+ triggerEvent("Change");
1235
+
1236
+ // maintain focus
1237
+ if (!shouldChangeMonth) focusOnDay(e.target.$i, 0);else afterDayAnim(function () {
1238
+ return self.selectedDateElem.focus();
1239
+ });
1240
+
1126
1241
  if (self.config.enableTime) setTimeout(function () {
1127
1242
  return self.hourElement.select();
1128
1243
  }, 451);
1129
1244
 
1130
1245
  if (self.config.mode === "single" && !self.config.enableTime) self.close();
1131
-
1132
- triggerEvent("Change");
1133
1246
  }
1134
1247
 
1135
1248
  function set(option, value) {
@@ -1139,23 +1252,23 @@ function Flatpickr(element, config) {
1139
1252
  }
1140
1253
 
1141
1254
  function setSelectedDate(inputDate, format) {
1142
- if (Array.isArray(inputDate)) self.selectedDates = inputDate.map(function (d) {
1143
- return self.parseDate(d, false, format);
1144
- });else if (inputDate instanceof Date || !isNaN(inputDate)) self.selectedDates = [self.parseDate(inputDate)];else if (inputDate && inputDate.substring) {
1255
+ if (inputDate instanceof Array) self.selectedDates = inputDate.map(function (d) {
1256
+ return self.parseDate(d, format);
1257
+ });else if (inputDate instanceof Date || !isNaN(inputDate)) self.selectedDates = [self.parseDate(inputDate, format)];else if (inputDate && inputDate.substring) {
1145
1258
  switch (self.config.mode) {
1146
1259
  case "single":
1147
- self.selectedDates = [self.parseDate(inputDate, false, format)];
1260
+ self.selectedDates = [self.parseDate(inputDate, format)];
1148
1261
  break;
1149
1262
 
1150
1263
  case "multiple":
1151
1264
  self.selectedDates = inputDate.split("; ").map(function (date) {
1152
- return self.parseDate(date, false, format);
1265
+ return self.parseDate(date, format);
1153
1266
  });
1154
1267
  break;
1155
1268
 
1156
1269
  case "range":
1157
1270
  self.selectedDates = inputDate.split(self.l10n.rangeSeparator).map(function (date) {
1158
- return self.parseDate(date, false, format);
1271
+ return self.parseDate(date, format);
1159
1272
  });
1160
1273
 
1161
1274
  break;
@@ -1194,7 +1307,7 @@ function Flatpickr(element, config) {
1194
1307
  function setupDates() {
1195
1308
  function parseDateRules(arr) {
1196
1309
  for (var i = arr.length; i--;) {
1197
- if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], true);else if (arr[i] && arr[i].from && arr[i].to) {
1310
+ if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], null, true);else if (arr[i] && arr[i].from && arr[i].to) {
1198
1311
  arr[i].from = self.parseDate(arr[i].from);
1199
1312
  arr[i].to = self.parseDate(arr[i].to);
1200
1313
  }
@@ -1212,7 +1325,8 @@ function Flatpickr(element, config) {
1212
1325
 
1213
1326
  if (self.config.enable.length) self.config.enable = parseDateRules(self.config.enable);
1214
1327
 
1215
- setSelectedDate(self.config.defaultDate || self.input.value);
1328
+ var preloadedDate = self.config.defaultDate || self.input.value;
1329
+ if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat);
1216
1330
 
1217
1331
  var initialDate = self.selectedDates.length ? self.selectedDates[0] : self.config.minDate && self.config.minDate.getTime() > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate.getTime() < self.now ? self.config.maxDate : self.now;
1218
1332
 
@@ -1242,6 +1356,7 @@ function Flatpickr(element, config) {
1242
1356
  set: function set(bool) {
1243
1357
  self._showTimeInput = bool;
1244
1358
  if (self.calendarContainer) toggleClass(self.calendarContainer, "showTimeInput", bool);
1359
+ positionCalendar();
1245
1360
  }
1246
1361
  });
1247
1362
  }
@@ -1332,15 +1447,15 @@ function Flatpickr(element, config) {
1332
1447
  }
1333
1448
 
1334
1449
  self.mobileInput.addEventListener("change", function (e) {
1335
- self.latestSelectedDateObj = self.parseDate(e.target.value);
1336
- self.setDate(self.latestSelectedDateObj);
1450
+ self.setDate(e.target.value, false, self.mobileFormatStr);
1337
1451
  triggerEvent("Change");
1338
1452
  triggerEvent("Close");
1339
1453
  });
1340
1454
  }
1341
1455
 
1342
1456
  function toggle() {
1343
- if (self.isOpen) self.close();else self.open();
1457
+ if (self.isOpen) return self.close();
1458
+ self.open();
1344
1459
  }
1345
1460
 
1346
1461
  function triggerEvent(event, data) {
@@ -1415,14 +1530,27 @@ function Flatpickr(element, config) {
1415
1530
  triggerEvent("ValueUpdate");
1416
1531
  }
1417
1532
 
1418
- function yearScroll(e) {
1533
+ function mouseDelta(e) {
1534
+ return Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));
1535
+ }
1536
+
1537
+ function onMonthNavScroll(e) {
1419
1538
  e.preventDefault();
1539
+ var isYear = self.currentYearElement.parentNode.contains(e.target);
1540
+
1541
+ if (e.target === self.currentMonthElement || isYear) {
1420
1542
 
1421
- var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)),
1422
- newYear = parseInt(e.target.value, 10) + delta;
1543
+ var delta = mouseDelta(e);
1423
1544
 
1424
- changeYear(newYear);
1425
- e.target.value = self.currentYear;
1545
+ if (isYear) {
1546
+ changeYear(self.currentYear + delta);
1547
+ e.target.value = self.currentYear;
1548
+ } else self.changeMonth(delta, true, false);
1549
+ }
1550
+ }
1551
+
1552
+ function onMonthNavClick(e) {
1553
+ if (e.target.className === "arrowUp") self.changeYear(self.currentYear + 1);else if (e.target.className === "arrowDown") self.changeYear(self.currentYear - 1);
1426
1554
  }
1427
1555
 
1428
1556
  function createElement(tag, className, content) {
@@ -1438,7 +1566,7 @@ function Flatpickr(element, config) {
1438
1566
  }
1439
1567
 
1440
1568
  function arrayify(obj) {
1441
- if (Array.isArray(obj)) return obj;
1569
+ if (obj instanceof Array) return obj;
1442
1570
  return [obj];
1443
1571
  }
1444
1572
 
@@ -1480,12 +1608,6 @@ function Flatpickr(element, config) {
1480
1608
  isIncrement = e.type === "increment",
1481
1609
  input = e.target;
1482
1610
 
1483
- if (e.type !== "input" && !isKeyDown && (e.target.value || e.target.textContent).length >= 2 // typed two digits
1484
- ) {
1485
- e.target.focus();
1486
- e.target.blur();
1487
- }
1488
-
1489
1611
  if (self.amPM && e.target === self.amPM) return e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
1490
1612
 
1491
1613
  var min = Number(input.min),
@@ -1522,10 +1644,11 @@ function Flatpickr(element, config) {
1522
1644
 
1523
1645
  /* istanbul ignore next */
1524
1646
  Flatpickr.defaultConfig = {
1525
-
1526
1647
  mode: "single",
1527
1648
 
1528
- position: "top",
1649
+ position: "auto",
1650
+
1651
+ animate: window.navigator.userAgent.indexOf("MSIE") === -1,
1529
1652
 
1530
1653
  /* if true, dates will be parsed, formatted, and displayed in UTC.
1531
1654
  preloading date strings w/ timezones is recommended but not necessary */
@@ -1822,15 +1945,7 @@ Flatpickr.prototype = {
1822
1945
  formatDate: function formatDate(dateObj, frmt) {
1823
1946
  var _this = this;
1824
1947
 
1825
- if (this.config.formatDate) {
1826
- try {
1827
- return this.config.formatDate(dateObj, frmt);
1828
- } catch (e) {
1829
- console.warn("Please swap the format string and the date object parameters in your formatDate option", "\nThe old signature will be deprecated by v2.5");
1830
-
1831
- return this.config.formatDate(frmt, dateObj);
1832
- }
1833
- }
1948
+ if (this.config.formatDate) return this.config.formatDate(dateObj, frmt);
1834
1949
 
1835
1950
  return frmt.split("").map(function (c, i, arr) {
1836
1951
  return _this.formats[c] && arr[i - 1] !== "\\" ? _this.formats[c](dateObj) : c !== "\\" ? c : "";
@@ -1844,10 +1959,10 @@ Flatpickr.prototype = {
1844
1959
  dateObj.setMonth(this.l10n.months.longhand.indexOf(monthName));
1845
1960
  },
1846
1961
  H: function H(dateObj, hour) {
1847
- return dateObj.setHours(parseFloat(hour));
1962
+ dateObj.setHours(parseFloat(hour));
1848
1963
  },
1849
1964
  J: function J(dateObj, day) {
1850
- return dateObj.setDate(parseFloat(day));
1965
+ dateObj.setDate(parseFloat(day));
1851
1966
  },
1852
1967
  K: function K(dateObj, amPM) {
1853
1968
  var hours = dateObj.getHours();
@@ -1858,41 +1973,45 @@ Flatpickr.prototype = {
1858
1973
  dateObj.setMonth(this.l10n.months.shorthand.indexOf(shortMonth));
1859
1974
  },
1860
1975
  S: function S(dateObj, seconds) {
1861
- return dateObj.setSeconds(seconds);
1976
+ dateObj.setSeconds(seconds);
1862
1977
  },
1978
+ U: function U(dateObj, unixSeconds) {
1979
+ return new Date(parseFloat(unixSeconds) * 1000);
1980
+ },
1981
+
1863
1982
  W: function W() {},
1864
1983
  Y: function Y(dateObj, year) {
1865
- return dateObj.setFullYear(year);
1984
+ dateObj.setFullYear(year);
1866
1985
  },
1867
1986
  Z: function Z(dateObj, ISODate) {
1868
- return dateObj = new Date(ISODate);
1987
+ return new Date(ISODate);
1869
1988
  },
1870
1989
 
1871
1990
  d: function d(dateObj, day) {
1872
- return dateObj.setDate(parseFloat(day));
1991
+ dateObj.setDate(parseFloat(day));
1873
1992
  },
1874
1993
  h: function h(dateObj, hour) {
1875
- return dateObj.setHours(parseFloat(hour));
1994
+ dateObj.setHours(parseFloat(hour));
1876
1995
  },
1877
1996
  i: function i(dateObj, minutes) {
1878
- return dateObj.setMinutes(parseFloat(minutes));
1997
+ dateObj.setMinutes(parseFloat(minutes));
1879
1998
  },
1880
1999
  j: function j(dateObj, day) {
1881
- return dateObj.setDate(parseFloat(day));
2000
+ dateObj.setDate(parseFloat(day));
1882
2001
  },
1883
2002
  l: function l() {},
1884
2003
  m: function m(dateObj, month) {
1885
- return dateObj.setMonth(parseFloat(month) - 1);
2004
+ dateObj.setMonth(parseFloat(month) - 1);
1886
2005
  },
1887
2006
  n: function n(dateObj, month) {
1888
- return dateObj.setMonth(parseFloat(month) - 1);
2007
+ dateObj.setMonth(parseFloat(month) - 1);
1889
2008
  },
1890
2009
  s: function s(dateObj, seconds) {
1891
- return dateObj.setSeconds(parseFloat(seconds));
2010
+ dateObj.setSeconds(parseFloat(seconds));
1892
2011
  },
1893
2012
  w: function w() {},
1894
2013
  y: function y(dateObj, year) {
1895
- return dateObj.setFullYear(2000 + parseFloat(year));
2014
+ dateObj.setFullYear(2000 + parseFloat(year));
1896
2015
  }
1897
2016
  },
1898
2017
 
@@ -1904,6 +2023,7 @@ Flatpickr.prototype = {
1904
2023
  K: "(\\w+)",
1905
2024
  M: "(\\w+)",
1906
2025
  S: "(\\d\\d|\\d)",
2026
+ U: "(.+)",
1907
2027
  Y: "(\\d{4})",
1908
2028
  Z: "(.+)",
1909
2029
  d: "(\\d\\d|\\d)",
@@ -1922,39 +2042,45 @@ Flatpickr.prototype = {
1922
2042
  return ("0" + number).slice(-2);
1923
2043
  },
1924
2044
 
1925
- parseDate: function parseDate(date, timeless, givenFormat) {
2045
+ parseDate: function parseDate(date, givenFormat, timeless) {
1926
2046
  if (!date) return null;
1927
2047
 
1928
2048
  var date_orig = date;
1929
2049
 
1930
- if (date.toFixed || /^\d{8}/.test(date)) // timestamp
1931
- date = new Date(parseInt(date, 10));else if (typeof date === "string") {
1932
- var format = typeof givenFormat === "string" ? givenFormat : this.config.dateFormat;
1933
- date = date.trim();
2050
+ if (date instanceof Date) date = new Date(date.getTime()); // create a copy
1934
2051
 
1935
- if (date === "today") {
1936
- date = new Date();
1937
- timeless = true;
1938
- } else if (this.config && this.config.parseDate) date = this.config.parseDate(date);else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
2052
+ else if (date.toFixed !== undefined) // timestamp
1939
2053
  date = new Date(date);else {
1940
- var parsedDate = this.config.noCalendar ? new Date(new Date().setHours(0, 0, 0, 0)) : new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0);
1941
-
1942
- var matched = false;
1943
-
1944
- for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
1945
- var token = format[i];
1946
- var isBackSlash = token === "\\";
1947
- var escaped = format[i - 1] === "\\" || isBackSlash;
1948
- if (this.tokenRegex[token] && !escaped) {
1949
- regexStr += this.tokenRegex[token];
1950
- var match = new RegExp(regexStr).exec(date);
1951
- if (match && (matched = true)) this.revFormat[token](parsedDate, match[++matchIndex]);
1952
- } else if (!isBackSlash) regexStr += "."; // don't really care
1953
- }
2054
+ // date string
2055
+ var format = givenFormat || this.config.dateFormat;
2056
+ date = String(date).trim();
2057
+
2058
+ if (date === "today") {
2059
+ date = new Date();
2060
+ timeless = true;
2061
+ } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
2062
+ date = new Date(date);else if (this.config.parseDate) date = this.config.parseDate(date, format);else {
2063
+ var parsedDate = this.config.noCalendar ? new Date(new Date().setHours(0, 0, 0, 0)) : new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0);
2064
+
2065
+ var matched = void 0;
2066
+
2067
+ for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
2068
+ var token = format[i];
2069
+ var isBackSlash = token === "\\";
2070
+ var escaped = format[i - 1] === "\\" || isBackSlash;
2071
+
2072
+ if (this.tokenRegex[token] && !escaped) {
2073
+ regexStr += this.tokenRegex[token];
2074
+ var match = new RegExp(regexStr).exec(date);
2075
+ if (match && (matched = true)) {
2076
+ parsedDate = this.revFormat[token](parsedDate, match[++matchIndex]) || parsedDate;
2077
+ }
2078
+ } else if (!isBackSlash) regexStr += "."; // don't really care
2079
+ }
1954
2080
 
1955
- date = matched ? parsedDate : null;
2081
+ date = matched ? parsedDate : null;
2082
+ }
1956
2083
  }
1957
- } else if (date instanceof Date) date = new Date(date.getTime()); // create a copy
1958
2084
 
1959
2085
  /* istanbul ignore next */
1960
2086
  if (!(date instanceof Date)) {
@@ -2023,53 +2149,4 @@ Date.prototype.fp_toUTC = function () {
2023
2149
  return newDate;
2024
2150
  };
2025
2151
 
2026
- // IE9 classList polyfill
2027
- /* istanbul ignore next */
2028
- if (!window.document.documentElement.classList && Object.defineProperty && typeof HTMLElement !== "undefined") {
2029
- Object.defineProperty(HTMLElement.prototype, "classList", {
2030
- get: function get() {
2031
- var self = this;
2032
- function update(fn) {
2033
- return function (value) {
2034
- var classes = self.className.split(/\s+/),
2035
- index = classes.indexOf(value);
2036
-
2037
- fn(classes, index, value);
2038
- self.className = classes.join(" ");
2039
- };
2040
- }
2041
-
2042
- var ret = {
2043
- add: update(function (classes, index, value) {
2044
- if (!~index) classes.push(value);
2045
- }),
2046
-
2047
- remove: update(function (classes, index) {
2048
- if (~index) classes.splice(index, 1);
2049
- }),
2050
-
2051
- toggle: update(function (classes, index, value) {
2052
- if (~index) classes.splice(index, 1);else classes.push(value);
2053
- }),
2054
-
2055
- contains: function contains(value) {
2056
- return !!~self.className.split(/\s+/).indexOf(value);
2057
- },
2058
-
2059
- item: function item(i) {
2060
- return self.className.split(/\s+/)[i] || null;
2061
- }
2062
- };
2063
-
2064
- Object.defineProperty(ret, "length", {
2065
- get: function get() {
2066
- return self.className.split(/\s+/).length;
2067
- }
2068
- });
2069
-
2070
- return ret;
2071
- }
2072
- });
2073
- }
2074
-
2075
- if (typeof module !== "undefined") module.exports = Flatpickr;
2152
+ if (typeof module !== "undefined") module.exports = Flatpickr;