lato_core 1.1.5 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (307) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +29 -0
  4. data/Rakefile +1 -22
  5. data/app/assets/config/lato_core_manifest.js +2 -0
  6. data/app/assets/fonts/lato_core/fontawesome-webfont.eot +0 -0
  7. data/app/assets/fonts/lato_core/fontawesome-webfont.svg +2671 -0
  8. data/app/assets/fonts/lato_core/fontawesome-webfont.ttf +0 -0
  9. data/app/assets/fonts/lato_core/fontawesome-webfont.woff +0 -0
  10. data/app/assets/fonts/lato_core/fontawesome-webfont.woff2 +0 -0
  11. data/app/assets/fonts/lato_core/lato-bold-webfont.eot +0 -0
  12. data/app/assets/fonts/lato_core/lato-bold-webfont.svg +4551 -0
  13. data/app/assets/fonts/lato_core/lato-bold-webfont.ttf +0 -0
  14. data/app/assets/fonts/lato_core/lato-bold-webfont.woff +0 -0
  15. data/app/assets/fonts/lato_core/lato-bold-webfont.woff2 +0 -0
  16. data/app/assets/fonts/lato_core/lato-regular-webfont.eot +0 -0
  17. data/app/assets/fonts/lato_core/lato-regular-webfont.svg +4241 -0
  18. data/app/assets/fonts/lato_core/lato-regular-webfont.ttf +0 -0
  19. data/app/assets/fonts/lato_core/lato-regular-webfont.woff +0 -0
  20. data/app/assets/fonts/lato_core/lato-regular-webfont.woff2 +0 -0
  21. data/app/assets/images/lato_core/editor-icons.svg +1 -0
  22. data/app/assets/images/lato_core/logo-negative.svg +13 -0
  23. data/app/assets/images/lato_core/logo.svg +1 -0
  24. data/app/assets/images/lato_core/user.png +0 -0
  25. data/app/assets/javascripts/lato_core/application.js +28 -0
  26. data/app/assets/javascripts/lato_core/initializers/Charts.js +36 -0
  27. data/app/assets/javascripts/lato_core/initializers/Elements.js +67 -0
  28. data/app/assets/javascripts/lato_core/initializers/Inputs.js +201 -0
  29. data/app/assets/javascripts/lato_core/initializers/Layout.js +37 -0
  30. data/app/assets/javascripts/lato_core/initializers/SortableManager.js +66 -0
  31. data/app/assets/javascripts/lato_core/interfaces/Modal.js +28 -0
  32. data/app/assets/javascripts/lato_core/vendors/Sortable.min.js +2 -0
  33. data/app/assets/javascripts/lato_core/vendors/chart.bundle.js +17220 -0
  34. data/app/assets/javascripts/lato_core/vendors/dropzone.js +1767 -0
  35. data/app/assets/javascripts/lato_core/vendors/jquery.datetimepicker.full.js +3243 -0
  36. data/app/assets/javascripts/lato_core/vendors/jquery.floatThead.js +1106 -0
  37. data/app/assets/javascripts/lato_core/vendors/jquery.selectize.js +3829 -0
  38. data/app/assets/javascripts/lato_core/vendors/jquery.trumbowyg.js +1603 -0
  39. data/app/assets/stylesheets/lato_core/application.scss +23 -0
  40. data/app/assets/stylesheets/lato_core/base/_base.scss +35 -0
  41. data/app/assets/stylesheets/lato_core/base/_button.scss +23 -0
  42. data/app/assets/stylesheets/lato_core/base/_grid.scss +258 -0
  43. data/app/assets/stylesheets/lato_core/base/_helpers.scss +29 -0
  44. data/app/assets/stylesheets/lato_core/base/_mixin.scss +37 -0
  45. data/app/assets/stylesheets/lato_core/base/_normalize.scss +424 -0
  46. data/app/assets/stylesheets/lato_core/base/_table.scss +47 -0
  47. data/app/assets/stylesheets/lato_core/base/_typography.scss +23 -0
  48. data/app/assets/stylesheets/lato_core/cells/_cells.scss +4 -0
  49. data/app/assets/stylesheets/lato_core/cells/charts/_bar.scss +3 -0
  50. data/app/assets/stylesheets/lato_core/cells/charts/_charts.scss +2 -0
  51. data/app/assets/stylesheets/lato_core/cells/charts/_general.scss +7 -0
  52. data/app/assets/stylesheets/lato_core/cells/elements/_block.scss +12 -0
  53. data/app/assets/stylesheets/lato_core/cells/elements/_button.scss +132 -0
  54. data/app/assets/stylesheets/lato_core/cells/elements/_buttongroup.scss +25 -0
  55. data/app/assets/stylesheets/lato_core/cells/elements/_code.scss +8 -0
  56. data/app/assets/stylesheets/lato_core/cells/elements/_elements.scss +10 -0
  57. data/app/assets/stylesheets/lato_core/cells/elements/_flash.scss +74 -0
  58. data/app/assets/stylesheets/lato_core/cells/elements/_modal.scss +76 -0
  59. data/app/assets/stylesheets/lato_core/cells/elements/_pagination.scss +64 -0
  60. data/app/assets/stylesheets/lato_core/cells/elements/_row.scss +3 -0
  61. data/app/assets/stylesheets/lato_core/cells/elements/_table.scss +57 -0
  62. data/app/assets/stylesheets/lato_core/cells/elements/_title.scss +32 -0
  63. data/app/assets/stylesheets/lato_core/cells/inputs/_checkbox.scss +42 -0
  64. data/app/assets/stylesheets/lato_core/cells/inputs/_datetime.scss +23 -0
  65. data/app/assets/stylesheets/lato_core/cells/inputs/_dropzone.scss +12 -0
  66. data/app/assets/stylesheets/lato_core/cells/inputs/_editor.scss +3 -0
  67. data/app/assets/stylesheets/lato_core/cells/inputs/_email.scss +3 -0
  68. data/app/assets/stylesheets/lato_core/cells/inputs/_form.scss +3 -0
  69. data/app/assets/stylesheets/lato_core/cells/inputs/_general.scss +51 -0
  70. data/app/assets/stylesheets/lato_core/cells/inputs/_geolocalization.scss +12 -0
  71. data/app/assets/stylesheets/lato_core/cells/inputs/_inputs.scss +14 -0
  72. data/app/assets/stylesheets/lato_core/cells/inputs/_number.scss +3 -0
  73. data/app/assets/stylesheets/lato_core/cells/inputs/_password.scss +3 -0
  74. data/app/assets/stylesheets/lato_core/cells/inputs/_select.scss +47 -0
  75. data/app/assets/stylesheets/lato_core/cells/inputs/_sortableblock.scss +51 -0
  76. data/app/assets/stylesheets/lato_core/cells/inputs/_text.scss +3 -0
  77. data/app/assets/stylesheets/lato_core/cells/inputs/_textarea.scss +25 -0
  78. data/app/assets/stylesheets/lato_core/cells/widgets/_index.scss +74 -0
  79. data/app/assets/stylesheets/lato_core/cells/widgets/_widgets.scss +1 -0
  80. data/app/assets/stylesheets/lato_core/layouts/_admin.scss +352 -0
  81. data/app/assets/stylesheets/lato_core/layouts/_authentication.scss +10 -0
  82. data/app/assets/stylesheets/lato_core/layouts/_layouts.scss +2 -0
  83. data/app/assets/stylesheets/lato_core/pages/_dashboard.scss +35 -0
  84. data/app/assets/stylesheets/lato_core/pages/_login.scss +7 -0
  85. data/app/assets/stylesheets/lato_core/pages/_pages.scss +2 -0
  86. data/app/assets/stylesheets/lato_core/partials/_dynamic_data_to_js.scss +3 -0
  87. data/app/assets/stylesheets/lato_core/partials/_partials.scss +1 -0
  88. data/app/assets/stylesheets/lato_core/theme.scss.erb +127 -0
  89. data/app/assets/stylesheets/lato_core/vendors/_datetimepicker.css +568 -0
  90. data/app/assets/stylesheets/lato_core/vendors/_dropzone.css +388 -0
  91. data/app/assets/stylesheets/lato_core/vendors/_fontawesome.css +2341 -0
  92. data/app/assets/stylesheets/lato_core/vendors/_scrollbar.css +904 -0
  93. data/app/assets/stylesheets/lato_core/vendors/_selectize.css +324 -0
  94. data/app/assets/stylesheets/lato_core/vendors/_trumbowyg.css +584 -0
  95. data/app/assets/stylesheets/lato_core/vendors/_vendors.scss +6 -0
  96. data/app/assets/stylesheets/lato_core/widgets/_systeminfo.scss +21 -0
  97. data/app/assets/stylesheets/lato_core/widgets/_widgets.scss +1 -0
  98. data/app/cells/lato_core/charts/bar/vertical/cell.rb +57 -0
  99. data/app/cells/lato_core/charts/bar/vertical/views/show.html.erb +7 -0
  100. data/app/cells/lato_core/elements/block/cell.rb +39 -0
  101. data/app/cells/lato_core/elements/block/views/close.html.erb +1 -0
  102. data/app/cells/lato_core/elements/block/views/open.html.erb +4 -0
  103. data/app/cells/lato_core/elements/button/cell.rb +59 -0
  104. data/app/cells/lato_core/elements/button/views/button.html.erb +27 -0
  105. data/app/cells/lato_core/elements/button/views/link.html.erb +65 -0
  106. data/app/cells/lato_core/elements/buttongroup/cell.rb +33 -0
  107. data/app/cells/lato_core/elements/buttongroup/views/show.html.erb +7 -0
  108. data/app/cells/lato_core/elements/code/cell.rb +36 -0
  109. data/app/cells/lato_core/elements/code/views/close.html.erb +2 -0
  110. data/app/cells/lato_core/elements/code/views/open.html.erb +2 -0
  111. data/app/cells/lato_core/elements/flash/cell.rb +35 -0
  112. data/app/cells/lato_core/elements/flash/views/show.html.erb +11 -0
  113. data/app/cells/lato_core/elements/icon/cell.rb +31 -0
  114. data/app/cells/lato_core/elements/icon/views/show.html.erb +1 -0
  115. data/app/cells/lato_core/elements/modal/cell.rb +31 -0
  116. data/app/cells/lato_core/elements/modal/views/show.html.erb +21 -0
  117. data/app/cells/lato_core/elements/pagination/cell.rb +68 -0
  118. data/app/cells/lato_core/elements/pagination/views/show.html.erb +59 -0
  119. data/app/cells/lato_core/elements/row/cell.rb +37 -0
  120. data/app/cells/lato_core/elements/row/views/close.html.erb +1 -0
  121. data/app/cells/lato_core/elements/row/views/open.html.erb +3 -0
  122. data/app/cells/lato_core/elements/table/body/cell.rb +37 -0
  123. data/app/cells/lato_core/elements/table/body/views/close.html.erb +1 -0
  124. data/app/cells/lato_core/elements/table/body/views/open.html.erb +3 -0
  125. data/app/cells/lato_core/elements/table/container/cell.rb +41 -0
  126. data/app/cells/lato_core/elements/table/container/views/close.html.erb +2 -0
  127. data/app/cells/lato_core/elements/table/container/views/open.html.erb +7 -0
  128. data/app/cells/lato_core/elements/table/head/cell.rb +33 -0
  129. data/app/cells/lato_core/elements/table/head/views/show.html.erb +7 -0
  130. data/app/cells/lato_core/elements/table/row/cell.rb +49 -0
  131. data/app/cells/lato_core/elements/table/row/views/show.html.erb +35 -0
  132. data/app/cells/lato_core/elements/title/cell.rb +52 -0
  133. data/app/cells/lato_core/elements/title/views/show.html.erb +4 -0
  134. data/app/cells/lato_core/inputs/checkbox/cell.rb +38 -0
  135. data/app/cells/lato_core/inputs/checkbox/views/show.html.erb +20 -0
  136. data/app/cells/lato_core/inputs/datetime/cell.rb +53 -0
  137. data/app/cells/lato_core/inputs/datetime/views/show.html.erb +19 -0
  138. data/app/cells/lato_core/inputs/dropzone/cell.rb +37 -0
  139. data/app/cells/lato_core/inputs/dropzone/views/show.html.erb +24 -0
  140. data/app/cells/lato_core/inputs/editor/cell.rb +37 -0
  141. data/app/cells/lato_core/inputs/editor/views/show.html.erb +12 -0
  142. data/app/cells/lato_core/inputs/email/cell.rb +40 -0
  143. data/app/cells/lato_core/inputs/email/views/show.html.erb +19 -0
  144. data/app/cells/lato_core/inputs/form/cell.rb +39 -0
  145. data/app/cells/lato_core/inputs/form/views/close.html.erb +1 -0
  146. data/app/cells/lato_core/inputs/form/views/open.html.erb +12 -0
  147. data/app/cells/lato_core/inputs/geolocalization/cell.rb +51 -0
  148. data/app/cells/lato_core/inputs/geolocalization/views/show.html.erb +26 -0
  149. data/app/cells/lato_core/inputs/number/cell.rb +44 -0
  150. data/app/cells/lato_core/inputs/number/views/show.html.erb +25 -0
  151. data/app/cells/lato_core/inputs/password/cell.rb +42 -0
  152. data/app/cells/lato_core/inputs/password/views/show.html.erb +21 -0
  153. data/app/cells/lato_core/inputs/select/cell.rb +56 -0
  154. data/app/cells/lato_core/inputs/select/views/show.html.erb +25 -0
  155. data/app/cells/lato_core/inputs/shared/help.html.erb +7 -0
  156. data/app/cells/lato_core/inputs/shared/label.html.erb +11 -0
  157. data/app/cells/lato_core/inputs/sortableblock/cell.rb +39 -0
  158. data/app/cells/lato_core/inputs/sortableblock/views/show.html.erb +40 -0
  159. data/app/cells/lato_core/inputs/text/cell.rb +42 -0
  160. data/app/cells/lato_core/inputs/text/views/show.html.erb +21 -0
  161. data/app/cells/lato_core/inputs/textarea/cell.rb +41 -0
  162. data/app/cells/lato_core/inputs/textarea/views/show.html.erb +16 -0
  163. data/app/cells/lato_core/widgets/index/cell.rb +215 -0
  164. data/app/cells/lato_core/widgets/index/views/partials/new.html.erb +3 -0
  165. data/app/cells/lato_core/widgets/index/views/partials/pagination.html.erb +3 -0
  166. data/app/cells/lato_core/widgets/index/views/partials/search.html.erb +17 -0
  167. data/app/cells/lato_core/widgets/index/views/show.html.erb +45 -0
  168. data/app/controllers/lato_core/api/api_controller.rb +5 -0
  169. data/app/controllers/lato_core/application_controller.rb +9 -1
  170. data/app/controllers/lato_core/back/authentication_controller.rb +33 -99
  171. data/app/controllers/lato_core/back/back_controller.rb +5 -14
  172. data/app/controllers/lato_core/back/dashboard_controller.rb +13 -0
  173. data/app/controllers/lato_core/back/superusers_controller.rb +97 -113
  174. data/app/controllers/lato_core/doc/cells_charts_controller.rb +7 -0
  175. data/app/controllers/lato_core/doc/cells_elements_controller.rb +31 -0
  176. data/app/controllers/lato_core/doc/cells_inputs_controller.rb +33 -0
  177. data/app/controllers/lato_core/doc/cells_widgets_controller.rb +10 -0
  178. data/app/controllers/lato_core/doc/doc_controller.rb +17 -0
  179. data/app/controllers/lato_core/doc/general_controller.rb +13 -0
  180. data/app/helpers/lato_core/application_helper.rb +4 -0
  181. data/app/jobs/lato_core/application_job.rb +4 -0
  182. data/app/mailers/lato_core/application_mailer.rb +2 -5
  183. data/app/models/lato_core/application_record.rb +5 -0
  184. data/app/models/lato_core/superuser.rb +11 -16
  185. data/app/models/lato_core/superuser/entity_helpers.rb +29 -0
  186. data/app/views/lato_core/back/authentication/index.html.erb +25 -0
  187. data/app/views/lato_core/back/dashboard/index.html.erb +29 -0
  188. data/app/views/lato_core/back/superusers/edit.html.erb +10 -15
  189. data/app/views/lato_core/back/superusers/index.html.erb +16 -27
  190. data/app/views/lato_core/back/superusers/new.html.erb +8 -13
  191. data/app/views/lato_core/back/superusers/shared/_form.html.erb +47 -55
  192. data/app/views/lato_core/back/superusers/show.html.erb +65 -1
  193. data/app/views/lato_core/doc/cells_charts/bar_vertical.erb +64 -0
  194. data/app/views/lato_core/doc/cells_elements/block.html.erb +172 -0
  195. data/app/views/lato_core/doc/cells_elements/button.html.erb +375 -0
  196. data/app/views/lato_core/doc/cells_elements/buttongroup.html.erb +101 -0
  197. data/app/views/lato_core/doc/cells_elements/flash_messages.html.erb +123 -0
  198. data/app/views/lato_core/doc/cells_elements/icon.html.erb +58 -0
  199. data/app/views/lato_core/doc/cells_elements/modal.html.erb +89 -0
  200. data/app/views/lato_core/doc/cells_elements/pagination.html.erb +149 -0
  201. data/app/views/lato_core/doc/cells_elements/row.html.erb +62 -0
  202. data/app/views/lato_core/doc/cells_elements/table.html.erb +272 -0
  203. data/app/views/lato_core/doc/cells_elements/table_body.html.erb +118 -0
  204. data/app/views/lato_core/doc/cells_elements/table_head.html.erb +110 -0
  205. data/app/views/lato_core/doc/cells_elements/table_row.html.erb +212 -0
  206. data/app/views/lato_core/doc/cells_elements/title.html.erb +70 -0
  207. data/app/views/lato_core/doc/cells_inputs/checkbox.html.erb +101 -0
  208. data/app/views/lato_core/doc/cells_inputs/datetime.html.erb +178 -0
  209. data/app/views/lato_core/doc/cells_inputs/dropzone.html.erb +114 -0
  210. data/app/views/lato_core/doc/cells_inputs/editor.html.erb +59 -0
  211. data/app/views/lato_core/doc/cells_inputs/email.html.erb +79 -0
  212. data/app/views/lato_core/doc/cells_inputs/form.html.erb +242 -0
  213. data/app/views/lato_core/doc/cells_inputs/geolocalization.html.erb +157 -0
  214. data/app/views/lato_core/doc/cells_inputs/number.html.erb +100 -0
  215. data/app/views/lato_core/doc/cells_inputs/password.html.erb +79 -0
  216. data/app/views/lato_core/doc/cells_inputs/select.html.erb +124 -0
  217. data/app/views/lato_core/doc/cells_inputs/sortableblock.html.erb +72 -0
  218. data/app/views/lato_core/doc/cells_inputs/text.html.erb +204 -0
  219. data/app/views/lato_core/doc/cells_inputs/textarea.html.erb +104 -0
  220. data/app/views/lato_core/doc/cells_widgets/index.html.erb +163 -0
  221. data/app/views/lato_core/doc/doc/index.html.erb +95 -0
  222. data/app/views/lato_core/doc/general/generators.html.erb +60 -0
  223. data/app/views/lato_core/doc/general/installation.html.erb +49 -0
  224. data/app/views/lato_core/doc/general/languages.html.erb +67 -0
  225. data/app/views/lato_core/doc/general/personalization.html.erb +177 -0
  226. data/app/views/lato_core/doc/shared/_modal_content.html.erb +4 -0
  227. data/app/views/lato_core/doc/shared/_sortableblock_partial.html.erb +1 -0
  228. data/app/views/lato_core/partials/_dynamic_data_to_js.html.erb +3 -0
  229. data/app/views/lato_core/partials/_gmaps.html.erb +5 -0
  230. data/app/views/lato_core/widgets/_systeminfo.html.erb +15 -0
  231. data/app/views/layouts/lato_core/admin.html.erb +44 -0
  232. data/app/views/layouts/lato_core/authentication.html.erb +22 -0
  233. data/app/views/layouts/lato_core/partials/_back.html.erb +5 -0
  234. data/app/views/layouts/lato_core/partials/_load_javascript.html.erb +4 -0
  235. data/app/views/layouts/lato_core/partials/_load_partials.html.erb +5 -0
  236. data/app/views/layouts/lato_core/partials/_load_stylesheet.html.erb +4 -0
  237. data/app/views/layouts/lato_core/partials/_logo.html.erb +9 -0
  238. data/app/views/layouts/lato_core/partials/_menu.html.erb +67 -0
  239. data/app/views/layouts/lato_core/partials/_profile.html.erb +19 -0
  240. data/app/views/layouts/lato_core/partials/_title.html.erb +3 -0
  241. data/app/views/layouts/lato_core/partials/_widgets.html.erb +13 -0
  242. data/config/configs.yml +102 -0
  243. data/config/initializers/assets.rb +9 -0
  244. data/config/initializers/init_system.rb +39 -0
  245. data/config/languages/default.yml +63 -0
  246. data/config/languages/it.yml +63 -0
  247. data/config/routes.rb +10 -13
  248. data/config/routes/api.rb +3 -0
  249. data/config/routes/back.rb +10 -0
  250. data/config/routes/doc.rb +48 -0
  251. data/db/migrate/20160224181217_create_lato_core_superusers.rb +8 -2
  252. data/lib/generators/lato_core/crud_generator.rb +26 -0
  253. data/lib/generators/lato_core/initializer_generator.rb +46 -0
  254. data/lib/generators/lato_core/templates/assets/images/logo.svg +13 -0
  255. data/{config/initializers/lists.rb → lib/generators/lato_core/templates/assets/javascripts/application.js} +0 -0
  256. data/lib/generators/lato_core/templates/assets/stylesheets/application.scss +2 -0
  257. data/lib/generators/lato_core/templates/assets/stylesheets/theme.scss.erb +13 -0
  258. data/lib/generators/lato_core/templates/controllers/application_controller.rb +13 -0
  259. data/lib/generators/lato_core/templates/controllers/crud_controller.rb +87 -0
  260. data/lib/generators/lato_core/templates/views/application/index.html.erb +16 -0
  261. data/lib/generators/lato_core/templates/views/crud/edit.html.erb +18 -0
  262. data/lib/generators/lato_core/templates/views/crud/index.html.erb +29 -0
  263. data/lib/generators/lato_core/templates/views/crud/new.html.erb +18 -0
  264. data/lib/generators/lato_core/templates/views/crud/shared/_form.html.erb +25 -0
  265. data/lib/generators/lato_core/templates/views/crud/show.html.erb +16 -0
  266. data/lib/lato_core.rb +6 -5
  267. data/lib/lato_core/cell.rb +28 -0
  268. data/lib/lato_core/engine.rb +16 -13
  269. data/lib/lato_core/helper.rb +11 -0
  270. data/lib/lato_core/helpers/cells.rb +20 -0
  271. data/lib/lato_core/helpers/general.rb +16 -0
  272. data/lib/lato_core/interface.rb +17 -14
  273. data/lib/lato_core/interfaces/apihelpers.rb +39 -0
  274. data/lib/lato_core/interfaces/application.rb +65 -0
  275. data/lib/lato_core/interfaces/authentication.rb +41 -0
  276. data/lib/lato_core/interfaces/cells.rb +41 -0
  277. data/lib/lato_core/interfaces/general.rb +39 -0
  278. data/lib/lato_core/interfaces/layout.rb +213 -0
  279. data/lib/lato_core/interfaces/modules.rb +110 -0
  280. data/lib/lato_core/interfaces/token.rb +25 -0
  281. data/lib/lato_core/version.rb +3 -0
  282. data/lib/tasks/lato_core_tasks.rake +4 -8
  283. data/lib/tasks/lato_tasks.rake +83 -0
  284. metadata +407 -33
  285. data/app/controllers/lato_core/api/v1/api_controller.rb +0 -8
  286. data/app/mailers/lato_core/superusers_mailer.rb +0 -27
  287. data/app/views/lato_core/back/authentication/login.html.erb +0 -45
  288. data/app/views/lato_core/back/authentication/password_edit.html.erb +0 -45
  289. data/app/views/lato_core/back/authentication/password_forget.html.erb +0 -36
  290. data/app/views/lato_core/back/back/home.html.erb +0 -20
  291. data/app/views/lato_core/mailers/layouts/mailer.html.erb +0 -9
  292. data/app/views/lato_core/mailers/layouts/mailer.text.erb +0 -1
  293. data/app/views/lato_core/mailers/superusers/notify.html.erb +0 -2
  294. data/app/views/lato_core/mailers/superusers/recover_password.html.erb +0 -4
  295. data/config/config.yml +0 -8
  296. data/config/example.yml +0 -66
  297. data/config/initializers/init.rb +0 -15
  298. data/config/initializers/ram.rb +0 -14
  299. data/lang/default.yml +0 -61
  300. data/lang/en.yml +0 -61
  301. data/lib/lato_core/interface/authentication.rb +0 -26
  302. data/lib/lato_core/interface/cache.rb +0 -23
  303. data/lib/lato_core/interface/communication.rb +0 -87
  304. data/lib/lato_core/interface/languages.rb +0 -51
  305. data/lib/lato_core/interface/navigation.rb +0 -95
  306. data/lib/lato_core/interface/session.rb +0 -57
  307. data/lib/lato_core/interface/superusers.rb +0 -134
