fomantic-ui 2.9.1-beta.4 → 2.9.1-beta.40

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 (552) hide show
  1. package/.eslint/eqeqeq-rule.js +18 -0
  2. package/.eslint/index.js +29 -0
  3. package/.eslint/no-extra-parens-rule.js +17 -0
  4. package/.eslint/package.json +11 -0
  5. package/.eslintrc.js +123 -0
  6. package/.github/auto_assign.yml +0 -1
  7. package/.github/workflows/ci.yml +37 -4
  8. package/.github/workflows/nightly.yml +1 -1
  9. package/.github/workflows/release.yml +1 -1
  10. package/.prettierrc.js +12 -0
  11. package/.stylelintrc.js +48 -0
  12. package/README.md +1 -1
  13. package/dist/components/accordion.css +35 -53
  14. package/dist/components/accordion.js +568 -595
  15. package/dist/components/accordion.min.css +2 -2
  16. package/dist/components/accordion.min.js +3 -3
  17. package/dist/components/ad.css +34 -45
  18. package/dist/components/ad.min.css +2 -2
  19. package/dist/components/api.js +1157 -1179
  20. package/dist/components/api.min.js +3 -3
  21. package/dist/components/breadcrumb.css +5 -5
  22. package/dist/components/breadcrumb.min.css +2 -2
  23. package/dist/components/button.css +709 -1121
  24. package/dist/components/button.min.css +2 -2
  25. package/dist/components/calendar.css +24 -27
  26. package/dist/components/calendar.js +1934 -1809
  27. package/dist/components/calendar.min.css +2 -2
  28. package/dist/components/calendar.min.js +3 -3
  29. package/dist/components/card.css +219 -365
  30. package/dist/components/card.min.css +2 -2
  31. package/dist/components/checkbox.css +120 -191
  32. package/dist/components/checkbox.js +842 -841
  33. package/dist/components/checkbox.min.css +2 -2
  34. package/dist/components/checkbox.min.js +3 -3
  35. package/dist/components/comment.css +41 -59
  36. package/dist/components/comment.min.css +2 -2
  37. package/dist/components/container.css +7 -6
  38. package/dist/components/container.min.css +2 -2
  39. package/dist/components/dimmer.css +53 -172
  40. package/dist/components/dimmer.js +706 -737
  41. package/dist/components/dimmer.min.css +2 -2
  42. package/dist/components/dimmer.min.js +3 -3
  43. package/dist/components/divider.css +43 -61
  44. package/dist/components/divider.min.css +2 -2
  45. package/dist/components/dropdown.css +252 -386
  46. package/dist/components/dropdown.js +4179 -4236
  47. package/dist/components/dropdown.min.css +2 -2
  48. package/dist/components/dropdown.min.js +3 -3
  49. package/dist/components/embed.css +18 -29
  50. package/dist/components/embed.js +645 -675
  51. package/dist/components/embed.min.css +2 -2
  52. package/dist/components/embed.min.js +3 -3
  53. package/dist/components/emoji.css +3556 -3556
  54. package/dist/components/emoji.min.css +1 -1
  55. package/dist/components/feed.css +35 -57
  56. package/dist/components/feed.min.css +2 -2
  57. package/dist/components/flag.css +270 -268
  58. package/dist/components/flag.min.css +2 -2
  59. package/dist/components/flyout.css +94 -141
  60. package/dist/components/flyout.js +1460 -1465
  61. package/dist/components/flyout.min.css +2 -2
  62. package/dist/components/flyout.min.js +3 -3
  63. package/dist/components/form.css +244 -339
  64. package/dist/components/form.js +2020 -2004
  65. package/dist/components/form.min.css +2 -2
  66. package/dist/components/form.min.js +3 -3
  67. package/dist/components/grid.css +183 -329
  68. package/dist/components/grid.min.css +2 -2
  69. package/dist/components/header.css +118 -142
  70. package/dist/components/header.min.css +2 -2
  71. package/dist/components/icon.css +665 -745
  72. package/dist/components/icon.min.css +2 -2
  73. package/dist/components/image.css +39 -63
  74. package/dist/components/image.min.css +2 -2
  75. package/dist/components/input.css +356 -274
  76. package/dist/components/input.min.css +2 -2
  77. package/dist/components/item.css +84 -131
  78. package/dist/components/item.min.css +2 -2
  79. package/dist/components/label.css +359 -410
  80. package/dist/components/label.min.css +2 -2
  81. package/dist/components/list.css +49 -70
  82. package/dist/components/list.min.css +2 -2
  83. package/dist/components/loader.css +67 -155
  84. package/dist/components/loader.min.css +2 -2
  85. package/dist/components/menu.css +269 -431
  86. package/dist/components/menu.min.css +1 -1
  87. package/dist/components/message.css +125 -197
  88. package/dist/components/message.min.css +2 -2
  89. package/dist/components/modal.css +119 -154
  90. package/dist/components/modal.js +1488 -1486
  91. package/dist/components/modal.min.css +2 -2
  92. package/dist/components/modal.min.js +3 -3
  93. package/dist/components/nag.css +53 -63
  94. package/dist/components/nag.js +520 -526
  95. package/dist/components/nag.min.css +2 -2
  96. package/dist/components/nag.min.js +3 -3
  97. package/dist/components/placeholder.css +22 -42
  98. package/dist/components/placeholder.min.css +2 -2
  99. package/dist/components/popup.css +424 -202
  100. package/dist/components/popup.js +1454 -1456
  101. package/dist/components/popup.min.css +2 -2
  102. package/dist/components/popup.min.js +3 -3
  103. package/dist/components/progress.css +106 -211
  104. package/dist/components/progress.js +969 -997
  105. package/dist/components/progress.min.css +2 -2
  106. package/dist/components/progress.min.js +3 -3
  107. package/dist/components/rail.css +15 -20
  108. package/dist/components/rail.min.css +1 -1
  109. package/dist/components/rating.css +80 -121
  110. package/dist/components/rating.js +505 -523
  111. package/dist/components/rating.min.css +2 -2
  112. package/dist/components/rating.min.js +3 -3
  113. package/dist/components/reset.css +8 -13
  114. package/dist/components/reset.min.css +2 -2
  115. package/dist/components/reveal.css +44 -83
  116. package/dist/components/reveal.min.css +2 -2
  117. package/dist/components/search.css +69 -98
  118. package/dist/components/search.js +1520 -1534
  119. package/dist/components/search.min.css +2 -2
  120. package/dist/components/search.min.js +3 -3
  121. package/dist/components/segment.css +148 -224
  122. package/dist/components/segment.min.css +2 -2
  123. package/dist/components/shape.css +14 -30
  124. package/dist/components/shape.js +781 -810
  125. package/dist/components/shape.min.css +2 -2
  126. package/dist/components/shape.min.js +3 -3
  127. package/dist/components/sidebar.css +103 -206
  128. package/dist/components/sidebar.js +1061 -1099
  129. package/dist/components/sidebar.min.css +2 -2
  130. package/dist/components/sidebar.min.js +3 -3
  131. package/dist/components/site.css +28 -41
  132. package/dist/components/site.js +436 -476
  133. package/dist/components/site.min.css +2 -2
  134. package/dist/components/site.min.js +3 -3
  135. package/dist/components/slider.css +93 -121
  136. package/dist/components/slider.js +1310 -1311
  137. package/dist/components/slider.min.css +1 -1
  138. package/dist/components/slider.min.js +3 -3
  139. package/dist/components/state.js +639 -657
  140. package/dist/components/state.min.js +3 -3
  141. package/dist/components/statistic.css +75 -116
  142. package/dist/components/statistic.min.css +2 -2
  143. package/dist/components/step.css +77 -150
  144. package/dist/components/step.min.css +2 -2
  145. package/dist/components/sticky.css +1 -5
  146. package/dist/components/sticky.js +848 -901
  147. package/dist/components/sticky.min.css +2 -2
  148. package/dist/components/sticky.min.js +3 -3
  149. package/dist/components/tab.css +10 -14
  150. package/dist/components/tab.js +902 -966
  151. package/dist/components/tab.min.css +2 -2
  152. package/dist/components/tab.min.js +3 -3
  153. package/dist/components/table.css +547 -774
  154. package/dist/components/table.min.css +2 -2
  155. package/dist/components/text.css +32 -32
  156. package/dist/components/text.min.css +1 -1
  157. package/dist/components/toast.css +69 -147
  158. package/dist/components/toast.js +910 -884
  159. package/dist/components/toast.min.css +2 -2
  160. package/dist/components/toast.min.js +3 -3
  161. package/dist/components/transition.css +369 -1280
  162. package/dist/components/transition.js +1047 -1077
  163. package/dist/components/transition.min.css +2 -2
  164. package/dist/components/transition.min.js +3 -3
  165. package/dist/components/visibility.js +1213 -1245
  166. package/dist/components/visibility.min.js +3 -3
  167. package/dist/semantic.css +9482 -12264
  168. package/dist/semantic.js +29051 -29426
  169. package/dist/semantic.min.css +3 -3
  170. package/dist/semantic.min.js +3 -3
  171. package/dist/themes/basic/assets/fonts/icons.woff2 +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  174. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  175. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  176. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  177. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  178. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  179. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  182. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  183. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  184. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  185. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  186. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  187. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  188. package/dist/themes/github/assets/fonts/octicons.woff2 +0 -0
  189. package/examples/.eslintrc.js +6 -0
  190. package/examples/assets/library/jquery.min.js +2 -4
  191. package/examples/assets/show-examples.js +13 -13
  192. package/examples/attached.html +1 -1
  193. package/examples/bootstrap.html +1 -1
  194. package/examples/components/button.html +1 -1
  195. package/examples/components/card.html +6 -6
  196. package/examples/components/input.html +1 -1
  197. package/examples/components/menu.html +1 -1
  198. package/examples/components/site.html +1 -1
  199. package/examples/components/sticky-context.html +2 -2
  200. package/examples/components/table.html +1 -1
  201. package/examples/fixed.html +3 -3
  202. package/examples/grid.html +5 -5
  203. package/examples/homepage.html +1 -1
  204. package/examples/login.html +2 -2
  205. package/examples/responsive.html +2 -2
  206. package/examples/sticky.html +4 -4
  207. package/examples/theming.html +1 -1
  208. package/gulpfile.js +13 -11
  209. package/package.json +17 -10
  210. package/scripts/nightly-version.js +83 -75
  211. package/src/_site/collections/menu.overrides +1 -1
  212. package/src/_site/elements/flag.variables +2 -2
  213. package/src/_site/globals/site.variables +1 -1
  214. package/src/_site/modules/embed.variables +3 -0
  215. package/src/definitions/behaviors/api.js +1158 -1180
  216. package/src/definitions/behaviors/form.js +2019 -2003
  217. package/src/definitions/behaviors/state.js +645 -663
  218. package/src/definitions/behaviors/visibility.js +1212 -1244
  219. package/src/definitions/collections/breadcrumb.less +43 -47
  220. package/src/definitions/collections/form.less +866 -884
  221. package/src/definitions/collections/grid.less +1681 -1699
  222. package/src/definitions/collections/menu.less +1521 -1544
  223. package/src/definitions/collections/message.less +294 -298
  224. package/src/definitions/collections/table.less +1657 -1661
  225. package/src/definitions/elements/button.less +1714 -1756
  226. package/src/definitions/elements/container.less +211 -211
  227. package/src/definitions/elements/divider.less +198 -211
  228. package/src/definitions/elements/emoji.less +41 -48
  229. package/src/definitions/elements/flag.less +46 -48
  230. package/src/definitions/elements/header.less +351 -359
  231. package/src/definitions/elements/icon.less +541 -484
  232. package/src/definitions/elements/image.less +216 -227
  233. package/src/definitions/elements/input.less +692 -698
  234. package/src/definitions/elements/label.less +784 -806
  235. package/src/definitions/elements/list.less +810 -814
  236. package/src/definitions/elements/loader.less +273 -268
  237. package/src/definitions/elements/placeholder.less +173 -170
  238. package/src/definitions/elements/rail.less +93 -93
  239. package/src/definitions/elements/reveal.less +192 -198
  240. package/src/definitions/elements/segment.less +742 -749
  241. package/src/definitions/elements/step.less +423 -437
  242. package/src/definitions/elements/text.less +34 -36
  243. package/src/definitions/globals/reset.less +11 -8
  244. package/src/definitions/globals/site.js +435 -475
  245. package/src/definitions/globals/site.less +108 -110
  246. package/src/definitions/modules/accordion.js +567 -594
  247. package/src/definitions/modules/accordion.less +244 -248
  248. package/src/definitions/modules/calendar.js +1933 -1808
  249. package/src/definitions/modules/calendar.less +100 -97
  250. package/src/definitions/modules/checkbox.js +841 -840
  251. package/src/definitions/modules/checkbox.less +531 -552
  252. package/src/definitions/modules/dimmer.js +705 -736
  253. package/src/definitions/modules/dimmer.less +294 -305
  254. package/src/definitions/modules/dropdown.js +4178 -4235
  255. package/src/definitions/modules/dropdown.less +1568 -1598
  256. package/src/definitions/modules/embed.js +644 -674
  257. package/src/definitions/modules/embed.less +82 -84
  258. package/src/definitions/modules/flyout.js +1459 -1464
  259. package/src/definitions/modules/flyout.less +452 -455
  260. package/src/definitions/modules/modal.js +1487 -1485
  261. package/src/definitions/modules/modal.less +458 -467
  262. package/src/definitions/modules/nag.js +519 -525
  263. package/src/definitions/modules/nag.less +136 -149
  264. package/src/definitions/modules/popup.js +1453 -1455
  265. package/src/definitions/modules/popup.less +738 -693
  266. package/src/definitions/modules/progress.js +968 -996
  267. package/src/definitions/modules/progress.less +523 -499
  268. package/src/definitions/modules/rating.js +504 -522
  269. package/src/definitions/modules/rating.less +98 -103
  270. package/src/definitions/modules/search.js +1519 -1533
  271. package/src/definitions/modules/search.less +374 -394
  272. package/src/definitions/modules/shape.js +780 -809
  273. package/src/definitions/modules/shape.less +70 -79
  274. package/src/definitions/modules/sidebar.js +1060 -1098
  275. package/src/definitions/modules/sidebar.less +463 -476
  276. package/src/definitions/modules/slider.js +1309 -1310
  277. package/src/definitions/modules/slider.less +309 -310
  278. package/src/definitions/modules/sticky.js +864 -917
  279. package/src/definitions/modules/sticky.less +17 -25
  280. package/src/definitions/modules/tab.js +901 -965
  281. package/src/definitions/modules/tab.less +48 -54
  282. package/src/definitions/modules/toast.js +909 -883
  283. package/src/definitions/modules/toast.less +589 -589
  284. package/src/definitions/modules/transition.js +1046 -1076
  285. package/src/definitions/modules/transition.less +65 -31
  286. package/src/definitions/views/ad.less +207 -208
  287. package/src/definitions/views/card.less +955 -973
  288. package/src/definitions/views/comment.less +192 -200
  289. package/src/definitions/views/feed.less +222 -226
  290. package/src/definitions/views/item.less +437 -448
  291. package/src/definitions/views/statistic.less +273 -279
  292. package/src/semantic.less +8 -6
  293. package/src/theme.config.example +53 -53
  294. package/src/theme.less +44 -35
  295. package/src/themes/amazon/elements/button.overrides +23 -24
  296. package/src/themes/amazon/elements/button.variables +18 -23
  297. package/src/themes/amazon/globals/site.variables +16 -17
  298. package/src/themes/basic/assets/fonts/icons.woff2 +0 -0
  299. package/src/themes/basic/collections/table.overrides +0 -1
  300. package/src/themes/basic/collections/table.variables +3 -3
  301. package/src/themes/basic/elements/button.overrides +0 -1
  302. package/src/themes/basic/elements/button.variables +9 -9
  303. package/src/themes/basic/elements/icon.overrides +9 -169
  304. package/src/themes/basic/elements/icon.variables +161 -18
  305. package/src/themes/basic/elements/step.overrides +2 -2
  306. package/src/themes/basic/elements/step.variables +2 -2
  307. package/src/themes/basic/globals/reset.overrides +1 -1
  308. package/src/themes/basic/globals/reset.variables +1 -1
  309. package/src/themes/basic/modules/progress.variables +2 -2
  310. package/src/themes/basic/views/card.overrides +0 -1
  311. package/src/themes/basic/views/card.variables +6 -6
  312. package/src/themes/bookish/elements/header.overrides +4 -4
  313. package/src/themes/bookish/elements/header.variables +5 -5
  314. package/src/themes/bootstrap3/elements/button.overrides +3 -0
  315. package/src/themes/bootstrap3/elements/button.variables +20 -25
  316. package/src/themes/chubby/collections/form.overrides +9 -9
  317. package/src/themes/chubby/collections/form.variables +3 -3
  318. package/src/themes/chubby/collections/menu.overrides +3 -0
  319. package/src/themes/chubby/collections/menu.variables +3 -3
  320. package/src/themes/chubby/elements/button.overrides +8 -10
  321. package/src/themes/chubby/elements/button.variables +10 -10
  322. package/src/themes/chubby/elements/header.overrides +1 -1
  323. package/src/themes/chubby/elements/header.variables +4 -4
  324. package/src/themes/chubby/modules/accordion.overrides +2 -2
  325. package/src/themes/chubby/modules/accordion.variables +4 -4
  326. package/src/themes/chubby/views/comment.overrides +5 -5
  327. package/src/themes/chubby/views/comment.variables +11 -11
  328. package/src/themes/classic/collections/table.variables +3 -3
  329. package/src/themes/classic/elements/button.variables +36 -43
  330. package/src/themes/classic/elements/header.variables +4 -4
  331. package/src/themes/classic/modules/progress.variables +3 -3
  332. package/src/themes/classic/views/card.overrides +25 -27
  333. package/src/themes/classic/views/card.variables +7 -7
  334. package/src/themes/colored/modules/checkbox.overrides +3 -0
  335. package/src/themes/colored/modules/checkbox.variables +1 -3
  336. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  337. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  338. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  339. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  340. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  341. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  342. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  343. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  344. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  345. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  346. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  347. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  348. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  349. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  350. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  351. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  352. package/src/themes/default/collections/breadcrumb.variables +4 -4
  353. package/src/themes/default/collections/form.variables +15 -16
  354. package/src/themes/default/collections/grid.overrides +0 -1
  355. package/src/themes/default/collections/grid.variables +15 -16
  356. package/src/themes/default/collections/menu.variables +31 -45
  357. package/src/themes/default/collections/message.variables +84 -123
  358. package/src/themes/default/collections/table.overrides +3 -0
  359. package/src/themes/default/collections/table.variables +30 -34
  360. package/src/themes/default/elements/button.variables +44 -53
  361. package/src/themes/default/elements/container.variables +8 -16
  362. package/src/themes/default/elements/divider.overrides +8 -9
  363. package/src/themes/default/elements/divider.variables +5 -6
  364. package/src/themes/default/elements/emoji.overrides +0 -1
  365. package/src/themes/default/elements/emoji.variables +3556 -3556
  366. package/src/themes/default/elements/flag.variables +1595 -1595
  367. package/src/themes/default/elements/header.overrides +0 -1
  368. package/src/themes/default/elements/header.variables +21 -21
  369. package/src/themes/default/elements/icon.variables +2016 -2009
  370. package/src/themes/default/elements/image.variables +6 -7
  371. package/src/themes/default/elements/input.variables +11 -12
  372. package/src/themes/default/elements/label.variables +25 -26
  373. package/src/themes/default/elements/list.variables +17 -21
  374. package/src/themes/default/elements/loader.variables +16 -17
  375. package/src/themes/default/elements/placeholder.variables +12 -9
  376. package/src/themes/default/elements/rail.variables +4 -5
  377. package/src/themes/default/elements/reveal.variables +1 -1
  378. package/src/themes/default/elements/segment.variables +24 -36
  379. package/src/themes/default/elements/step.overrides +4 -4
  380. package/src/themes/default/elements/step.variables +19 -22
  381. package/src/themes/default/elements/text.variables +2 -3
  382. package/src/themes/default/globals/colors.less +588 -588
  383. package/src/themes/default/globals/reset.overrides +63 -59
  384. package/src/themes/default/globals/reset.variables +1 -1
  385. package/src/themes/default/globals/site.variables +1075 -1123
  386. package/src/themes/default/globals/variation.variables +13 -4
  387. package/src/themes/default/modules/accordion.overrides +11 -11
  388. package/src/themes/default/modules/accordion.variables +15 -20
  389. package/src/themes/default/modules/calendar.variables +2 -0
  390. package/src/themes/default/modules/chatroom.variables +1 -1
  391. package/src/themes/default/modules/checkbox.overrides +9 -13
  392. package/src/themes/default/modules/checkbox.variables +24 -33
  393. package/src/themes/default/modules/dimmer.variables +14 -17
  394. package/src/themes/default/modules/dropdown.overrides +17 -17
  395. package/src/themes/default/modules/dropdown.variables +29 -31
  396. package/src/themes/default/modules/embed.variables +9 -13
  397. package/src/themes/default/modules/flyout.variables +10 -8
  398. package/src/themes/default/modules/modal.variables +64 -67
  399. package/src/themes/default/modules/nag.variables +11 -14
  400. package/src/themes/default/modules/popup.variables +14 -13
  401. package/src/themes/default/modules/progress.variables +17 -19
  402. package/src/themes/default/modules/rating.variables +10 -12
  403. package/src/themes/default/modules/search.variables +12 -17
  404. package/src/themes/default/modules/shape.variables +7 -8
  405. package/src/themes/default/modules/sidebar.variables +4 -4
  406. package/src/themes/default/modules/slider.variables +55 -54
  407. package/src/themes/default/modules/sticky.variables +1 -1
  408. package/src/themes/default/modules/toast.variables +8 -8
  409. package/src/themes/default/modules/transition.overrides +936 -915
  410. package/src/themes/default/modules/transition.variables +8 -1
  411. package/src/themes/default/views/ad.variables +1 -1
  412. package/src/themes/default/views/card.variables +33 -45
  413. package/src/themes/default/views/comment.variables +7 -9
  414. package/src/themes/default/views/feed.variables +10 -10
  415. package/src/themes/default/views/item.variables +20 -23
  416. package/src/themes/default/views/statistic.variables +8 -8
  417. package/src/themes/duo/elements/loader.variables +1 -1
  418. package/src/themes/famfamfam/elements/flag.overrides +263 -268
  419. package/src/themes/famfamfam/elements/flag.variables +4 -4
  420. package/src/themes/fixed-width/collections/grid.variables +4 -4
  421. package/src/themes/fixed-width/modules/modal.variables +11 -13
  422. package/src/themes/flat/collections/form.overrides +9 -9
  423. package/src/themes/flat/collections/form.variables +16 -17
  424. package/src/themes/flat/globals/site.variables +69 -74
  425. package/src/themes/github/assets/fonts/octicons.woff2 +0 -0
  426. package/src/themes/github/collections/breadcrumb.variables +0 -1
  427. package/src/themes/github/collections/form.overrides +7 -8
  428. package/src/themes/github/collections/form.variables +16 -18
  429. package/src/themes/github/collections/grid.variables +1 -2
  430. package/src/themes/github/collections/menu.overrides +2 -2
  431. package/src/themes/github/collections/menu.variables +24 -26
  432. package/src/themes/github/collections/message.overrides +3 -3
  433. package/src/themes/github/collections/message.variables +12 -14
  434. package/src/themes/github/collections/table.variables +2 -2
  435. package/src/themes/github/elements/button.overrides +0 -1
  436. package/src/themes/github/elements/button.variables +26 -30
  437. package/src/themes/github/elements/header.variables +2 -2
  438. package/src/themes/github/elements/icon.overrides +3 -208
  439. package/src/themes/github/elements/icon.variables +234 -19
  440. package/src/themes/github/elements/image.variables +1 -1
  441. package/src/themes/github/elements/input.overrides +16 -16
  442. package/src/themes/github/elements/input.variables +4 -5
  443. package/src/themes/github/elements/label.overrides +3 -3
  444. package/src/themes/github/elements/label.variables +0 -1
  445. package/src/themes/github/elements/segment.variables +9 -10
  446. package/src/themes/github/elements/step.overrides +13 -13
  447. package/src/themes/github/elements/step.variables +6 -6
  448. package/src/themes/github/globals/site.variables +16 -16
  449. package/src/themes/github/modules/dropdown.overrides +18 -19
  450. package/src/themes/github/modules/dropdown.variables +8 -10
  451. package/src/themes/github/modules/popup.variables +0 -2
  452. package/src/themes/gmail/collections/message.overrides +3 -0
  453. package/src/themes/gmail/collections/message.variables +4 -4
  454. package/src/themes/instagram/views/card.overrides +4 -5
  455. package/src/themes/instagram/views/card.variables +7 -8
  456. package/src/themes/joypixels/elements/emoji.overrides +0 -2
  457. package/src/themes/joypixels/elements/emoji.variables +3554 -3554
  458. package/src/themes/material/collections/menu.overrides +1 -1
  459. package/src/themes/material/collections/menu.variables +4 -4
  460. package/src/themes/material/elements/button.overrides +7 -9
  461. package/src/themes/material/elements/button.variables +44 -46
  462. package/src/themes/material/elements/header.overrides +3 -3
  463. package/src/themes/material/elements/header.variables +8 -10
  464. package/src/themes/material/elements/icon.overrides +3 -934
  465. package/src/themes/material/elements/icon.variables +958 -18
  466. package/src/themes/material/globals/site.overrides +3 -0
  467. package/src/themes/material/globals/site.variables +83 -84
  468. package/src/themes/material/modules/dropdown.overrides +2 -2
  469. package/src/themes/material/modules/dropdown.variables +5 -5
  470. package/src/themes/material/modules/modal.overrides +3 -3
  471. package/src/themes/material/modules/modal.variables +4 -5
  472. package/src/themes/pulsar/elements/loader.overrides +23 -61
  473. package/src/themes/raised/elements/button.variables +8 -9
  474. package/src/themes/resetcss/globals/reset.overrides +115 -33
  475. package/src/themes/resetcss/globals/reset.variables +1 -1
  476. package/src/themes/round/elements/button.overrides +3 -0
  477. package/src/themes/round/elements/button.variables +33 -38
  478. package/src/themes/rtl/globals/site.overrides +1 -1
  479. package/src/themes/rtl/globals/site.variables +5 -6
  480. package/src/themes/striped/modules/progress.overrides +20 -16
  481. package/src/themes/systemfont/globals/reset.overrides +1 -1
  482. package/src/themes/systemfont/globals/site.variables +6 -6
  483. package/src/themes/timeline/views/feed.overrides +12 -12
  484. package/src/themes/timeline/views/feed.variables +8 -8
  485. package/src/themes/twitter/elements/button.overrides +4 -5
  486. package/src/themes/twitter/elements/button.variables +17 -18
  487. package/src/themes/twitter/elements/emoji.variables +3556 -3556
  488. package/tasks/.eslintrc.js +9 -0
  489. package/tasks/README.md +2 -4
  490. package/tasks/admin/components/create.js +268 -277
  491. package/tasks/admin/components/init.js +123 -129
  492. package/tasks/admin/components/update.js +151 -158
  493. package/tasks/admin/distributions/create.js +183 -189
  494. package/tasks/admin/distributions/init.js +125 -131
  495. package/tasks/admin/distributions/update.js +147 -153
  496. package/tasks/admin/publish.js +5 -9
  497. package/tasks/admin/register.js +37 -39
  498. package/tasks/admin/release.js +8 -12
  499. package/tasks/build/assets.js +43 -40
  500. package/tasks/build/css.js +230 -217
  501. package/tasks/build/javascript.js +120 -114
  502. package/tasks/build.js +11 -11
  503. package/tasks/check-install.js +15 -17
  504. package/tasks/clean.js +6 -6
  505. package/tasks/collections/README.md +3 -5
  506. package/tasks/collections/admin.js +34 -36
  507. package/tasks/collections/build.js +19 -21
  508. package/tasks/collections/docs.js +11 -13
  509. package/tasks/collections/install.js +11 -13
  510. package/tasks/collections/rtl.js +9 -12
  511. package/tasks/collections/various.js +10 -12
  512. package/tasks/config/admin/github.js +17 -19
  513. package/tasks/config/admin/oauth.example.js +4 -4
  514. package/tasks/config/admin/release.js +98 -98
  515. package/tasks/config/admin/templates/README.md +8 -8
  516. package/tasks/config/admin/templates/bower.json +3 -2
  517. package/tasks/config/admin/templates/component-package.js +9 -10
  518. package/tasks/config/admin/templates/css-package.js +19 -21
  519. package/tasks/config/admin/templates/less-package.js +12 -14
  520. package/tasks/config/admin/templates/package.json +6 -6
  521. package/tasks/config/defaults.js +116 -116
  522. package/tasks/config/docs.js +23 -23
  523. package/tasks/config/npm/gulpfile.js +15 -14
  524. package/tasks/config/project/config.js +124 -136
  525. package/tasks/config/project/install.js +722 -719
  526. package/tasks/config/project/release.js +34 -41
  527. package/tasks/config/tasks.js +168 -167
  528. package/tasks/config/user.js +28 -29
  529. package/tasks/docs/build.js +100 -96
  530. package/tasks/docs/metadata.js +91 -98
  531. package/tasks/docs/serve.js +84 -82
  532. package/tasks/install.js +373 -382
  533. package/tasks/rtl/build.js +4 -3
  534. package/tasks/rtl/watch.js +4 -3
  535. package/tasks/version.js +4 -6
  536. package/tasks/watch.js +29 -31
  537. package/test/.eslintrc.js +23 -0
  538. package/test/meteor/assets.js +11 -14
  539. package/test/meteor/fonts.js +12 -13
  540. package/test/modules/accordion.spec.js +6 -8
  541. package/test/modules/checkbox.spec.js +5 -7
  542. package/test/modules/dropdown.spec.js +5 -7
  543. package/test/modules/modal.spec.js +6 -8
  544. package/test/modules/module.spec.js +158 -178
  545. package/test/modules/popup.spec.js +5 -7
  546. package/test/modules/search.spec.js +5 -7
  547. package/test/modules/shape.spec.js +5 -7
  548. package/test/modules/sidebar.spec.js +5 -7
  549. package/test/modules/tab.spec.js +6 -8
  550. package/test/modules/transition.spec.js +5 -7
  551. package/test/modules/video.spec.js +5 -7
  552. package/.github/workflows/codeql.yml +0 -68
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.1-beta.4+9773a1d - Calendar
2
+ * # Fomantic-UI 2.9.1-beta.40+0bffb4a - Calendar
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -8,1883 +8,2008 @@
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- $.isFunction = $.isFunction || function(obj) {
16
- return typeof obj === "function" && typeof obj.nodeType !== "number";
17
- };
18
-
19
- window = (typeof window != 'undefined' && window.Math == Math)
20
- ? window
21
- : (typeof self != 'undefined' && self.Math == Math)
22
- ? self
23
- : Function('return this')()
24
- ;
25
-
26
- $.fn.calendar = function(parameters) {
27
- var
28
- $allModules = $(this),
29
-
30
- moduleSelector = $allModules.selector || '',
31
-
32
- time = new Date().getTime(),
33
- performance = [],
34
-
35
- query = arguments[0],
36
- methodInvoked = (typeof query == 'string'),
37
- queryArguments = [].slice.call(arguments, 1),
38
- returnedValue,
39
- timeGapTable = {
40
- '5': {'row': 4, 'column': 3 },
41
- '10': {'row': 3, 'column': 2 },
42
- '15': {'row': 2, 'column': 2 },
43
- '20': {'row': 3, 'column': 1 },
44
- '30': {'row': 2, 'column': 1 }
45
- },
46
- numberText = ['','one','two','three','four','five','six','seven','eight']
47
- ;
48
-
49
- $allModules
50
- .each(function () {
51
- var
52
- settings = ( $.isPlainObject(parameters) )
53
- ? $.extend(true, {}, $.fn.calendar.settings, parameters)
54
- : $.extend({}, $.fn.calendar.settings),
55
-
56
- className = settings.className,
57
- namespace = settings.namespace,
58
- selector = settings.selector,
59
- formatter = settings.formatter,
60
- parser = settings.parser,
61
- metadata = settings.metadata,
62
- timeGap = timeGapTable[settings.minTimeGap],
63
- error = settings.error,
64
-
65
- eventNamespace = '.' + namespace,
66
- moduleNamespace = 'module-' + namespace,
67
-
68
- $module = $(this),
69
- $input = $module.find(selector.input),
70
- $container = $module.find(selector.popup),
71
- $activator = $module.find(selector.activator),
72
-
73
- element = this,
74
- instance = $module.data(moduleNamespace),
75
-
76
- isTouch,
77
- isTouchDown = false,
78
- isInverted = $module.hasClass(className.inverted),
79
- focusDateUsedForRange = false,
80
- selectionComplete = false,
81
- classObserver,
82
- module
83
- ;
84
-
85
- module = {
86
-
87
- initialize: function () {
88
- module.debug('Initializing calendar for', element, $module);
89
-
90
- isTouch = module.get.isTouch();
91
- module.setup.config();
92
- module.setup.popup();
93
- module.setup.inline();
94
- module.setup.input();
95
- module.setup.date();
96
- module.create.calendar();
97
-
98
- module.bind.events();
99
- module.observeChanges();
100
- module.instantiate();
101
- },
102
-
103
- instantiate: function () {
104
- module.verbose('Storing instance of calendar');
105
- instance = module;
106
- $module.data(moduleNamespace, instance);
107
- },
108
-
109
- destroy: function () {
110
- module.verbose('Destroying previous calendar for', element);
111
- $module.removeData(moduleNamespace);
112
- module.unbind.events();
113
- module.disconnect.classObserver();
114
- },
115
-
116
- setup: {
117
- config: function () {
118
- if (module.get.minDate() !== null) {
119
- module.set.minDate($module.data(metadata.minDate));
120
- }
121
- if (module.get.maxDate() !== null) {
122
- module.set.maxDate($module.data(metadata.maxDate));
123
- }
124
- module.setting('type', module.get.type());
125
- module.setting('on', settings.on || 'click');
126
- },
127
- popup: function () {
128
- if (settings.inline) {
129
- return;
130
- }
131
- if (!$activator.length) {
132
- $activator = $module.children().first();
133
- if (!$activator.length) {
134
- return;
135
- }
136
- }
137
- if ($.fn.popup === undefined) {
138
- module.error(error.popup);
139
- return;
140
- }
141
- if (!$container.length) {
142
- //prepend the popup element to the activator's parent so that it has less chance of messing with
143
- //the styling (eg input action button needs to be the last child to have correct border radius)
144
- var $activatorParent = $activator.parent(),
145
- domPositionFunction = $activatorParent.closest(selector.append).length !== 0 ? 'appendTo' : 'prependTo';
146
- $container = $('<div/>').addClass(className.popup)[domPositionFunction]($activatorParent);
147
- }
148
- $container.addClass(className.calendar);
149
- if(isInverted){
150
- $container.addClass(className.inverted);
151
- }
152
- var onVisible = function () {
153
- module.refreshTooltips();
154
- return settings.onVisible.apply($container, arguments);
155
- };
156
- var onHidden = function () {
157
- module.blur();
158
- return settings.onHidden.apply($container, arguments)
159
- }
160
- if (!$input.length) {
161
- //no input, $container has to handle focus/blur
162
- $container.attr('tabindex', '0');
163
- onVisible = function () {
164
- module.refreshTooltips();
165
- module.focus();
166
- return settings.onVisible.apply($container, arguments);
167
- };
168
- }
169
- var onShow = function () {
170
- //reset the focus date onShow
171
- module.set.focusDate(module.get.date());
172
- module.set.mode(module.get.validatedMode(settings.startMode));
173
- return settings.onShow.apply($container, arguments);
174
- };
175
- var on = module.setting('on');
176
- var options = $.extend({}, settings.popupOptions, {
177
- popup: $container,
178
- on: on,
179
- hoverable: on === 'hover',
180
- closable: on === 'click',
181
- onShow: onShow,
182
- onVisible: onVisible,
183
- onHide: settings.onHide,
184
- onHidden: onHidden
185
- });
186
- module.popup(options);
187
- },
188
- inline: function () {
189
- if ($activator.length && !settings.inline) {
190
- return;
191
- }
192
- settings.inline = true;
193
- $container = $('<div/>').addClass(className.calendar).appendTo($module);
194
- if (!$input.length) {
195
- $container.attr('tabindex', '0');
196
- }
197
- },
198
- input: function () {
199
- if (settings.touchReadonly && $input.length && isTouch) {
200
- $input.prop('readonly', true);
201
- }
202
- module.check.disabled();
203
- },
204
- date: function () {
205
- var date;
206
- if (settings.initialDate) {
207
- date = parser.date(settings.initialDate, settings);
208
- } else if ($module.data(metadata.date) !== undefined) {
209
- date = parser.date($module.data(metadata.date), settings);
210
- } else if ($input.length) {
211
- date = parser.date($input.val(), settings);
212
- }
213
- module.set.date(date, settings.formatInput, false);
214
- module.set.mode(module.get.mode(), false);
215
- }
216
- },
217
-
218
- trigger: {
219
- change: function() {
220
- var
221
- inputElement = $input[0]
222
- ;
223
- if(inputElement) {
224
- var events = document.createEvent('HTMLEvents');
225
- module.verbose('Triggering native change event');
226
- events.initEvent('change', true, false);
227
- inputElement.dispatchEvent(events);
228
- }
229
- }
230
- },
11
+ (function ($, window, document) {
12
+ 'use strict';
231
13
 
232
- create: {
233
- calendar: function () {
234
- var i, r, c, p, row, cell, pageGrid;
235
-
236
- var
237
- mode = module.get.mode(),
238
- today = new Date(),
239
- date = module.get.date(),
240
- focusDate = module.get.focusDate(),
241
- display = module.helper.dateInRange(focusDate || date || settings.initialDate || today)
242
- ;
243
-
244
- if (!focusDate) {
245
- focusDate = display;
246
- module.set.focusDate(focusDate, false, false);
247
- }
14
+ function isFunction(obj) {
15
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
16
+ }
248
17
 
18
+ window = window !== undefined && window.Math === Math
19
+ ? window
20
+ : globalThis;
21
+
22
+ $.fn.calendar = function (parameters) {
23
+ var
24
+ $allModules = $(this),
25
+ $document = $(document),
26
+
27
+ moduleSelector = $allModules.selector || '',
28
+
29
+ time = Date.now(),
30
+ performance = [],
31
+
32
+ query = arguments[0],
33
+ methodInvoked = typeof query === 'string',
34
+ queryArguments = [].slice.call(arguments, 1),
35
+ returnedValue,
36
+ timeGapTable = {
37
+ 5: { row: 4, column: 3 },
38
+ 10: { row: 3, column: 2 },
39
+ 15: { row: 2, column: 2 },
40
+ 20: { row: 3, column: 1 },
41
+ 30: { row: 2, column: 1 },
42
+ },
43
+ numberText = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']
44
+ ;
45
+
46
+ $allModules.each(function () {
249
47
  var
250
- isYear = mode === 'year',
251
- isMonth = mode === 'month',
252
- isDay = mode === 'day',
253
- isHour = mode === 'hour',
254
- isMinute = mode === 'minute',
255
- isTimeOnly = settings.type === 'time'
48
+ settings = $.isPlainObject(parameters)
49
+ ? $.extend(true, {}, $.fn.calendar.settings, parameters)
50
+ : $.extend({}, $.fn.calendar.settings),
51
+
52
+ className = settings.className,
53
+ namespace = settings.namespace,
54
+ selector = settings.selector,
55
+ formatter = settings.formatter,
56
+ parser = settings.parser,
57
+ metadata = settings.metadata,
58
+ timeGap = timeGapTable[settings.minTimeGap],
59
+ error = settings.error,
60
+
61
+ eventNamespace = '.' + namespace,
62
+ moduleNamespace = 'module-' + namespace,
63
+
64
+ $module = $(this),
65
+ $input = $module.find(selector.input),
66
+ $activator = $module.find(selector.activator),
67
+
68
+ element = this,
69
+ instance = $module.data(moduleNamespace),
70
+ $container = instance && instance.popupId ? $document.find('#' + instance.popupId) : $module.find(selector.popup),
71
+
72
+ isTouch,
73
+ isTouchDown = false,
74
+ isInverted = $module.hasClass(className.inverted),
75
+ focusDateUsedForRange = false,
76
+ selectionComplete = false,
77
+ classObserver,
78
+ module
256
79
  ;
257
80
 
258
- var multiMonth = Math.max(settings.multiMonth, 1);
259
- var monthOffset = !isDay ? 0 : module.get.monthOffset();
81
+ module = {
82
+
83
+ initialize: function () {
84
+ module.debug('Initializing calendar for', element, $module);
85
+
86
+ isTouch = module.get.isTouch();
87
+ module.setup.config();
88
+ module.setup.popup();
89
+ module.setup.inline();
90
+ module.setup.input();
91
+ module.setup.date();
92
+ module.create.calendar();
93
+
94
+ module.bind.events();
95
+ module.observeChanges();
96
+ module.instantiate();
97
+ },
98
+
99
+ instantiate: function () {
100
+ module.verbose('Storing instance of calendar');
101
+ instance = module;
102
+ $module.data(moduleNamespace, instance);
103
+ },
104
+
105
+ destroy: function () {
106
+ module.verbose('Destroying previous calendar for', element);
107
+ $module.removeData(moduleNamespace);
108
+ module.unbind.events();
109
+ module.disconnect.classObserver();
110
+ },
111
+
112
+ setup: {
113
+ config: function () {
114
+ if (module.get.minDate() !== null) {
115
+ module.set.minDate($module.data(metadata.minDate));
116
+ }
117
+ if (module.get.maxDate() !== null) {
118
+ module.set.maxDate($module.data(metadata.maxDate));
119
+ }
120
+ module.setting('type', module.get.type());
121
+ module.setting('on', settings.on || 'click');
122
+ },
123
+ popup: function () {
124
+ if (settings.inline) {
125
+ return;
126
+ }
127
+ if ($activator.length === 0) {
128
+ $activator = $module.children().first();
129
+ if ($activator.length === 0) {
130
+ return;
131
+ }
132
+ }
133
+ if ($.fn.popup === undefined) {
134
+ module.error(error.popup);
260
135
 
261
- var
262
- minute = display.getMinutes(),
263
- hour = display.getHours(),
264
- day = display.getDate(),
265
- startMonth = display.getMonth() + monthOffset,
266
- year = display.getFullYear()
267
- ;
136
+ return;
137
+ }
138
+ if ($container.length === 0) {
139
+ if (settings.context) {
140
+ module.popupId = namespace + '_popup_' + (Math.random().toString(16) + '000000000').slice(2, 10);
141
+ $container = $('<div/>', { id: module.popupId }).addClass(className.popup).appendTo($document.find(settings.context));
142
+ } else {
143
+ // prepend the popup element to the activator's parent so that it has less chance of messing with
144
+ // the styling (eg input action button needs to be the last child to have correct border radius)
145
+ var
146
+ $activatorParent = $activator.parent(),
147
+ domPositionFunction = $activatorParent.closest(selector.append).length > 0 ? 'appendTo' : 'prependTo'
148
+ ;
149
+ $container = $('<div/>').addClass(className.popup)[domPositionFunction]($activatorParent);
150
+ }
151
+ }
152
+ $container.addClass(className.calendar);
153
+ if (isInverted) {
154
+ $container.addClass(className.inverted);
155
+ }
156
+ var onVisible = function () {
157
+ module.refreshTooltips();
158
+
159
+ return settings.onVisible.apply($container, arguments);
160
+ };
161
+ var onHidden = function () {
162
+ module.blur();
163
+
164
+ return settings.onHidden.apply($container, arguments);
165
+ };
166
+ if ($input.length === 0) {
167
+ // no input, $container has to handle focus/blur
168
+ $container.attr('tabindex', '0');
169
+ onVisible = function () {
170
+ module.refreshTooltips();
171
+ module.focus();
172
+
173
+ return settings.onVisible.apply($container, arguments);
174
+ };
175
+ }
176
+ var onShow = function () {
177
+ // reset the focus date onShow
178
+ module.set.focusDate(module.get.date());
179
+ module.set.mode(module.get.validatedMode(settings.startMode));
180
+
181
+ return settings.onShow.apply($container, arguments);
182
+ };
183
+ var on = module.setting('on');
184
+ var options = $.extend({}, settings.popupOptions, {
185
+ popup: $container,
186
+ movePopup: !settings.context,
187
+ on: on,
188
+ hoverable: on === 'hover',
189
+ closable: on === 'click',
190
+ onShow: onShow,
191
+ onVisible: onVisible,
192
+ onHide: settings.onHide,
193
+ onHidden: onHidden,
194
+ });
195
+ module.popup(options);
196
+ },
197
+ inline: function () {
198
+ if ($activator.length > 0 && !settings.inline) {
199
+ return;
200
+ }
201
+ settings.inline = true;
202
+ $container = $('<div/>').addClass(className.calendar).appendTo($module);
203
+ if ($input.length === 0) {
204
+ $container.attr('tabindex', '0');
205
+ }
206
+ },
207
+ input: function () {
208
+ if (settings.touchReadonly && $input.length > 0 && isTouch) {
209
+ $input.prop('readonly', true);
210
+ }
211
+ module.check.disabled();
212
+ },
213
+ date: function () {
214
+ var date;
215
+ if (settings.initialDate) {
216
+ date = parser.date(settings.initialDate, settings);
217
+ } else if ($module.data(metadata.date) !== undefined) {
218
+ date = parser.date($module.data(metadata.date), settings);
219
+ } else if ($input.length > 0) {
220
+ date = parser.date($input.val(), settings);
221
+ }
222
+ module.set.date(date, settings.formatInput, false);
223
+ module.set.mode(module.get.mode(), false);
224
+ },
225
+ },
226
+
227
+ trigger: {
228
+ change: function () {
229
+ var
230
+ inputElement = $input[0]
231
+ ;
232
+ if (inputElement) {
233
+ var events = document.createEvent('HTMLEvents');
234
+ module.verbose('Triggering native change event');
235
+ events.initEvent('change', true, false);
236
+ inputElement.dispatchEvent(events);
237
+ }
238
+ },
239
+ },
240
+
241
+ create: {
242
+ calendar: function () {
243
+ var
244
+ i,
245
+ r,
246
+ c,
247
+ p,
248
+ row,
249
+ cell,
250
+ pageGrid
251
+ ;
252
+
253
+ var
254
+ mode = module.get.mode(),
255
+ today = new Date(),
256
+ date = module.get.date(),
257
+ focusDate = module.get.focusDate(),
258
+ display = module.helper.dateInRange(focusDate || date || parser.date(settings.initialDate, settings) || today)
259
+ ;
260
+
261
+ if (!focusDate) {
262
+ focusDate = display;
263
+ module.set.focusDate(focusDate, false, false);
264
+ }
268
265
 
269
- var columns = isDay ? settings.showWeekNumbers ? 8 : 7 : isHour ? 4 : timeGap['column'];
270
- var rows = isDay || isHour ? 6 : timeGap['row'];
271
- var pages = isDay ? multiMonth : 1;
266
+ var
267
+ isYear = mode === 'year',
268
+ isMonth = mode === 'month',
269
+ isDay = mode === 'day',
270
+ isHour = mode === 'hour',
271
+ isMinute = mode === 'minute',
272
+ isTimeOnly = settings.type === 'time'
273
+ ;
274
+
275
+ var multiMonth = Math.max(settings.multiMonth, 1);
276
+ var monthOffset = !isDay ? 0 : module.get.monthOffset();
277
+
278
+ var
279
+ minute = display.getMinutes(),
280
+ hour = display.getHours(),
281
+ day = display.getDate(),
282
+ startMonth = display.getMonth() + monthOffset,
283
+ year = display.getFullYear()
284
+ ;
285
+
286
+ var columns = isDay
287
+ ? (settings.showWeekNumbers ? 8 : 7)
288
+ : (isHour ? 4 : timeGap.column);
289
+ var rows = isDay || isHour ? 6 : timeGap.row;
290
+ var pages = isDay ? multiMonth : 1;
291
+
292
+ var container = $container;
293
+ var tooltipPosition = container.hasClass('left') ? 'right center' : 'left center';
294
+ container.empty();
295
+ if (pages > 1) {
296
+ pageGrid = $('<div/>').addClass(className.grid).appendTo(container);
297
+ }
272
298
 
273
- var container = $container;
274
- var tooltipPosition = container.hasClass("left") ? "right center" : "left center";
275
- container.empty();
276
- if (pages > 1) {
277
- pageGrid = $('<div/>').addClass(className.grid).appendTo(container);
278
- }
299
+ for (p = 0; p < pages; p++) {
300
+ if (pages > 1) {
301
+ var pageColumn = $('<div/>').addClass(className.column).appendTo(pageGrid);
302
+ container = pageColumn;
303
+ }
304
+
305
+ var month = startMonth + p;
306
+ var firstMonthDayColumn = (new Date(year, month, 1).getDay() - (settings.firstDayOfWeek % 7) + 7) % 7;
307
+ if (!settings.constantHeight && isDay) {
308
+ var requiredCells = new Date(year, month + 1, 0).getDate() + firstMonthDayColumn;
309
+ rows = Math.ceil(requiredCells / 7);
310
+ }
311
+
312
+ var
313
+ yearChange = isYear ? 10 : (isMonth ? 1 : 0),
314
+ monthChange = isDay ? 1 : 0,
315
+ dayChange = isHour || isMinute ? 1 : 0,
316
+ prevNextDay = isHour || isMinute ? day : 1,
317
+ prevDate = new Date(year - yearChange, month - monthChange, prevNextDay - dayChange, hour),
318
+ nextDate = new Date(year + yearChange, month + monthChange, prevNextDay + dayChange, hour),
319
+ prevLast = isYear
320
+ ? new Date(Math.ceil(year / 10) * 10 - 9, 0, 0)
321
+ : (isMonth
322
+ ? new Date(year, 0, 0)
323
+ : (isDay // eslint-disable-line unicorn/no-nested-ternary
324
+ ? new Date(year, month, 0)
325
+ : new Date(year, month, day, -1))),
326
+ nextFirst = isYear
327
+ ? new Date(Math.ceil(year / 10) * 10 + 1, 0, 1)
328
+ : (isMonth
329
+ ? new Date(year + 1, 0, 1)
330
+ : (isDay // eslint-disable-line unicorn/no-nested-ternary
331
+ ? new Date(year, month + 1, 1)
332
+ : new Date(year, month, day + 1)))
333
+ ;
334
+
335
+ var tempMode = mode;
336
+ if (isDay && settings.showWeekNumbers) {
337
+ tempMode += ' andweek';
338
+ }
339
+ var table = $('<table/>').addClass(className.table).addClass(tempMode).addClass(numberText[columns] + ' column')
340
+ .appendTo(container);
341
+ if (isInverted) {
342
+ table.addClass(className.inverted);
343
+ }
344
+ var textColumns = columns;
345
+ // no header for time-only mode
346
+ if (!isTimeOnly) {
347
+ var thead = $('<thead/>').appendTo(table);
348
+
349
+ row = $('<tr/>').appendTo(thead);
350
+ cell = $('<th/>').attr('colspan', '' + columns).appendTo(row);
351
+
352
+ var headerDate = isYear || isMonth
353
+ ? new Date(year, 0, 1)
354
+ : (isDay
355
+ ? new Date(year, month, 1)
356
+ : new Date(year, month, day, hour, minute));
357
+ var headerText = $('<span/>').addClass(className.link).appendTo(cell);
358
+ headerText.text(module.helper.dateFormat(formatter[mode + 'Header'], headerDate));
359
+ var newMode = isMonth
360
+ ? (settings.disableYear ? 'day' : 'year')
361
+ : (isDay
362
+ ? (settings.disableMonth ? 'year' : 'month') // eslint-disable-line unicorn/no-nested-ternary
363
+ : 'day');
364
+ headerText.data(metadata.mode, newMode);
365
+
366
+ if (p === 0) {
367
+ var prev = $('<span/>').addClass(className.prev).appendTo(cell);
368
+ prev.data(metadata.focusDate, prevDate);
369
+ prev.toggleClass(className.disabledCell, !module.helper.isDateInRange(prevLast, mode));
370
+ $('<i/>').addClass(className.prevIcon).appendTo(prev);
371
+ }
372
+
373
+ if (p === pages - 1) {
374
+ var next = $('<span/>').addClass(className.next).appendTo(cell);
375
+ next.data(metadata.focusDate, nextDate);
376
+ next.toggleClass(className.disabledCell, !module.helper.isDateInRange(nextFirst, mode));
377
+ $('<i/>').addClass(className.nextIcon).appendTo(next);
378
+ }
379
+ if (isDay) {
380
+ row = $('<tr/>').appendTo(thead);
381
+ if (settings.showWeekNumbers) {
382
+ cell = $('<th/>').appendTo(row);
383
+ cell.text(settings.text.weekNo);
384
+ cell.addClass(className.weekCell);
385
+ textColumns--;
386
+ }
387
+ for (i = 0; i < textColumns; i++) {
388
+ cell = $('<th/>').appendTo(row);
389
+ cell.text(formatter.dayColumnHeader((i + settings.firstDayOfWeek) % 7, settings));
390
+ }
391
+ }
392
+ }
393
+
394
+ var tbody = $('<tbody/>').appendTo(table);
395
+ i = isYear
396
+ ? Math.ceil(year / 10) * 10 - 9
397
+ : (isDay ? 1 - firstMonthDayColumn : 0);
398
+ for (r = 0; r < rows; r++) {
399
+ row = $('<tr/>').appendTo(tbody);
400
+ if (isDay && settings.showWeekNumbers) {
401
+ cell = $('<th/>').appendTo(row);
402
+ cell.text(module.get.weekOfYear(year, month, i + 1 - settings.firstDayOfWeek));
403
+ cell.addClass(className.weekCell);
404
+ }
405
+ for (c = 0; c < textColumns; c++, i++) {
406
+ var cellDate = isYear
407
+ ? new Date(i, month, 1, hour, minute)
408
+ : (isMonth
409
+ ? new Date(year, i, 1, hour, minute)
410
+ : (isDay // eslint-disable-line unicorn/no-nested-ternary
411
+ ? new Date(year, month, i, hour, minute)
412
+ : (isHour
413
+ ? new Date(year, month, day, i)
414
+ : new Date(year, month, day, hour, i * settings.minTimeGap))));
415
+ var cellText = isYear
416
+ ? i
417
+ : (isMonth
418
+ ? settings.text.monthsShort[i]
419
+ : (isDay // eslint-disable-line unicorn/no-nested-ternary
420
+ ? cellDate.getDate()
421
+ : module.helper.dateFormat(formatter.cellTime, cellDate)));
422
+ cell = $('<td/>').addClass(className.cell).appendTo(row);
423
+ cell.text(cellText);
424
+ cell.data(metadata.date, cellDate);
425
+ var adjacent = isDay && cellDate.getMonth() !== ((month + 12) % 12);
426
+ var disabled = (!settings.selectAdjacentDays && adjacent) || !module.helper.isDateInRange(cellDate, mode) || settings.isDisabled(cellDate, mode) || module.helper.isDisabled(cellDate, mode) || !module.helper.isEnabled(cellDate, mode);
427
+ var eventDate;
428
+ if (disabled) {
429
+ var disabledDate = module.helper.findDayAsObject(cellDate, mode, settings.disabledDates);
430
+ if (disabledDate !== null && disabledDate[metadata.message]) {
431
+ cell.attr('data-tooltip', disabledDate[metadata.message]);
432
+ cell.attr('data-position', disabledDate[metadata.position] || tooltipPosition);
433
+ if (disabledDate[metadata.inverted] || (isInverted && disabledDate[metadata.inverted] === undefined)) {
434
+ cell.attr('data-inverted', '');
435
+ }
436
+ if (disabledDate[metadata.variation]) {
437
+ cell.attr('data-variation', disabledDate[metadata.variation]);
438
+ }
439
+ }
440
+ if (mode === 'hour') {
441
+ var disabledHour = module.helper.findHourAsObject(cellDate, mode, settings.disabledHours);
442
+ if (disabledHour !== null && disabledHour[metadata.message]) {
443
+ cell.attr('data-tooltip', disabledHour[metadata.message]);
444
+ cell.attr('data-position', disabledHour[metadata.position] || tooltipPosition);
445
+ if (disabledHour[metadata.inverted] || (isInverted && disabledHour[metadata.inverted] === undefined)) {
446
+ cell.attr('data-inverted', '');
447
+ }
448
+ if (disabledHour[metadata.variation]) {
449
+ cell.attr('data-variation', disabledHour[metadata.variation]);
450
+ }
451
+ }
452
+ }
453
+ } else {
454
+ eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates);
455
+ if (eventDate !== null) {
456
+ cell.addClass(eventDate[metadata.class] || settings.eventClass);
457
+ if (eventDate[metadata.message]) {
458
+ cell.attr('data-tooltip', eventDate[metadata.message]);
459
+ cell.attr('data-position', eventDate[metadata.position] || tooltipPosition);
460
+ if (eventDate[metadata.inverted] || (isInverted && eventDate[metadata.inverted] === undefined)) {
461
+ cell.attr('data-inverted', '');
462
+ }
463
+ if (eventDate[metadata.variation]) {
464
+ cell.attr('data-variation', eventDate[metadata.variation]);
465
+ }
466
+ }
467
+ }
468
+ }
469
+ var active = module.helper.dateEqual(cellDate, date, mode);
470
+ var isToday = module.helper.dateEqual(cellDate, today, mode);
471
+ cell.toggleClass(className.adjacentCell, adjacent && !eventDate);
472
+ cell.toggleClass(className.disabledCell, disabled);
473
+ cell.toggleClass(className.activeCell, active && !(adjacent && disabled));
474
+ if (!isHour && !isMinute) {
475
+ cell.toggleClass(className.todayCell, !adjacent && isToday);
476
+ }
477
+
478
+ // Allow for external modifications of each cell
479
+ var cellOptions = {
480
+ mode: mode,
481
+ adjacent: adjacent,
482
+ disabled: disabled,
483
+ active: active,
484
+ today: isToday,
485
+ };
486
+ formatter.cell(cell, cellDate, cellOptions);
487
+
488
+ if (module.helper.dateEqual(cellDate, focusDate, mode)) {
489
+ // ensure that the focus date is exactly equal to the cell date
490
+ // so that, if selected, the correct value is set
491
+ module.set.focusDate(cellDate, false, false);
492
+ }
493
+ }
494
+ }
495
+
496
+ if (settings.today) {
497
+ var todayRow = $('<tr/>').appendTo(tbody);
498
+ var todayButton = $('<td/>').attr('colspan', '' + columns).addClass(className.today).appendTo(todayRow);
499
+ todayButton.text(formatter.today(settings));
500
+ todayButton.data(metadata.date, today);
501
+ }
502
+
503
+ module.update.focus(false, table);
504
+
505
+ if (settings.inline) {
506
+ module.refreshTooltips();
507
+ }
508
+ }
509
+ },
510
+ },
511
+
512
+ update: {
513
+ focus: function (updateRange, container) {
514
+ container = container || $container;
515
+ var mode = module.get.mode();
516
+ var date = module.get.date();
517
+ var focusDate = module.get.focusDate();
518
+ var startDate = module.get.startDate();
519
+ var endDate = module.get.endDate();
520
+ var rangeDate = (updateRange ? focusDate : null) || date || (!isTouch ? focusDate : null);
521
+
522
+ container.find('td').each(function () {
523
+ var $cell = $(this);
524
+ var cellDate = $cell.data(metadata.date);
525
+ if (!cellDate) {
526
+ return;
527
+ }
528
+ var disabled = $cell.hasClass(className.disabledCell);
529
+ var active = $cell.hasClass(className.activeCell);
530
+ var adjacent = $cell.hasClass(className.adjacentCell);
531
+ var focused = module.helper.dateEqual(cellDate, focusDate, mode);
532
+ var inRange = !rangeDate
533
+ ? false
534
+ : (!!startDate && module.helper.isDateInRange(cellDate, mode, startDate, rangeDate))
535
+ || (!!endDate && module.helper.isDateInRange(cellDate, mode, rangeDate, endDate));
536
+ $cell.toggleClass(className.focusCell, focused && (!isTouch || isTouchDown) && (!adjacent || (settings.selectAdjacentDays && adjacent)) && !disabled);
537
+
538
+ if (module.helper.isTodayButton($cell)) {
539
+ return;
540
+ }
541
+ $cell.toggleClass(className.rangeCell, inRange && !active && !disabled);
542
+ });
543
+ },
544
+ },
545
+
546
+ refresh: function () {
547
+ module.create.calendar();
548
+ },
549
+
550
+ refreshTooltips: function () {
551
+ var winWidth = $(window).width();
552
+ $container.find('td[data-position]').each(function () {
553
+ var $cell = $(this);
554
+ var tooltipWidth = window.getComputedStyle($cell[0], '::after').width.replace(/[^\d.]/g, '');
555
+ var tooltipPosition = $cell.attr('data-position');
556
+ // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto")
557
+ var calcPosition = (winWidth - $cell.width() - (parseInt(tooltipWidth, 10) || 250)) > $cell.offset().left ? 'right' : 'left';
558
+ if (tooltipPosition.indexOf(calcPosition) === -1) {
559
+ $cell.attr('data-position', tooltipPosition.replace(/(left|right)/, calcPosition));
560
+ }
561
+ });
562
+ },
563
+
564
+ bind: {
565
+ events: function () {
566
+ module.debug('Binding events');
567
+ $container.on('mousedown' + eventNamespace, module.event.mousedown);
568
+ $container.on('touchstart' + eventNamespace, module.event.mousedown);
569
+ $container.on('mouseup' + eventNamespace, module.event.mouseup);
570
+ $container.on('touchend' + eventNamespace, module.event.mouseup);
571
+ $container.on('mouseover' + eventNamespace, module.event.mouseover);
572
+ if ($input.length > 0) {
573
+ $input.on('input' + eventNamespace, module.event.inputChange);
574
+ $input.on('focus' + eventNamespace, module.event.inputFocus);
575
+ $input.on('blur' + eventNamespace, module.event.inputBlur);
576
+ $input.on('keydown' + eventNamespace, module.event.keydown);
577
+ } else {
578
+ $container.on('keydown' + eventNamespace, module.event.keydown);
579
+ }
580
+ },
581
+ },
582
+
583
+ unbind: {
584
+ events: function () {
585
+ module.debug('Unbinding events');
586
+ $container.off(eventNamespace);
587
+ if ($input.length > 0) {
588
+ $input.off(eventNamespace);
589
+ }
590
+ },
591
+ },
592
+
593
+ event: {
594
+ mouseover: function (event) {
595
+ var target = $(event.target);
596
+ var date = target.data(metadata.date);
597
+ var mousedown = event.buttons === 1;
598
+ if (date) {
599
+ module.set.focusDate(date, false, true, mousedown);
600
+ }
601
+ },
602
+ mousedown: function (event) {
603
+ if ($input.length > 0) {
604
+ // prevent the mousedown on the calendar causing the input to lose focus
605
+ event.preventDefault();
606
+ }
607
+ isTouchDown = event.type.indexOf('touch') >= 0;
608
+ var target = $(event.target);
609
+ var date = target.data(metadata.date);
610
+ if (date) {
611
+ module.set.focusDate(date, false, true, true);
612
+ }
613
+ },
614
+ mouseup: function (event) {
615
+ // ensure input has focus so that it receives keydown events for calendar navigation
616
+ module.focus();
617
+ event.preventDefault();
618
+ event.stopPropagation();
619
+ isTouchDown = false;
620
+ var target = $(event.target);
621
+ if (target.hasClass('disabled')) {
622
+ return;
623
+ }
624
+ var parent = target.parent();
625
+ if (parent.data(metadata.date) || parent.data(metadata.focusDate) || parent.data(metadata.mode)) {
626
+ // clicked on a child element, switch to parent (used when clicking directly on prev/next <i> icon element)
627
+ target = parent;
628
+ }
629
+ var date = target.data(metadata.date);
630
+ var focusDate = target.data(metadata.focusDate);
631
+ var mode = target.data(metadata.mode);
632
+ if (date && settings.onSelect.call(element, date, module.get.mode()) !== false) {
633
+ var forceSet = target.hasClass(className.today);
634
+ module.selectDate(date, forceSet);
635
+ } else if (focusDate) {
636
+ module.set.focusDate(focusDate);
637
+ } else if (mode) {
638
+ module.set.mode(mode);
639
+ }
640
+ },
641
+ keydown: function (event) {
642
+ var keyCode = event.which;
643
+ if (keyCode === 9) {
644
+ // tab
645
+ module.popup('hide');
646
+ }
279
647
 
280
- for (p = 0; p < pages; p++) {
281
- if (pages > 1) {
282
- var pageColumn = $('<div/>').addClass(className.column).appendTo(pageGrid);
283
- container = pageColumn;
284
- }
285
-
286
- var month = startMonth + p;
287
- var firstMonthDayColumn = (new Date(year, month, 1).getDay() - settings.firstDayOfWeek % 7 + 7) % 7;
288
- if (!settings.constantHeight && isDay) {
289
- var requiredCells = new Date(year, month + 1, 0).getDate() + firstMonthDayColumn;
290
- rows = Math.ceil(requiredCells / 7);
291
- }
292
-
293
- var
294
- yearChange = isYear ? 10 : isMonth ? 1 : 0,
295
- monthChange = isDay ? 1 : 0,
296
- dayChange = isHour || isMinute ? 1 : 0,
297
- prevNextDay = isHour || isMinute ? day : 1,
298
- prevDate = new Date(year - yearChange, month - monthChange, prevNextDay - dayChange, hour),
299
- nextDate = new Date(year + yearChange, month + monthChange, prevNextDay + dayChange, hour),
300
- prevLast = isYear ? new Date(Math.ceil(year / 10) * 10 - 9, 0, 0) :
301
- isMonth ? new Date(year, 0, 0) : isDay ? new Date(year, month, 0) : new Date(year, month, day, -1),
302
- nextFirst = isYear ? new Date(Math.ceil(year / 10) * 10 + 1, 0, 1) :
303
- isMonth ? new Date(year + 1, 0, 1) : isDay ? new Date(year, month + 1, 1) : new Date(year, month, day + 1)
304
- ;
305
-
306
- var tempMode = mode;
307
- if (isDay && settings.showWeekNumbers){
308
- tempMode += ' andweek';
309
- }
310
- var table = $('<table/>').addClass(className.table).addClass(tempMode).addClass(numberText[columns] + ' column').appendTo(container);
311
- if(isInverted){
312
- table.addClass(className.inverted);
313
- }
314
- var textColumns = columns;
315
- //no header for time-only mode
316
- if (!isTimeOnly) {
317
- var thead = $('<thead/>').appendTo(table);
318
-
319
- row = $('<tr/>').appendTo(thead);
320
- cell = $('<th/>').attr('colspan', '' + columns).appendTo(row);
321
-
322
- var headerDate = isYear || isMonth ? new Date(year, 0, 1) :
323
- isDay ? new Date(year, month, 1) : new Date(year, month, day, hour, minute);
324
- var headerText = $('<span/>').addClass(className.link).appendTo(cell);
325
- headerText.text(module.helper.dateFormat(formatter[mode+'Header'], headerDate));
326
- var newMode = isMonth ? (settings.disableYear ? 'day' : 'year') :
327
- isDay ? (settings.disableMonth ? 'year' : 'month') : 'day';
328
- headerText.data(metadata.mode, newMode);
329
-
330
- if (p === 0) {
331
- var prev = $('<span/>').addClass(className.prev).appendTo(cell);
332
- prev.data(metadata.focusDate, prevDate);
333
- prev.toggleClass(className.disabledCell, !module.helper.isDateInRange(prevLast, mode));
334
- $('<i/>').addClass(className.prevIcon).appendTo(prev);
335
- }
648
+ if (module.popup('is visible')) {
649
+ var mode = module.get.mode();
650
+ switch (keyCode) {
651
+ // arrow keys
652
+ case 37:
653
+ case 38:
654
+ case 39:
655
+ case 40: {
656
+ var bigIncrement = mode === 'day'
657
+ ? 7
658
+ : (mode === 'hour'
659
+ ? 4
660
+ : (mode === 'minute' ? timeGap.column : 3)); // eslint-disable-line unicorn/no-nested-ternary
661
+ var increment = keyCode === 37
662
+ ? -1
663
+ : (keyCode === 38
664
+ ? -bigIncrement
665
+ : (keyCode === 39 ? 1 : bigIncrement)); // eslint-disable-line unicorn/no-nested-ternary
666
+ increment *= mode === 'minute' ? settings.minTimeGap : 1;
667
+ var focusDate = module.get.focusDate() || module.get.date() || new Date();
668
+ var year = focusDate.getFullYear() + (mode === 'year' ? increment : 0);
669
+ var month = focusDate.getMonth() + (mode === 'month' ? increment : 0);
670
+ var day = focusDate.getDate() + (mode === 'day' ? increment : 0);
671
+ var hour = focusDate.getHours() + (mode === 'hour' ? increment : 0);
672
+ var minute = focusDate.getMinutes() + (mode === 'minute' ? increment : 0);
673
+ var newFocusDate = new Date(year, month, day, hour, minute);
674
+ if (settings.type === 'time') {
675
+ newFocusDate = module.helper.mergeDateTime(focusDate, newFocusDate);
676
+ }
677
+ if (module.helper.isDateInRange(newFocusDate, mode)) {
678
+ module.set.focusDate(newFocusDate);
679
+ }
680
+
681
+ break;
682
+ }
683
+ // enter key
684
+ case 13: {
685
+ var date = module.get.focusDate();
686
+ if (date && !settings.isDisabled(date, mode) && !module.helper.isDisabled(date, mode) && module.helper.isEnabled(date, mode)) {
687
+ if (settings.onSelect.call(element, date, module.get.mode()) !== false) {
688
+ module.selectDate(date);
689
+ }
690
+ }
691
+ // disable form submission:
692
+ event.preventDefault();
693
+ event.stopPropagation();
694
+
695
+ break;
696
+ }
697
+ // escape key
698
+ case 27: {
699
+ module.popup('hide');
700
+ event.stopPropagation();
701
+
702
+ break;
703
+ }
704
+ }
705
+ }
336
706
 
337
- if (p === pages - 1) {
338
- var next = $('<span/>').addClass(className.next).appendTo(cell);
339
- next.data(metadata.focusDate, nextDate);
340
- next.toggleClass(className.disabledCell, !module.helper.isDateInRange(nextFirst, mode));
341
- $('<i/>').addClass(className.nextIcon).appendTo(next);
342
- }
343
- if (isDay) {
344
- row = $('<tr/>').appendTo(thead);
345
- if(settings.showWeekNumbers) {
346
- cell = $('<th/>').appendTo(row);
347
- cell.text(settings.text.weekNo);
348
- cell.addClass(className.weekCell);
349
- textColumns--;
350
- }
351
- for (i = 0; i < textColumns; i++) {
352
- cell = $('<th/>').appendTo(row);
353
- cell.text(formatter.dayColumnHeader((i + settings.firstDayOfWeek) % 7, settings));
354
- }
355
- }
356
- }
357
-
358
- var tbody = $('<tbody/>').appendTo(table);
359
- i = isYear ? Math.ceil(year / 10) * 10 - 9 : isDay ? 1 - firstMonthDayColumn : 0;
360
- for (r = 0; r < rows; r++) {
361
- row = $('<tr/>').appendTo(tbody);
362
- if(isDay && settings.showWeekNumbers){
363
- cell = $('<th/>').appendTo(row);
364
- cell.text(module.get.weekOfYear(year,month,i+1-settings.firstDayOfWeek));
365
- cell.addClass(className.weekCell);
366
- }
367
- for (c = 0; c < textColumns; c++, i++) {
368
- var cellDate = isYear ? new Date(i, month, 1, hour, minute) :
369
- isMonth ? new Date(year, i, 1, hour, minute) : isDay ? new Date(year, month, i, hour, minute) :
370
- isHour ? new Date(year, month, day, i) : new Date(year, month, day, hour, i * settings.minTimeGap);
371
- var cellText = isYear ? i :
372
- isMonth ? settings.text.monthsShort[i] : isDay ? cellDate.getDate() :
373
- module.helper.dateFormat(formatter.cellTime,cellDate);
374
- cell = $('<td/>').addClass(className.cell).appendTo(row);
375
- cell.text(cellText);
376
- cell.data(metadata.date, cellDate);
377
- var adjacent = isDay && cellDate.getMonth() !== ((month + 12) % 12);
378
- var disabled = (!settings.selectAdjacentDays && adjacent) || !module.helper.isDateInRange(cellDate, mode) || settings.isDisabled(cellDate, mode) || module.helper.isDisabled(cellDate, mode) || !module.helper.isEnabled(cellDate, mode);
379
- var eventDate;
380
- if (disabled) {
381
- var disabledDate = module.helper.findDayAsObject(cellDate, mode, settings.disabledDates);
382
- if (disabledDate !== null && disabledDate[metadata.message]) {
383
- cell.attr("data-tooltip", disabledDate[metadata.message]);
384
- cell.attr("data-position", disabledDate[metadata.position] || tooltipPosition);
385
- if(disabledDate[metadata.inverted] || (isInverted && disabledDate[metadata.inverted] === undefined)) {
386
- cell.attr("data-inverted", '');
387
- }
388
- if(disabledDate[metadata.variation]) {
389
- cell.attr("data-variation", disabledDate[metadata.variation]);
390
- }
391
- }
392
- if (mode === 'hour') {
393
- var disabledHour = module.helper.findHourAsObject(cellDate, mode, settings.disabledHours);
394
- if (disabledHour !== null && disabledHour[metadata.message]) {
395
- cell.attr("data-tooltip", disabledHour[metadata.message]);
396
- cell.attr("data-position", disabledHour[metadata.position] || tooltipPosition);
397
- if(disabledHour[metadata.inverted] || (isInverted && disabledHour[metadata.inverted] === undefined)) {
398
- cell.attr("data-inverted", '');
399
- }
400
- if(disabledHour[metadata.variation]) {
401
- cell.attr("data-variation", disabledHour[metadata.variation]);
402
- }
403
- }
404
- }
405
- } else {
406
- eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates);
407
- if (eventDate !== null) {
408
- cell.addClass(eventDate[metadata.class] || settings.eventClass);
409
- if (eventDate[metadata.message]) {
410
- cell.attr("data-tooltip", eventDate[metadata.message]);
411
- cell.attr("data-position", eventDate[metadata.position] || tooltipPosition);
412
- if(eventDate[metadata.inverted] || (isInverted && eventDate[metadata.inverted] === undefined)) {
413
- cell.attr("data-inverted", '');
414
- }
415
- if(eventDate[metadata.variation]) {
416
- cell.attr("data-variation", eventDate[metadata.variation]);
417
- }
418
- }
707
+ if (keyCode === 38 || keyCode === 40) {
708
+ // arrow-up || arrow-down
709
+ event.preventDefault(); // don't scroll
710
+ module.popup('show');
711
+ }
712
+ },
713
+ inputChange: function () {
714
+ var val = $input.val();
715
+ var date = parser.date(val, settings);
716
+ module.set.date(date, false);
717
+ },
718
+ inputFocus: function () {
719
+ $container.addClass(className.active);
720
+ },
721
+ inputBlur: function () {
722
+ $container.removeClass(className.active);
723
+ if (settings.formatInput) {
724
+ var date = module.get.date();
725
+ var text = module.helper.dateFormat(formatter[settings.type], date);
726
+ $input.val(text);
727
+ }
728
+ if (selectionComplete) {
729
+ module.trigger.change();
730
+ selectionComplete = false;
731
+ }
732
+ },
733
+ class: {
734
+ mutation: function (mutations) {
735
+ mutations.forEach(function (mutation) {
736
+ if (mutation.attributeName === 'class') {
737
+ module.check.disabled();
738
+ }
739
+ });
740
+ },
741
+ },
742
+ },
743
+
744
+ observeChanges: function () {
745
+ if ('MutationObserver' in window) {
746
+ classObserver = new MutationObserver(module.event.class.mutation);
747
+ module.debug('Setting up mutation observer', classObserver);
748
+ module.observe.class();
419
749
  }
420
- }
421
- var active = module.helper.dateEqual(cellDate, date, mode);
422
- var isToday = module.helper.dateEqual(cellDate, today, mode);
423
- cell.toggleClass(className.adjacentCell, adjacent && !eventDate);
424
- cell.toggleClass(className.disabledCell, disabled);
425
- cell.toggleClass(className.activeCell, active && !(adjacent && disabled));
426
- if (!isHour && !isMinute) {
427
- cell.toggleClass(className.todayCell, !adjacent && isToday);
428
- }
429
-
430
- // Allow for external modifications of each cell
431
- var cellOptions = {
432
- mode: mode,
433
- adjacent: adjacent,
434
- disabled: disabled,
435
- active: active,
436
- today: isToday
437
- };
438
- formatter.cell(cell, cellDate, cellOptions);
439
-
440
- if (module.helper.dateEqual(cellDate, focusDate, mode)) {
441
- //ensure that the focus date is exactly equal to the cell date
442
- //so that, if selected, the correct value is set
443
- module.set.focusDate(cellDate, false, false);
444
- }
445
- }
446
- }
750
+ },
447
751
 
448
- if (settings.today) {
449
- var todayRow = $('<tr/>').appendTo(tbody);
450
- var todayButton = $('<td/>').attr('colspan', '' + columns).addClass(className.today).appendTo(todayRow);
451
- todayButton.text(formatter.today(settings));
452
- todayButton.data(metadata.date, today);
453
- }
752
+ disconnect: {
753
+ classObserver: function () {
754
+ if ($input.length > 0 && classObserver) {
755
+ classObserver.disconnect();
756
+ }
757
+ },
758
+ },
759
+
760
+ observe: {
761
+ class: function () {
762
+ if ($input.length > 0 && classObserver) {
763
+ classObserver.observe($module[0], {
764
+ attributes: true,
765
+ });
766
+ }
767
+ },
768
+ },
769
+
770
+ is: {
771
+ disabled: function () {
772
+ return $module.hasClass(className.disabled);
773
+ },
774
+ },
775
+
776
+ check: {
777
+ disabled: function () {
778
+ $input.attr('tabindex', module.is.disabled() ? -1 : 0);
779
+ },
780
+ },
781
+
782
+ get: {
783
+ weekOfYear: function (weekYear, weekMonth, weekDay) {
784
+ // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm
785
+ var ms1d = 24 * 3600 * 1000,
786
+ ms7d = 7 * ms1d,
787
+ DC3 = Date.UTC(weekYear, weekMonth, weekDay + 3) / ms1d, // an absolute day number
788
+ AWN = Math.floor(DC3 / 7), // an absolute week number
789
+ Wyr = new Date(AWN * ms7d).getUTCFullYear()
790
+ ;
791
+
792
+ return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
793
+ },
794
+ formattedDate: function (format, date) {
795
+ return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date());
796
+ },
797
+ date: function () {
798
+ return module.helper.sanitiseDate($module.data(metadata.date)) || null;
799
+ },
800
+ inputDate: function () {
801
+ return $input.val();
802
+ },
803
+ focusDate: function () {
804
+ return $module.data(metadata.focusDate) || null;
805
+ },
806
+ startDate: function () {
807
+ var startModule = module.get.calendarModule(settings.startCalendar);
808
+
809
+ return (startModule ? startModule.get.date() : $module.data(metadata.startDate)) || null;
810
+ },
811
+ endDate: function () {
812
+ var endModule = module.get.calendarModule(settings.endCalendar);
813
+
814
+ return (endModule ? endModule.get.date() : $module.data(metadata.endDate)) || null;
815
+ },
816
+ minDate: function () {
817
+ return $module.data(metadata.minDate) || null;
818
+ },
819
+ maxDate: function () {
820
+ return $module.data(metadata.maxDate) || null;
821
+ },
822
+ monthOffset: function () {
823
+ return $module.data(metadata.monthOffset) || settings.monthOffset || 0;
824
+ },
825
+ mode: function () {
826
+ // only returns valid modes for the current settings
827
+ var mode = $module.data(metadata.mode) || settings.startMode;
828
+
829
+ return module.get.validatedMode(mode);
830
+ },
831
+ validatedMode: function (mode) {
832
+ var validModes = module.get.validModes();
833
+ if ($.inArray(mode, validModes) >= 0) {
834
+ return mode;
835
+ }
454
836
 
455
- module.update.focus(false, table);
837
+ return settings.type === 'time'
838
+ ? 'hour'
839
+ : (settings.type === 'month'
840
+ ? 'month'
841
+ : (settings.type === 'year' ? 'year' : 'day')); // eslint-disable-line unicorn/no-nested-ternary
842
+ },
843
+ type: function () {
844
+ return $module.data(metadata.type) || settings.type;
845
+ },
846
+ validModes: function () {
847
+ var validModes = [];
848
+ if (settings.type !== 'time') {
849
+ if (!settings.disableYear || settings.type === 'year') {
850
+ validModes.push('year');
851
+ }
852
+ if (!(settings.disableMonth || settings.type === 'year') || settings.type === 'month') {
853
+ validModes.push('month');
854
+ }
855
+ if (settings.type.indexOf('date') >= 0) {
856
+ validModes.push('day');
857
+ }
858
+ }
859
+ if (settings.type.indexOf('time') >= 0) {
860
+ validModes.push('hour');
861
+ if (!settings.disableMinute) {
862
+ validModes.push('minute');
863
+ }
864
+ }
456
865
 
457
- if(settings.inline){
458
- module.refreshTooltips();
459
- }
460
- }
461
- }
462
- },
866
+ return validModes;
867
+ },
868
+ isTouch: function () {
869
+ try {
870
+ document.createEvent('TouchEvent');
463
871
 
464
- update: {
465
- focus: function (updateRange, container) {
466
- container = container || $container;
467
- var mode = module.get.mode();
468
- var date = module.get.date();
469
- var focusDate = module.get.focusDate();
470
- var startDate = module.get.startDate();
471
- var endDate = module.get.endDate();
472
- var rangeDate = (updateRange ? focusDate : null) || date || (!isTouch ? focusDate : null);
473
-
474
- container.find('td').each(function () {
475
- var cell = $(this);
476
- var cellDate = cell.data(metadata.date);
477
- if (!cellDate) {
478
- return;
479
- }
480
- var disabled = cell.hasClass(className.disabledCell);
481
- var active = cell.hasClass(className.activeCell);
482
- var adjacent = cell.hasClass(className.adjacentCell);
483
- var focused = module.helper.dateEqual(cellDate, focusDate, mode);
484
- var inRange = !rangeDate ? false :
485
- ((!!startDate && module.helper.isDateInRange(cellDate, mode, startDate, rangeDate)) ||
486
- (!!endDate && module.helper.isDateInRange(cellDate, mode, rangeDate, endDate)));
487
- cell.toggleClass(className.focusCell, focused && (!isTouch || isTouchDown) && (!adjacent || (settings.selectAdjacentDays && adjacent)) && !disabled);
488
-
489
- if (module.helper.isTodayButton(cell)) {
490
- return;
491
- }
492
- cell.toggleClass(className.rangeCell, inRange && !active && !disabled);
493
- });
494
- }
495
- },
872
+ return true;
873
+ } catch (e) {
874
+ return false;
875
+ }
876
+ },
877
+ calendarModule: function (selector) {
878
+ if (!selector) {
879
+ return null;
880
+ }
881
+ if (!(selector instanceof $)) {
882
+ selector = $document.find(selector).first();
883
+ }
496
884
 
497
- refresh: function () {
498
- module.create.calendar();
499
- },
885
+ // assume range related calendars are using the same namespace
886
+ return selector.data(moduleNamespace);
887
+ },
888
+ },
500
889
 
501
- refreshTooltips: function() {
502
- var winWidth = $(window).width();
503
- $container.find('td[data-position]').each(function () {
504
- var cell = $(this);
505
- var tooltipWidth = window.getComputedStyle(cell[0], '::after').width.replace(/[^0-9\.]/g,'');
506
- var tooltipPosition = cell.attr('data-position');
507
- // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto")
508
- var calcPosition = (winWidth - cell.width() - (parseInt(tooltipWidth,10) || 250)) > cell.offset().left ? 'right' : 'left';
509
- if(tooltipPosition.indexOf(calcPosition) === -1) {
510
- cell.attr('data-position',tooltipPosition.replace(/(left|right)/,calcPosition));
511
- }
512
- });
513
- },
890
+ set: {
891
+ date: function (date, updateInput, fireChange) {
892
+ updateInput = updateInput !== false;
893
+ fireChange = fireChange !== false;
894
+ date = module.helper.sanitiseDate(date);
895
+ date = module.helper.dateInRange(date);
514
896
 
515
- bind: {
516
- events: function () {
517
- module.debug('Binding events');
518
- $container.on('mousedown' + eventNamespace, module.event.mousedown);
519
- $container.on('touchstart' + eventNamespace, module.event.mousedown);
520
- $container.on('mouseup' + eventNamespace, module.event.mouseup);
521
- $container.on('touchend' + eventNamespace, module.event.mouseup);
522
- $container.on('mouseover' + eventNamespace, module.event.mouseover);
523
- if ($input.length) {
524
- $input.on('input' + eventNamespace, module.event.inputChange);
525
- $input.on('focus' + eventNamespace, module.event.inputFocus);
526
- $input.on('blur' + eventNamespace, module.event.inputBlur);
527
- $input.on('keydown' + eventNamespace, module.event.keydown);
528
- } else {
529
- $container.on('keydown' + eventNamespace, module.event.keydown);
530
- }
531
- }
532
- },
897
+ var mode = module.get.mode();
898
+ var text = module.helper.dateFormat(formatter[settings.type], date);
533
899
 
534
- unbind: {
535
- events: function () {
536
- module.debug('Unbinding events');
537
- $container.off(eventNamespace);
538
- if ($input.length) {
539
- $input.off(eventNamespace);
540
- }
541
- }
542
- },
900
+ if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {
901
+ return false;
902
+ }
543
903
 
544
- event: {
545
- mouseover: function (event) {
546
- var target = $(event.target);
547
- var date = target.data(metadata.date);
548
- var mousedown = event.buttons === 1;
549
- if (date) {
550
- module.set.focusDate(date, false, true, mousedown);
551
- }
552
- },
553
- mousedown: function (event) {
554
- if ($input.length) {
555
- //prevent the mousedown on the calendar causing the input to lose focus
556
- event.preventDefault();
557
- }
558
- isTouchDown = event.type.indexOf('touch') >= 0;
559
- var target = $(event.target);
560
- var date = target.data(metadata.date);
561
- if (date) {
562
- module.set.focusDate(date, false, true, true);
563
- }
564
- },
565
- mouseup: function (event) {
566
- //ensure input has focus so that it receives keydown events for calendar navigation
567
- module.focus();
568
- event.preventDefault();
569
- event.stopPropagation();
570
- isTouchDown = false;
571
- var target = $(event.target);
572
- if (target.hasClass("disabled")) {
573
- return;
574
- }
575
- var parent = target.parent();
576
- if (parent.data(metadata.date) || parent.data(metadata.focusDate) || parent.data(metadata.mode)) {
577
- //clicked on a child element, switch to parent (used when clicking directly on prev/next <i> icon element)
578
- target = parent;
579
- }
580
- var date = target.data(metadata.date);
581
- var focusDate = target.data(metadata.focusDate);
582
- var mode = target.data(metadata.mode);
583
- if (date && settings.onSelect.call(element, date, module.get.mode()) !== false) {
584
- var forceSet = target.hasClass(className.today);
585
- module.selectDate(date, forceSet);
586
- }
587
- else if (focusDate) {
588
- module.set.focusDate(focusDate);
589
- }
590
- else if (mode) {
591
- module.set.mode(mode);
592
- }
593
- },
594
- keydown: function (event) {
595
- var keyCode = event.which;
596
- if (keyCode === 9) {
597
- //tab
598
- module.popup('hide');
599
- }
904
+ module.set.focusDate(date);
600
905
 
601
- if (module.popup('is visible')) {
602
- var mode = module.get.mode();
603
- if (keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
604
- //arrow keys
605
- var bigIncrement = mode === 'day' ? 7 : mode === 'hour' ? 4 : mode === 'minute' ? timeGap['column'] : 3;
606
- var increment = keyCode === 37 ? -1 : keyCode === 38 ? -bigIncrement : keyCode == 39 ? 1 : bigIncrement;
607
- increment *= mode === 'minute' ? settings.minTimeGap : 1;
608
- var focusDate = module.get.focusDate() || module.get.date() || new Date();
609
- var year = focusDate.getFullYear() + (mode === 'year' ? increment : 0);
610
- var month = focusDate.getMonth() + (mode === 'month' ? increment : 0);
611
- var day = focusDate.getDate() + (mode === 'day' ? increment : 0);
612
- var hour = focusDate.getHours() + (mode === 'hour' ? increment : 0);
613
- var minute = focusDate.getMinutes() + (mode === 'minute' ? increment : 0);
614
- var newFocusDate = new Date(year, month, day, hour, minute);
615
- if (settings.type === 'time') {
616
- newFocusDate = module.helper.mergeDateTime(focusDate, newFocusDate);
617
- }
618
- if (module.helper.isDateInRange(newFocusDate, mode)) {
619
- module.set.focusDate(newFocusDate);
620
- }
621
- } else if (keyCode === 13) {
622
- //enter
623
- var date = module.get.focusDate();
624
- if (date && !settings.isDisabled(date, mode) && !module.helper.isDisabled(date, mode) && module.helper.isEnabled(date, mode)) {
625
- if (settings.onSelect.call(element, date, module.get.mode()) !== false) {
626
- module.selectDate(date);
627
- }
628
- }
629
- //disable form submission:
630
- event.preventDefault();
631
- event.stopPropagation();
632
- } else if (keyCode === 27) {
633
- module.popup('hide');
634
- event.stopPropagation();
635
- }
636
- }
906
+ if (settings.isDisabled(date, mode)) {
907
+ return false;
908
+ }
637
909
 
638
- if (keyCode === 38 || keyCode === 40) {
639
- //arrow-up || arrow-down
640
- event.preventDefault(); //don't scroll
641
- module.popup('show');
642
- }
643
- },
644
- inputChange: function () {
645
- var val = $input.val();
646
- var date = parser.date(val, settings);
647
- module.set.date(date, false);
648
- },
649
- inputFocus: function () {
650
- $container.addClass(className.active);
651
- },
652
- inputBlur: function () {
653
- $container.removeClass(className.active);
654
- if (settings.formatInput) {
655
- var date = module.get.date();
656
- var text = module.helper.dateFormat(formatter[settings.type], date);
657
- $input.val(text);
658
- }
659
- if(selectionComplete){
660
- module.trigger.change();
661
- selectionComplete = false;
662
- }
663
- },
664
- class: {
665
- mutation: function(mutations) {
666
- mutations.forEach(function(mutation) {
667
- if(mutation.attributeName === "class") {
668
- module.check.disabled();
669
- }
670
- });
671
- }
672
- }
673
- },
910
+ var endDate = module.get.endDate();
911
+ if (!!endDate && !!date && date > endDate) {
912
+ // selected date is greater than end date in range, so clear end date
913
+ module.set.endDate();
914
+ }
915
+ module.set.dataKeyValue(metadata.date, date);
674
916
 
675
- observeChanges: function() {
676
- if('MutationObserver' in window) {
677
- classObserver = new MutationObserver(module.event.class.mutation);
678
- module.debug('Setting up mutation observer', classObserver);
679
- module.observe.class();
680
- }
681
- },
917
+ if (updateInput && $input.length > 0) {
918
+ $input.val(text);
919
+ }
682
920
 
683
- disconnect: {
684
- classObserver: function() {
685
- if($input.length && classObserver) {
686
- classObserver.disconnect();
687
- }
688
- }
689
- },
921
+ if (fireChange) {
922
+ settings.onChange.call(element, date, text, mode);
923
+ }
924
+ },
925
+ startDate: function (date, refreshCalendar) {
926
+ date = module.helper.sanitiseDate(date);
927
+ var startModule = module.get.calendarModule(settings.startCalendar);
928
+ if (startModule) {
929
+ startModule.set.date(date);
930
+ }
931
+ module.set.dataKeyValue(metadata.startDate, date, refreshCalendar);
932
+ },
933
+ endDate: function (date, refreshCalendar) {
934
+ date = module.helper.sanitiseDate(date);
935
+ var endModule = module.get.calendarModule(settings.endCalendar);
936
+ if (endModule) {
937
+ endModule.set.date(date);
938
+ }
939
+ module.set.dataKeyValue(metadata.endDate, date, refreshCalendar);
940
+ },
941
+ focusDate: function (date, refreshCalendar, updateFocus, updateRange) {
942
+ date = module.helper.sanitiseDate(date);
943
+ date = module.helper.dateInRange(date);
944
+ var isDay = module.get.mode() === 'day';
945
+ var oldFocusDate = module.get.focusDate();
946
+ if (isDay && date && oldFocusDate) {
947
+ var yearDelta = date.getFullYear() - oldFocusDate.getFullYear();
948
+ var monthDelta = yearDelta * 12 + date.getMonth() - oldFocusDate.getMonth();
949
+ if (monthDelta) {
950
+ var monthOffset = module.get.monthOffset() - monthDelta;
951
+ module.set.monthOffset(monthOffset, false);
952
+ }
953
+ }
954
+ var changed = module.set.dataKeyValue(metadata.focusDate, date, !!date && refreshCalendar);
955
+ updateFocus = (updateFocus !== false && changed && refreshCalendar === false) || focusDateUsedForRange != updateRange;
956
+ focusDateUsedForRange = updateRange;
957
+ if (updateFocus) {
958
+ module.update.focus(updateRange);
959
+ }
960
+ },
961
+ minDate: function (date) {
962
+ date = module.helper.sanitiseDate(date);
963
+ if (settings.maxDate !== null && settings.maxDate <= date) {
964
+ module.verbose('Unable to set minDate variable bigger that maxDate variable', date, settings.maxDate);
965
+ } else {
966
+ module.setting('minDate', date);
967
+ module.set.dataKeyValue(metadata.minDate, date);
968
+ }
969
+ },
970
+ maxDate: function (date) {
971
+ date = module.helper.sanitiseDate(date);
972
+ if (settings.minDate !== null && settings.minDate >= date) {
973
+ module.verbose('Unable to set maxDate variable lower that minDate variable', date, settings.minDate);
974
+ } else {
975
+ module.setting('maxDate', date);
976
+ module.set.dataKeyValue(metadata.maxDate, date);
977
+ }
978
+ },
979
+ monthOffset: function (monthOffset, refreshCalendar) {
980
+ var multiMonth = Math.max(settings.multiMonth, 1);
981
+ monthOffset = Math.max(1 - multiMonth, Math.min(0, monthOffset));
982
+ module.set.dataKeyValue(metadata.monthOffset, monthOffset, refreshCalendar);
983
+ },
984
+ mode: function (mode, refreshCalendar) {
985
+ module.set.dataKeyValue(metadata.mode, mode, refreshCalendar);
986
+ },
987
+ dataKeyValue: function (key, value, refreshCalendar) {
988
+ var oldValue = $module.data(key);
989
+ var equal = oldValue === value || (oldValue <= value && oldValue >= value); // equality test for dates and string objects
990
+ if (value) {
991
+ $module.data(key, value);
992
+ } else {
993
+ $module.removeData(key);
994
+ }
995
+ refreshCalendar = refreshCalendar !== false && !equal;
996
+ if (refreshCalendar) {
997
+ module.refresh();
998
+ }
690
999
 
691
- observe: {
692
- class: function() {
693
- if($input.length && classObserver) {
694
- classObserver.observe($module[0], {
695
- attributes : true
696
- });
697
- }
698
- }
699
- },
1000
+ return !equal;
1001
+ },
1002
+ },
1003
+
1004
+ selectDate: function (date, forceSet) {
1005
+ module.verbose('New date selection', date);
1006
+ var mode = module.get.mode();
1007
+ var complete = forceSet || mode === 'minute'
1008
+ || (settings.disableMinute && mode === 'hour')
1009
+ || (settings.type === 'date' && mode === 'day')
1010
+ || (settings.type === 'month' && mode === 'month')
1011
+ || (settings.type === 'year' && mode === 'year');
1012
+ if (complete) {
1013
+ var canceled = module.set.date(date) === false;
1014
+ if (!canceled) {
1015
+ selectionComplete = true;
1016
+ if (settings.closable) {
1017
+ module.popup('hide');
1018
+ // if this is a range calendar, focus the container or input. This will open the popup from its event listeners.
1019
+ var endModule = module.get.calendarModule(settings.endCalendar);
1020
+ if (endModule) {
1021
+ endModule.refresh();
1022
+ if (endModule.setting('on') !== 'focus') {
1023
+ endModule.popup('show');
1024
+ }
1025
+ endModule.focus();
1026
+ }
1027
+ }
1028
+ }
1029
+ } else {
1030
+ var newMode = mode === 'year'
1031
+ ? (!settings.disableMonth ? 'month' : 'day')
1032
+ : (mode === 'month'
1033
+ ? 'day'
1034
+ : (mode === 'day' ? 'hour' : 'minute')); // eslint-disable-line unicorn/no-nested-ternary
1035
+ module.set.mode(newMode);
1036
+ if (mode === 'hour' || (mode === 'day' && module.get.date())) {
1037
+ // the user has chosen enough to consider a valid date/time has been chosen
1038
+ module.set.date(date, true, false);
1039
+ } else {
1040
+ module.set.focusDate(date);
1041
+ }
1042
+ }
1043
+ },
700
1044
 
701
- is: {
702
- disabled: function() {
703
- return $module.hasClass(className.disabled);
704
- }
705
- },
1045
+ changeDate: function (date) {
1046
+ module.set.date(date);
1047
+ },
706
1048
 
707
- check: {
708
- disabled: function(){
709
- $input.attr('tabindex',module.is.disabled() ? -1 : 0);
710
- }
711
- },
1049
+ clear: function () {
1050
+ module.set.date();
1051
+ },
712
1052
 
713
- get: {
714
- weekOfYear: function(weekYear,weekMonth,weekDay) {
715
- // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm
716
- var ms1d = 864e5, // milliseconds in a day
717
- ms7d = 7 * ms1d; // milliseconds in a week
718
-
719
- return function() { // return a closure so constants get calculated only once
720
- var DC3 = Date.UTC(weekYear, weekMonth, weekDay + 3) / ms1d, // an Absolute Day Number
721
- AWN = Math.floor(DC3 / 7), // an Absolute Week Number
722
- Wyr = new Date(AWN * ms7d).getUTCFullYear();
723
-
724
- return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
725
- }();
726
- },
727
- formattedDate: function(format, date) {
728
- return module.helper.dateFormat(format || formatter[settings.type], date || module.get.date());
729
- },
730
- date: function () {
731
- return module.helper.sanitiseDate($module.data(metadata.date)) || null;
732
- },
733
- inputDate: function() {
734
- return $input.val();
735
- },
736
- focusDate: function () {
737
- return $module.data(metadata.focusDate) || null;
738
- },
739
- startDate: function () {
740
- var startModule = module.get.calendarModule(settings.startCalendar);
741
- return (startModule ? startModule.get.date() : $module.data(metadata.startDate)) || null;
742
- },
743
- endDate: function () {
744
- var endModule = module.get.calendarModule(settings.endCalendar);
745
- return (endModule ? endModule.get.date() : $module.data(metadata.endDate)) || null;
746
- },
747
- minDate: function() {
748
- return $module.data(metadata.minDate) || null;
749
- },
750
- maxDate: function() {
751
- return $module.data(metadata.maxDate) || null;
752
- },
753
- monthOffset: function () {
754
- return $module.data(metadata.monthOffset) || settings.monthOffset || 0;
755
- },
756
- mode: function () {
757
- //only returns valid modes for the current settings
758
- var mode = $module.data(metadata.mode) || settings.startMode;
759
- return module.get.validatedMode(mode);
760
- },
761
- validatedMode: function(mode){
762
- var validModes = module.get.validModes();
763
- if ($.inArray(mode, validModes) >= 0) {
764
- return mode;
765
- }
766
- return settings.type === 'time' ? 'hour' :
767
- settings.type === 'month' ? 'month' :
768
- settings.type === 'year' ? 'year' : 'day';
769
- },
770
- type: function() {
771
- return $module.data(metadata.type) || settings.type;
772
- },
773
- validModes: function () {
774
- var validModes = [];
775
- if (settings.type !== 'time') {
776
- if (!settings.disableYear || settings.type === 'year') {
777
- validModes.push('year');
778
- }
779
- if (!(settings.disableMonth || settings.type === 'year') || settings.type === 'month') {
780
- validModes.push('month');
781
- }
782
- if (settings.type.indexOf('date') >= 0) {
783
- validModes.push('day');
784
- }
785
- }
786
- if (settings.type.indexOf('time') >= 0) {
787
- validModes.push('hour');
788
- if (!settings.disableMinute) {
789
- validModes.push('minute');
790
- }
791
- }
792
- return validModes;
793
- },
794
- isTouch: function () {
795
- try {
796
- document.createEvent('TouchEvent');
797
- return true;
798
- }
799
- catch (e) {
800
- return false;
801
- }
802
- },
803
- calendarModule: function (selector) {
804
- if (!selector) {
805
- return null;
806
- }
807
- if (!(selector instanceof $)) {
808
- selector = $(document).find(selector).first();
809
- }
810
- //assume range related calendars are using the same namespace
811
- return selector.data(moduleNamespace);
812
- }
813
- },
1053
+ popup: function () {
1054
+ return $activator.popup.apply($activator, arguments);
1055
+ },
814
1056
 
815
- set: {
816
- date: function (date, updateInput, fireChange) {
817
- updateInput = updateInput !== false;
818
- fireChange = fireChange !== false;
819
- date = module.helper.sanitiseDate(date);
820
- date = module.helper.dateInRange(date);
1057
+ focus: function () {
1058
+ if ($input.length > 0) {
1059
+ $input.trigger('focus');
1060
+ } else {
1061
+ $container.trigger('focus');
1062
+ }
1063
+ },
1064
+ blur: function () {
1065
+ if ($input.length > 0) {
1066
+ $input.trigger('blur');
1067
+ } else {
1068
+ $container.trigger('blur');
1069
+ }
1070
+ },
821
1071
 
822
- var mode = module.get.mode();
823
- var text = module.helper.dateFormat(formatter[settings.type],date);
1072
+ helper: {
1073
+ dateFormat: function (format, date) {
1074
+ if (!(date instanceof Date)) {
1075
+ return '';
1076
+ }
1077
+ if (typeof format === 'function') {
1078
+ return format.call(module, date, settings);
1079
+ }
824
1080
 
825
- if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {
826
- return false;
827
- }
1081
+ var
1082
+ D = date.getDate(),
1083
+ M = date.getMonth(),
1084
+ Y = date.getFullYear(),
1085
+ d = date.getDay(),
1086
+ H = date.getHours(),
1087
+ m = date.getMinutes(),
1088
+ s = date.getSeconds(),
1089
+ w = module.get.weekOfYear(Y, M, D + 1 - settings.firstDayOfWeek),
1090
+ h = H % 12 || 12,
1091
+ a = H < 12 ? settings.text.am.toLowerCase() : settings.text.pm.toLowerCase(),
1092
+ tokens = {
1093
+ D: D,
1094
+ DD: ('0' + D).slice(-2),
1095
+ M: M + 1,
1096
+ MM: ('0' + (M + 1)).slice(-2),
1097
+ MMM: settings.text.monthsShort[M],
1098
+ MMMM: settings.text.months[M],
1099
+ Y: Y,
1100
+ YY: String(Y).slice(2),
1101
+ YYYY: Y,
1102
+ d: d,
1103
+ dd: settings.text.dayNamesShort[d].slice(0, 2),
1104
+ ddd: settings.text.dayNamesShort[d],
1105
+ dddd: settings.text.dayNames[d],
1106
+ h: h,
1107
+ hh: ('0' + h).slice(-2),
1108
+ H: H,
1109
+ HH: ('0' + H).slice(-2),
1110
+ m: m,
1111
+ mm: ('0' + m).slice(-2),
1112
+ s: s,
1113
+ ss: ('0' + s).slice(-2),
1114
+ a: a,
1115
+ A: a.toUpperCase(),
1116
+ S: ['th', 'st', 'nd', 'rd'][(D % 10) > 3 ? 0 : ((D % 100) - (D % 10) === 10 ? 0 : D % 10)],
1117
+ w: w,
1118
+ ww: ('0' + w).slice(-2),
1119
+ }
1120
+ ;
1121
+
1122
+ return format.replace(settings.regExp.token, function (match) {
1123
+ if (match in tokens) {
1124
+ return tokens[match];
1125
+ }
1126
+
1127
+ return match.slice(1, -1);
1128
+ });
1129
+ },
1130
+ isDisabled: function (date, mode) {
1131
+ return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function (d) {
1132
+ var blocked = false;
1133
+
1134
+ if (typeof d === 'string') {
1135
+ d = module.helper.sanitiseDate(d);
1136
+ }
1137
+ if (d instanceof Date) {
1138
+ blocked = module.helper.dateEqual(date, d, mode);
1139
+ } else if (d !== null && typeof d === 'object') {
1140
+ if (d[metadata.year]) {
1141
+ if (typeof d[metadata.year] === 'number') {
1142
+ blocked = date.getFullYear() === d[metadata.year];
1143
+ } else if (Array.isArray(d[metadata.year])) {
1144
+ blocked = d[metadata.year].indexOf(date.getFullYear()) > -1;
1145
+ }
1146
+ } else if (d[metadata.month]) {
1147
+ if (typeof d[metadata.month] === 'number') {
1148
+ blocked = date.getMonth() === d[metadata.month];
1149
+ } else if (Array.isArray(d[metadata.month])) {
1150
+ blocked = d[metadata.month].indexOf(date.getMonth()) > -1;
1151
+ } else if (d[metadata.month] instanceof Date) {
1152
+ var sdate = module.helper.sanitiseDate(d[metadata.month]);
1153
+
1154
+ blocked = (date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear());
1155
+ }
1156
+ } else if (d[metadata.date] && mode === 'day') {
1157
+ if (d[metadata.date] instanceof Date) {
1158
+ blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
1159
+ } else if (Array.isArray(d[metadata.date])) {
1160
+ blocked = d[metadata.date].some(function (idate) {
1161
+ return module.helper.dateEqual(date, idate, mode);
1162
+ });
1163
+ }
1164
+ }
1165
+ }
1166
+
1167
+ return blocked;
1168
+ })) || (mode === 'hour' && settings.disabledHours.some(function (d) {
1169
+ var blocked = false;
1170
+
1171
+ if (typeof d === 'string') {
1172
+ d = module.helper.sanitiseDate(d);
1173
+ }
1174
+ if (d instanceof Date) {
1175
+ blocked = module.helper.dateEqual(date, d, mode);
1176
+ } else if (typeof d === 'number') {
1177
+ blocked = date.getHours() === d;
1178
+ } else if (d !== null && typeof d === 'object') {
1179
+ if (d[metadata.date]) {
1180
+ if (d[metadata.date] instanceof Date) {
1181
+ blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]));
1182
+ } else if (Array.isArray(d[metadata.date])) {
1183
+ blocked = d[metadata.date].some(function (idate) {
1184
+ return module.helper.dateEqual(date, idate, mode);
1185
+ });
1186
+ }
1187
+ }
1188
+
1189
+ if (d[metadata.days]) {
1190
+ if (typeof d[metadata.days] === 'number') {
1191
+ blocked = date.getDay() === d[metadata.days];
1192
+ } else if (Array.isArray(d[metadata.days])) {
1193
+ blocked = d[metadata.days].indexOf(date.getDay()) > -1;
1194
+ }
1195
+ }
1196
+
1197
+ if (d[metadata.hours]) {
1198
+ if (typeof d[metadata.hours] === 'number') {
1199
+ blocked = blocked && date.getHours() === d[metadata.hours];
1200
+ } else if (Array.isArray(d[metadata.hours])) {
1201
+ blocked = blocked && d[metadata.hours].indexOf(date.getHours()) > -1;
1202
+ }
1203
+ }
1204
+ }
1205
+
1206
+ return blocked;
1207
+ })));
1208
+ },
1209
+ isEnabled: function (date, mode) {
1210
+ if (mode === 'day') {
1211
+ return settings.enabledDates.length === 0 || settings.enabledDates.some(function (d) {
1212
+ var enabled = false;
1213
+
1214
+ if (typeof d === 'string') {
1215
+ d = module.helper.sanitiseDate(d);
1216
+ }
1217
+ if (d instanceof Date) {
1218
+ enabled = module.helper.dateEqual(date, d, mode);
1219
+ } else if (d !== null && typeof d === 'object' && d[metadata.date]) {
1220
+ enabled = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
1221
+ }
1222
+
1223
+ return enabled;
1224
+ });
1225
+ }
828
1226
 
829
- module.set.focusDate(date);
1227
+ return true;
1228
+ },
1229
+ findDayAsObject: function (date, mode, dates) {
1230
+ if (mode === 'day' || mode === 'month' || mode === 'year') {
1231
+ var d;
1232
+ for (var i = 0; i < dates.length; i++) {
1233
+ d = dates[i];
1234
+ if (typeof d === 'string') {
1235
+ d = module.helper.sanitiseDate(d);
1236
+ }
1237
+ if (d instanceof Date && module.helper.dateEqual(date, d, mode)) {
1238
+ var dateObject = {};
1239
+ dateObject[metadata.date] = d;
1240
+
1241
+ return dateObject;
1242
+ }
1243
+ if (d !== null && typeof d === 'object') {
1244
+ if (d[metadata.year]) {
1245
+ if (typeof d[metadata.year] === 'number' && date.getFullYear() === d[metadata.year]) {
1246
+ return d;
1247
+ }
1248
+ if (Array.isArray(d[metadata.year])) {
1249
+ if (d[metadata.year].indexOf(date.getFullYear()) > -1) {
1250
+ return d;
1251
+ }
1252
+ }
1253
+ } else if (d[metadata.month]) {
1254
+ if (typeof d[metadata.month] === 'number' && date.getMonth() === d[metadata.month]) {
1255
+ return d;
1256
+ }
1257
+ if (Array.isArray(d[metadata.month])) {
1258
+ if (d[metadata.month].indexOf(date.getMonth()) > -1) {
1259
+ return d;
1260
+ }
1261
+ } else if (d[metadata.month] instanceof Date) {
1262
+ var sdate = module.helper.sanitiseDate(d[metadata.month]);
1263
+ if ((date.getMonth() === sdate.getMonth()) && (date.getFullYear() === sdate.getFullYear())) {
1264
+ return d;
1265
+ }
1266
+ }
1267
+ } else if (d[metadata.date] && mode === 'day') {
1268
+ if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode)) {
1269
+ return d;
1270
+ }
1271
+ if (Array.isArray(d[metadata.date])) {
1272
+ if (d[metadata.date].some(function (idate) {
1273
+ return module.helper.dateEqual(date, idate, mode);
1274
+ })) {
1275
+ return d;
1276
+ }
1277
+ }
1278
+ }
1279
+ }
1280
+ }
1281
+ }
830
1282
 
831
- if (settings.isDisabled(date, mode)) {
832
- return false;
833
- }
1283
+ return null;
1284
+ },
1285
+ findHourAsObject: function (date, mode, hours) {
1286
+ if (mode === 'hour') {
1287
+ var d;
1288
+ var hourCheck = function (date, d) {
1289
+ if (d[metadata.hours]) {
1290
+ if (typeof d[metadata.hours] === 'number' && date.getHours() === d[metadata.hours]) {
1291
+ return d;
1292
+ }
1293
+ if (Array.isArray(d[metadata.hours])) {
1294
+ if (d[metadata.hours].indexOf(date.getHours()) > -1) {
1295
+ return d;
1296
+ }
1297
+ }
1298
+ }
1299
+ };
1300
+ for (var i = 0; i < hours.length; i++) {
1301
+ d = hours[i];
1302
+ if (typeof d === 'number' && date.getHours() === d) {
1303
+ return null;
1304
+ }
1305
+ if (d !== null && typeof d === 'object') {
1306
+ if (d[metadata.days] && hourCheck(date, d)) {
1307
+ if (typeof d[metadata.days] === 'number' && date.getDay() === d[metadata.days]) {
1308
+ return d;
1309
+ }
1310
+ if (Array.isArray(d[metadata.days])) {
1311
+ if (d[metadata.days].indexOf(date.getDay()) > -1) {
1312
+ return d;
1313
+ }
1314
+ }
1315
+ } else if (d[metadata.date] && hourCheck(date, d)) {
1316
+ if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]))) {
1317
+ return d;
1318
+ }
1319
+ if (Array.isArray(d[metadata.date])) {
1320
+ if (d[metadata.date].some(function (idate) {
1321
+ return module.helper.dateEqual(date, idate, mode);
1322
+ })) {
1323
+ return d;
1324
+ }
1325
+ }
1326
+ } else if (hourCheck(date, d)) {
1327
+ return d;
1328
+ }
1329
+ }
1330
+ }
1331
+ }
834
1332
 
