flatpickr 2.3.7.0 → 2.4.0.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 +121 -61
  4. data/vendor/assets/javascripts/flatpickr/l10n/et.js +1 -0
  5. data/vendor/assets/javascripts/flatpickr/l10n/uk.js +2 -0
  6. data/vendor/assets/stylesheets/flatpickr.css +15 -1
  7. data/vendor/assets/stylesheets/flatpickr/rtl/flatpickr.min.css +13 -1
  8. data/vendor/assets/stylesheets/flatpickr/rtl/themes/airbnb.rtl.css +657 -1
  9. data/vendor/assets/stylesheets/flatpickr/rtl/themes/base16_flat.rtl.css +608 -1
  10. data/vendor/assets/stylesheets/flatpickr/rtl/themes/confetti.rtl.css +621 -1
  11. data/vendor/assets/stylesheets/flatpickr/rtl/themes/dark.rtl.css +608 -1
  12. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_blue.rtl.css +621 -1
  13. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_green.rtl.css +621 -1
  14. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_orange.rtl.css +621 -1
  15. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_red.rtl.css +621 -1
  16. data/vendor/assets/stylesheets/flatpickr/themes/airbnb.css +659 -1
  17. data/vendor/assets/stylesheets/flatpickr/themes/base16_flat.css +610 -1
  18. data/vendor/assets/stylesheets/flatpickr/themes/confetti.css +623 -1
  19. data/vendor/assets/stylesheets/flatpickr/themes/dark.css +610 -1
  20. data/vendor/assets/stylesheets/flatpickr/themes/material_blue.css +623 -1
  21. data/vendor/assets/stylesheets/flatpickr/themes/material_green.css +623 -1
  22. data/vendor/assets/stylesheets/flatpickr/themes/material_orange.css +623 -1
  23. data/vendor/assets/stylesheets/flatpickr/themes/material_red.css +623 -1
  24. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f1d7c0f31ea2d41c687a7b5d5cc68a588235cfb1
4
- data.tar.gz: f5f653cdfabc93859149399eba4f735b22f5cb80
3
+ metadata.gz: 47f1e976b5bdeb448137f8946b7a24bd291ddbf0
4
+ data.tar.gz: bd9635b2fe87f7a35f1d832af6a5accbdd98c631
5
5
  SHA512:
6
- metadata.gz: 85fe339777a71018008083ea3ab19e5f2e3d07c05ac19e820d064b57124d70701abc8f764329be25b65875e94c79427f2cabbdf6eeb6fe05924b6bac1416fb31
7
- data.tar.gz: be6ac37a8293a77fcedd3fd6690242f7408dc21d563017e1673ca7f7b6e5562ab12b12061774b99c61a1d7ee5278862f4f9724486cc825eed89298202dc25996
6
+ metadata.gz: 4f32e3597a1baac34db9b686b02ad1d803094fbcce1bdd21ad70674d62b5a00242fa729a8d1142047d80e11c4d1e7f9d9a3dcd3b8514dacf2553df0ecf7d615a
7
+ data.tar.gz: 7cdc2e9afb2f5a6337ce621c6b730abf3332f06bf44ed80b46cd481859663b297fc6f2a1c31d05487fada8fe098bb3841ce999e218d21d5a23b763e9f6be6b10
@@ -1,3 +1,3 @@
1
1
  module Flatpickr
2
- VERSION = '2.3.7.0'
2
+ VERSION = '2.4.0.0'
3
3
  end
