flatpickr 2.2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +50 -0
  8. data/Rakefile +36 -0
  9. data/bin/console +7 -0
  10. data/bin/setup +6 -0
  11. data/flatpickr.gemspec +26 -0
  12. data/lib/flatpickr.rb +4 -0
  13. data/lib/flatpickr/engine.rb +4 -0
  14. data/lib/flatpickr/version.rb +3 -0
  15. data/vendor/assets/javascripts/flatpickr.js +1592 -0
  16. data/vendor/assets/javascripts/flatpickr/l10n/ar.js +16 -0
  17. data/vendor/assets/javascripts/flatpickr/l10n/bg.js +16 -0
  18. data/vendor/assets/javascripts/flatpickr/l10n/bn.js +16 -0
  19. data/vendor/assets/javascripts/flatpickr/l10n/cat.js +36 -0
  20. data/vendor/assets/javascripts/flatpickr/l10n/cs.js +22 -0
  21. data/vendor/assets/javascripts/flatpickr/l10n/da.js +20 -0
  22. data/vendor/assets/javascripts/flatpickr/l10n/de.js +16 -0
  23. data/vendor/assets/javascripts/flatpickr/l10n/es.js +22 -0
  24. data/vendor/assets/javascripts/flatpickr/l10n/et.js +27 -0
  25. data/vendor/assets/javascripts/flatpickr/l10n/fa.js +20 -0
  26. data/vendor/assets/javascripts/flatpickr/l10n/fi.js +22 -0
  27. data/vendor/assets/javascripts/flatpickr/l10n/fr.js +26 -0
  28. data/vendor/assets/javascripts/flatpickr/l10n/he.js +16 -0
  29. data/vendor/assets/javascripts/flatpickr/l10n/hi.js +16 -0
  30. data/vendor/assets/javascripts/flatpickr/l10n/hr.js +19 -0
  31. data/vendor/assets/javascripts/flatpickr/l10n/hu.js +27 -0
  32. data/vendor/assets/javascripts/flatpickr/l10n/id.js +22 -0
  33. data/vendor/assets/javascripts/flatpickr/l10n/it.js +27 -0
  34. data/vendor/assets/javascripts/flatpickr/l10n/ja.js +16 -0
  35. data/vendor/assets/javascripts/flatpickr/l10n/ko.js +20 -0
  36. data/vendor/assets/javascripts/flatpickr/l10n/lt.js +27 -0
  37. data/vendor/assets/javascripts/flatpickr/l10n/ms.js +22 -0
  38. data/vendor/assets/javascripts/flatpickr/l10n/my.js +22 -0
  39. data/vendor/assets/javascripts/flatpickr/l10n/nl.js +26 -0
  40. data/vendor/assets/javascripts/flatpickr/l10n/no.js +20 -0
  41. data/vendor/assets/javascripts/flatpickr/l10n/pa.js +16 -0
  42. data/vendor/assets/javascripts/flatpickr/l10n/pl.js +20 -0
  43. data/vendor/assets/javascripts/flatpickr/l10n/pt.js +16 -0
  44. data/vendor/assets/javascripts/flatpickr/l10n/ro.js +23 -0
  45. data/vendor/assets/javascripts/flatpickr/l10n/ru.js +16 -0
  46. data/vendor/assets/javascripts/flatpickr/l10n/si.js +17 -0
  47. data/vendor/assets/javascripts/flatpickr/l10n/sq.js +16 -0
  48. data/vendor/assets/javascripts/flatpickr/l10n/sv.js +22 -0
  49. data/vendor/assets/javascripts/flatpickr/l10n/tr.js +18 -0
  50. data/vendor/assets/javascripts/flatpickr/l10n/uk.js +16 -0
  51. data/vendor/assets/javascripts/flatpickr/l10n/vn.js +19 -0
  52. data/vendor/assets/javascripts/flatpickr/l10n/zh.js +17 -0
  53. data/vendor/assets/stylesheets/flatpickr.css +13 -0
  54. data/vendor/assets/stylesheets/flatpickr/rtl/flatpickr.min.css +13 -0
  55. data/vendor/assets/stylesheets/flatpickr/rtl/themes/airbnb.rtl.css +13 -0
  56. data/vendor/assets/stylesheets/flatpickr/rtl/themes/base16_flat.rtl.css +13 -0
  57. data/vendor/assets/stylesheets/flatpickr/rtl/themes/confetti.rtl.css +13 -0
  58. data/vendor/assets/stylesheets/flatpickr/rtl/themes/dark.rtl.css +13 -0
  59. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_blue.rtl.css +13 -0
  60. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_green.rtl.css +13 -0
  61. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_orange.rtl.css +13 -0
  62. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_red.rtl.css +13 -0
  63. data/vendor/assets/stylesheets/flatpickr/themes/airbnb.css +13 -0
  64. data/vendor/assets/stylesheets/flatpickr/themes/base16_flat.css +13 -0
  65. data/vendor/assets/stylesheets/flatpickr/themes/confetti.css +13 -0
  66. data/vendor/assets/stylesheets/flatpickr/themes/dark.css +13 -0
  67. data/vendor/assets/stylesheets/flatpickr/themes/material_blue.css +13 -0
  68. data/vendor/assets/stylesheets/flatpickr/themes/material_green.css +13 -0
  69. data/vendor/assets/stylesheets/flatpickr/themes/material_orange.css +13 -0
  70. data/vendor/assets/stylesheets/flatpickr/themes/material_red.css +13 -0
  71. metadata +155 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1f16113be7ae81dac29d1803bca10a8c0c376eba
