PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 1.6.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v1.6.3
3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / assets / js / flatpickr / flatpickr.js
everest-forms / assets / js / flatpickr Last commit date
flatpickr.js 8 years ago flatpickr.min.js 6 years ago
flatpickr.js
2157 lines
1 /* flatpickr v4.5.1, @license MIT */
2 (function (global, factory) {
3 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4 typeof define === 'function' && define.amd ? define(factory) :
5 (global.flatpickr = factory());
6 }(this, (function () { 'use strict';
7
8 var pad = function pad(number) {
9 return ("0" + number).slice(-2);
10 };
11 var int = function int(bool) {
12 return bool === true ? 1 : 0;
13 };
14 function debounce(func, wait, immediate) {
15 if (immediate === void 0) {
16 immediate = false;
17 }
18
19 var timeout;
20 return function () {
21 var context = this,
22 args = arguments;
23 timeout !== null && clearTimeout(timeout);
24 timeout = window.setTimeout(function () {
25 timeout = null;
26 if (!immediate) func.apply(context, args);
27 }, wait);
28 if (immediate && !timeout) func.apply(context, args);
29 };
30 }
31 var arrayify = function arrayify(obj) {
32 return obj instanceof Array ? obj : [obj];
33 };
34
35 var do_nothing = function do_nothing() {
36 return undefined;
37 };
38
39 var monthToStr = function monthToStr(monthNumber, shorthand, locale) {
40 return locale.months[shorthand ? "shorthand" : "longhand"][monthNumber];
41 };
42 var revFormat = {
43 D: do_nothing,
44 F: function F(dateObj, monthName, locale) {
45 dateObj.setMonth(locale.months.longhand.indexOf(monthName));
46 },
47 G: function G(dateObj, hour) {
48 dateObj.setHours(parseFloat(hour));
49 },
50 H: function H(dateObj, hour) {
51 dateObj.setHours(parseFloat(hour));
52 },
53 J: function J(dateObj, day) {
54 dateObj.setDate(parseFloat(day));
55 },
56 K: function K(dateObj, amPM, locale) {
57 dateObj.setHours(dateObj.getHours() % 12 + 12 * int(new RegExp(locale.amPM[1], "i").test(amPM)));
58 },
59 M: function M(dateObj, shortMonth, locale) {
60 dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));
61 },
62 S: function S(dateObj, seconds) {
63 dateObj.setSeconds(parseFloat(seconds));
64 },
65 U: function U(_, unixSeconds) {
66 return new Date(parseFloat(unixSeconds) * 1000);
67 },
68 W: function W(dateObj, weekNum) {
69 var weekNumber = parseInt(weekNum);
70 return new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);
71 },
72 Y: function Y(dateObj, year) {
73 dateObj.setFullYear(parseFloat(year));
74 },
75 Z: function Z(_, ISODate) {
76 return new Date(ISODate);
77 },
78 d: function d(dateObj, day) {
79 dateObj.setDate(parseFloat(day));
80 },
81 h: function h(dateObj, hour) {
82 dateObj.setHours(parseFloat(hour));
83 },
84 i: function i(dateObj, minutes) {
85 dateObj.setMinutes(parseFloat(minutes));
86 },
87 j: function j(dateObj, day) {
88 dateObj.setDate(parseFloat(day));
89 },
90 l: do_nothing,
91 m: function m(dateObj, month) {
92 dateObj.setMonth(parseFloat(month) - 1);
93 },
94 n: function n(dateObj, month) {
95 dateObj.setMonth(parseFloat(month) - 1);
96 },
97 s: function s(dateObj, seconds) {
98 dateObj.setSeconds(parseFloat(seconds));
99 },
100 w: do_nothing,
101 y: function y(dateObj, year) {
102 dateObj.setFullYear(2000 + parseFloat(year));
103 }
104 };
105 var tokenRegex = {
106 D: "(\\w+)",
107 F: "(\\w+)",
108 G: "(\\d\\d|\\d)",
109 H: "(\\d\\d|\\d)",
110 J: "(\\d\\d|\\d)\\w+",
111 K: "",
112 M: "(\\w+)",
113 S: "(\\d\\d|\\d)",
114 U: "(.+)",
115 W: "(\\d\\d|\\d)",
116 Y: "(\\d{4})",
117 Z: "(.+)",
118 d: "(\\d\\d|\\d)",
119 h: "(\\d\\d|\\d)",
120 i: "(\\d\\d|\\d)",
121 j: "(\\d\\d|\\d)",
122 l: "(\\w+)",
123 m: "(\\d\\d|\\d)",
124 n: "(\\d\\d|\\d)",
125 s: "(\\d\\d|\\d)",
126 w: "(\\d\\d|\\d)",
127 y: "(\\d{2})"
128 };
129 var formats = {
130 Z: function Z(date) {
131 return date.toISOString();
132 },
133 D: function D(date, locale, options) {
134 return locale.weekdays.shorthand[formats.w(date, locale, options)];
135 },
136 F: function F(date, locale, options) {
137 return monthToStr(formats.n(date, locale, options) - 1, false, locale);
138 },
139 G: function G(date, locale, options) {
140 return pad(formats.h(date, locale, options));
141 },
142 H: function H(date) {
143 return pad(date.getHours());
144 },
145 J: function J(date, locale) {
146 return locale.ordinal !== undefined ? date.getDate() + locale.ordinal(date.getDate()) : date.getDate();
147 },
148 K: function K(date, locale) {
149 return locale.amPM[int(date.getHours() > 11)];
150 },
151 M: function M(date, locale) {
152 return monthToStr(date.getMonth(), true, locale);
153 },
154 S: function S(date) {
155 return pad(date.getSeconds());
156 },
157 U: function U(date) {
158 return date.getTime() / 1000;
159 },
160 W: function W(date, _, options) {
161 return options.getWeek(date);
162 },
163 Y: function Y(date) {
164 return date.getFullYear();
165 },
166 d: function d(date) {
167 return pad(date.getDate());
168 },
169 h: function h(date) {
170 return date.getHours() % 12 ? date.getHours() % 12 : 12;
171 },
172 i: function i(date) {
173 return pad(date.getMinutes());
174 },
175 j: function j(date) {
176 return date.getDate();
177 },
178 l: function l(date, locale) {
179 return locale.weekdays.longhand[date.getDay()];
180 },
181 m: function m(date) {
182 return pad(date.getMonth() + 1);
183 },
184 n: function n(date) {
185 return date.getMonth() + 1;
186 },
187 s: function s(date) {
188 return date.getSeconds();
189 },
190 w: function w(date) {
191 return date.getDay();
192 },
193 y: function y(date) {
194 return String(date.getFullYear()).substring(2);
195 }
196 };
197
198 var english = {
199 weekdays: {
200 shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
201 longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
202 },
203 months: {
204 shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
205 longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
206 },
207 daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
208 firstDayOfWeek: 0,
209 ordinal: function ordinal(nth) {
210 var s = nth % 100;
211 if (s > 3 && s < 21) return "th";
212
213 switch (s % 10) {
214 case 1:
215 return "st";
216
217 case 2:
218 return "nd";
219
220 case 3:
221 return "rd";
222
223 default:
224 return "th";
225 }
226 },
227 rangeSeparator: " to ",
228 weekAbbreviation: "Wk",
229 scrollTitle: "Scroll to increment",
230 toggleTitle: "Click to toggle",
231 amPM: ["AM", "PM"],
232 yearAriaLabel: "Year"
233 };
234
235 var createDateFormatter = function createDateFormatter(_ref) {
236 var _ref$config = _ref.config,
237 config = _ref$config === void 0 ? defaults : _ref$config,
238 _ref$l10n = _ref.l10n,
239 l10n = _ref$l10n === void 0 ? english : _ref$l10n;
240 return function (dateObj, frmt, overrideLocale) {
241 if (config.formatDate !== undefined) return config.formatDate(dateObj, frmt);
242 var locale = overrideLocale || l10n;
243 return frmt.split("").map(function (c, i, arr) {
244 return formats[c] && arr[i - 1] !== "\\" ? formats[c](dateObj, locale, config) : c !== "\\" ? c : "";
245 }).join("");
246 };
247 };
248 var createDateParser = function createDateParser(_ref2) {
249 var _ref2$config = _ref2.config,
250 config = _ref2$config === void 0 ? defaults : _ref2$config,
251 _ref2$l10n = _ref2.l10n,
252 l10n = _ref2$l10n === void 0 ? english : _ref2$l10n;
253 return function (date, givenFormat, timeless, customLocale) {
254 if (date !== 0 && !date) return undefined;
255 var locale = customLocale || l10n;
256 var parsedDate;
257 var date_orig = date;
258 if (date instanceof Date) parsedDate = new Date(date.getTime());else if (typeof date !== "string" && date.toFixed !== undefined) parsedDate = new Date(date);else if (typeof date === "string") {
259 var format = givenFormat || (config || defaults).dateFormat;
260 var datestr = String(date).trim();
261
262 if (datestr === "today") {
263 parsedDate = new Date();
264 timeless = true;
265 } else if (/Z$/.test(datestr) || /GMT$/.test(datestr)) parsedDate = new Date(date);else if (config && config.parseDate) parsedDate = config.parseDate(date, format);else {
266 parsedDate = !config || !config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0));
267 var matched,
268 ops = [];
269
270 for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
271 var token = format[i];
272 var isBackSlash = token === "\\";
273 var escaped = format[i - 1] === "\\" || isBackSlash;
274
275 if (tokenRegex[token] && !escaped) {
276 regexStr += tokenRegex[token];
277 var match = new RegExp(regexStr).exec(date);
278
279 if (match && (matched = true)) {
280 ops[token !== "Y" ? "push" : "unshift"]({
281 fn: revFormat[token],
282 val: match[++matchIndex]
283 });
284 }
285 } else if (!isBackSlash) regexStr += ".";
286
287 ops.forEach(function (_ref3) {
288 var fn = _ref3.fn,
289 val = _ref3.val;
290 return parsedDate = fn(parsedDate, val, locale) || parsedDate;
291 });
292 }
293
294 parsedDate = matched ? parsedDate : undefined;
295 }
296 }
297
298 if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {
299 config.errorHandler(new Error("Invalid date provided: " + date_orig));
300 return undefined;
301 }
302
303 if (timeless === true) parsedDate.setHours(0, 0, 0, 0);
304 return parsedDate;
305 };
306 };
307 function compareDates(date1, date2, timeless) {
308 if (timeless === void 0) {
309 timeless = true;
310 }
311
312 if (timeless !== false) {
313 return new Date(date1.getTime()).setHours(0, 0, 0, 0) - new Date(date2.getTime()).setHours(0, 0, 0, 0);
314 }
315
316 return date1.getTime() - date2.getTime();
317 }
318 var getWeek = function getWeek(givenDate) {
319 var date = new Date(givenDate.getTime());
320 date.setHours(0, 0, 0, 0);
321 date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
322 var week1 = new Date(date.getFullYear(), 0, 4);
323 return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
324 };
325 var isBetween = function isBetween(ts, ts1, ts2) {
326 return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);
327 };
328 var duration = {
329 DAY: 86400000
330 };
331
332 var defaults = {
333 _disable: [],
334 _enable: [],
335 allowInput: false,
336 altFormat: "F j, Y",
337 altInput: false,
338 altInputClass: "form-control input",
339 animate: typeof window === "object" && window.navigator.userAgent.indexOf("MSIE") === -1,
340 ariaDateFormat: "F j, Y",
341 clickOpens: true,
342 closeOnSelect: true,
343 conjunction: ", ",
344 dateFormat: "Y-m-d",
345 defaultHour: 12,
346 defaultMinute: 0,
347 defaultSeconds: 0,
348 disable: [],
349 disableMobile: false,
350 enable: [],
351 enableSeconds: false,
352 enableTime: false,
353 errorHandler: function errorHandler(err) {
354 return typeof console !== "undefined" && console.warn(err);
355 },
356 getWeek: getWeek,
357 hourIncrement: 1,
358 ignoredFocusElements: [],
359 inline: false,
360 locale: "default",
361 minuteIncrement: 5,
362 mode: "single",
363 nextArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",
364 noCalendar: false,
365 now: new Date(),
366 onChange: [],
367 onClose: [],
368 onDayCreate: [],
369 onDestroy: [],
370 onKeyDown: [],
371 onMonthChange: [],
372 onOpen: [],
373 onParseConfig: [],
374 onReady: [],
375 onValueUpdate: [],
376 onYearChange: [],
377 onPreCalendarPosition: [],
378 plugins: [],
379 position: "auto",
380 positionElement: undefined,
381 prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",
382 shorthandCurrentMonth: false,
383 showMonths: 1,
384 static: false,
385 time_24hr: false,
386 weekNumbers: false,
387 wrap: false
388 };
389
390 function toggleClass(elem, className, bool) {
391 if (bool === true) return elem.classList.add(className);
392 elem.classList.remove(className);
393 }
394 function createElement(tag, className, content) {
395 var e = window.document.createElement(tag);
396 className = className || "";
397 content = content || "";
398 e.className = className;
399 if (content !== undefined) e.textContent = content;
400 return e;
401 }
402 function clearNode(node) {
403 while (node.firstChild) {
404 node.removeChild(node.firstChild);
405 }
406 }
407 function findParent(node, condition) {
408 if (condition(node)) return node;else if (node.parentNode) return findParent(node.parentNode, condition);
409 return undefined;
410 }
411 function createNumberInput(inputClassName, opts) {
412 var wrapper = createElement("div", "numInputWrapper"),
413 numInput = createElement("input", "numInput " + inputClassName),
414 arrowUp = createElement("span", "arrowUp"),
415 arrowDown = createElement("span", "arrowDown");
416 numInput.type = "text";
417 numInput.pattern = "\\d*";
418 if (opts !== undefined) for (var key in opts) {
419 numInput.setAttribute(key, opts[key]);
420 }
421 wrapper.appendChild(numInput);
422 wrapper.appendChild(arrowUp);
423 wrapper.appendChild(arrowDown);
424 return wrapper;
425 }
426
427 if (typeof Object.assign !== "function") {
428 Object.assign = function (target) {
429 if (!target) {
430 throw TypeError("Cannot convert undefined or null to object");
431 }
432
433 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
434 args[_key - 1] = arguments[_key];
435 }
436
437 var _loop = function _loop() {
438 var source = args[_i];
439
440 if (source) {
441 Object.keys(source).forEach(function (key) {
442 return target[key] = source[key];
443 });
444 }
445 };
446
447 for (var _i = 0; _i < args.length; _i++) {
448 _loop();
449 }
450
451 return target;
452 };
453 }
454
455 var DEBOUNCED_CHANGE_MS = 300;
456
457 function FlatpickrInstance(element, instanceConfig) {
458 var self = {
459 config: Object.assign({}, flatpickr.defaultConfig),
460 l10n: english
461 };
462 self.parseDate = createDateParser({
463 config: self.config,
464 l10n: self.l10n
465 });
466 self._handlers = [];
467 self._bind = bind;
468 self._setHoursFromDate = setHoursFromDate;
469 self._positionCalendar = positionCalendar;
470 self.changeMonth = changeMonth;
471 self.changeYear = changeYear;
472 self.clear = clear;
473 self.close = close;
474 self._createElement = createElement;
475 self.destroy = destroy;
476 self.isEnabled = isEnabled;
477 self.jumpToDate = jumpToDate;
478 self.open = open;
479 self.redraw = redraw;
480 self.set = set;
481 self.setDate = setDate;
482 self.toggle = toggle;
483
484 function setupHelperFunctions() {
485 self.utils = {
486 getDaysInMonth: function getDaysInMonth(month, yr) {
487 if (month === void 0) {
488 month = self.currentMonth;
489 }
490
491 if (yr === void 0) {
492 yr = self.currentYear;
493 }
494
495 if (month === 1 && (yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0)) return 29;
496 return self.l10n.daysInMonth[month];
497 }
498 };
499 }
500
501 function init() {
502 self.element = self.input = element;
503 self.isOpen = false;
504 parseConfig();
505 setupLocale();
506 setupInputs();
507 setupDates();
508 setupHelperFunctions();
509 if (!self.isMobile) build();
510 bindEvents();
511
512 if (self.selectedDates.length || self.config.noCalendar) {
513 if (self.config.enableTime) {
514 setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj || self.config.minDate : undefined);
515 }
516
517 updateValue(false);
518 }
519
520 setCalendarWidth();
521 self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;
522 var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
523
524 if (!self.isMobile && isSafari) {
525 positionCalendar();
526 }
527
528 triggerEvent("onReady");
529 }
530
531 function bindToInstance(fn) {
532 return fn.bind(self);
533 }
534
535 function setCalendarWidth() {
536 var config = self.config;
537 if (config.weekNumbers === false && config.showMonths === 1) return;else if (config.noCalendar !== true) {
538 window.requestAnimationFrame(function () {
539 self.calendarContainer.style.visibility = "hidden";
540 self.calendarContainer.style.display = "block";
541
542 if (self.daysContainer !== undefined) {
543 var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;
544 self.daysContainer.style.width = daysWidth + "px";
545 self.calendarContainer.style.width = daysWidth + (self.weekWrapper !== undefined ? self.weekWrapper.offsetWidth : 0) + "px";
546 self.calendarContainer.style.removeProperty("visibility");
547 self.calendarContainer.style.removeProperty("display");
548 }
549 });
550 }
551 }
552
553 function updateTime(e) {
554 if (self.selectedDates.length === 0) return;
555
556 if (e !== undefined && e.type !== "blur") {
557 timeWrapper(e);
558 }
559
560 var prevValue = self._input.value;
561 setHoursFromInputs();
562 updateValue();
563
564 if (self._input.value !== prevValue) {
565 self._debouncedChange();
566 }
567 }
568
569 function ampm2military(hour, amPM) {
570 return hour % 12 + 12 * int(amPM === self.l10n.amPM[1]);
571 }
572
573 function military2ampm(hour) {
574 switch (hour % 24) {
575 case 0:
576 case 12:
577 return 12;
578
579 default:
580 return hour % 12;
581 }
582 }
583
584 function setHoursFromInputs() {
585 if (self.hourElement === undefined || self.minuteElement === undefined) return;
586 var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24,
587 minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60,
588 seconds = self.secondElement !== undefined ? (parseInt(self.secondElement.value, 10) || 0) % 60 : 0;
589
590 if (self.amPM !== undefined) {
591 hours = ampm2military(hours, self.amPM.textContent);
592 }
593
594 var limitMinHours = self.config.minTime !== undefined || self.config.minDate && self.minDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.minDate, true) === 0;
595 var limitMaxHours = self.config.maxTime !== undefined || self.config.maxDate && self.maxDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.maxDate, true) === 0;
596
597 if (limitMaxHours) {
598 var maxTime = self.config.maxTime !== undefined ? self.config.maxTime : self.config.maxDate;
599 hours = Math.min(hours, maxTime.getHours());
600 if (hours === maxTime.getHours()) minutes = Math.min(minutes, maxTime.getMinutes());
601 if (minutes === maxTime.getMinutes()) seconds = Math.min(seconds, maxTime.getSeconds());
602 }
603
604 if (limitMinHours) {
605 var minTime = self.config.minTime !== undefined ? self.config.minTime : self.config.minDate;
606 hours = Math.max(hours, minTime.getHours());
607 if (hours === minTime.getHours()) minutes = Math.max(minutes, minTime.getMinutes());
608 if (minutes === minTime.getMinutes()) seconds = Math.max(seconds, minTime.getSeconds());
609 }
610
611 setHours(hours, minutes, seconds);
612 }
613
614 function setHoursFromDate(dateObj) {
615 var date = dateObj || self.latestSelectedDateObj;
616 if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds());
617 }
618
619 function setDefaultHours() {
620 var hours = self.config.defaultHour;
621 var minutes = self.config.defaultMinute;
622 var seconds = self.config.defaultSeconds;
623
624 if (self.config.minDate !== undefined) {
625 var min_hr = self.config.minDate.getHours();
626 var min_minutes = self.config.minDate.getMinutes();
627 hours = Math.max(hours, min_hr);
628 if (hours === min_hr) minutes = Math.max(min_minutes, minutes);
629 if (hours === min_hr && minutes === min_minutes) seconds = self.config.minDate.getSeconds();
630 }
631
632 if (self.config.maxDate !== undefined) {
633 var max_hr = self.config.maxDate.getHours();
634 var max_minutes = self.config.maxDate.getMinutes();
635 hours = Math.min(hours, max_hr);
636 if (hours === max_hr) minutes = Math.min(max_minutes, minutes);
637 if (hours === max_hr && minutes === max_minutes) seconds = self.config.maxDate.getSeconds();
638 }
639
640 setHours(hours, minutes, seconds);
641 }
642
643 function setHours(hours, minutes, seconds) {
644 if (self.latestSelectedDateObj !== undefined) {
645 self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);
646 }
647
648 if (!self.hourElement || !self.minuteElement || self.isMobile) return;
649 self.hourElement.value = pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * int(hours % 12 === 0) : hours);
650 self.minuteElement.value = pad(minutes);
651 if (self.amPM !== undefined) self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];
652 if (self.secondElement !== undefined) self.secondElement.value = pad(seconds);
653 }
654
655 function onYearInput(event) {
656 var year = parseInt(event.target.value) + (event.delta || 0);
657
658 if (year / 1000 > 1 || event.key === "Enter" && !/[^\d]/.test(year.toString())) {
659 changeYear(year);
660 }
661 }
662
663 function bind(element, event, handler, options) {
664 if (event instanceof Array) return event.forEach(function (ev) {
665 return bind(element, ev, handler, options);
666 });
667 if (element instanceof Array) return element.forEach(function (el) {
668 return bind(el, event, handler, options);
669 });
670 element.addEventListener(event, handler, options);
671
672 self._handlers.push({
673 element: element,
674 event: event,
675 handler: handler,
676 options: options
677 });
678 }
679
680 function onClick(handler) {
681 return function (evt) {
682 evt.which === 1 && handler(evt);
683 };
684 }
685
686 function triggerChange() {
687 triggerEvent("onChange");
688 }
689
690 function bindEvents() {
691 if (self.config.wrap) {
692 ["open", "close", "toggle", "clear"].forEach(function (evt) {
693 Array.prototype.forEach.call(self.element.querySelectorAll("[data-" + evt + "]"), function (el) {
694 return bind(el, "click", self[evt]);
695 });
696 });
697 }
698
699 if (self.isMobile) {
700 setupMobile();
701 return;
702 }
703
704 var debouncedResize = debounce(onResize, 50);
705 self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);
706 if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent)) bind(self.daysContainer, "mouseover", function (e) {
707 if (self.config.mode === "range") onMouseOver(e.target);
708 });
709 bind(window.document.body, "keydown", onKeyDown);
710 if (!self.config.static) bind(self._input, "keydown", onKeyDown);
711 if (!self.config.inline && !self.config.static) bind(window, "resize", debouncedResize);
712 if (window.ontouchstart !== undefined) bind(window.document, "click", documentClick);else bind(window.document, "mousedown", onClick(documentClick));
713 bind(window.document, "focus", documentClick, {
714 capture: true
715 });
716
717 if (self.config.clickOpens === true) {
718 bind(self._input, "focus", self.open);
719 bind(self._input, "mousedown", onClick(self.open));
720 }
721
722 if (self.daysContainer !== undefined) {
723 bind(self.monthNav, "mousedown", onClick(onMonthNavClick));
724 bind(self.monthNav, ["keyup", "increment"], onYearInput);
725 bind(self.daysContainer, "mousedown", onClick(selectDate));
726 }
727
728 if (self.timeContainer !== undefined && self.minuteElement !== undefined && self.hourElement !== undefined) {
729 var selText = function selText(e) {
730 return e.target.select();
731 };
732
733 bind(self.timeContainer, ["increment"], updateTime);
734 bind(self.timeContainer, "blur", updateTime, {
735 capture: true
736 });
737 bind(self.timeContainer, "mousedown", onClick(timeIncrement));
738 bind([self.hourElement, self.minuteElement], ["focus", "click"], selText);
739 if (self.secondElement !== undefined) bind(self.secondElement, "focus", function () {
740 return self.secondElement && self.secondElement.select();
741 });
742
743 if (self.amPM !== undefined) {
744 bind(self.amPM, "mousedown", onClick(function (e) {
745 updateTime(e);
746 triggerChange();
747 }));
748 }
749 }
750 }
751
752 function jumpToDate(jumpDate) {
753 var jumpTo = jumpDate !== undefined ? self.parseDate(jumpDate) : self.latestSelectedDateObj || (self.config.minDate && self.config.minDate > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate < self.now ? self.config.maxDate : self.now);
754
755 try {
756 if (jumpTo !== undefined) {
757 self.currentYear = jumpTo.getFullYear();
758 self.currentMonth = jumpTo.getMonth();
759 }
760 } catch (e) {
761 e.message = "Invalid date supplied: " + jumpTo;
762 self.config.errorHandler(e);
763 }
764
765 self.redraw();
766 }
767
768 function timeIncrement(e) {
769 if (~e.target.className.indexOf("arrow")) incrementNumInput(e, e.target.classList.contains("arrowUp") ? 1 : -1);
770 }
771
772 function incrementNumInput(e, delta, inputElem) {
773 var target = e && e.target;
774 var input = inputElem || target && target.parentNode && target.parentNode.firstChild;
775 var event = createEvent("increment");
776 event.delta = delta;
777 input && input.dispatchEvent(event);
778 }
779
780 function build() {
781 var fragment = window.document.createDocumentFragment();
782 self.calendarContainer = createElement("div", "flatpickr-calendar");
783 self.calendarContainer.tabIndex = -1;
784
785 if (!self.config.noCalendar) {
786 fragment.appendChild(buildMonthNav());
787 self.innerContainer = createElement("div", "flatpickr-innerContainer");
788
789 if (self.config.weekNumbers) {
790 var _buildWeeks = buildWeeks(),
791 weekWrapper = _buildWeeks.weekWrapper,
792 weekNumbers = _buildWeeks.weekNumbers;
793
794 self.innerContainer.appendChild(weekWrapper);
795 self.weekNumbers = weekNumbers;
796 self.weekWrapper = weekWrapper;
797 }
798
799 self.rContainer = createElement("div", "flatpickr-rContainer");
800 self.rContainer.appendChild(buildWeekdays());
801
802 if (!self.daysContainer) {
803 self.daysContainer = createElement("div", "flatpickr-days");
804 self.daysContainer.tabIndex = -1;
805 }
806
807 buildDays();
808 self.rContainer.appendChild(self.daysContainer);
809 self.innerContainer.appendChild(self.rContainer);
810 fragment.appendChild(self.innerContainer);
811 }
812
813 if (self.config.enableTime) {
814 fragment.appendChild(buildTime());
815 }
816
817 toggleClass(self.calendarContainer, "rangeMode", self.config.mode === "range");
818 toggleClass(self.calendarContainer, "animate", self.config.animate === true);
819 toggleClass(self.calendarContainer, "multiMonth", self.config.showMonths > 1);
820 self.calendarContainer.appendChild(fragment);
821 var customAppend = self.config.appendTo !== undefined && self.config.appendTo.nodeType !== undefined;
822
823 if (self.config.inline || self.config.static) {
824 self.calendarContainer.classList.add(self.config.inline ? "inline" : "static");
825
826 if (self.config.inline) {
827 if (!customAppend && self.element.parentNode) self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);else if (self.config.appendTo !== undefined) self.config.appendTo.appendChild(self.calendarContainer);
828 }
829
830 if (self.config.static) {
831 var wrapper = createElement("div", "flatpickr-wrapper");
832 if (self.element.parentNode) self.element.parentNode.insertBefore(wrapper, self.element);
833 wrapper.appendChild(self.element);
834 if (self.altInput) wrapper.appendChild(self.altInput);
835 wrapper.appendChild(self.calendarContainer);
836 }
837 }
838
839 if (!self.config.static && !self.config.inline) (self.config.appendTo !== undefined ? self.config.appendTo : window.document.body).appendChild(self.calendarContainer);
840 }
841
842 function createDay(className, date, dayNumber, i) {
843 var dateIsEnabled = isEnabled(date, true),
844 dayElement = createElement("span", "flatpickr-day " + className, date.getDate().toString());
845 dayElement.dateObj = date;
846 dayElement.$i = i;
847 dayElement.setAttribute("aria-label", self.formatDate(date, self.config.ariaDateFormat));
848
849 if (className.indexOf("hidden") === -1 && compareDates(date, self.now) === 0) {
850 self.todayDateElem = dayElement;
851 dayElement.classList.add("today");
852 dayElement.setAttribute("aria-current", "date");
853 }
854
855 if (dateIsEnabled) {
856 dayElement.tabIndex = -1;
857
858 if (isDateSelected(date)) {
859 dayElement.classList.add("selected");
860 self.selectedDateElem = dayElement;
861
862 if (self.config.mode === "range") {
863 toggleClass(dayElement, "startRange", self.selectedDates[0] && compareDates(date, self.selectedDates[0], true) === 0);
864 toggleClass(dayElement, "endRange", self.selectedDates[1] && compareDates(date, self.selectedDates[1], true) === 0);
865 if (className === "nextMonthDay") dayElement.classList.add("inRange");
866 }
867 }
868 } else {
869 dayElement.classList.add("disabled");
870 }
871
872 if (self.config.mode === "range") {
873 if (isDateInRange(date) && !isDateSelected(date)) dayElement.classList.add("inRange");
874 }
875
876 if (self.weekNumbers && self.config.showMonths === 1 && className !== "prevMonthDay" && dayNumber % 7 === 1) {
877 self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + self.config.getWeek(date) + "</span>");
878 }
879
880 triggerEvent("onDayCreate", dayElement);
881 return dayElement;
882 }
883
884 function focusOnDayElem(targetNode) {
885 targetNode.focus();
886 if (self.config.mode === "range") onMouseOver(targetNode);
887 }
888
889 function getFirstAvailableDay(delta) {
890 var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;
891 var endMonth = delta > 0 ? self.config.showMonths : -1;
892
893 for (var m = startMonth; m != endMonth; m += delta) {
894 var month = self.daysContainer.children[m];
895 var startIndex = delta > 0 ? 0 : month.children.length - 1;
896 var endIndex = delta > 0 ? month.children.length : -1;
897
898 for (var i = startIndex; i != endIndex; i += delta) {
899 var c = month.children[i];
900 if (c.className.indexOf("hidden") === -1 && isEnabled(c.dateObj)) return c;
901 }
902 }
903
904 return undefined;
905 }
906
907 function getNextAvailableDay(current, delta) {
908 var givenMonth = current.className.indexOf("Month") === -1 ? current.dateObj.getMonth() : self.currentMonth;
909 var endMonth = delta > 0 ? self.config.showMonths : -1;
910 var loopDelta = delta > 0 ? 1 : -1;
911
912 for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {
913 var month = self.daysContainer.children[m];
914 var startIndex = givenMonth - self.currentMonth === m ? current.$i + delta : delta < 0 ? month.children.length - 1 : 0;
915 var numMonthDays = month.children.length;
916
917 for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {
918 var c = month.children[i];
919 if (c.className.indexOf("hidden") === -1 && isEnabled(c.dateObj) && Math.abs(current.$i - i) >= Math.abs(delta)) return focusOnDayElem(c);
920 }
921 }
922
923 self.changeMonth(loopDelta);
924 focusOnDay(getFirstAvailableDay(loopDelta), 0);
925 return undefined;
926 }
927
928 function focusOnDay(current, offset) {
929 var dayFocused = isInView(document.activeElement);
930 var startElem = current !== undefined ? current : dayFocused ? document.activeElement : self.selectedDateElem !== undefined && isInView(self.selectedDateElem) ? self.selectedDateElem : self.todayDateElem !== undefined && isInView(self.todayDateElem) ? self.todayDateElem : getFirstAvailableDay(offset > 0 ? 1 : -1);
931 if (startElem === undefined) return self._input.focus();
932 if (!dayFocused) return focusOnDayElem(startElem);
933 getNextAvailableDay(startElem, offset);
934 }
935
936 function buildMonthDays(year, month) {
937 var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;
938 var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12);
939 var daysInMonth = self.utils.getDaysInMonth(month),
940 days = window.document.createDocumentFragment(),
941 isMultiMonth = self.config.showMonths > 1,
942 prevMonthDayClass = isMultiMonth ? "prevMonthDay hidden" : "prevMonthDay",
943 nextMonthDayClass = isMultiMonth ? "nextMonthDay hidden" : "nextMonthDay";
944 var dayNumber = prevMonthDays + 1 - firstOfMonth,
945 dayIndex = 0;
946
947 for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {
948 days.appendChild(createDay(prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));
949 }
950
951 for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {
952 days.appendChild(createDay("", new Date(year, month, dayNumber), dayNumber, dayIndex));
953 }
954
955 for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth && (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {
956 days.appendChild(createDay(nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));
957 }
958
959 var dayContainer = createElement("div", "dayContainer");
960 dayContainer.appendChild(days);
961 return dayContainer;
962 }
963
964 function buildDays() {
965 if (self.daysContainer === undefined) {
966 return;
967 }
968
969 clearNode(self.daysContainer);
970 if (self.weekNumbers) clearNode(self.weekNumbers);
971 var frag = document.createDocumentFragment();
972
973 for (var i = 0; i < self.config.showMonths; i++) {
974 var d = new Date(self.currentYear, self.currentMonth, 1);
975 d.setMonth(self.currentMonth + i);
976 frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));
977 }
978
979 self.daysContainer.appendChild(frag);
980 self.days = self.daysContainer.firstChild;
981
982 if (self.config.mode === "range" && self.selectedDates.length === 1) {
983 onMouseOver();
984 }
985 }
986
987 function buildMonth() {
988 var container = createElement("div", "flatpickr-month");
989 var monthNavFragment = window.document.createDocumentFragment();
990 var monthElement = createElement("span", "cur-month");
991 var yearInput = createNumberInput("cur-year", {
992 tabindex: "-1"
993 });
994 var yearElement = yearInput.childNodes[0];
995 yearElement.setAttribute("aria-label", self.l10n.yearAriaLabel);
996 if (self.config.minDate) yearElement.setAttribute("data-min", self.config.minDate.getFullYear().toString());
997
998 if (self.config.maxDate) {
999 yearElement.setAttribute("data-max", self.config.maxDate.getFullYear().toString());
1000 yearElement.disabled = !!self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();
1001 }
1002
1003 var currentMonth = createElement("div", "flatpickr-current-month");
1004 currentMonth.appendChild(monthElement);
1005 currentMonth.appendChild(yearInput);
1006 monthNavFragment.appendChild(currentMonth);
1007 container.appendChild(monthNavFragment);
1008 return {
1009 container: container,
1010 yearElement: yearElement,
1011 monthElement: monthElement
1012 };
1013 }
1014
1015 function buildMonths() {
1016 clearNode(self.monthNav);
1017 self.monthNav.appendChild(self.prevMonthNav);
1018
1019 for (var m = self.config.showMonths; m--;) {
1020 var month = buildMonth();
1021 self.yearElements.push(month.yearElement);
1022 self.monthElements.push(month.monthElement);
1023 self.monthNav.appendChild(month.container);
1024 }
1025
1026 self.monthNav.appendChild(self.nextMonthNav);
1027 }
1028
1029 function buildMonthNav() {
1030 self.monthNav = createElement("div", "flatpickr-months");
1031 self.yearElements = [];
1032 self.monthElements = [];
1033 self.prevMonthNav = createElement("span", "flatpickr-prev-month");
1034 self.prevMonthNav.innerHTML = self.config.prevArrow;
1035 self.nextMonthNav = createElement("span", "flatpickr-next-month");
1036 self.nextMonthNav.innerHTML = self.config.nextArrow;
1037 buildMonths();
1038 Object.defineProperty(self, "_hidePrevMonthArrow", {
1039 get: function get() {
1040 return self.__hidePrevMonthArrow;
1041 },
1042 set: function set(bool) {
1043 if (self.__hidePrevMonthArrow !== bool) {
1044 toggleClass(self.prevMonthNav, "disabled", bool);
1045 self.__hidePrevMonthArrow = bool;
1046 }
1047 }
1048 });
1049 Object.defineProperty(self, "_hideNextMonthArrow", {
1050 get: function get() {
1051 return self.__hideNextMonthArrow;
1052 },
1053 set: function set(bool) {
1054 if (self.__hideNextMonthArrow !== bool) {
1055 toggleClass(self.nextMonthNav, "disabled", bool);
1056 self.__hideNextMonthArrow = bool;
1057 }
1058 }
1059 });
1060 self.currentYearElement = self.yearElements[0];
1061 updateNavigationCurrentMonth();
1062 return self.monthNav;
1063 }
1064
1065 function buildTime() {
1066 self.calendarContainer.classList.add("hasTime");
1067 if (self.config.noCalendar) self.calendarContainer.classList.add("noCalendar");
1068 self.timeContainer = createElement("div", "flatpickr-time");
1069 self.timeContainer.tabIndex = -1;
1070 var separator = createElement("span", "flatpickr-time-separator", ":");
1071 var hourInput = createNumberInput("flatpickr-hour");
1072 self.hourElement = hourInput.childNodes[0];
1073 var minuteInput = createNumberInput("flatpickr-minute");
1074 self.minuteElement = minuteInput.childNodes[0];
1075 self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;
1076 self.hourElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.time_24hr ? self.config.defaultHour : military2ampm(self.config.defaultHour));
1077 self.minuteElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute);
1078 self.hourElement.setAttribute("data-step", self.config.hourIncrement.toString());
1079 self.minuteElement.setAttribute("data-step", self.config.minuteIncrement.toString());
1080 self.hourElement.setAttribute("data-min", self.config.time_24hr ? "0" : "1");
1081 self.hourElement.setAttribute("data-max", self.config.time_24hr ? "23" : "12");
1082 self.minuteElement.setAttribute("data-min", "0");
1083 self.minuteElement.setAttribute("data-max", "59");
1084 self.timeContainer.appendChild(hourInput);
1085 self.timeContainer.appendChild(separator);
1086 self.timeContainer.appendChild(minuteInput);
1087 if (self.config.time_24hr) self.timeContainer.classList.add("time24hr");
1088
1089 if (self.config.enableSeconds) {
1090 self.timeContainer.classList.add("hasSeconds");
1091 var secondInput = createNumberInput("flatpickr-second");
1092 self.secondElement = secondInput.childNodes[0];
1093 self.secondElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getSeconds() : self.config.defaultSeconds);
1094 self.secondElement.setAttribute("data-step", self.minuteElement.getAttribute("data-step"));
1095 self.secondElement.setAttribute("data-min", self.minuteElement.getAttribute("data-min"));
1096 self.secondElement.setAttribute("data-max", self.minuteElement.getAttribute("data-max"));
1097 self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":"));
1098 self.timeContainer.appendChild(secondInput);
1099 }
1100
1101 if (!self.config.time_24hr) {
1102 self.amPM = createElement("span", "flatpickr-am-pm", self.l10n.amPM[int((self.latestSelectedDateObj ? self.hourElement.value : self.config.defaultHour) > 11)]);
1103 self.amPM.title = self.l10n.toggleTitle;
1104 self.amPM.tabIndex = -1;
1105 self.timeContainer.appendChild(self.amPM);
1106 }
1107
1108 return self.timeContainer;
1109 }
1110
1111 function buildWeekdays() {
1112 if (!self.weekdayContainer) self.weekdayContainer = createElement("div", "flatpickr-weekdays");else clearNode(self.weekdayContainer);
1113
1114 for (var i = self.config.showMonths; i--;) {
1115 var container = createElement("div", "flatpickr-weekdaycontainer");
1116 self.weekdayContainer.appendChild(container);
1117 }
1118
1119 updateWeekdays();
1120 return self.weekdayContainer;
1121 }
1122
1123 function updateWeekdays() {
1124 var firstDayOfWeek = self.l10n.firstDayOfWeek;
1125 var weekdays = self.l10n.weekdays.shorthand.concat();
1126
1127 if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {
1128 weekdays = weekdays.splice(firstDayOfWeek, weekdays.length).concat(weekdays.splice(0, firstDayOfWeek));
1129 }
1130
1131 for (var i = self.config.showMonths; i--;) {
1132 self.weekdayContainer.children[i].innerHTML = "\n <span class=flatpickr-weekday>\n " + weekdays.join("</span><span class=flatpickr-weekday>") + "\n </span>\n ";
1133 }
1134 }
1135
1136 function buildWeeks() {
1137 self.calendarContainer.classList.add("hasWeeks");
1138 var weekWrapper = createElement("div", "flatpickr-weekwrapper");
1139 weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
1140 var weekNumbers = createElement("div", "flatpickr-weeks");
1141 weekWrapper.appendChild(weekNumbers);
1142 return {
1143 weekWrapper: weekWrapper,
1144 weekNumbers: weekNumbers
1145 };
1146 }
1147
1148 function changeMonth(value, is_offset) {
1149 if (is_offset === void 0) {
1150 is_offset = true;
1151 }
1152
1153 var delta = is_offset ? value : value - self.currentMonth;
1154 if (delta < 0 && self._hidePrevMonthArrow === true || delta > 0 && self._hideNextMonthArrow === true) return;
1155 self.currentMonth += delta;
1156
1157 if (self.currentMonth < 0 || self.currentMonth > 11) {
1158 self.currentYear += self.currentMonth > 11 ? 1 : -1;
1159 self.currentMonth = (self.currentMonth + 12) % 12;
1160 triggerEvent("onYearChange");
1161 }
1162
1163 buildDays();
1164 triggerEvent("onMonthChange");
1165 updateNavigationCurrentMonth();
1166 }
1167
1168 function clear(triggerChangeEvent) {
1169 if (triggerChangeEvent === void 0) {
1170 triggerChangeEvent = true;
1171 }
1172
1173 self.input.value = "";
1174 if (self.altInput !== undefined) self.altInput.value = "";
1175 if (self.mobileInput !== undefined) self.mobileInput.value = "";
1176 self.selectedDates = [];
1177 self.latestSelectedDateObj = undefined;
1178 self.showTimeInput = false;
1179
1180 if (self.config.enableTime === true) {
1181 setDefaultHours();
1182 }
1183
1184 self.redraw();
1185 if (triggerChangeEvent) triggerEvent("onChange");
1186 }
1187
1188 function close() {
1189 self.isOpen = false;
1190
1191 if (!self.isMobile) {
1192 self.calendarContainer.classList.remove("open");
1193
1194 self._input.classList.remove("active");
1195 }
1196
1197 triggerEvent("onClose");
1198 }
1199
1200 function destroy() {
1201 if (self.config !== undefined) triggerEvent("onDestroy");
1202
1203 for (var i = self._handlers.length; i--;) {
1204 var h = self._handlers[i];
1205 h.element.removeEventListener(h.event, h.handler, h.options);
1206 }
1207
1208 self._handlers = [];
1209
1210 if (self.mobileInput) {
1211 if (self.mobileInput.parentNode) self.mobileInput.parentNode.removeChild(self.mobileInput);
1212 self.mobileInput = undefined;
1213 } else if (self.calendarContainer && self.calendarContainer.parentNode) {
1214 if (self.config.static && self.calendarContainer.parentNode) {
1215 var wrapper = self.calendarContainer.parentNode;
1216 wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);
1217
1218 while (wrapper.firstChild) {
1219 wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);
1220 }
1221
1222 wrapper.parentNode.removeChild(wrapper);
1223 } else self.calendarContainer.parentNode.removeChild(self.calendarContainer);
1224 }
1225
1226 if (self.altInput) {
1227 self.input.type = "text";
1228 if (self.altInput.parentNode) self.altInput.parentNode.removeChild(self.altInput);
1229 delete self.altInput;
1230 }
1231
1232 if (self.input) {
1233 self.input.type = self.input._type;
1234 self.input.classList.remove("flatpickr-input");
1235 self.input.removeAttribute("readonly");
1236 self.input.value = "";
1237 }
1238
1239 ["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach(function (k) {
1240 try {
1241 delete self[k];
1242 } catch (_) {}
1243 });
1244 }
1245
1246 function isCalendarElem(elem) {
1247 if (self.config.appendTo && self.config.appendTo.contains(elem)) return true;
1248 return self.calendarContainer.contains(elem);
1249 }
1250
1251 function documentClick(e) {
1252 if (self.isOpen && !self.config.inline) {
1253 var isCalendarElement = isCalendarElem(e.target);
1254 var isInput = e.target === self.input || e.target === self.altInput || self.element.contains(e.target) || e.path && e.path.indexOf && (~e.path.indexOf(self.input) || ~e.path.indexOf(self.altInput));
1255 var lostFocus = e.type === "blur" ? isInput && e.relatedTarget && !isCalendarElem(e.relatedTarget) : !isInput && !isCalendarElement;
1256 var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {
1257 return elem.contains(e.target);
1258 });
1259
1260 if (lostFocus && isIgnored) {
1261 self.close();
1262
1263 if (self.config.mode === "range" && self.selectedDates.length === 1) {
1264 self.clear(false);
1265 self.redraw();
1266 }
1267 }
1268 }
1269 }
1270
1271 function changeYear(newYear) {
1272 if (!newYear || self.config.minDate && newYear < self.config.minDate.getFullYear() || self.config.maxDate && newYear > self.config.maxDate.getFullYear()) return;
1273 var newYearNum = newYear,
1274 isNewYear = self.currentYear !== newYearNum;
1275 self.currentYear = newYearNum || self.currentYear;
1276
1277 if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) {
1278 self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);
1279 } else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) {
1280 self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
1281 }
1282
1283 if (isNewYear) {
1284 self.redraw();
1285 triggerEvent("onYearChange");
1286 }
1287 }
1288
1289 function isEnabled(date, timeless) {
1290 if (timeless === void 0) {
1291 timeless = true;
1292 }
1293
1294 var dateToCheck = self.parseDate(date, undefined, timeless);
1295 if (self.config.minDate && dateToCheck && compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0 || self.config.maxDate && dateToCheck && compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0) return false;
1296 if (self.config.enable.length === 0 && self.config.disable.length === 0) return true;
1297 if (dateToCheck === undefined) return false;
1298 var bool = self.config.enable.length > 0,
1299 array = bool ? self.config.enable : self.config.disable;
1300
1301 for (var i = 0, d; i < array.length; i++) {
1302 d = array[i];
1303 if (typeof d === "function" && d(dateToCheck)) return bool;else if (d instanceof Date && dateToCheck !== undefined && d.getTime() === dateToCheck.getTime()) return bool;else if (typeof d === "string" && dateToCheck !== undefined) {
1304 var parsed = self.parseDate(d, undefined, true);
1305 return parsed && parsed.getTime() === dateToCheck.getTime() ? bool : !bool;
1306 } else if (typeof d === "object" && dateToCheck !== undefined && d.from && d.to && dateToCheck.getTime() >= d.from.getTime() && dateToCheck.getTime() <= d.to.getTime()) return bool;
1307 }
1308
1309 return !bool;
1310 }
1311
1312 function isInView(elem) {
1313 if (self.daysContainer !== undefined) return elem.className.indexOf("hidden") === -1 && self.daysContainer.contains(elem);
1314 return false;
1315 }
1316
1317 function onKeyDown(e) {
1318 var isInput = e.target === self._input;
1319 var allowInput = self.config.allowInput;
1320 var allowKeydown = self.isOpen && (!allowInput || !isInput);
1321 var allowInlineKeydown = self.config.inline && isInput && !allowInput;
1322
1323 if (e.keyCode === 13 && isInput) {
1324 if (allowInput) {
1325 self.setDate(self._input.value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat);
1326 return e.target.blur();
1327 } else self.open();
1328 } else if (isCalendarElem(e.target) || allowKeydown || allowInlineKeydown) {
1329 var isTimeObj = !!self.timeContainer && self.timeContainer.contains(e.target);
1330
1331 switch (e.keyCode) {
1332 case 13:
1333 if (isTimeObj) updateTime();else selectDate(e);
1334 break;
1335
1336 case 27:
1337 e.preventDefault();
1338 focusAndClose();
1339 break;
1340
1341 case 8:
1342 case 46:
1343 if (isInput && !self.config.allowInput) {
1344 e.preventDefault();
1345 self.clear();
1346 }
1347
1348 break;
1349
1350 case 37:
1351 case 39:
1352 if (!isTimeObj) {
1353 e.preventDefault();
1354
1355 if (self.daysContainer !== undefined && (allowInput === false || isInView(document.activeElement))) {
1356 var _delta = e.keyCode === 39 ? 1 : -1;
1357
1358 if (!e.ctrlKey) focusOnDay(undefined, _delta);else {
1359 changeMonth(_delta);
1360 focusOnDay(getFirstAvailableDay(1), 0);
1361 }
1362 }
1363 } else if (self.hourElement) self.hourElement.focus();
1364
1365 break;
1366
1367 case 38:
1368 case 40:
1369 e.preventDefault();
1370 var delta = e.keyCode === 40 ? 1 : -1;
1371
1372 if (self.daysContainer) {
1373 if (e.ctrlKey) {
1374 changeYear(self.currentYear - delta);
1375 focusOnDay(getFirstAvailableDay(1), 0);
1376 } else if (!isTimeObj) focusOnDay(undefined, delta * 7);
1377 } else if (self.config.enableTime) {
1378 if (!isTimeObj && self.hourElement) self.hourElement.focus();
1379 updateTime(e);
1380
1381 self._debouncedChange();
1382 }
1383
1384 break;
1385
1386 case 9:
1387 if (!isTimeObj) break;
1388 var elems = [self.hourElement, self.minuteElement, self.secondElement, self.amPM].filter(function (x) {
1389 return x;
1390 });
1391 var i = elems.indexOf(e.target);
1392
1393 if (i !== -1) {
1394 var target = elems[i + (e.shiftKey ? -1 : 1)];
1395
1396 if (target !== undefined) {
1397 e.preventDefault();
1398 target.focus();
1399 }
1400 }
1401
1402 break;
1403
1404 default:
1405 break;
1406 }
1407 }
1408
1409 if (self.amPM !== undefined && e.target === self.amPM) {
1410 switch (e.key) {
1411 case self.l10n.amPM[0].charAt(0):
1412 case self.l10n.amPM[0].charAt(0).toLowerCase():
1413 self.amPM.textContent = self.l10n.amPM[0];
1414 setHoursFromInputs();
1415 updateValue();
1416 break;
1417
1418 case self.l10n.amPM[1].charAt(0):
1419 case self.l10n.amPM[1].charAt(0).toLowerCase():
1420 self.amPM.textContent = self.l10n.amPM[1];
1421 setHoursFromInputs();
1422 updateValue();
1423 break;
1424 }
1425 }
1426
1427 triggerEvent("onKeyDown", e);
1428 }
1429
1430 function onMouseOver(elem) {
1431 if (self.selectedDates.length !== 1 || elem && (!elem.classList.contains("flatpickr-day") || elem.classList.contains("disabled"))) return;
1432 var hoverDate = elem ? elem.dateObj.getTime() : self.days.firstElementChild.dateObj.getTime(),
1433 initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(),
1434 rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()),
1435 rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime()),
1436 lastDate = self.daysContainer.lastChild.lastChild.dateObj.getTime();
1437 var containsDisabled = false;
1438 var minRange = 0,
1439 maxRange = 0;
1440
1441 for (var t = rangeStartDate; t < lastDate; t += duration.DAY) {
1442 if (!isEnabled(new Date(t), true)) {
1443 containsDisabled = containsDisabled || t > rangeStartDate && t < rangeEndDate;
1444 if (t < initialDate && (!minRange || t > minRange)) minRange = t;else if (t > initialDate && (!maxRange || t < maxRange)) maxRange = t;
1445 }
1446 }
1447
1448 for (var m = 0; m < self.config.showMonths; m++) {
1449 var month = self.daysContainer.children[m];
1450 var prevMonth = self.daysContainer.children[m - 1];
1451
1452 var _loop = function _loop(i, l) {
1453 var dayElem = month.children[i],
1454 date = dayElem.dateObj;
1455 var timestamp = date.getTime();
1456 var outOfRange = minRange > 0 && timestamp < minRange || maxRange > 0 && timestamp > maxRange;
1457
1458 if (outOfRange) {
1459 dayElem.classList.add("notAllowed");
1460 ["inRange", "startRange", "endRange"].forEach(function (c) {
1461 dayElem.classList.remove(c);
1462 });
1463 return "continue";
1464 } else if (containsDisabled && !outOfRange) return "continue";
1465
1466 ["startRange", "inRange", "endRange", "notAllowed"].forEach(function (c) {
1467 dayElem.classList.remove(c);
1468 });
1469
1470 if (elem !== undefined) {
1471 elem.classList.add(hoverDate < self.selectedDates[0].getTime() ? "startRange" : "endRange");
1472
1473 if (month.contains(elem) || !(m > 0 && prevMonth && prevMonth.lastChild.dateObj.getTime() >= timestamp)) {
1474 if (initialDate < hoverDate && timestamp === initialDate) dayElem.classList.add("startRange");else if (initialDate > hoverDate && timestamp === initialDate) dayElem.classList.add("endRange");
1475 if (timestamp >= minRange && (maxRange === 0 || timestamp <= maxRange) && isBetween(timestamp, initialDate, hoverDate)) dayElem.classList.add("inRange");
1476 }
1477 }
1478 };
1479
1480 for (var i = 0, l = month.children.length; i < l; i++) {
1481 var _ret = _loop(i, l);
1482
1483 if (_ret === "continue") continue;
1484 }
1485 }
1486 }
1487
1488 function onResize() {
1489 if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar();
1490 }
1491
1492 function open(e, positionElement) {
1493 if (positionElement === void 0) {
1494 positionElement = self._positionElement;
1495 }
1496
1497 if (self.isMobile === true) {
1498 if (e) {
1499 e.preventDefault();
1500 e.target && e.target.blur();
1501 }
1502
1503 setTimeout(function () {
1504 self.mobileInput !== undefined && self.mobileInput.focus();
1505 }, 0);
1506 triggerEvent("onOpen");
1507 return;
1508 }
1509
1510 if (self._input.disabled || self.config.inline) return;
1511 var wasOpen = self.isOpen;
1512 self.isOpen = true;
1513
1514 if (!wasOpen) {
1515 self.calendarContainer.classList.add("open");
1516
1517 self._input.classList.add("active");
1518
1519 triggerEvent("onOpen");
1520 positionCalendar(positionElement);
1521 }
1522
1523 if (self.config.enableTime === true && self.config.noCalendar === true) {
1524 if (self.selectedDates.length === 0) {
1525 self.setDate(self.config.minDate !== undefined ? new Date(self.config.minDate.getTime()) : new Date(), false);
1526 setDefaultHours();
1527 updateValue();
1528 }
1529
1530 if (self.config.allowInput === false && (e === undefined || !self.timeContainer.contains(e.relatedTarget))) {
1531 setTimeout(function () {
1532 return self.hourElement.select();
1533 }, 50);
1534 }
1535 }
1536 }
1537
1538 function minMaxDateSetter(type) {
1539 return function (date) {
1540 var dateObj = self.config["_" + type + "Date"] = self.parseDate(date, self.config.dateFormat);
1541 var inverseDateObj = self.config["_" + (type === "min" ? "max" : "min") + "Date"];
1542
1543 if (dateObj !== undefined) {
1544 self[type === "min" ? "minDateHasTime" : "maxDateHasTime"] = dateObj.getHours() > 0 || dateObj.getMinutes() > 0 || dateObj.getSeconds() > 0;
1545 }
1546
1547 if (self.selectedDates) {
1548 self.selectedDates = self.selectedDates.filter(function (d) {
1549 return isEnabled(d);
1550 });
1551 if (!self.selectedDates.length && type === "min") setHoursFromDate(dateObj);
1552 updateValue();
1553 }
1554
1555 if (self.daysContainer) {
1556 redraw();
1557 if (dateObj !== undefined) self.currentYearElement[type] = dateObj.getFullYear().toString();else self.currentYearElement.removeAttribute(type);
1558 self.currentYearElement.disabled = !!inverseDateObj && dateObj !== undefined && inverseDateObj.getFullYear() === dateObj.getFullYear();
1559 }
1560 };
1561 }
1562
1563 function parseConfig() {
1564 var boolOpts = ["wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
1565 var hooks = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition"];
1566 var userConfig = Object.assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {})));
1567 var formats$$1 = {};
1568 self.config.parseDate = userConfig.parseDate;
1569 self.config.formatDate = userConfig.formatDate;
1570 Object.defineProperty(self.config, "enable", {
1571 get: function get() {
1572 return self.config._enable;
1573 },
1574 set: function set(dates) {
1575 self.config._enable = parseDateRules(dates);
1576 }
1577 });
1578 Object.defineProperty(self.config, "disable", {
1579 get: function get() {
1580 return self.config._disable;
1581 },
1582 set: function set(dates) {
1583 self.config._disable = parseDateRules(dates);
1584 }
1585 });
1586 var timeMode = userConfig.mode === "time";
1587
1588 if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {
1589 formats$$1.dateFormat = userConfig.noCalendar || timeMode ? "H:i" + (userConfig.enableSeconds ? ":S" : "") : flatpickr.defaultConfig.dateFormat + " H:i" + (userConfig.enableSeconds ? ":S" : "");
1590 }
1591
1592 if (userConfig.altInput && (userConfig.enableTime || timeMode) && !userConfig.altFormat) {
1593 formats$$1.altFormat = userConfig.noCalendar || timeMode ? "h:i" + (userConfig.enableSeconds ? ":S K" : " K") : flatpickr.defaultConfig.altFormat + (" h:i" + (userConfig.enableSeconds ? ":S" : "") + " K");
1594 }
1595
1596 Object.defineProperty(self.config, "minDate", {
1597 get: function get() {
1598 return self.config._minDate;
1599 },
1600 set: minMaxDateSetter("min")
1601 });
1602 Object.defineProperty(self.config, "maxDate", {
1603 get: function get() {
1604 return self.config._maxDate;
1605 },
1606 set: minMaxDateSetter("max")
1607 });
1608
1609 var minMaxTimeSetter = function minMaxTimeSetter(type) {
1610 return function (val) {
1611 self.config[type === "min" ? "_minTime" : "_maxTime"] = self.parseDate(val, "H:i");
1612 };
1613 };
1614
1615 Object.defineProperty(self.config, "minTime", {
1616 get: function get() {
1617 return self.config._minTime;
1618 },
1619 set: minMaxTimeSetter("min")
1620 });
1621 Object.defineProperty(self.config, "maxTime", {
1622 get: function get() {
1623 return self.config._maxTime;
1624 },
1625 set: minMaxTimeSetter("max")
1626 });
1627
1628 if (userConfig.mode === "time") {
1629 self.config.noCalendar = true;
1630 self.config.enableTime = true;
1631 }
1632
1633 Object.assign(self.config, formats$$1, userConfig);
1634
1635 for (var i = 0; i < boolOpts.length; i++) {
1636 self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === "true";
1637 }
1638
1639 for (var _i = hooks.length; _i--;) {
1640 if (self.config[hooks[_i]] !== undefined) {
1641 self.config[hooks[_i]] = arrayify(self.config[hooks[_i]] || []).map(bindToInstance);
1642 }
1643 }
1644
1645 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);
1646
1647 for (var _i2 = 0; _i2 < self.config.plugins.length; _i2++) {
1648 var pluginConf = self.config.plugins[_i2](self) || {};
1649
1650 for (var key in pluginConf) {
1651 if (~hooks.indexOf(key)) {
1652 self.config[key] = arrayify(pluginConf[key]).map(bindToInstance).concat(self.config[key]);
1653 } else if (typeof userConfig[key] === "undefined") self.config[key] = pluginConf[key];
1654 }
1655 }
1656
1657 triggerEvent("onParseConfig");
1658 }
1659
1660 function setupLocale() {
1661 if (typeof self.config.locale !== "object" && typeof flatpickr.l10ns[self.config.locale] === "undefined") self.config.errorHandler(new Error("flatpickr: invalid locale " + self.config.locale));
1662 self.l10n = Object.assign({}, flatpickr.l10ns.default, typeof self.config.locale === "object" ? self.config.locale : self.config.locale !== "default" ? flatpickr.l10ns[self.config.locale] : undefined);
1663 tokenRegex.K = "(" + self.l10n.amPM[0] + "|" + self.l10n.amPM[1] + "|" + self.l10n.amPM[0].toLowerCase() + "|" + self.l10n.amPM[1].toLowerCase() + ")";
1664 self.formatDate = createDateFormatter(self);
1665 self.parseDate = createDateParser({
1666 config: self.config,
1667 l10n: self.l10n
1668 });
1669 }
1670
1671 function positionCalendar(customPositionElement) {
1672 if (self.calendarContainer === undefined) return;
1673 triggerEvent("onPreCalendarPosition");
1674 var positionElement = customPositionElement || self._positionElement;
1675 var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, function (acc, child) {
1676 return acc + child.offsetHeight;
1677 }, 0),
1678 calendarWidth = self.calendarContainer.offsetWidth,
1679 configPos = self.config.position.split(" "),
1680 configPosVertical = configPos[0],
1681 configPosHorizontal = configPos.length > 1 ? configPos[1] : null,
1682 inputBounds = positionElement.getBoundingClientRect(),
1683 distanceFromBottom = window.innerHeight - inputBounds.bottom,
1684 showOnTop = configPosVertical === "above" || configPosVertical !== "below" && distanceFromBottom < calendarHeight && inputBounds.top > calendarHeight;
1685 var top = window.pageYOffset + inputBounds.top + (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);
1686 toggleClass(self.calendarContainer, "arrowTop", !showOnTop);
1687 toggleClass(self.calendarContainer, "arrowBottom", showOnTop);
1688 if (self.config.inline) return;
1689 var left = window.pageXOffset + inputBounds.left - (configPosHorizontal != null && configPosHorizontal === "center" ? (calendarWidth - inputBounds.width) / 2 : 0);
1690 var right = window.document.body.offsetWidth - inputBounds.right;
1691 var rightMost = left + calendarWidth > window.document.body.offsetWidth;
1692 toggleClass(self.calendarContainer, "rightMost", rightMost);
1693 if (self.config.static) return;
1694 self.calendarContainer.style.top = top + "px";
1695
1696 if (!rightMost) {
1697 self.calendarContainer.style.left = left + "px";
1698 self.calendarContainer.style.right = "auto";
1699 } else {
1700 self.calendarContainer.style.left = "auto";
1701 self.calendarContainer.style.right = right + "px";
1702 }
1703 }
1704
1705 function redraw() {
1706 if (self.config.noCalendar || self.isMobile) return;
1707 updateNavigationCurrentMonth();
1708 buildDays();
1709 }
1710
1711 function focusAndClose() {
1712 self._input.focus();
1713
1714 if (window.navigator.userAgent.indexOf("MSIE") !== -1 || navigator.msMaxTouchPoints !== undefined) {
1715 setTimeout(self.close, 0);
1716 } else {
1717 self.close();
1718 }
1719 }
1720
1721 function selectDate(e) {
1722 e.preventDefault();
1723 e.stopPropagation();
1724
1725 var isSelectable = function isSelectable(day) {
1726 return day.classList && day.classList.contains("flatpickr-day") && !day.classList.contains("disabled") && !day.classList.contains("notAllowed");
1727 };
1728
1729 var t = findParent(e.target, isSelectable);
1730 if (t === undefined) return;
1731 var target = t;
1732 var selectedDate = self.latestSelectedDateObj = new Date(target.dateObj.getTime());
1733 var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth || selectedDate.getMonth() > self.currentMonth + self.config.showMonths - 1) && self.config.mode !== "range";
1734 self.selectedDateElem = target;
1735 if (self.config.mode === "single") self.selectedDates = [selectedDate];else if (self.config.mode === "multiple") {
1736 var selectedIndex = isDateSelected(selectedDate);
1737 if (selectedIndex) self.selectedDates.splice(parseInt(selectedIndex), 1);else self.selectedDates.push(selectedDate);
1738 } else if (self.config.mode === "range") {
1739 if (self.selectedDates.length === 2) self.clear(false);
1740 self.selectedDates.push(selectedDate);
1741 if (compareDates(selectedDate, self.selectedDates[0], true) !== 0) self.selectedDates.sort(function (a, b) {
1742 return a.getTime() - b.getTime();
1743 });
1744 }
1745 setHoursFromInputs();
1746
1747 if (shouldChangeMonth) {
1748 var isNewYear = self.currentYear !== selectedDate.getFullYear();
1749 self.currentYear = selectedDate.getFullYear();
1750 self.currentMonth = selectedDate.getMonth();
1751 if (isNewYear) triggerEvent("onYearChange");
1752 triggerEvent("onMonthChange");
1753 }
1754
1755 updateNavigationCurrentMonth();
1756 buildDays();
1757 updateValue();
1758 if (self.config.enableTime) setTimeout(function () {
1759 return self.showTimeInput = true;
1760 }, 50);
1761 if (!shouldChangeMonth && self.config.mode !== "range" && self.config.showMonths === 1) focusOnDayElem(target);else self.selectedDateElem && self.selectedDateElem.focus();
1762 if (self.hourElement !== undefined) setTimeout(function () {
1763 return self.hourElement !== undefined && self.hourElement.select();
1764 }, 451);
1765
1766 if (self.config.closeOnSelect) {
1767 var single = self.config.mode === "single" && !self.config.enableTime;
1768 var range = self.config.mode === "range" && self.selectedDates.length === 2 && !self.config.enableTime;
1769
1770 if (single || range) {
1771 focusAndClose();
1772 }
1773 }
1774
1775 triggerChange();
1776 }
1777
1778 var CALLBACKS = {
1779 locale: [setupLocale, updateWeekdays],
1780 showMonths: [buildMonths, setCalendarWidth, buildWeekdays]
1781 };
1782
1783 function set(option, value) {
1784 if (option !== null && typeof option === "object") Object.assign(self.config, option);else {
1785 self.config[option] = value;
1786 if (CALLBACKS[option] !== undefined) CALLBACKS[option].forEach(function (x) {
1787 return x();
1788 });
1789 }
1790 self.redraw();
1791 jumpToDate();
1792 }
1793
1794 function setSelectedDate(inputDate, format) {
1795 var dates = [];
1796 if (inputDate instanceof Array) dates = inputDate.map(function (d) {
1797 return self.parseDate(d, format);
1798 });else if (inputDate instanceof Date || typeof inputDate === "number") dates = [self.parseDate(inputDate, format)];else if (typeof inputDate === "string") {
1799 switch (self.config.mode) {
1800 case "single":
1801 case "time":
1802 dates = [self.parseDate(inputDate, format)];
1803 break;
1804
1805 case "multiple":
1806 dates = inputDate.split(self.config.conjunction).map(function (date) {
1807 return self.parseDate(date, format);
1808 });
1809 break;
1810
1811 case "range":
1812 dates = inputDate.split(self.l10n.rangeSeparator).map(function (date) {
1813 return self.parseDate(date, format);
1814 });
1815 break;
1816
1817 default:
1818 break;
1819 }
1820 } else self.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(inputDate)));
1821 self.selectedDates = dates.filter(function (d) {
1822 return d instanceof Date && isEnabled(d, false);
1823 });
1824 if (self.config.mode === "range") self.selectedDates.sort(function (a, b) {
1825 return a.getTime() - b.getTime();
1826 });
1827 }
1828
1829 function setDate(date, triggerChange, format) {
1830 if (triggerChange === void 0) {
1831 triggerChange = false;
1832 }
1833
1834 if (format === void 0) {
1835 format = self.config.dateFormat;
1836 }
1837
1838 if (date !== 0 && !date || date instanceof Array && date.length === 0) return self.clear(triggerChange);
1839 setSelectedDate(date, format);
1840 self.showTimeInput = self.selectedDates.length > 0;
1841 self.latestSelectedDateObj = self.selectedDates[0];
1842 self.redraw();
1843 jumpToDate();
1844 setHoursFromDate();
1845 updateValue(triggerChange);
1846 if (triggerChange) triggerEvent("onChange");
1847 }
1848
1849 function parseDateRules(arr) {
1850 return arr.slice().map(function (rule) {
1851 if (typeof rule === "string" || typeof rule === "number" || rule instanceof Date) {
1852 return self.parseDate(rule, undefined, true);
1853 } else if (rule && typeof rule === "object" && rule.from && rule.to) return {
1854 from: self.parseDate(rule.from, undefined),
1855 to: self.parseDate(rule.to, undefined)
1856 };
1857
1858 return rule;
1859 }).filter(function (x) {
1860 return x;
1861 });
1862 }
1863
1864 function setupDates() {
1865 self.selectedDates = [];
1866 self.now = self.parseDate(self.config.now) || new Date();
1867 var preloadedDate = self.config.defaultDate || ((self.input.nodeName === "INPUT" || self.input.nodeName === "TEXTAREA") && self.input.placeholder && self.input.value === self.input.placeholder ? null : self.input.value);
1868 if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat);
1869 var initialDate = self.selectedDates.length > 0 ? self.selectedDates[0] : self.config.minDate && self.config.minDate.getTime() > self.now.getTime() ? self.config.minDate : self.config.maxDate && self.config.maxDate.getTime() < self.now.getTime() ? self.config.maxDate : self.now;
1870 self.currentYear = initialDate.getFullYear();
1871 self.currentMonth = initialDate.getMonth();
1872 if (self.selectedDates.length > 0) self.latestSelectedDateObj = self.selectedDates[0];
1873 if (self.config.minTime !== undefined) self.config.minTime = self.parseDate(self.config.minTime, "H:i");
1874 if (self.config.maxTime !== undefined) self.config.maxTime = self.parseDate(self.config.maxTime, "H:i");
1875 self.minDateHasTime = !!self.config.minDate && (self.config.minDate.getHours() > 0 || self.config.minDate.getMinutes() > 0 || self.config.minDate.getSeconds() > 0);
1876 self.maxDateHasTime = !!self.config.maxDate && (self.config.maxDate.getHours() > 0 || self.config.maxDate.getMinutes() > 0 || self.config.maxDate.getSeconds() > 0);
1877 Object.defineProperty(self, "showTimeInput", {
1878 get: function get() {
1879 return self._showTimeInput;
1880 },
1881 set: function set(bool) {
1882 self._showTimeInput = bool;
1883 if (self.calendarContainer) toggleClass(self.calendarContainer, "showTimeInput", bool);
1884 self.isOpen && positionCalendar();
1885 }
1886 });
1887 }
1888
1889 function setupInputs() {
1890 self.input = self.config.wrap ? element.querySelector("[data-input]") : element;
1891
1892 if (!self.input) {
1893 self.config.errorHandler(new Error("Invalid input element specified"));
1894 return;
1895 }
1896
1897 self.input._type = self.input.type;
1898 self.input.type = "text";
1899 self.input.classList.add("flatpickr-input");
1900 self._input = self.input;
1901
1902 if (self.config.altInput) {
1903 self.altInput = createElement(self.input.nodeName, self.input.className + " " + self.config.altInputClass);
1904 self._input = self.altInput;
1905 self.altInput.placeholder = self.input.placeholder;
1906 self.altInput.disabled = self.input.disabled;
1907 self.altInput.required = self.input.required;
1908 self.altInput.tabIndex = self.input.tabIndex;
1909 self.altInput.type = "text";
1910 self.input.setAttribute("type", "hidden");
1911 if (!self.config.static && self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);
1912 }
1913
1914 if (!self.config.allowInput) self._input.setAttribute("readonly", "readonly");
1915 self._positionElement = self.config.positionElement || self._input;
1916 }
1917
1918 function setupMobile() {
1919 var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
1920 self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile");
1921 self.mobileInput.step = self.input.getAttribute("step") || "any";
1922 self.mobileInput.tabIndex = 1;
1923 self.mobileInput.type = inputType;
1924 self.mobileInput.disabled = self.input.disabled;
1925 self.mobileInput.required = self.input.required;
1926 self.mobileInput.placeholder = self.input.placeholder;
1927 self.mobileFormatStr = inputType === "datetime-local" ? "Y-m-d\\TH:i:S" : inputType === "date" ? "Y-m-d" : "H:i:S";
1928
1929 if (self.selectedDates.length > 0) {
1930 self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);
1931 }
1932
1933 if (self.config.minDate) self.mobileInput.min = self.formatDate(self.config.minDate, "Y-m-d");
1934 if (self.config.maxDate) self.mobileInput.max = self.formatDate(self.config.maxDate, "Y-m-d");
1935 self.input.type = "hidden";
1936 if (self.altInput !== undefined) self.altInput.type = "hidden";
1937
1938 try {
1939 if (self.input.parentNode) self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);
1940 } catch (_a) {}
1941
1942 bind(self.mobileInput, "change", function (e) {
1943 self.setDate(e.target.value, false, self.mobileFormatStr);
1944 triggerEvent("onChange");
1945 triggerEvent("onClose");
1946 });
1947 }
1948
1949 function toggle(e) {
1950 if (self.isOpen === true) return self.close();
1951 self.open(e);
1952 }
1953
1954 function triggerEvent(event, data) {
1955 var hooks = self.config[event];
1956
1957 if (hooks !== undefined && hooks.length > 0) {
1958 for (var i = 0; hooks[i] && i < hooks.length; i++) {
1959 hooks[i](self.selectedDates, self.input.value, self, data);
1960 }
1961 }
1962
1963 if (event === "onChange") {
1964 self.input.dispatchEvent(createEvent("change"));
1965 self.input.dispatchEvent(createEvent("input"));
1966 }
1967 }
1968
1969 function createEvent(name) {
1970 var e = document.createEvent("Event");
1971 e.initEvent(name, true, true);
1972 return e;
1973 }
1974
1975 function isDateSelected(date) {
1976 for (var i = 0; i < self.selectedDates.length; i++) {
1977 if (compareDates(self.selectedDates[i], date) === 0) return "" + i;
1978 }
1979
1980 return false;
1981 }
1982
1983 function isDateInRange(date) {
1984 if (self.config.mode !== "range" || self.selectedDates.length < 2) return false;
1985 return compareDates(date, self.selectedDates[0]) >= 0 && compareDates(date, self.selectedDates[1]) <= 0;
1986 }
1987
1988 function updateNavigationCurrentMonth() {
1989 if (self.config.noCalendar || self.isMobile || !self.monthNav) return;
1990 self.yearElements.forEach(function (yearElement, i) {
1991 var d = new Date(self.currentYear, self.currentMonth, 1);
1992 d.setMonth(self.currentMonth + i);
1993 self.monthElements[i].textContent = monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + " ";
1994 yearElement.value = d.getFullYear().toString();
1995 });
1996 self._hidePrevMonthArrow = self.config.minDate !== undefined && (self.currentYear === self.config.minDate.getFullYear() ? self.currentMonth <= self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear());
1997 self._hideNextMonthArrow = self.config.maxDate !== undefined && (self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear());
1998 }
1999
2000 function updateValue(triggerChange) {
2001 if (triggerChange === void 0) {
2002 triggerChange = true;
2003 }
2004
2005 if (self.selectedDates.length === 0) return self.clear(triggerChange);
2006
2007 if (self.mobileInput !== undefined && self.mobileFormatStr) {
2008 self.mobileInput.value = self.latestSelectedDateObj !== undefined ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr) : "";
2009 }
2010
2011 var joinChar = self.config.mode !== "range" ? self.config.conjunction : self.l10n.rangeSeparator;
2012 self.input.value = self.selectedDates.map(function (dObj) {
2013 return self.formatDate(dObj, self.config.dateFormat);
2014 }).join(joinChar);
2015
2016 if (self.altInput !== undefined) {
2017 self.altInput.value = self.selectedDates.map(function (dObj) {
2018 return self.formatDate(dObj, self.config.altFormat);
2019 }).join(joinChar);
2020 }
2021
2022 if (triggerChange !== false) triggerEvent("onValueUpdate");
2023 }
2024
2025 function onMonthNavClick(e) {
2026 e.preventDefault();
2027 var isPrevMonth = self.prevMonthNav.contains(e.target);
2028 var isNextMonth = self.nextMonthNav.contains(e.target);
2029
2030 if (isPrevMonth || isNextMonth) {
2031 changeMonth(isPrevMonth ? -1 : 1);
2032 } else if (self.yearElements.indexOf(e.target) >= 0) {
2033 e.target.select();
2034 } else if (e.target.classList.contains("arrowUp")) {
2035 self.changeYear(self.currentYear + 1);
2036 } else if (e.target.classList.contains("arrowDown")) {
2037 self.changeYear(self.currentYear - 1);
2038 }
2039 }
2040
2041 function timeWrapper(e) {
2042 e.preventDefault();
2043 var isKeyDown = e.type === "keydown",
2044 input = e.target;
2045
2046 if (self.amPM !== undefined && e.target === self.amPM) {
2047 self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];
2048 }
2049
2050 var min = parseFloat(input.getAttribute("data-min")),
2051 max = parseFloat(input.getAttribute("data-max")),
2052 step = parseFloat(input.getAttribute("data-step")),
2053 curValue = parseInt(input.value, 10),
2054 delta = e.delta || (isKeyDown ? e.which === 38 ? 1 : -1 : 0);
2055 var newValue = curValue + step * delta;
2056
2057 if (typeof input.value !== "undefined" && input.value.length === 2) {
2058 var isHourElem = input === self.hourElement,
2059 isMinuteElem = input === self.minuteElement;
2060
2061 if (newValue < min) {
2062 newValue = max + newValue + int(!isHourElem) + (int(isHourElem) && int(!self.amPM));
2063 if (isMinuteElem) incrementNumInput(undefined, -1, self.hourElement);
2064 } else if (newValue > max) {
2065 newValue = input === self.hourElement ? newValue - max - int(!self.amPM) : min;
2066 if (isMinuteElem) incrementNumInput(undefined, 1, self.hourElement);
2067 }
2068
2069 if (self.amPM && isHourElem && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) {
2070 self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];
2071 }
2072
2073 input.value = pad(newValue);
2074 }
2075 }
2076
2077 init();
2078 return self;
2079 }
2080
2081 function _flatpickr(nodeList, config) {
2082 var nodes = Array.prototype.slice.call(nodeList);
2083 var instances = [];
2084
2085 for (var i = 0; i < nodes.length; i++) {
2086 var node = nodes[i];
2087
2088 try {
2089 if (node.getAttribute("data-fp-omit") !== null) continue;
2090
2091 if (node._flatpickr !== undefined) {
2092 node._flatpickr.destroy();
2093
2094 node._flatpickr = undefined;
2095 }
2096
2097 node._flatpickr = FlatpickrInstance(node, config || {});
2098 instances.push(node._flatpickr);
2099 } catch (e) {
2100 console.error(e);
2101 }
2102 }
2103
2104 return instances.length === 1 ? instances[0] : instances;
2105 }
2106
2107 if (typeof HTMLElement !== "undefined") {
2108 HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {
2109 return _flatpickr(this, config);
2110 };
2111
2112 HTMLElement.prototype.flatpickr = function (config) {
2113 return _flatpickr([this], config);
2114 };
2115 }
2116
2117 var flatpickr = function flatpickr(selector, config) {
2118 if (selector instanceof NodeList) return _flatpickr(selector, config);else if (typeof selector === "string") return _flatpickr(window.document.querySelectorAll(selector), config);
2119 return _flatpickr([selector], config);
2120 };
2121
2122 flatpickr.defaultConfig = defaults;
2123 flatpickr.l10ns = {
2124 en: Object.assign({}, english),
2125 default: Object.assign({}, english)
2126 };
2127
2128 flatpickr.localize = function (l10n) {
2129 flatpickr.l10ns.default = Object.assign({}, flatpickr.l10ns.default, l10n);
2130 };
2131
2132 flatpickr.setDefaults = function (config) {
2133 flatpickr.defaultConfig = Object.assign({}, flatpickr.defaultConfig, config);
2134 };
2135
2136 flatpickr.parseDate = createDateParser({});
2137 flatpickr.formatDate = createDateFormatter({});
2138 flatpickr.compareDates = compareDates;
2139
2140 if (typeof jQuery !== "undefined") {
2141 jQuery.fn.flatpickr = function (config) {
2142 return _flatpickr(this, config);
2143 };
2144 }
2145
2146 Date.prototype.fp_incr = function (days) {
2147 return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === "string" ? parseInt(days, 10) : days));
2148 };
2149
2150 if (typeof window !== "undefined") {
2151 window.flatpickr = flatpickr;
2152 }
2153
2154 return flatpickr;
2155
2156 })));
2157