flatpickr 2.2.3.0 → 2.2.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5194b5565f19ea46148e5aef75ba6bc6563a1da
4
- data.tar.gz: 87efdf71889a212a3f5179a0f878fe25120c704a
3
+ metadata.gz: 4b72358023f1a34f6ba67d13f1e4718e21fc88f0
4
+ data.tar.gz: 6316e78f69c7a4d45e230f57707bc5ee87b86f81
5
5
  SHA512:
6
- metadata.gz: 8bbcad7c559a18b835788183812f2e614138c577863e6fd21d5da7476fb25a83b94643b459faaee923afe85eb7249b022bc3ca63cc280df12b9ec0bd27f51764
7
- data.tar.gz: dbd03159a5f8eca74f8d5be1d1b72e64206283734de6c15fbc5fc8db81720c4a09018100acb077827b59b9902f508836280e3af865e47134528b056b23b83e2f
6
+ metadata.gz: a060d9dbad8ca861f01fd9572e86bd2cd0438412801faf446dc11d9783ad2126e8de7e559718ddca7541f8d1d121ff5af1b5b8da5699dd4c158cb7c8bc90fd73
7
+ data.tar.gz: ef96d6f8adce50e4f93be5bb202c9d4692d3b07869f960e7a5e3be18593a67297b7cefbe01b03c6e73a027fd0c23e85109ac9fc83024af8523412c86d82910e5
data/Rakefile CHANGED
@@ -10,10 +10,10 @@ namespace :flatpickr do
10
10
  namespace :assets do
11
11
  desc 'Update Flatpickr\'s assets.'
12
12
  task update: :clean do
13
- version = Flatpickr::VERSION.sub(/.\d+$/, '')
13
+ version = ARGV[1] || "v#{Flatpickr::VERSION.sub(/.\d+$/, '')}"
14
14
 
15
15
  sh 'git clone git@github.com:chmln/flatpickr.git flatpickr_source'
16
- sh "cd flatpickr_source && git checkout tags/v#{version}"
16
+ sh "cd flatpickr_source && git checkout tags/#{version}"
17
17
 
18
18
  sh 'cp flatpickr_source/dist/flatpickr.js vendor/assets/javascripts/flatpickr.js'
19
19
  sh 'cp -R flatpickr_source/dist/l10n/ vendor/assets/javascripts/flatpickr/l10n/'
data/flatpickr.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['zoran1991@gmail.com']
11
11
 
12
12
  spec.summary = %q{Flatpickr packaged for use in Rails projects.}
13
- spec.homepage = 'https://github.com/zokioki/flatpickr_rails'
13
+ spec.homepage = 'https://github.com/zokioki/flatpickr-rails'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -1,3 +1,3 @@
1
1
  module Flatpickr
2
- VERSION = '2.2.3.0'
2
+ VERSION = '2.2.4.0'
3
3
  end
