fomantic-ui 2.9.1-beta.2 → 2.9.1-beta.21

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