4
+ data.tar.gz: 15e9510dea12d8cb87796b717b720d53515cb265
5
+ SHA512:
6
+ metadata.gz: a7e576bbd1ddb73e3c498f2e3a328aba0f53e12e0adbeaa921fe0806d28380803f7622de30b134943ec88b321e6aa897807a3f85be680e0723823e1625aedfb4
7
+ data.tar.gz: b4c6071c31e88f220baccd41e0357e6c498a948cce1f9485c5cfa2d15a3f75f73ac07f4286555a00e53d644198cf6858428cfa4efebaade5433477ba051ac9a4
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /flatpickr_source/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.3
5
+ before_install: gem install bundler -v 1.13.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Zoran Pesic
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # flatpickr
2
+
3
+ [Flatpickr](https://github.com/chmln/flatpickr) is a lightweight and powerful datetimepicker with no dependencies. This gem packages flatpickr's assets for drop-in use in Rails applications.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'flatpickr'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ In your application.css, add the following:
20
+
21
+ ```sass
22
+ *= require flatpickr
23
+
24
+ /* Optionally, you can include any of the flatpickr themes by adding in their styles, like so: */
25
+ *= require flatpickr/themes/dark
26
+ ```
27
+
28
+ And in your application.js:
29
+
30
+ ```js
31
+ //= require flatpickr
32
+ //
33
+ // Locales can be included like so:
34
+ //= require flatpickr/l10n/da
35
+ ```
36
+
37
+ To initialize flatpickr:
38
+
39
+ ```js
40
+ flatpickr('.your-selector');
41
+
42
+ // if using jQuery
43
+ $('.your-selector').flatpickr();
44
+ ```
45
+
46
+ See [flatpickr's docs](https://chmln.github.io/flatpickr/) for configuration and usage info.
47
+
48
+ ## License
49
+
50
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'flatpickr/version'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
8
+
9
+ namespace :flatpickr do
10
+ namespace :assets do
11
+ desc 'Update Flatpickr\'s assets.'
12
+ task update: :clean do
13
+ version = Flatpickr::VERSION.sub(/.\d+$/, '')
14
+
15
+ sh 'git clone git@github.com:chmln/flatpickr.git flatpickr_source'
16
+ sh "cd flatpickr_source && git checkout tags/v#{version}"
17
+
18
+ sh 'cp flatpickr_source/dist/flatpickr.js vendor/assets/javascripts/flatpickr.js'
19
+ sh 'cp -R flatpickr_source/dist/l10n/ vendor/assets/javascripts/flatpickr/l10n/'
20
+
21
+ sh 'cp flatpickr_source/dist/flatpickr.min.css vendor/assets/stylesheets/flatpickr.css'
22
+ sh 'cp -R flatpickr_source/dist/rtl/ vendor/assets/stylesheets/flatpickr/rtl/'
23
+ sh 'cp -R flatpickr_source/dist/themes/ vendor/assets/stylesheets/flatpickr/themes/'
24
+
25
+ puts "\n=*=*=*=*=*=*=*=*=*=*\n=* ASSETS UPDATED! *=\n=*=*=*=*=*=*=*=*=*=*\n"
26
+ end
27
+
28
+ desc 'Remove previous Flatpickr assets.'
29
+ task :clean do
30
+ sh 'rm -rf vendor'
31
+ sh 'rm -rf flatpickr_source'
32
+ sh 'mkdir -p vendor/assets/stylesheets/flatpickr/'
33
+ sh 'mkdir -p vendor/assets/javascripts/flatpickr/'
34
+ end
35
+ end
36
+ end
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'flatpickr'
5
+
6
+ require 'irb'
7
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
data/flatpickr.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'flatpickr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'flatpickr'
8
+ spec.version = Flatpickr::VERSION
9
+ spec.authors = ['Zoran']
10
+ spec.email = ['zoran1991@gmail.com']
11
+
12
+ spec.summary = %q{Flatpickr packaged for use in Rails projects.}
13
+ spec.homepage = 'https://github.com/zokioki/flatpickr_rails'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.13'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.0'
26
+ end
data/lib/flatpickr.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'flatpickr/version'
2
+ require 'flatpickr/engine' if (defined?(Rails) && defined?(Rails::Engine))
3
+
4
+ module Flatpickr; end
@@ -0,0 +1,4 @@
1
+ module Flatpickr
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Flatpickr
2
+ VERSION = '2.2.2.0'
3
+ end
@@ -0,0 +1,1592 @@
1
+ var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
2
+
3
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
+
5
+ /*! flatpickr v2.2.2, @license MIT */
6
+ function Flatpickr(element, config) {
7
+ var self = this;
8
+
9
+ function init() {
10
+ if (element._flatpickr) destroy(element._flatpickr);
11
+
12
+ element._flatpickr = self;
13
+
14
+ self.element = element;
15
+ self.instanceConfig = config || {};
16
+
17
+ setupFormats();
18
+
19
+ parseConfig();
20
+ setupLocale();
21
+ setupInputs();
22
+ setupDates();
23
+
24
+ setupHelperFunctions();
25
+
26
+ self.isOpen = self.config.inline;
27
+ self.changeMonth = changeMonth;
28
+ self.clear = clear;
29
+ self.close = close;
30
+ self.destroy = destroy;
31
+ self.formatDate = formatDate;
32
+ self.jumpToDate = jumpToDate;
33
+ self.open = open;
34
+ self.parseDate = parseDate;
35
+ self.redraw = redraw;
36
+ self.set = set;
37
+ self.setDate = setDate;
38
+ self.toggle = toggle;
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);
41
+
42
+ if (!self.isMobile) build();
43
+
44
+ bind();
45
+
46
+ self.minDateHasTime = self.config.minDate && (self.config.minDate.getHours() || self.config.minDate.getMinutes() || self.config.minDate.getSeconds());
47
+
48
+ self.maxDateHasTime = self.config.maxDate && (self.config.maxDate.getHours() || self.config.maxDate.getMinutes() || self.config.maxDate.getSeconds());
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
+ });
56
+
57
+ self.dateIsPicked = self.selectedDates.length > 0;
58
+
59
+ if (self.selectedDates.length) {
60
+ if (self.config.enableTime) setHoursFromDate();
61
+ updateValue();
62
+ }
63
+
64
+ triggerEvent("Ready");
65
+ }
66
+
67
+ function updateTime(e) {
68
+ if (self.config.noCalendar && !self.selectedDates.length)
69
+ // picking time only
70
+ self.selectedDates = [self.now];
71
+
72
+ timeWrapper(e);
73
+
74
+ if (!self.selectedDates.length) return;
75
+
76
+ setHoursFromInputs();
77
+ updateValue();
78
+ }
79
+
80
+ function setHoursFromInputs() {
81
+ if (!self.config.enableTime) return;
82
+
83
+ 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;
86
+
87
+ if (self.amPM) hours = hours % 12 + 12 * (self.amPM.innerHTML === "PM");
88
+
89
+ if (self.minDateHasTime && compareDates(latestSelectedDateObj(), self.config.minDate) === 0) {
90
+ hours = Math.max(hours, self.config.minDate.getHours());
91
+ if (hours === self.config.minDate.getHours()) minutes = Math.max(minutes, self.config.minDate.getMinutes());
92
+ } else if (self.maxDateHasTime && compareDates(latestSelectedDateObj(), self.config.maxDate) === 0) {
93
+ hours = Math.min(hours, self.config.maxDate.getHours());
94
+ if (hours === self.config.maxDate.getHours()) minutes = Math.min(minutes, self.config.maxDate.getMinutes());
95
+ }
96
+
97
+ setHours(hours, minutes, seconds);
98
+ }
99
+
100
+ function setHoursFromDate(dateObj) {
101
+ var date = dateObj || latestSelectedDateObj();
102
+
103
+ if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds());
104
+ }
105
+
106
+ function setHours(hours, minutes, seconds) {
107
+ if (self.selectedDates.length) self.selectedDates[self.selectedDates.length - 1].setHours(hours % 24, minutes, seconds || 0, 0);
108
+
109
+ if (!self.config.enableTime || self.isMobile) return;
110
+
111
+ self.hourElement.value = self.pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * (hours % 12 === 0) : hours);
112
+
113
+ self.minuteElement.value = self.pad(minutes);
114
+
115
+ if (!self.config.time_24hr && self.selectedDates.length) self.amPM.textContent = latestSelectedDateObj().getHours() >= 12 ? "PM" : "AM";
116
+
117
+ if (self.config.enableSeconds) self.secondElement.value = self.pad(seconds);
118
+ }
119
+
120
+ function bind() {
121
+ if (self.config.wrap) {
122
+ ["open", "close", "toggle", "clear"].forEach(function (el) {
123
+ try {
124
+ self.element.querySelector("[data-" + el + "]").addEventListener("click", self[el]);
125
+ } catch (e) {
126
+ //
127
+ }
128
+ });
129
+ }
130
+
131
+ if ("createEvent" in document) {
132
+ self.changeEvent = document.createEvent("HTMLEvents");
133
+ self.changeEvent.initEvent("change", false, true);
134
+ }
135
+
136
+ if (self.isMobile) return setupMobile();
137
+
138
+ self.debouncedResize = debounce(onResize, 100);
139
+ self.triggerChange = function () {
140
+ return triggerEvent("Change");
141
+ };
142
+ self.debouncedChange = debounce(self.triggerChange, 1000);
143
+
144
+ if (self.config.mode === "range") self.days.addEventListener("mouseover", onMouseOver);
145
+
146
+ document.addEventListener("keydown", onKeyDown);
147
+ window.addEventListener("resize", self.debouncedResize);
148
+
149
+ document.addEventListener("click", documentClick);
150
+ document.addEventListener("blur", documentClick);
151
+
152
+ if (self.config.clickOpens) (self.altInput || self.input).addEventListener("focus", open);
153
+
154
+ if (!self.config.noCalendar) {
155
+ self.prevMonthNav.addEventListener("click", function () {
156
+ return changeMonth(-1);
157
+ });
158
+ self.nextMonthNav.addEventListener("click", function () {
159
+ return changeMonth(1);
160
+ });
161
+
162
+ self.currentYearElement.addEventListener("wheel", function (e) {
163
+ return debounce(yearScroll(e), 50);
164
+ });
165
+ self.currentYearElement.addEventListener("focus", function () {
166
+ self.currentYearElement.select();
167
+ });
168
+
169
+ self.currentYearElement.addEventListener("input", function (event) {
170
+ if (event.target.value.length === 4) {
171
+ self.currentYearElement.blur();
172
+ handleYearChange(event.target.value);
173
+ event.target.value = self.currentYear;
174
+ }
175
+ });
176
+
177
+ self.days.addEventListener("click", selectDate);
178
+ }
179
+
180
+ if (self.config.enableTime) {
181
+ self.timeContainer.addEventListener("wheel", function (e) {
182
+ return debounce(updateTime(e), 5);
183
+ });
184
+ self.timeContainer.addEventListener("input", updateTime);
185
+
186
+ self.timeContainer.addEventListener("wheel", self.debouncedChange);
187
+ self.timeContainer.addEventListener("input", self.triggerChange);
188
+
189
+ self.hourElement.addEventListener("focus", function () {
190
+ self.hourElement.select();
191
+ });
192
+ self.minuteElement.addEventListener("focus", function () {
193
+ self.minuteElement.select();
194
+ });
195
+
196
+ if (self.secondElement) {
197
+ self.secondElement.addEventListener("focus", function () {
198
+ self.secondElement.select();
199
+ });
200
+ }
201
+
202
+ if (self.amPM) {
203
+ self.amPM.addEventListener("click", function (e) {
204
+ updateTime(e);
205
+ self.triggerChange(e);
206
+ });
207
+ }
208
+ }
209
+ }
210
+
211
+ function jumpToDate(jumpDate) {
212
+ jumpDate = jumpDate ? parseDate(jumpDate) : latestSelectedDateObj() || (self.config.minDate > self.now ? self.config.minDate : self.now);
213
+
214
+ try {
215
+ self.currentYear = jumpDate.getFullYear();
216
+ self.currentMonth = jumpDate.getMonth();
217
+ } catch (e) {
218
+ console.error(e.stack);
219
+ console.warn("Invalid date supplied: " + jumpDate);
220
+ }
221
+
222
+ self.redraw();
223
+ }
224
+
225
+ function incrementNumInput(e, delta) {
226
+ var input = e.target.parentNode.childNodes[0];
227
+ input.value = parseInt(input.value, 10) + delta * (input.step || 1);
228
+
229
+ try {
230
+ input.dispatchEvent(new Event("input", { "bubbles": true }));
231
+ } catch (e) {
232
+ var ev = document.createEvent('CustomEvent');
233
+ ev.initCustomEvent('input', true, true, {});
234
+ input.dispatchEvent(ev);
235
+ }
236
+ }
237
+
238
+ function createNumberInput(inputClassName) {
239
+ var wrapper = createElement("div", "numInputWrapper"),
240
+ numInput = createElement("input", "numInput " + inputClassName),
241
+ arrowUp = createElement("span", "arrowUp"),
242
+ arrowDown = createElement("span", "arrowDown");
243
+
244
+ numInput.type = "text";
245
+ wrapper.appendChild(numInput);
246
+ wrapper.appendChild(arrowUp);
247
+ wrapper.appendChild(arrowDown);
248
+
249
+ arrowUp.addEventListener("click", function (e) {
250
+ return incrementNumInput(e, 1);
251
+ });
252
+ arrowDown.addEventListener("click", function (e) {
253
+ return incrementNumInput(e, -1);
254
+ });
255
+ return wrapper;
256
+ }
257
+
258
+ function build() {
259
+ var fragment = document.createDocumentFragment();
260
+ self.calendarContainer = createElement("div", "flatpickr-calendar");
261
+ self.numInputType = navigator.userAgent.indexOf("MSIE 9.0") > 0 ? "text" : "number";
262
+
263
+ if (!self.config.noCalendar) {
264
+ fragment.appendChild(buildMonthNav());
265
+ self.innerContainer = createElement("div", "flatpickr-innerContainer");
266
+
267
+ if (self.config.weekNumbers) self.innerContainer.appendChild(buildWeeks());
268
+
269
+ self.rContainer = createElement("div", "flatpickr-rContainer");
270
+ self.rContainer.appendChild(buildWeekdays());
271
+ self.rContainer.appendChild(buildDays());
272
+ self.innerContainer.appendChild(self.rContainer);
273
+ fragment.appendChild(self.innerContainer);
274
+ }
275
+
276
+ if (self.config.enableTime) fragment.appendChild(buildTime());
277
+
278
+ self.calendarContainer.appendChild(fragment);
279
+
280
+ if (self.config.inline || self.config.static) {
281
+ self.calendarContainer.classList.add(self.config.inline ? "inline" : "static");
282
+ positionCalendar();
283
+
284
+ if (self.config.appendTo && self.config.appendTo.nodeType) self.config.appendTo.appendChild(self.calendarContainer);else {
285
+ self.element.parentNode.insertBefore(self.calendarContainer, (self.altInput || self.input).nextSibling);
286
+ }
287
+ } else document.body.appendChild(self.calendarContainer);
288
+ }
289
+
290
+ function buildDays() {
291
+ if (!self.days) {
292
+ self.days = createElement("div", "flatpickr-days");
293
+ self.days.tabIndex = -1;
294
+ }
295
+
296
+ self.firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;
297
+
298
+ self.prevMonthDays = self.utils.getDaysinMonth((self.currentMonth - 1 + 12) % 12);
299
+
300
+ var daysInMonth = self.utils.getDaysinMonth(),
301
+ days = document.createDocumentFragment();
302
+
303
+ var dayNumber = self.prevMonthDays + 1 - self.firstOfMonth,
304
+ currentDate = void 0,
305
+ dateIsDisabled = void 0;
306
+
307
+ if (self.config.weekNumbers) self.weekNumbers.innerHTML = "";
308
+
309
+ if (self.config.mode === "range") {
310
+ var dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
311
+ self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
312
+ self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - self.firstOfMonth) % daysInMonth);
313
+ }
314
+
315
+ self.days.innerHTML = "";
316
+
317
+ // prepend days from the ending of previous month
318
+ 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);
329
+ }
330
+
331
+ // Start at 1 since there is no 0th day
332
+ 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);
362
+ }
363
+
364
+ // append days from the next month
365
+ 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);
380
+ }
381
+ self.days.appendChild(days);
382
+ return self.days;
383
+ }
384
+
385
+ function buildMonthNav() {
386
+ var monthNavFragment = document.createDocumentFragment();
387
+ self.monthNav = createElement("div", "flatpickr-month");
388
+
389
+ self.prevMonthNav = createElement("span", "flatpickr-prev-month");
390
+ self.prevMonthNav.innerHTML = self.config.prevArrow;
391
+
392
+ self.currentMonthElement = createElement("span", "cur-month");
393
+
394
+ var yearInput = createNumberInput("cur-year");
395
+ self.currentYearElement = yearInput.childNodes[0];
396
+ self.currentYearElement.title = self.l10n.scrollTitle;
397
+
398
+ if (self.config.minDate) self.currentYearElement.min = self.config.minDate.getFullYear();
399
+
400
+ if (self.config.maxDate) {
401
+ self.currentYearElement.max = self.config.maxDate.getFullYear();
402
+
403
+ self.currentYearElement.disabled = self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();
404
+ }
405
+
406
+ self.nextMonthNav = createElement("span", "flatpickr-next-month");
407
+ self.nextMonthNav.innerHTML = self.config.nextArrow;
408
+
409
+ self.navigationCurrentMonth = createElement("span", "flatpickr-current-month");
410
+ self.navigationCurrentMonth.appendChild(self.currentMonthElement);
411
+ self.navigationCurrentMonth.appendChild(yearInput);
412
+
413
+ monthNavFragment.appendChild(self.prevMonthNav);
414
+ monthNavFragment.appendChild(self.navigationCurrentMonth);
415
+ monthNavFragment.appendChild(self.nextMonthNav);
416
+ self.monthNav.appendChild(monthNavFragment);
417
+
418
+ updateNavigationCurrentMonth();
419
+
420
+ return self.monthNav;
421
+ }
422
+
423
+ function buildTime() {
424
+ self.calendarContainer.classList.add("hasTime");
425
+ self.timeContainer = createElement("div", "flatpickr-time");
426
+ self.timeContainer.tabIndex = -1;
427
+ var separator = createElement("span", "flatpickr-time-separator", ":");
428
+
429
+ var hourInput = createNumberInput("flatpickr-hour");
430
+ self.hourElement = hourInput.childNodes[0];
431
+
432
+ var minuteInput = createNumberInput("flatpickr-minute");
433
+ self.minuteElement = minuteInput.childNodes[0];
434
+
435
+ self.hourElement.tabIndex = self.minuteElement.tabIndex = 0;
436
+ self.hourElement.pattern = self.minuteElement.pattern = "\d*";
437
+
438
+ self.hourElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getHours() : self.config.defaultHour);
439
+
440
+ self.minuteElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getMinutes() : self.config.defaultMinute);
441
+
442
+ self.hourElement.step = self.config.hourIncrement;
443
+ self.minuteElement.step = self.config.minuteIncrement;
444
+
445
+ self.hourElement.min = -(self.config.time_24hr ? 1 : 0);
446
+ self.hourElement.max = self.config.time_24hr ? 24 : 13;
447
+
448
+ self.minuteElement.min = -self.minuteElement.step;
449
+ self.minuteElement.max = 60;
450
+
451
+ self.hourElement.title = self.minuteElement.title = self.l10n.scrollTitle;
452
+
453
+ self.timeContainer.appendChild(hourInput);
454
+ self.timeContainer.appendChild(separator);
455
+ self.timeContainer.appendChild(minuteInput);
456
+
457
+ if (self.config.enableSeconds) {
458
+ self.timeContainer.classList.add("hasSeconds");
459
+
460
+ var secondInput = createNumberInput("flatpickr-second");
461
+ self.secondElement = secondInput.childNodes[0];
462
+
463
+ self.secondElement.pattern = self.hourElement.pattern;
464
+ self.secondElement.value = latestSelectedDateObj() ? self.pad(latestSelectedDateObj().getSeconds()) : "00";
465
+
466
+ self.secondElement.step = self.minuteElement.step;
467
+ self.secondElement.min = self.minuteElement.min;
468
+ self.secondElement.max = self.minuteElement.max;
469
+
470
+ self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":"));
471
+ self.timeContainer.appendChild(secondInput);
472
+ }
473
+
474
+ if (!self.config.time_24hr) {
475
+ // add self.amPM if appropriate
476
+ self.amPM = createElement("span", "flatpickr-am-pm", ["AM", "PM"][self.hourElement.value > 11 | 0]);
477
+ self.amPM.title = self.l10n.toggleTitle;
478
+ self.amPM.tabIndex = 0;
479
+ self.timeContainer.appendChild(self.amPM);
480
+ }
481
+
482
+ return self.timeContainer;
483
+ }
484
+
485
+ function buildWeekdays() {
486
+ if (!self.weekdayContainer) self.weekdayContainer = createElement("div", "flatpickr-weekdays");
487
+
488
+ var firstDayOfWeek = self.l10n.firstDayOfWeek;
489
+ var weekdays = self.l10n.weekdays.shorthand.slice();
490
+
491
+ if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {
492
+ weekdays = [].concat(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));
493
+ }
494
+
495
+ self.weekdayContainer.innerHTML = "\n\t\t<span class=flatpickr-weekday>\n\t\t\t" + weekdays.join("</span><span class=flatpickr-weekday>") + "\n\t\t</span>\n\t\t";
496
+
497
+ return self.weekdayContainer;
498
+ }
499
+
500
+ function buildWeeks() {
501
+ self.calendarContainer.classList.add("hasWeeks");
502
+ self.weekWrapper = createElement("div", "flatpickr-weekwrapper");
503
+ self.weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
504
+ self.weekNumbers = createElement("div", "flatpickr-weeks");
505
+ self.weekWrapper.appendChild(self.weekNumbers);
506
+ return self.weekWrapper;
507
+ }
508
+
509
+ function changeMonth(value, is_offset) {
510
+ self.currentMonth = typeof is_offset === "undefined" || is_offset ? self.currentMonth + value : value;
511
+
512
+ handleYearChange();
513
+ updateNavigationCurrentMonth();
514
+ buildDays();
515
+
516
+ if (!self.config.noCalendar) self.days.focus();
517
+
518
+ triggerEvent("MonthChange");
519
+ }
520
+
521
+ function clear() {
522
+ self.input.value = "";
523
+
524
+ if (self.altInput) self.altInput.value = "";
525
+
526
+ if (self.mobileInput) self.mobileInput.value = "";
527
+
528
+ self.selectedDates = [];
529
+ self.dateIsPicked = false;
530
+
531
+ self.redraw();
532
+ triggerEvent("Change");
533
+ }
534
+
535
+ function close() {
536
+ self.isOpen = false;
537
+
538
+ if (!self.isMobile) {
539
+ self.calendarContainer.classList.remove("open");
540
+ (self.altInput || self.input).classList.remove("active");
541
+ }
542
+
543
+ triggerEvent("Close");
544
+ }
545
+
546
+ function destroy(instance) {
547
+ instance = instance || self;
548
+ instance.clear();
549
+
550
+ document.removeEventListener("keydown", onKeyDown);
551
+ window.removeEventListener("resize", instance.debouncedResize);
552
+
553
+ document.removeEventListener("click", documentClick);
554
+ document.removeEventListener("blur", documentClick);
555
+
556
+ if (instance.isMobile && instance.mobileInput && instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);else if (instance.calendarContainer && instance.calendarContainer.parentNode) instance.calendarContainer.parentNode.removeChild(instance.calendarContainer);
557
+
558
+ if (instance.altInput) {
559
+ instance.input.type = "text";
560
+ if (instance.altInput.parentNode) instance.altInput.parentNode.removeChild(instance.altInput);
561
+ }
562
+
563
+ instance.input.classList.remove("flatpickr-input");
564
+ instance.input.removeEventListener("focus", open);
565
+ instance.input.removeAttribute("readonly");
566
+ }
567
+
568
+ function isCalendarElem(elem) {
569
+ var e = elem;
570
+ while (e) {
571
+ if (/flatpickr-day|flatpickr-calendar/.test(e.className)) return true;
572
+ e = e.parentNode;
573
+ }
574
+
575
+ return false;
576
+ }
577
+
578
+ function documentClick(e) {
579
+ var isInput = self.element.contains(e.target) || e.target === self.input || e.target === self.altInput;
580
+
581
+ if (self.isOpen && !isCalendarElem(e.target) && !isInput) {
582
+ self.close();
583
+
584
+ if (self.config.mode === "range" && self.selectedDates.length === 1) {
585
+ self.clear();
586
+ self.redraw();
587
+ }
588
+ }
589
+ }
590
+
591
+ function formatDate(frmt, dateObj) {
592
+ var chars = frmt.split("");
593
+ return chars.map(function (c, i) {
594
+ return self.formats[c] && chars[i - 1] !== "\\" ? self.formats[c](dateObj) : c !== "\\" ? c : "";
595
+ }).join("");
596
+ }
597
+
598
+ function handleYearChange(newYear) {
599
+ if (self.currentMonth < 0 || self.currentMonth > 11) {
600
+ self.currentYear += self.currentMonth % 11;
601
+ self.currentMonth = (self.currentMonth + 12) % 12;
602
+ triggerEvent("YearChange");
603
+ } else if (newYear && (!self.currentYearElement.min || newYear >= self.currentYearElement.min) && (!self.currentYearElement.max || newYear <= self.currentYearElement.max)) {
604
+ self.currentYear = parseInt(newYear, 10) || self.currentYear;
605
+
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);
607
+
608
+ self.redraw();
609
+ triggerEvent("YearChange");
610
+ }
611
+ }
612
+
613
+ function isEnabled(dateToCheck) {
614
+ if (self.config.minDate && compareDates(dateToCheck, self.config.minDate) < 0 || self.config.maxDate && compareDates(dateToCheck, self.config.maxDate) > 0) return false;
615
+
616
+ if (!self.config.enable.length && !self.config.disable.length) return true;
617
+
618
+ dateToCheck = parseDate(dateToCheck, true); // timeless
619
+
620
+ var bool = self.config.enable.length > 0,
621
+ array = bool ? self.config.enable : self.config.disable;
622
+
623
+ for (var i = 0, d; i < array.length; i++) {
624
+ d = array[i];
625
+
626
+ if (d instanceof Function && d(dateToCheck)) // disabled by function
627
+ return bool;else if ((d instanceof Date || typeof d === "string") && parseDate(d, true).getTime() === dateToCheck.getTime())
628
+ // disabled by date string
629
+ return bool;else if ( // disabled by range
630
+ (typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= parseDate(d.from) && dateToCheck <= parseDate(d.to)) return bool;
631
+ }
632
+
633
+ return !bool;
634
+ }
635
+
636
+ function onKeyDown(e) {
637
+ if (self.isOpen) {
638
+ switch (e.which) {
639
+ case 13:
640
+ if (self.timeContainer && self.timeContainer.contains(e.target)) updateValue();else selectDate(e);
641
+
642
+ break;
643
+
644
+ case 27:
645
+ // escape
646
+ self.clear();
647
+ self.redraw();
648
+ self.close();
649
+ break;
650
+
651
+ case 37:
652
+ if (e.target !== self.input & e.target !== self.altInput) changeMonth(-1);
653
+ break;
654
+
655
+ case 38:
656
+ e.preventDefault();
657
+
658
+ if (self.timeContainer && self.timeContainer.contains(e.target)) updateTime(e);else {
659
+ self.currentYear++;
660
+ self.redraw();
661
+ }
662
+
663
+ break;
664
+
665
+ case 39:
666
+ if (e.target !== self.input & e.target !== self.altInput) changeMonth(1);
667
+ break;
668
+
669
+ case 40:
670
+ e.preventDefault();
671
+ if (self.timeContainer && self.timeContainer.contains(e.target)) updateTime(e);else {
672
+ self.currentYear--;
673
+ self.redraw();
674
+ }
675
+
676
+ break;
677
+
678
+ default:
679
+ break;
680
+ }
681
+ }
682
+ }
683
+
684
+ function onMouseOver(e) {
685
+ if (self.selectedDates.length !== 1 || !e.target.classList.contains("flatpickr-day")) return;
686
+
687
+ var hoverDate = e.target.dateObj,
688
+ rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
689
+ rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
690
+ containsDisabled = false;
691
+
692
+ for (var t = rangeStartDate; t < rangeEndDate; t += self.utils.duration.DAY) {
693
+ if (!isEnabled(new Date(t))) {
694
+ containsDisabled = true;
695
+ break;
696
+ }
697
+ }
698
+
699
+ 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()) {
701
+ 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");
704
+ }
705
+ }
706
+
707
+ function onResize() {
708
+ if (self.isOpen && !self.config.inline && !self.config.static) positionCalendar();
709
+ }
710
+
711
+ function open(e) {
712
+ if (self.isMobile) {
713
+ if (e) {
714
+ e.preventDefault();
715
+ e.target.blur();
716
+ }
717
+
718
+ setTimeout(function () {
719
+ self.mobileInput.click();
720
+ }, 0);
721
+
722
+ triggerEvent("Open");
723
+ return;
724
+ } else if (self.isOpen || (self.altInput || self.input).disabled || self.config.inline) return;
725
+
726
+ self.calendarContainer.classList.add("open");
727
+
728
+ if (!self.config.static) positionCalendar();
729
+
730
+ self.isOpen = true;
731
+
732
+ if (!self.config.allowInput) {
733
+ (self.altInput || self.input).blur();
734
+ (self.config.noCalendar ? self.timeContainer : self.selectedDateElem ? self.selectedDateElem : self.days).focus();
735
+ }
736
+
737
+ (self.altInput || self.input).classList.add("active");
738
+ triggerEvent("Open");
739
+ }
740
+
741
+ function parseConfig() {
742
+ var boolOpts = ["utc", "wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
743
+ self.config = Object.create(Flatpickr.defaultConfig);
744
+ var userConfig = _extends({}, self.instanceConfig, self.element.dataset || {});
745
+
746
+ Object.defineProperty(self.config, "minDate", {
747
+ get: function get() {
748
+ return this._minDate;
749
+ },
750
+ set: function set(date) {
751
+ this._minDate = parseDate(date);
752
+
753
+ if (self.days) redraw();
754
+
755
+ if (!self.currentYearElement) return;
756
+
757
+ if (date && this._minDate instanceof Date) {
758
+ self.minDateHasTime = this._minDate.getHours() || this._minDate.getMinutes() || this._minDate.getSeconds();
759
+
760
+ self.currentYearElement.min = this._minDate.getFullYear();
761
+ } else {
762
+ self.currentYearElement.removeAttribute("min");
763
+ }
764
+
765
+ self.currentYearElement.disabled = this._maxDate && this._minDate && this._maxDate.getFullYear() === this._minDate.getFullYear();
766
+ }
767
+ });
768
+
769
+ Object.defineProperty(self.config, "maxDate", {
770
+ get: function get() {
771
+ return this._maxDate;
772
+ },
773
+ set: function set(date) {
774
+ this._maxDate = parseDate(date);
775
+ if (self.days) redraw();
776
+
777
+ if (!self.currentYearElement) return;
778
+
779
+ if (date && this._maxDate instanceof Date) {
780
+ self.currentYearElement.max = this._maxDate.getFullYear();
781
+ self.maxDateHasTime = this._maxDate.getHours() || this._maxDate.getMinutes() || this._maxDate.getSeconds();
782
+ } else self.currentYearElement.removeAttribute("max");
783
+
784
+ self.currentYearElement.disabled = this._maxDate && this._minDate && this._maxDate.getFullYear() === this._minDate.getFullYear();
785
+ }
786
+ });
787
+
788
+ _extends(self.config, userConfig);
789
+
790
+ for (var i = 0; i < boolOpts.length; i++) {
791
+ self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === "true";
792
+ }if (!userConfig.dateFormat && userConfig.enableTime) {
793
+ self.config.dateFormat = self.config.noCalendar ? "H:i" + (self.config.enableSeconds ? ":S" : "") : Flatpickr.defaultConfig.dateFormat + " H:i" + (self.config.enableSeconds ? ":S" : "");
794
+ }
795
+
796
+ if (userConfig.altInput && userConfig.enableTime && !userConfig.altFormat) {
797
+ self.config.altFormat = self.config.noCalendar ? "h:i" + (self.config.enableSeconds ? ":S K" : " K") : Flatpickr.defaultConfig.altFormat + (" h:i" + (self.config.enableSeconds ? ":S" : "") + " K");
798
+ }
799
+ }
800
+
801
+ function setupLocale() {
802
+ if (_typeof(self.config.locale) !== "object" && typeof Flatpickr.l10ns[self.config.locale] === "undefined") console.warn("flatpickr: invalid locale " + self.config.locale);
803
+
804
+ self.l10n = _extends(Object.create(Flatpickr.l10ns.default), _typeof(self.config.locale) === "object" ? self.config.locale : self.config.locale !== "default" ? Flatpickr.l10ns[self.config.locale] || {} : {});
805
+ }
806
+
807
+ function parseDate(date) {
808
+ var timeless = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
809
+
810
+ if (!date) return null;
811
+
812
+ var dateTimeRegex = /(\d+)/g,
813
+ timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p)?/i,
814
+ timestamp = /^(\d+)$/g,
815
+ date_orig = date;
816
+
817
+ if (date.toFixed) // timestamp
818
+ date = new Date(date);else if (typeof date === "string") {
819
+ date = date.trim();
820
+
821
+ if (date === "today") {
822
+ date = new Date();
823
+ timeless = true;
824
+ } else if (self.config.parseDate) date = self.config.parseDate(date);else if (timeRegex.test(date)) {
825
+ // time picker
826
+ var m = date.match(timeRegex),
827
+ hours = !m[4] ? m[1] // military time, no conversion needed
828
+ : m[1] % 12 + (m[4].toLowerCase() === "p" ? 12 : 0); // am/pm
829
+
830
+ date = new Date();
831
+ date.setHours(hours, m[2] || 0, m[3] || 0);
832
+ } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
833
+ date = new Date(date);else if (dateTimeRegex.test(date) && /^[0-9]/.test(date)) {
834
+ var d = date.match(dateTimeRegex);
835
+ date = new Date(d[0] + "/" + (d[1] || 1) + "/" + (d[2] || 1) + " " + (d[3] || 0) + ":" + (d[4] || 0) + ":" + (d[5] || 0));
836
+ } else // fallback
837
+ date = new Date(date);
838
+ }
839
+
840
+ if (!(date instanceof Date)) {
841
+ console.warn("flatpickr: invalid date " + date_orig);
842
+ console.info(self.element);
843
+ return null;
844
+ }
845
+
846
+ if (self.config.utc && !date.fp_isUTC) date = date.fp_toUTC();
847
+
848
+ if (timeless) date.setHours(0, 0, 0, 0);
849
+
850
+ return date;
851
+ }
852
+
853
+ function positionCalendar() {
854
+ var calendarHeight = self.calendarContainer.offsetHeight,
855
+ input = self.altInput || self.input,
856
+ inputBounds = input.getBoundingClientRect(),
857
+ distanceFromBottom = window.innerHeight - inputBounds.bottom + input.offsetHeight;
858
+
859
+ var top = void 0,
860
+ left = window.pageXOffset + inputBounds.left;
861
+
862
+ if (distanceFromBottom < calendarHeight) {
863
+ top = window.pageYOffset - calendarHeight + inputBounds.top - 2;
864
+ self.calendarContainer.classList.remove("arrowTop");
865
+ self.calendarContainer.classList.add("arrowBottom");
866
+ } else {
867
+ top = window.pageYOffset + input.offsetHeight + inputBounds.top + 2;
868
+ self.calendarContainer.classList.remove("arrowBottom");
869
+ self.calendarContainer.classList.add("arrowTop");
870
+ }
871
+
872
+ if (!self.config.inline && !self.config.static) {
873
+ self.calendarContainer.style.top = top + "px";
874
+ self.calendarContainer.style.left = left + "px";
875
+ }
876
+ }
877
+
878
+ function redraw() {
879
+ if (self.config.noCalendar || self.isMobile) return;
880
+
881
+ buildWeekdays();
882
+ updateNavigationCurrentMonth();
883
+ buildDays();
884
+ }
885
+
886
+ function selectDate(e) {
887
+ if (self.config.allowInput && e.which === 13 && e.target === (self.altInput || self.input)) return self.setDate((self.altInput || self.input).value), e.target.blur();
888
+
889
+ if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
890
+
891
+ var selectedDate = e.target.dateObj;
892
+ self.selectedDateElem = e.target;
893
+
894
+ if (self.config.mode === "single") {
895
+ self.selectedDates = [selectedDate];
896
+
897
+ if (!self.config.enableTime) self.close();
898
+ } else if (self.config.mode === "multiple") {
899
+ var selectedIndex = isDateSelected(selectedDate);
900
+ if (selectedIndex) self.selectedDates.splice(selectedIndex, 1);else self.selectedDates.push(selectedDate);
901
+ } else if (self.config.mode === "range") {
902
+ if (self.selectedDates.length === 2) self.clear();
903
+
904
+ self.selectedDates.push(selectedDate);
905
+ self.selectedDates.sort(function (a, b) {
906
+ return a.getTime() - b.getTime();
907
+ });
908
+ }
909
+
910
+ setHoursFromInputs();
911
+
912
+ if (selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range") {
913
+ self.currentYear = selectedDate.getFullYear();
914
+ self.currentMonth = selectedDate.getMonth();
915
+ updateNavigationCurrentMonth();
916
+ }
917
+
918
+ buildDays();
919
+
920
+ if (self.minDateHasTime && self.config.enableTime && compareDates(selectedDate, self.config.minDate) === 0) {
921
+ setHoursFromDate(self.config.minDate);
922
+ }
923
+
924
+ updateValue();
925
+ setTimeout(function () {
926
+ return self.dateIsPicked = true;
927
+ }, 50);
928
+
929
+ if (self.config.mode === "range" && self.selectedDates.length === 1) onMouseOver(e);
930
+
931
+ triggerEvent("Change");
932
+ }
933
+
934
+ function set(option, value) {
935
+ self.config[option] = value;
936
+ self.redraw();
937
+ jumpToDate();
938
+ }
939
+
940
+ function setDate(date, triggerChange) {
941
+ if (!date) return self.clear();
942
+
943
+ self.selectedDates = (Array.isArray(date) ? date.map(parseDate) : [parseDate(date)]).filter(function (d) {
944
+ return d instanceof Date && isEnabled(d);
945
+ });
946
+ self.redraw();
947
+ jumpToDate();
948
+
949
+ setHoursFromDate();
950
+ updateValue();
951
+
952
+ self.dateIsPicked = self.selectedDates.length > 0;
953
+
954
+ if (triggerChange) triggerEvent("Change");
955
+ }
956
+
957
+ function setupDates() {
958
+ self.selectedDates = [];
959
+ self.now = new Date();
960
+ var inputDate = self.config.defaultDate || self.input.value;
961
+
962
+ if (Array.isArray(inputDate)) self.selectedDates = inputDate.map(parseDate);else if (inputDate) {
963
+ switch (self.config.mode) {
964
+ case "single":
965
+ self.selectedDates = [parseDate(inputDate)];
966
+ break;
967
+
968
+ case "multiple":
969
+ self.selectedDates = inputDate.split("; ").map(parseDate);
970
+ break;
971
+
972
+ case "range":
973
+ self.selectedDates = inputDate.split(" to ").map(parseDate);
974
+ break;
975
+
976
+ default:
977
+ break;
978
+ }
979
+ }
980
+
981
+ self.selectedDates = self.selectedDates.filter(function (d) {
982
+ return d instanceof Date && d.getTime() && isEnabled(d);
983
+ });
984
+
985
+ var initialDate = self.selectedDates.length ? self.selectedDates[0] : self.config.minDate > self.now ? self.config.minDate : self.now;
986
+
987
+ self.currentYear = initialDate.getFullYear();
988
+ self.currentMonth = initialDate.getMonth();
989
+ }
990
+
991
+ function setupHelperFunctions() {
992
+ self.utils = {
993
+ duration: {
994
+ DAY: 86400000
995
+ },
996
+ getDaysinMonth: function getDaysinMonth() {
997
+ var month = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : self.currentMonth;
998
+ var yr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : self.currentYear;
999
+
1000
+ if (month === 1 && yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0) return 29;
1001
+ return self.l10n.daysInMonth[month];
1002
+ },
1003
+
1004
+ monthToStr: function monthToStr(monthNumber) {
1005
+ var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : self.config.shorthandCurrentMonth;
1006
+ return self.l10n.months[(short ? "short" : "long") + "hand"][monthNumber];
1007
+ }
1008
+ };
1009
+ }
1010
+
1011
+ function setupFormats() {
1012
+ self.formats = {
1013
+ // weekday name, short, e.g. Thu
1014
+ D: function D(date) {
1015
+ return self.l10n.weekdays.shorthand[self.formats.w(date)];
1016
+ },
1017
+
1018
+ // full month name e.g. January
1019
+ F: function F(date) {
1020
+ return self.utils.monthToStr(self.formats.n(date) - 1, false);
1021
+ },
1022
+
1023
+ // hours with leading zero e.g. 03
1024
+ H: function H(date) {
1025
+ return Flatpickr.prototype.pad(date.getHours());
1026
+ },
1027
+
1028
+ // day (1-30) with ordinal suffix e.g. 1st, 2nd
1029
+ J: function J(date) {
1030
+ return date.getDate() + self.l10n.ordinal(date.getDate());
1031
+ },
1032
+
1033
+ // AM/PM
1034
+ K: function K(date) {
1035
+ return date.getHours() > 11 ? "PM" : "AM";
1036
+ },
1037
+
1038
+ // shorthand month e.g. Jan, Sep, Oct, etc
1039
+ M: function M(date) {
1040
+ return self.utils.monthToStr(date.getMonth(), true);
1041
+ },
1042
+
1043
+ // seconds 00-59
1044
+ S: function S(date) {
1045
+ return Flatpickr.prototype.pad(date.getSeconds());
1046
+ },
1047
+
1048
+ // unix timestamp
1049
+ U: function U(date) {
1050
+ return date.getTime() / 1000;
1051
+ },
1052
+
1053
+ // full year e.g. 2016
1054
+ Y: function Y(date) {
1055
+ return date.getFullYear();
1056
+ },
1057
+
1058
+ // day in month, padded (01-30)
1059
+ d: function d(date) {
1060
+ return Flatpickr.prototype.pad(self.formats.j(date));
1061
+ },
1062
+
1063
+ // hour from 1-12 (am/pm)
1064
+ h: function h(date) {
1065
+ return date.getHours() % 12 ? date.getHours() % 12 : 12;
1066
+ },
1067
+
1068
+ // minutes, padded with leading zero e.g. 09
1069
+ i: function i(date) {
1070
+ return Flatpickr.prototype.pad(date.getMinutes());
1071
+ },
1072
+
1073
+ // day in month (1-30)
1074
+ j: function j(date) {
1075
+ return date.getDate();
1076
+ },
1077
+
1078
+ // weekday name, full, e.g. Thursday
1079
+ l: function l(date) {
1080
+ return self.l10n.weekdays.longhand[self.formats.w(date)];
1081
+ },
1082
+
1083
+ // padded month number (01-12)
1084
+ m: function m(date) {
1085
+ return Flatpickr.prototype.pad(self.formats.n(date));
1086
+ },
1087
+
1088
+ // the month number (1-12)
1089
+ n: function n(date) {
1090
+ return date.getMonth() + 1;
1091
+ },
1092
+
1093
+ // seconds 0-59
1094
+ s: function s(date) {
1095
+ return date.getSeconds();
1096
+ },
1097
+
1098
+ // number of the day of the week
1099
+ w: function w(date) {
1100
+ return date.getDay();
1101
+ },
1102
+
1103
+ // last two digits of year e.g. 16 for 2016
1104
+ y: function y(date) {
1105
+ return String(self.formats.Y(date)).substring(2);
1106
+ }
1107
+ };
1108
+ }
1109
+
1110
+ function setupInputs() {
1111
+ self.input = self.config.wrap ? self.element.querySelector("[data-input]") : self.element;
1112
+
1113
+ self.input.classList.add("flatpickr-input");
1114
+ if (self.config.altInput) {
1115
+ // replicate self.element
1116
+ self.altInput = createElement(self.input.nodeName, self.config.altInputClass);
1117
+ self.altInput.placeholder = self.input.placeholder;
1118
+ self.altInput.type = "text";
1119
+
1120
+ self.input.type = "hidden";
1121
+ if (self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);
1122
+ }
1123
+
1124
+ if (!self.config.allowInput) (self.altInput || self.input).setAttribute("readonly", "readonly");
1125
+ }
1126
+
1127
+ function setupMobile() {
1128
+ var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
1129
+
1130
+ self.mobileInput = createElement("input", "flatpickr-input flatpickr-mobile");
1131
+ self.mobileInput.step = "any";
1132
+ self.mobileInput.tabIndex = -1;
1133
+ self.mobileInput.type = inputType;
1134
+ self.mobileInput.disabled = self.input.disabled;
1135
+
1136
+ self.mobileFormatStr = inputType === "datetime-local" ? "Y-m-d\\TH:i:S" : inputType === "date" ? "Y-m-d" : "H:i:S";
1137
+
1138
+ if (self.selectedDates.length) {
1139
+ self.mobileInput.defaultValue = self.mobileInput.value = formatDate(self.mobileFormatStr, self.selectedDates[0]);
1140
+ }
1141
+
1142
+ if (self.config.minDate) self.mobileInput.min = formatDate("Y-m-d", self.config.minDate);
1143
+
1144
+ if (self.config.maxDate) self.mobileInput.max = formatDate("Y-m-d", self.config.maxDate);
1145
+
1146
+ self.input.type = "hidden";
1147
+ if (self.config.altInput) self.altInput.type = "hidden";
1148
+
1149
+ try {
1150
+ self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);
1151
+ } catch (e) {
1152
+ //
1153
+ }
1154
+
1155
+ self.mobileInput.addEventListener("change", function (e) {
1156
+ self.setDate(e.target.value);
1157
+ triggerEvent("Change");
1158
+ triggerEvent("Close");
1159
+ });
1160
+ }
1161
+
1162
+ function toggle() {
1163
+ if (self.isOpen) self.close();else self.open();
1164
+ }
1165
+
1166
+ function triggerEvent(event, data) {
1167
+ if (self.config["on" + event]) {
1168
+ var hooks = Array.isArray(self.config["on" + event]) ? self.config["on" + event] : [self.config["on" + event]];
1169
+
1170
+ for (var i = 0; i < hooks.length; i++) {
1171
+ hooks[i](self.selectedDates, self.input.value, self, data);
1172
+ }
1173
+ }
1174
+
1175
+ if (event === "Change") {
1176
+ try {
1177
+ self.input.dispatchEvent(new Event("change", { "bubbles": true }));
1178
+
1179
+ // many front-end frameworks bind to the input event
1180
+ self.input.dispatchEvent(new Event("input", { "bubbles": true }));
1181
+ } catch (e) {
1182
+ if ("createEvent" in document) return self.input.dispatchEvent(self.changeEvent);
1183
+
1184
+ self.input.fireEvent("onchange");
1185
+ }
1186
+ }
1187
+ }
1188
+
1189
+ function latestSelectedDateObj() {
1190
+ if (self.selectedDates.length) return self.selectedDates[self.selectedDates.length - 1];
1191
+ return null;
1192
+ }
1193
+
1194
+ function isDateSelected(date) {
1195
+ for (var i = 0; i < self.selectedDates.length; i++) {
1196
+ if (compareDates(self.selectedDates[i], date) === 0) return "" + i;
1197
+ }
1198
+
1199
+ return false;
1200
+ }
1201
+
1202
+ function isDateInRange(date) {
1203
+ if (self.config.mode !== "range" || self.selectedDates.length < 2) return false;
1204
+ return date > self.selectedDates[0] && date < self.selectedDates[1];
1205
+ }
1206
+
1207
+ function updateNavigationCurrentMonth() {
1208
+ if (self.config.noCalendar || self.isMobile || !self.monthNav) return;
1209
+
1210
+ self.currentMonthElement.textContent = self.utils.monthToStr(self.currentMonth) + " ";
1211
+ self.currentYearElement.value = self.currentYear;
1212
+
1213
+ if (self.config.minDate) {
1214
+ var hidePrevMonthArrow = self.currentYear === self.config.minDate.getFullYear() ? (self.currentMonth + 11) % 12 < self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear();
1215
+
1216
+ self.prevMonthNav.style.display = hidePrevMonthArrow ? "none" : "block";
1217
+ } else self.prevMonthNav.style.display = "block";
1218
+
1219
+ if (self.config.maxDate) {
1220
+ var hideNextMonthArrow = self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear();
1221
+
1222
+ self.nextMonthNav.style.display = hideNextMonthArrow ? "none" : "block";
1223
+ } else self.nextMonthNav.style.display = "block";
1224
+ }
1225
+
1226
+ function updateValue() {
1227
+ if (!self.selectedDates.length) return self.clear();
1228
+
1229
+ if (self.isMobile) {
1230
+ self.mobileInput.value = self.selectedDates.length ? formatDate(self.mobileFormatStr, latestSelectedDateObj()) : "";
1231
+ }
1232
+
1233
+ var joinChar = self.config.mode !== "range" ? "; " : " to ";
1234
+
1235
+ self.input.value = self.selectedDates.map(function (dObj) {
1236
+ return formatDate(self.config.dateFormat, dObj);
1237
+ }).join(joinChar);
1238
+
1239
+ if (self.config.altInput) {
1240
+ self.altInput.value = self.selectedDates.map(function (dObj) {
1241
+ return formatDate(self.config.altFormat, dObj);
1242
+ }).join(joinChar);
1243
+ }
1244
+
1245
+ triggerEvent("ValueUpdate");
1246
+ }
1247
+
1248
+ function yearScroll(e) {
1249
+ e.preventDefault();
1250
+
1251
+ var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)),
1252
+ newYear = parseInt(e.target.value, 10) + delta;
1253
+
1254
+ handleYearChange(newYear);
1255
+ e.target.value = self.currentYear;
1256
+ }
1257
+
1258
+ function createElement(tag) {
1259
+ var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
1260
+ var content = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
1261
+
1262
+ var e = document.createElement(tag);
1263
+ e.className = className;
1264
+
1265
+ if (content) e.innerHTML = content;
1266
+
1267
+ return e;
1268
+ }
1269
+
1270
+ function debounce(func, wait, immediate) {
1271
+ var timeout = void 0;
1272
+ return function () {
1273
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
1274
+ args[_key] = arguments[_key];
1275
+ }
1276
+
1277
+ var context = this;
1278
+ var later = function later() {
1279
+ timeout = null;
1280
+ if (!immediate) func.apply(context, args);
1281
+ };
1282
+
1283
+ clearTimeout(timeout);
1284
+ timeout = setTimeout(later, wait);
1285
+ if (immediate && !timeout) func.apply(context, args);
1286
+ };
1287
+ }
1288
+
1289
+ function compareDates(date1, date2) {
1290
+ if (!(date1 instanceof Date) || !(date2 instanceof Date)) return false;
1291
+
1292
+ return date1.getDate() - date2.getDate() + 99 * (date1.getMonth() - date2.getMonth()) + // amplify year/month diff
1293
+ 999 * (date1.getFullYear() - date2.getFullYear());
1294
+ }
1295
+
1296
+ function timeWrapper(e) {
1297
+ e.preventDefault();
1298
+ if (e && ((e.target.value || e.target.textContent).length >= 2 || e.type !== "keydown" && e.type !== "input")) e.target.blur();
1299
+
1300
+ if (e.target.className === "flatpickr-am-pm") {
1301
+ e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
1302
+ return;
1303
+ }
1304
+
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);
1309
+
1310
+ var newValue = value;
1311
+
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);
1313
+
1314
+ if (newValue <= min) newValue = max - step;else if (newValue >= max) newValue = min + step;
1315
+
1316
+ if (self.amPM && (value === 11 && newValue === 12 || value === 12 && newValue === 11)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
1317
+
1318
+ e.target.value = self.pad(newValue);
1319
+ }
1320
+
1321
+ init();
1322
+ return self;
1323
+ }
1324
+
1325
+ Flatpickr.defaultConfig = {
1326
+
1327
+ mode: "single",
1328
+
1329
+ /* if true, dates will be parsed, formatted, and displayed in UTC.
1330
+ preloading date strings w/ timezones is recommended but not necessary */
1331
+ utc: false,
1332
+
1333
+ // wrap: see https://chmln.github.io/flatpickr/#strap
1334
+ wrap: false,
1335
+
1336
+ // enables week numbers
1337
+ weekNumbers: false,
1338
+
1339
+ // allow manual datetime input
1340
+ allowInput: false,
1341
+
1342
+ /*
1343
+ clicking on input opens the date(time)picker.
1344
+ disable if you wish to open the calendar manually with .open()
1345
+ */
1346
+ clickOpens: true,
1347
+
1348
+ // display time picker in 24 hour mode
1349
+ time_24hr: false,
1350
+
1351
+ // enables the time picker functionality
1352
+ enableTime: false,
1353
+
1354
+ // noCalendar: true will hide the calendar. use for a time picker along w/ enableTime
1355
+ noCalendar: false,
1356
+
1357
+ // more date format chars at https://chmln.github.io/flatpickr/#dateformat
1358
+ dateFormat: "Y-m-d",
1359
+
1360
+ // altInput - see https://chmln.github.io/flatpickr/#altinput
1361
+ altInput: false,
1362
+
1363
+ // the created altInput element will have this class.
1364
+ altInputClass: "form-control input",
1365
+
1366
+ // same as dateFormat, but for altInput
1367
+ altFormat: "F j, Y", // defaults to e.g. June 10, 2016
1368
+
1369
+ // defaultDate - either a datestring or a date object. used for datetimepicker"s initial value
1370
+ defaultDate: null,
1371
+
1372
+ // the minimum date that user can pick (inclusive)
1373
+ minDate: null,
1374
+
1375
+ // the maximum date that user can pick (inclusive)
1376
+ maxDate: null,
1377
+
1378
+ // dateparser that transforms a given string to a date object
1379
+ parseDate: null,
1380
+
1381
+ getWeek: function getWeek(givenDate) {
1382
+ var date = new Date(givenDate.getTime());
1383
+ date.setHours(0, 0, 0, 0);
1384
+
1385
+ // Thursday in current week decides the year.
1386
+ date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
1387
+ // January 4 is always in week 1.
1388
+ var week1 = new Date(date.getFullYear(), 0, 4);
1389
+ // Adjust to Thursday in week 1 and count number of weeks from date to week1.
1390
+ return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
1391
+ },
1392
+
1393
+ // see https://chmln.github.io/flatpickr/#disable
1394
+ enable: [],
1395
+
1396
+ // see https://chmln.github.io/flatpickr/#disable
1397
+ disable: [],
1398
+
1399
+ // display the short version of month names - e.g. Sep instead of September
1400
+ shorthandCurrentMonth: false,
1401
+
1402
+ // displays calendar inline. see https://chmln.github.io/flatpickr/#inline-calendar
1403
+ inline: false,
1404
+
1405
+ // position calendar inside wrapper and next to the input element
1406
+ // leave at false unless you know what you"re doing
1407
+ static: false,
1408
+
1409
+ // DOM node to append the calendar to in *static* mode
1410
+ appendTo: null,
1411
+
1412
+ // code for previous/next icons. this is where you put your custom icon code e.g. fontawesome
1413
+ 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>",
1414
+ 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>",
1415
+
1416
+ // enables seconds in the time picker
1417
+ enableSeconds: false,
1418
+
1419
+ // step size used when scrolling/incrementing the hour element
1420
+ hourIncrement: 1,
1421
+
1422
+ // step size used when scrolling/incrementing the minute element
1423
+ minuteIncrement: 5,
1424
+
1425
+ // initial value in the hour element
1426
+ defaultHour: 12,
1427
+
1428
+ // initial value in the minute element
1429
+ defaultMinute: 0,
1430
+
1431
+ // disable native mobile datetime input support
1432
+ disableMobile: false,
1433
+
1434
+ // default locale
1435
+ locale: "default",
1436
+
1437
+ // onChange callback when user selects a date or time
1438
+ onChange: null, // function (dateObj, dateStr) {}
1439
+
1440
+ // called every time calendar is opened
1441
+ onOpen: null, // function (dateObj, dateStr) {}
1442
+
1443
+ // called every time calendar is closed
1444
+ onClose: null, // function (dateObj, dateStr) {}
1445
+
1446
+ // called after calendar is ready
1447
+ onReady: null, // function (dateObj, dateStr) {}
1448
+
1449
+ onValueUpdate: null,
1450
+
1451
+ onDayCreate: null
1452
+ };
1453
+
1454
+ Flatpickr.l10ns = {
1455
+ en: {
1456
+ weekdays: {
1457
+ shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
1458
+ longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
1459
+ },
1460
+ months: {
1461
+ shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
1462
+ longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
1463
+ },
1464
+ daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
1465
+ firstDayOfWeek: 0,
1466
+ ordinal: function ordinal(nth) {
1467
+ var s = nth % 100;
1468
+ if (s > 3 && s < 21) return "th";
1469
+ switch (s % 10) {
1470
+ case 1:
1471
+ return "st";
1472
+ case 2:
1473
+ return "nd";
1474
+ case 3:
1475
+ return "rd";
1476
+ default:
1477
+ return "th";
1478
+ }
1479
+ },
1480
+ weekAbbreviation: "Wk",
1481
+ scrollTitle: "Scroll to increment",
1482
+ toggleTitle: "Click to toggle"
1483
+ }
1484
+ };
1485
+
1486
+ Flatpickr.l10ns.default = Flatpickr.l10ns.en;
1487
+
1488
+ Flatpickr.localize = function (l10n) {
1489
+ return _extends(Flatpickr.l10ns.default, l10n || {});
1490
+ };
1491
+
1492
+ Flatpickr.prototype = {
1493
+ pad: function pad(number) {
1494
+ return ("0" + number).slice(-2);
1495
+ }
1496
+ };
1497
+
1498
+ function _flatpickr(nodeList, config) {
1499
+ var instances = [];
1500
+ for (var i = 0; i < nodeList.length; i++) {
1501
+ try {
1502
+ nodeList[i]._flatpickr = new Flatpickr(nodeList[i], config || {});
1503
+ instances.push(nodeList[i]._flatpickr);
1504
+ } catch (e) {
1505
+ console.warn(e, e.stack);
1506
+ }
1507
+ }
1508
+
1509
+ return instances.length === 1 ? instances[0] : instances;
1510
+ }
1511
+ if (typeof HTMLElement !== "undefined") {
1512
+ // browser env
1513
+ HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {
1514
+ return _flatpickr(this, config);
1515
+ };
1516
+
1517
+ HTMLElement.prototype.flatpickr = function (config) {
1518
+ return _flatpickr([this], config);
1519
+ };
1520
+ }
1521
+
1522
+ function flatpickr(selector, config) {
1523
+ return _flatpickr(document.querySelectorAll(selector), config);
1524
+ }
1525
+
1526
+ if (typeof jQuery !== "undefined") {
1527
+ jQuery.fn.flatpickr = function (config) {
1528
+ return _flatpickr(this, config);
1529
+ };
1530
+ }
1531
+
1532
+ Date.prototype.fp_incr = function (days) {
1533
+ return new Date(this.getFullYear(), this.getMonth(), this.getDate() + parseInt(days, 10));
1534
+ };
1535
+
1536
+ Date.prototype.fp_isUTC = false;
1537
+ Date.prototype.fp_toUTC = function () {
1538
+ var newDate = new Date(this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds());
1539
+
1540
+ newDate.fp_isUTC = true;
1541
+ return newDate;
1542
+ };
1543
+
1544
+ // IE9 classList polyfill
1545
+ if (!("classList" in document.documentElement) && Object.defineProperty && typeof HTMLElement !== "undefined") {
1546
+ Object.defineProperty(HTMLElement.prototype, "classList", {
1547
+ get: function get() {
1548
+ var self = this;
1549
+ function update(fn) {
1550
+ return function (value) {
1551
+ var classes = self.className.split(/\s+/),
1552
+ index = classes.indexOf(value);
1553
+
1554
+ fn(classes, index, value);
1555
+ self.className = classes.join(" ");
1556
+ };
1557
+ }
1558
+
1559
+ var ret = {
1560
+ add: update(function (classes, index, value) {
1561
+ if (!~index) classes.push(value);
1562
+ }),
1563
+
1564
+ remove: update(function (classes, index) {
1565
+ if (~index) classes.splice(index, 1);
1566
+ }),
1567
+
1568
+ toggle: update(function (classes, index, value) {
1569
+ if (~index) classes.splice(index, 1);else classes.push(value);
1570
+ }),
1571
+
1572
+ contains: function contains(value) {
1573
+ return !!~self.className.split(/\s+/).indexOf(value);
1574
+ },
1575
+
1576
+ item: function item(i) {
1577
+ return self.className.split(/\s+/)[i] || null;
1578
+ }
1579
+ };
1580
+
1581
+ Object.defineProperty(ret, "length", {
1582
+ get: function get() {
1583
+ return self.className.split(/\s+/).length;
1584
+ }
1585
+ });
1586
+
1587
+ return ret;
1588
+ }
1589
+ });
1590
+ }
1591
+
1592
+ if (typeof module !== "undefined") module.exports = Flatpickr;