@@ -37,7 +37,7 @@ function Flatpickr(element, config) {
37
37
  self.setDate = setDate;
38
38
  self.toggle = toggle;
39
39
 
40
- self.isMobile = !self.config.disableMobile && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
40
+ self.isMobile = !self.config.disableMobile && !self.config.inline && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
41
41
 
42
42
  if (!self.isMobile) build();
43
43
 
@@ -47,20 +47,24 @@ function Flatpickr(element, config) {
47
47
 
48
48
  self.maxDateHasTime = self.config.maxDate && (self.config.maxDate.getHours() || self.config.maxDate.getMinutes() || self.config.maxDate.getSeconds());
49
49
 
50
- if (!self.isMobile) Object.defineProperty(self, "dateIsPicked", {
51
- set: function set(bool) {
52
- if (bool) return self.calendarContainer.classList.add("dateIsPicked");
53
- self.calendarContainer.classList.remove("dateIsPicked");
54
- }
55
- });
50
+ if (!self.isMobile) {
51
+ Object.defineProperty(self, "dateIsPicked", {
52
+ set: function set(bool) {
53
+ if (bool) return self.calendarContainer.classList.add("dateIsPicked");
54
+ self.calendarContainer.classList.remove("dateIsPicked");
55
+ }
56
+ });
57
+ }
56
58
 
57
- self.dateIsPicked = self.selectedDates.length > 0;
59
+ self.dateIsPicked = self.selectedDates.length > 0 || self.config.noCalendar;
58
60
 
59
61
  if (self.selectedDates.length) {
60
62
  if (self.config.enableTime) setHoursFromDate();
61
63
  updateValue();
62
64
  }
63
65
 
66
+ if (self.config.weekNumbers) self.calendarContainer.style.width = self.days.offsetWidth + self.weekWrapper.offsetWidth + 2 + "px";
67
+
64
68
  triggerEvent("Ready");
65
69
  }
66
70
 
@@ -81,8 +85,8 @@ function Flatpickr(element, config) {
81
85
  if (!self.config.enableTime) return;
82
86
 
83
87
  var hours = parseInt(self.hourElement.value, 10) || 0,
84
- minutes = (60 + (parseInt(self.minuteElement.value, 10) || 0)) % 60,
85
- seconds = self.config.enableSeconds ? (60 + parseInt(self.secondElement.value, 10) || 0) % 60 : 0;
88
+ minutes = parseInt(self.minuteElement.value, 10) || 0,
89
+ seconds = self.config.enableSeconds ? parseInt(self.secondElement.value, 10) || 0 : 0;
86
90
 
87
91
  if (self.amPM) hours = hours % 12 + 12 * (self.amPM.innerHTML === "PM");
88
92
 
@@ -104,7 +108,9 @@ function Flatpickr(element, config) {
104
108
  }
105
109
 
106
110
  function setHours(hours, minutes, seconds) {
107
- if (self.selectedDates.length) self.selectedDates[self.selectedDates.length - 1].setHours(hours % 24, minutes, seconds || 0, 0);
111
+ if (self.selectedDates.length) {
112
+ self.selectedDates[self.selectedDates.length - 1].setHours(hours % 24, minutes, seconds || 0, 0);
113
+ }
108
114
 
109
115
  if (!self.config.enableTime || self.isMobile) return;
110
116
 
@@ -135,7 +141,7 @@ function Flatpickr(element, config) {
135
141
 
136
142
  if (self.isMobile) return setupMobile();
137
143
 
138
- self.debouncedResize = debounce(onResize, 100);
144
+ self.debouncedResize = debounce(onResize, 50);
139
145
  self.triggerChange = function () {
140
146
  return triggerEvent("Change");
141
147
  };
@@ -146,7 +152,9 @@ function Flatpickr(element, config) {
146
152
  document.addEventListener("keydown", onKeyDown);
147
153
  window.addEventListener("resize", self.debouncedResize);
148
154
 
149
- document.addEventListener("click", documentClick);
155
+ var clickEvent = typeof window.ontouchstart !== "undefined" ? "touchstart" : "click";
156
+
157
+ document.addEventListener(clickEvent, documentClick);
150
158
  document.addEventListener("blur", documentClick);
151
159
 
152
160
  if (self.config.clickOpens) (self.altInput || self.input).addEventListener("focus", open);
@@ -229,8 +237,8 @@ function Flatpickr(element, config) {
229
237
  try {
230
238
  input.dispatchEvent(new Event("input", { "bubbles": true }));
231
239
  } catch (e) {
232
- var ev = document.createEvent('CustomEvent');
233
- ev.initCustomEvent('input', true, true, {});
240
+ var ev = document.createEvent("CustomEvent");
241
+ ev.initCustomEvent("input", true, true, {});
234
242
  input.dispatchEvent(ev);
235
243
  }
236
244
  }
@@ -287,6 +295,44 @@ function Flatpickr(element, config) {
287
295
  } else document.body.appendChild(self.calendarContainer);
288
296
  }
289
297
 
298
+ function createDay(className, date, dayNumber) {
299
+ var dateIsEnabled = isEnabled(date),
300
+ dayElement = createElement("span", "flatpickr-day " + className, date.getDate());
301
+
302
+ dayElement.dateObj = date;
303
+
304
+ if (compareDates(date, self.now) === 0) dayElement.classList.add("today");
305
+
306
+ if (dateIsEnabled) {
307
+ dayElement.tabIndex = 0;
308
+
309
+ if (isDateSelected(date)) {
310
+ dayElement.classList.add("selected");
311
+
312
+ if (self.config.mode === "range") {
313
+ dayElement.classList.add(compareDates(date, self.selectedDates[0]) === 0 ? "startRange" : "endRange");
314
+ } else self.selectedDateElem = dayElement;
315
+ }
316
+ } else {
317
+ dayElement.classList.add("disabled");
318
+ if (self.selectedDates[0] && date > self.minRangeDate && date < self.selectedDates[0]) self.minRangeDate = date;else if (self.selectedDates[0] && date < self.maxRangeDate && date > self.selectedDates[0]) self.maxRangeDate = date;
319
+ }
320
+
321
+ if (self.config.mode === "range") {
322
+ if (isDateInRange(date) && !isDateSelected(date)) dayElement.classList.add("inRange");
323
+
324
+ if (self.selectedDates.length === 1 && (date < self.minRangeDate || date > self.maxRangeDate)) dayElement.classList.add("notAllowed");
325
+ }
326
+
327
+ if (self.config.weekNumbers && className !== "prevMonthDay" && dayNumber % 7 === 1) {
328
+ self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(date) + "</span>");
329
+ }
330
+
331
+ triggerEvent("DayCreate", dayElement);
332
+
333
+ return dayElement;
334
+ }
335
+
290
336
  function buildDays() {
291
337
  if (!self.days) {
292
338
  self.days = createElement("div", "flatpickr-days");
@@ -300,14 +346,12 @@ function Flatpickr(element, config) {
300
346
  var daysInMonth = self.utils.getDaysinMonth(),
301
347
  days = document.createDocumentFragment();
302
348
 
303
- var dayNumber = self.prevMonthDays + 1 - self.firstOfMonth,
304
- currentDate = void 0,
305
- dateIsDisabled = void 0;
349
+ var dayNumber = self.prevMonthDays + 1 - self.firstOfMonth;
306
350
 
307
351
  if (self.config.weekNumbers) self.weekNumbers.innerHTML = "";
308
352
 
309
353
  if (self.config.mode === "range") {
310
- var dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
354
+ // const dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
311
355
  self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
312
356
  self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - self.firstOfMonth) % daysInMonth);
313
357
  }
@@ -316,68 +360,19 @@ function Flatpickr(element, config) {
316
360
 
317
361
  // prepend days from the ending of previous month
318
362
  for (var i = 0; dayNumber <= self.prevMonthDays; i++, dayNumber++) {
319
- var curDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber, 0, 0, 0, 0, 0),
320
- dateIsEnabled = isEnabled(curDate),
321
- dayElement = createElement("span", "flatpickr-day prevMonthDay" + (!dateIsEnabled ? " disabled" : "") + (isDateInRange(curDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (curDate < self.minRangeDate || curDate > self.maxRangeDate) ? " notAllowed" : "") + (isDateSelected(curDate) !== false ? " selected" : ""), dayNumber);
322
-
323
- dayElement.dateObj = curDate;
324
-
325
- if (dateIsEnabled) dayElement.tabIndex = 0;else if (self.selectedDates[0] && curDate > self.minRangeDate && curDate < self.selectedDates[0]) self.minRangeDate = curDate;else if (self.selectedDates[0] && curDate < self.maxRangeDate && curDate > self.selectedDates[0]) self.maxRangeDate = curDate;
326
-
327
- triggerEvent("DayCreate", dayElement);
328
- days.appendChild(dayElement);
363
+ days.appendChild(createDay("prevMonthDay", new Date(self.currentYear, self.currentMonth - 1, dayNumber), dayNumber));
329
364
  }
330
365
 
331
366
  // Start at 1 since there is no 0th day
332
367
  for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++) {
333
- currentDate = new Date(self.currentYear, self.currentMonth, dayNumber, 0, 0, 0, 0, 0);
334
-
335
- if (self.config.weekNumbers && dayNumber % 7 === 1) {
336
- self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(currentDate) + "</span>");
337
- }
338
-
339
- dateIsDisabled = !isEnabled(currentDate);
340
-
341
- var _dayElement = createElement("span", dateIsDisabled ? "flatpickr-day disabled" : "flatpickr-day" + (isDateInRange(currentDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (currentDate < self.minRangeDate || currentDate > self.maxRangeDate) ? " notAllowed" : ""), dayNumber);
342
-
343
- _dayElement.dateObj = currentDate;
344
-
345
- if (compareDates(currentDate, self.now) === 0) _dayElement.classList.add("today");
346
-
347
- if (!dateIsDisabled) {
348
- _dayElement.tabIndex = 0;
349
-
350
- if (isDateSelected(currentDate)) {
351
- _dayElement.classList.add("selected");
352
- self.selectedDateElem = _dayElement;
353
-
354
- if (self.config.mode === "range") {
355
- _dayElement.className += compareDates(currentDate, self.selectedDates[0]) === 0 ? " startRange" : self.selectedDates.length > 1 ? " endRange" : "";
356
- }
357
- }
358
- } else if (self.selectedDates[0] && currentDate > self.minRangeDate && currentDate < self.selectedDates[0]) self.minRangeDate = currentDate;else if (self.selectedDates[0] && currentDate < self.maxRangeDate && currentDate > self.selectedDates[0]) self.maxRangeDate = currentDate;
359
-
360
- triggerEvent("DayCreate", _dayElement);
361
- days.appendChild(_dayElement);
368
+ days.appendChild(createDay("", new Date(self.currentYear, self.currentMonth, dayNumber), dayNumber));
362
369
  }
363
370
 
364
371
  // append days from the next month
365
372
  for (var dayNum = daysInMonth + 1; dayNum <= 42 - self.firstOfMonth; dayNum++) {
366
- var _curDate = new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth, 0, 0, 0, 0, 0),
367
- _dateIsEnabled = isEnabled(_curDate),
368
- _dayElement2 = createElement("span", "flatpickr-day nextMonthDay" + (!_dateIsEnabled ? " disabled" : "") + (isDateInRange(_curDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (_curDate < self.minRangeDate || _curDate > self.maxRangeDate) ? " notAllowed" : "") + (isDateSelected(_curDate) !== false ? " selected" : ""), dayNum % daysInMonth);
369
-
370
- _dayElement2.dateObj = _curDate;
371
-
372
- if (self.config.weekNumbers && dayNum % 7 === 1) {
373
- self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(_curDate) + "</span>");
374
- }
375
-
376
- if (_dateIsEnabled) _dayElement2.tabIndex = 0;else if (self.selectedDates[0] && _curDate > self.minRangeDate && _curDate < self.selectedDates[0]) self.minRangeDate = _curDate;else if (self.selectedDates[0] && _curDate < self.maxRangeDate && _curDate > self.selectedDates[0]) self.maxRangeDate = _curDate;
377
-
378
- triggerEvent("DayCreate", _dayElement2);
379
- days.appendChild(_dayElement2);
373
+ days.appendChild(createDay("nextMonthDay", new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth), dayNum));
380
374
  }
375
+
381
376
  self.days.appendChild(days);
382
377
  return self.days;
383
378
  }
@@ -442,11 +437,11 @@ function Flatpickr(element, config) {
442
437
  self.hourElement.step = self.config.hourIncrement;
443
438
  self.minuteElement.step = self.config.minuteIncrement;
444
439
 
445
- self.hourElement.min = -(self.config.time_24hr ? 1 : 0);
446
- self.hourElement.max = self.config.time_24hr ? 24 : 13;
440
+ self.hourElement.min = self.config.time_24hr ? 0 : 1;
441
+ self.hourElement.max = self.config.time_24hr ? 23 : 12;
447
442
 
448
- self.minuteElement.min = -self.minuteElement.step;
449
- self.minuteElement.max = 60;
443
+ self.minuteElement.min = 0;
444
+ self.minuteElement.max = 59;
450
445
 
451
446
  self.hourElement.title = self.minuteElement.title = self.l10n.scrollTitle;
452
447
 
@@ -454,6 +449,8 @@ function Flatpickr(element, config) {
454
449
  self.timeContainer.appendChild(separator);
455
450
  self.timeContainer.appendChild(minuteInput);
456
451
 
452
+ if (self.config.time_24hr) self.timeContainer.classList.add("time24hr");
453
+
457
454
  if (self.config.enableSeconds) {
458
455
  self.timeContainer.classList.add("hasSeconds");
459
456
 
@@ -503,6 +500,7 @@ function Flatpickr(element, config) {
503
500
  self.weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
504
501
  self.weekNumbers = createElement("div", "flatpickr-weeks");
505
502
  self.weekWrapper.appendChild(self.weekNumbers);
503
+
506
504
  return self.weekWrapper;
507
505
  }
508
506
 
@@ -519,6 +517,8 @@ function Flatpickr(element, config) {
519
517
  }
520
518
 
521
519
  function clear() {
520
+ var triggerChangeEvent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
521
+
522
522
  self.input.value = "";
523
523
 
524
524
  if (self.altInput) self.altInput.value = "";
@@ -529,7 +529,10 @@ function Flatpickr(element, config) {
529
529
  self.dateIsPicked = false;
530
530
 
531
531
  self.redraw();
532
- triggerEvent("Change");
532
+
533
+ if (triggerChangeEvent !== false)
534
+ // triggerChangeEvent is true (default) or an Event
535
+ triggerEvent("Change");
533
536
  }
534
537
 
535
538
  function close() {
@@ -545,7 +548,7 @@ function Flatpickr(element, config) {
545
548
 
546
549
  function destroy(instance) {
547
550
  instance = instance || self;
548
- instance.clear();
551
+ instance.clear(false);
549
552
 
550
553
  document.removeEventListener("keydown", onKeyDown);
551
554
  window.removeEventListener("resize", instance.debouncedResize);
@@ -589,6 +592,8 @@ function Flatpickr(element, config) {
589
592
  }
590
593
 
591
594
  function formatDate(frmt, dateObj) {
595
+ if (self.config.formatDate) return self.config.formatDate(frmt, dateObj);
596
+
592
597
  var chars = frmt.split("");
593
598
  return chars.map(function (c, i) {
594
599
  return self.formats[c] && chars[i - 1] !== "\\" ? self.formats[c](dateObj) : c !== "\\" ? c : "";
@@ -603,7 +608,11 @@ function Flatpickr(element, config) {
603
608
  } else if (newYear && (!self.currentYearElement.min || newYear >= self.currentYearElement.min) && (!self.currentYearElement.max || newYear <= self.currentYearElement.max)) {
604
609
  self.currentYear = parseInt(newYear, 10) || self.currentYear;
605
610
 
606
- if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
611
+ if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) {
612
+ self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);
613
+ } else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) {
614
+ self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
615
+ }
607
616
 
608
617
  self.redraw();
609
618
  triggerEvent("YearChange");
@@ -685,6 +694,7 @@ function Flatpickr(element, config) {
685
694
  if (self.selectedDates.length !== 1 || !e.target.classList.contains("flatpickr-day")) return;
686
695
 
687
696
  var hoverDate = e.target.dateObj,
697
+ initialDate = parseDate(self.selectedDates[0], true),
688
698
  rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
689
699
  rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
690
700
  containsDisabled = false;
@@ -697,15 +707,27 @@ function Flatpickr(element, config) {
697
707
  }
698
708
 
699
709
  for (var timestamp = self.days.childNodes[0].dateObj.getTime(), i = 0; i < 42; i++, timestamp += self.utils.duration.DAY) {
700
- if (timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime()) {
710
+ var outOfRange = timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime();
711
+
712
+ if (outOfRange) {
701
713
  self.days.childNodes[i].classList.add("notAllowed");
702
- self.days.childNodes[i].classList.remove("inRange");
703
- } else if (!containsDisabled && timestamp > Math.max(self.minRangeDate.getTime(), rangeStartDate) && timestamp < Math.min(self.maxRangeDate.getTime(), rangeEndDate)) self.days.childNodes[i].classList.add("inRange");else self.days.childNodes[i].classList.remove("inRange");
714
+ self.days.childNodes[i].classList.remove("inRange", "startRange", "endRange");
715
+ continue;
716
+ } else if (containsDisabled && !outOfRange) continue;
717
+
718
+ self.days.childNodes[i].classList.remove("startRange", "inRange", "endRange", "notAllowed");
719
+
720
+ var minRangeDate = Math.max(self.minRangeDate.getTime(), rangeStartDate),
721
+ maxRangeDate = Math.min(self.maxRangeDate.getTime(), rangeEndDate);
722
+
723
+ e.target.classList.add(hoverDate < self.selectedDates[0] ? "startRange" : "endRange");
724
+
725
+ 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");
704
726
  }
705
727
  }
706
728
 
707
729
  function onResize() {
708
- if (self.isOpen && !self.config.inline && !self.config.static) positionCalendar();
730
+ if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar();
709
731
  }
710
732
 
711
733
  function open(e) {
@@ -725,7 +747,7 @@ function Flatpickr(element, config) {
725
747
 
726
748
  self.calendarContainer.classList.add("open");
727
749
 
728
- if (!self.config.static) positionCalendar();
750
+ if (!self.config.static && !self.config.inline) positionCalendar();
729
751
 
730
752
  self.isOpen = true;
731
753
 
@@ -758,9 +780,7 @@ function Flatpickr(element, config) {
758
780
  self.minDateHasTime = this._minDate.getHours() || this._minDate.getMinutes() || this._minDate.getSeconds();
759
781
 
760
782
  self.currentYearElement.min = this._minDate.getFullYear();
761
- } else {
762
- self.currentYearElement.removeAttribute("min");
763
- }
783
+ } else self.currentYearElement.removeAttribute("min");
764
784
 
765
785
  self.currentYearElement.disabled = this._maxDate && this._minDate && this._maxDate.getFullYear() === this._minDate.getFullYear();
766
786
  }
@@ -869,7 +889,7 @@ function Flatpickr(element, config) {
869
889
  self.calendarContainer.classList.add("arrowTop");
870
890
  }
871
891
 
872
- if (!self.config.inline && !self.config.static) {
892
+ if (!self.config.static && !self.config.inline) {
873
893
  self.calendarContainer.style.top = top + "px";
874
894
  self.calendarContainer.style.left = left + "px";
875
895
  }
@@ -917,11 +937,10 @@ function Flatpickr(element, config) {
917
937
 
918
938
  buildDays();
919
939
 
920
- if (self.minDateHasTime && self.config.enableTime && compareDates(selectedDate, self.config.minDate) === 0) {
921
- setHoursFromDate(self.config.minDate);
922
- }
940
+ if (self.minDateHasTime && self.config.enableTime && compareDates(selectedDate, self.config.minDate) === 0) setHoursFromDate(self.config.minDate);
923
941
 
924
942
  updateValue();
943
+
925
944
  setTimeout(function () {
926
945
  return self.dateIsPicked = true;
927
946
  }, 50);
@@ -970,7 +989,7 @@ function Flatpickr(element, config) {
970
989
  break;
971
990
 
972
991
  case "range":
973
- self.selectedDates = inputDate.split(" to ").map(parseDate);
992
+ self.selectedDates = inputDate.split(self.l10n.rangeSeparator).map(parseDate);
974
993
  break;
975
994
 
976
995
  default:
@@ -997,7 +1016,7 @@ function Flatpickr(element, config) {
997
1016
  var month = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : self.currentMonth;
998
1017
  var yr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : self.currentYear;
999
1018
 
1000
- if (month === 1 && yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0) return 29;
1019
+ if (month === 1 && (yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0)) return 29;
1001
1020
  return self.l10n.daysInMonth[month];
1002
1021
  },
1003
1022
 
@@ -1201,7 +1220,7 @@ function Flatpickr(element, config) {
1201
1220
 
1202
1221
  function isDateInRange(date) {
1203
1222
  if (self.config.mode !== "range" || self.selectedDates.length < 2) return false;
1204
- return date > self.selectedDates[0] && date < self.selectedDates[1];
1223
+ return compareDates(date, self.selectedDates[0]) >= 0 && compareDates(date, self.selectedDates[1]) <= 0;
1205
1224
  }
1206
1225
 
1207
1226
  function updateNavigationCurrentMonth() {
@@ -1230,7 +1249,7 @@ function Flatpickr(element, config) {
1230
1249
  self.mobileInput.value = self.selectedDates.length ? formatDate(self.mobileFormatStr, latestSelectedDateObj()) : "";
1231
1250
  }
1232
1251
 
1233
- var joinChar = self.config.mode !== "range" ? "; " : " to ";
1252
+ var joinChar = self.config.mode !== "range" ? "; " : self.l10n.rangeSeparator;
1234
1253
 
1235
1254
  self.input.value = self.selectedDates.map(function (dObj) {
1236
1255
  return formatDate(self.config.dateFormat, dObj);
@@ -1289,31 +1308,34 @@ function Flatpickr(element, config) {
1289
1308
  function compareDates(date1, date2) {
1290
1309
  if (!(date1 instanceof Date) || !(date2 instanceof Date)) return false;
1291
1310
 
1292
- return date1.getDate() - date2.getDate() + 99 * (date1.getMonth() - date2.getMonth()) + // amplify year/month diff
1293
- 999 * (date1.getFullYear() - date2.getFullYear());
1311
+ return new Date(date1.getTime()).setHours(0, 0, 0, 0) - new Date(date2.getTime()).setHours(0, 0, 0, 0);
1294
1312
  }
1295
1313
 
1296
1314
  function timeWrapper(e) {
1297
1315
  e.preventDefault();
1298
- if (e && ((e.target.value || e.target.textContent).length >= 2 || e.type !== "keydown" && e.type !== "input")) e.target.blur();
1316
+ if (e && ((e.target.value || e.target.textContent).length >= 2 || // typed two digits
1317
+ e.type !== "keydown" && e.type !== "input" // scroll event
1318
+ )) e.target.blur();
1299
1319
 
1300
- if (e.target.className === "flatpickr-am-pm") {
1301
- e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
1302
- return;
1303
- }
1320
+ if (self.amPM && e.target === self.amPM) return e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
1304
1321
 
1305
- var min = parseInt(e.target.min, 10),
1306
- max = parseInt(e.target.max, 10),
1307
- step = parseInt(e.target.step, 10),
1308
- value = parseInt(e.target.value, 10);
1322
+ var min = Number(e.target.min),
1323
+ max = Number(e.target.max),
1324
+ step = Number(e.target.step),
1325
+ curValue = parseInt(e.target.value, 10),
1326
+ delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));
1309
1327
 
1310
- var newValue = value;
1328
+ var newValue = Number(curValue);
1311
1329
 
1312
- if (e.type === "wheel") newValue = value + step * Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));else if (e.type === "keydown") newValue = value + step * (e.which === 38 ? 1 : -1);
1330
+ if (e.type === "wheel") newValue = curValue + step * delta;else if (e.type === "keydown") newValue = curValue + step * (e.which === 38 ? 1 : -1);
1313
1331
 
1314
- if (newValue <= min) newValue = max - step;else if (newValue >= max) newValue = min + step;
1332
+ if (newValue < min) {
1333
+ newValue = max + newValue + (e.target !== self.hourElement) + (e.target === self.hourElement && !self.amPM);
1334
+ } else if (newValue > max) {
1335
+ newValue = e.target === self.hourElement ? newValue - max - !self.amPM : min;
1336
+ }
1315
1337
 
1316
- if (self.amPM && (value === 11 && newValue === 12 || value === 12 && newValue === 11)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
1338
+ if (self.amPM && e.target === self.hourElement && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
1317
1339
 
1318
1340
  e.target.value = self.pad(newValue);
1319
1341
  }
@@ -1378,6 +1400,9 @@ Flatpickr.defaultConfig = {
1378
1400
  // dateparser that transforms a given string to a date object
1379
1401
  parseDate: null,
1380
1402
 
1403
+ // dateformatter that transforms a given date object to a string, according to passed format
1404
+ formatDate: null,
1405
+
1381
1406
  getWeek: function getWeek(givenDate) {
1382
1407
  var date = new Date(givenDate.getTime());
1383
1408
  date.setHours(0, 0, 0, 0);
@@ -1477,6 +1502,7 @@ Flatpickr.l10ns = {
1477
1502
  return "th";
1478
1503
  }
1479
1504
  },
1505
+ rangeSeparator: " to ",
1480
1506
  weekAbbreviation: "Wk",
1481
1507
  scrollTitle: "Scroll to increment",
1482
1508
  toggleTitle: "Click to toggle"