835
- var endDate = module.get.endDate();
836
- if (!!endDate && !!date && date > endDate) {
837
- //selected date is greater than end date in range, so clear end date
838
- module.set.endDate(undefined);
839
- }
840
- module.set.dataKeyValue(metadata.date, date);
1333
+ return null;
1334
+ },
1335
+ sanitiseDate: function (date) {
1336
+ if (!(date instanceof Date)) {
1337
+ date = parser.date('' + date, settings);
1338
+ }
1339
+ if (!date || isNaN(date.getTime())) {
1340
+ return null;
1341
+ }
841
1342
 
842
- if (updateInput && $input.length) {
843
- $input.val(text);
844
- }
1343
+ return date;
1344
+ },
1345
+ dateDiff: function (date1, date2, mode) {
1346
+ if (!mode) {
1347
+ mode = 'day';
1348
+ }
845
1349
 
846
- if (fireChange) {
847
- settings.onChange.call(element, date, text, mode);
848
- }
849
- },
850
- startDate: function (date, refreshCalendar) {
851
- date = module.helper.sanitiseDate(date);
852
- var startModule = module.get.calendarModule(settings.startCalendar);
853
- if (startModule) {
854
- startModule.set.date(date);
855
- }
856
- module.set.dataKeyValue(metadata.startDate, date, refreshCalendar);
857
- },
858
- endDate: function (date, refreshCalendar) {
859
- date = module.helper.sanitiseDate(date);
860
- var endModule = module.get.calendarModule(settings.endCalendar);
861
- if (endModule) {
862
- endModule.set.date(date);
863
- }
864
- module.set.dataKeyValue(metadata.endDate, date, refreshCalendar);
865
- },
866
- focusDate: function (date, refreshCalendar, updateFocus, updateRange) {
867
- date = module.helper.sanitiseDate(date);
868
- date = module.helper.dateInRange(date);
869
- var isDay = module.get.mode() === 'day';
870
- var oldFocusDate = module.get.focusDate();
871
- if (isDay && date && oldFocusDate) {
872
- var yearDelta = date.getFullYear() - oldFocusDate.getFullYear();
873
- var monthDelta = yearDelta * 12 + date.getMonth() - oldFocusDate.getMonth();
874
- if (monthDelta) {
875
- var monthOffset = module.get.monthOffset() - monthDelta;
876
- module.set.monthOffset(monthOffset, false);
877
- }
878
- }
879
- var changed = module.set.dataKeyValue(metadata.focusDate, date, !!date && refreshCalendar);
880
- updateFocus = (updateFocus !== false && changed && refreshCalendar === false) || focusDateUsedForRange != updateRange;
881
- focusDateUsedForRange = updateRange;
882
- if (updateFocus) {
883
- module.update.focus(updateRange);
884
- }
885
- },
886
- minDate: function (date) {
887
- date = module.helper.sanitiseDate(date);
888
- if (settings.maxDate !== null && settings.maxDate <= date) {
889
- module.verbose('Unable to set minDate variable bigger that maxDate variable', date, settings.maxDate);
890
- } else {
891
- module.setting('minDate', date);
892
- module.set.dataKeyValue(metadata.minDate, date);
893
- }
894
- },
895
- maxDate: function (date) {
896
- date = module.helper.sanitiseDate(date);
897
- if (settings.minDate !== null && settings.minDate >= date) {
898
- module.verbose('Unable to set maxDate variable lower that minDate variable', date, settings.minDate);
899
- } else {
900
- module.setting('maxDate', date);
901
- module.set.dataKeyValue(metadata.maxDate, date);
902
- }
903
- },
904
- monthOffset: function (monthOffset, refreshCalendar) {
905
- var multiMonth = Math.max(settings.multiMonth, 1);
906
- monthOffset = Math.max(1 - multiMonth, Math.min(0, monthOffset));
907
- module.set.dataKeyValue(metadata.monthOffset, monthOffset, refreshCalendar);
908
- },
909
- mode: function (mode, refreshCalendar) {
910
- module.set.dataKeyValue(metadata.mode, mode, refreshCalendar);
911
- },
912
- dataKeyValue: function (key, value, refreshCalendar) {
913
- var oldValue = $module.data(key);
914
- var equal = oldValue === value || (oldValue <= value && oldValue >= value); //equality test for dates and string objects
915
- if (value) {
916
- $module.data(key, value);
917
- } else {
918
- $module.removeData(key);
919
- }
920
- refreshCalendar = refreshCalendar !== false && !equal;
921
- if (refreshCalendar) {
922
- module.refresh();
923
- }
924
- return !equal;
925
- }
926
- },
1350
+ var isTimeOnly = settings.type === 'time';
1351
+ var isYear = mode === 'year';
1352
+ var isYearOrMonth = isYear || mode === 'month';
1353
+ var isMinute = mode === 'minute';
1354
+ var isHourOrMinute = isMinute || mode === 'hour';
1355
+ // only care about a minute accuracy of settings.minTimeGap
1356
+ date1 = new Date(
1357
+ isTimeOnly ? 2000 : date1.getFullYear(),
1358
+ isTimeOnly ? 0 : (isYear ? 0 : date1.getMonth()),
1359
+ isTimeOnly ? 1 : (isYearOrMonth ? 1 : date1.getDate()),
1360
+ !isHourOrMinute ? 0 : date1.getHours(),
1361
+ !isMinute ? 0 : settings.minTimeGap * Math.floor(date1.getMinutes() / settings.minTimeGap)
1362
+ );
1363
+ date2 = new Date(
1364
+ isTimeOnly ? 2000 : date2.getFullYear(),
1365
+ isTimeOnly ? 0 : (isYear ? 0 : date2.getMonth()),
1366
+ isTimeOnly ? 1 : (isYearOrMonth ? 1 : date2.getDate()),
1367
+ !isHourOrMinute ? 0 : date2.getHours(),
1368
+ !isMinute ? 0 : settings.minTimeGap * Math.floor(date2.getMinutes() / settings.minTimeGap)
1369
+ );
1370
+
1371
+ return date2.getTime() - date1.getTime();
1372
+ },
1373
+ dateEqual: function (date1, date2, mode) {
1374
+ return !!date1 && !!date2 && module.helper.dateDiff(date1, date2, mode) === 0;
1375
+ },
1376
+ isDateInRange: function (date, mode, minDate, maxDate) {
1377
+ if (!minDate && !maxDate) {
1378
+ var startDate = module.get.startDate();
1379
+ minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
1380
+ maxDate = settings.maxDate;
1381
+ }
1382
+ minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
1383
+
1384
+ return !(!date
1385
+ || (minDate && module.helper.dateDiff(date, minDate, mode) > 0)
1386
+ || (maxDate && module.helper.dateDiff(maxDate, date, mode) > 0));
1387
+ },
1388
+ dateInRange: function (date, minDate, maxDate) {
1389
+ if (!minDate && !maxDate) {
1390
+ var startDate = module.get.startDate();
1391
+ minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
1392
+ maxDate = settings.maxDate;
1393
+ }
1394
+ minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
1395
+ var isTimeOnly = settings.type === 'time';
1396
+
1397
+ return !date
1398
+ ? date
1399
+ : (minDate && module.helper.dateDiff(date, minDate, 'minute') > 0
1400
+ ? (isTimeOnly ? module.helper.mergeDateTime(date, minDate) : minDate) // eslint-disable-line unicorn/no-nested-ternary
1401
+ : (maxDate && module.helper.dateDiff(maxDate, date, 'minute') > 0 // eslint-disable-line unicorn/no-nested-ternary
1402
+ ? (isTimeOnly ? module.helper.mergeDateTime(date, maxDate) : maxDate)
1403
+ : date));
1404
+ },
1405
+ mergeDateTime: function (date, time) {
1406
+ return !date || !time
1407
+ ? time
1408
+ : new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());
1409
+ },
1410
+ isTodayButton: function (element) {
1411
+ return element.text() === settings.text.today;
1412
+ },
1413
+ },
1414
+
1415
+ setting: function (name, value) {
1416
+ module.debug('Changing setting', name, value);
1417
+ if ($.isPlainObject(name)) {
1418
+ $.extend(true, settings, name);
1419
+ } else if (value !== undefined) {
1420
+ if ($.isPlainObject(settings[name])) {
1421
+ $.extend(true, settings[name], value);
1422
+ } else {
1423
+ settings[name] = value;
1424
+ }
1425
+ } else {
1426
+ return settings[name];
1427
+ }
1428
+ },
1429
+ internal: function (name, value) {
1430
+ if ($.isPlainObject(name)) {
1431
+ $.extend(true, module, name);
1432
+ } else if (value !== undefined) {
1433
+ module[name] = value;
1434
+ } else {
1435
+ return module[name];
1436
+ }
1437
+ },
1438
+ debug: function () {
1439
+ if (!settings.silent && settings.debug) {
1440
+ if (settings.performance) {
1441
+ module.performance.log(arguments);
1442
+ } else {
1443
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1444
+ module.debug.apply(console, arguments);
1445
+ }
1446
+ }
1447
+ },
1448
+ verbose: function () {
1449
+ if (!settings.silent && settings.verbose && settings.debug) {
1450
+ if (settings.performance) {
1451
+ module.performance.log(arguments);
1452
+ } else {
1453
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1454
+ module.verbose.apply(console, arguments);
1455
+ }
1456
+ }
1457
+ },
1458
+ error: function () {
1459
+ if (!settings.silent) {
1460
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1461
+ module.error.apply(console, arguments);
1462
+ }
1463
+ },
1464
+ performance: {
1465
+ log: function (message) {
1466
+ var
1467
+ currentTime,
1468
+ executionTime,
1469
+ previousTime
1470
+ ;
1471
+ if (settings.performance) {
1472
+ currentTime = Date.now();
1473
+ previousTime = time || currentTime;
1474
+ executionTime = currentTime - previousTime;
1475
+ time = currentTime;
1476
+ performance.push({
1477
+ Name: message[0],
1478
+ Arguments: [].slice.call(message, 1) || '',
1479
+ Element: element,
1480
+ 'Execution Time': executionTime,
1481
+ });
1482
+ }
1483
+ clearTimeout(module.performance.timer);
1484
+ module.performance.timer = setTimeout(module.performance.display, 500);
1485
+ },
1486
+ display: function () {
1487
+ var
1488
+ title = settings.name + ':',
1489
+ totalTime = 0
1490
+ ;
1491
+ time = false;
1492
+ clearTimeout(module.performance.timer);
1493
+ $.each(performance, function (index, data) {
1494
+ totalTime += data['Execution Time'];
1495
+ });
1496
+ title += ' ' + totalTime + 'ms';
1497
+ if (moduleSelector) {
1498
+ title += ' \'' + moduleSelector + '\'';
1499
+ }
1500
+ if (performance.length > 0) {
1501
+ console.groupCollapsed(title);
1502
+ if (console.table) {
1503
+ console.table(performance);
1504
+ } else {
1505
+ $.each(performance, function (index, data) {
1506
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
1507
+ });
1508
+ }
1509
+ console.groupEnd();
1510
+ }
1511
+ performance = [];
1512
+ },
1513
+ },
1514
+ invoke: function (query, passedArguments, context) {
1515
+ var
1516
+ object = instance,
1517
+ maxDepth,
1518
+ found,
1519
+ response
1520
+ ;
1521
+ passedArguments = passedArguments || queryArguments;
1522
+ context = context || element;
1523
+ if (typeof query === 'string' && object !== undefined) {
1524
+ query = query.split(/[ .]/);
1525
+ maxDepth = query.length - 1;
1526
+ $.each(query, function (depth, value) {
1527
+ var camelCaseValue = depth !== maxDepth
1528
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1529
+ : query
1530
+ ;
1531
+ if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
1532
+ object = object[camelCaseValue];
1533
+ } else if (object[camelCaseValue] !== undefined) {
1534
+ found = object[camelCaseValue];
1535
+
1536
+ return false;
1537
+ } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {
1538
+ object = object[value];
1539
+ } else if (object[value] !== undefined) {
1540
+ found = object[value];
1541
+
1542
+ return false;
1543
+ } else {
1544
+ module.error(error.method, query);
1545
+
1546
+ return false;
1547
+ }
1548
+ });
1549
+ }
1550
+ if (isFunction(found)) {
1551
+ response = found.apply(context, passedArguments);
1552
+ } else if (found !== undefined) {
1553
+ response = found;
1554
+ }
1555
+ if (Array.isArray(returnedValue)) {
1556
+ returnedValue.push(response);
1557
+ } else if (returnedValue !== undefined) {
1558
+ returnedValue = [returnedValue, response];
1559
+ } else if (response !== undefined) {
1560
+ returnedValue = response;
1561
+ }
927
1562
 