@@ -2,7 +2,7 @@ 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.3.7, @license MIT */
5
+ /*! flatpickr v2.4, @license MIT */
6
6
  function Flatpickr(element, config) {
7
7
  var self = this;
8
8
 
@@ -13,6 +13,7 @@ function Flatpickr(element, config) {
13
13
  self._createElement = createElement;
14
14
  self.destroy = destroy;
15
15
  self.formatDate = formatDate;
16
+ self.isEnabled = isEnabled;
16
17
  self.jumpToDate = jumpToDate;
17
18
  self.open = open;
18
19
  self.redraw = redraw;
@@ -27,6 +28,7 @@ function Flatpickr(element, config) {
27
28
 
28
29
  self.element = element;
29
30
  self.instanceConfig = config || {};
31
+ self.parseDate = Flatpickr.prototype.parseDate.bind(self);
30
32
 
31
33
  setupFormats();
32
34
 
@@ -99,7 +101,9 @@ function Flatpickr(element, config) {
99
101
 
100
102
  hours = Math.max(hours, self.config.minDate.getHours());
101
103
  if (hours === self.config.minDate.getHours()) minutes = Math.max(minutes, self.config.minDate.getMinutes());
102
- } else if (self.maxDateHasTime && compareDates(self.latestSelectedDateObj, self.config.maxDate) === 0) {
104
+ }
105
+
106
+ if (self.maxDateHasTime && compareDates(self.latestSelectedDateObj, self.config.maxDate) === 0) {
103
107
  hours = Math.min(hours, self.config.maxDate.getHours());
104
108
  if (hours === self.config.maxDate.getHours()) minutes = Math.min(minutes, self.config.maxDate.getMinutes());
105
109
  }
@@ -130,27 +134,24 @@ function Flatpickr(element, config) {
130
134
  }
131
135
 
132
136
  function onYearInput(event) {
133
- if (event.target.value.length === 4) {
137
+ var year = event.target.value;
138
+ if (year.length === 4) {
134
139
  self.currentYearElement.blur();
135
- changeYear(event.target.value);
136
- event.target.value = self.currentYear;
140
+ if (!/[^\d]/.test(year)) changeYear(year);
137
141
  }
138
142
  }
139
143
 
140
144
  function onMonthScroll(e) {
141
145
  e.preventDefault();
142
- var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));
143
-
144
- if (delta < 0 && !self._hidePrevMonthArrow || delta > 0 && !self._hideNextMonthArrow) self.changeMonth(delta);
146
+ self.changeMonth(Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)));
145
147
  }
146
148
 