@@ -0,0 +1,3243 @@
1
+ /*!
2
+ * @copyright Copyright © Kartik Visweswaran, Krajee.com, 2014 - 2017
3
+ * @version 1.3.4
4
+ *
5
+ * Date formatter utility library that allows formatting date/time variables or Date objects using PHP DateTime format.
6
+ * This library is a standalone javascript library and does not depend on other libraries or plugins like jQuery.
7
+ *
8
+ * @see http://php.net/manual/en/function.date.php
9
+ *
10
+ * For more JQuery plugins visit http://plugins.krajee.com
11
+ * For more Yii related demos visit http://demos.krajee.com
12
+ */
13
+ var DateFormatter;
14
+ (function () {
15
+ "use strict";
16
+
17
+ var _compare, _lpad, _extend, _indexOf, defaultSettings, DAY, HOUR;
18
+ DAY = 1000 * 60 * 60 * 24;
19
+ HOUR = 3600;
20
+
21
+ _compare = function (str1, str2) {
22
+ return typeof(str1) === 'string' && typeof(str2) === 'string' && str1.toLowerCase() === str2.toLowerCase();
23
+ };
24
+ _lpad = function (value, length, chr) {
25
+ var val = value.toString();
26
+ chr = chr || '0';
27
+ return val.length < length ? _lpad(chr + val, length) : val;
28
+ };
29
+ _extend = function (out) {
30
+ var i, obj;
31
+ out = out || {};
32
+ for (i = 1; i < arguments.length; i++) {
33
+ obj = arguments[i];
34
+ if (!obj) {
35
+ continue;
36
+ }
37
+ for (var key in obj) {
38
+ if (obj.hasOwnProperty(key)) {
39
+ if (typeof obj[key] === 'object') {
40
+ _extend(out[key], obj[key]);
41
+ } else {
42
+ out[key] = obj[key];
43
+ }
44
+ }
45
+ }
46
+ }
47
+ return out;
48
+ };
49
+ _indexOf = function (val, arr) {
50
+ for (var i = 0; i < arr.length; i++) {
51
+ if (arr[i].toLowerCase() === val.toLowerCase()) {
52
+ return i;
53
+ }
54
+ }
55
+ return -1;
56
+ };
57
+ defaultSettings = {
58
+ dateSettings: {
59
+ days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
60
+ daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
61
+ months: [
62
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July',
63
+ 'August', 'September', 'October', 'November', 'December'
64
+ ],
65
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
66
+ meridiem: ['AM', 'PM'],
67
+ ordinal: function (number) {
68
+ var n = number % 10, suffixes = {1: 'st', 2: 'nd', 3: 'rd'};
69
+ return Math.floor(number % 100 / 10) === 1 || !suffixes[n] ? 'th' : suffixes[n];
70
+ }
71
+ },
72
+ separators: /[ \-+\/\.T:@]/g,
73
+ validParts: /[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,
74
+ intParts: /[djwNzmnyYhHgGis]/g,
75
+ tzParts: /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
76
+ tzClip: /[^-+\dA-Z]/g
77
+ };
78
+
79
+ DateFormatter = function (options) {
80
+ var self = this, config = _extend(defaultSettings, options);
81
+ self.dateSettings = config.dateSettings;
82
+ self.separators = config.separators;
83
+ self.validParts = config.validParts;
84
+ self.intParts = config.intParts;
85
+ self.tzParts = config.tzParts;
86
+ self.tzClip = config.tzClip;
87
+ };
88
+
89
+ DateFormatter.prototype = {
90
+ constructor: DateFormatter,
91
+ getMonth: function (val) {
92
+ var self = this, i;
93
+ i = _indexOf(val, self.dateSettings.monthsShort) + 1;
94
+ if (i === 0) {
95
+ i = _indexOf(val, self.dateSettings.months) + 1;
96
+ }
97
+ return i;
98
+ },
99
+ parseDate: function (vDate, vFormat) {
100
+ var self = this, vFormatParts, vDateParts, i, vDateFlag = false, vTimeFlag = false, vDatePart, iDatePart,
101
+ vSettings = self.dateSettings, vMonth, vMeriIndex, vMeriOffset, len, mer,
102
+ out = {date: null, year: null, month: null, day: null, hour: 0, min: 0, sec: 0};
103
+ if (!vDate) {
104
+ return null;
105
+ }
106
+ if (vDate instanceof Date) {
107
+ return vDate;
108
+ }
109
+ if (vFormat === 'U') {
110
+ i = parseInt(vDate);
111
+ return i ? new Date(i * 1000) : vDate;
112
+ }
113
+ switch (typeof vDate) {
114
+ case 'number':
115
+ return new Date(vDate);
116
+ case 'string':
117
+ break;
118
+ default:
119
+ return null;
120
+ }
121
+ vFormatParts = vFormat.match(self.validParts);
122
+ if (!vFormatParts || vFormatParts.length === 0) {
123
+ throw new Error("Invalid date format definition.");
124
+ }
125
+ vDateParts = vDate.replace(self.separators, '\0').split('\0');
126
+ for (i = 0; i < vDateParts.length; i++) {
127
+ vDatePart = vDateParts[i];
128
+ iDatePart = parseInt(vDatePart);
129
+ switch (vFormatParts[i]) {
130
+ case 'y':
131
+ case 'Y':
132
+ if (iDatePart) {
133
+ len = vDatePart.length;
134
+ out.year = len === 2 ? parseInt((iDatePart < 70 ? '20' : '19') + vDatePart) : iDatePart;
135
+ } else {
136
+ return null;
137
+ }
138
+ vDateFlag = true;
139
+ break;
140
+ case 'm':
141
+ case 'n':
142
+ case 'M':
143
+ case 'F':
144
+ if (isNaN(iDatePart)) {
145
+ vMonth = self.getMonth(vDatePart);
146
+ if (vMonth > 0) {
147
+ out.month = vMonth;
148
+ } else {
149
+ return null;
150
+ }
151
+ } else {
152
+ if (iDatePart >= 1 && iDatePart <= 12) {
153
+ out.month = iDatePart;
154
+ } else {
155
+ return null;
156
+ }
157
+ }
158
+ vDateFlag = true;
159
+ break;
160
+ case 'd':
161
+ case 'j':
162
+ if (iDatePart >= 1 && iDatePart <= 31) {
163
+ out.day = iDatePart;
164
+ } else {
165
+ return null;
166
+ }
167
+ vDateFlag = true;
168
+ break;
169
+ case 'g':
170
+ case 'h':
171
+ vMeriIndex = (vFormatParts.indexOf('a') > -1) ? vFormatParts.indexOf('a') :
172
+ (vFormatParts.indexOf('A') > -1) ? vFormatParts.indexOf('A') : -1;
173
+ mer = vDateParts[vMeriIndex];
174
+ if (vMeriIndex !== -1) {
175
+ vMeriOffset = _compare(mer, vSettings.meridiem[0]) ? 0 :
176
+ (_compare(mer, vSettings.meridiem[1]) ? 12 : -1);
177
+ if (iDatePart >= 1 && iDatePart <= 12 && vMeriOffset !== -1) {
178
+ out.hour = iDatePart % 12 === 0 ? vMeriOffset : iDatePart + vMeriOffset;
179
+ } else {
180
+ if (iDatePart >= 0 && iDatePart <= 23) {
181
+ out.hour = iDatePart;
182
+ }
183
+ }
184
+ } else {
185
+ if (iDatePart >= 0 && iDatePart <= 23) {
186
+ out.hour = iDatePart;
187
+ } else {
188
+ return null;
189
+ }
190
+ }
191
+ vTimeFlag = true;
192
+ break;
193
+ case 'G':
194
+ case 'H':
195
+ if (iDatePart >= 0 && iDatePart <= 23) {
196
+ out.hour = iDatePart;
197
+ } else {
198
+ return null;
199
+ }
200
+ vTimeFlag = true;
201
+ break;
202
+ case 'i':
203
+ if (iDatePart >= 0 && iDatePart <= 59) {
204
+ out.min = iDatePart;
205
+ } else {
206
+ return null;
207
+ }
208
+ vTimeFlag = true;
209
+ break;
210
+ case 's':
211
+ if (iDatePart >= 0 && iDatePart <= 59) {
212
+ out.sec = iDatePart;
213
+ } else {
214
+ return null;
215
+ }
216
+ vTimeFlag = true;
217
+ break;
218
+ }
219
+ }
220
+ if (vDateFlag === true && out.year && out.month && out.day) {
221
+ out.date = new Date(out.year, out.month - 1, out.day, out.hour, out.min, out.sec, 0);
222
+ } else {
223
+ if (vTimeFlag !== true) {
224
+ return null;
225
+ }
226
+ out.date = new Date(0, 0, 0, out.hour, out.min, out.sec, 0);
227
+ }
228
+ return out.date;
229
+ },
230
+ guessDate: function (vDateStr, vFormat) {
231
+ if (typeof vDateStr !== 'string') {
232
+ return vDateStr;
233
+ }
234
+ var self = this, vParts = vDateStr.replace(self.separators, '\0').split('\0'), vPattern = /^[djmn]/g, len,
235
+ vFormatParts = vFormat.match(self.validParts), vDate = new Date(), vDigit = 0, vYear, i, n, iPart, iSec;
236
+
237
+ if (!vPattern.test(vFormatParts[0])) {
238
+ return vDateStr;
239
+ }
240
+
241
+ for (i = 0; i < vParts.length; i++) {
242
+ vDigit = 2;
243
+ iPart = vParts[i];
244
+ iSec = parseInt(iPart.substr(0, 2));
245
+ if (isNaN(iSec)) {
246
+ return null;
247
+ }
248
+ switch (i) {
249
+ case 0:
250
+ if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
251
+ vDate.setMonth(iSec - 1);
252
+ } else {
253
+ vDate.setDate(iSec);
254
+ }
255
+ break;
256
+ case 1:
257
+ if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
258
+ vDate.setDate(iSec);
259
+ } else {
260
+ vDate.setMonth(iSec - 1);
261
+ }
262
+ break;
263
+ case 2:
264
+ vYear = vDate.getFullYear();
265
+ len = iPart.length;
266
+ vDigit = len < 4 ? len : 4;
267
+ vYear = parseInt(len < 4 ? vYear.toString().substr(0, 4 - len) + iPart : iPart.substr(0, 4));
268
+ if (!vYear) {
269
+ return null;
270
+ }
271
+ vDate.setFullYear(vYear);
272
+ break;
273
+ case 3:
274
+ vDate.setHours(iSec);
275
+ break;
276
+ case 4:
277
+ vDate.setMinutes(iSec);
278
+ break;
279
+ case 5:
280
+ vDate.setSeconds(iSec);
281
+ break;
282
+ }
283
+ n = iPart.substr(vDigit);
284
+ if (n.length > 0) {
285
+ vParts.splice(i + 1, 0, n);
286
+ }
287
+ }
288
+ return vDate;
289
+ },
290
+ parseFormat: function (vChar, vDate) {
291
+ var self = this, vSettings = self.dateSettings, fmt, backslash = /\\?(.?)/gi, doFormat = function (t, s) {
292
+ return fmt[t] ? fmt[t]() : s;
293
+ };
294
+ fmt = {
295
+ /////////
296
+ // DAY //
297
+ /////////
298
+ /**
299
+ * Day of month with leading 0: `01..31`
300
+ * @return {string}
301
+ */
302
+ d: function () {
303
+ return _lpad(fmt.j(), 2);
304
+ },
305
+ /**
306
+ * Shorthand day name: `Mon...Sun`
307
+ * @return {string}
308
+ */
309
+ D: function () {
310
+ return vSettings.daysShort[fmt.w()];
311
+ },
312
+ /**
313
+ * Day of month: `1..31`
314
+ * @return {number}
315
+ */
316
+ j: function () {
317
+ return vDate.getDate();
318
+ },
319
+ /**
320
+ * Full day name: `Monday...Sunday`
321
+ * @return {number}
322
+ */
323
+ l: function () {
324
+ return vSettings.days[fmt.w()];
325
+ },
326
+ /**
327
+ * ISO-8601 day of week: `1[Mon]..7[Sun]`
328
+ * @return {number}
329
+ */
330
+ N: function () {
331
+ return fmt.w() || 7;
332
+ },
333
+ /**
334
+ * Day of week: `0[Sun]..6[Sat]`
335
+ * @return {number}
336
+ */
337
+ w: function () {
338
+ return vDate.getDay();
339
+ },
340
+ /**
341
+ * Day of year: `0..365`
342
+ * @return {number}
343
+ */
344
+ z: function () {
345
+ var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j()), b = new Date(fmt.Y(), 0, 1);
346
+ return Math.round((a - b) / DAY);
347
+ },
348
+
349
+ //////////
350
+ // WEEK //
351
+ //////////
352
+ /**
353
+ * ISO-8601 week number
354
+ * @return {number}
355
+ */
356
+ W: function () {
357
+ var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j() - fmt.N() + 3), b = new Date(a.getFullYear(), 0, 4);
358
+ return _lpad(1 + Math.round((a - b) / DAY / 7), 2);
359
+ },
360
+
361
+ ///////////
362
+ // MONTH //
363
+ ///////////
364
+ /**
365
+ * Full month name: `January...December`
366
+ * @return {string}
367
+ */
368
+ F: function () {
369
+ return vSettings.months[vDate.getMonth()];
370
+ },
371
+ /**
372
+ * Month w/leading 0: `01..12`
373
+ * @return {string}
374
+ */
375
+ m: function () {
376
+ return _lpad(fmt.n(), 2);
377
+ },
378
+ /**
379
+ * Shorthand month name; `Jan...Dec`
380
+ * @return {string}
381
+ */
382
+ M: function () {
383
+ return vSettings.monthsShort[vDate.getMonth()];
384
+ },
385
+ /**
386
+ * Month: `1...12`
387
+ * @return {number}
388
+ */
389
+ n: function () {
390
+ return vDate.getMonth() + 1;
391
+ },
392
+ /**
393
+ * Days in month: `28...31`
394
+ * @return {number}
395
+ */
396
+ t: function () {
397
+ return (new Date(fmt.Y(), fmt.n(), 0)).getDate();
398
+ },
399
+
400
+ //////////
401
+ // YEAR //
402
+ //////////
403
+ /**
404
+ * Is leap year? `0 or 1`
405
+ * @return {number}
406
+ */
407
+ L: function () {
408
+ var Y = fmt.Y();
409
+ return (Y % 4 === 0 && Y % 100 !== 0 || Y % 400 === 0) ? 1 : 0;
410
+ },
411
+ /**
412
+ * ISO-8601 year
413
+ * @return {number}
414
+ */
415
+ o: function () {
416
+ var n = fmt.n(), W = fmt.W(), Y = fmt.Y();
417
+ return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
418
+ },
419
+ /**
420
+ * Full year: `e.g. 1980...2010`
421
+ * @return {number}
422
+ */
423
+ Y: function () {
424
+ return vDate.getFullYear();
425
+ },
426
+ /**
427
+ * Last two digits of year: `00...99`
428
+ * @return {string}
429
+ */
430
+ y: function () {
431
+ return fmt.Y().toString().slice(-2);
432
+ },
433
+
434
+ //////////
435
+ // TIME //
436
+ //////////
437
+ /**
438
+ * Meridian lower: `am or pm`
439
+ * @return {string}
440
+ */
441
+ a: function () {
442
+ return fmt.A().toLowerCase();
443
+ },
444
+ /**
445
+ * Meridian upper: `AM or PM`
446
+ * @return {string}
447
+ */
448
+ A: function () {
449
+ var n = fmt.G() < 12 ? 0 : 1;
450
+ return vSettings.meridiem[n];
451
+ },
452
+ /**
453
+ * Swatch Internet time: `000..999`
454
+ * @return {string}
455
+ */
456
+ B: function () {
457
+ var H = vDate.getUTCHours() * HOUR, i = vDate.getUTCMinutes() * 60, s = vDate.getUTCSeconds();
458
+ return _lpad(Math.floor((H + i + s + HOUR) / 86.4) % 1000, 3);
459
+ },
460
+ /**
461
+ * 12-Hours: `1..12`
462
+ * @return {number}
463
+ */
464
+ g: function () {
465
+ return fmt.G() % 12 || 12;
466
+ },
467
+ /**
468
+ * 24-Hours: `0..23`
469
+ * @return {number}
470
+ */
471
+ G: function () {
472
+ return vDate.getHours();
473
+ },
474
+ /**
475
+ * 12-Hours with leading 0: `01..12`
476
+ * @return {string}
477
+ */
478
+ h: function () {
479
+ return _lpad(fmt.g(), 2);
480
+ },
481
+ /**
482
+ * 24-Hours w/leading 0: `00..23`
483
+ * @return {string}
484
+ */
485
+ H: function () {
486
+ return _lpad(fmt.G(), 2);
487
+ },
488
+ /**
489
+ * Minutes w/leading 0: `00..59`
490
+ * @return {string}
491
+ */
492
+ i: function () {
493
+ return _lpad(vDate.getMinutes(), 2);
494
+ },
495
+ /**
496
+ * Seconds w/leading 0: `00..59`
497
+ * @return {string}
498
+ */
499
+ s: function () {
500
+ return _lpad(vDate.getSeconds(), 2);
501
+ },
502
+ /**
503
+ * Microseconds: `000000-999000`
504
+ * @return {string}
505
+ */
506
+ u: function () {
507
+ return _lpad(vDate.getMilliseconds() * 1000, 6);
508
+ },
509
+
510
+ //////////////
511
+ // TIMEZONE //
512
+ //////////////
513
+ /**
514
+ * Timezone identifier: `e.g. Atlantic/Azores, ...`
515
+ * @return {string}
516
+ */
517
+ e: function () {
518
+ var str = /\((.*)\)/.exec(String(vDate))[1];
519
+ return str || 'Coordinated Universal Time';
520
+ },
521
+ /**
522
+ * DST observed? `0 or 1`
523
+ * @return {number}
524
+ */
525
+ I: function () {
526
+ var a = new Date(fmt.Y(), 0), c = Date.UTC(fmt.Y(), 0),
527
+ b = new Date(fmt.Y(), 6), d = Date.UTC(fmt.Y(), 6);
528
+ return ((a - c) !== (b - d)) ? 1 : 0;
529
+ },
530
+ /**
531
+ * Difference to GMT in hour format: `e.g. +0200`
532
+ * @return {string}
533
+ */
534
+ O: function () {
535
+ var tzo = vDate.getTimezoneOffset(), a = Math.abs(tzo);
536
+ return (tzo > 0 ? '-' : '+') + _lpad(Math.floor(a / 60) * 100 + a % 60, 4);
537
+ },
538
+ /**
539
+ * Difference to GMT with colon: `e.g. +02:00`
540
+ * @return {string}
541
+ */
542
+ P: function () {
543
+ var O = fmt.O();
544
+ return (O.substr(0, 3) + ':' + O.substr(3, 2));
545
+ },
546
+ /**
547
+ * Timezone abbreviation: `e.g. EST, MDT, ...`
548
+ * @return {string}
549
+ */
550
+ T: function () {
551
+ var str = (String(vDate).match(self.tzParts) || [""]).pop().replace(self.tzClip, "");
552
+ return str || 'UTC';
553
+ },
554
+ /**
555
+ * Timezone offset in seconds: `-43200...50400`
556
+ * @return {number}
557
+ */
558
+ Z: function () {
559
+ return -vDate.getTimezoneOffset() * 60;
560
+ },
561
+
562
+ ////////////////////
563
+ // FULL DATE TIME //
564
+ ////////////////////
565
+ /**
566
+ * ISO-8601 date
567
+ * @return {string}
568
+ */
569
+ c: function () {
570
+ return 'Y-m-d\\TH:i:sP'.replace(backslash, doFormat);
571
+ },
572
+ /**
573
+ * RFC 2822 date
574
+ * @return {string}
575
+ */
576
+ r: function () {
577
+ return 'D, d M Y H:i:s O'.replace(backslash, doFormat);
578
+ },
579
+ /**
580
+ * Seconds since UNIX epoch
581
+ * @return {number}
582
+ */
583
+ U: function () {
584
+ return vDate.getTime() / 1000 || 0;
585
+ }
586
+ };
587
+ return doFormat(vChar, vChar);
588
+ },
589
+ formatDate: function (vDate, vFormat) {
590
+ var self = this, i, n, len, str, vChar, vDateStr = '', BACKSLASH = '\\';
591
+ if (typeof vDate === 'string') {
592
+ vDate = self.parseDate(vDate, vFormat);
593
+ if (!vDate) {
594
+ return null;
595
+ }
596
+ }
597
+ if (vDate instanceof Date) {
598
+ len = vFormat.length;
599
+ for (i = 0; i < len; i++) {
600
+ vChar = vFormat.charAt(i);
601
+ if (vChar === 'S' || vChar === BACKSLASH) {
602
+ continue;
603
+ }
604
+ if (i > 0 && vFormat.charAt(i - 1) === BACKSLASH) {
605
+ vDateStr += vChar;
606
+ continue;
607
+ }
608
+ str = self.parseFormat(vChar, vDate);
609
+ if (i !== (len - 1) && self.intParts.test(vChar) && vFormat.charAt(i + 1) === 'S') {
610
+ n = parseInt(str) || 0;
611
+ str += self.dateSettings.ordinal(n);
612
+ }
613
+ vDateStr += str;
614
+ }
615
+ return vDateStr;
616
+ }
617
+ return '';
618
+ }
619
+ };
620
+ })();
621
+ /**
622
+ * @preserve jQuery DateTimePicker plugin v2.5.4
623
+ * @homepage http://xdsoft.net/jqplugins/datetimepicker/
624
+ * @author Chupurnov Valeriy (<chupurnov@gmail.com>)
625
+ */
626
+ /*global DateFormatter, document,window,jQuery,setTimeout,clearTimeout,HighlightedDate,getCurrentValue*/
627
+ ;(function (factory) {
628
+ if ( typeof define === 'function' && define.amd ) {
629
+ // AMD. Register as an anonymous module.
630
+ define(['jquery', 'jquery-mousewheel'], factory);
631
+ } else if (typeof exports === 'object') {
632
+ // Node/CommonJS style for Browserify
633
+ module.exports = factory;
634
+ } else {
635
+ // Browser globals
636
+ factory(jQuery);
637
+ }
638
+ }(function ($) {
639
+ 'use strict';
640
+ var default_options = {
641
+ i18n: {
642
+ ar: { // Arabic
643
+ months: [
644
+ "كانون الثاني", "شباط", "آذار", "نيسان", "مايو", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول"
645
+ ],
646
+ dayOfWeekShort: [
647
+ "ن", "ث", "ع", "خ", "ج", "س", "ح"
648
+ ],
649
+ dayOfWeek: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"]
650
+ },
651
+ ro: { // Romanian
652
+ months: [
653
+ "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"
654
+ ],
655
+ dayOfWeekShort: [
656
+ "Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"
657
+ ],
658
+ dayOfWeek: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă"]
659
+ },
660
+ id: { // Indonesian
661
+ months: [
662
+ "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"
663
+ ],
664
+ dayOfWeekShort: [
665
+ "Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"
666
+ ],
667
+ dayOfWeek: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"]
668
+ },
669
+ is: { // Icelandic
670
+ months: [
671
+ "Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"
672
+ ],
673
+ dayOfWeekShort: [
674
+ "Sun", "Mán", "Þrið", "Mið", "Fim", "Fös", "Lau"
675
+ ],
676
+ dayOfWeek: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur"]
677
+ },
678
+ bg: { // Bulgarian
679
+ months: [
680
+ "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"
681
+ ],
682
+ dayOfWeekShort: [
683
+ "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
684
+ ],
685
+ dayOfWeek: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота"]
686
+ },
687
+ fa: { // Persian/Farsi
688
+ months: [
689
+ 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'
690
+ ],
691
+ dayOfWeekShort: [
692
+ 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'
693
+ ],
694
+ dayOfWeek: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"]
695
+ },
696
+ ru: { // Russian
697
+ months: [
698
+ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
699
+ ],
700
+ dayOfWeekShort: [
701
+ "Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"
702
+ ],
703
+ dayOfWeek: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]
704
+ },
705
+ uk: { // Ukrainian
706
+ months: [
707
+ 'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'
708
+ ],
709
+ dayOfWeekShort: [
710
+ "Ндл", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт"
711
+ ],
712
+ dayOfWeek: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"]
713
+ },
714
+ en: { // English
715
+ months: [
716
+ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
717
+ ],
718
+ dayOfWeekShort: [
719
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
720
+ ],
721
+ dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
722
+ },
723
+ el: { // Ελληνικά
724
+ months: [
725
+ "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"
726
+ ],
727
+ dayOfWeekShort: [
728
+ "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"
729
+ ],
730
+ dayOfWeek: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"]
731
+ },
732
+ de: { // German
733
+ months: [
734
+ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'
735
+ ],
736
+ dayOfWeekShort: [
737
+ "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"
738
+ ],
739
+ dayOfWeek: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]
740
+ },
741
+ nl: { // Dutch
742
+ months: [
743
+ "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"
744
+ ],
745
+ dayOfWeekShort: [
746
+ "zo", "ma", "di", "wo", "do", "vr", "za"
747
+ ],
748
+ dayOfWeek: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"]
749
+ },
750
+ tr: { // Turkish
751
+ months: [
752
+ "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"
753
+ ],
754
+ dayOfWeekShort: [
755
+ "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts"
756
+ ],
757
+ dayOfWeek: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"]
758
+ },
759
+ fr: { //French
760
+ months: [
761
+ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"
762
+ ],
763
+ dayOfWeekShort: [
764
+ "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"
765
+ ],
766
+ dayOfWeek: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"]
767
+ },
768
+ es: { // Spanish
769
+ months: [
770
+ "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
771
+ ],
772
+ dayOfWeekShort: [
773
+ "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"
774
+ ],
775
+ dayOfWeek: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]
776
+ },
777
+ th: { // Thai
778
+ months: [
779
+ 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
780
+ ],
781
+ dayOfWeekShort: [
782
+ 'อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'
783
+ ],
784
+ dayOfWeek: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"]
785
+ },
786
+ pl: { // Polish
787
+ months: [
788
+ "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"
789
+ ],
790
+ dayOfWeekShort: [
791
+ "nd", "pn", "wt", "śr", "cz", "pt", "sb"
792
+ ],
793
+ dayOfWeek: ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek", "sobota"]
794
+ },
795
+ pt: { // Portuguese
796
+ months: [
797
+ "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
798
+ ],
799
+ dayOfWeekShort: [
800
+ "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"
801
+ ],
802
+ dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
803
+ },
804
+ ch: { // Simplified Chinese
805
+ months: [
806
+ "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
807
+ ],
808
+ dayOfWeekShort: [
809
+ "日", "一", "二", "三", "四", "五", "六"
810
+ ]
811
+ },
812
+ se: { // Swedish
813
+ months: [
814
+ "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"
815
+ ],
816
+ dayOfWeekShort: [
817
+ "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
818
+ ]
819
+ },
820
+ km: { // Khmer
821
+ months: [
822
+ "មករា​", "កុម្ភៈ", "មិនា​", "មេសា​", "ឧសភា​", "មិថុនា​", "កក្កដា​", "សីហា​", "កញ្ញា​", "តុលា​", "វិច្ឋិកា​", "ធ្នូ​"
823
+ ],
824
+ dayOfWeekShort: ["អាទិ​", "ចន្ទ​", "អង្គារ​", "ពុធ​", "ព្រហ​​", "សុក្រ​", "សៅរ៍"],
825
+ dayOfWeek: ["អាទិត្យ​", "ចន្ទ​", "អង្គារ​", "ពុធ​", "ព្រហស្បតិ៍​", "សុក្រ​", "សៅរ៍"]
826
+ },
827
+ kr: { // Korean
828
+ months: [
829
+ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
830
+ ],
831
+ dayOfWeekShort: [
832
+ "일", "월", "화", "수", "목", "금", "토"
833
+ ],
834
+ dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
835
+ },
836
+ it: { // Italian
837
+ months: [
838
+ "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"
839
+ ],
840
+ dayOfWeekShort: [
841
+ "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"
842
+ ],
843
+ dayOfWeek: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"]
844
+ },
845
+ da: { // Dansk
846
+ months: [
847
+ "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December"
848
+ ],
849
+ dayOfWeekShort: [
850
+ "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
851
+ ],
852
+ dayOfWeek: ["søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"]
853
+ },
854
+ no: { // Norwegian
855
+ months: [
856
+ "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"
857
+ ],
858
+ dayOfWeekShort: [
859
+ "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"
860
+ ],
861
+ dayOfWeek: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag']
862
+ },
863
+ ja: { // Japanese
864
+ months: [
865
+ "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"
866
+ ],
867
+ dayOfWeekShort: [
868
+ "日", "月", "火", "水", "木", "金", "土"
869
+ ],
870
+ dayOfWeek: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"]
871
+ },
872
+ vi: { // Vietnamese
873
+ months: [
874
+ "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"
875
+ ],
876
+ dayOfWeekShort: [
877
+ "CN", "T2", "T3", "T4", "T5", "T6", "T7"
878
+ ],
879
+ dayOfWeek: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy"]
880
+ },
881
+ sl: { // Slovenščina
882
+ months: [
883
+ "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"
884
+ ],
885
+ dayOfWeekShort: [
886
+ "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"
887
+ ],
888
+ dayOfWeek: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"]
889
+ },
890
+ cs: { // Čeština
891
+ months: [
892
+ "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"
893
+ ],
894
+ dayOfWeekShort: [
895
+ "Ne", "Po", "Út", "St", "Čt", "Pá", "So"
896
+ ]
897
+ },
898
+ hu: { // Hungarian
899
+ months: [
900
+ "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"
901
+ ],
902
+ dayOfWeekShort: [
903
+ "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo"
904
+ ],
905
+ dayOfWeek: ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"]
906
+ },
907
+ az: { //Azerbaijanian (Azeri)
908
+ months: [
909
+ "Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"
910
+ ],
911
+ dayOfWeekShort: [
912
+ "B", "Be", "Ça", "Ç", "Ca", "C", "Ş"
913
+ ],
914
+ dayOfWeek: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə"]
915
+ },
916
+ bs: { //Bosanski
917
+ months: [
918
+ "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
919
+ ],
920
+ dayOfWeekShort: [
921
+ "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
922
+ ],
923
+ dayOfWeek: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
924
+ },
925
+ ca: { //Català
926
+ months: [
927
+ "Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"
928
+ ],
929
+ dayOfWeekShort: [
930
+ "Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds"
931
+ ],
932
+ dayOfWeek: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte"]
933
+ },
934
+ 'en-GB': { //English (British)
935
+ months: [
936
+ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
937
+ ],
938
+ dayOfWeekShort: [
939
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
940
+ ],
941
+ dayOfWeek: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
942
+ },
943
+ et: { //"Eesti"
944
+ months: [
945
+ "Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"
946
+ ],
947
+ dayOfWeekShort: [
948
+ "P", "E", "T", "K", "N", "R", "L"
949
+ ],
950
+ dayOfWeek: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"]
951
+ },
952
+ eu: { //Euskara
953
+ months: [
954
+ "Urtarrila", "Otsaila", "Martxoa", "Apirila", "Maiatza", "Ekaina", "Uztaila", "Abuztua", "Iraila", "Urria", "Azaroa", "Abendua"
955
+ ],
956
+ dayOfWeekShort: [
957
+ "Ig.", "Al.", "Ar.", "Az.", "Og.", "Or.", "La."
958
+ ],
959
+ dayOfWeek: ['Igandea', 'Astelehena', 'Asteartea', 'Asteazkena', 'Osteguna', 'Ostirala', 'Larunbata']
960
+ },
961
+ fi: { //Finnish (Suomi)
962
+ months: [
963
+ "Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"
964
+ ],
965
+ dayOfWeekShort: [
966
+ "Su", "Ma", "Ti", "Ke", "To", "Pe", "La"
967
+ ],
968
+ dayOfWeek: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"]
969
+ },
970
+ gl: { //Galego
971
+ months: [
972
+ "Xan", "Feb", "Maz", "Abr", "Mai", "Xun", "Xul", "Ago", "Set", "Out", "Nov", "Dec"
973
+ ],
974
+ dayOfWeekShort: [
975
+ "Dom", "Lun", "Mar", "Mer", "Xov", "Ven", "Sab"
976
+ ],
977
+ dayOfWeek: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"]
978
+ },
979
+ hr: { //Hrvatski
980
+ months: [
981
+ "Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"
982
+ ],
983
+ dayOfWeekShort: [
984
+ "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"
985
+ ],
986
+ dayOfWeek: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"]
987
+ },
988
+ ko: { //Korean (한국어)
989
+ months: [
990
+ "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"
991
+ ],
992
+ dayOfWeekShort: [
993
+ "일", "월", "화", "수", "목", "금", "토"
994
+ ],
995
+ dayOfWeek: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]
996
+ },
997
+ lt: { //Lithuanian (lietuvių)
998
+ months: [
999
+ "Sausio", "Vasario", "Kovo", "Balandžio", "Gegužės", "Birželio", "Liepos", "Rugpjūčio", "Rugsėjo", "Spalio", "Lapkričio", "Gruodžio"
1000
+ ],
1001
+ dayOfWeekShort: [
1002
+ "Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš"
1003
+ ],
1004
+ dayOfWeek: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis"]
1005
+ },
1006
+ lv: { //Latvian (Latviešu)
1007
+ months: [
1008
+ "Janvāris", "Februāris", "Marts", "Aprīlis ", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"
1009
+ ],
1010
+ dayOfWeekShort: [
1011
+ "Sv", "Pr", "Ot", "Tr", "Ct", "Pk", "St"
1012
+ ],
1013
+ dayOfWeek: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"]
1014
+ },
1015
+ mk: { //Macedonian (Македонски)
1016
+ months: [
1017
+ "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември"
1018
+ ],
1019
+ dayOfWeekShort: [
1020
+ "нед", "пон", "вто", "сре", "чет", "пет", "саб"
1021
+ ],
1022
+ dayOfWeek: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"]
1023
+ },
1024
+ mn: { //Mongolian (Монгол)
1025
+ months: [
1026
+ "1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар"
1027
+ ],
1028
+ dayOfWeekShort: [
1029
+ "Дав", "Мяг", "Лха", "Пүр", "Бсн", "Бям", "Ням"
1030
+ ],
1031
+ dayOfWeek: ["Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба", "Ням"]
1032
+ },
1033
+ 'pt-BR': { //Português(Brasil)
1034
+ months: [
1035
+ "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"
1036
+ ],
1037
+ dayOfWeekShort: [
1038
+ "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"
1039
+ ],
1040
+ dayOfWeek: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
1041
+ },
1042
+ sk: { //Slovenčina
1043
+ months: [
1044
+ "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"
1045
+ ],
1046
+ dayOfWeekShort: [
1047
+ "Ne", "Po", "Ut", "St", "Št", "Pi", "So"
1048
+ ],
1049
+ dayOfWeek: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"]
1050
+ },
1051
+ sq: { //Albanian (Shqip)
1052
+ months: [
1053
+ "Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"
1054
+ ],
1055
+ dayOfWeekShort: [
1056
+ "Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu"
1057
+ ],
1058
+ dayOfWeek: ["E Diel", "E Hënë", "E Martē", "E Mërkurë", "E Enjte", "E Premte", "E Shtunë"]
1059
+ },
1060
+ 'sr-YU': { //Serbian (Srpski)
1061
+ months: [
1062
+ "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"
1063
+ ],
1064
+ dayOfWeekShort: [
1065
+ "Ned", "Pon", "Uto", "Sre", "čet", "Pet", "Sub"
1066
+ ],
1067
+ dayOfWeek: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"]
1068
+ },
1069
+ sr: { //Serbian Cyrillic (Српски)
1070
+ months: [
1071
+ "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар"
1072
+ ],
1073
+ dayOfWeekShort: [
1074
+ "нед", "пон", "уто", "сре", "чет", "пет", "суб"
1075
+ ],
1076
+ dayOfWeek: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"]
1077
+ },
1078
+ sv: { //Svenska
1079
+ months: [
1080
+ "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"
1081
+ ],
1082
+ dayOfWeekShort: [
1083
+ "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"
1084
+ ],
1085
+ dayOfWeek: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]
1086
+ },
1087
+ 'zh-TW': { //Traditional Chinese (繁體中文)
1088
+ months: [
1089
+ "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
1090
+ ],
1091
+ dayOfWeekShort: [
1092
+ "日", "一", "二", "三", "四", "五", "六"
1093
+ ],
1094
+ dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
1095
+ },
1096
+ zh: { //Simplified Chinese (简体中文)
1097
+ months: [
1098
+ "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
1099
+ ],
1100
+ dayOfWeekShort: [
1101
+ "日", "一", "二", "三", "四", "五", "六"
1102
+ ],
1103
+ dayOfWeek: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]
1104
+ },
1105
+ he: { //Hebrew (עברית)
1106
+ months: [
1107
+ 'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'
1108
+ ],
1109
+ dayOfWeekShort: [
1110
+ 'א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת'
1111
+ ],
1112
+ dayOfWeek: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"]
1113
+ },
1114
+ hy: { // Armenian
1115
+ months: [
1116
+ "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր"
1117
+ ],
1118
+ dayOfWeekShort: [
1119
+ "Կի", "Երկ", "Երք", "Չոր", "Հնգ", "Ուրբ", "Շբթ"
1120
+ ],
1121
+ dayOfWeek: ["Կիրակի", "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ"]
1122
+ },
1123
+ kg: { // Kyrgyz
1124
+ months: [
1125
+ 'Үчтүн айы', 'Бирдин айы', 'Жалган Куран', 'Чын Куран', 'Бугу', 'Кулжа', 'Теке', 'Баш Оона', 'Аяк Оона', 'Тогуздун айы', 'Жетинин айы', 'Бештин айы'
1126
+ ],
1127
+ dayOfWeekShort: [
1128
+ "Жек", "Дүй", "Шей", "Шар", "Бей", "Жум", "Ише"
1129
+ ],
1130
+ dayOfWeek: [
1131
+ "Жекшемб", "Дүйшөмб", "Шейшемб", "Шаршемб", "Бейшемби", "Жума", "Ишенб"
1132
+ ]
1133
+ },
1134
+ rm: { // Romansh
1135
+ months: [
1136
+ "Schaner", "Favrer", "Mars", "Avrigl", "Matg", "Zercladur", "Fanadur", "Avust", "Settember", "October", "November", "December"
1137
+ ],
1138
+ dayOfWeekShort: [
1139
+ "Du", "Gli", "Ma", "Me", "Gie", "Ve", "So"
1140
+ ],
1141
+ dayOfWeek: [
1142
+ "Dumengia", "Glindesdi", "Mardi", "Mesemna", "Gievgia", "Venderdi", "Sonda"
1143
+ ]
1144
+ },
1145
+ ka: { // Georgian
1146
+ months: [
1147
+ 'იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'
1148
+ ],
1149
+ dayOfWeekShort: [
1150
+ "კვ", "ორშ", "სამშ", "ოთხ", "ხუთ", "პარ", "შაბ"
1151
+ ],
1152
+ dayOfWeek: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"]
1153
+ }
1154
+ },
1155
+
1156
+ ownerDocument: document,
1157
+ contentWindow: window,
1158
+
1159
+ value: '',
1160
+ rtl: false,
1161
+
1162
+ format: 'Y/m/d H:i',
1163
+ formatTime: 'H:i',
1164
+ formatDate: 'Y/m/d',
1165
+
1166
+ startDate: false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05',
1167
+ step: 60,
1168
+ monthChangeSpinner: true,
1169
+
1170
+ closeOnDateSelect: false,
1171
+ closeOnTimeSelect: true,
1172
+ closeOnWithoutClick: true,
1173
+ closeOnInputClick: true,
1174
+
1175
+ timepicker: true,
1176
+ datepicker: true,
1177
+ weeks: false,
1178
+
1179
+ defaultTime: false, // use formatTime format (ex. '10:00' for formatTime: 'H:i')
1180
+ defaultDate: false, // use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05')
1181
+
1182
+ minDate: false,
1183
+ maxDate: false,
1184
+ minTime: false,
1185
+ maxTime: false,
1186
+ disabledMinTime: false,
1187
+ disabledMaxTime: false,
1188
+
1189
+ allowTimes: [],
1190
+ opened: false,
1191
+ initTime: true,
1192
+ inline: false,
1193
+ theme: '',
1194
+
1195
+ onSelectDate: function () {},
1196
+ onSelectTime: function () {},
1197
+ onChangeMonth: function () {},
1198
+ onGetWeekOfYear: function () {},
1199
+ onChangeYear: function () {},
1200
+ onChangeDateTime: function () {},
1201
+ onShow: function () {},
1202
+ onClose: function () {},
1203
+ onGenerate: function () {},
1204
+
1205
+ withoutCopyright: true,
1206
+ inverseButton: false,
1207
+ hours12: false,
1208
+ next: 'xdsoft_next',
1209
+ prev : 'xdsoft_prev',
1210
+ dayOfWeekStart: 0,
1211
+ parentID: 'body',
1212
+ timeHeightInTimePicker: 25,
1213
+ timepickerScrollbar: true,
1214
+ todayButton: true,
1215
+ prevButton: true,
1216
+ nextButton: true,
1217
+ defaultSelect: true,
1218
+
1219
+ scrollMonth: true,
1220
+ scrollTime: true,
1221
+ scrollInput: true,
1222
+
1223
+ lazyInit: false,
1224
+ mask: false,
1225
+ validateOnBlur: true,
1226
+ allowBlank: true,
1227
+ yearStart: 1950,
1228
+ yearEnd: 2050,
1229
+ monthStart: 0,
1230
+ monthEnd: 11,
1231
+ style: '',
1232
+ id: '',
1233
+ fixed: false,
1234
+ roundTime: 'round', // ceil, floor
1235
+ className: '',
1236
+ weekends: [],
1237
+ highlightedDates: [],
1238
+ highlightedPeriods: [],
1239
+ allowDates : [],
1240
+ allowDateRe : null,
1241
+ disabledDates : [],
1242
+ disabledWeekDays: [],
1243
+ yearOffset: 0,
1244
+ beforeShowDay: null,
1245
+
1246
+ enterLikeTab: true,
1247
+ showApplyButton: false
1248
+ };
1249
+
1250
+ var dateHelper = null,
1251
+ globalLocaleDefault = 'en',
1252
+ globalLocale = 'en';
1253
+
1254
+ var dateFormatterOptionsDefault = {
1255
+ meridiem: ['AM', 'PM']
1256
+ };
1257
+
1258
+ var initDateFormatter = function(){
1259
+ var locale = default_options.i18n[globalLocale],
1260
+ opts = {
1261
+ days: locale.dayOfWeek,
1262
+ daysShort: locale.dayOfWeekShort,
1263
+ months: locale.months,
1264
+ monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) })
1265
+ };
1266
+
1267
+ if (typeof DateFormatter === 'function') {
1268
+ dateHelper = new DateFormatter({
1269
+ dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
1270
+ });
1271
+ }
1272
+ };
1273
+
1274
+ // for locale settings
1275
+ $.datetimepicker = {
1276
+ setLocale: function(locale){
1277
+ var newLocale = default_options.i18n[locale]?locale:globalLocaleDefault;
1278
+ if(globalLocale != newLocale){
1279
+ globalLocale = newLocale;
1280
+ // reinit date formatter
1281
+ initDateFormatter();
1282
+ }
1283
+ },
1284
+ setDateFormatter: function(dateFormatter) {
1285
+ dateHelper = dateFormatter;
1286
+ },
1287
+ RFC_2822: 'D, d M Y H:i:s O',
1288
+ ATOM: 'Y-m-d\TH:i:sP',
1289
+ ISO_8601: 'Y-m-d\TH:i:sO',
1290
+ RFC_822: 'D, d M y H:i:s O',
1291
+ RFC_850: 'l, d-M-y H:i:s T',
1292
+ RFC_1036: 'D, d M y H:i:s O',
1293
+ RFC_1123: 'D, d M Y H:i:s O',
1294
+ RSS: 'D, d M Y H:i:s O',
1295
+ W3C: 'Y-m-d\TH:i:sP'
1296
+ };
1297
+
1298
+ // first init date formatter
1299
+ initDateFormatter();
1300
+
1301
+ // fix for ie8
1302
+ if (!window.getComputedStyle) {
1303
+ window.getComputedStyle = function (el, pseudo) {
1304
+ this.el = el;
1305
+ this.getPropertyValue = function (prop) {
1306
+ var re = /(\-([a-z]){1})/g;
1307
+ if (prop === 'float') {
1308
+ prop = 'styleFloat';
1309
+ }
1310
+ if (re.test(prop)) {
1311
+ prop = prop.replace(re, function (a, b, c) {
1312
+ return c.toUpperCase();
1313
+ });
1314
+ }
1315
+ return el.currentStyle[prop] || null;
1316
+ };
1317
+ return this;
1318
+ };
1319
+ }
1320
+ if (!Array.prototype.indexOf) {
1321
+ Array.prototype.indexOf = function (obj, start) {
1322
+ var i, j;
1323
+ for (i = (start || 0), j = this.length; i < j; i += 1) {
1324
+ if (this[i] === obj) { return i; }
1325
+ }
1326
+ return -1;
1327
+ };
1328
+ }
1329
+ Date.prototype.countDaysInMonth = function () {
1330
+ return new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
1331
+ };
1332
+ $.fn.xdsoftScroller = function (options, percent) {
1333
+ return this.each(function () {
1334
+ var timeboxparent = $(this),
1335
+ pointerEventToXY = function (e) {
1336
+ var out = {x: 0, y: 0},
1337
+ touch;
1338
+ if (e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend' || e.type === 'touchcancel') {
1339
+ touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
1340
+ out.x = touch.clientX;
1341
+ out.y = touch.clientY;
1342
+ } else if (e.type === 'mousedown' || e.type === 'mouseup' || e.type === 'mousemove' || e.type === 'mouseover' || e.type === 'mouseout' || e.type === 'mouseenter' || e.type === 'mouseleave') {
1343
+ out.x = e.clientX;
1344
+ out.y = e.clientY;
1345
+ }
1346
+ return out;
1347
+ },
1348
+ timebox,
1349
+ parentHeight,
1350
+ height,
1351
+ scrollbar,
1352
+ scroller,
1353
+ maximumOffset = 100,
1354
+ start = false,
1355
+ startY = 0,
1356
+ startTop = 0,
1357
+ h1 = 0,
1358
+ touchStart = false,
1359
+ startTopScroll = 0,
1360
+ calcOffset = function () {};
1361
+ if (percent === 'hide') {
1362
+ timeboxparent.find('.xdsoft_scrollbar').hide();
1363
+ return;
1364
+ }
1365
+ if (!$(this).hasClass('xdsoft_scroller_box')) {
1366
+ timebox = timeboxparent.children().eq(0);
1367
+ parentHeight = timeboxparent[0].clientHeight;
1368
+ height = timebox[0].offsetHeight;
1369
+ scrollbar = $('<div class="xdsoft_scrollbar"></div>');
1370
+ scroller = $('<div class="xdsoft_scroller"></div>');
1371
+ scrollbar.append(scroller);
1372
+
1373
+ timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar);
1374
+ calcOffset = function calcOffset(event) {
1375
+ var offset = pointerEventToXY(event).y - startY + startTopScroll;
1376
+ if (offset < 0) {
1377
+ offset = 0;
1378
+ }
1379
+ if (offset + scroller[0].offsetHeight > h1) {
1380
+ offset = h1 - scroller[0].offsetHeight;
1381
+ }
1382
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [maximumOffset ? offset / maximumOffset : 0]);
1383
+ };
1384
+
1385
+ scroller
1386
+ .on('touchstart.xdsoft_scroller mousedown.xdsoft_scroller', function (event) {
1387
+ if (!parentHeight) {
1388
+ timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
1389
+ }
1390
+
1391
+ startY = pointerEventToXY(event).y;
1392
+ startTopScroll = parseInt(scroller.css('margin-top'), 10);
1393
+ h1 = scrollbar[0].offsetHeight;
1394
+
1395
+ if (event.type === 'mousedown' || event.type === 'touchstart') {
1396
+ if (options.ownerDocument) {
1397
+ $(options.ownerDocument.body).addClass('xdsoft_noselect');
1398
+ }
1399
+ $([options.ownerDocument.body, options.contentWindow]).on('touchend mouseup.xdsoft_scroller', function arguments_callee() {
1400
+ $([options.ownerDocument.body, options.contentWindow]).off('touchend mouseup.xdsoft_scroller', arguments_callee)
1401
+ .off('mousemove.xdsoft_scroller', calcOffset)
1402
+ .removeClass('xdsoft_noselect');
1403
+ });
1404
+ $(options.ownerDocument.body).on('mousemove.xdsoft_scroller', calcOffset);
1405
+ } else {
1406
+ touchStart = true;
1407
+ event.stopPropagation();
1408
+ event.preventDefault();
1409
+ }
1410
+ })
1411
+ .on('touchmove', function (event) {
1412
+ if (touchStart) {
1413
+ event.preventDefault();
1414
+ calcOffset(event);
1415
+ }
1416
+ })
1417
+ .on('touchend touchcancel', function () {
1418
+ touchStart = false;
1419
+ startTopScroll = 0;
1420
+ });
1421
+
1422
+ timeboxparent
1423
+ .on('scroll_element.xdsoft_scroller', function (event, percentage) {
1424
+ if (!parentHeight) {
1425
+ timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percentage, true]);
1426
+ }
1427
+ percentage = percentage > 1 ? 1 : (percentage < 0 || isNaN(percentage)) ? 0 : percentage;
1428
+
1429
+ scroller.css('margin-top', maximumOffset * percentage);
1430
+
1431
+ setTimeout(function () {
1432
+ timebox.css('marginTop', -parseInt((timebox[0].offsetHeight - parentHeight) * percentage, 10));
1433
+ }, 10);
1434
+ })
1435
+ .on('resize_scroll.xdsoft_scroller', function (event, percentage, noTriggerScroll) {
1436
+ var percent, sh;
1437
+ parentHeight = timeboxparent[0].clientHeight;
1438
+ height = timebox[0].offsetHeight;
1439
+ percent = parentHeight / height;
1440
+ sh = percent * scrollbar[0].offsetHeight;
1441
+ if (percent > 1) {
1442
+ scroller.hide();
1443
+ } else {
1444
+ scroller.show();
1445
+ scroller.css('height', parseInt(sh > 10 ? sh : 10, 10));
1446
+ maximumOffset = scrollbar[0].offsetHeight - scroller[0].offsetHeight;
1447
+ if (noTriggerScroll !== true) {
1448
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [percentage || Math.abs(parseInt(timebox.css('marginTop'), 10)) / (height - parentHeight)]);
1449
+ }
1450
+ }
1451
+ });
1452
+
1453
+ timeboxparent.on('mousewheel', function (event) {
1454
+ var top = Math.abs(parseInt(timebox.css('marginTop'), 10));
1455
+
1456
+ top = top - (event.deltaY * 20);
1457
+ if (top < 0) {
1458
+ top = 0;
1459
+ }
1460
+
1461
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [top / (height - parentHeight)]);
1462
+ event.stopPropagation();
1463
+ return false;
1464
+ });
1465
+
1466
+ timeboxparent.on('touchstart', function (event) {
1467
+ start = pointerEventToXY(event);
1468
+ startTop = Math.abs(parseInt(timebox.css('marginTop'), 10));
1469
+ });
1470
+
1471
+ timeboxparent.on('touchmove', function (event) {
1472
+ if (start) {
1473
+ event.preventDefault();
1474
+ var coord = pointerEventToXY(event);
1475
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [(startTop - (coord.y - start.y)) / (height - parentHeight)]);
1476
+ }
1477
+ });
1478
+
1479
+ timeboxparent.on('touchend touchcancel', function () {
1480
+ start = false;
1481
+ startTop = 0;
1482
+ });
1483
+ }
1484
+ timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]);
1485
+ });
1486
+ };
1487
+
1488
+ $.fn.datetimepicker = function (opt, opt2) {
1489
+ var result = this,
1490
+ KEY0 = 48,
1491
+ KEY9 = 57,
1492
+ _KEY0 = 96,
1493
+ _KEY9 = 105,
1494
+ CTRLKEY = 17,
1495
+ DEL = 46,
1496
+ ENTER = 13,
1497
+ ESC = 27,
1498
+ BACKSPACE = 8,
1499
+ ARROWLEFT = 37,
1500
+ ARROWUP = 38,
1501
+ ARROWRIGHT = 39,
1502
+ ARROWDOWN = 40,
1503
+ TAB = 9,
1504
+ F5 = 116,
1505
+ AKEY = 65,
1506
+ CKEY = 67,
1507
+ VKEY = 86,
1508
+ ZKEY = 90,
1509
+ YKEY = 89,
1510
+ ctrlDown = false,
1511
+ options = ($.isPlainObject(opt) || !opt) ? $.extend(true, {}, default_options, opt) : $.extend(true, {}, default_options),
1512
+
1513
+ lazyInitTimer = 0,
1514
+ createDateTimePicker,
1515
+ destroyDateTimePicker,
1516
+
1517
+ lazyInit = function (input) {
1518
+ input
1519
+ .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function initOnActionCallback() {
1520
+ if (input.is(':disabled') || input.data('xdsoft_datetimepicker')) {
1521
+ return;
1522
+ }
1523
+ clearTimeout(lazyInitTimer);
1524
+ lazyInitTimer = setTimeout(function () {
1525
+
1526
+ if (!input.data('xdsoft_datetimepicker')) {
1527
+ createDateTimePicker(input);
1528
+ }
1529
+ input
1530
+ .off('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', initOnActionCallback)
1531
+ .trigger('open.xdsoft');
1532
+ }, 100);
1533
+ });
1534
+ };
1535
+
1536
+ createDateTimePicker = function (input) {
1537
+ var datetimepicker = $('<div class="xdsoft_datetimepicker xdsoft_noselect"></div>'),
1538
+ xdsoft_copyright = $('<div class="xdsoft_copyright"><a target="_blank" href="http://xdsoft.net/jqplugins/datetimepicker/">xdsoft.net</a></div>'),
1539
+ datepicker = $('<div class="xdsoft_datepicker active"></div>'),
1540
+ month_picker = $('<div class="xdsoft_monthpicker"><button type="button" class="xdsoft_prev"></button><button type="button" class="xdsoft_today_button"></button>' +
1541
+ '<div class="xdsoft_label xdsoft_month"><span></span><i></i></div>' +
1542
+ '<div class="xdsoft_label xdsoft_year"><span></span><i></i></div>' +
1543
+ '<button type="button" class="xdsoft_next"></button></div>'),
1544
+ calendar = $('<div class="xdsoft_calendar"></div>'),
1545
+ timepicker = $('<div class="xdsoft_timepicker active"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_time_box"></div><button type="button" class="xdsoft_next"></button></div>'),
1546
+ timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
1547
+ timebox = $('<div class="xdsoft_time_variant"></div>'),
1548
+ applyButton = $('<button type="button" class="xdsoft_save_selected blue-gradient-button">Save Selected</button>'),
1549
+
1550
+ monthselect = $('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
1551
+ yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
1552
+ triggerAfterOpen = false,
1553
+ XDSoft_datetime,
1554
+
1555
+ xchangeTimer,
1556
+ timerclick,
1557
+ current_time_index,
1558
+ setPos,
1559
+ timer = 0,
1560
+ _xdsoft_datetime,
1561
+ forEachAncestorOf,
1562
+ throttle;
1563
+
1564
+ if (options.id) {
1565
+ datetimepicker.attr('id', options.id);
1566
+ }
1567
+ if (options.style) {
1568
+ datetimepicker.attr('style', options.style);
1569
+ }
1570
+ if (options.weeks) {
1571
+ datetimepicker.addClass('xdsoft_showweeks');
1572
+ }
1573
+ if (options.rtl) {
1574
+ datetimepicker.addClass('xdsoft_rtl');
1575
+ }
1576
+
1577
+ datetimepicker.addClass('xdsoft_' + options.theme);
1578
+ datetimepicker.addClass(options.className);
1579
+
1580
+ month_picker
1581
+ .find('.xdsoft_month span')
1582
+ .after(monthselect);
1583
+ month_picker
1584
+ .find('.xdsoft_year span')
1585
+ .after(yearselect);
1586
+
1587
+ month_picker
1588
+ .find('.xdsoft_month,.xdsoft_year')
1589
+ .on('touchstart mousedown.xdsoft', function (event) {
1590
+ var select = $(this).find('.xdsoft_select').eq(0),
1591
+ val = 0,
1592
+ top = 0,
1593
+ visible = select.is(':visible'),
1594
+ items,
1595
+ i;
1596
+
1597
+ month_picker
1598
+ .find('.xdsoft_select')
1599
+ .hide();
1600
+ if (_xdsoft_datetime.currentTime) {
1601
+ val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month') ? 'getMonth' : 'getFullYear']();
1602
+ }
1603
+
1604
+ select[visible ? 'hide' : 'show']();
1605
+ for (items = select.find('div.xdsoft_option'), i = 0; i < items.length; i += 1) {
1606
+ if (items.eq(i).data('value') === val) {
1607
+ break;
1608
+ } else {
1609
+ top += items[0].offsetHeight;
1610
+ }
1611
+ }
1612
+
1613
+ select.xdsoftScroller(options, top / (select.children()[0].offsetHeight - (select[0].clientHeight)));
1614
+ event.stopPropagation();
1615
+ return false;
1616
+ });
1617
+
1618
+ month_picker
1619
+ .find('.xdsoft_select')
1620
+ .xdsoftScroller(options)
1621
+ .on('touchstart mousedown.xdsoft', function (event) {
1622
+ event.stopPropagation();
1623
+ event.preventDefault();
1624
+ })
1625
+ .on('touchstart mousedown.xdsoft', '.xdsoft_option', function () {
1626
+ if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
1627
+ _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
1628
+ }
1629
+
1630
+ var year = _xdsoft_datetime.currentTime.getFullYear();
1631
+ if (_xdsoft_datetime && _xdsoft_datetime.currentTime) {
1632
+ _xdsoft_datetime.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect') ? 'setMonth' : 'setFullYear']($(this).data('value'));
1633
+ }
1634
+
1635
+ $(this).parent().parent().hide();
1636
+
1637
+ datetimepicker.trigger('xchange.xdsoft');
1638
+ if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1639
+ options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1640
+ }
1641
+
1642
+ if (year !== _xdsoft_datetime.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1643
+ options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1644
+ }
1645
+ });
1646
+
1647
+ datetimepicker.getValue = function () {
1648
+ return _xdsoft_datetime.getCurrentTime();
1649
+ };
1650
+
1651
+ datetimepicker.setOptions = function (_options) {
1652
+ var highlightedDates = {};
1653
+
1654
+ options = $.extend(true, {}, options, _options);
1655
+
1656
+ if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
1657
+ options.allowTimes = $.extend(true, [], _options.allowTimes);
1658
+ }
1659
+
1660
+ if (_options.weekends && $.isArray(_options.weekends) && _options.weekends.length) {
1661
+ options.weekends = $.extend(true, [], _options.weekends);
1662
+ }
1663
+
1664
+ if (_options.allowDates && $.isArray(_options.allowDates) && _options.allowDates.length) {
1665
+ options.allowDates = $.extend(true, [], _options.allowDates);
1666
+ }
1667
+
1668
+ if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
1669
+ options.allowDateRe = new RegExp(_options.allowDateRe);
1670
+ }
1671
+
1672
+ if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
1673
+ $.each(_options.highlightedDates, function (index, value) {
1674
+ var splitData = $.map(value.split(','), $.trim),
1675
+ exDesc,
1676
+ hDate = new HighlightedDate(dateHelper.parseDate(splitData[0], options.formatDate), splitData[1], splitData[2]), // date, desc, style
1677
+ keyDate = dateHelper.formatDate(hDate.date, options.formatDate);
1678
+ if (highlightedDates[keyDate] !== undefined) {
1679
+ exDesc = highlightedDates[keyDate].desc;
1680
+ if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1681
+ highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1682
+ }
1683
+ } else {
1684
+ highlightedDates[keyDate] = hDate;
1685
+ }
1686
+ });
1687
+
1688
+ options.highlightedDates = $.extend(true, [], highlightedDates);
1689
+ }
1690
+
1691
+ if (_options.highlightedPeriods && $.isArray(_options.highlightedPeriods) && _options.highlightedPeriods.length) {
1692
+ highlightedDates = $.extend(true, [], options.highlightedDates);
1693
+ $.each(_options.highlightedPeriods, function (index, value) {
1694
+ var dateTest, // start date
1695
+ dateEnd,
1696
+ desc,
1697
+ hDate,
1698
+ keyDate,
1699
+ exDesc,
1700
+ style;
1701
+ if ($.isArray(value)) {
1702
+ dateTest = value[0];
1703
+ dateEnd = value[1];
1704
+ desc = value[2];
1705
+ style = value[3];
1706
+ }
1707
+ else {
1708
+ var splitData = $.map(value.split(','), $.trim);
1709
+ dateTest = dateHelper.parseDate(splitData[0], options.formatDate);
1710
+ dateEnd = dateHelper.parseDate(splitData[1], options.formatDate);
1711
+ desc = splitData[2];
1712
+ style = splitData[3];
1713
+ }
1714
+
1715
+ while (dateTest <= dateEnd) {
1716
+ hDate = new HighlightedDate(dateTest, desc, style);
1717
+ keyDate = dateHelper.formatDate(dateTest, options.formatDate);
1718
+ dateTest.setDate(dateTest.getDate() + 1);
1719
+ if (highlightedDates[keyDate] !== undefined) {
1720
+ exDesc = highlightedDates[keyDate].desc;
1721
+ if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) {
1722
+ highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc;
1723
+ }
1724
+ } else {
1725
+ highlightedDates[keyDate] = hDate;
1726
+ }
1727
+ }
1728
+ });
1729
+
1730
+ options.highlightedDates = $.extend(true, [], highlightedDates);
1731
+ }
1732
+
1733
+ if (_options.disabledDates && $.isArray(_options.disabledDates) && _options.disabledDates.length) {
1734
+ options.disabledDates = $.extend(true, [], _options.disabledDates);
1735
+ }
1736
+
1737
+ if (_options.disabledWeekDays && $.isArray(_options.disabledWeekDays) && _options.disabledWeekDays.length) {
1738
+ options.disabledWeekDays = $.extend(true, [], _options.disabledWeekDays);
1739
+ }
1740
+
1741
+ if ((options.open || options.opened) && (!options.inline)) {
1742
+ input.trigger('open.xdsoft');
1743
+ }
1744
+
1745
+ if (options.inline) {
1746
+ triggerAfterOpen = true;
1747
+ datetimepicker.addClass('xdsoft_inline');
1748
+ input.after(datetimepicker).hide();
1749
+ }
1750
+
1751
+ if (options.inverseButton) {
1752
+ options.next = 'xdsoft_prev';
1753
+ options.prev = 'xdsoft_next';
1754
+ }
1755
+
1756
+ if (options.datepicker) {
1757
+ datepicker.addClass('active');
1758
+ } else {
1759
+ datepicker.removeClass('active');
1760
+ }
1761
+
1762
+ if (options.timepicker) {
1763
+ timepicker.addClass('active');
1764
+ } else {
1765
+ timepicker.removeClass('active');
1766
+ }
1767
+
1768
+ if (options.value) {
1769
+ _xdsoft_datetime.setCurrentTime(options.value);
1770
+ if (input && input.val) {
1771
+ input.val(_xdsoft_datetime.str);
1772
+ }
1773
+ }
1774
+
1775
+ if (isNaN(options.dayOfWeekStart)) {
1776
+ options.dayOfWeekStart = 0;
1777
+ } else {
1778
+ options.dayOfWeekStart = parseInt(options.dayOfWeekStart, 10) % 7;
1779
+ }
1780
+
1781
+ if (!options.timepickerScrollbar) {
1782
+ timeboxparent.xdsoftScroller(options, 'hide');
1783
+ }
1784
+
1785
+ if (options.minDate && /^[\+\-](.*)$/.test(options.minDate)) {
1786
+ options.minDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.minDate), options.formatDate);
1787
+ }
1788
+
1789
+ if (options.maxDate && /^[\+\-](.*)$/.test(options.maxDate)) {
1790
+ options.maxDate = dateHelper.formatDate(_xdsoft_datetime.strToDateTime(options.maxDate), options.formatDate);
1791
+ }
1792
+
1793
+ applyButton.toggle(options.showApplyButton);
1794
+
1795
+ month_picker
1796
+ .find('.xdsoft_today_button')
1797
+ .css('visibility', !options.todayButton ? 'hidden' : 'visible');
1798
+
1799
+ month_picker
1800
+ .find('.' + options.prev)
1801
+ .css('visibility', !options.prevButton ? 'hidden' : 'visible');
1802
+
1803
+ month_picker
1804
+ .find('.' + options.next)
1805
+ .css('visibility', !options.nextButton ? 'hidden' : 'visible');
1806
+
1807
+ setMask(options);
1808
+
1809
+ if (options.validateOnBlur) {
1810
+ input
1811
+ .off('blur.xdsoft')
1812
+ .on('blur.xdsoft', function () {
1813
+ if (options.allowBlank && (!$.trim($(this).val()).length || (typeof options.mask == "string" && $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_')))) {
1814
+ $(this).val(null);
1815
+ datetimepicker.data('xdsoft_datetime').empty();
1816
+ } else {
1817
+ var d = dateHelper.parseDate($(this).val(), options.format);
1818
+ if (d) { // parseDate() may skip some invalid parts like date or time, so make it clear for user: show parsed date/time
1819
+ $(this).val(dateHelper.formatDate(d, options.format));
1820
+ } else {
1821
+ var splittedHours = +([$(this).val()[0], $(this).val()[1]].join('')),
1822
+ splittedMinutes = +([$(this).val()[2], $(this).val()[3]].join(''));
1823
+
1824
+ // parse the numbers as 0312 => 03:12
1825
+ if (!options.datepicker && options.timepicker && splittedHours >= 0 && splittedHours < 24 && splittedMinutes >= 0 && splittedMinutes < 60) {
1826
+ $(this).val([splittedHours, splittedMinutes].map(function (item) {
1827
+ return item > 9 ? item : '0' + item;
1828
+ }).join(':'));
1829
+ } else {
1830
+ $(this).val(dateHelper.formatDate(_xdsoft_datetime.now(), options.format));
1831
+ }
1832
+ }
1833
+ datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val());
1834
+ }
1835
+
1836
+ datetimepicker.trigger('changedatetime.xdsoft');
1837
+ datetimepicker.trigger('close.xdsoft');
1838
+ });
1839
+ }
1840
+ options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
1841
+
1842
+ datetimepicker
1843
+ .trigger('xchange.xdsoft')
1844
+ .trigger('afterOpen.xdsoft');
1845
+ };
1846
+
1847
+ datetimepicker
1848
+ .data('options', options)
1849
+ .on('touchstart mousedown.xdsoft', function (event) {
1850
+ event.stopPropagation();
1851
+ event.preventDefault();
1852
+ yearselect.hide();
1853
+ monthselect.hide();
1854
+ return false;
1855
+ });
1856
+
1857
+ //scroll_element = timepicker.find('.xdsoft_time_box');
1858
+ timeboxparent.append(timebox);
1859
+ timeboxparent.xdsoftScroller(options);
1860
+
1861
+ datetimepicker.on('afterOpen.xdsoft', function () {
1862
+ timeboxparent.xdsoftScroller(options);
1863
+ });
1864
+
1865
+ datetimepicker
1866
+ .append(datepicker)
1867
+ .append(timepicker);
1868
+
1869
+ if (options.withoutCopyright !== true) {
1870
+ datetimepicker
1871
+ .append(xdsoft_copyright);
1872
+ }
1873
+
1874
+ datepicker
1875
+ .append(month_picker)
1876
+ .append(calendar)
1877
+ .append(applyButton);
1878
+
1879
+ $(options.parentID)
1880
+ .append(datetimepicker);
1881
+
1882
+ XDSoft_datetime = function () {
1883
+ var _this = this;
1884
+ _this.now = function (norecursion) {
1885
+ var d = new Date(),
1886
+ date,
1887
+ time;
1888
+
1889
+ if (!norecursion && options.defaultDate) {
1890
+ date = _this.strToDateTime(options.defaultDate);
1891
+ d.setDate(1);
1892
+ d.setFullYear(date.getFullYear());
1893
+ d.setMonth(date.getMonth());
1894
+ d.setDate(date.getDate());
1895
+ }
1896
+
1897
+ if (options.yearOffset) {
1898
+ d.setFullYear(d.getFullYear() + options.yearOffset);
1899
+ }
1900
+
1901
+ if (!norecursion && options.defaultTime) {
1902
+ time = _this.strtotime(options.defaultTime);
1903
+ d.setHours(time.getHours());
1904
+ d.setMinutes(time.getMinutes());
1905
+ }
1906
+ return d;
1907
+ };
1908
+
1909
+ _this.isValidDate = function (d) {
1910
+ if (Object.prototype.toString.call(d) !== "[object Date]") {
1911
+ return false;
1912
+ }
1913
+ return !isNaN(d.getTime());
1914
+ };
1915
+
1916
+ _this.setCurrentTime = function (dTime, requireValidDate) {
1917
+ if (typeof dTime === 'string') {
1918
+ _this.currentTime = _this.strToDateTime(dTime);
1919
+ }
1920
+ else if (_this.isValidDate(dTime)) {
1921
+ _this.currentTime = dTime;
1922
+ }
1923
+ else if (!dTime && !requireValidDate && options.allowBlank) {
1924
+ _this.currentTime = null;
1925
+ }
1926
+ else {
1927
+ _this.currentTime = _this.now();
1928
+ }
1929
+
1930
+ datetimepicker.trigger('xchange.xdsoft');
1931
+ };
1932
+
1933
+ _this.empty = function () {
1934
+ _this.currentTime = null;
1935
+ };
1936
+
1937
+ _this.getCurrentTime = function (dTime) {
1938
+ return _this.currentTime;
1939
+ };
1940
+
1941
+ _this.nextMonth = function () {
1942
+
1943
+ if (_this.currentTime === undefined || _this.currentTime === null) {
1944
+ _this.currentTime = _this.now();
1945
+ }
1946
+
1947
+ var month = _this.currentTime.getMonth() + 1,
1948
+ year;
1949
+ if (month === 12) {
1950
+ _this.currentTime.setFullYear(_this.currentTime.getFullYear() + 1);
1951
+ month = 0;
1952
+ }
1953
+
1954
+ year = _this.currentTime.getFullYear();
1955
+
1956
+ _this.currentTime.setDate(
1957
+ Math.min(
1958
+ new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1959
+ _this.currentTime.getDate()
1960
+ )
1961
+ );
1962
+ _this.currentTime.setMonth(month);
1963
+
1964
+ if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1965
+ options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1966
+ }
1967
+
1968
+ if (year !== _this.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) {
1969
+ options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1970
+ }
1971
+
1972
+ datetimepicker.trigger('xchange.xdsoft');
1973
+ return month;
1974
+ };
1975
+
1976
+ _this.prevMonth = function () {
1977
+
1978
+ if (_this.currentTime === undefined || _this.currentTime === null) {
1979
+ _this.currentTime = _this.now();
1980
+ }
1981
+
1982
+ var month = _this.currentTime.getMonth() - 1;
1983
+ if (month === -1) {
1984
+ _this.currentTime.setFullYear(_this.currentTime.getFullYear() - 1);
1985
+ month = 11;
1986
+ }
1987
+ _this.currentTime.setDate(
1988
+ Math.min(
1989
+ new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(),
1990
+ _this.currentTime.getDate()
1991
+ )
1992
+ );
1993
+ _this.currentTime.setMonth(month);
1994
+ if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) {
1995
+ options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
1996
+ }
1997
+ datetimepicker.trigger('xchange.xdsoft');
1998
+ return month;
1999
+ };
2000
+
2001
+ _this.getWeekOfYear = function (datetime) {
2002
+ if (options.onGetWeekOfYear && $.isFunction(options.onGetWeekOfYear)) {
2003
+ var week = options.onGetWeekOfYear.call(datetimepicker, datetime);
2004
+ if (typeof week !== 'undefined') {
2005
+ return week;
2006
+ }
2007
+ }
2008
+ var onejan = new Date(datetime.getFullYear(), 0, 1);
2009
+ //First week of the year is th one with the first Thursday according to ISO8601
2010
+ if(onejan.getDay()!=4)
2011
+ onejan.setMonth(0, 1 + ((4 - onejan.getDay()+ 7) % 7));
2012
+ return Math.ceil((((datetime - onejan) / 86400000) + onejan.getDay() + 1) / 7);
2013
+ };
2014
+
2015
+ _this.strToDateTime = function (sDateTime) {
2016
+ var tmpDate = [], timeOffset, currentTime;
2017
+
2018
+ if (sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime)) {
2019
+ return sDateTime;
2020
+ }
2021
+
2022
+ tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime);
2023
+ if (tmpDate) {
2024
+ tmpDate[2] = dateHelper.parseDate(tmpDate[2], options.formatDate);
2025
+ }
2026
+ if (tmpDate && tmpDate[2]) {
2027
+ timeOffset = tmpDate[2].getTime() - (tmpDate[2].getTimezoneOffset()) * 60000;
2028
+ currentTime = new Date((_this.now(true)).getTime() + parseInt(tmpDate[1] + '1', 10) * timeOffset);
2029
+ } else {
2030
+ currentTime = sDateTime ? dateHelper.parseDate(sDateTime, options.format) : _this.now();
2031
+ }
2032
+
2033
+ if (!_this.isValidDate(currentTime)) {
2034
+ currentTime = _this.now();
2035
+ }
2036
+
2037
+ return currentTime;
2038
+ };
2039
+
2040
+ _this.strToDate = function (sDate) {
2041
+ if (sDate && sDate instanceof Date && _this.isValidDate(sDate)) {
2042
+ return sDate;
2043
+ }
2044
+
2045
+ var currentTime = sDate ? dateHelper.parseDate(sDate, options.formatDate) : _this.now(true);
2046
+ if (!_this.isValidDate(currentTime)) {
2047
+ currentTime = _this.now(true);
2048
+ }
2049
+ return currentTime;
2050
+ };
2051
+
2052
+ _this.strtotime = function (sTime) {
2053
+ if (sTime && sTime instanceof Date && _this.isValidDate(sTime)) {
2054
+ return sTime;
2055
+ }
2056
+ var currentTime = sTime ? dateHelper.parseDate(sTime, options.formatTime) : _this.now(true);
2057
+ if (!_this.isValidDate(currentTime)) {
2058
+ currentTime = _this.now(true);
2059
+ }
2060
+ return currentTime;
2061
+ };
2062
+
2063
+ _this.str = function () {
2064
+ return dateHelper.formatDate(_this.currentTime, options.format);
2065
+ };
2066
+ _this.currentTime = this.now();
2067
+ };
2068
+
2069
+ _xdsoft_datetime = new XDSoft_datetime();
2070
+
2071
+ applyButton.on('touchend click', function (e) {//pathbrite
2072
+ e.preventDefault();
2073
+ datetimepicker.data('changed', true);
2074
+ _xdsoft_datetime.setCurrentTime(getCurrentValue());
2075
+ input.val(_xdsoft_datetime.str());
2076
+ datetimepicker.trigger('close.xdsoft');
2077
+ });
2078
+ month_picker
2079
+ .find('.xdsoft_today_button')
2080
+ .on('touchend mousedown.xdsoft', function () {
2081
+ datetimepicker.data('changed', true);
2082
+ _xdsoft_datetime.setCurrentTime(0, true);
2083
+ datetimepicker.trigger('afterOpen.xdsoft');
2084
+ }).on('dblclick.xdsoft', function () {
2085
+ var currentDate = _xdsoft_datetime.getCurrentTime(), minDate, maxDate;
2086
+ currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
2087
+ minDate = _xdsoft_datetime.strToDate(options.minDate);
2088
+ minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
2089
+ if (currentDate < minDate) {
2090
+ return;
2091
+ }
2092
+ maxDate = _xdsoft_datetime.strToDate(options.maxDate);
2093
+ maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate());
2094
+ if (currentDate > maxDate) {
2095
+ return;
2096
+ }
2097
+ input.val(_xdsoft_datetime.str());
2098
+ input.trigger('change');
2099
+ datetimepicker.trigger('close.xdsoft');
2100
+ });
2101
+ month_picker
2102
+ .find('.xdsoft_prev,.xdsoft_next')
2103
+ .on('touchend mousedown.xdsoft', function () {
2104
+ var $this = $(this),
2105
+ timer = 0,
2106
+ stop = false;
2107
+
2108
+ (function arguments_callee1(v) {
2109
+ if ($this.hasClass(options.next)) {
2110
+ _xdsoft_datetime.nextMonth();
2111
+ } else if ($this.hasClass(options.prev)) {
2112
+ _xdsoft_datetime.prevMonth();
2113
+ }
2114
+ if (options.monthChangeSpinner) {
2115
+ if (!stop) {
2116
+ timer = setTimeout(arguments_callee1, v || 100);
2117
+ }
2118
+ }
2119
+ }(500));
2120
+
2121
+ $([options.ownerDocument.body, options.contentWindow]).on('touchend mouseup.xdsoft', function arguments_callee2() {
2122
+ clearTimeout(timer);
2123
+ stop = true;
2124
+ $([options.ownerDocument.body, options.contentWindow]).off('touchend mouseup.xdsoft', arguments_callee2);
2125
+ });
2126
+ });
2127
+
2128
+ timepicker
2129
+ .find('.xdsoft_prev,.xdsoft_next')
2130
+ .on('touchend mousedown.xdsoft', function () {
2131
+ var $this = $(this),
2132
+ timer = 0,
2133
+ stop = false,
2134
+ period = 110;
2135
+ (function arguments_callee4(v) {
2136
+ var pheight = timeboxparent[0].clientHeight,
2137
+ height = timebox[0].offsetHeight,
2138
+ top = Math.abs(parseInt(timebox.css('marginTop'), 10));
2139
+ if ($this.hasClass(options.next) && (height - pheight) - options.timeHeightInTimePicker >= top) {
2140
+ timebox.css('marginTop', '-' + (top + options.timeHeightInTimePicker) + 'px');
2141
+ } else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) {
2142
+ timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px');
2143
+ }
2144
+ /**
2145
+ * Fixed bug:
2146
+ * When using css3 transition, it will cause a bug that you cannot scroll the timepicker list.
2147
+ * The reason is that the transition-duration time, if you set it to 0, all things fine, otherwise, this
2148
+ * would cause a bug when you use jquery.css method.
2149
+ * Let's say: * { transition: all .5s ease; }
2150
+ * jquery timebox.css('marginTop') will return the original value which is before you clicking the next/prev button,
2151
+ * meanwhile the timebox[0].style.marginTop will return the right value which is after you clicking the
2152
+ * next/prev button.
2153
+ *
2154
+ * What we should do:
2155
+ * Replace timebox.css('marginTop') with timebox[0].style.marginTop.
2156
+ */
2157
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox[0].style.marginTop, 10) / (height - pheight))]);
2158
+ period = (period > 10) ? 10 : period - 10;
2159
+ if (!stop) {
2160
+ timer = setTimeout(arguments_callee4, v || period);
2161
+ }
2162
+ }(500));
2163
+ $([options.ownerDocument.body, options.contentWindow]).on('touchend mouseup.xdsoft', function arguments_callee5() {
2164
+ clearTimeout(timer);
2165
+ stop = true;
2166
+ $([options.ownerDocument.body, options.contentWindow])
2167
+ .off('touchend mouseup.xdsoft', arguments_callee5);
2168
+ });
2169
+ });
2170
+
2171
+ xchangeTimer = 0;
2172
+ // base handler - generating a calendar and timepicker
2173
+ datetimepicker
2174
+ .on('xchange.xdsoft', function (event) {
2175
+ clearTimeout(xchangeTimer);
2176
+ xchangeTimer = setTimeout(function () {
2177
+
2178
+ if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
2179
+ //In case blanks are allowed, delay construction until we have a valid date
2180
+ if (options.allowBlank)
2181
+ return;
2182
+
2183
+ _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2184
+ }
2185
+
2186
+ var table = '',
2187
+ start = new Date(_xdsoft_datetime.currentTime.getFullYear(), _xdsoft_datetime.currentTime.getMonth(), 1, 12, 0, 0),
2188
+ i = 0,
2189
+ j,
2190
+ today = _xdsoft_datetime.now(),
2191
+ maxDate = false,
2192
+ minDate = false,
2193
+ hDate,
2194
+ day,
2195
+ d,
2196
+ y,
2197
+ m,
2198
+ w,
2199
+ classes = [],
2200
+ customDateSettings,
2201
+ newRow = true,
2202
+ time = '',
2203
+ h = '',
2204
+ line_time,
2205
+ description;
2206
+
2207
+ while (start.getDay() !== options.dayOfWeekStart) {
2208
+ start.setDate(start.getDate() - 1);
2209
+ }
2210
+
2211
+ table += '<table><thead><tr>';
2212
+
2213
+ if (options.weeks) {
2214
+ table += '<th></th>';
2215
+ }
2216
+
2217
+ for (j = 0; j < 7; j += 1) {
2218
+ table += '<th>' + options.i18n[globalLocale].dayOfWeekShort[(j + options.dayOfWeekStart) % 7] + '</th>';
2219
+ }
2220
+
2221
+ table += '</tr></thead>';
2222
+ table += '<tbody>';
2223
+
2224
+ if (options.maxDate !== false) {
2225
+ maxDate = _xdsoft_datetime.strToDate(options.maxDate);
2226
+ maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59, 59, 999);
2227
+ }
2228
+
2229
+ if (options.minDate !== false) {
2230
+ minDate = _xdsoft_datetime.strToDate(options.minDate);
2231
+ minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
2232
+ }
2233
+
2234
+ while (i < _xdsoft_datetime.currentTime.countDaysInMonth() || start.getDay() !== options.dayOfWeekStart || _xdsoft_datetime.currentTime.getMonth() === start.getMonth()) {
2235
+ classes = [];
2236
+ i += 1;
2237
+
2238
+ day = start.getDay();
2239
+ d = start.getDate();
2240
+ y = start.getFullYear();
2241
+ m = start.getMonth();
2242
+ w = _xdsoft_datetime.getWeekOfYear(start);
2243
+ description = '';
2244
+
2245
+ classes.push('xdsoft_date');
2246
+
2247
+ if (options.beforeShowDay && $.isFunction(options.beforeShowDay.call)) {
2248
+ customDateSettings = options.beforeShowDay.call(datetimepicker, start);
2249
+ } else {
2250
+ customDateSettings = null;
2251
+ }
2252
+
2253
+ if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
2254
+ if(!options.allowDateRe.test(dateHelper.formatDate(start, options.formatDate))){
2255
+ classes.push('xdsoft_disabled');
2256
+ }
2257
+ } else if(options.allowDates && options.allowDates.length>0){
2258
+ if(options.allowDates.indexOf(dateHelper.formatDate(start, options.formatDate)) === -1){
2259
+ classes.push('xdsoft_disabled');
2260
+ }
2261
+ } else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
2262
+ classes.push('xdsoft_disabled');
2263
+ } else if (options.disabledDates.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
2264
+ classes.push('xdsoft_disabled');
2265
+ } else if (options.disabledWeekDays.indexOf(day) !== -1) {
2266
+ classes.push('xdsoft_disabled');
2267
+ }else if (input.is('[readonly]')) {
2268
+ classes.push('xdsoft_disabled');
2269
+ }
2270
+
2271
+ if (customDateSettings && customDateSettings[1] !== "") {
2272
+ classes.push(customDateSettings[1]);
2273
+ }
2274
+
2275
+ if (_xdsoft_datetime.currentTime.getMonth() !== m) {
2276
+ classes.push('xdsoft_other_month');
2277
+ }
2278
+
2279
+ if ((options.defaultSelect || datetimepicker.data('changed')) && dateHelper.formatDate(_xdsoft_datetime.currentTime, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
2280
+ classes.push('xdsoft_current');
2281
+ }
2282
+
2283
+ if (dateHelper.formatDate(today, options.formatDate) === dateHelper.formatDate(start, options.formatDate)) {
2284
+ classes.push('xdsoft_today');
2285
+ }
2286
+
2287
+ if (start.getDay() === 0 || start.getDay() === 6 || options.weekends.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
2288
+ classes.push('xdsoft_weekend');
2289
+ }
2290
+
2291
+ if (options.highlightedDates[dateHelper.formatDate(start, options.formatDate)] !== undefined) {
2292
+ hDate = options.highlightedDates[dateHelper.formatDate(start, options.formatDate)];
2293
+ classes.push(hDate.style === undefined ? 'xdsoft_highlighted_default' : hDate.style);
2294
+ description = hDate.desc === undefined ? '' : hDate.desc;
2295
+ }
2296
+
2297
+ if (options.beforeShowDay && $.isFunction(options.beforeShowDay)) {
2298
+ classes.push(options.beforeShowDay(start));
2299
+ }
2300
+
2301
+ if (newRow) {
2302
+ table += '<tr>';
2303
+ newRow = false;
2304
+ if (options.weeks) {
2305
+ table += '<th>' + w + '</th>';
2306
+ }
2307
+ }
2308
+
2309
+ table += '<td data-date="' + d + '" data-month="' + m + '" data-year="' + y + '"' + ' class="xdsoft_date xdsoft_day_of_week' + start.getDay() + ' ' + classes.join(' ') + '" title="' + description + '">' +
2310
+ '<div>' + d + '</div>' +
2311
+ '</td>';
2312
+
2313
+ if (start.getDay() === options.dayOfWeekStartPrev) {
2314
+ table += '</tr>';
2315
+ newRow = true;
2316
+ }
2317
+
2318
+ start.setDate(d + 1);
2319
+ }
2320
+ table += '</tbody></table>';
2321
+
2322
+ calendar.html(table);
2323
+
2324
+ month_picker.find('.xdsoft_label span').eq(0).text(options.i18n[globalLocale].months[_xdsoft_datetime.currentTime.getMonth()]);
2325
+ month_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear());
2326
+
2327
+ // generate timebox
2328
+ time = '';
2329
+ h = '';
2330
+ m = '';
2331
+
2332
+ line_time = function line_time(h, m) {
2333
+ var now = _xdsoft_datetime.now(), optionDateTime, current_time,
2334
+ isALlowTimesInit = options.allowTimes && $.isArray(options.allowTimes) && options.allowTimes.length;
2335
+ now.setHours(h);
2336
+ h = parseInt(now.getHours(), 10);
2337
+ now.setMinutes(m);
2338
+ m = parseInt(now.getMinutes(), 10);
2339
+ optionDateTime = new Date(_xdsoft_datetime.currentTime);
2340
+ optionDateTime.setHours(h);
2341
+ optionDateTime.setMinutes(m);
2342
+ classes = [];
2343
+ if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) {
2344
+ classes.push('xdsoft_disabled');
2345
+ } else if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || ((options.disabledMinTime !== false && now.getTime() > _xdsoft_datetime.strtotime(options.disabledMinTime).getTime()) && (options.disabledMaxTime !== false && now.getTime() < _xdsoft_datetime.strtotime(options.disabledMaxTime).getTime()))) {
2346
+ classes.push('xdsoft_disabled');
2347
+ } else if (input.is('[readonly]')) {
2348
+ classes.push('xdsoft_disabled');
2349
+ }
2350
+
2351
+ current_time = new Date(_xdsoft_datetime.currentTime);
2352
+ current_time.setHours(parseInt(_xdsoft_datetime.currentTime.getHours(), 10));
2353
+
2354
+ if (!isALlowTimesInit) {
2355
+ current_time.setMinutes(Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes() / options.step) * options.step);
2356
+ }
2357
+
2358
+ if ((options.initTime || options.defaultSelect || datetimepicker.data('changed')) && current_time.getHours() === parseInt(h, 10) && ((!isALlowTimesInit && options.step > 59) || current_time.getMinutes() === parseInt(m, 10))) {
2359
+ if (options.defaultSelect || datetimepicker.data('changed')) {
2360
+ classes.push('xdsoft_current');
2361
+ } else if (options.initTime) {
2362
+ classes.push('xdsoft_init_time');
2363
+ }
2364
+ }
2365
+ if (parseInt(today.getHours(), 10) === parseInt(h, 10) && parseInt(today.getMinutes(), 10) === parseInt(m, 10)) {
2366
+ classes.push('xdsoft_today');
2367
+ }
2368
+ time += '<div class="xdsoft_time ' + classes.join(' ') + '" data-hour="' + h + '" data-minute="' + m + '">' + dateHelper.formatDate(now, options.formatTime) + '</div>';
2369
+ };
2370
+
2371
+ if (!options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length) {
2372
+ for (i = 0, j = 0; i < (options.hours12 ? 12 : 24); i += 1) {
2373
+ for (j = 0; j < 60; j += options.step) {
2374
+ h = (i < 10 ? '0' : '') + i;
2375
+ m = (j < 10 ? '0' : '') + j;
2376
+ line_time(h, m);
2377
+ }
2378
+ }
2379
+ } else {
2380
+ for (i = 0; i < options.allowTimes.length; i += 1) {
2381
+ h = _xdsoft_datetime.strtotime(options.allowTimes[i]).getHours();
2382
+ m = _xdsoft_datetime.strtotime(options.allowTimes[i]).getMinutes();
2383
+ line_time(h, m);
2384
+ }
2385
+ }
2386
+
2387
+ timebox.html(time);
2388
+
2389
+ opt = '';
2390
+ i = 0;
2391
+
2392
+ for (i = parseInt(options.yearStart, 10) + options.yearOffset; i <= parseInt(options.yearEnd, 10) + options.yearOffset; i += 1) {
2393
+ opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getFullYear() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + i + '</div>';
2394
+ }
2395
+ yearselect.children().eq(0)
2396
+ .html(opt);
2397
+
2398
+ for (i = parseInt(options.monthStart, 10), opt = ''; i <= parseInt(options.monthEnd, 10); i += 1) {
2399
+ opt += '<div class="xdsoft_option ' + (_xdsoft_datetime.currentTime.getMonth() === i ? 'xdsoft_current' : '') + '" data-value="' + i + '">' + options.i18n[globalLocale].months[i] + '</div>';
2400
+ }
2401
+ monthselect.children().eq(0).html(opt);
2402
+ $(datetimepicker)
2403
+ .trigger('generate.xdsoft');
2404
+ }, 10);
2405
+ event.stopPropagation();
2406
+ })
2407
+ .on('afterOpen.xdsoft', function () {
2408
+ if (options.timepicker) {
2409
+ var classType, pheight, height, top;
2410
+ if (timebox.find('.xdsoft_current').length) {
2411
+ classType = '.xdsoft_current';
2412
+ } else if (timebox.find('.xdsoft_init_time').length) {
2413
+ classType = '.xdsoft_init_time';
2414
+ }
2415
+ if (classType) {
2416
+ pheight = timeboxparent[0].clientHeight;
2417
+ height = timebox[0].offsetHeight;
2418
+ top = timebox.find(classType).index() * options.timeHeightInTimePicker + 1;
2419
+ if ((height - pheight) < top) {
2420
+ top = height - pheight;
2421
+ }
2422
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [parseInt(top, 10) / (height - pheight)]);
2423
+ } else {
2424
+ timeboxparent.trigger('scroll_element.xdsoft_scroller', [0]);
2425
+ }
2426
+ }
2427
+ });
2428
+
2429
+ timerclick = 0;
2430
+ calendar
2431
+ .on('touchend click.xdsoft', 'td', function (xdevent) {
2432
+ xdevent.stopPropagation(); // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap
2433
+ timerclick += 1;
2434
+ var $this = $(this),
2435
+ currentTime = _xdsoft_datetime.currentTime;
2436
+
2437
+ if (currentTime === undefined || currentTime === null) {
2438
+ _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2439
+ currentTime = _xdsoft_datetime.currentTime;
2440
+ }
2441
+
2442
+ if ($this.hasClass('xdsoft_disabled')) {
2443
+ return false;
2444
+ }
2445
+
2446
+ currentTime.setDate(1);
2447
+ currentTime.setFullYear($this.data('year'));
2448
+ currentTime.setMonth($this.data('month'));
2449
+ currentTime.setDate($this.data('date'));
2450
+
2451
+ datetimepicker.trigger('select.xdsoft', [currentTime]);
2452
+
2453
+ input.val(_xdsoft_datetime.str());
2454
+
2455
+ if (options.onSelectDate && $.isFunction(options.onSelectDate)) {
2456
+ options.onSelectDate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
2457
+ }
2458
+
2459
+ datetimepicker.data('changed', true);
2460
+ datetimepicker.trigger('xchange.xdsoft');
2461
+ datetimepicker.trigger('changedatetime.xdsoft');
2462
+ if ((timerclick > 1 || (options.closeOnDateSelect === true || (options.closeOnDateSelect === false && !options.timepicker))) && !options.inline) {
2463
+ datetimepicker.trigger('close.xdsoft');
2464
+ }
2465
+ setTimeout(function () {
2466
+ timerclick = 0;
2467
+ }, 200);
2468
+ });
2469
+
2470
+ timebox
2471
+ .on('touchend click.xdsoft', 'div', function (xdevent) {
2472
+ xdevent.stopPropagation();
2473
+ var $this = $(this),
2474
+ currentTime = _xdsoft_datetime.currentTime;
2475
+
2476
+ if (currentTime === undefined || currentTime === null) {
2477
+ _xdsoft_datetime.currentTime = _xdsoft_datetime.now();
2478
+ currentTime = _xdsoft_datetime.currentTime;
2479
+ }
2480
+
2481
+ if ($this.hasClass('xdsoft_disabled')) {
2482
+ return false;
2483
+ }
2484
+ currentTime.setHours($this.data('hour'));
2485
+ currentTime.setMinutes($this.data('minute'));
2486
+ datetimepicker.trigger('select.xdsoft', [currentTime]);
2487
+
2488
+ datetimepicker.data('input').val(_xdsoft_datetime.str());
2489
+
2490
+ if (options.onSelectTime && $.isFunction(options.onSelectTime)) {
2491
+ options.onSelectTime.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent);
2492
+ }
2493
+ datetimepicker.data('changed', true);
2494
+ datetimepicker.trigger('xchange.xdsoft');
2495
+ datetimepicker.trigger('changedatetime.xdsoft');
2496
+ if (options.inline !== true && options.closeOnTimeSelect === true) {
2497
+ datetimepicker.trigger('close.xdsoft');
2498
+ }
2499
+ });
2500
+
2501
+ datepicker
2502
+ .on('mousewheel.xdsoft', function (event) {
2503
+ if (!options.scrollMonth) {
2504
+ return true;
2505
+ }
2506
+ if (event.deltaY < 0) {
2507
+ _xdsoft_datetime.nextMonth();
2508
+ } else {
2509
+ _xdsoft_datetime.prevMonth();
2510
+ }
2511
+ return false;
2512
+ });
2513
+
2514
+ input
2515
+ .on('mousewheel.xdsoft', function (event) {
2516
+ if (!options.scrollInput) {
2517
+ return true;
2518
+ }
2519
+ if (!options.datepicker && options.timepicker) {
2520
+ current_time_index = timebox.find('.xdsoft_current').length ? timebox.find('.xdsoft_current').eq(0).index() : 0;
2521
+ if (current_time_index + event.deltaY >= 0 && current_time_index + event.deltaY < timebox.children().length) {
2522
+ current_time_index += event.deltaY;
2523
+ }
2524
+ if (timebox.children().eq(current_time_index).length) {
2525
+ timebox.children().eq(current_time_index).trigger('mousedown');
2526
+ }
2527
+ return false;
2528
+ }
2529
+ if (options.datepicker && !options.timepicker) {
2530
+ datepicker.trigger(event, [event.deltaY, event.deltaX, event.deltaY]);
2531
+ if (input.val) {
2532
+ input.val(_xdsoft_datetime.str());
2533
+ }
2534
+ datetimepicker.trigger('changedatetime.xdsoft');
2535
+ return false;
2536
+ }
2537
+ });
2538
+
2539
+ datetimepicker
2540
+ .on('changedatetime.xdsoft', function (event) {
2541
+ if (options.onChangeDateTime && $.isFunction(options.onChangeDateTime)) {
2542
+ var $input = datetimepicker.data('input');
2543
+ options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input, event);
2544
+ delete options.value;
2545
+ $input.trigger('change');
2546
+ }
2547
+ })
2548
+ .on('generate.xdsoft', function () {
2549
+ if (options.onGenerate && $.isFunction(options.onGenerate)) {
2550
+ options.onGenerate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'));
2551
+ }
2552
+ if (triggerAfterOpen) {
2553
+ datetimepicker.trigger('afterOpen.xdsoft');
2554
+ triggerAfterOpen = false;
2555
+ }
2556
+ })
2557
+ .on('click.xdsoft', function (xdevent) {
2558
+ xdevent.stopPropagation();
2559
+ });
2560
+
2561
+ current_time_index = 0;
2562
+
2563
+ /**
2564
+ * Runs the callback for each of the specified node's ancestors.
2565
+ *
2566
+ * Return FALSE from the callback to stop ascending.
2567
+ *
2568
+ * @param {DOMNode} node
2569
+ * @param {Function} callback
2570
+ * @returns {undefined}
2571
+ */
2572
+ forEachAncestorOf = function (node, callback) {
2573
+ do {
2574
+ node = node.parentNode;
2575
+
2576
+ if (callback(node) === false) {
2577
+ break;
2578
+ }
2579
+ } while (node.nodeName !== 'HTML');
2580
+ };
2581
+
2582
+ /**
2583
+ * Sets the position of the picker.
2584
+ *
2585
+ * @returns {undefined}
2586
+ */
2587
+ setPos = function () {
2588
+ var dateInputOffset,
2589
+ dateInputElem,
2590
+ verticalPosition,
2591
+ left,
2592
+ position,
2593
+ datetimepickerElem,
2594
+ dateInputHasFixedAncestor,
2595
+ $dateInput,
2596
+ windowWidth,
2597
+ verticalAnchorEdge,
2598
+ datetimepickerCss,
2599
+ windowHeight,
2600
+ windowScrollTop;
2601
+
2602
+ $dateInput = datetimepicker.data('input');
2603
+ dateInputOffset = $dateInput.offset();
2604
+ dateInputElem = $dateInput[0];
2605
+
2606
+ verticalAnchorEdge = 'top';
2607
+ verticalPosition = (dateInputOffset.top + dateInputElem.offsetHeight) - 1;
2608
+ left = dateInputOffset.left;
2609
+ position = "absolute";
2610
+
2611
+ windowWidth = $(options.contentWindow).width();
2612
+ windowHeight = $(options.contentWindow).height();
2613
+ windowScrollTop = $(options.contentWindow).scrollTop();
2614
+
2615
+ if ((options.ownerDocument.documentElement.clientWidth - dateInputOffset.left) < datepicker.parent().outerWidth(true)) {
2616
+ var diff = datepicker.parent().outerWidth(true) - dateInputElem.offsetWidth;
2617
+ left = left - diff;
2618
+ }
2619
+
2620
+ if ($dateInput.parent().css('direction') === 'rtl') {
2621
+ left -= (datetimepicker.outerWidth() - $dateInput.outerWidth());
2622
+ }
2623
+
2624
+ if (options.fixed) {
2625
+ verticalPosition -= windowScrollTop;
2626
+ left -= $(options.contentWindow).scrollLeft();
2627
+ position = "fixed";
2628
+ } else {
2629
+ dateInputHasFixedAncestor = false;
2630
+
2631
+ forEachAncestorOf(dateInputElem, function (ancestorNode) {
2632
+ if (options.contentWindow.getComputedStyle(ancestorNode).getPropertyValue('position') === 'fixed') {
2633
+ dateInputHasFixedAncestor = true;
2634
+ return false;
2635
+ }
2636
+ });
2637
+
2638
+ if (dateInputHasFixedAncestor) {
2639
+ position = 'fixed';
2640
+
2641
+ //If the picker won't fit entirely within the viewport then display it above the date input.
2642
+ if (verticalPosition + datetimepicker.outerHeight() > windowHeight + windowScrollTop) {
2643
+ verticalAnchorEdge = 'bottom';
2644
+ verticalPosition = (windowHeight + windowScrollTop) - dateInputOffset.top;
2645
+ } else {
2646
+ verticalPosition -= windowScrollTop;
2647
+ }
2648
+ } else {
2649
+ if (verticalPosition + dateInputElem.offsetHeight > windowHeight + windowScrollTop) {
2650
+ verticalPosition = dateInputOffset.top - dateInputElem.offsetHeight + 1;
2651
+ }
2652
+ }
2653
+
2654
+ if (verticalPosition < 0) {
2655
+ verticalPosition = 0;
2656
+ }
2657
+
2658
+ if (left + dateInputElem.offsetWidth > windowWidth) {
2659
+ left = windowWidth - dateInputElem.offsetWidth;
2660
+ }
2661
+ }
2662
+
2663
+ datetimepickerElem = datetimepicker[0];
2664
+
2665
+ forEachAncestorOf(datetimepickerElem, function (ancestorNode) {
2666
+ var ancestorNodePosition;
2667
+
2668
+ ancestorNodePosition = options.contentWindow.getComputedStyle(ancestorNode).getPropertyValue('position');
2669
+
2670
+ if (ancestorNodePosition === 'relative' && windowWidth >= ancestorNode.offsetWidth) {
2671
+ left = left - ((windowWidth - ancestorNode.offsetWidth) / 2);
2672
+ return false;
2673
+ }
2674
+ });
2675
+
2676
+ datetimepickerCss = {
2677
+ position: position,
2678
+ left: left,
2679
+ top: '', //Initialize to prevent previous values interfering with new ones.
2680
+ bottom: '' //Initialize to prevent previous values interfering with new ones.
2681
+ };
2682
+
2683
+ datetimepickerCss[verticalAnchorEdge] = verticalPosition;
2684
+
2685
+ datetimepicker.css(datetimepickerCss);
2686
+ };
2687
+
2688
+ datetimepicker
2689
+ .on('open.xdsoft', function (event) {
2690
+ var onShow = true;
2691
+ if (options.onShow && $.isFunction(options.onShow)) {
2692
+ onShow = options.onShow.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2693
+ }
2694
+ if (onShow !== false) {
2695
+ datetimepicker.show();
2696
+ setPos();
2697
+ $(options.contentWindow)
2698
+ .off('resize.xdsoft', setPos)
2699
+ .on('resize.xdsoft', setPos);
2700
+
2701
+ if (options.closeOnWithoutClick) {
2702
+ $([options.ownerDocument.body, options.contentWindow]).on('touchstart mousedown.xdsoft', function arguments_callee6() {
2703
+ datetimepicker.trigger('close.xdsoft');
2704
+ $([options.ownerDocument.body, options.contentWindow]).off('touchstart mousedown.xdsoft', arguments_callee6);
2705
+ });
2706
+ }
2707
+ }
2708
+ })
2709
+ .on('close.xdsoft', function (event) {
2710
+ var onClose = true;
2711
+ month_picker
2712
+ .find('.xdsoft_month,.xdsoft_year')
2713
+ .find('.xdsoft_select')
2714
+ .hide();
2715
+ if (options.onClose && $.isFunction(options.onClose)) {
2716
+ onClose = options.onClose.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event);
2717
+ }
2718
+ if (onClose !== false && !options.opened && !options.inline) {
2719
+ datetimepicker.hide();
2720
+ }
2721
+ event.stopPropagation();
2722
+ })
2723
+ .on('toggle.xdsoft', function () {
2724
+ if (datetimepicker.is(':visible')) {
2725
+ datetimepicker.trigger('close.xdsoft');
2726
+ } else {
2727
+ datetimepicker.trigger('open.xdsoft');
2728
+ }
2729
+ })
2730
+ .data('input', input);
2731
+
2732
+ timer = 0;
2733
+
2734
+ datetimepicker.data('xdsoft_datetime', _xdsoft_datetime);
2735
+ datetimepicker.setOptions(options);
2736
+
2737
+ function getCurrentValue() {
2738
+ var ct = false, time;
2739
+
2740
+ if (options.startDate) {
2741
+ ct = _xdsoft_datetime.strToDate(options.startDate);
2742
+ } else {
2743
+ ct = options.value || ((input && input.val && input.val()) ? input.val() : '');
2744
+ if (ct) {
2745
+ ct = _xdsoft_datetime.strToDateTime(ct);
2746
+ } else if (options.defaultDate) {
2747
+ ct = _xdsoft_datetime.strToDateTime(options.defaultDate);
2748
+ if (options.defaultTime) {
2749
+ time = _xdsoft_datetime.strtotime(options.defaultTime);
2750
+ ct.setHours(time.getHours());
2751
+ ct.setMinutes(time.getMinutes());
2752
+ }
2753
+ }
2754
+ }
2755
+
2756
+ if (ct && _xdsoft_datetime.isValidDate(ct)) {
2757
+ datetimepicker.data('changed', true);
2758
+ } else {
2759
+ ct = '';
2760
+ }
2761
+
2762
+ return ct || 0;
2763
+ }
2764
+
2765
+ function setMask(options) {
2766
+
2767
+ var isValidValue = function (mask, value) {
2768
+ var reg = mask
2769
+ .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
2770
+ .replace(/_/g, '{digit+}')
2771
+ .replace(/([0-9]{1})/g, '{digit$1}')
2772
+ .replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
2773
+ .replace(/\{digit[\+]\}/g, '[0-9_]{1}');
2774
+ return (new RegExp(reg)).test(value);
2775
+ },
2776
+ getCaretPos = function (input) {
2777
+ try {
2778
+ if (options.ownerDocument.selection && options.ownerDocument.selection.createRange) {
2779
+ var range = options.ownerDocument.selection.createRange();
2780
+ return range.getBookmark().charCodeAt(2) - 2;
2781
+ }
2782
+ if (input.setSelectionRange) {
2783
+ return input.selectionStart;
2784
+ }
2785
+ } catch (e) {
2786
+ return 0;
2787
+ }
2788
+ },
2789
+ setCaretPos = function (node, pos) {
2790
+ node = (typeof node === "string" || node instanceof String) ? options.ownerDocument.getElementById(node) : node;
2791
+ if (!node) {
2792
+ return false;
2793
+ }
2794
+ if (node.createTextRange) {
2795
+ var textRange = node.createTextRange();
2796
+ textRange.collapse(true);
2797
+ textRange.moveEnd('character', pos);
2798
+ textRange.moveStart('character', pos);
2799
+ textRange.select();
2800
+ return true;
2801
+ }
2802
+ if (node.setSelectionRange) {
2803
+ node.setSelectionRange(pos, pos);
2804
+ return true;
2805
+ }
2806
+ return false;
2807
+ };
2808
+ if(options.mask) {
2809
+ input.off('keydown.xdsoft');
2810
+ }
2811
+ if (options.mask === true) {
2812
+ if (typeof moment != 'undefined') {
2813
+ options.mask = options.format
2814
+ .replace(/Y{4}/g, '9999')
2815
+ .replace(/Y{2}/g, '99')
2816
+ .replace(/M{2}/g, '19')
2817
+ .replace(/D{2}/g, '39')
2818
+ .replace(/H{2}/g, '29')
2819
+ .replace(/m{2}/g, '59')
2820
+ .replace(/s{2}/g, '59');
2821
+ } else {
2822
+ options.mask = options.format
2823
+ .replace(/Y/g, '9999')
2824
+ .replace(/F/g, '9999')
2825
+ .replace(/m/g, '19')
2826
+ .replace(/d/g, '39')
2827
+ .replace(/H/g, '29')
2828
+ .replace(/i/g, '59')
2829
+ .replace(/s/g, '59');
2830
+ }
2831
+ }
2832
+
2833
+ if ($.type(options.mask) === 'string') {
2834
+ if (!isValidValue(options.mask, input.val())) {
2835
+ input.val(options.mask.replace(/[0-9]/g, '_'));
2836
+ setCaretPos(input[0], 0);
2837
+ }
2838
+
2839
+ input.on('keydown.xdsoft', function (event) {
2840
+ var val = this.value,
2841
+ key = event.which,
2842
+ pos,
2843
+ digit;
2844
+
2845
+ if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
2846
+ pos = getCaretPos(this);
2847
+ digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
2848
+
2849
+ if ((key === BACKSPACE || key === DEL) && pos) {
2850
+ pos -= 1;
2851
+ digit = '_';
2852
+ }
2853
+
2854
+ while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2855
+ pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2856
+ }
2857
+
2858
+ val = val.substr(0, pos) + digit + val.substr(pos + 1);
2859
+ if ($.trim(val) === '') {
2860
+ val = options.mask.replace(/[0-9]/g, '_');
2861
+ } else {
2862
+ if (pos === options.mask.length) {
2863
+ event.preventDefault();
2864
+ return false;
2865
+ }
2866
+ }
2867
+
2868
+ pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
2869
+ while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
2870
+ pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
2871
+ }
2872
+
2873
+ if (isValidValue(options.mask, val)) {
2874
+ this.value = val;
2875
+ setCaretPos(this, pos);
2876
+ } else if ($.trim(val) === '') {
2877
+ this.value = options.mask.replace(/[0-9]/g, '_');
2878
+ } else {
2879
+ input.trigger('error_input.xdsoft');
2880
+ }
2881
+ } else {
2882
+ if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
2883
+ return true;
2884
+ }
2885
+ }
2886
+
2887
+ event.preventDefault();
2888
+ return false;
2889
+ });
2890
+ }
2891
+ }
2892
+
2893
+ _xdsoft_datetime.setCurrentTime(getCurrentValue());
2894
+
2895
+ input
2896
+ .data('xdsoft_datetimepicker', datetimepicker)
2897
+ .on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function () {
2898
+ if (input.is(':disabled') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) {
2899
+ return;
2900
+ }
2901
+ clearTimeout(timer);
2902
+ timer = setTimeout(function () {
2903
+ if (input.is(':disabled')) {
2904
+ return;
2905
+ }
2906
+
2907
+ triggerAfterOpen = true;
2908
+ _xdsoft_datetime.setCurrentTime(getCurrentValue(), true);
2909
+ if(options.mask) {
2910
+ setMask(options);
2911
+ }
2912
+ datetimepicker.trigger('open.xdsoft');
2913
+ }, 100);
2914
+ })
2915
+ .on('keydown.xdsoft', function (event) {
2916
+ var elementSelector,
2917
+ key = event.which;
2918
+ if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) {
2919
+ elementSelector = $("input:visible,textarea:visible,button:visible,a:visible");
2920
+ datetimepicker.trigger('close.xdsoft');
2921
+ elementSelector.eq(elementSelector.index(this) + 1).focus();
2922
+ return false;
2923
+ }
2924
+ if ([TAB].indexOf(key) !== -1) {
2925
+ datetimepicker.trigger('close.xdsoft');
2926
+ return true;
2927
+ }
2928
+ })
2929
+ .on('blur.xdsoft', function () {
2930
+ datetimepicker.trigger('close.xdsoft');
2931
+ });
2932
+ };
2933
+ destroyDateTimePicker = function (input) {
2934
+ var datetimepicker = input.data('xdsoft_datetimepicker');
2935
+ if (datetimepicker) {
2936
+ datetimepicker.data('xdsoft_datetime', null);
2937
+ datetimepicker.remove();
2938
+ input
2939
+ .data('xdsoft_datetimepicker', null)
2940
+ .off('.xdsoft');
2941
+ $(options.contentWindow).off('resize.xdsoft');
2942
+ $([options.contentWindow, options.ownerDocument.body]).off('mousedown.xdsoft touchstart');
2943
+ if (input.unmousewheel) {
2944
+ input.unmousewheel();
2945
+ }
2946
+ }
2947
+ };
2948
+ $(options.ownerDocument)
2949
+ .off('keydown.xdsoftctrl keyup.xdsoftctrl')
2950
+ .on('keydown.xdsoftctrl', function (e) {
2951
+ if (e.keyCode === CTRLKEY) {
2952
+ ctrlDown = true;
2953
+ }
2954
+ })
2955
+ .on('keyup.xdsoftctrl', function (e) {
2956
+ if (e.keyCode === CTRLKEY) {
2957
+ ctrlDown = false;
2958
+ }
2959
+ });
2960
+
2961
+ this.each(function () {
2962
+ var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
2963
+ if (datetimepicker) {
2964
+ if ($.type(opt) === 'string') {
2965
+ switch (opt) {
2966
+ case 'show':
2967
+ $(this).select().focus();
2968
+ datetimepicker.trigger('open.xdsoft');
2969
+ break;
2970
+ case 'hide':
2971
+ datetimepicker.trigger('close.xdsoft');
2972
+ break;
2973
+ case 'toggle':
2974
+ datetimepicker.trigger('toggle.xdsoft');
2975
+ break;
2976
+ case 'destroy':
2977
+ destroyDateTimePicker($(this));
2978
+ break;
2979
+ case 'reset':
2980
+ this.value = this.defaultValue;
2981
+ if (!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(dateHelper.parseDate(this.value, options.format))) {
2982
+ datetimepicker.data('changed', false);
2983
+ }
2984
+ datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value);
2985
+ break;
2986
+ case 'validate':
2987
+ $input = datetimepicker.data('input');
2988
+ $input.trigger('blur.xdsoft');
2989
+ break;
2990
+ default:
2991
+ if (datetimepicker[opt] && $.isFunction(datetimepicker[opt])) {
2992
+ result = datetimepicker[opt](opt2);
2993
+ }
2994
+ }
2995
+ } else {
2996
+ datetimepicker
2997
+ .setOptions(opt);
2998
+ }
2999
+ return 0;
3000
+ }
3001
+ if ($.type(opt) !== 'string') {
3002
+ if (!options.lazyInit || options.open || options.inline) {
3003
+ createDateTimePicker($(this));
3004
+ } else {
3005
+ lazyInit($(this));
3006
+ }
3007
+ }
3008
+ });
3009
+
3010
+ return result;
3011
+ };
3012
+
3013
+ $.fn.datetimepicker.defaults = default_options;
3014
+
3015
+ function HighlightedDate(date, desc, style) {
3016
+ "use strict";
3017
+ this.date = date;
3018
+ this.desc = desc;
3019
+ this.style = style;
3020
+ }
3021
+ }));
3022
+
3023
+ /*!
3024
+ * jQuery Mousewheel 3.1.13
3025
+ *
3026
+ * Copyright jQuery Foundation and other contributors
3027
+ * Released under the MIT license
3028
+ * http://jquery.org/license
3029
+ */
3030
+
3031
+ (function (factory) {
3032
+ if ( typeof define === 'function' && define.amd ) {
3033
+ // AMD. Register as an anonymous module.
3034
+ define(['jquery'], factory);
3035
+ } else if (typeof exports === 'object') {
3036
+ // Node/CommonJS style for Browserify
3037
+ module.exports = factory;
3038
+ } else {
3039
+ // Browser globals
3040
+ factory(jQuery);
3041
+ }
3042
+ }(function ($) {
3043
+
3044
+ var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
3045
+ toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
3046
+ ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
3047
+ slice = Array.prototype.slice,
3048
+ nullLowestDeltaTimeout, lowestDelta;
3049
+
3050
+ if ( $.event.fixHooks ) {
3051
+ for ( var i = toFix.length; i; ) {
3052
+ $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
3053
+ }
3054
+ }
3055
+
3056
+ var special = $.event.special.mousewheel = {
3057
+ version: '3.1.12',
3058
+
3059
+ setup: function() {
3060
+ if ( this.addEventListener ) {
3061
+ for ( var i = toBind.length; i; ) {
3062
+ this.addEventListener( toBind[--i], handler, false );
3063
+ }
3064
+ } else {
3065
+ this.onmousewheel = handler;
3066
+ }
3067
+ // Store the line height and page height for this particular element
3068
+ $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
3069
+ $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
3070
+ },
3071
+
3072
+ teardown: function() {
3073
+ if ( this.removeEventListener ) {
3074
+ for ( var i = toBind.length; i; ) {
3075
+ this.removeEventListener( toBind[--i], handler, false );
3076
+ }
3077
+ } else {
3078
+ this.onmousewheel = null;
3079
+ }
3080
+ // Clean up the data we added to the element
3081
+ $.removeData(this, 'mousewheel-line-height');
3082
+ $.removeData(this, 'mousewheel-page-height');
3083
+ },
3084
+
3085
+ getLineHeight: function(elem) {
3086
+ var $elem = $(elem),
3087
+ $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
3088
+ if (!$parent.length) {
3089
+ $parent = $('body');
3090
+ }
3091
+ return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
3092
+ },
3093
+
3094
+ getPageHeight: function(elem) {
3095
+ return $(elem).height();
3096
+ },
3097
+
3098
+ settings: {
3099
+ adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
3100
+ normalizeOffset: true // calls getBoundingClientRect for each event
3101
+ }
3102
+ };
3103
+
3104
+ $.fn.extend({
3105
+ mousewheel: function(fn) {
3106
+ return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
3107
+ },
3108
+
3109
+ unmousewheel: function(fn) {
3110
+ return this.unbind('mousewheel', fn);
3111
+ }
3112
+ });
3113
+
3114
+
3115
+ function handler(event) {
3116
+ var orgEvent = event || window.event,
3117
+ args = slice.call(arguments, 1),
3118
+ delta = 0,
3119
+ deltaX = 0,
3120
+ deltaY = 0,
3121
+ absDelta = 0,
3122
+ offsetX = 0,
3123
+ offsetY = 0;
3124
+ event = $.event.fix(orgEvent);
3125
+ event.type = 'mousewheel';
3126
+
3127
+ // Old school scrollwheel delta
3128
+ if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
3129
+ if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
3130
+ if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
3131
+ if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
3132
+
3133
+ // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
3134
+ if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
3135
+ deltaX = deltaY * -1;
3136
+ deltaY = 0;
3137
+ }
3138
+
3139
+ // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
3140
+ delta = deltaY === 0 ? deltaX : deltaY;
3141
+
3142
+ // New school wheel delta (wheel event)
3143
+ if ( 'deltaY' in orgEvent ) {
3144
+ deltaY = orgEvent.deltaY * -1;
3145
+ delta = deltaY;
3146
+ }
3147
+ if ( 'deltaX' in orgEvent ) {
3148
+ deltaX = orgEvent.deltaX;
3149
+ if ( deltaY === 0 ) { delta = deltaX * -1; }
3150
+ }
3151
+
3152
+ // No change actually happened, no reason to go any further
3153
+ if ( deltaY === 0 && deltaX === 0 ) { return; }
3154
+
3155
+ // Need to convert lines and pages to pixels if we aren't already in pixels
3156
+ // There are three delta modes:
3157
+ // * deltaMode 0 is by pixels, nothing to do
3158
+ // * deltaMode 1 is by lines
3159
+ // * deltaMode 2 is by pages
3160
+ if ( orgEvent.deltaMode === 1 ) {
3161
+ var lineHeight = $.data(this, 'mousewheel-line-height');
3162
+ delta *= lineHeight;
3163
+ deltaY *= lineHeight;
3164
+ deltaX *= lineHeight;
3165
+ } else if ( orgEvent.deltaMode === 2 ) {
3166
+ var pageHeight = $.data(this, 'mousewheel-page-height');
3167
+ delta *= pageHeight;
3168
+ deltaY *= pageHeight;
3169
+ deltaX *= pageHeight;
3170
+ }
3171
+
3172
+ // Store lowest absolute delta to normalize the delta values
3173
+ absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
3174
+
3175
+ if ( !lowestDelta || absDelta < lowestDelta ) {
3176
+ lowestDelta = absDelta;
3177
+
3178
+ // Adjust older deltas if necessary
3179
+ if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
3180
+ lowestDelta /= 40;
3181
+ }
3182
+ }
3183
+
3184
+ // Adjust older deltas if necessary
3185
+ if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
3186
+ // Divide all the things by 40!
3187
+ delta /= 40;
3188
+ deltaX /= 40;
3189
+ deltaY /= 40;
3190
+ }
3191
+
3192
+ // Get a whole, normalized value for the deltas
3193
+ delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
3194
+ deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
3195
+ deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
3196
+
3197
+ // Normalise offsetX and offsetY properties
3198
+ if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
3199
+ var boundingRect = this.getBoundingClientRect();
3200
+ offsetX = event.clientX - boundingRect.left;
3201
+ offsetY = event.clientY - boundingRect.top;
3202
+ }
3203
+
3204
+ // Add information to the event object
3205
+ event.deltaX = deltaX;
3206
+ event.deltaY = deltaY;
3207
+ event.deltaFactor = lowestDelta;
3208
+ event.offsetX = offsetX;
3209
+ event.offsetY = offsetY;
3210
+ // Go ahead and set deltaMode to 0 since we converted to pixels
3211
+ // Although this is a little odd since we overwrite the deltaX/Y
3212
+ // properties with normalized deltas.
3213
+ event.deltaMode = 0;
3214
+
3215
+ // Add event and delta to the front of the arguments
3216
+ args.unshift(event, delta, deltaX, deltaY);
3217
+
3218
+ // Clearout lowestDelta after sometime to better
3219
+ // handle multiple device types that give different
3220
+ // a different lowestDelta
3221
+ // Ex: trackpad = 3 and mouse wheel = 120
3222
+ if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
3223
+ nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
3224
+
3225
+ return ($.event.dispatch || $.event.handle).apply(this, args);
3226
+ }
3227
+
3228
+ function nullLowestDelta() {
3229
+ lowestDelta = null;
3230
+ }
3231
+
3232
+ function shouldAdjustOldDeltas(orgEvent, absDelta) {
3233
+ // If this is an older event and the delta is divisable by 120,
3234
+ // then we are assuming that the browser is treating this as an
3235
+ // older mouse wheel event and that we should divide the deltas
3236
+ // by 40 to try and get a more usable deltaFactor.
3237
+ // Side note, this actually impacts the reported scroll distance
3238
+ // in older browsers and can cause scrolling to be slower than native.
3239
+ // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
3240
+ return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
3241
+ }
3242
+
3243
+ }));