flatpickr 2.2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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;