147
149
  function bind() {
148
150
  if (self.config.wrap) {
149
151
  ["open", "close", "toggle", "clear"].forEach(function (el) {
150
- try {
151
- self.element.querySelector("[data-" + el + "]").addEventListener("click", self[el]);
152
- } catch (e) {
153
- //
152
+ var toggles = self.element.querySelectorAll("[data-" + el + "]");
153
+ for (var i = 0; i < toggles.length; i++) {
154
+ toggles[i].addEventListener("click", self[el]);
154
155
  }
155
156
  });
156
157
  }
@@ -275,6 +276,7 @@ function Flatpickr(element, config) {
275
276
  arrowDown = createElement("span", "arrowDown");
276
277
 
277
278
  numInput.type = "text";
279
+ numInput.pattern = "\\d*";
278
280
  wrapper.appendChild(numInput);
279
281
  wrapper.appendChild(arrowUp);
280
282
  wrapper.appendChild(arrowDown);
@@ -348,17 +350,19 @@ function Flatpickr(element, config) {
348
350
 
349
351
  dayElement.dateObj = date;
350
352
 
351
- if (compareDates(date, self.now) === 0) dayElement.classList.add("today");
353
+ toggleClass(dayElement, "today", compareDates(date, self.now) === 0);
352
354
 
353
355
  if (dateIsEnabled) {
354
356
  dayElement.tabIndex = 0;
355
357
 
356
358
  if (isDateSelected(date)) {
357
359
  dayElement.classList.add("selected");
358
-
360
+ self.selectedDateElem = dayElement;
359
361
  if (self.config.mode === "range") {
360
- dayElement.classList.add(compareDates(date, self.selectedDates[0]) === 0 ? "startRange" : "endRange");
361
- } else self.selectedDateElem = dayElement;
362
+ toggleClass(dayElement, "startRange", compareDates(date, self.selectedDates[0]) === 0);
363
+
364
+ toggleClass(dayElement, "endRange", compareDates(date, self.selectedDates[1]) === 0);
365
+ }
362
366
  }
363
367
  } else {
364
368
  dayElement.classList.add("disabled");
@@ -381,7 +385,8 @@ function Flatpickr(element, config) {
381
385
  }
382
386
 
383
387
  function buildDays(year, month) {
384
- var firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;
388
+ var firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7,
389
+ isRangeMode = self.config.mode === "range";
385
390
 
386
391
  self.prevMonthDays = self.utils.getDaysinMonth((self.currentMonth - 1 + 12) % 12);
387
392
 
@@ -392,7 +397,7 @@ function Flatpickr(element, config) {
392
397
 
393
398
  if (self.config.weekNumbers && self.weekNumbers.firstChild) self.weekNumbers.textContent = "";
394
399
 
395
- if (self.config.mode === "range") {
400
+ if (isRangeMode) {
396
401
  // const dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
397
402
  self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
398
403
  self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - firstOfMonth) % daysInMonth);
@@ -415,6 +420,12 @@ function Flatpickr(element, config) {
415
420
  days.appendChild(createDay("nextMonthDay", new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth), dayNum));
416
421
  }
417
422
 
423
+ if (isRangeMode && self.selectedDates.length === 1 && days.childNodes[0]) {
424
+ self._hidePrevMonthArrow = self._hidePrevMonthArrow || self.minRangeDate > days.childNodes[0].dateObj;
425
+
426
+ self._hideNextMonthArrow = self._hideNextMonthArrow || self.maxRangeDate < days.childNodes[41].dateObj;
427
+ } else updateNavigationCurrentMonth();
428
+
418
429
  self.days.appendChild(days);
419
430
  return self.days;
420
431
  }
@@ -492,7 +503,6 @@ function Flatpickr(element, config) {
492
503
  self.minuteElement = minuteInput.childNodes[0];
493
504
 
494
505
  self.hourElement.tabIndex = self.minuteElement.tabIndex = 0;
495
- self.hourElement.pattern = self.minuteElement.pattern = "\\d*";
496
506
 
497
507
  self.hourElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.defaultHour);
498
508
 
@@ -521,7 +531,6 @@ function Flatpickr(element, config) {
521
531
  var secondInput = createNumberInput("flatpickr-second");
522
532
  self.secondElement = secondInput.childNodes[0];
523
533
 
524
- self.secondElement.pattern = self.hourElement.pattern;
525
534
  self.secondElement.value = self.latestSelectedDateObj ? self.pad(self.latestSelectedDateObj.getSeconds()) : "00";
526
535
 
527
536
  self.secondElement.step = self.minuteElement.step;
@@ -570,7 +579,12 @@ function Flatpickr(element, config) {
570
579
  }
571
580
 
572
581
  function changeMonth(value, is_offset) {
573
- self.currentMonth = typeof is_offset === "undefined" || is_offset ? self.currentMonth + value : value;
582
+ is_offset = typeof is_offset === "undefined" || is_offset;
583
+ var delta = is_offset ? value : value - self.currentMonth;
584
+
585
+ if (delta < 0 && self._hidePrevMonthArrow || delta > 0 && self._hideNextMonthArrow) return;
586
+
587
+ self.currentMonth += delta;
574
588
 
575
589
  if (self.currentMonth < 0 || self.currentMonth > 11) {
576
590
  self.currentYear += self.currentMonth > 11 ? 1 : -1;
@@ -629,11 +643,15 @@ function Flatpickr(element, config) {
629
643
 
630
644
  if (instance.timeContainer) instance.timeContainer.removeEventListener("transitionend", positionCalendar);
631
645
 
632
- if (instance.mobileInput && instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);else if (instance.calendarContainer && instance.calendarContainer.parentNode) instance.calendarContainer.parentNode.removeChild(instance.calendarContainer);
646
+ if (instance.mobileInput) {
647
+ if (instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);
648
+ delete instance.mobileInput;
649
+ } else if (instance.calendarContainer && instance.calendarContainer.parentNode) instance.calendarContainer.parentNode.removeChild(instance.calendarContainer);
633
650
 
634
651
  if (instance.altInput) {
635
652
  instance.input.type = "text";
636
653
  if (instance.altInput.parentNode) instance.altInput.parentNode.removeChild(instance.altInput);
654
+ delete instance.altInput;
637
655
  }
638
656
 
639
657
  instance.input.type = instance.input._type;
@@ -645,13 +663,9 @@ function Flatpickr(element, config) {
645
663
  }
646
664
 
647
665
  function isCalendarElem(elem) {
648
- var e = elem;
649
- while (e) {
650
- if (/flatpickr-day|flatpickr-calendar/.test(e.className)) return true;
651
- e = e.parentNode;
652
- }
666
+ if (self.config.appendTo && self.config.appendTo.contains(elem)) return true;
653
667
 
654
- return false;
668
+ return self.calendarContainer.contains(elem);
655
669
  }
656
670
 
657
671
  function documentClick(e) {
@@ -682,7 +696,10 @@ function Flatpickr(element, config) {
682
696
  function changeYear(newYear) {
683
697
  if (!newYear || self.currentYearElement.min && newYear < self.currentYearElement.min || self.currentYearElement.max && newYear > self.currentYearElement.max) return;
684
698
 
685
- self.currentYear = parseInt(newYear, 10) || self.currentYear;
699
+ var newYearNum = parseInt(newYear, 10),
700
+ isNewYear = self.currentYear !== newYearNum;
701
+
702
+ self.currentYear = newYearNum || self.currentYear;
686
703
 
687
704
  if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) {
688
705
  self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);
@@ -690,8 +707,10 @@ function Flatpickr(element, config) {
690
707
  self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
691
708
  }
692
709
 
693
- self.redraw();
694
- triggerEvent("YearChange");
710
+ if (isNewYear) {
711
+ self.redraw();
712
+ triggerEvent("YearChange");
713
+ }
695
714
  }
696
715
 
697
716
  function isEnabled(date, timeless) {
@@ -723,7 +742,7 @@ function Flatpickr(element, config) {
723
742
  }
724
743
 
725
744
  function onKeyDown(e) {
726
- if (self.isOpen) {
745
+ if (e.target === (self.altInput || self.input) && e.which === 13) selectDate(e);else if (self.isOpen && isCalendarElem(e.target)) {
727
746
  switch (e.which) {
728
747
  case 13:
729
748
  if (self.timeContainer && self.timeContainer.contains(e.target)) updateValue();else selectDate(e);
@@ -736,29 +755,40 @@ function Flatpickr(element, config) {
736
755
  break;
737
756
 
738
757
  case 37:
739
- if (e.target !== self.input & e.target !== self.altInput) changeMonth(-1);
758
+ if (e.target !== self.input & e.target !== self.altInput) {
759
+ changeMonth(-1);
760
+ self.currentMonthElement.focus();
761
+ }
740
762
  break;
741
763
 
742
764
  case 38:
743
- e.preventDefault();
744
- self.currentYear++;
745
- self.redraw();
765
+ if (!self.timeContainer || !self.timeContainer.contains(e.target)) {
766
+ e.preventDefault();
767
+ self.currentYear++;
768
+ self.redraw();
769
+ } else updateTime(e);
746
770
 
747
771
  break;
748
772
 
749
773
  case 39:
750
- if (e.target !== self.input & e.target !== self.altInput) changeMonth(1);
774
+ if (e.target !== self.input & e.target !== self.altInput) {
775
+ changeMonth(1);
776
+ self.currentMonthElement.focus();
777
+ }
751
778
  break;
752
779
 
753
780
  case 40:
754
- e.preventDefault();
755
- self.currentYear--;
756
- self.redraw();
781
+ if (!self.timeContainer || !self.timeContainer.contains(e.target)) {
782
+ e.preventDefault();
783
+ self.currentYear--;
784
+ self.redraw();
785
+ } else updateTime(e);
757
786
 
758
787
  break;
759
788
 
760
789
  default:
761
790
  break;
791
+
762
792
  }
763
793
  }
764
794
  }
@@ -871,7 +901,7 @@ function Flatpickr(element, config) {
871
901
  function parseConfig() {
872
902
  var boolOpts = ["utc", "wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
873
903
 
874
- var hooks = ["onChange", "onClose", "onDayCreate", "onOpen", "onReady", "onValueUpdate"];
904
+ var hooks = ["onChange", "onClose", "onDayCreate", "onMonthChange", "onOpen", "onReady", "onValueUpdate", "onYearChange"];
875
905
 
876
906
  self.config = Object.create(Flatpickr.defaultConfig);
877
907
 
@@ -891,6 +921,9 @@ function Flatpickr(element, config) {
891
921
 
892
922
  var userConfig = _extends({}, self.instanceConfig, JSON.parse(JSON.stringify(self.element.dataset || {})));
893
923
 
924
+ self.config.parseDate = userConfig.parseDate;
925
+ self.config.formatDate = userConfig.formatDate;
926
+
894
927
  _extends(self.config, userConfig);
895
928
 
896
929
  for (var i = 0; i < boolOpts.length; i++) {
@@ -965,6 +998,8 @@ function Flatpickr(element, config) {
965
998
 
966
999
  function selectDate(e) {
967
1000
  e.preventDefault();
1001
+ e.stopPropagation();
1002
+
968
1003
  if (self.config.allowInput && e.which === 13 && e.target === (self.altInput || self.input)) return self.setDate((self.altInput || self.input).value), e.target.blur();
969
1004
 
970
1005
  if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
@@ -980,7 +1015,9 @@ function Flatpickr(element, config) {
980
1015
  if (self.selectedDates.length === 2) self.clear();
981
1016
 
982
1017
  self.selectedDates.push(selectedDate);
983
- self.selectedDates.sort(function (a, b) {
1018
+
1019
+ // unless selecting same date twice, sort ascendingly
1020
+ if (compareDates(selectedDate, self.selectedDates[0], true) !== 0) self.selectedDates.sort(function (a, b) {
984
1021
  return a.getTime() - b.getTime();
985
1022
  });
986
1023
  }
@@ -988,9 +1025,13 @@ function Flatpickr(element, config) {
988
1025
  setHoursFromInputs();
989
1026
 
990
1027
  if (selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range") {
1028
+ var isNewYear = self.currentYear !== selectedDate.getFullYear();
991
1029
  self.currentYear = selectedDate.getFullYear();
992
1030
  self.currentMonth = selectedDate.getMonth();
993
- updateNavigationCurrentMonth();
1031
+
1032
+ if (isNewYear) triggerEvent("YearChange");
1033
+
1034
+ triggerEvent("MonthChange");
994
1035
  }
995
1036
 
996
1037
  buildDays();
@@ -1013,6 +1054,10 @@ function Flatpickr(element, config) {
1013
1054
  } else updateNavigationCurrentMonth();
1014
1055
  }
1015
1056
 
1057
+ if (e.which === 13 && self.config.enableTime) setTimeout(function () {
1058
+ return self.hourElement.focus();
1059
+ }, 451);
1060
+
1016
1061
  if (self.config.mode === "single" && !self.config.enableTime) self.close();
1017
1062
 
1018
1063
  triggerEvent("Change");
@@ -1070,7 +1115,7 @@ function Flatpickr(element, config) {
1070
1115
  setHoursFromDate();
1071
1116
  updateValue();
1072
1117
 
1073
- if (triggerChange === true) triggerEvent("Change");
1118
+ if (triggerChange !== false) triggerEvent("Change");
1074
1119
  }
1075
1120
 
1076
1121
  function setupDates() {
@@ -1090,12 +1135,12 @@ function Flatpickr(element, config) {
1090
1135
  self.selectedDates = [];
1091
1136
  self.now = new Date();
1092
1137
 
1093
- setSelectedDate(self.config.defaultDate || self.input.value);
1094
-
1095
1138
  if (self.config.disable.length) self.config.disable = parseDateRules(self.config.disable);
1096
1139
 
1097
1140
  if (self.config.enable.length) self.config.enable = parseDateRules(self.config.enable);
1098
1141
 
1142
+ setSelectedDate(self.config.defaultDate || self.input.value);
1143
+
1099
1144
  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;
1100
1145
 
1101
1146
  self.currentYear = initialDate.getFullYear();
@@ -1142,6 +1187,11 @@ function Flatpickr(element, config) {
1142
1187
  /* istanbul ignore next */
1143
1188
  function setupFormats() {
1144
1189
  self.formats = {
1190
+ // get the date in UTC
1191
+ Z: function Z(date) {
1192
+ return date.toISOString();
1193
+ },
1194
+
1145
1195
  // weekday name, short, e.g. Thu
1146
1196
  D: function D(date) {
1147
1197
  return self.l10n.weekdays.shorthand[self.formats.w(date)];
@@ -1438,9 +1488,15 @@ function Flatpickr(element, config) {
1438
1488
 
1439
1489
  function timeWrapper(e) {
1440
1490
  e.preventDefault();
1441
- if (e && ((e.target.value || e.target.textContent).length >= 2 || // typed two digits
1442
- e.type !== "keydown" && e.type !== "input" // scroll event
1443
- )) e.target.blur();
1491
+
1492
+ var isKeyDown = e.type === "keydown",
1493
+ isWheel = e.type === "wheel";
1494
+
1495
+ if (e.type !== "input" && !isKeyDown && (e.target.value || e.target.textContent).length >= 2 // typed two digits
1496
+ ) {
1497
+ e.target.focus();
1498
+ e.target.blur();
1499
+ }
1444
1500
 
1445
1501
  if (self.amPM && e.target === self.amPM) return e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
1446
1502
 
@@ -1448,23 +1504,23 @@ function Flatpickr(element, config) {
1448
1504
  max = Number(e.target.max),
1449
1505
  step = Number(e.target.step),
1450
1506
  curValue = parseInt(e.target.value, 10),
1451
- delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));
1507
+ delta = !isKeyDown ? Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)) || 0 : e.which === 38 ? 1 : -1;
1452
1508
 
1453
- var newValue = Number(curValue);
1509
+ var newValue = curValue + (isWheel || isKeyDown) * step * delta;
1454
1510
 
1455
- if (e.type === "wheel") newValue = curValue + step * delta;
1511
+ if (e.target.value.length === 2) {
1512
+ var isHourElem = e.target === self.hourElement;
1456
1513
 
1457
- if (e.type !== "input" || e.target.value.length === 2) {
1458
1514
  if (newValue < min) {
1459
- newValue = max + newValue + (e.target !== self.hourElement) + (e.target === self.hourElement && !self.amPM);
1515
+ newValue = max + newValue + !isHourElem + (isHourElem && !self.amPM);
1460
1516
  } else if (newValue > max) {
1461
1517
  newValue = e.target === self.hourElement ? newValue - max - !self.amPM : min;
1462
1518
  }
1463
1519
 
1464
- if (self.amPM && e.target === self.hourElement && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.textContent === "PM" ? "AM" : "PM";
1520
+ if (self.amPM && isHourElem && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.textContent === "PM" ? "AM" : "PM";
1465
1521
 
1466
1522
  e.target.value = self.pad(newValue);
1467
- } else e.target.value = newValue;
1523
+ }
1468
1524
  }
1469
1525
 
1470
1526
  init();
@@ -1603,7 +1659,11 @@ Flatpickr.defaultConfig = {
1603
1659
 
1604
1660
  onValueUpdate: [],
1605
1661
 
1606
- onDayCreate: []
1662
+ onDayCreate: [],
1663
+
1664
+ onMonthChange: [],
1665
+
1666
+ onYearChange: []
1607
1667
  };
1608
1668
 
1609
1669
  /* istanbul ignore next */
@@ -1656,13 +1716,13 @@ Flatpickr.prototype = {
1656
1716
  if (!date) return null;
1657
1717
 
1658
1718
  var dateTimeRegex = /(\d+)/g,
1659
- timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p)?/i,
1719
+ timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p|A|P)?/i,
1660
1720
  timestamp = /^(\d+)$/g,
1661
1721
  date_orig = date;
1662
1722
 
1663
1723
  if (date.toFixed || timestamp.test(date)) // timestamp
1664
1724
  date = new Date(date);else if (typeof date === "string") {
1665
- date = date.trim().toLowerCase();
1725
+ date = date.trim();
1666
1726
 
1667
1727
  if (date === "today") {
1668
1728
  date = new Date();
@@ -1678,8 +1738,8 @@ Flatpickr.prototype = {
1678
1738
  } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
1679
1739
  date = new Date(date);else if (dateTimeRegex.test(date) && /^[0-9]/.test(date)) {
1680
1740
  var d = date.match(dateTimeRegex),
1681
- isAM = /(am)$/.test(date),
1682
- isPM = /(pm)$/.test(date);
1741
+ isAM = /(am|AM)$/.test(date),
1742
+ isPM = /(pm|PM)$/.test(date);
1683
1743
 
1684
1744
  date = new Date(d[0] + "/" + (d[1] || 1) + "/" + (d[2] || 1) + " " + (d[3] || 0) + ":" + (d[4] || 0) + ":" + (d[5] || 0));
1685
1745