928
- selectDate: function (date, forceSet) {
929
- module.verbose('New date selection', date);
930
- var mode = module.get.mode();
931
- var complete = forceSet || mode === 'minute' ||
932
- (settings.disableMinute && mode === 'hour') ||
933
- (settings.type === 'date' && mode === 'day') ||
934
- (settings.type === 'month' && mode === 'month') ||
935
- (settings.type === 'year' && mode === 'year');
936
- if (complete) {
937
- var canceled = module.set.date(date) === false;
938
- if (!canceled) {
939
- selectionComplete = true;
940
- if(settings.closable) {
941
- module.popup('hide');
942
- //if this is a range calendar, focus the container or input. This will open the popup from its event listeners.
943
- var endModule = module.get.calendarModule(settings.endCalendar);
944
- if (endModule) {
945
- endModule.refresh();
946
- if (endModule.setting('on') !== 'focus') {
947
- endModule.popup('show');
948
- }
949
- endModule.focus();
1563
+ return found;
1564
+ },
1565
+ };
1566
+
1567
+ if (methodInvoked) {
1568
+ if (instance === undefined) {
1569
+ module.initialize();
950
1570
  }
951
- }
952
- }
953
- } else {
954
- var newMode = mode === 'year' ? (!settings.disableMonth ? 'month' : 'day') :
955
- mode === 'month' ? 'day' : mode === 'day' ? 'hour' : 'minute';
956
- module.set.mode(newMode);
957
- if (mode === 'hour' || (mode === 'day' && module.get.date())) {
958
- //the user has chosen enough to consider a valid date/time has been chosen
959
- module.set.date(date, true, false);
1571
+ module.invoke(query);
960
1572
  } else {
961
- module.set.focusDate(date);
962
- }
963
- }
1573
+ if (instance !== undefined) {
1574
+ instance.invoke('destroy');
1575
+ }
1576
+ module.initialize();
1577
+ }
1578
+ });
1579
+
1580
+ return returnedValue !== undefined
1581
+ ? returnedValue
1582
+ : this;
1583
+ };
1584
+
1585
+ $.fn.calendar.settings = {
1586
+
1587
+ name: 'Calendar',
1588
+ namespace: 'calendar',
1589
+
1590
+ silent: false,
1591
+ debug: false,
1592
+ verbose: false,
1593
+ performance: true,
1594
+
1595
+ context: false,
1596
+
1597
+ type: 'datetime', // picker type, can be 'datetime', 'date', 'time', 'month', or 'year'
1598
+ firstDayOfWeek: 0, // day for first day column (0 = Sunday)
1599
+ constantHeight: true, // add rows to shorter months to keep day calendar height consistent (6 rows)
1600
+ today: false, // show a 'today/now' button at the bottom of the calendar
1601
+ closable: true, // close the popup after selecting a date/time
1602
+ monthFirst: true, // month before day when parsing date from text
1603
+ touchReadonly: true, // set input to readonly on touch devices
1604
+ inline: false, // create the calendar inline instead of inside a popup
1605
+ on: null, // when to show the popup (defaults to 'focus' for input, 'click' for others)
1606
+ initialDate: null, // date to display initially when no date is selected (null = now)
1607
+ startMode: false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')
1608
+ minDate: null, // minimum date/time that can be selected, dates/times before are disabled
1609
+ maxDate: null, // maximum date/time that can be selected, dates/times after are disabled
1610
+ disableYear: false, // disable year selection mode
1611
+ disableMonth: false, // disable month selection mode
1612
+ disableMinute: false, // disable minute selection mode
1613
+ formatInput: true, // format the input text upon input blur and module creation
1614
+ startCalendar: null, // jquery object or selector for another calendar that represents the start date of a date range
1615
+ endCalendar: null, // jquery object or selector for another calendar that represents the end date of a date range
1616
+ multiMonth: 1, // show multiple months when in 'day' mode
1617
+ monthOffset: 0, // position current month by offset when multimonth > 1
1618
+ minTimeGap: 5,
1619
+ showWeekNumbers: false, // show Number of Week at the very first column of a dayView
1620
+ disabledHours: [], // specific hour(s) which won't be selectable and contain additional information.
1621
+ disabledDates: [], // specific day(s) which won't be selectable and contain additional information.
1622
+ disabledDaysOfWeek: [], // day(s) which won't be selectable(s) (0 = Sunday)
1623
+ enabledDates: [], // specific day(s) which will be selectable, all other days will be disabled
1624
+ eventDates: [], // specific day(s) which will be shown in a different color and using tooltips
1625
+ centuryBreak: 60, // starting short year until 99 where it will be assumed to belong to the last century
1626
+ currentCentury: 2000, // century to be added to 2-digit years (00 to {centuryBreak}-1)
1627
+ selectAdjacentDays: false, // The calendar can show dates from adjacent month. These adjacent month dates can also be made selectable.
1628
+ // popup options ('popup', 'on', 'hoverable', and show/hide callbacks are overridden)
1629
+ popupOptions: {
1630
+ position: 'bottom left',
1631
+ lastResort: 'bottom left',
1632
+ prefer: 'opposite',
1633
+ observeChanges: false,
1634
+ hideOnScroll: false,
964
1635
  },
965
1636
 
966
- changeDate: function (date) {
967
- module.set.date(date);
1637
+ text: {
1638
+ days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
1639
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
1640
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
1641
+ months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
1642
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
1643
+ today: 'Today',
1644
+ now: 'Now',
1645
+ am: 'AM',
1646
+ pm: 'PM',
1647
+ weekNo: 'Week',
968
1648
  },
969
1649
 
970
- clear: function () {
971
- module.set.date(undefined);
1650
+ formatter: {
1651
+ yearHeader: function (date, settings) {
1652
+ var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;
1653
+
1654
+ return (decadeYear - 9) + ' - ' + (decadeYear + 2);
1655
+ },
1656
+ monthHeader: 'YYYY',
1657
+ dayHeader: 'MMMM YYYY',
1658
+ hourHeader: 'MMMM D, YYYY',
1659
+ minuteHeader: 'MMMM D, YYYY',
1660
+ dayColumnHeader: function (day, settings) {
1661
+ return settings.text.days[day];
1662
+ },
1663
+ datetime: 'MMMM D, YYYY h:mm A',
1664
+ date: 'MMMM D, YYYY',
1665
+ time: 'h:mm A',
1666
+ cellTime: 'h:mm A',
1667
+ month: 'MMMM YYYY',
1668
+ year: 'YYYY',
1669
+ today: function (settings) {
1670
+ return settings.type === 'date' ? settings.text.today : settings.text.now;
1671
+ },
1672
+ cell: function (cell, date, cellOptions) {},
972
1673
  },
973
1674
 
974
- popup: function () {
975
- return $activator.popup.apply($activator, arguments);
976
- },
1675
+ parser: {
1676
+ date: function (text, settings) {
1677
+ if (text instanceof Date) {
1678
+ return text;
1679
+ }
1680
+ if (!text) {
1681
+ return null;
1682
+ }
1683
+ text = String(text).trim().replace(/([./:-])\s+/g, '$1').replace(/\s+([./:-])/g, '$1')
1684
+ .replace(/\s+/g, ' ');
1685
+ if (text.length === 0) {
1686
+ return null;
1687
+ }
1688
+ if (/^\d{4}(?:[./-]\d{1,2}){2}$/.test(text)) {
1689
+ text = text.replace(/[./-]/g, '/') + ' 00:00:00';
1690
+ }
1691
+ // Reverse date and month in some cases
1692
+ text = settings.monthFirst || !/^\d{1,2}[./-]/.test(text) ? text : text.replace(/[./-]/g, '/').replace(/(\d+)\/(\d+)/, '$2/$1');
1693
+ var textDate = new Date(text);
1694
+ var numberOnly = text.match(/^\d+$/) !== null;
1695
+ if (!numberOnly && !isNaN(textDate.getDate())) {
1696
+ return textDate;
1697
+ }
1698
+ text = text.toLowerCase();
977
1699
 
978
- focus: function () {
979
- if ($input.length) {
980
- $input.focus();
981
- } else {
982
- $container.focus();
983
- }
984
- },
985
- blur: function () {
986
- if ($input.length) {
987
- $input.blur();
988
- } else {
989
- $container.blur();
990
- }
991
- },
1700
+ var
1701
+ i,
1702
+ j,
1703
+ k
1704
+ ;
1705
+ var
1706
+ minute = -1,
1707
+ hour = -1,
1708
+ day = -1,
1709
+ month = -1,
1710
+ year = -1
1711
+ ;
1712
+ var isAm;
992
1713
 
993
- helper: {
994
- dateFormat: function(format,date) {
995
- if (!(date instanceof Date)) {
996
- return '';
997
- }
998
- if(typeof format === 'function') {
999
- return format.call(module, date, settings);
1000
- }
1714
+ var isTimeOnly = settings.type === 'time';
1715
+ var isDateOnly = settings.type.indexOf('time') < 0;
1001
1716
 
1002
- var D = date.getDate(),
1003
- M = date.getMonth(),
1004
- Y = date.getFullYear(),
1005
- d = date.getDay(),
1006
- H = date.getHours(),
1007
- m = date.getMinutes(),
1008
- s = date.getSeconds(),
1009
- w = module.get.weekOfYear(Y,M,D+1-settings.firstDayOfWeek),
1010
- h = H % 12 || 12,
1011
- a = H < 12 ? settings.text.am.toLowerCase() : settings.text.pm.toLowerCase(),
1012
- tokens = {
1013
- D: D,
1014
- DD: ('0'+D).slice(-2),
1015
- M: M + 1,
1016
- MM: ('0'+(M+1)).slice(-2),
1017
- MMM: settings.text.monthsShort[M],
1018
- MMMM: settings.text.months[M],
1019
- Y: Y,
1020
- YY: String(Y).slice(2),
1021
- YYYY: Y,
1022
- d: d,
1023
- dd: settings.text.dayNamesShort[d].slice(0,2),
1024
- ddd: settings.text.dayNamesShort[d],
1025
- dddd: settings.text.dayNames[d],
1026
- h: h,
1027
- hh: ('0'+h).slice(-2),
1028
- H: H,
1029
- HH: ('0'+H).slice(-2),
1030
- m: m,
1031
- mm: ('0'+m).slice(-2),
1032
- s: s,
1033
- ss: ('0'+s).slice(-2),
1034
- a: a,
1035
- A: a.toUpperCase(),
1036
- S: ['th', 'st', 'nd', 'rd'][D % 10 > 3 ? 0 : (D % 100 - D % 10 !== 10) * D % 10],
1037
- w: w,
1038
- ww: ('0'+w).slice(-2)
1039
- }
1040
- ;
1041
- return format.replace(settings.regExp.token, function (match) {
1042
- if (match in tokens) {
1043
- return tokens[match];
1044
- }
1045
- return match.slice(1, match.length - 1);
1046
- });
1047
- },
1048
- isDisabled: function(date, mode) {
1049
- return (mode === 'day' || mode === 'month' || mode === 'year' || mode === 'hour') && (((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function(d){
1050
- if(typeof d === 'string') {
1051
- d = module.helper.sanitiseDate(d);
1052
- }
1053
- if (d instanceof Date) {
1054
- return module.helper.dateEqual(date, d, mode);
1055
- }
1056
- if (d !== null && typeof d === 'object') {
1057
- if (d[metadata.year]) {
1058
- if (typeof d[metadata.year] === 'number') {
1059
- return date.getFullYear() == d[metadata.year];
1060
- } else if (Array.isArray(d[metadata.year])) {
1061
- return d[metadata.year].indexOf(date.getFullYear()) > -1;
1062
- }
1063
- } else if (d[metadata.month]) {
1064
- if (typeof d[metadata.month] === 'number') {
1065
- return date.getMonth() == d[metadata.month];
1066
- } else if (Array.isArray(d[metadata.month])) {
1067
- return d[metadata.month].indexOf(date.getMonth()) > -1;
1068
- } else if (d[metadata.month] instanceof Date) {
1069
- var sdate = module.helper.sanitiseDate(d[metadata.month]);
1070
- return (date.getMonth() == sdate.getMonth()) && (date.getFullYear() == sdate.getFullYear())
1071
- }
1072
- } else if (d[metadata.date] && mode === 'day') {
1073
- if (d[metadata.date] instanceof Date) {
1074
- return module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
1075
- } else if (Array.isArray(d[metadata.date])) {
1076
- return d[metadata.date].some(function(idate) {
1077
- return module.helper.dateEqual(date, idate, mode);
1078
- });
1079
- }
1080
- }
1081
- }
1082
- })) || (mode === 'hour' && settings.disabledHours.some(function(d){
1083
- if (typeof d === 'string') {
1084
- d = module.helper.sanitiseDate(d);
1085
- }
1086
- if (d instanceof Date) {
1087
- return module.helper.dateEqual(date, d, mode);
1088
- } else if (typeof d === 'number') {
1089
- return date.getHours() === d;
1090
- }
1091
- if (d !== null && typeof d === 'object') {
1092
- var blocked = true;
1093
-
1094
- if (d[metadata.date]) {
1095
- if (d[metadata.date] instanceof Date) {
1096
- blocked = module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]));
1097
- } else if (Array.isArray(d[metadata.date])) {
1098
- return d[metadata.date].some(function(idate) {
1099
- blocked = module.helper.dateEqual(date, idate, mode);
1100
- });
1101
- }
1717
+ var
1718
+ words = text.split(settings.regExp.dateWords),
1719
+ word
1720
+ ;
1721
+ var
1722
+ numbers = text.split(settings.regExp.dateNumbers),
1723
+ number
1724
+ ;
1725
+
1726
+ var parts;
1727
+ var monthString;
1728
+
1729
+ if (!isDateOnly) {
1730
+ // am/pm
1731
+ isAm = $.inArray(settings.text.am.toLowerCase(), words) >= 0
1732
+ ? true
1733
+ : ($.inArray(settings.text.pm.toLowerCase(), words) >= 0 ? false : undefined);
1734
+
1735
+ // time with ':'
1736
+ for (i = 0; i < numbers.length; i++) {
1737
+ number = numbers[i];
1738
+ if (number.indexOf(':') >= 0) {
1739
+ if (hour < 0 || minute < 0) {
1740
+ parts = number.split(':');
1741
+ for (k = 0; k < Math.min(2, parts.length); k++) {
1742
+ j = parseInt(parts[k], 10);
1743
+ if (isNaN(j)) {
1744
+ j = 0;
1745
+ }
1746
+ if (k === 0) {
1747
+ hour = j % 24;
1748
+ } else {
1749
+ minute = j % 60;
1750
+ }
1751
+ }
1752
+ }
1753
+ numbers.splice(i, 1);
1754
+ }
1755
+ }
1102
1756
  }
1103
1757
 
1104
- if (d[metadata.days]) {
1105
- if (typeof d[metadata.days] === 'number') {
1106
- blocked = date.getDay() == d[metadata.days];
1107
- } else if (Array.isArray(d[metadata.days])) {
1108
- blocked = d[metadata.days].indexOf(date.getDay()) > -1;
1109
- }
1758
+ if (!isTimeOnly) {
1759
+ // textual month
1760
+ for (i = 0; i < words.length; i++) {
1761
+ word = words[i];
1762
+ if (word.length <= 0) {
1763
+ continue;
1764
+ }
1765
+ for (j = 0; j < settings.text.months.length; j++) {
1766
+ monthString = settings.text.months[j];
1767
+ monthString = monthString.slice(0, word.length).toLowerCase();
1768
+ if (monthString === word) {
1769
+ month = j + 1;
1770
+
1771
+ break;
1772
+ }
1773
+ }
1774
+ if (month >= 0) {
1775
+ break;
1776
+ }
1777
+ }
1778
+
1779
+ // year > settings.centuryBreak
1780
+ for (i = 0; i < numbers.length; i++) {
1781
+ j = parseInt(numbers[i], 10);
1782
+ if (isNaN(j)) {
1783
+ continue;
1784
+ }
1785
+ if (j >= settings.centuryBreak && i === numbers.length - 1) {
1786
+ if (j <= 99) {
1787
+ j += settings.currentCentury - 100;
1788
+ }
1789
+ year = j;
1790
+ numbers.splice(i, 1);
1791
+
1792
+ break;
1793
+ }
1794
+ }
1795
+
1796
+ // numeric month
1797
+ if (month < 0) {
1798
+ for (i = 0; i < numbers.length; i++) {
1799
+ k = i > 1 || settings.monthFirst
1800
+ ? i
1801
+ : (i === 1 ? 0 : 1);
1802
+ j = parseInt(numbers[k], 10);
1803
+ if (isNaN(j)) {
1804
+ continue;
1805
+ }
1806
+ if (j >= 1 && j <= 12) {
1807
+ month = j;
1808
+ numbers.splice(k, 1);
1809
+
1810
+ break;
1811
+ }
1812
+ }
1813
+ }
1814
+
1815
+ // day
1816
+ for (i = 0; i < numbers.length; i++) {
1817
+ j = parseInt(numbers[i], 10);
1818
+ if (isNaN(j)) {
1819
+ continue;
1820
+ }
1821
+ if (j >= 1 && j <= 31) {
1822
+ day = j;
1823
+ numbers.splice(i, 1);
1824
+
1825
+ break;
1826
+ }
1827
+ }
1828
+
1829
+ // year <= settings.centuryBreak
1830
+ if (year < 0) {
1831
+ for (i = numbers.length - 1; i >= 0; i--) {
1832
+ j = parseInt(numbers[i], 10);
1833
+ if (isNaN(j)) {
1834
+ continue;
1835
+ }
1836
+ if (j <= 99) {
1837
+ j += settings.currentCentury;
1838
+ }
1839
+ year = j;
1840
+ numbers.splice(i, 1);
1841
+
1842
+ break;
1843
+ }
1844
+ }
1110
1845
  }
1111
1846
 
1112
- if (d[metadata.hours]) {
1113
- if (typeof d[metadata.hours] === 'number') {
1114
- return blocked && date.getHours() == d[metadata.hours];
1115
- } else if (Array.isArray(d[metadata.hours])) {
1116
- return blocked && d[metadata.hours].indexOf(date.getHours()) > -1;
1117
- }
1847
+ if (!isDateOnly) {
1848
+ // hour
1849
+ if (hour < 0) {
1850
+ for (i = 0; i < numbers.length; i++) {
1851
+ j = parseInt(numbers[i], 10);
1852
+ if (isNaN(j)) {
1853
+ continue;
1854
+ }
1855
+ if (j >= 0 && j <= 23) {
1856
+ hour = j;
1857
+ numbers.splice(i, 1);
1858
+
1859
+ break;
1860
+ }
1861
+ }
1862
+ }
1863
+
1864
+ // minute
1865
+ if (minute < 0) {
1866
+ for (i = 0; i < numbers.length; i++) {
1867
+ j = parseInt(numbers[i], 10);
1868
+ if (isNaN(j)) {
1869
+ continue;
1870
+ }
1871
+ if (j >= 0 && j <= 59) {
1872
+ minute = j;
1873
+ numbers.splice(i, 1);
1874
+
1875
+ break;
1876
+ }
1877
+ }
1878
+ }
1118
1879
  }
1119
- }
1120
- })));
1121
- },
1122
- isEnabled: function(date, mode) {
1123
- if (mode === 'day') {
1124
- return settings.enabledDates.length === 0 || settings.enabledDates.some(function(d){
1125
- if(typeof d === 'string') {
1126
- d = module.helper.sanitiseDate(d);
1880
+
1881
+ if (minute < 0 && hour < 0 && day < 0 && month < 0 && year < 0) {
1882
+ return null;
1127
1883
  }
1128
- if (d instanceof Date) {
1129
- return module.helper.dateEqual(date, d, mode);
1884
+
1885
+ if (minute < 0) {
1886
+ minute = 0;
1130
1887
  }
1131
- if (d !== null && typeof d === 'object' && d[metadata.date]) {
1132
- return module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
1888
+ if (hour < 0) {
1889
+ hour = 0;
1133
1890
  }
1134
- });
1135
- } else {
1136
- return true;
1137
- }
1138
- },
1139
- findDayAsObject: function(date, mode, dates) {
1140
- if (mode === 'day' || mode === 'month' || mode === 'year') {
1141
- var d;
1142
- for (var i = 0; i < dates.length; i++) {
1143
- d = dates[i];
1144
- if(typeof d === 'string') {
1145
- d = module.helper.sanitiseDate(d);
1891
+ if (day < 0) {
1892
+ day = 1;
1146
1893
  }
1147
- if (d instanceof Date && module.helper.dateEqual(date, d, mode)) {
1148
- var dateObject = {};
1149
- dateObject[metadata.date] = d;
1150
- return dateObject;
1894
+ if (month < 0) {
1895
+ month = 1;
1151
1896
  }
1152
- else if (d !== null && typeof d === 'object') {
1153
- if (d[metadata.year]) {
1154
- if (typeof d[metadata.year] === 'number' && date.getFullYear() == d[metadata.year]) {
1155
- return d;
1156
- } else if (Array.isArray(d[metadata.year])) {
1157
- if (d[metadata.year].indexOf(date.getFullYear()) > -1) {
1158
- return d;
1159
- }
1160
- }
1161
- } else if (d[metadata.month]) {
1162
- if (typeof d[metadata.month] === 'number' && date.getMonth() == d[metadata.month]) {
1163
- return d;
1164
- } else if (Array.isArray(d[metadata.month])) {
1165
- if (d[metadata.month].indexOf(date.getMonth()) > -1) {
1166
- return d;
1167
- }
1168
- } else if (d[metadata.month] instanceof Date) {
1169
- var sdate = module.helper.sanitiseDate(d[metadata.month]);
1170
- if ((date.getMonth() == sdate.getMonth()) && (date.getFullYear() == sdate.getFullYear())) {
1171
- return d;
1172
- }
1173
- }
1174
- } else if (d[metadata.date] && mode === 'day') {
1175
- if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode)) {
1176
- return d;
1177
- } else if (Array.isArray(d[metadata.date])) {
1178
- if(d[metadata.date].some(function(idate) { return module.helper.dateEqual(date, idate, mode); })) {
1179
- return d;
1180
- }
1181
- }
1182
- }
1897
+ if (year < 0) {
1898
+ year = new Date().getFullYear();
1183
1899
  }
1184
- }
1185
- }
1186
- return null;
1187
- },
1188
- findHourAsObject: function(date, mode, hours) {
1189
- if (mode === 'hour') {
1190
- var d;
1191
- var hourCheck = function(date, d) {
1192
- if (d[metadata.hours]) {
1193
- if (typeof d[metadata.hours] === 'number' && date.getHours() == d[metadata.hours]) {
1194
- return d;
1195
- } else if (Array.isArray(d[metadata.hours])) {
1196
- if (d[metadata.hours].indexOf(date.getHours()) > -1) {
1197
- return d;
1900
+
1901
+ if (isAm !== undefined) {
1902
+ if (isAm) {
1903
+ if (hour === 12) {
1904
+ hour = 0;
1905
+ }
1906
+ } else if (hour < 12) {
1907
+ hour += 12;
1198
1908
  }
1199
- }
1200
1909
  }
1201
- }
1202
- for (var i = 0; i < hours.length; i++) {
1203
- d = hours[i];
1204
- if (typeof d === 'number' && date.getHours() == d) {
1205
- return null;
1206
- } else if (d !== null && typeof d === 'object') {
1207
- if (d[metadata.days] && hourCheck(date,d)) {
1208
- if (typeof d[metadata.days] === 'number' && date.getDay() == d[metadata.days]) {
1209
- return d;
1210
- } else if (Array.isArray(d[metadata.days])) {
1211
- if (d[metadata.days].indexOf(date.getDay()) > -1) {
1212
- return d;
1213
- }
1214
- }
1215
- } else if (d[metadata.date] && hourCheck(date,d)) {
1216
- if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]))) {
1217
- return d;
1218
- } else if (Array.isArray(d[metadata.date])) {
1219
- if (d[metadata.date].some(function(idate) { return module.helper.dateEqual(date, idate, mode); })) {
1220
- return d;
1221
- }
1222
- }
1223
- } else if (hourCheck(date,d)) {
1224
- return d;
1225
- }
1910
+
1911
+ var date = new Date(year, month - 1, day, hour, minute);
1912
+ if (date.getMonth() !== month - 1 || date.getFullYear() !== year) {
1913
+ // month or year don't match up, switch to last day of the month
1914
+ date = new Date(year, month, 0, hour, minute);
1226
1915
  }
1227
- }
1228
- }
1229
- return null;
1230
- },
1231
- sanitiseDate: function (date) {
1232
- if (!(date instanceof Date)) {
1233
- date = parser.date('' + date, settings);
1234
- }
1235
- if (!date || isNaN(date.getTime())) {
1236
- return null;
1237
- }
1238
- return date;
1239
- },
1240
- dateDiff: function (date1, date2, mode) {
1241
- mode = mode || 'day';
1242
- var isTimeOnly = settings.type === 'time';
1243
- var isYear = mode === 'year';
1244
- var isYearOrMonth = isYear || mode === 'month';
1245
- var isMinute = mode === 'minute';
1246
- var isHourOrMinute = isMinute || mode === 'hour';
1247
- //only care about a minute accuracy of settings.minTimeGap
1248
- date1 = new Date(
1249
- isTimeOnly ? 2000 : date1.getFullYear(),
1250
- isTimeOnly ? 0 : isYear ? 0 : date1.getMonth(),
1251
- isTimeOnly ? 1 : isYearOrMonth ? 1 : date1.getDate(),
1252
- !isHourOrMinute ? 0 : date1.getHours(),
1253
- !isMinute ? 0 : settings.minTimeGap * Math.floor(date1.getMinutes() / settings.minTimeGap));
1254
- date2 = new Date(
1255
- isTimeOnly ? 2000 : date2.getFullYear(),
1256
- isTimeOnly ? 0 : isYear ? 0 : date2.getMonth(),
1257
- isTimeOnly ? 1 : isYearOrMonth ? 1 : date2.getDate(),
1258
- !isHourOrMinute ? 0 : date2.getHours(),
1259
- !isMinute ? 0 : settings.minTimeGap * Math.floor(date2.getMinutes() / settings.minTimeGap));
1260
- return date2.getTime() - date1.getTime();
1261
- },
1262
- dateEqual: function (date1, date2, mode) {
1263
- return !!date1 && !!date2 && module.helper.dateDiff(date1, date2, mode) === 0;
1264
- },
1265
- isDateInRange: function (date, mode, minDate, maxDate) {
1266
- if (!minDate && !maxDate) {
1267
- var startDate = module.get.startDate();
1268
- minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
1269
- maxDate = settings.maxDate;
1270
- }
1271
- minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
1272
- return !(!date ||
1273
- (minDate && module.helper.dateDiff(date, minDate, mode) > 0) ||
1274
- (maxDate && module.helper.dateDiff(maxDate, date, mode) > 0));
1275
- },
1276
- dateInRange: function (date, minDate, maxDate) {
1277
- if (!minDate && !maxDate) {
1278
- var startDate = module.get.startDate();
1279
- minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
1280
- maxDate = settings.maxDate;
1281
- }
1282
- minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
1283
- var isTimeOnly = settings.type === 'time';
1284
- return !date ? date :
1285
- (minDate && module.helper.dateDiff(date, minDate, 'minute') > 0) ?
1286
- (isTimeOnly ? module.helper.mergeDateTime(date, minDate) : minDate) :
1287
- (maxDate && module.helper.dateDiff(maxDate, date, 'minute') > 0) ?
1288
- (isTimeOnly ? module.helper.mergeDateTime(date, maxDate) : maxDate) :
1289
- date;
1290
- },
1291
- mergeDateTime: function (date, time) {
1292
- return (!date || !time) ? time :
1293
- new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());
1294
- },
1295
- isTodayButton: function(element) {
1296
- return element.text() === settings.text.today;
1297
- }
1916
+
1917
+ return isNaN(date.getTime()) ? null : date;
1918
+ },
1298
1919
  },
1299
1920
 
1300
- setting: function (name, value) {
1301
- module.debug('Changing setting', name, value);
1302
- if ($.isPlainObject(name)) {
1303
- $.extend(true, settings, name);
1304
- }
1305
- else if (value !== undefined) {
1306
- if ($.isPlainObject(settings[name])) {
1307
- $.extend(true, settings[name], value);
1308
- }
1309
- else {
1310
- settings[name] = value;
1311
- }
1312
- }
1313
- else {
1314
- return settings[name];
1315
- }
1921
+ // callback before date is changed, return false to cancel the change
1922
+ onBeforeChange: function (date, text, mode) {
1923
+ return true;
1924
+ },
1925
+
1926
+ // callback when date changes
1927
+ onChange: function (date, text, mode) {},
1928
+
1929
+ // callback before show animation, return false to prevent show
1930
+ onShow: function () {},
1931
+
1932
+ // callback after show animation
1933
+ onVisible: function () {},
1934
+
1935
+ // callback before hide animation, return false to prevent hide
1936
+ onHide: function () {},
1937
+
1938
+ // callback after hide animation
1939
+ onHidden: function () {},
1940
+
1941
+ // callback before item is selected, return false to prevent selection
1942
+ onSelect: function (date, mode) {},
1943
+
1944
+ // is the given date disabled?
1945
+ isDisabled: function (date, mode) {
1946
+ return false;
1316
1947
  },
1317
- internal: function (name, value) {
1318
- if( $.isPlainObject(name) ) {
1319
- $.extend(true, module, name);
1320
- }
1321
- else if(value !== undefined) {
1322
- module[name] = value;
1323
- }
1324
- else {
1325
- return module[name];
1326
- }
1948
+
1949
+ selector: {
1950
+ popup: '.ui.popup',
1951
+ input: 'input',
1952
+ activator: 'input',
1953
+ append: '.inline.field,.inline.fields',
1327
1954
  },
1328
- debug: function () {
1329
- if (!settings.silent && settings.debug) {
1330
- if (settings.performance) {
1331
- module.performance.log(arguments);
1332
- }
1333
- else {
1334
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1335
- module.debug.apply(console, arguments);
1336
- }
1337
- }
1955
+
1956
+ regExp: {
1957
+ dateWords: /[^A-Za-z\u00C0-\u024F]+/g,
1958
+ dateNumbers: /[^\d:]+/g,
1959
+ token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\1?|[ASYa]|"[^"]*"|'[^']*'/g,
1338
1960
  },
1339
- verbose: function () {
1340
- if (!settings.silent && settings.verbose && settings.debug) {
1341
- if (settings.performance) {
1342
- module.performance.log(arguments);
1343
- }
1344
- else {
1345
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1346
- module.verbose.apply(console, arguments);
1347
- }
1348
- }
1961
+
1962
+ error: {
1963
+ popup: 'UI Popup, a required component is not included in this page',
1964
+ method: 'The method you called is not defined.',
1349
1965
  },
1350
- error: function () {
1351
- if (!settings.silent) {
1352
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1353
- module.error.apply(console, arguments);
1354
- }
1966
+
1967
+ className: {
1968
+ calendar: 'calendar',
1969
+ active: 'active',
1970
+ popup: 'ui popup',
1971
+ grid: 'ui equal width grid',
1972
+ column: 'column',
1973
+ table: 'ui celled center aligned unstackable table',
1974
+ inverted: 'inverted',
1975
+ prev: 'prev link',
1976
+ next: 'next link',
1977
+ prevIcon: 'chevron left icon',
1978
+ nextIcon: 'chevron right icon',
1979
+ link: 'link',
1980
+ cell: 'link',
1981
+ disabledCell: 'disabled',
1982
+ weekCell: 'disabled',
1983
+ adjacentCell: 'adjacent',
1984
+ activeCell: 'active',
1985
+ rangeCell: 'range',
1986
+ focusCell: 'focus',
1987
+ todayCell: 'today',
1988
+ today: 'today link',
1989
+ disabled: 'disabled',
1355
1990
  },
1356
- performance: {
1357
- log: function (message) {
1358
- var
1359
- currentTime,
1360
- executionTime,
1361
- previousTime
1362
- ;
1363
- if (settings.performance) {
1364
- currentTime = new Date().getTime();
1365
- previousTime = time || currentTime;
1366
- executionTime = currentTime - previousTime;
1367
- time = currentTime;
1368
- performance.push({
1369
- 'Name': message[0],
1370
- 'Arguments': [].slice.call(message, 1) || '',
1371
- 'Element': element,
1372
- 'Execution Time': executionTime
1373
- });
1374
- }
1375
- clearTimeout(module.performance.timer);
1376
- module.performance.timer = setTimeout(module.performance.display, 500);
1377
- },
1378
- display: function () {
1379
- var
1380
- title = settings.name + ':',
1381
- totalTime = 0
1382
- ;
1383
- time = false;
1384
- clearTimeout(module.performance.timer);
1385
- $.each(performance, function (index, data) {
1386
- totalTime += data['Execution Time'];
1387
- });
1388
- title += ' ' + totalTime + 'ms';
1389
- if (moduleSelector) {
1390
- title += ' \'' + moduleSelector + '\'';
1391
- }
1392
- if ((console.group !== undefined || console.table !== undefined) && performance.length > 0) {
1393
- console.groupCollapsed(title);
1394
- if (console.table) {
1395
- console.table(performance);
1396
- }
1397
- else {
1398
- $.each(performance, function (index, data) {
1399
- console.log(data['Name'] + ': ' + data['Execution Time'] + 'ms');
1400
- });
1401
- }
1402
- console.groupEnd();
1403
- }
1404
- performance = [];
1405
- }
1991
+
1992
+ metadata: {
1993
+ date: 'date',
1994
+ focusDate: 'focusDate',
1995
+ startDate: 'startDate',
1996
+ endDate: 'endDate',
1997
+ minDate: 'minDate',
1998
+ maxDate: 'maxDate',
1999
+ mode: 'mode',
2000
+ type: 'type',
2001
+ monthOffset: 'monthOffset',
2002
+ message: 'message',
2003
+ class: 'class',
2004
+ inverted: 'inverted',
2005
+ variation: 'variation',
2006
+ position: 'position',
2007
+ month: 'month',
2008
+ year: 'year',
2009
+ hours: 'hours',
2010
+ days: 'days',
1406
2011
  },
1407
- invoke: function (query, passedArguments, context) {
1408
- var
1409
- object = instance,
1410
- maxDepth,
1411
- found,
1412
- response
1413
- ;
1414
- passedArguments = passedArguments || queryArguments;
1415
- context = context || element;
1416
- if (typeof query == 'string' && object !== undefined) {
1417
- query = query.split(/[\. ]/);
1418
- maxDepth = query.length - 1;
1419
- $.each(query, function (depth, value) {
1420
- var camelCaseValue = (depth != maxDepth)
1421
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1422
- : query
1423
- ;
1424
- if ($.isPlainObject(object[camelCaseValue]) && (depth != maxDepth)) {
1425
- object = object[camelCaseValue];
1426
- }
1427
- else if (object[camelCaseValue] !== undefined) {
1428
- found = object[camelCaseValue];
1429
- return false;
1430
- }
1431
- else if ($.isPlainObject(object[value]) && (depth != maxDepth)) {
1432
- object = object[value];
1433
- }
1434
- else if (object[value] !== undefined) {
1435
- found = object[value];
1436
- return false;
1437
- }
1438
- else {
1439
- module.error(error.method, query);
1440
- return false;
1441
- }
1442
- });
1443
- }
1444
- if ($.isFunction(found)) {
1445
- response = found.apply(context, passedArguments);
1446
- }
1447
- else if (found !== undefined) {
1448
- response = found;
1449
- }
1450
- if (Array.isArray(returnedValue)) {
1451
- returnedValue.push(response);
1452
- }
1453
- else if (returnedValue !== undefined) {
1454
- returnedValue = [returnedValue, response];
1455
- }
1456
- else if (response !== undefined) {
1457
- returnedValue = response;
1458
- }
1459
- return found;
1460
- }
1461
- };
1462
-
1463
- if (methodInvoked) {
1464
- if (instance === undefined) {
1465
- module.initialize();
1466
- }
1467
- module.invoke(query);
1468
- }
1469
- else {
1470
- if (instance !== undefined) {
1471
- instance.invoke('destroy');
1472
- }
1473
- module.initialize();
1474
- }
1475
- })
1476
- ;
1477
- return (returnedValue !== undefined)
1478
- ? returnedValue
1479
- : this
1480
- ;
1481
- };
1482
-
1483
- $.fn.calendar.settings = {
1484
-
1485
- name : 'Calendar',
1486
- namespace : 'calendar',
1487
-
1488
- silent: false,
1489
- debug: false,
1490
- verbose: false,
1491
- performance: true,
1492
-
1493
- type : 'datetime', // picker type, can be 'datetime', 'date', 'time', 'month', or 'year'
1494
- firstDayOfWeek : 0, // day for first day column (0 = Sunday)
1495
- constantHeight : true, // add rows to shorter months to keep day calendar height consistent (6 rows)
1496
- today : false, // show a 'today/now' button at the bottom of the calendar
1497
- closable : true, // close the popup after selecting a date/time
1498
- monthFirst : true, // month before day when parsing date from text
1499
- touchReadonly : true, // set input to readonly on touch devices
1500
- inline : false, // create the calendar inline instead of inside a popup
1501
- on : null, // when to show the popup (defaults to 'focus' for input, 'click' for others)
1502
- initialDate : null, // date to display initially when no date is selected (null = now)
1503
- startMode : false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')
1504
- minDate : null, // minimum date/time that can be selected, dates/times before are disabled
1505
- maxDate : null, // maximum date/time that can be selected, dates/times after are disabled
1506
- disableYear : false, // disable year selection mode
1507
- disableMonth : false, // disable month selection mode
1508
- disableMinute : false, // disable minute selection mode
1509
- formatInput : true, // format the input text upon input blur and module creation
1510
- startCalendar : null, // jquery object or selector for another calendar that represents the start date of a date range
1511
- endCalendar : null, // jquery object or selector for another calendar that represents the end date of a date range
1512
- multiMonth : 1, // show multiple months when in 'day' mode
1513
- monthOffset : 0, // position current month by offset when multimonth > 1
1514
- minTimeGap : 5,
1515
- showWeekNumbers : false, // show Number of Week at the very first column of a dayView
1516
- disabledHours : [], // specific hour(s) which won't be selectable and contain additional information.
1517
- disabledDates : [], // specific day(s) which won't be selectable and contain additional information.
1518
- disabledDaysOfWeek : [], // day(s) which won't be selectable(s) (0 = Sunday)
1519
- enabledDates : [], // specific day(s) which will be selectable, all other days will be disabled
1520
- eventDates : [], // specific day(s) which will be shown in a different color and using tooltips
1521
- centuryBreak : 60, // starting short year until 99 where it will be assumed to belong to the last century
1522
- currentCentury : 2000, // century to be added to 2-digit years (00 to {centuryBreak}-1)
1523
- selectAdjacentDays : false, // The calendar can show dates from adjacent month. These adjacent month dates can also be made selectable.
1524
- // popup options ('popup', 'on', 'hoverable', and show/hide callbacks are overridden)
1525
- popupOptions: {
1526
- position: 'bottom left',
1527
- lastResort: 'bottom left',
1528
- prefer: 'opposite',
1529
- observeChanges: false,
1530
- hideOnScroll: false
1531
- },
1532
-
1533
- text: {
1534
- days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
1535
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
1536
- dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
1537
- months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
1538
- monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
1539
- today: 'Today',
1540
- now: 'Now',
1541
- am: 'AM',
1542
- pm: 'PM',
1543
- weekNo: 'Week'
1544
- },
1545
-
1546
- formatter: {
1547
- yearHeader: function (date, settings) {
1548
- var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;
1549
- return (decadeYear - 9) + ' - ' + (decadeYear + 2);
1550
- },
1551
- monthHeader: 'YYYY',
1552
- dayHeader: 'MMMM YYYY',
1553
- hourHeader: 'MMMM D, YYYY',
1554
- minuteHeader: 'MMMM D, YYYY',
1555
- dayColumnHeader: function (day, settings) {
1556
- return settings.text.days[day];
1557
- },
1558
- datetime: 'MMMM D, YYYY h:mm A',
1559
- date: 'MMMM D, YYYY',
1560
- time: 'h:mm A',
1561
- cellTime: 'h:mm A',
1562
- month: 'MMMM YYYY',
1563
- year: 'YYYY',
1564
- today: function (settings) {
1565
- return settings.type === 'date' ? settings.text.today : settings.text.now;
1566
- },
1567
- cell: function (cell, date, cellOptions) {
1568
- }
1569
- },
1570
-
1571
- parser: {
1572
- date: function (text, settings) {
1573
- if (text instanceof Date) {
1574
- return text;
1575
- }
1576
- if (!text) {
1577
- return null;
1578
- }
1579
- text = String(text).trim().replace(/([.:\/\-])\s+/g,'$1').replace(/\s+([.:\/-])/g,'$1').replace(/\s+/g,' ');
1580
- if (text.length === 0) {
1581
- return null;
1582
- }
1583
- if(text.match(/^[0-9]{4}[\/\-\.][0-9]{1,2}[\/\-\.][0-9]{1,2}$/)){
1584
- text = text.replace(/[\/\-\.]/g,'/') + ' 00:00:00';
1585
- }
1586
- // Reverse date and month in some cases
1587
- text = settings.monthFirst || !text.match(/^[0-9]{1,2}[\/\-\.]/) ? text : text.replace(/[\/\-\.]/g,'/').replace(/([0-9]+)\/([0-9]+)/,'$2/$1');
1588
- var textDate = new Date(text);
1589
- var numberOnly = text.match(/^[0-9]+$/) !== null;
1590
- if(!numberOnly && !isNaN(textDate.getDate())) {
1591
- return textDate;
1592
- }
1593
- text = text.toLowerCase();
1594
-
1595
- var i, j, k;
1596
- var minute = -1, hour = -1, day = -1, month = -1, year = -1;
1597
- var isAm = undefined;
1598
-
1599
- var isTimeOnly = settings.type === 'time';
1600
- var isDateOnly = settings.type.indexOf('time') < 0;
1601
-
1602
- var words = text.split(settings.regExp.dateWords), word;
1603
- var numbers = text.split(settings.regExp.dateNumbers), number;
1604
-
1605
- var parts;
1606
- var monthString;
1607
-
1608
- if (!isDateOnly) {
1609
- //am/pm
1610
- isAm = $.inArray(settings.text.am.toLowerCase(), words) >= 0 ? true :
1611
- $.inArray(settings.text.pm.toLowerCase(), words) >= 0 ? false : undefined;
1612
-
1613
- //time with ':'
1614
- for (i = 0; i < numbers.length; i++) {
1615
- number = numbers[i];
1616
- if (number.indexOf(':') >= 0) {
1617
- if (hour < 0 || minute < 0) {
1618
- parts = number.split(':');
1619
- for (k = 0; k < Math.min(2, parts.length); k++) {
1620
- j = parseInt(parts[k]);
1621
- if (isNaN(j)) {
1622
- j = 0;
1623
- }
1624
- if (k === 0) {
1625
- hour = j % 24;
1626
- } else {
1627
- minute = j % 60;
1628
- }
1629
- }
1630
- }
1631
- numbers.splice(i, 1);
1632
- }
1633
- }
1634
- }
1635
-
1636
- if (!isTimeOnly) {
1637
- //textual month
1638
- for (i = 0; i < words.length; i++) {
1639
- word = words[i];
1640
- if (word.length <= 0) {
1641
- continue;
1642
- }
1643
- for (j = 0; j < settings.text.months.length; j++) {
1644
- monthString = settings.text.months[j];
1645
- monthString = monthString.substring(0, word.length).toLowerCase();
1646
- if (monthString === word) {
1647
- month = j + 1;
1648
- break;
1649
- }
1650
- }
1651
- if (month >= 0) {
1652
- break;
1653
- }
1654
- }
1655
-
1656
- //year > settings.centuryBreak
1657
- for (i = 0; i < numbers.length; i++) {
1658
- j = parseInt(numbers[i]);
1659
- if (isNaN(j)) {
1660
- continue;
1661
- }
1662
- if (j >= settings.centuryBreak && i === numbers.length-1) {
1663
- if (j <= 99) {
1664
- j += settings.currentCentury - 100;
1665
- }
1666
- year = j;
1667
- numbers.splice(i, 1);
1668
- break;
1669
- }
1670
- }
1671
-
1672
- //numeric month
1673
- if (month < 0) {
1674
- for (i = 0; i < numbers.length; i++) {
1675
- k = i > 1 || settings.monthFirst ? i : i === 1 ? 0 : 1;
1676
- j = parseInt(numbers[k]);
1677
- if (isNaN(j)) {
1678
- continue;
1679
- }
1680
- if (1 <= j && j <= 12) {
1681
- month = j;
1682
- numbers.splice(k, 1);
1683
- break;
1684
- }
1685
- }
1686
- }
1687
-
1688
- //day
1689
- for (i = 0; i < numbers.length; i++) {
1690
- j = parseInt(numbers[i]);
1691
- if (isNaN(j)) {
1692
- continue;
1693
- }
1694
- if (1 <= j && j <= 31) {
1695
- day = j;
1696
- numbers.splice(i, 1);
1697
- break;
1698
- }
1699
- }
1700
-
1701
- //year <= settings.centuryBreak
1702
- if (year < 0) {
1703
- for (i = numbers.length - 1; i >= 0; i--) {
1704
- j = parseInt(numbers[i]);
1705
- if (isNaN(j)) {
1706
- continue;
1707
- }
1708
- if (j <= 99) {
1709
- j += settings.currentCentury;
1710
- }
1711
- year = j;
1712
- numbers.splice(i, 1);
1713
- break;
1714
- }
1715
- }
1716
- }
1717
-
1718
- if (!isDateOnly) {
1719
- //hour
1720
- if (hour < 0) {
1721
- for (i = 0; i < numbers.length; i++) {
1722
- j = parseInt(numbers[i]);
1723
- if (isNaN(j)) {
1724
- continue;
1725
- }
1726
- if (0 <= j && j <= 23) {
1727
- hour = j;
1728
- numbers.splice(i, 1);
1729
- break;
1730
- }
1731
- }
1732
- }
1733
-
1734
- //minute
1735
- if (minute < 0) {
1736
- for (i = 0; i < numbers.length; i++) {
1737
- j = parseInt(numbers[i]);
1738
- if (isNaN(j)) {
1739
- continue;
1740
- }
1741
- if (0 <= j && j <= 59) {
1742
- minute = j;
1743
- numbers.splice(i, 1);
1744
- break;
1745
- }
1746
- }
1747
- }
1748
- }
1749
-
1750
- if (minute < 0 && hour < 0 && day < 0 && month < 0 && year < 0) {
1751
- return null;
1752
- }
1753
-
1754
- if (minute < 0) {
1755
- minute = 0;
1756
- }
1757
- if (hour < 0) {
1758
- hour = 0;
1759
- }
1760
- if (day < 0) {
1761
- day = 1;
1762
- }
1763
- if (month < 0) {
1764
- month = 1;
1765
- }
1766
- if (year < 0) {
1767
- year = new Date().getFullYear();
1768
- }
1769
-
1770
- if (isAm !== undefined) {
1771
- if (isAm) {
1772
- if (hour === 12) {
1773
- hour = 0;
1774
- }
1775
- } else if (hour < 12) {
1776
- hour += 12;
1777
- }
1778
- }
1779
-
1780
- var date = new Date(year, month - 1, day, hour, minute);
1781
- if (date.getMonth() !== month - 1 || date.getFullYear() !== year) {
1782
- //month or year don't match up, switch to last day of the month
1783
- date = new Date(year, month, 0, hour, minute);
1784
- }
1785
- return isNaN(date.getTime()) ? null : date;
1786
- }
1787
- },
1788
-
1789
- // callback before date is changed, return false to cancel the change
1790
- onBeforeChange: function (date, text, mode) {
1791
- return true;
1792
- },
1793
-
1794
- // callback when date changes
1795
- onChange: function (date, text, mode) {
1796
- },
1797
-
1798
- // callback before show animation, return false to prevent show
1799
- onShow: function () {
1800
- },
1801
-
1802
- // callback after show animation
1803
- onVisible: function () {
1804
- },
1805
-
1806
- // callback before hide animation, return false to prevent hide
1807
- onHide: function () {
1808
- },
1809
-
1810
- // callback after hide animation
1811
- onHidden: function () {
1812
- },
1813
-
1814
- // callback before item is selected, return false to prevent selection
1815
- onSelect: function (date, mode) {
1816
- },
1817
-
1818
- // is the given date disabled?
1819
- isDisabled: function (date, mode) {
1820
- return false;
1821
- },
1822
-
1823
- selector: {
1824
- popup: '.ui.popup',
1825
- input: 'input',
1826
- activator: 'input',
1827
- append: '.inline.field,.inline.fields'
1828
- },
1829
-
1830
- regExp: {
1831
- dateWords: /[^A-Za-z\u00C0-\u024F]+/g,
1832
- dateNumbers: /[^\d:]+/g,
1833
- token: /d{1,4}|D{1,2}|M{1,4}|YY(?:YY)?|([Hhmsw])\1?|[SAaY]|"[^"]*"|'[^']*'/g
1834
- },
1835
-
1836
- error: {
1837
- popup: 'UI Popup, a required component is not included in this page',
1838
- method: 'The method you called is not defined.'
1839
- },
1840
-
1841
- className: {
1842
- calendar: 'calendar',
1843
- active: 'active',
1844
- popup: 'ui popup',
1845
- grid: 'ui equal width grid',
1846
- column: 'column',
1847
- table: 'ui celled center aligned unstackable table',
1848
- inverted: 'inverted',
1849
- prev: 'prev link',
1850
- next: 'next link',
1851
- prevIcon: 'chevron left icon',
1852
- nextIcon: 'chevron right icon',
1853
- link: 'link',
1854
- cell: 'link',
1855
- disabledCell: 'disabled',
1856
- weekCell: 'disabled',
1857
- adjacentCell: 'adjacent',
1858
- activeCell: 'active',
1859
- rangeCell: 'range',
1860
- focusCell: 'focus',
1861
- todayCell: 'today',
1862
- today: 'today link',
1863
- disabled: 'disabled'
1864
- },
1865
-
1866
- metadata: {
1867
- date: 'date',
1868
- focusDate: 'focusDate',
1869
- startDate: 'startDate',
1870
- endDate: 'endDate',
1871
- minDate: 'minDate',
1872
- maxDate: 'maxDate',
1873
- mode: 'mode',
1874
- type: 'type',
1875
- monthOffset: 'monthOffset',
1876
- message: 'message',
1877
- class: 'class',
1878
- inverted: 'inverted',
1879
- variation: 'variation',
1880
- position: 'position',
1881
- month: 'month',
1882
- year: 'year',
1883
- hours: 'hours',
1884
- days: 'days'
1885
- },
1886
-
1887
- eventClass: 'blue'
1888
- };
1889
2012
 
2013
+ eventClass: 'blue',
2014
+ };
1890
2015
  })(jQuery, window, document);