flatpickr 2.2.3.0 → 2.2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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"