dhtmlx-scheduler 5.3.12 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. package/README.md +5 -10
  2. package/bower.json +2 -2
  3. package/codebase/dhtmlxscheduler.css +10 -11
  4. package/codebase/dhtmlxscheduler.d.ts +163 -11
  5. package/codebase/dhtmlxscheduler.js +36 -352
  6. package/codebase/dhtmlxscheduler.js.map +1 -0
  7. package/codebase/dhtmlxscheduler_contrast_black.css +10 -11
  8. package/codebase/dhtmlxscheduler_contrast_white.css +10 -11
  9. package/codebase/dhtmlxscheduler_flat.css +10 -11
  10. package/codebase/dhtmlxscheduler_material.css +10 -11
  11. package/codebase/dhtmlxscheduler_terrace.css +10 -11
  12. package/codebase/sources/{skins/dhtmlxscheduler.css → dhtmlxscheduler.css} +125 -78
  13. package/codebase/sources/dhtmlxscheduler.js +29536 -9119
  14. package/codebase/sources/less/package.json +2 -2
  15. package/codebase/sources/less/skins/basic/ext.less +30 -0
  16. package/codebase/{imgs → sources/less/skins/basic/imgs}/but_repeat.gif +0 -0
  17. package/codebase/{imgs → sources/less/skins/basic/imgs}/buttons.png +0 -0
  18. package/codebase/{imgs → sources/less/skins/basic/imgs}/calendar.gif +0 -0
  19. package/codebase/{imgs → sources/less/skins/basic/imgs}/clock_big.gif +0 -0
  20. package/codebase/{imgs → sources/less/skins/basic/imgs}/clock_small.gif +0 -0
  21. package/codebase/{imgs → sources/less/skins/basic/imgs}/collapse_expand_icon.gif +0 -0
  22. package/codebase/{imgs → sources/less/skins/basic/imgs}/controls.gif +0 -0
  23. package/codebase/{imgs → sources/less/skins/basic/imgs}/databg.png +0 -0
  24. package/codebase/{imgs → sources/less/skins/basic/imgs}/databg_now.png +0 -0
  25. package/codebase/{imgs → sources/less/skins/basic/imgs}/export_ical.png +0 -0
  26. package/codebase/{imgs → sources/less/skins/basic/imgs}/export_pdf.png +0 -0
  27. package/codebase/{imgs → sources/less/skins/basic/imgs}/icon.png +0 -0
  28. package/codebase/{imgs → sources/less/skins/basic/imgs}/images.png +0 -0
  29. package/codebase/{imgs → sources/less/skins/basic/imgs}/loading.gif +0 -0
  30. package/codebase/{imgs → sources/less/skins/basic/imgs}/resize_dots.png +0 -0
  31. package/codebase/sources/less/skins/basic/lightbox.less +12 -0
  32. package/codebase/sources/less/skins/basic/message_default.less +43 -27
  33. package/codebase/sources/less/skins/basic/skin.less +2 -2
  34. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/arrow_left.png +0 -0
  35. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/arrow_right.png +0 -0
  36. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/but_repeat.gif +0 -0
  37. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/calendar.gif +0 -0
  38. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/clock_big.gif +0 -0
  39. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/clock_small.gif +0 -0
  40. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/close_icon.png +0 -0
  41. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/collapse_expand_icon.gif +0 -0
  42. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/controls.png +0 -0
  43. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/databg.png +0 -0
  44. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/databg_now.png +0 -0
  45. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/export_ical.png +0 -0
  46. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/export_pdf.png +0 -0
  47. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/resize_dots.png +0 -0
  48. package/codebase/{imgs_contrast_black → sources/less/skins/contrast_black/imgs_contrast_black}/resizing.png +0 -0
  49. package/codebase/sources/less/skins/contrast_black/skin.less +5 -5
  50. package/codebase/sources/less/skins/contrast_white/dhx_skin_contrast_white.less +3 -3
  51. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/arrow_left.png +0 -0
  52. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/arrow_right.png +0 -0
  53. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/but_repeat.gif +0 -0
  54. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/calendar.gif +0 -0
  55. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/clock_big.gif +0 -0
  56. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/clock_small.gif +0 -0
  57. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/close_icon.png +0 -0
  58. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/collapse_expand_icon.gif +0 -0
  59. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/controls.png +0 -0
  60. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/databg.png +0 -0
  61. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/export_ical.png +0 -0
  62. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/export_pdf.png +0 -0
  63. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/quick_info_edit.png +0 -0
  64. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/resize_dots.png +0 -0
  65. package/codebase/{imgs_contrast_white → sources/less/skins/contrast_white/imgs_contrast_white}/resizing.png +0 -0
  66. package/codebase/{imgs_flat → sources/less/skins/flat/imgs_flat}/agenda_bg.gif +0 -0
  67. package/codebase/{imgs_flat → sources/less/skins/flat/imgs_flat}/arrow_left.png +0 -0
  68. package/codebase/{imgs_flat → sources/less/skins/flat/imgs_flat}/arrow_right.png +0 -0
  69. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/but_repeat.gif +0 -0
  70. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/calendar.gif +0 -0
  71. package/codebase/{imgs_flat → sources/less/skins/flat/imgs_flat}/clock.png +0 -0
  72. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/clock_big.gif +0 -0
  73. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/clock_small.gif +0 -0
  74. package/codebase/{imgs_dhx_material → sources/less/skins/flat/imgs_flat}/close_icon.png +0 -0
  75. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/collapse_expand_icon.gif +0 -0
  76. package/codebase/{imgs_dhx_material → sources/less/skins/flat/imgs_flat}/controls.png +0 -0
  77. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/databg.png +0 -0
  78. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/databg_now.png +0 -0
  79. package/codebase/{imgs_dhx_material → sources/less/skins/flat/imgs_flat}/export_ical.png +0 -0
  80. package/codebase/{imgs_dhx_material → sources/less/skins/flat/imgs_flat}/export_pdf.png +0 -0
  81. package/codebase/{imgs_dhx_terrace → sources/less/skins/flat/imgs_flat}/resize_dots.png +0 -0
  82. package/codebase/{imgs_flat → sources/less/skins/flat/imgs_flat}/resizing.png +0 -0
  83. package/codebase/sources/less/skins/flat/skin.less +5 -5
  84. package/codebase/sources/less/skins/material/add_styles.less +17 -16
  85. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/Shape.svg +0 -0
  86. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/agenda-calendar-hov.svg +0 -0
  87. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/agenda-calendar.svg +0 -0
  88. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/agenda_bg.png +0 -0
  89. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/arrow_left.svg +0 -0
  90. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/arrow_left_hov.svg +0 -0
  91. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/arrow_right.svg +0 -0
  92. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/arrow_right_hov.svg +0 -0
  93. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/but_repeat.png +0 -0
  94. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/calendar.svg +0 -0
  95. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/clock_big.png +0 -0
  96. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/clock_small.png +0 -0
  97. package/codebase/{imgs_dhx_terrace → sources/less/skins/material/imgs_dhx_material}/close_icon.png +0 -0
  98. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/collapse_expand_icon.png +0 -0
  99. package/codebase/{imgs_dhx_terrace → sources/less/skins/material/imgs_dhx_material}/controls.png +0 -0
  100. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/databg.png +0 -0
  101. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/drag-horizontal.svg +0 -0
  102. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/drag-vertical.svg +0 -0
  103. package/codebase/{imgs_dhx_terrace → sources/less/skins/material/imgs_dhx_material}/export_ical.png +0 -0
  104. package/codebase/{imgs_dhx_terrace → sources/less/skins/material/imgs_dhx_material}/export_pdf.png +0 -0
  105. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/icon.png +0 -0
  106. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/menu-down.svg +0 -0
  107. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/resizing.png +0 -0
  108. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/time.svg +0 -0
  109. package/codebase/{imgs_dhx_material → sources/less/skins/material/imgs_dhx_material}/tree_arrow.svg +0 -0
  110. package/codebase/sources/less/skins/material/skin.less +3 -3
  111. package/codebase/{imgs_dhx_terrace → sources/less/skins/terrace/imgs_dhx_terrace}/arrow_left.png +0 -0
  112. package/codebase/{imgs_dhx_terrace → sources/less/skins/terrace/imgs_dhx_terrace}/arrow_right.png +0 -0
  113. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/but_repeat.gif +0 -0
  114. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/calendar.gif +0 -0
  115. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/clock_big.gif +0 -0
  116. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/clock_small.gif +0 -0
  117. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/close_icon.png +0 -0
  118. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/collapse_expand_icon.gif +0 -0
  119. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/controls.png +0 -0
  120. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/databg.png +0 -0
  121. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/databg_now.png +0 -0
  122. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/export_ical.png +0 -0
  123. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/export_pdf.png +0 -0
  124. package/codebase/{imgs_flat → sources/less/skins/terrace/imgs_dhx_terrace}/resize_dots.png +0 -0
  125. package/codebase/{imgs_dhx_terrace → sources/less/skins/terrace/imgs_dhx_terrace}/resizing.png +0 -0
  126. package/codebase/sources/less/skins/terrace/skin.less +2 -2
  127. package/codebase/sources/skins/dhtmlxscheduler_contrast_black.css +126 -79
  128. package/codebase/sources/skins/dhtmlxscheduler_contrast_white.css +138 -91
  129. package/codebase/sources/skins/dhtmlxscheduler_flat.css +121 -74
  130. package/codebase/sources/skins/dhtmlxscheduler_material.css +162 -114
  131. package/codebase/sources/skins/dhtmlxscheduler_terrace.css +125 -78
  132. package/package.json +1 -1
  133. package/whatsnew.md +45 -0
  134. package/codebase/ext/dhtmlxscheduler_active_links.js +0 -13
  135. package/codebase/ext/dhtmlxscheduler_agenda_view.js +0 -18
  136. package/codebase/ext/dhtmlxscheduler_all_timed.js +0 -17
  137. package/codebase/ext/dhtmlxscheduler_collision.js +0 -15
  138. package/codebase/ext/dhtmlxscheduler_container_autoresize.js +0 -23
  139. package/codebase/ext/dhtmlxscheduler_cookie.js +0 -14
  140. package/codebase/ext/dhtmlxscheduler_csp.js +0 -16
  141. package/codebase/ext/dhtmlxscheduler_editors.js +0 -18
  142. package/codebase/ext/dhtmlxscheduler_expand.js +0 -15
  143. package/codebase/ext/dhtmlxscheduler_html_templates.js +0 -12
  144. package/codebase/ext/dhtmlxscheduler_key_nav.js +0 -111
  145. package/codebase/ext/dhtmlxscheduler_layer.js +0 -33
  146. package/codebase/ext/dhtmlxscheduler_limit.js +0 -44
  147. package/codebase/ext/dhtmlxscheduler_map_view.js +0 -35
  148. package/codebase/ext/dhtmlxscheduler_minical.js +0 -35
  149. package/codebase/ext/dhtmlxscheduler_monthheight.js +0 -13
  150. package/codebase/ext/dhtmlxscheduler_multiselect.js +0 -15
  151. package/codebase/ext/dhtmlxscheduler_multisource.js +0 -12
  152. package/codebase/ext/dhtmlxscheduler_mvc.js +0 -15
  153. package/codebase/ext/dhtmlxscheduler_outerdrag.js +0 -14
  154. package/codebase/ext/dhtmlxscheduler_pdf.js +0 -28
  155. package/codebase/ext/dhtmlxscheduler_quick_info.js +0 -23
  156. package/codebase/ext/dhtmlxscheduler_readonly.js +0 -18
  157. package/codebase/ext/dhtmlxscheduler_recurring.js +0 -51
  158. package/codebase/ext/dhtmlxscheduler_serialize.js +0 -16
  159. package/codebase/ext/dhtmlxscheduler_tooltip.js +0 -19
  160. package/codebase/ext/dhtmlxscheduler_url.js +0 -14
  161. package/codebase/ext/dhtmlxscheduler_wp.js +0 -12
  162. package/codebase/ext/dhtmlxscheduler_year_view.js +0 -30
  163. package/codebase/locale/locale_ar.js +0 -14
  164. package/codebase/locale/locale_be.js +0 -16
  165. package/codebase/locale/locale_ca.js +0 -14
  166. package/codebase/locale/locale_cn.js +0 -15
  167. package/codebase/locale/locale_cs.js +0 -16
  168. package/codebase/locale/locale_da.js +0 -16
  169. package/codebase/locale/locale_de.js +0 -16
  170. package/codebase/locale/locale_el.js +0 -16
  171. package/codebase/locale/locale_en.js +0 -16
  172. package/codebase/locale/locale_es.js +0 -16
  173. package/codebase/locale/locale_fi.js +0 -17
  174. package/codebase/locale/locale_fr.js +0 -16
  175. package/codebase/locale/locale_he.js +0 -16
  176. package/codebase/locale/locale_hu.js +0 -14
  177. package/codebase/locale/locale_id.js +0 -14
  178. package/codebase/locale/locale_it.js +0 -16
  179. package/codebase/locale/locale_jp.js +0 -14
  180. package/codebase/locale/locale_nb.js +0 -16
  181. package/codebase/locale/locale_nl.js +0 -16
  182. package/codebase/locale/locale_no.js +0 -14
  183. package/codebase/locale/locale_pl.js +0 -16
  184. package/codebase/locale/locale_pt.js +0 -16
  185. package/codebase/locale/locale_ro.js +0 -16
  186. package/codebase/locale/locale_ru.js +0 -16
  187. package/codebase/locale/locale_si.js +0 -14
  188. package/codebase/locale/locale_sk.js +0 -16
  189. package/codebase/locale/locale_sv.js +0 -16
  190. package/codebase/locale/locale_tr.js +0 -14
  191. package/codebase/locale/locale_ua.js +0 -16
  192. package/codebase/locale/recurring/locale_recurring_be.js +0 -14
  193. package/codebase/locale/recurring/locale_recurring_cn.js +0 -14
  194. package/codebase/locale/recurring/locale_recurring_cs.js +0 -14
  195. package/codebase/locale/recurring/locale_recurring_da.js +0 -14
  196. package/codebase/locale/recurring/locale_recurring_de.js +0 -14
  197. package/codebase/locale/recurring/locale_recurring_el.js +0 -14
  198. package/codebase/locale/recurring/locale_recurring_en.js +0 -14
  199. package/codebase/locale/recurring/locale_recurring_es.js +0 -14
  200. package/codebase/locale/recurring/locale_recurring_fi.js +0 -14
  201. package/codebase/locale/recurring/locale_recurring_fr.js +0 -14
  202. package/codebase/locale/recurring/locale_recurring_he.js +0 -14
  203. package/codebase/locale/recurring/locale_recurring_it.js +0 -14
  204. package/codebase/locale/recurring/locale_recurring_nb.js +0 -14
  205. package/codebase/locale/recurring/locale_recurring_nl.js +0 -14
  206. package/codebase/locale/recurring/locale_recurring_pl.js +0 -14
  207. package/codebase/locale/recurring/locale_recurring_pt.js +0 -14
  208. package/codebase/locale/recurring/locale_recurring_ro.js +0 -14
  209. package/codebase/locale/recurring/locale_recurring_ru.js +0 -14
  210. package/codebase/locale/recurring/locale_recurring_sk.js +0 -14
  211. package/codebase/locale/recurring/locale_recurring_sv.js +0 -14
  212. package/codebase/locale/recurring/locale_recurring_ua.js +0 -14
  213. package/codebase/locale/recurring/repeat_template_be.html +0 -57
  214. package/codebase/locale/recurring/repeat_template_cn.html +0 -57
  215. package/codebase/locale/recurring/repeat_template_de.html +0 -60
  216. package/codebase/locale/recurring/repeat_template_el.html +0 -57
  217. package/codebase/locale/recurring/repeat_template_en.html +0 -57
  218. package/codebase/locale/recurring/repeat_template_es.html +0 -57
  219. package/codebase/locale/recurring/repeat_template_fr.html +0 -57
  220. package/codebase/locale/recurring/repeat_template_he.html +0 -61
  221. package/codebase/locale/recurring/repeat_template_it.html +0 -57
  222. package/codebase/locale/recurring/repeat_template_nl.html +0 -65
  223. package/codebase/locale/recurring/repeat_template_ro.html +0 -57
  224. package/codebase/locale/recurring/repeat_template_ru.html +0 -57
  225. package/codebase/locale/recurring/repeat_template_sk.html +0 -57
  226. package/codebase/sources/dhtmlxscheduler.js.map +0 -1
  227. package/codebase/sources/ext/dhtmlxscheduler_active_links.js +0 -50
  228. package/codebase/sources/ext/dhtmlxscheduler_active_links.js.map +0 -1
  229. package/codebase/sources/ext/dhtmlxscheduler_agenda_view.js +0 -150
  230. package/codebase/sources/ext/dhtmlxscheduler_agenda_view.js.map +0 -1
  231. package/codebase/sources/ext/dhtmlxscheduler_all_timed.js +0 -193
  232. package/codebase/sources/ext/dhtmlxscheduler_all_timed.js.map +0 -1
  233. package/codebase/sources/ext/dhtmlxscheduler_collision.js +0 -140
  234. package/codebase/sources/ext/dhtmlxscheduler_collision.js.map +0 -1
  235. package/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js +0 -338
  236. package/codebase/sources/ext/dhtmlxscheduler_container_autoresize.js.map +0 -1
  237. package/codebase/sources/ext/dhtmlxscheduler_cookie.js +0 -96
  238. package/codebase/sources/ext/dhtmlxscheduler_cookie.js.map +0 -1
  239. package/codebase/sources/ext/dhtmlxscheduler_csp.js +0 -106
  240. package/codebase/sources/ext/dhtmlxscheduler_csp.js.map +0 -1
  241. package/codebase/sources/ext/dhtmlxscheduler_editors.js +0 -183
  242. package/codebase/sources/ext/dhtmlxscheduler_editors.js.map +0 -1
  243. package/codebase/sources/ext/dhtmlxscheduler_expand.js +0 -87
  244. package/codebase/sources/ext/dhtmlxscheduler_expand.js.map +0 -1
  245. package/codebase/sources/ext/dhtmlxscheduler_html_templates.js +0 -29
  246. package/codebase/sources/ext/dhtmlxscheduler_html_templates.js.map +0 -1
  247. package/codebase/sources/ext/dhtmlxscheduler_key_nav.js +0 -3065
  248. package/codebase/sources/ext/dhtmlxscheduler_key_nav.js.map +0 -1
  249. package/codebase/sources/ext/dhtmlxscheduler_layer.js +0 -424
  250. package/codebase/sources/ext/dhtmlxscheduler_layer.js.map +0 -1
  251. package/codebase/sources/ext/dhtmlxscheduler_limit.js +0 -1095
  252. package/codebase/sources/ext/dhtmlxscheduler_limit.js.map +0 -1
  253. package/codebase/sources/ext/dhtmlxscheduler_map_view.js +0 -514
  254. package/codebase/sources/ext/dhtmlxscheduler_map_view.js.map +0 -1
  255. package/codebase/sources/ext/dhtmlxscheduler_minical.js +0 -566
  256. package/codebase/sources/ext/dhtmlxscheduler_minical.js.map +0 -1
  257. package/codebase/sources/ext/dhtmlxscheduler_monthheight.js +0 -41
  258. package/codebase/sources/ext/dhtmlxscheduler_monthheight.js.map +0 -1
  259. package/codebase/sources/ext/dhtmlxscheduler_multiselect.js +0 -112
  260. package/codebase/sources/ext/dhtmlxscheduler_multiselect.js.map +0 -1
  261. package/codebase/sources/ext/dhtmlxscheduler_multisource.js +0 -36
  262. package/codebase/sources/ext/dhtmlxscheduler_multisource.js.map +0 -1
  263. package/codebase/sources/ext/dhtmlxscheduler_mvc.js +0 -154
  264. package/codebase/sources/ext/dhtmlxscheduler_mvc.js.map +0 -1
  265. package/codebase/sources/ext/dhtmlxscheduler_outerdrag.js +0 -86
  266. package/codebase/sources/ext/dhtmlxscheduler_outerdrag.js.map +0 -1
  267. package/codebase/sources/ext/dhtmlxscheduler_pdf.js +0 -405
  268. package/codebase/sources/ext/dhtmlxscheduler_pdf.js.map +0 -1
  269. package/codebase/sources/ext/dhtmlxscheduler_quick_info.js +0 -288
  270. package/codebase/sources/ext/dhtmlxscheduler_quick_info.js.map +0 -1
  271. package/codebase/sources/ext/dhtmlxscheduler_readonly.js +0 -200
  272. package/codebase/sources/ext/dhtmlxscheduler_readonly.js.map +0 -1
  273. package/codebase/sources/ext/dhtmlxscheduler_recurring.js +0 -1232
  274. package/codebase/sources/ext/dhtmlxscheduler_recurring.js.map +0 -1
  275. package/codebase/sources/ext/dhtmlxscheduler_serialize.js +0 -116
  276. package/codebase/sources/ext/dhtmlxscheduler_serialize.js.map +0 -1
  277. package/codebase/sources/ext/dhtmlxscheduler_tooltip.js +0 -229
  278. package/codebase/sources/ext/dhtmlxscheduler_tooltip.js.map +0 -1
  279. package/codebase/sources/ext/dhtmlxscheduler_url.js +0 -91
  280. package/codebase/sources/ext/dhtmlxscheduler_url.js.map +0 -1
  281. package/codebase/sources/ext/dhtmlxscheduler_wp.js +0 -27
  282. package/codebase/sources/ext/dhtmlxscheduler_wp.js.map +0 -1
  283. package/codebase/sources/ext/dhtmlxscheduler_year_view.js +0 -442
  284. package/codebase/sources/ext/dhtmlxscheduler_year_view.js.map +0 -1
  285. package/codebase/sources/less/imgs/but_repeat.gif +0 -0
  286. package/codebase/sources/less/imgs/buttons.png +0 -0
  287. package/codebase/sources/less/imgs/calendar.gif +0 -0
  288. package/codebase/sources/less/imgs/clock_big.gif +0 -0
  289. package/codebase/sources/less/imgs/clock_small.gif +0 -0
  290. package/codebase/sources/less/imgs/collapse_expand_icon.gif +0 -0
  291. package/codebase/sources/less/imgs/controls.gif +0 -0
  292. package/codebase/sources/less/imgs/databg.png +0 -0
  293. package/codebase/sources/less/imgs/databg_now.png +0 -0
  294. package/codebase/sources/less/imgs/export_ical.png +0 -0
  295. package/codebase/sources/less/imgs/export_pdf.png +0 -0
  296. package/codebase/sources/less/imgs/icon.png +0 -0
  297. package/codebase/sources/less/imgs/images.png +0 -0
  298. package/codebase/sources/less/imgs/loading.gif +0 -0
  299. package/codebase/sources/less/imgs/resize_dots.png +0 -0
  300. package/codebase/sources/less/imgs_contrast_black/arrow_left.png +0 -0
  301. package/codebase/sources/less/imgs_contrast_black/arrow_right.png +0 -0
  302. package/codebase/sources/less/imgs_contrast_black/but_repeat.gif +0 -0
  303. package/codebase/sources/less/imgs_contrast_black/calendar.gif +0 -0
  304. package/codebase/sources/less/imgs_contrast_black/clock_big.gif +0 -0
  305. package/codebase/sources/less/imgs_contrast_black/clock_small.gif +0 -0
  306. package/codebase/sources/less/imgs_contrast_black/close_icon.png +0 -0
  307. package/codebase/sources/less/imgs_contrast_black/collapse_expand_icon.gif +0 -0
  308. package/codebase/sources/less/imgs_contrast_black/controls.png +0 -0
  309. package/codebase/sources/less/imgs_contrast_black/databg.png +0 -0
  310. package/codebase/sources/less/imgs_contrast_black/databg_now.png +0 -0
  311. package/codebase/sources/less/imgs_contrast_black/export_ical.png +0 -0
  312. package/codebase/sources/less/imgs_contrast_black/export_pdf.png +0 -0
  313. package/codebase/sources/less/imgs_contrast_black/resize_dots.png +0 -0
  314. package/codebase/sources/less/imgs_contrast_black/resizing.png +0 -0
  315. package/codebase/sources/less/imgs_contrast_white/arrow_left.png +0 -0
  316. package/codebase/sources/less/imgs_contrast_white/arrow_right.png +0 -0
  317. package/codebase/sources/less/imgs_contrast_white/but_repeat.gif +0 -0
  318. package/codebase/sources/less/imgs_contrast_white/calendar.gif +0 -0
  319. package/codebase/sources/less/imgs_contrast_white/clock_big.gif +0 -0
  320. package/codebase/sources/less/imgs_contrast_white/clock_small.gif +0 -0
  321. package/codebase/sources/less/imgs_contrast_white/close_icon.png +0 -0
  322. package/codebase/sources/less/imgs_contrast_white/collapse_expand_icon.gif +0 -0
  323. package/codebase/sources/less/imgs_contrast_white/controls.png +0 -0
  324. package/codebase/sources/less/imgs_contrast_white/databg.png +0 -0
  325. package/codebase/sources/less/imgs_contrast_white/export_ical.png +0 -0
  326. package/codebase/sources/less/imgs_contrast_white/export_pdf.png +0 -0
  327. package/codebase/sources/less/imgs_contrast_white/quick_info_edit.png +0 -0
  328. package/codebase/sources/less/imgs_contrast_white/resize_dots.png +0 -0
  329. package/codebase/sources/less/imgs_contrast_white/resizing.png +0 -0
  330. package/codebase/sources/less/imgs_dhx_material/Shape.svg +0 -3
  331. package/codebase/sources/less/imgs_dhx_material/agenda-calendar-hov.svg +0 -4
  332. package/codebase/sources/less/imgs_dhx_material/agenda-calendar.svg +0 -4
  333. package/codebase/sources/less/imgs_dhx_material/agenda_bg.png +0 -0
  334. package/codebase/sources/less/imgs_dhx_material/arrow_left.svg +0 -3
  335. package/codebase/sources/less/imgs_dhx_material/arrow_left_hov.svg +0 -3
  336. package/codebase/sources/less/imgs_dhx_material/arrow_right.svg +0 -3
  337. package/codebase/sources/less/imgs_dhx_material/arrow_right_hov.svg +0 -3
  338. package/codebase/sources/less/imgs_dhx_material/but_repeat.png +0 -0
  339. package/codebase/sources/less/imgs_dhx_material/calendar.svg +0 -4
  340. package/codebase/sources/less/imgs_dhx_material/clock_big.png +0 -0
  341. package/codebase/sources/less/imgs_dhx_material/clock_small.png +0 -0
  342. package/codebase/sources/less/imgs_dhx_material/close_icon.png +0 -0
  343. package/codebase/sources/less/imgs_dhx_material/collapse_expand_icon.png +0 -0
  344. package/codebase/sources/less/imgs_dhx_material/controls.png +0 -0
  345. package/codebase/sources/less/imgs_dhx_material/databg.png +0 -0
  346. package/codebase/sources/less/imgs_dhx_material/drag-horizontal.svg +0 -5
  347. package/codebase/sources/less/imgs_dhx_material/drag-vertical.svg +0 -14
  348. package/codebase/sources/less/imgs_dhx_material/export_ical.png +0 -0
  349. package/codebase/sources/less/imgs_dhx_material/export_pdf.png +0 -0
  350. package/codebase/sources/less/imgs_dhx_material/icon.png +0 -0
  351. package/codebase/sources/less/imgs_dhx_material/menu-down.svg +0 -1
  352. package/codebase/sources/less/imgs_dhx_material/resizing.png +0 -0
  353. package/codebase/sources/less/imgs_dhx_material/time.svg +0 -24
  354. package/codebase/sources/less/imgs_dhx_material/tree_arrow.svg +0 -3
  355. package/codebase/sources/less/imgs_dhx_terrace/arrow_left.png +0 -0
  356. package/codebase/sources/less/imgs_dhx_terrace/arrow_right.png +0 -0
  357. package/codebase/sources/less/imgs_dhx_terrace/but_repeat.gif +0 -0
  358. package/codebase/sources/less/imgs_dhx_terrace/calendar.gif +0 -0
  359. package/codebase/sources/less/imgs_dhx_terrace/clock_big.gif +0 -0
  360. package/codebase/sources/less/imgs_dhx_terrace/clock_small.gif +0 -0
  361. package/codebase/sources/less/imgs_dhx_terrace/close_icon.png +0 -0
  362. package/codebase/sources/less/imgs_dhx_terrace/collapse_expand_icon.gif +0 -0
  363. package/codebase/sources/less/imgs_dhx_terrace/controls.png +0 -0
  364. package/codebase/sources/less/imgs_dhx_terrace/databg.png +0 -0
  365. package/codebase/sources/less/imgs_dhx_terrace/databg_now.png +0 -0
  366. package/codebase/sources/less/imgs_dhx_terrace/export_ical.png +0 -0
  367. package/codebase/sources/less/imgs_dhx_terrace/export_pdf.png +0 -0
  368. package/codebase/sources/less/imgs_dhx_terrace/resize_dots.png +0 -0
  369. package/codebase/sources/less/imgs_dhx_terrace/resizing.png +0 -0
  370. package/codebase/sources/less/imgs_flat/agenda_bg.gif +0 -0
  371. package/codebase/sources/less/imgs_flat/arrow_left.png +0 -0
  372. package/codebase/sources/less/imgs_flat/arrow_right.png +0 -0
  373. package/codebase/sources/less/imgs_flat/but_repeat.gif +0 -0
  374. package/codebase/sources/less/imgs_flat/calendar.gif +0 -0
  375. package/codebase/sources/less/imgs_flat/clock.png +0 -0
  376. package/codebase/sources/less/imgs_flat/clock_big.gif +0 -0
  377. package/codebase/sources/less/imgs_flat/clock_small.gif +0 -0
  378. package/codebase/sources/less/imgs_flat/close_icon.png +0 -0
  379. package/codebase/sources/less/imgs_flat/collapse_expand_icon.gif +0 -0
  380. package/codebase/sources/less/imgs_flat/controls.png +0 -0
  381. package/codebase/sources/less/imgs_flat/databg.png +0 -0
  382. package/codebase/sources/less/imgs_flat/databg_now.png +0 -0
  383. package/codebase/sources/less/imgs_flat/export_ical.png +0 -0
  384. package/codebase/sources/less/imgs_flat/export_pdf.png +0 -0
  385. package/codebase/sources/less/imgs_flat/resize_dots.png +0 -0
  386. package/codebase/sources/less/imgs_flat/resizing.png +0 -0
  387. package/codebase/sources/locale/locale_ar.js +0 -65
  388. package/codebase/sources/locale/locale_ar.js.map +0 -1
  389. package/codebase/sources/locale/locale_be.js +0 -104
  390. package/codebase/sources/locale/locale_be.js.map +0 -1
  391. package/codebase/sources/locale/locale_ca.js +0 -76
  392. package/codebase/sources/locale/locale_ca.js.map +0 -1
  393. package/codebase/sources/locale/locale_cn.js +0 -109
  394. package/codebase/sources/locale/locale_cn.js.map +0 -1
  395. package/codebase/sources/locale/locale_cs.js +0 -103
  396. package/codebase/sources/locale/locale_cs.js.map +0 -1
  397. package/codebase/sources/locale/locale_da.js +0 -102
  398. package/codebase/sources/locale/locale_da.js.map +0 -1
  399. package/codebase/sources/locale/locale_de.js +0 -102
  400. package/codebase/sources/locale/locale_de.js.map +0 -1
  401. package/codebase/sources/locale/locale_el.js +0 -103
  402. package/codebase/sources/locale/locale_el.js.map +0 -1
  403. package/codebase/sources/locale/locale_en.js +0 -103
  404. package/codebase/sources/locale/locale_en.js.map +0 -1
  405. package/codebase/sources/locale/locale_es.js +0 -104
  406. package/codebase/sources/locale/locale_es.js.map +0 -1
  407. package/codebase/sources/locale/locale_fi.js +0 -103
  408. package/codebase/sources/locale/locale_fi.js.map +0 -1
  409. package/codebase/sources/locale/locale_fr.js +0 -101
  410. package/codebase/sources/locale/locale_fr.js.map +0 -1
  411. package/codebase/sources/locale/locale_he.js +0 -103
  412. package/codebase/sources/locale/locale_he.js.map +0 -1
  413. package/codebase/sources/locale/locale_hu.js +0 -70
  414. package/codebase/sources/locale/locale_hu.js.map +0 -1
  415. package/codebase/sources/locale/locale_id.js +0 -11
  416. package/codebase/sources/locale/locale_id.js.map +0 -1
  417. package/codebase/sources/locale/locale_it.js +0 -101
  418. package/codebase/sources/locale/locale_it.js.map +0 -1
  419. package/codebase/sources/locale/locale_jp.js +0 -78
  420. package/codebase/sources/locale/locale_jp.js.map +0 -1
  421. package/codebase/sources/locale/locale_nb.js +0 -101
  422. package/codebase/sources/locale/locale_nb.js.map +0 -1
  423. package/codebase/sources/locale/locale_nl.js +0 -103
  424. package/codebase/sources/locale/locale_nl.js.map +0 -1
  425. package/codebase/sources/locale/locale_no.js +0 -76
  426. package/codebase/sources/locale/locale_no.js.map +0 -1
  427. package/codebase/sources/locale/locale_pl.js +0 -103
  428. package/codebase/sources/locale/locale_pl.js.map +0 -1
  429. package/codebase/sources/locale/locale_pt.js +0 -113
  430. package/codebase/sources/locale/locale_pt.js.map +0 -1
  431. package/codebase/sources/locale/locale_ro.js +0 -107
  432. package/codebase/sources/locale/locale_ro.js.map +0 -1
  433. package/codebase/sources/locale/locale_ru.js +0 -101
  434. package/codebase/sources/locale/locale_ru.js.map +0 -1
  435. package/codebase/sources/locale/locale_si.js +0 -76
  436. package/codebase/sources/locale/locale_si.js.map +0 -1
  437. package/codebase/sources/locale/locale_sk.js +0 -103
  438. package/codebase/sources/locale/locale_sk.js.map +0 -1
  439. package/codebase/sources/locale/locale_sv.js +0 -102
  440. package/codebase/sources/locale/locale_sv.js.map +0 -1
  441. package/codebase/sources/locale/locale_tr.js +0 -74
  442. package/codebase/sources/locale/locale_tr.js.map +0 -1
  443. package/codebase/sources/locale/locale_ua.js +0 -102
  444. package/codebase/sources/locale/locale_ua.js.map +0 -1
  445. package/codebase/sources/locale/recurring/locale_recurring_be.js +0 -13
  446. package/codebase/sources/locale/recurring/locale_recurring_be.js.map +0 -1
  447. package/codebase/sources/locale/recurring/locale_recurring_cn.js +0 -13
  448. package/codebase/sources/locale/recurring/locale_recurring_cn.js.map +0 -1
  449. package/codebase/sources/locale/recurring/locale_recurring_cs.js +0 -12
  450. package/codebase/sources/locale/recurring/locale_recurring_cs.js.map +0 -1
  451. package/codebase/sources/locale/recurring/locale_recurring_da.js +0 -13
  452. package/codebase/sources/locale/recurring/locale_recurring_da.js.map +0 -1
  453. package/codebase/sources/locale/recurring/locale_recurring_de.js +0 -13
  454. package/codebase/sources/locale/recurring/locale_recurring_de.js.map +0 -1
  455. package/codebase/sources/locale/recurring/locale_recurring_el.js +0 -13
  456. package/codebase/sources/locale/recurring/locale_recurring_el.js.map +0 -1
  457. package/codebase/sources/locale/recurring/locale_recurring_en.js +0 -11
  458. package/codebase/sources/locale/recurring/locale_recurring_en.js.map +0 -1
  459. package/codebase/sources/locale/recurring/locale_recurring_es.js +0 -13
  460. package/codebase/sources/locale/recurring/locale_recurring_es.js.map +0 -1
  461. package/codebase/sources/locale/recurring/locale_recurring_fi.js +0 -13
  462. package/codebase/sources/locale/recurring/locale_recurring_fi.js.map +0 -1
  463. package/codebase/sources/locale/recurring/locale_recurring_fr.js +0 -13
  464. package/codebase/sources/locale/recurring/locale_recurring_fr.js.map +0 -1
  465. package/codebase/sources/locale/recurring/locale_recurring_he.js +0 -13
  466. package/codebase/sources/locale/recurring/locale_recurring_he.js.map +0 -1
  467. package/codebase/sources/locale/recurring/locale_recurring_it.js +0 -13
  468. package/codebase/sources/locale/recurring/locale_recurring_it.js.map +0 -1
  469. package/codebase/sources/locale/recurring/locale_recurring_nb.js +0 -11
  470. package/codebase/sources/locale/recurring/locale_recurring_nb.js.map +0 -1
  471. package/codebase/sources/locale/recurring/locale_recurring_nl.js +0 -13
  472. package/codebase/sources/locale/recurring/locale_recurring_nl.js.map +0 -1
  473. package/codebase/sources/locale/recurring/locale_recurring_pl.js +0 -13
  474. package/codebase/sources/locale/recurring/locale_recurring_pl.js.map +0 -1
  475. package/codebase/sources/locale/recurring/locale_recurring_pt.js +0 -11
  476. package/codebase/sources/locale/recurring/locale_recurring_pt.js.map +0 -1
  477. package/codebase/sources/locale/recurring/locale_recurring_ro.js +0 -17
  478. package/codebase/sources/locale/recurring/locale_recurring_ro.js.map +0 -1
  479. package/codebase/sources/locale/recurring/locale_recurring_ru.js +0 -13
  480. package/codebase/sources/locale/recurring/locale_recurring_ru.js.map +0 -1
  481. package/codebase/sources/locale/recurring/locale_recurring_sk.js +0 -12
  482. package/codebase/sources/locale/recurring/locale_recurring_sk.js.map +0 -1
  483. package/codebase/sources/locale/recurring/locale_recurring_sv.js +0 -11
  484. package/codebase/sources/locale/recurring/locale_recurring_sv.js.map +0 -1
  485. package/codebase/sources/locale/recurring/locale_recurring_ua.js +0 -13
  486. package/codebase/sources/locale/recurring/locale_recurring_ua.js.map +0 -1
  487. package/codebase/sources/locale/recurring/repeat_template_be.html +0 -57
  488. package/codebase/sources/locale/recurring/repeat_template_cn.html +0 -57
  489. package/codebase/sources/locale/recurring/repeat_template_de.html +0 -60
  490. package/codebase/sources/locale/recurring/repeat_template_el.html +0 -57
  491. package/codebase/sources/locale/recurring/repeat_template_en.html +0 -57
  492. package/codebase/sources/locale/recurring/repeat_template_es.html +0 -57
  493. package/codebase/sources/locale/recurring/repeat_template_fr.html +0 -57
  494. package/codebase/sources/locale/recurring/repeat_template_he.html +0 -61
  495. package/codebase/sources/locale/recurring/repeat_template_it.html +0 -57
  496. package/codebase/sources/locale/recurring/repeat_template_nl.html +0 -65
  497. package/codebase/sources/locale/recurring/repeat_template_ro.html +0 -57
  498. package/codebase/sources/locale/recurring/repeat_template_ru.html +0 -57
  499. package/codebase/sources/locale/recurring/repeat_template_sk.html +0 -57
@@ -1,3065 +0,0 @@
1
- /*
2
-
3
- @license
4
- dhtmlxScheduler v.5.3.12 Standard
5
-
6
- To use dhtmlxScheduler in non-GPL projects (and get Pro version of the product), please obtain Commercial/Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxScheduler/#licensing or contact us at sales@dhtmlx.com
7
-
8
- (c) XB Software Ltd.
9
-
10
- */
11
- (function(){
12
-
13
- function setupKeyNav(scheduler){
14
- scheduler.config.key_nav = true;
15
- scheduler.config.key_nav_step = 30;
16
- scheduler.addShortcut = function(shortcut, handler, scope){
17
- var scopeObject = getScope(scope);
18
- if(scopeObject){
19
- scopeObject.prototype.bind(shortcut, handler);
20
- }
21
- };
22
-
23
- scheduler.getShortcutHandler = function(shortcut, scope){
24
- var scopeObject = getScope(scope);
25
- if(scopeObject){
26
- var commands = scheduler.$keyboardNavigation.shortcuts.parse(shortcut);
27
- if(commands.length){
28
- return scopeObject.prototype.findHandler(commands[0]);
29
- }
30
- }
31
- };
32
-
33
- scheduler.removeShortcut = function(shortcut, scope){
34
- var scopeObject = getScope(scope);
35
- if(scopeObject){
36
- scopeObject.prototype.unbind(shortcut);
37
- }
38
- };
39
-
40
- scheduler.focus = function(){
41
- if(!scheduler.config.key_nav){
42
- return;
43
- }
44
- var disp = scheduler.$keyboardNavigation.dispatcher;
45
- disp.enable();
46
- var activeNode = disp.getActiveNode();
47
- if(!activeNode || activeNode instanceof scheduler.$keyboardNavigation.MinicalButton || activeNode instanceof scheduler.$keyboardNavigation.MinicalCell){
48
- disp.setDefaultNode();
49
- }else{
50
- disp.focusNode(disp.getActiveNode());
51
- }
52
- };
53
-
54
- function getScope(mode){
55
- var scopes = {
56
- "minicalButton":scheduler.$keyboardNavigation.MinicalButton,
57
- "minicalDate":scheduler.$keyboardNavigation.MinicalCell,
58
- "scheduler":scheduler.$keyboardNavigation.SchedulerNode,
59
- "dataArea": scheduler.$keyboardNavigation.DataArea,
60
- "timeSlot": scheduler.$keyboardNavigation.TimeSlot,
61
- "event": scheduler.$keyboardNavigation.Event
62
- };
63
-
64
- var searchMap = {};
65
- for(var i in scopes)
66
- searchMap[i.toLowerCase()] = scopes[i];
67
-
68
- mode = (mode + "").toLowerCase();
69
-
70
- return searchMap[mode] || scopes.scheduler;
71
- }
72
-
73
- scheduler.$keyboardNavigation = {};
74
-
75
- scheduler._compose = function(){
76
- var parts = Array.prototype.slice.call(arguments, 0);
77
- var res = {};
78
- for(var i = 0; i < parts.length; i++){
79
- var obj = parts[i];
80
- if(typeof obj == "function"){
81
- obj = new obj();
82
- }
83
-
84
- for(var p in obj){
85
- res[p] = obj[p];
86
- }
87
- }
88
- return res;
89
- };
90
-
91
- scheduler.$keyboardNavigation.shortcuts = {
92
- createCommand: function(){
93
- return {
94
- modifiers:{
95
- "shift": false,
96
- "alt": false,
97
- "ctrl": false,
98
- "meta": false
99
- },
100
- keyCode: null
101
- };
102
- },
103
- parse: function(shortcut){
104
- var commands = [];
105
-
106
- var expr = this.getExpressions(this.trim(shortcut));
107
- for(var i = 0; i < expr.length; i++){
108
- var words = this.getWords(expr[i]);
109
-
110
- var command = this.createCommand();
111
-
112
- for(var j = 0; j < words.length; j++){
113
- if(this.commandKeys[words[j]]){
114
- command.modifiers[words[j]] = true;
115
- }else if(this.specialKeys[words[j]]){
116
- command.keyCode = this.specialKeys[words[j]];
117
- }else{
118
- command.keyCode = words[j].charCodeAt(0);
119
- }
120
- }
121
-
122
- commands.push(command);
123
- }
124
- return commands;
125
- },
126
-
127
- getCommandFromEvent: function(domEvent){
128
- var command = this.createCommand();
129
- command.modifiers.shift = !!domEvent.shiftKey;
130
- command.modifiers.alt = !!domEvent.altKey;
131
- command.modifiers.ctrl = !!domEvent.ctrlKey;
132
- command.modifiers.meta = !!domEvent.metaKey;
133
- command.keyCode = domEvent.which || domEvent.keyCode;
134
-
135
- if(command.keyCode >= 96 && command.keyCode <= 105){
136
- // numpad keys 96-105 -> 48-57
137
- command.keyCode -= 48;//convert numpad number code to regular number code
138
- }
139
-
140
- var printableKey = String.fromCharCode(command.keyCode );
141
- if(printableKey){
142
- command.keyCode = printableKey.toLowerCase().charCodeAt(0);
143
- }
144
- return command;
145
- },
146
-
147
- getHashFromEvent: function(domEvent){
148
- return this.getHash(this.getCommandFromEvent(domEvent));
149
- },
150
-
151
- getHash: function(command){
152
- var parts = [];
153
- for(var i in command.modifiers){
154
- if(command.modifiers[i]){
155
- parts.push(i);
156
- }
157
- }
158
- parts.push(command.keyCode);
159
-
160
- return parts.join(this.junctionChar);
161
- },
162
-
163
- getExpressions: function(shortcut){
164
- return shortcut.split(this.junctionChar);
165
- },
166
- getWords: function(term){
167
- return term.split(this.combinationChar);
168
- },
169
- trim: function(shortcut){
170
- return shortcut.replace(/\s/g, "");
171
- },
172
- junctionChar:",",
173
- combinationChar:"+",
174
- commandKeys:{
175
- "shift": 16,
176
- "alt": 18,
177
- "ctrl": 17,
178
- "meta": true
179
- },
180
- specialKeys:{
181
- "backspace": 8,
182
- "tab": 9,
183
- "enter": 13,
184
- "esc": 27,
185
- "space": 32,
186
- "up": 38,
187
- "down": 40,
188
- "left": 37,
189
- "right": 39,
190
- "home": 36,
191
- "end": 35,
192
- "pageup": 33,
193
- "pagedown": 34,
194
- "delete": 46,
195
- "insert": 45,
196
- "plus":107,
197
- "f1": 112,
198
- "f2": 113,
199
- "f3": 114,
200
- "f4": 115,
201
- "f5": 116,
202
- "f6": 117,
203
- "f7": 118,
204
- "f8": 119,
205
- "f9": 120,
206
- "f10": 121,
207
- "f11": 122,
208
- "f12": 123
209
- }
210
- };
211
- scheduler.$keyboardNavigation.EventHandler = {
212
- _handlers: null,
213
- findHandler: function(command){
214
- if(!this._handlers) this._handlers = {};
215
- var shortcuts = scheduler.$keyboardNavigation.shortcuts;
216
- var hash = shortcuts.getHash(command);
217
-
218
- return this._handlers[hash];
219
- },
220
-
221
- doAction: function(command, e){
222
- var handler = this.findHandler(command);
223
- if(handler){
224
- handler.call(this, e);
225
-
226
- if (e.preventDefault) e.preventDefault();
227
- else e.returnValue = false;
228
-
229
- }
230
- },
231
- bind: function(shortcut, handler){
232
- if(!this._handlers) this._handlers = {};
233
-
234
- var shortcuts = scheduler.$keyboardNavigation.shortcuts;
235
-
236
- var commands = shortcuts.parse(shortcut);
237
- for(var i = 0; i < commands.length; i++){
238
- this._handlers[shortcuts.getHash(commands[i])] = handler;
239
- }
240
- },
241
- unbind: function(shortcut){
242
- var shortcuts = scheduler.$keyboardNavigation.shortcuts;
243
-
244
- var commands = shortcuts.parse(shortcut);
245
- for(var i = 0; i < commands.length; i++){
246
- if(this._handlers[shortcuts.getHash(commands[i])]){
247
- delete this._handlers[shortcuts.getHash(commands[i])];
248
- }
249
- }
250
- },
251
-
252
- bindAll: function(map){
253
- for(var i in map){
254
- this.bind(i, map[i]);
255
- }
256
- },
257
- initKeys: function(){
258
- if(!this._handlers)
259
- this._handlers = {};
260
- if(this.keys){
261
- this.bindAll(this.keys);
262
- }
263
- }
264
- };
265
- (function(){
266
- scheduler.$keyboardNavigation.getFocusableNodes = scheduler._getFocusableNodes;
267
-
268
- scheduler.$keyboardNavigation.trapFocus = function trapFocus(root, e){
269
- if(e.keyCode != 9) return false;
270
-
271
- var focusable = scheduler.$keyboardNavigation.getFocusableNodes(root);
272
- var currentFocus = document.activeElement;
273
- var currentIndex = -1;
274
- for(var i = 0; i < focusable.length; i++){
275
- if(focusable[i] == currentFocus){
276
- currentIndex = i;
277
- break;
278
- }
279
- }
280
-
281
- var nextIndex, nextItem;
282
- if(e.shiftKey){
283
-
284
- // back tab
285
- // go to the last element if we focused on the first
286
- nextIndex = (currentIndex <= 0) ? (focusable[focusable.length - 1]) : (currentIndex - 1);
287
-
288
- nextItem = focusable[nextIndex];
289
- if(nextItem){
290
- nextItem.focus();
291
- e.preventDefault();
292
- return true;
293
- }
294
-
295
- }else{
296
- // forward tab
297
- // forward tab from last element should go back to the first element
298
- nextIndex = (currentIndex >= focusable.length - 1) ? 0 : (currentIndex + 1);
299
- nextItem = focusable[nextIndex];
300
- if(nextItem){
301
- nextItem.focus();
302
- e.preventDefault();
303
- return true;
304
- }
305
-
306
- }
307
-
308
- return false;
309
- };
310
- })();
311
- scheduler.$keyboardNavigation.marker = {
312
- clear: function(){
313
- var divs = scheduler.$container.querySelectorAll(".dhx_focus_slot");
314
- for(var i = 0; i < divs.length; i++){
315
- divs[i].parentNode.removeChild(divs[i]);
316
- }
317
- },
318
- createElement: function(){
319
- var element = document.createElement("div");
320
- element.setAttribute("tabindex", -1);
321
- element.className = "dhx_focus_slot";
322
- return element;
323
- },
324
-
325
- renderMultiple: function(start, end, method){
326
- var divs = [];
327
- var currentStart = new Date(start);
328
- var currentEnd = new Date(Math.min(end.valueOf(), scheduler.date.add(scheduler.date.day_start(new Date(start)), 1, "day").valueOf()));
329
- while(currentStart.valueOf() < end.valueOf()){
330
-
331
- divs = divs.concat(method.call(this, currentStart, new Date(Math.min(currentEnd.valueOf(), end.valueOf()))));
332
- currentStart = scheduler.date.day_start(scheduler.date.add(currentStart, 1, "day"));
333
-
334
- currentEnd = scheduler.date.day_start(scheduler.date.add(currentStart, 1, "day"));
335
- currentEnd = new Date(Math.min(currentEnd.valueOf(), end.valueOf()));
336
- }
337
-
338
- return divs;
339
- },
340
-
341
-
342
- render: function(start, end, section){
343
- this.clear();
344
- var divs = [];
345
-
346
- var modes = scheduler.$keyboardNavigation.TimeSlot.prototype._modes;
347
- var view = scheduler.$keyboardNavigation.TimeSlot.prototype._getMode();
348
- switch (view){
349
- case modes.units:
350
- divs = this.renderVerticalMarker(start, end, section);
351
- break;
352
- case modes.timeline:
353
- divs = this.renderTimelineMarker(start, end, section);
354
- break;
355
- case modes.year:
356
- divs = divs.concat(this.renderMultiple(start, end, this.renderYearMarker));
357
- break;
358
- case modes.month:
359
- divs = this.renderMonthMarker(start, end);
360
- break;
361
- case modes.weekAgenda:
362
- divs = divs.concat(this.renderMultiple(start, end, this.renderWeekAgendaMarker));
363
- break;
364
- case modes.list:
365
- divs = this.renderAgendaMarker(start, end);
366
- break;
367
- case modes.dayColumns:
368
- divs = divs.concat(this.renderMultiple(start, end, this.renderVerticalMarker));
369
- break;
370
- }
371
-
372
- this.addWaiAriaLabel(divs, start, end, section);
373
- this.addDataAttributes(divs, start, end, section);
374
-
375
- for(var i = divs.length - 1; i >= 0; i--){
376
- if(divs[i].offsetWidth){
377
- return divs[i];
378
- }
379
- }
380
-
381
- return null;
382
- },
383
-
384
- addDataAttributes: function(divs, start, end, section){
385
- var dateToStr = scheduler.date.date_to_str(scheduler.config.api_date);
386
-
387
- var from = dateToStr(start),
388
- to = dateToStr(end);
389
-
390
- for(var i = 0; i < divs.length; i++){
391
- divs[i].setAttribute("data-start-date", from);
392
- divs[i].setAttribute("data-end-date", to);
393
- if(section){
394
- divs[i].setAttribute("data-section", section);
395
- }
396
- }
397
- },
398
-
399
- addWaiAriaLabel: function(divs, start, end, section){
400
- var label = "";
401
- var state = scheduler.getState();
402
- var mode = state.mode;
403
-
404
- var dateTimeLabel = false;
405
-
406
- label += scheduler.templates.day_date(start);
407
-
408
- if((scheduler.date.day_start(new Date(start)).valueOf() != start.valueOf())){
409
- label += " " + scheduler.templates.hour_scale(start);
410
- dateTimeLabel = true;
411
- }
412
-
413
- if((scheduler.date.day_start(new Date(start)).valueOf() != scheduler.date.day_start(new Date(end)).valueOf())){
414
-
415
- label += " - " + scheduler.templates.day_date(end);
416
- if(dateTimeLabel || (scheduler.date.day_start(new Date(end)).valueOf() != end.valueOf())){
417
- label += " " + scheduler.templates.hour_scale(end);
418
- }
419
- }
420
-
421
- if(section){
422
- if(scheduler.matrix && scheduler.matrix[mode]){
423
- label += ", " + scheduler.templates[mode + "_scale_label"](section.key, section.label, section);
424
- }else if(scheduler._props && scheduler._props[mode]){
425
- label += ", " + scheduler.templates[mode + "_scale_text"](section.key, section.label, section);
426
- }
427
- }
428
-
429
-
430
- for(var i = 0; i < divs.length; i++){
431
- scheduler._waiAria.setAttributes(divs[i], {
432
- "aria-label": label,
433
- "aria-live": "polite"
434
- });
435
- }
436
- },
437
-
438
- renderWeekAgendaMarker: function(start_date, end_date){
439
- var divs = scheduler.$container.querySelectorAll(".dhx_wa_day_cont .dhx_wa_scale_bar");
440
-
441
- var currDate = scheduler.date.week_start(new Date(scheduler.getState().min_date));
442
-
443
- var index = -1;
444
- var markerDate = scheduler.date.day_start(new Date(start_date));
445
- for(var i = 0; i < divs.length; i++){
446
- index++;
447
- if(scheduler.date.day_start(new Date(currDate)).valueOf() == markerDate.valueOf()){
448
- break;
449
- }else{
450
- currDate = scheduler.date.add(currDate, 1, "day");
451
- }
452
- }
453
- if(index != -1) return this._wrapDiv(divs[index]);
454
- return [];
455
- },
456
-
457
- _wrapDiv: function(cell){
458
- var marker = this.createElement();
459
- marker.style.top = cell.offsetTop + "px";
460
- marker.style.left = cell.offsetLeft + "px";
461
- marker.style.width = cell.offsetWidth + "px";
462
- marker.style.height = cell.offsetHeight + "px";
463
- cell.appendChild(marker);
464
- return [marker];
465
- },
466
- renderYearMarker: function(start_date, end_date){
467
- var cell = scheduler._get_year_cell(start_date);
468
- cell.style.position = "relative";
469
- var marker = this.createElement();
470
- marker.style.top = "0px";
471
- marker.style.left = "0px";
472
- marker.style.width = "100%";
473
- marker.style.height = "100%";
474
- cell.appendChild(marker);
475
- return [marker];
476
- },
477
-
478
- renderAgendaMarker: function(start_date, end_date){
479
- var block = this.createElement();
480
- block.style.height = "1px";
481
- block.style.width = "100%";
482
- block.style.opacity = 1;
483
- block.style.top = "0px";
484
- block.style.left = "0px";
485
- scheduler.$container.querySelector(".dhx_cal_data").appendChild(block);
486
- return [block];
487
- },
488
-
489
- renderTimelineMarker: function(start_date, end_date, section){
490
- var view_opts = scheduler._lame_copy({}, scheduler.matrix[scheduler._mode]);
491
- var areas = view_opts._scales;
492
- //timespans must always use actual position, not rounded
493
- view_opts.round_position = false;
494
- var blocks = [];
495
-
496
- var min_date = start_date ? new Date(start_date) : scheduler._min_date;
497
- var max_date = end_date ? new Date(end_date) : scheduler._max_date;
498
-
499
- if(min_date.valueOf() < scheduler._min_date.valueOf())
500
- min_date = new Date(scheduler._min_date);
501
- if(max_date.valueOf() > scheduler._max_date.valueOf())
502
- max_date = new Date(scheduler._max_date);
503
-
504
- if(!view_opts._trace_x) return blocks;
505
-
506
- for(var i = 0; i < view_opts._trace_x.length; i++){
507
- if(scheduler._is_column_visible(view_opts._trace_x[i]))
508
- break;
509
- }
510
- if(i == view_opts._trace_x.length)
511
- return blocks;
512
-
513
- var area = areas[section];
514
-
515
- if (!(min_date < end_date && max_date > start_date))
516
- return blocks;
517
-
518
- var block = this.createElement();
519
-
520
- var start_pos = scheduler._timeline_getX({start_date: start_date}, false, view_opts)-1;
521
- var end_pos = scheduler._timeline_getX({start_date: end_date}, false, view_opts)-1;
522
- var height = ((view_opts._section_height[section]-1) || (view_opts.dy - 1));
523
-
524
- var top = 0;
525
- if (scheduler._isRender('cell')){
526
- top = area.offsetTop;
527
- start_pos += view_opts.dx;
528
- end_pos += view_opts.dx;
529
- area = scheduler.$container.querySelector(".dhx_cal_data");
530
- }else{
531
-
532
- }
533
- var width = Math.max(1, end_pos - start_pos - 1);
534
- block.style.cssText = "height: "+height+"px; left: "+start_pos+"px; width: "+width+"px; top: "+top+"px;";
535
-
536
- area.appendChild(block);
537
- blocks.push(block);
538
-
539
- return blocks;
540
- },
541
-
542
-
543
-
544
- renderMonthCell: function(date){
545
- var cells = scheduler.$container.querySelectorAll(".dhx_month_head");
546
-
547
- var divs = [];
548
- for(var i = 0; i < cells.length; i++){
549
- divs.push(cells[i].parentNode);
550
- }
551
-
552
- var firstDate = scheduler.date.week_start(new Date(scheduler.getState().min_date));
553
-
554
- var index = -1;
555
- var weekNumber = 0;
556
- var dayIndex = -1;
557
- var currDate = firstDate;
558
- var markerDate = scheduler.date.day_start(new Date(date));
559
- for(var i = 0; i < divs.length; i++){
560
- index++;
561
-
562
- if(dayIndex == 6){
563
- weekNumber++;
564
- dayIndex = 0;
565
- }else{
566
- dayIndex++;
567
- }
568
-
569
- if(scheduler.date.day_start(new Date(currDate)).valueOf() == markerDate.valueOf()){
570
- break;
571
- }else{
572
- currDate = scheduler.date.add(currDate, 1, "day");
573
- }
574
- }
575
-
576
- if(index == -1){
577
- return [];
578
- }
579
-
580
- var left = scheduler._colsS[dayIndex];
581
- var top = scheduler._colsS.heights[weekNumber];
582
-
583
- var div = this.createElement();
584
- div.style.top = top + "px";
585
- div.style.left = left + "px";
586
- div.style.width = scheduler._cols[dayIndex] + "px";
587
- div.style.height = ((scheduler._colsS.heights[weekNumber + 1] - top) || scheduler._colsS.height) + "px" ;
588
-
589
-
590
- var container = scheduler.$container.querySelector(".dhx_cal_data");
591
-
592
- var datatable = container.querySelector("table");
593
- if(datatable.nextSibling){
594
- container.insertBefore(div, datatable.nextSibling);
595
- }else{
596
- container.appendChild(div);
597
- }
598
- return div;
599
- },
600
- renderMonthMarker: function(start_date, end_date){
601
- var res = [];
602
- var currentDate = start_date;
603
- while(currentDate.valueOf() < end_date.valueOf()){
604
- res.push(this.renderMonthCell(currentDate));
605
- currentDate = scheduler.date.add(currentDate, 1, "day");
606
- }
607
- return res;
608
- },
609
-
610
- renderVerticalMarker: function(start_date, end_date, section){
611
- var index = scheduler.locate_holder_day(start_date);
612
-
613
- var divs = [];
614
- var area = null;
615
-
616
- var c = scheduler.config;
617
- if(scheduler._ignores[index]) return divs;
618
-
619
- if (scheduler._props && scheduler._props[scheduler._mode] && section) {
620
- var view = scheduler._props[scheduler._mode];
621
- index = view.order[section];
622
-
623
- var inner_index = view.order[section];
624
- if(!(view.days > 1)){
625
- index = inner_index;
626
- if (view.size && (index > view.position+view.size)) {
627
- index = 0;
628
- }
629
- }else{
630
- //var units_l = view.size || view.options.length;
631
-
632
- index = scheduler.locate_holder_day(start_date) + inner_index;
633
- //index = index*units_l + inner_index;
634
- }
635
- }
636
- area = scheduler.locate_holder(index);
637
- if(!area || area.querySelector(".dhx_scale_hour")){
638
- // hour scale instead of date column
639
- return document.createElement("div");
640
- }
641
-
642
- var start = Math.max((start_date.getHours()*60 + start_date.getMinutes()), c.first_hour*60);
643
-
644
-
645
- var end = Math.min((end_date.getHours()*60 + end_date.getMinutes()), c.last_hour*60);
646
- if(!end && (scheduler.date.day_start(new Date(end_date)).valueOf() > scheduler.date.day_start(new Date(start_date)).valueOf())){
647
- end = c.last_hour*60;
648
- }
649
-
650
- if (end <= start) {
651
- return [];
652
- }
653
-
654
- var block = this.createElement();
655
-
656
- // +1 for working with section which really takes up whole height (as % would be == 0)
657
- var all_hours_height = scheduler.config.hour_size_px*c.last_hour + 1;
658
- var hour_ms = 60*60*1000;
659
- block.style.top = (Math.round((start*60*1000-scheduler.config.first_hour*hour_ms)*scheduler.config.hour_size_px/hour_ms) % all_hours_height) + "px";
660
- block.style.lineHeight = block.style.height = Math.max((Math.round(((end-start)*60*1000)*scheduler.config.hour_size_px/hour_ms)) % all_hours_height, 1)+"px";
661
- block.style.width = "100%";
662
- area.appendChild(block);
663
- divs.push(block);
664
- return divs[0];
665
-
666
- }
667
- };
668
- scheduler.$keyboardNavigation.SchedulerNode = function(){};
669
-
670
- scheduler.$keyboardNavigation.SchedulerNode.prototype = scheduler._compose(
671
- scheduler.$keyboardNavigation.EventHandler,
672
- {
673
- getDefaultNode: function(){
674
- var node = new scheduler.$keyboardNavigation.TimeSlot();
675
-
676
- if(!node.isValid()){
677
- node = node.fallback();
678
- }
679
- return node;
680
- },
681
-
682
- _modes:{
683
- month: "month",
684
- year: "year",
685
- dayColumns: "dayColumns",
686
- timeline:"timeline",
687
- units:"units",
688
- weekAgenda: "weekAgenda",
689
- list: "list"
690
- },
691
- getMode: function(){
692
- var state = scheduler.getState();
693
-
694
- var mode = state.mode;
695
- if((scheduler.matrix && scheduler.matrix[mode])){
696
- return this._modes.timeline;
697
- } else if((scheduler._props && scheduler._props[mode])){
698
- return this._modes.units;
699
- }else if(mode == "month"){
700
- return this._modes.month;
701
- }else if(mode == "year"){
702
- return this._modes.year;
703
- }else if(mode == "week_agenda"){
704
- return this._modes.weekAgenda;
705
- }else if(mode == "map" || mode == "agenda" || (scheduler._grid && scheduler["grid_" + mode])){
706
- return this._modes.list;
707
- }else{
708
- return this._modes.dayColumns;
709
- }
710
- },
711
-
712
- focus: function(){
713
- scheduler.focus();
714
- },
715
-
716
- blur: function(){
717
-
718
- },
719
-
720
- disable: function(){
721
- scheduler.$container.setAttribute("tabindex", "0");
722
- },
723
- enable: function(){
724
- if(scheduler.$container)
725
- scheduler.$container.removeAttribute("tabindex");
726
- },
727
- isEnabled: function(){
728
- return scheduler.$container.hasAttribute("tabindex");
729
- },
730
-
731
-
732
- _compareEvents: function(a, b){
733
- if (a.start_date.valueOf() == b.start_date.valueOf())
734
- return a.id > b.id ? 1 : -1;
735
- return a.start_date.valueOf() > b.start_date.valueOf() ? 1 : -1;
736
- },
737
-
738
- _pickEvent: function(from, to, startId, reverse){
739
- var range = scheduler.getState();
740
- from = new Date(Math.max(range.min_date.valueOf(), from.valueOf()));
741
- to = new Date(Math.min(range.max_date.valueOf(), to.valueOf()));
742
-
743
- var evs = scheduler.getEvents(from, to);
744
- evs.sort(this._compareEvents);
745
- if(reverse){
746
- evs = evs.reverse();
747
- }
748
-
749
- var trim = !!startId;
750
- for(var i =0; i < evs.length && trim; i++){
751
- if(evs[i].id == startId){
752
- trim = false;
753
- }
754
- evs.splice(i, 1);
755
- i--;
756
- }
757
-
758
- for(var i = 0; i < evs.length; i++){
759
- var eventElement = new scheduler.$keyboardNavigation.Event(evs[i].id);
760
- if(eventElement.getNode())
761
- return evs[i];
762
- }
763
-
764
- return null;
765
- },
766
-
767
- nextEventHandler: function(id){
768
- var activeNode = scheduler.$keyboardNavigation.dispatcher.activeNode;
769
-
770
- var startId = id || (activeNode && activeNode.eventId);
771
-
772
- var nextEvent = null;
773
- if(startId && scheduler.getEvent(startId)){
774
- var currEvent = scheduler.getEvent(startId);
775
-
776
- nextEvent = scheduler.$keyboardNavigation.SchedulerNode.prototype._pickEvent(
777
- currEvent.start_date,
778
- scheduler.date.add(currEvent.start_date, 1, "year"),
779
- currEvent.id,
780
- false
781
- );
782
-
783
- }
784
- if(!nextEvent && !id){
785
- var visibleDates = scheduler.getState();
786
-
787
- nextEvent = scheduler.$keyboardNavigation.SchedulerNode.prototype._pickEvent(
788
- visibleDates.min_date,
789
- scheduler.date.add(visibleDates.min_date, 1, "year"),
790
- null,
791
- false
792
- );
793
- }
794
-
795
- if(nextEvent){
796
-
797
- var nextEv = new scheduler.$keyboardNavigation.Event(nextEvent.id);
798
- if(!nextEv.isValid()){// not visible event
799
- this.nextEventHandler(nextEvent.id);
800
- }else{
801
- if(activeNode){activeNode.blur();}
802
- scheduler.$keyboardNavigation.dispatcher.setActiveNode(nextEv);
803
- }
804
- }
805
- },
806
-
807
- prevEventHandler: function(id){
808
- var activeNode = scheduler.$keyboardNavigation.dispatcher.activeNode;
809
-
810
- var startId = id || (activeNode && activeNode.eventId);
811
-
812
- var nextEvent = null;
813
- if(startId && scheduler.getEvent(startId)){
814
- var currEvent = scheduler.getEvent(startId);
815
-
816
- nextEvent = scheduler.$keyboardNavigation.SchedulerNode.prototype._pickEvent(
817
- scheduler.date.add(currEvent.end_date, -1, "year"),
818
- currEvent.end_date,
819
- currEvent.id,
820
- true
821
- );
822
- }
823
- if(!nextEvent && !id){
824
- var visibleDates = scheduler.getState();
825
-
826
- nextEvent = scheduler.$keyboardNavigation.SchedulerNode.prototype._pickEvent(
827
- scheduler.date.add(visibleDates.max_date, -1, "year"),
828
- visibleDates.max_date,
829
- null,
830
- true
831
- );
832
- }
833
-
834
- if(nextEvent){
835
- var nextEv = new scheduler.$keyboardNavigation.Event(nextEvent.id);
836
- if(!nextEv.isValid()){// not visible event
837
- this.prevEventHandler(nextEvent.id);
838
- }else{
839
- if(activeNode){activeNode.blur();}
840
- scheduler.$keyboardNavigation.dispatcher.setActiveNode(nextEv);
841
- }
842
- }
843
- },
844
-
845
- keys: {
846
-
847
- "alt+1, alt+2, alt+3, alt+4, alt+5, alt+6, alt+7, alt+8, alt+9": function(e){
848
- var tabs = scheduler.$keyboardNavigation.HeaderCell.prototype.getNodes(".dhx_cal_navline .dhx_cal_tab");
849
- var key = e.key;
850
- if(key === undefined){
851
- key = e.keyCode - 48;
852
- }
853
- if(tabs[key*1 - 1]){
854
- tabs[key*1 - 1].click();
855
- }
856
- },
857
-
858
- "ctrl+left,meta+left": function(e){
859
- scheduler._click.dhx_cal_prev_button();
860
- },
861
- "ctrl+right,meta+right": function(e){
862
- scheduler._click.dhx_cal_next_button();
863
- },
864
- "ctrl+up,meta+up":function(e){
865
- var dataArea = scheduler.$container.querySelector(".dhx_cal_data");
866
- dataArea.scrollTop -= 20;
867
- },
868
- "ctrl+down,meta+down": function(e){
869
- var dataArea = scheduler.$container.querySelector(".dhx_cal_data");
870
- dataArea.scrollTop += 20;
871
- },
872
-
873
-
874
- "e": function(){
875
- this.nextEventHandler();
876
- },
877
-
878
- "home": function(){
879
- scheduler.setCurrentView(new Date());
880
- },
881
-
882
- "shift+e": function(){
883
- this.prevEventHandler();
884
- },
885
-
886
- "ctrl+enter,meta+enter": function(){
887
- scheduler.addEventNow({start_date: new Date(scheduler.getState().date)});
888
- },
889
-
890
- "ctrl+c,meta+c": function(e){
891
- scheduler._key_nav_copy_paste(e);
892
- },
893
- "ctrl+v,meta+v": function(e){
894
- scheduler._key_nav_copy_paste(e);
895
- },
896
- "ctrl+x,meta+x": function(e){
897
- scheduler._key_nav_copy_paste(e);
898
- }
899
-
900
- }
901
- }
902
- );
903
-
904
- scheduler.$keyboardNavigation.SchedulerNode.prototype.bindAll(scheduler.$keyboardNavigation.SchedulerNode.prototype.keys);
905
- scheduler.$keyboardNavigation.KeyNavNode = function(){};
906
-
907
- scheduler.$keyboardNavigation.KeyNavNode.prototype = scheduler._compose(
908
- scheduler.$keyboardNavigation.EventHandler,
909
- {
910
- isValid: function(){
911
- return true;
912
- },
913
- fallback: function(){
914
- return null;
915
- },
916
-
917
- moveTo: function (element) {
918
- scheduler.$keyboardNavigation.dispatcher.setActiveNode(element);
919
- },
920
-
921
- compareTo: function(b){
922
- // good enough comparison of two random objects
923
- if(!b) return false;
924
- for(var i in this){
925
- if(!!this[i] != !!b[i]) return false;
926
-
927
- var canStringifyThis = !!(this[i] && this[i].toString);
928
- var canStringifyThat = !!(b[i] && b[i].toString);
929
- if(canStringifyThat != canStringifyThis) return false;
930
- if(!(canStringifyThat && canStringifyThis)) {
931
- if(b[i] != this[i]) return false;
932
- }else{
933
- if(b[i].toString() != this[i].toString())
934
- return false;
935
- }
936
- }
937
- return true;
938
- },
939
-
940
- getNode: function(){},
941
- focus: function(){
942
- var node = this.getNode();
943
- if(node){
944
- node.setAttribute("tabindex", "-1");
945
- //node.className += " scheduler_focused";
946
- if(node.focus) node.focus();
947
- }
948
-
949
- },
950
- blur: function(){
951
- var node = this.getNode();
952
- if(node){
953
- node.setAttribute("tabindex", "-1");
954
- //node.className = (node.className || "").replace(/ ?scheduler_focused/g, "");
955
- }
956
- }
957
- }
958
-
959
- );
960
-
961
- scheduler.$keyboardNavigation.HeaderCell = function(index){
962
- this.index = index || 0;
963
- };
964
-
965
- scheduler.$keyboardNavigation.HeaderCell.prototype = scheduler._compose(
966
- scheduler.$keyboardNavigation.KeyNavNode,
967
- {
968
- getNode: function(index){
969
- index = index || this.index || 0;
970
- var nodes = this.getNodes();
971
- if(nodes[index]) return nodes[index];
972
- },
973
-
974
- getNodes: function(selector){
975
- selector = selector || [
976
- ".dhx_cal_navline .dhx_cal_prev_button",
977
- ".dhx_cal_navline .dhx_cal_next_button",
978
- ".dhx_cal_navline .dhx_cal_today_button",
979
- ".dhx_cal_navline .dhx_cal_tab"
980
- ].join(", ");
981
-
982
- var nodes = Array.prototype.slice.call(scheduler.$container.querySelectorAll(selector));
983
- nodes.sort(function(a, b){
984
- return a.offsetLeft - b.offsetLeft;
985
- });
986
- return nodes;
987
- },
988
-
989
- _handlers:null,
990
-
991
- isValid: function(){
992
- return !!this.getNode(this.index);
993
- },
994
- fallback:function(){
995
- var defaultCell = this.getNode(0);
996
- if(!defaultCell){
997
- defaultCell = new scheduler.$keyboardNavigation.TimeSlot();
998
- }
999
- return defaultCell;
1000
- },
1001
-
1002
- keys: {
1003
- "left": function(){
1004
- var newIndex = this.index - 1;
1005
- if(newIndex < 0){
1006
- newIndex = this.getNodes().length - 1;
1007
- }
1008
-
1009
- this.moveTo(new scheduler.$keyboardNavigation.HeaderCell(newIndex));
1010
-
1011
- },
1012
- "right": function () {
1013
- var newIndex = this.index + 1;
1014
- if(newIndex >= this.getNodes().length){
1015
- newIndex = 0;
1016
- }
1017
-
1018
- this.moveTo(new scheduler.$keyboardNavigation.HeaderCell(newIndex));
1019
- },
1020
- "down": function () {
1021
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
1022
- },
1023
-
1024
- "enter": function(){
1025
- var node = this.getNode();
1026
- if(node){
1027
- node.click();
1028
- }
1029
- }
1030
- }
1031
- }
1032
- );
1033
-
1034
- scheduler.$keyboardNavigation.HeaderCell.prototype.bindAll(scheduler.$keyboardNavigation.HeaderCell.prototype.keys);
1035
- scheduler.$keyboardNavigation.Event = function(id){
1036
- this.eventId = null;
1037
- if(scheduler.getEvent(id)){
1038
- var ev = scheduler.getEvent(id);
1039
- this.start = new Date(ev.start_date);
1040
- this.end = new Date(ev.end_date);
1041
-
1042
- this.section = this._getSection(ev);
1043
- this.eventId = id;
1044
- }
1045
- };
1046
-
1047
- scheduler.$keyboardNavigation.Event.prototype = scheduler._compose(
1048
- scheduler.$keyboardNavigation.KeyNavNode,
1049
- {
1050
- _getNodes: function(){
1051
- return Array.prototype.slice.call(scheduler.$container.querySelectorAll("[event_id]"));
1052
- },
1053
-
1054
- _modes: scheduler.$keyboardNavigation.SchedulerNode.prototype._modes,
1055
-
1056
- getMode: scheduler.$keyboardNavigation.SchedulerNode.prototype.getMode,
1057
-
1058
- _handlers: null,
1059
- isValid: function(){
1060
- return !!(scheduler.getEvent(this.eventId) && this.getNode());
1061
- },
1062
- fallback: function(){
1063
- var eventNode = this._getNodes()[0];
1064
- var defaultElement = null;
1065
- if(!eventNode || !(scheduler._locate_event(eventNode))){
1066
- defaultElement = new scheduler.$keyboardNavigation.TimeSlot();
1067
- }else{
1068
- var id = scheduler._locate_event(eventNode);
1069
- defaultElement = new scheduler.$keyboardNavigation.Event(id);
1070
- }
1071
-
1072
- return defaultElement;
1073
- },
1074
-
1075
-
1076
-
1077
- getNode: function(){
1078
-
1079
- function isScrolledIntoView(el) {
1080
- var eventBox = el.getBoundingClientRect();
1081
- var viewPort = scheduler.$container.querySelector(".dhx_cal_data").getBoundingClientRect();
1082
-
1083
- if(eventBox.bottom < viewPort.top || eventBox.top > viewPort.bottom){
1084
- return false;
1085
- }
1086
- return true;
1087
- }
1088
-
1089
- var idSelector = "[event_id='"+this.eventId+"']";
1090
-
1091
- var inlineEditor = scheduler.$keyboardNavigation.dispatcher.getInlineEditor(this.eventId);
1092
- if(inlineEditor){// is inline editor visible
1093
- return inlineEditor;
1094
- }else{
1095
- if(scheduler.isMultisectionEvent && scheduler.isMultisectionEvent(scheduler.getEvent(this.eventId))){
1096
- var nodes = scheduler.$container.querySelectorAll(idSelector);
1097
- for(var i = 0; i < nodes.length; i++){
1098
- if(isScrolledIntoView(nodes[i])){
1099
- return nodes[i];
1100
- }
1101
- }
1102
- return nodes[0];
1103
- }else{
1104
- return scheduler.$container.querySelector(idSelector);
1105
- }
1106
-
1107
-
1108
- }
1109
-
1110
- },
1111
-
1112
- focus: function(){
1113
- var event = scheduler.getEvent(this.eventId);
1114
-
1115
- var calendar = scheduler.getState();
1116
- if(event.start_date.valueOf() > calendar.max_date.valueOf() || event.end_date.valueOf() <= calendar.min_date.valueOf()){
1117
- scheduler.setCurrentView(event.start_date);
1118
- }
1119
-
1120
- scheduler.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this);
1121
- },
1122
- blur: function(){
1123
- scheduler.$keyboardNavigation.KeyNavNode.prototype.blur.apply(this);
1124
- },
1125
-
1126
-
1127
- _getSection: function(ev){
1128
- var section = null;
1129
- var mode = scheduler.getState().mode;
1130
- if(scheduler.matrix && scheduler.matrix[mode]){
1131
- var timeline = scheduler.matrix[scheduler.getState().mode];
1132
- section = ev[timeline.y_property];
1133
- }else if(scheduler._props && scheduler._props[mode]){
1134
- var unit = scheduler._props[mode];
1135
- section = ev[unit.map_to];
1136
- }
1137
- return section;
1138
- },
1139
- _moveToSlot: function(dir){
1140
- var ev = scheduler.getEvent(this.eventId);
1141
- if(ev){
1142
- var section =this._getSection(ev);
1143
- var slot = new scheduler.$keyboardNavigation.TimeSlot(ev.start_date, null, section);
1144
- this.moveTo(slot.nextSlot(slot, dir));
1145
- }else{
1146
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
1147
- }
1148
- },
1149
-
1150
- keys: {
1151
- "left": function(){
1152
- this._moveToSlot("left");
1153
- },
1154
-
1155
- "right": function () {
1156
- this._moveToSlot("right");
1157
- },
1158
- "down": function () {
1159
- if(this.getMode() == this._modes.list){
1160
- scheduler.$keyboardNavigation.SchedulerNode.prototype.nextEventHandler();
1161
- }else {
1162
- this._moveToSlot("down");
1163
- }
1164
- },
1165
-
1166
- "space": function(){
1167
- var node = this.getNode();
1168
- if(node && node.click){
1169
- node.click();
1170
- }else{
1171
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
1172
- }
1173
-
1174
- },
1175
-
1176
- "up": function () {
1177
- if(this.getMode() == this._modes.list){
1178
- scheduler.$keyboardNavigation.SchedulerNode.prototype.prevEventHandler();
1179
- }else {
1180
- this._moveToSlot("up");
1181
- }
1182
- },
1183
-
1184
- "delete": function(){
1185
- if(scheduler.getEvent(this.eventId)) {
1186
- scheduler._click.buttons["delete"](this.eventId);
1187
- }else{
1188
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
1189
- }
1190
- },
1191
-
1192
- // open lightbox
1193
- "enter": function () {
1194
- if(scheduler.getEvent(this.eventId)) {
1195
- scheduler.showLightbox(this.eventId);
1196
- }else{
1197
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
1198
- }
1199
- }
1200
- }
1201
- }
1202
- );
1203
- scheduler.$keyboardNavigation.Event.prototype.bindAll(scheduler.$keyboardNavigation.Event.prototype.keys);
1204
- scheduler.$keyboardNavigation.TimeSlot = function(from, to, section, movingDate){
1205
- var state = scheduler.getState();
1206
- var timeline = scheduler.matrix && scheduler.matrix[state.mode];
1207
-
1208
- if(!from){
1209
- from = this.getDefaultDate();
1210
- }
1211
-
1212
- if(!to){
1213
-
1214
- if(timeline){
1215
- to = scheduler.date.add(from, timeline.x_step, timeline.x_unit);
1216
- }else{
1217
- to = scheduler.date.add(from, scheduler.config.key_nav_step, "minute");
1218
- }
1219
-
1220
- }
1221
-
1222
- this.section = section || this._getDefaultSection();
1223
- this.start_date = new Date(from);
1224
- this.end_date = new Date(to);
1225
- this.movingDate = movingDate || null;
1226
- };
1227
-
1228
- scheduler.$keyboardNavigation.TimeSlot.prototype = scheduler._compose(
1229
- scheduler.$keyboardNavigation.KeyNavNode,
1230
- {
1231
- _handlers:null,
1232
-
1233
- getDefaultDate: function(){
1234
- var from;
1235
- var state = scheduler.getState();
1236
- var timeline = scheduler.matrix && scheduler.matrix[state.mode];
1237
-
1238
- if(timeline){
1239
- from = scheduler.date[timeline.name + "_start"](new Date(state.date));
1240
- from = this.findVisibleColumn(from);
1241
- }else{
1242
- from = new Date(scheduler.getState().min_date);
1243
- from = this.findVisibleColumn(from);
1244
- from.setHours(scheduler.config.first_hour);
1245
-
1246
- if(!scheduler._table_view){
1247
- var dataContainer = scheduler.$container.querySelector(".dhx_cal_data");
1248
- if(dataContainer.scrollTop){
1249
- from.setHours(scheduler.config.first_hour + Math.ceil(dataContainer.scrollTop / scheduler.config.hour_size_px));
1250
- }
1251
- }
1252
- }
1253
-
1254
- return from;
1255
- },
1256
-
1257
- clone: function(timeslot){
1258
- return new scheduler.$keyboardNavigation.TimeSlot(timeslot.start_date, timeslot.end_date, timeslot.section, timeslot.movingDate);
1259
- },
1260
- _getMultisectionView: function(){
1261
- var state = scheduler.getState();
1262
- var view;
1263
- if(scheduler._props && scheduler._props[state.mode]) {
1264
- view = scheduler._props[state.mode];
1265
- }else if(scheduler.matrix && scheduler.matrix[state.mode]){
1266
- view = scheduler.matrix[state.mode];
1267
- }
1268
- return view;
1269
- },
1270
-
1271
- _getDefaultSection: function(){
1272
- var section = null;
1273
- var view = this._getMultisectionView();
1274
- if(view && !section){
1275
- section = this._getNextSection();
1276
- }
1277
- return section;
1278
- },
1279
-
1280
- _getNextSection: function(sectionId, dir){
1281
- var view = this._getMultisectionView();
1282
- var currentIndex = view.order[sectionId];
1283
- var nextIndex = currentIndex;
1284
- if(currentIndex !== undefined){
1285
- nextIndex = currentIndex + dir;
1286
- }else{
1287
- nextIndex = (view.size && view.position) ? view.position : 0;
1288
- }
1289
-
1290
- nextIndex = nextIndex < 0 ? nextIndex = (view.options || view.y_unit).length -1 : nextIndex;
1291
-
1292
-
1293
- var options = view.options || view.y_unit;
1294
- if(options[nextIndex]){
1295
- return options[nextIndex].key;
1296
- }else{
1297
- return null;
1298
- }
1299
- },
1300
-
1301
-
1302
- isValid: function(){
1303
- var state = scheduler.getState();
1304
- var isInRange = !(this.start_date.valueOf() < state.min_date.valueOf() || this.start_date.valueOf() >= state.max_date.valueOf());
1305
-
1306
- if(!isInRange) return false;
1307
-
1308
-
1309
- if(!this.isVisible(this.start_date, this.end_date)) return false;
1310
-
1311
- var view = this._getMultisectionView();
1312
-
1313
- if(view){
1314
- return (view.order[this.section] !== undefined);
1315
- }else{
1316
- return true;
1317
- }
1318
-
1319
- },
1320
-
1321
- fallback:function(){
1322
-
1323
- var defaultSlot = new scheduler.$keyboardNavigation.TimeSlot();
1324
- if(!defaultSlot.isValid()){
1325
- return new scheduler.$keyboardNavigation.DataArea();
1326
- }else{
1327
- return defaultSlot;
1328
- }
1329
- },
1330
-
1331
- getNodes: function(){
1332
- return Array.prototype.slice.call(scheduler.$container.querySelectorAll(".dhx_focus_slot"));
1333
- },
1334
- getNode: function(){
1335
- return this.getNodes()[0];
1336
- },
1337
-
1338
- focus: function(){
1339
- scheduler.$keyboardNavigation.marker.render(this.start_date, this.end_date, this.section);
1340
- scheduler.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this);
1341
- scheduler.$keyboardNavigation._pasteDate = this.start_date;
1342
- scheduler.$keyboardNavigation._pasteSection = this.section;
1343
-
1344
- },
1345
- blur: function(){
1346
- scheduler.$keyboardNavigation.KeyNavNode.prototype.blur.apply(this);
1347
- scheduler.$keyboardNavigation.marker.clear();
1348
- },
1349
-
1350
- _modes: scheduler.$keyboardNavigation.SchedulerNode.prototype._modes,
1351
-
1352
- _getMode: scheduler.$keyboardNavigation.SchedulerNode.prototype.getMode,
1353
-
1354
- addMonthDate: function(date, dir, extend){
1355
- var res;
1356
- switch (dir){
1357
- case "up":
1358
- res = scheduler.date.add(date, -1, "week");
1359
- break;
1360
- case "down":
1361
- res = scheduler.date.add(date, 1, "week");
1362
- break;
1363
- case "left":
1364
- res = scheduler.date.day_start(scheduler.date.add(date, -1, "day"));
1365
- res = this.findVisibleColumn(res, -1);
1366
- break;
1367
- case "right":
1368
- res = scheduler.date.day_start(scheduler.date.add(date, 1, "day"));
1369
- res = this.findVisibleColumn(res, 1);
1370
- break;
1371
- default:
1372
- res = scheduler.date.day_start(new Date(date));
1373
- break;
1374
- }
1375
-
1376
- var state = scheduler.getState();
1377
- if(date.valueOf() < state.min_date.valueOf() || (!extend && date.valueOf() >= state.max_date.valueOf())){
1378
- res = new Date(state.min_date);
1379
- }
1380
-
1381
- return res;
1382
- },
1383
-
1384
- nextMonthSlot: function(slot, dir, extend){
1385
-
1386
- var start, end;
1387
- start = this.addMonthDate(slot.start_date, dir, extend);
1388
-
1389
- start.setHours(scheduler.config.first_hour);
1390
- end = new Date(start);
1391
- end.setHours(scheduler.config.last_hour);
1392
- return {start_date: start, end_date: end};
1393
- },
1394
-
1395
- _alignTimeSlot: function(date, minDate, unit, step){
1396
- var currentDate = new Date(minDate);
1397
- while(currentDate.valueOf() < date.valueOf()){
1398
- currentDate = scheduler.date.add(currentDate, step, unit);
1399
- }
1400
-
1401
- if(currentDate.valueOf() > date.valueOf()){
1402
- currentDate = scheduler.date.add(currentDate, -step, unit);
1403
- }
1404
-
1405
- return currentDate;
1406
- },
1407
-
1408
- nextTimelineSlot: function(slot, dir, extend){
1409
- var state = scheduler.getState();
1410
- var view = scheduler.matrix[state.mode];
1411
-
1412
- var startDate = this._alignTimeSlot(slot.start_date, scheduler.date[view.name + "_start"](new Date(slot.start_date)), view.x_unit, view.x_step);
1413
- var endDate = this._alignTimeSlot(slot.end_date, scheduler.date[view.name + "_start"](new Date(slot.end_date)), view.x_unit, view.x_step);
1414
-
1415
- if(endDate.valueOf() <= startDate.valueOf()){
1416
- endDate = scheduler.date.add(startDate, view.x_step, view.x_unit);
1417
- }
1418
- var newPos = this.clone(slot);
1419
- newPos.start_date = startDate;
1420
- newPos.end_date = endDate;
1421
- newPos.section = slot.section || this._getNextSection();
1422
-
1423
-
1424
- switch (dir){
1425
- case "up":
1426
- newPos.section = this._getNextSection(slot.section, -1);
1427
- break;
1428
- case "down":
1429
- newPos.section = this._getNextSection(slot.section, +1);
1430
- break;
1431
- case "left":
1432
- newPos.start_date = this.findVisibleColumn(scheduler.date.add(newPos.start_date, -view.x_step, view.x_unit), -1);
1433
- newPos.end_date = scheduler.date.add(newPos.start_date, view.x_step, view.x_unit);
1434
- break;
1435
- case "right":
1436
- newPos.start_date = this.findVisibleColumn(scheduler.date.add(newPos.start_date, view.x_step, view.x_unit), 1);
1437
- newPos.end_date = scheduler.date.add(newPos.start_date, view.x_step, view.x_unit);
1438
-
1439
- break;
1440
- default:
1441
-
1442
- break;
1443
- }
1444
-
1445
- if(newPos.start_date.valueOf() < state.min_date.valueOf() || newPos.start_date.valueOf() >= state.max_date.valueOf()){
1446
- if(extend && newPos.start_date.valueOf() >= state.max_date.valueOf()){
1447
- newPos.start_date = new Date(state.max_date);
1448
- }else{
1449
- newPos.start_date = scheduler.date[state.mode + "_start"](scheduler.date.add(state.date, dir == "left" ? -1 : 1, state.mode));
1450
- newPos.end_date = scheduler.date.add(newPos.start_date, view.x_step, view.x_unit);
1451
- }
1452
- }
1453
-
1454
- return newPos;
1455
- },
1456
-
1457
- nextUnitsSlot: function(slot, dir, extend){
1458
- var newPos = this.clone(slot);
1459
- newPos.section = slot.section || this._getNextSection();
1460
-
1461
- var section = slot.section || this._getNextSection();
1462
- var state = scheduler.getState();
1463
- var view = scheduler._props[state.mode];
1464
- switch (dir){
1465
- case "left":
1466
- section = this._getNextSection(slot.section, -1);
1467
- var optionsCount = view.size ? (view.size - 1) : view.options.length;
1468
-
1469
- if(view.days > 1 && (view.order[section] == optionsCount - 1)){
1470
- if(scheduler.date.add(slot.start_date, -1, "day").valueOf() >= state.min_date.valueOf()){
1471
- newPos = this.nextDaySlot(slot, dir, extend);
1472
- }
1473
- }
1474
- break;
1475
- case "right":
1476
- section = this._getNextSection(slot.section, 1);
1477
- if(view.days > 1 && !view.order[section]){
1478
- if(scheduler.date.add(slot.start_date, 1, "day").valueOf() < state.max_date.valueOf()){
1479
- newPos = this.nextDaySlot(slot, dir, extend);
1480
- }
1481
- }
1482
-
1483
- break;
1484
- default:
1485
- newPos = this.nextDaySlot(slot, dir, extend);
1486
- section = slot.section;
1487
- break;
1488
- }
1489
- newPos.section = section;
1490
- return newPos;
1491
- },
1492
-
1493
- _moveDate: function(oldDate, dir){
1494
- var newDate = this.findVisibleColumn(scheduler.date.add(oldDate, dir, "day"), dir);
1495
- newDate.setHours(oldDate.getHours());
1496
- newDate.setMinutes(oldDate.getMinutes());
1497
- return newDate;
1498
- },
1499
-
1500
- isBeforeLastHour: function(date, isStartDate){
1501
- var minutes = date.getMinutes(),
1502
- hours = date.getHours(),
1503
- last_hour = scheduler.config.last_hour;
1504
- return (hours < last_hour || (!isStartDate && ((last_hour == 24 || hours == last_hour) && !minutes)));
1505
- },
1506
- isAfterFirstHour: function(date, isStartDate){
1507
- var minutes = date.getMinutes(),
1508
- hours = date.getHours(),
1509
- first_hour = scheduler.config.first_hour,
1510
- last_hour = scheduler.config.last_hour;
1511
- return (hours >= first_hour || (!isStartDate && (!minutes && ((!hours && last_hour == 24) || (hours == last_hour)))));
1512
- },
1513
- isInVisibleDayTime: function(date, isStartDate){
1514
- return (this.isBeforeLastHour(date, isStartDate) && this.isAfterFirstHour(date, isStartDate));
1515
- },
1516
-
1517
- nextDaySlot: function(slot, dir, extend){
1518
- var start, end;
1519
-
1520
- var key_nav_step = scheduler.config.key_nav_step;
1521
-
1522
- var date = this._alignTimeSlot(slot.start_date, scheduler.date.day_start(new Date(slot.start_date)), "minute", key_nav_step);
1523
-
1524
-
1525
- var oldStart = slot.start_date;
1526
-
1527
- switch (dir){
1528
- case "up":
1529
- start = scheduler.date.add(date, -key_nav_step, "minute");
1530
-
1531
- if(!this.isInVisibleDayTime(start, true)){
1532
- if (!extend || this.isInVisibleDayTime(oldStart, true)) {
1533
-
1534
- var toNextDay = true;
1535
- if(extend && scheduler.date.date_part(new Date(start)).valueOf() != scheduler.date.date_part(new Date(oldStart)).valueOf())
1536
- toNextDay = false;
1537
- if(toNextDay)
1538
- start = this.findVisibleColumn(scheduler.date.add(slot.start_date, -1, "day"), -1);
1539
-
1540
- start.setHours(scheduler.config.last_hour);
1541
- start.setMinutes(0);
1542
- start = scheduler.date.add(start, -key_nav_step, "minute");
1543
- }
1544
- }
1545
- end = scheduler.date.add(start, key_nav_step, "minute");
1546
- break;
1547
- case "down":
1548
- start = scheduler.date.add(date, key_nav_step, "minute");
1549
-
1550
- var testEnd = extend ? start : scheduler.date.add(start, key_nav_step, "minute");
1551
- if(!this.isInVisibleDayTime(testEnd, false)){
1552
- if(!extend || this.isInVisibleDayTime(oldStart, false)) {
1553
- if (!extend) {
1554
- start = this.findVisibleColumn(scheduler.date.add(slot.start_date, 1, "day"), 1);
1555
- start.setHours(scheduler.config.first_hour);
1556
- start.setMinutes(0);
1557
- } else {
1558
- var toNextDay = true;
1559
- if (scheduler.date.date_part(new Date(oldStart)).valueOf() == oldStart.valueOf()) {
1560
- toNextDay = false;
1561
- }
1562
- if (toNextDay) {
1563
- start = this.findVisibleColumn(scheduler.date.add(slot.start_date, 1, "day"), 1);
1564
- }
1565
- start.setHours(scheduler.config.first_hour);
1566
- start.setMinutes(0);
1567
- start = scheduler.date.add(start, key_nav_step, "minute");
1568
- }
1569
-
1570
- }
1571
- }
1572
- end = scheduler.date.add(start, key_nav_step, "minute");
1573
- break;
1574
- case "left":
1575
- start = this._moveDate(slot.start_date, -1);
1576
- end = this._moveDate(slot.end_date, -1);
1577
- break;
1578
- case "right":
1579
- start = this._moveDate(slot.start_date, 1);
1580
- end = this._moveDate(slot.end_date, 1);
1581
- break;
1582
- default:
1583
- start = date;
1584
- end = scheduler.date.add(start, key_nav_step, "minute");
1585
- break;
1586
- }
1587
-
1588
- return {start_date: start, end_date: end};
1589
- },
1590
- nextWeekAgendaSlot: function(slot, dir){
1591
- var start, end;
1592
- var state = scheduler.getState();
1593
-
1594
- switch (dir){
1595
- case "down":
1596
- case "left":
1597
- start = scheduler.date.day_start(scheduler.date.add(slot.start_date, -1, "day"));
1598
- start = this.findVisibleColumn(start, -1);
1599
- break;
1600
- case "up":
1601
- case "right":
1602
- start = scheduler.date.day_start(scheduler.date.add(slot.start_date, 1, "day"));
1603
- start = this.findVisibleColumn(start, 1);
1604
- break;
1605
- default:
1606
- start = scheduler.date.day_start(slot.start_date);
1607
- break;
1608
- }
1609
- if(slot.start_date.valueOf() < state.min_date.valueOf() || slot.start_date.valueOf() >= state.max_date.valueOf()){
1610
- start = new Date(state.min_date);
1611
-
1612
- }
1613
- end = new Date(start);
1614
- end.setHours(scheduler.config.last_hour);
1615
- return {start_date: start, end_date: end};
1616
- },
1617
- nextAgendaSlot: function(slot, dir){
1618
- return {start_date: slot.start_date, end_date: slot.end_date};
1619
- },
1620
-
1621
-
1622
- isDateVisible: function(date){
1623
- if(!scheduler._ignores_detected)
1624
- return true;
1625
-
1626
- var timeline = scheduler.matrix && scheduler.matrix[scheduler.getState().mode];
1627
-
1628
- var index;
1629
- if(timeline){
1630
- index = scheduler._get_date_index(timeline, date);
1631
- }else{
1632
- index = scheduler.locate_holder_day(date);
1633
- }
1634
-
1635
- return !scheduler._ignores[index];
1636
- },
1637
-
1638
- findVisibleColumn: function(start, dir){
1639
- var date = start;
1640
- dir = dir || 1;
1641
- var range = scheduler.getState();
1642
-
1643
- while(!this.isDateVisible(date) && ((dir > 0 && date.valueOf() <= range.max_date.valueOf()) || (dir < 0 && date.valueOf() >= range.min_date.valueOf()))){
1644
- date = this.nextDateColumn(date, dir);
1645
- }
1646
-
1647
- return date;
1648
- },
1649
-
1650
- nextDateColumn: function(start, dir){
1651
- dir = dir || 1;
1652
- var timeline = scheduler.matrix && scheduler.matrix[scheduler.getState().mode];
1653
-
1654
- var date;
1655
- if(timeline){
1656
- date = scheduler.date.add(start, dir * timeline.x_step, timeline.x_unit);
1657
- }else{
1658
- date = scheduler.date.day_start(scheduler.date.add(start, dir, "day"));
1659
- }
1660
-
1661
- return date;
1662
- },
1663
-
1664
- isVisible:function(from, to){
1665
- if(!scheduler._ignores_detected)
1666
- return true;
1667
-
1668
- var current = new Date(from);
1669
-
1670
- while(current.valueOf() < to.valueOf()){
1671
- if(this.isDateVisible(current)) return true;
1672
- current = this.nextDateColumn(current);
1673
- }
1674
- return false;
1675
- },
1676
-
1677
- nextSlot: function(slot, dir, view, extend){
1678
- var next;
1679
- view = view || this._getMode();
1680
-
1681
- var tempSlot = scheduler.$keyboardNavigation.TimeSlot.prototype.clone(slot);
1682
-
1683
- switch (view){
1684
- case this._modes.units:
1685
- next = this.nextUnitsSlot(tempSlot, dir, extend);
1686
- break;
1687
- case this._modes.timeline:
1688
- next = this.nextTimelineSlot(tempSlot, dir, extend);
1689
- break;
1690
- case this._modes.year:
1691
- next = this.nextMonthSlot(tempSlot, dir, extend);
1692
- break;
1693
- case this._modes.month:
1694
- next = this.nextMonthSlot(tempSlot, dir, extend);
1695
- break;
1696
- case this._modes.weekAgenda:
1697
- next = this.nextWeekAgendaSlot(tempSlot, dir, extend);
1698
- break;
1699
- case this._modes.list:
1700
- next = this.nextAgendaSlot(tempSlot, dir, extend);
1701
- break;
1702
- case this._modes.dayColumns:
1703
- next = this.nextDaySlot(tempSlot, dir, extend);
1704
- break;
1705
- }
1706
-
1707
- if(next.start_date.valueOf() >= next.end_date.valueOf()){
1708
- next = this.nextSlot(next, dir, view);
1709
- }
1710
-
1711
- return scheduler.$keyboardNavigation.TimeSlot.prototype.clone(next);
1712
-
1713
- },
1714
-
1715
- extendSlot: function(slot, dir){
1716
- var view = this._getMode();
1717
- var next;
1718
- switch (view){
1719
- case this._modes.units:
1720
- if(dir == "left" || dir == "right"){
1721
- next = this.nextUnitsSlot(slot, dir);
1722
- }else{
1723
- next = this.extendUnitsSlot(slot, dir);
1724
- }
1725
- break;
1726
- case this._modes.timeline:
1727
- if(dir == "down" || dir == "up"){
1728
- next = this.nextTimelineSlot(slot, dir);
1729
- }else{
1730
- next = this.extendTimelineSlot(slot, dir);
1731
- }
1732
- break;
1733
- case this._modes.year:
1734
- next = this.extendMonthSlot(slot, dir);
1735
- break;
1736
- case this._modes.month:
1737
- next = this.extendMonthSlot(slot, dir);
1738
- break;
1739
- case this._modes.dayColumns:
1740
- next = this.extendDaySlot(slot, dir);
1741
- break;
1742
- case this._modes.weekAgenda:
1743
- next = this.extendWeekAgendaSlot(slot, dir);
1744
- break;
1745
- default:
1746
- next = slot;
1747
- break;
1748
- }
1749
-
1750
- var range = scheduler.getState();
1751
- if(next.start_date.valueOf() < range.min_date.valueOf()){
1752
- next.start_date = this.findVisibleColumn(range.min_date);
1753
- next.start_date.setHours(scheduler.config.first_hour);
1754
- }
1755
-
1756
- if(next.end_date.valueOf() > range.max_date.valueOf()){
1757
- // next.end_date = new Date(slot.end_date);
1758
- next.end_date = this.findVisibleColumn(range.max_date, -1);
1759
- }
1760
-
1761
-
1762
- return scheduler.$keyboardNavigation.TimeSlot.prototype.clone(next);
1763
- },
1764
-
1765
- extendTimelineSlot: function(slot, direction){
1766
- return this.extendGenericSlot({
1767
- "left":"start_date",
1768
- "right":"end_date"
1769
- },
1770
- slot,
1771
- direction,
1772
- "timeline"
1773
- );
1774
- },
1775
-
1776
- extendWeekAgendaSlot: function(slot, direction){
1777
- return this.extendGenericSlot({
1778
- "left":"start_date",
1779
- "right":"end_date"
1780
- },
1781
- slot,
1782
- direction,
1783
- "weekAgenda"
1784
- );
1785
- },
1786
-
1787
- extendGenericSlot: function(allowedDirections, slot, direction, type){
1788
- var next;
1789
- var moveDate = slot.movingDate;
1790
-
1791
- if(!moveDate){
1792
- moveDate = allowedDirections[direction];
1793
- }
1794
-
1795
- if(!moveDate || !allowedDirections[direction]){
1796
- return slot;
1797
- }
1798
-
1799
- if(direction){
1800
- next = this.nextSlot({start_date: slot[moveDate], section: slot.section}, direction, type, true);
1801
-
1802
- if(next.start_date.valueOf() == slot.start_date.valueOf()){
1803
- next = this.nextSlot({start_date: next.start_date, section:next.section}, direction, type, true);
1804
- }
1805
-
1806
- next.movingDate = moveDate;
1807
- }else{
1808
- return scheduler.$keyboardNavigation.TimeSlot.prototype.clone(slot);
1809
- }
1810
-
1811
- var newDates = this.extendSlotDates(slot, next, next.movingDate);
1812
-
1813
- if(newDates.end_date.valueOf() <= newDates.start_date.valueOf()){
1814
- next.movingDate = next.movingDate == "end_date" ? "start_date" : "end_date";
1815
- }
1816
- newDates = this.extendSlotDates(slot, next, next.movingDate);
1817
-
1818
- next.start_date = newDates.start_date;
1819
- next.end_date = newDates.end_date;
1820
- return next;
1821
- },
1822
-
1823
- extendSlotDates: function(oldSlot, newSlot, dateDirection){
1824
- var res = {start_date:null, end_date:null};
1825
-
1826
- if(dateDirection == "start_date"){
1827
- res.start_date = newSlot.start_date;
1828
- res.end_date = oldSlot.end_date;
1829
- }else{
1830
- res.start_date = oldSlot.start_date;
1831
- res.end_date = newSlot.start_date;
1832
- }
1833
- return res;
1834
-
1835
- },
1836
-
1837
- extendMonthSlot: function(slot, direction){
1838
- var slot = this.extendGenericSlot({
1839
- "up":"start_date",
1840
- "down":"end_date",
1841
- "left":"start_date",
1842
- "right":"end_date"
1843
- },
1844
- slot,
1845
- direction,
1846
- "month"
1847
- );
1848
-
1849
- slot.start_date.setHours(scheduler.config.first_hour);
1850
- slot.end_date = scheduler.date.add(slot.end_date, -1, "day");
1851
- slot.end_date.setHours(scheduler.config.last_hour);
1852
- return slot;
1853
- },
1854
-
1855
- extendUnitsSlot: function(slot, direction){
1856
- var next;
1857
-
1858
- switch (direction){
1859
- case "down":
1860
- case "up":
1861
- next = this.extendDaySlot(slot, direction);
1862
- break;
1863
- default:
1864
- next = slot;
1865
- break;
1866
- }
1867
- next.section = slot.section;
1868
- return next;
1869
- },
1870
- extendDaySlot: function(slot, direction){
1871
- return this.extendGenericSlot({
1872
- "up":"start_date",
1873
- "down":"end_date",
1874
- "left":"start_date",
1875
- "right":"end_date"
1876
- },
1877
- slot,
1878
- direction,
1879
- "dayColumns"
1880
- );
1881
- },
1882
-
1883
- scrollSlot: function(dir){
1884
- var state = scheduler.getState();
1885
-
1886
- var slot = this.nextSlot(this, dir);
1887
- if(slot.start_date.valueOf() < state.min_date.valueOf() || slot.start_date.valueOf() >= state.max_date.valueOf()){
1888
- scheduler.setCurrentView(new Date(slot.start_date));
1889
- }
1890
-
1891
- this.moveTo(slot);
1892
- },
1893
-
1894
- keys: {
1895
- "left": function(){
1896
- this.scrollSlot("left");
1897
- },
1898
- "right": function () {
1899
- this.scrollSlot("right");
1900
- },
1901
- "down": function () {
1902
-
1903
- var mode = this._getMode();
1904
- if(mode == this._modes.list){
1905
- scheduler.$keyboardNavigation.SchedulerNode.prototype.nextEventHandler();
1906
- }else{
1907
- this.scrollSlot("down");
1908
- }
1909
-
1910
- },
1911
-
1912
- "up": function () {
1913
- var mode = this._getMode();
1914
- if(mode == this._modes.list){
1915
- scheduler.$keyboardNavigation.SchedulerNode.prototype.prevEventHandler();
1916
- }else{
1917
- this.scrollSlot("up");
1918
- }
1919
-
1920
- },
1921
-
1922
- "shift+down":function(){
1923
- this.moveTo(this.extendSlot(this, "down"));
1924
- },
1925
- "shift+up":function(){
1926
- this.moveTo(this.extendSlot(this, "up"));
1927
- },
1928
- "shift+right":function(){
1929
- this.moveTo(this.extendSlot(this, "right"));
1930
- },
1931
- "shift+left":function(){
1932
- this.moveTo(this.extendSlot(this, "left"));
1933
- },
1934
-
1935
-
1936
- "enter": function(){
1937
- var obj = {start_date: new Date(this.start_date), end_date: new Date(this.end_date)};
1938
-
1939
- var mode = scheduler.getState().mode;
1940
- if(scheduler.matrix && scheduler.matrix[mode]){
1941
-
1942
- var timeline = scheduler.matrix[scheduler.getState().mode];
1943
- obj[timeline.y_property] = this.section;
1944
- }else if(scheduler._props && scheduler._props[mode]){
1945
- var unit = scheduler._props[mode];
1946
- obj[unit.map_to] = this.section;
1947
- }
1948
-
1949
- scheduler.addEventNow(obj);
1950
- }
1951
- }
1952
- }
1953
- );
1954
-
1955
- scheduler.$keyboardNavigation.TimeSlot.prototype.bindAll(scheduler.$keyboardNavigation.TimeSlot.prototype.keys);
1956
- scheduler.$keyboardNavigation.MinicalButton = function(div, index){
1957
- this.container = div;
1958
- this.index = index || 0;
1959
- };
1960
-
1961
- scheduler.$keyboardNavigation.MinicalButton.prototype = scheduler._compose(
1962
- scheduler.$keyboardNavigation.KeyNavNode,
1963
- {
1964
-
1965
- isValid: function(){
1966
- var container = this.container;
1967
- return !!container.offsetWidth;// valid if container is visible
1968
- },
1969
-
1970
- fallback: function(){
1971
- var defaultSlot = new scheduler.$keyboardNavigation.TimeSlot();
1972
- if(defaultSlot.isValid()){
1973
- return defaultSlot;
1974
- }else{
1975
- return new scheduler.$keyboardNavigation.DataArea();
1976
- }
1977
- },
1978
- focus: function(){
1979
- scheduler.$keyboardNavigation.dispatcher.globalNode.disable();
1980
- this.container.removeAttribute("tabindex");
1981
- scheduler.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this);
1982
-
1983
- },
1984
- blur: function(){
1985
- this.container.setAttribute("tabindex", "0");
1986
- scheduler.$keyboardNavigation.KeyNavNode.prototype.blur.apply(this);
1987
- },
1988
- getNode: function(){
1989
- if(!this.index){
1990
- return this.container.querySelector(".dhx_cal_prev_button");
1991
- }else{
1992
- return this.container.querySelector(".dhx_cal_next_button");
1993
- }
1994
- },
1995
-
1996
- keys: {
1997
- "right": function(e){
1998
- this.moveTo(new scheduler.$keyboardNavigation.MinicalButton(this.container, this.index ? 0 : 1));
1999
- },
2000
- "left": function(e){
2001
- this.moveTo(new scheduler.$keyboardNavigation.MinicalButton(this.container, this.index ? 0 : 1));
2002
- },
2003
- "down": function(){
2004
- var next = new scheduler.$keyboardNavigation.MinicalCell(this.container, 0, 0);
2005
- if(next && !next.isValid()){
2006
- next = next.fallback();
2007
- }
2008
-
2009
- this.moveTo(next);
2010
- },
2011
- "enter": function(e){
2012
- this.getNode().click();
2013
- }
2014
- }
2015
- }
2016
- );
2017
-
2018
- scheduler.$keyboardNavigation.MinicalButton.prototype.bindAll(scheduler.$keyboardNavigation.MinicalButton.prototype.keys);
2019
- scheduler.$keyboardNavigation.MinicalCell = function(div, row, col){
2020
- this.container = div;
2021
- this.row = row || 0;
2022
- this.col = col || 0;
2023
- };
2024
-
2025
- scheduler.$keyboardNavigation.MinicalCell.prototype = scheduler._compose(
2026
- scheduler.$keyboardNavigation.KeyNavNode,
2027
- {
2028
-
2029
- isValid: function(){
2030
- var grid = this._getGrid();
2031
- return !!(grid[this.row] && grid[this.row][this.col]);
2032
- },
2033
- fallback: function(){
2034
- var row = this.row;
2035
- var col = this.col;
2036
- var grid = this._getGrid();
2037
- if(!grid[row]){
2038
- row = 0;
2039
- }
2040
- var dir = true;
2041
- if(row > grid.length / 2){
2042
- dir = false;
2043
- }
2044
-
2045
- if(!grid[row]){
2046
- var defaultSlot = new scheduler.$keyboardNavigation.TimeSlot();
2047
- if(defaultSlot.isValid()){
2048
- return defaultSlot;
2049
- }else{
2050
- return new scheduler.$keyboardNavigation.DataArea();
2051
- }
2052
- }
2053
-
2054
- if(dir){
2055
- for(var c = col; grid[row] && c < grid[row].length; c++){
2056
- if(!grid[row][c] && c == grid[row].length - 1){
2057
- row++;
2058
- col = 0;
2059
- }
2060
- if(grid[row][c]){
2061
- return new scheduler.$keyboardNavigation.MinicalCell(this.container, row, c);
2062
- }
2063
- }
2064
- }else{
2065
- for(var c = col; grid[row] && c < grid[row].length; c--){
2066
- if(!grid[row][c] && !c){
2067
- row--;
2068
- col = grid[row].length - 1;
2069
- }
2070
- if(grid[row][c]){
2071
- return new scheduler.$keyboardNavigation.MinicalCell(this.container, row, c);
2072
- }
2073
- }
2074
- }
2075
-
2076
- return new scheduler.$keyboardNavigation.MinicalButton(this.container, 0);
2077
- },
2078
- focus: function(){
2079
- scheduler.$keyboardNavigation.dispatcher.globalNode.disable();
2080
-
2081
- this.container.removeAttribute("tabindex");
2082
- scheduler.$keyboardNavigation.KeyNavNode.prototype.focus.apply(this);
2083
- },
2084
- blur: function(){
2085
- this.container.setAttribute("tabindex", "0");
2086
- scheduler.$keyboardNavigation.KeyNavNode.prototype.blur.apply(this);
2087
- },
2088
- _getNode: function(row, col){
2089
- return this.container.querySelector(".dhx_year_body tr:nth-child("+(row + 1) + ") td:nth-child("+(col + 1)+")");
2090
- },
2091
- getNode: function(){
2092
- return this._getNode(this.row, this.col);
2093
- },
2094
-
2095
- _getGrid: function(){
2096
- var rows = this.container.querySelectorAll(".dhx_year_body tr");
2097
- var grid = [];
2098
- for(var i = 0; i < rows.length; i++){
2099
- grid[i] = [];
2100
- var row = rows[i];
2101
- var cells = row.querySelectorAll("td");
2102
- for(var c = 0; c < cells.length; c++){
2103
- var cell = cells[c];
2104
- var enabled = true;
2105
- var css = scheduler._getClassName(cell);
2106
- if(css.indexOf("dhx_after") > -1 || css.indexOf("dhx_before") > -1 || css.indexOf("dhx_scale_ignore") > -1){
2107
- enabled = false;
2108
- }
2109
- grid[i][c] = enabled;
2110
- }
2111
- }
2112
- return grid;
2113
- },
2114
-
2115
-
2116
- keys: {
2117
- "right": function(e){
2118
- var grid = this._getGrid();
2119
- var newRow = this.row;
2120
- var newCol = this.col + 1;
2121
- if(!grid[newRow] || !grid[newRow][newCol]){
2122
- if(grid[newRow + 1]){
2123
- newRow = newRow + 1;
2124
- newCol = 0;
2125
- }else{
2126
- newCol = this.col;
2127
- }
2128
- }
2129
-
2130
- var next = new scheduler.$keyboardNavigation.MinicalCell(this.container, newRow, newCol);
2131
- if(!next.isValid()){
2132
- next = next.fallback();
2133
- }
2134
-
2135
- this.moveTo(next);
2136
- },
2137
- "left": function(e){
2138
- var grid = this._getGrid();
2139
- var newRow = this.row;
2140
- var newCol = this.col - 1;
2141
- if(!grid[newRow] || !grid[newRow][newCol]){
2142
- if(grid[newRow - 1]){
2143
- newRow = newRow - 1;
2144
- newCol = grid[newRow].length - 1;
2145
- }else{
2146
- newCol = this.col;
2147
- }
2148
- }
2149
-
2150
- var next = new scheduler.$keyboardNavigation.MinicalCell(this.container, newRow, newCol);
2151
- if(!next.isValid()){
2152
- next = next.fallback();
2153
- }
2154
-
2155
- this.moveTo(next);
2156
- },
2157
- "down": function(){
2158
- var grid = this._getGrid();
2159
- var newRow = this.row + 1;
2160
- var newCol = this.col;
2161
-
2162
- if(!grid[newRow] || !grid[newRow][newCol]){
2163
- newRow = this.row;
2164
- }
2165
-
2166
- var next = new scheduler.$keyboardNavigation.MinicalCell(this.container, newRow, newCol);
2167
- if(!next.isValid()){
2168
- next = next.fallback();
2169
- }
2170
-
2171
- this.moveTo(next);
2172
- },
2173
- "up": function(){
2174
- var grid = this._getGrid();
2175
- var newRow = this.row - 1;
2176
- var newCol = this.col;
2177
-
2178
- if(!grid[newRow] || !grid[newRow][newCol]){
2179
- var index = 0;
2180
- if(this.col > grid[this.row].length / 2){
2181
- index = 1;
2182
- }
2183
- this.moveTo(new scheduler.$keyboardNavigation.MinicalButton(this.container, index));
2184
- }else{
2185
- var next = new scheduler.$keyboardNavigation.MinicalCell(this.container, newRow, newCol);
2186
- if(!next.isValid()){
2187
- next = next.fallback();
2188
- }
2189
-
2190
- this.moveTo(next);
2191
- }
2192
-
2193
- },
2194
- "enter": function(e){
2195
- this.getNode().querySelector(".dhx_month_head").click();
2196
- }
2197
- }
2198
- }
2199
- );
2200
-
2201
- scheduler.$keyboardNavigation.MinicalCell.prototype.bindAll(scheduler.$keyboardNavigation.MinicalCell.prototype.keys);
2202
- scheduler.$keyboardNavigation.DataArea = function(index){
2203
- this.index = index || 0;
2204
- };
2205
-
2206
- scheduler.$keyboardNavigation.DataArea.prototype = scheduler._compose(
2207
- scheduler.$keyboardNavigation.KeyNavNode,
2208
- {
2209
- getNode: function(index){
2210
- return scheduler.$container.querySelector(".dhx_cal_data");
2211
- },
2212
-
2213
- _handlers:null,
2214
-
2215
- isValid: function(){
2216
- return true;
2217
- },
2218
- fallback:function(){
2219
- return this;
2220
- },
2221
-
2222
- keys: {
2223
- "up,down,right,left":function(){
2224
- this.moveTo(new scheduler.$keyboardNavigation.TimeSlot());
2225
- }
2226
- }
2227
- }
2228
- );
2229
-
2230
- scheduler.$keyboardNavigation.DataArea.prototype.bindAll(scheduler.$keyboardNavigation.DataArea.prototype.keys);
2231
- if(!dhtmlx._modalsStack){
2232
- dhtmlx._modalsStack = [];
2233
- }
2234
-
2235
- (function(){
2236
- var modalsStack = [];
2237
-
2238
- function isModal(){
2239
- return !!(modalsStack.length || dhtmlx._modalsStack.length);
2240
- }
2241
-
2242
- function isChildOf(child, parent){
2243
- while(child && child != parent){
2244
- child = child.parentNode;
2245
- }
2246
-
2247
- return !!(child == parent);
2248
- }
2249
-
2250
- function afterPopup(box){
2251
- setTimeout(function(){
2252
- if(!isModal() && !(isChildOf(document.activeElement, scheduler.$container))) {
2253
- scheduler.focus();
2254
- }
2255
- }, 1);
2256
- }
2257
- function startModal(box){
2258
- scheduler.eventRemove(box, "keydown", trapFocus);
2259
- scheduler.event(box, "keydown", trapFocus);
2260
- modalsStack.push(box);
2261
- //scheduler.$keyboardNavigation.dispatcher.disable();
2262
- }
2263
-
2264
- function endModal(){
2265
- var box = modalsStack.pop();
2266
- if(box) {
2267
- scheduler.eventRemove(box, "keydown", trapFocus);
2268
- }
2269
- afterPopup(box);
2270
-
2271
- }
2272
-
2273
- function isTopModal(box){
2274
- if(dhtmlx._modalsStack.length){
2275
- return box == dhtmlx._modalsStack[dhtmlx._modalsStack.length - 1];
2276
- }else{
2277
- return box == modalsStack[modalsStack.length - 1];
2278
- }
2279
-
2280
- }
2281
-
2282
- function trapFocus(event){
2283
- var event = event || window.event;
2284
- var target = event.currentTarget;
2285
- if(!isTopModal(target)) return;
2286
-
2287
- scheduler.$keyboardNavigation.trapFocus(target, event);
2288
- }
2289
-
2290
- function traceLightbox(){
2291
- startModal(scheduler.getLightbox());
2292
- }
2293
-
2294
- scheduler.attachEvent("onLightbox", traceLightbox);
2295
- scheduler.attachEvent("onAfterLightbox", endModal);
2296
-
2297
- scheduler.attachEvent("onAfterQuickInfo", function(){afterPopup();});
2298
-
2299
- if(!dhtmlx._keyNavMessagePopup) {
2300
- dhtmlx._keyNavMessagePopup = true;
2301
-
2302
- var focusElement = null;
2303
- var backupFocus = null;
2304
- dhtmlx.attachEvent("onMessagePopup", function(box){
2305
- focusElement = document.activeElement;
2306
- backupFocus = focusElement;
2307
-
2308
- while(backupFocus && scheduler._getClassName(backupFocus).indexOf("dhx_cal_data") < 0){
2309
- backupFocus = backupFocus.parentNode;
2310
- }
2311
- if(backupFocus){
2312
- backupFocus = backupFocus.parentNode;
2313
- }
2314
-
2315
- scheduler.eventRemove(box, "keydown", trapFocus);
2316
- scheduler.event(box, "keydown", trapFocus);
2317
- dhtmlx._modalsStack.push(box);
2318
- });
2319
-
2320
-
2321
- dhtmlx.attachEvent("onAfterMessagePopup", function () {
2322
- var box = dhtmlx._modalsStack.pop();
2323
- if(box) {
2324
- scheduler.eventRemove(box, "keydown", trapFocus);
2325
- }
2326
- setTimeout(function(){
2327
-
2328
- var currentTarget = document.activeElement;
2329
- while(currentTarget && scheduler._getClassName(currentTarget).indexOf("dhx_cal_light") < 0){
2330
- currentTarget = currentTarget.parentNode;
2331
- }
2332
- if(currentTarget)
2333
- return;
2334
-
2335
-
2336
- if(focusElement && focusElement.parentNode){
2337
- focusElement.focus();
2338
-
2339
- }else if(backupFocus && backupFocus.parentNode){
2340
- backupFocus.focus();
2341
- }
2342
- focusElement = null;
2343
- backupFocus = null;
2344
-
2345
- }, 1);
2346
- });
2347
- }
2348
-
2349
- scheduler.$keyboardNavigation.isModal = isModal;
2350
-
2351
-
2352
- })();
2353
- scheduler.$keyboardNavigation.dispatcher = {
2354
- isActive: false,
2355
- activeNode: null,
2356
- globalNode: new scheduler.$keyboardNavigation.SchedulerNode(),
2357
-
2358
- keepScrollPosition: function (callback) {
2359
- var top, left;
2360
-
2361
- var scrollable = scheduler.$container.querySelector(".dhx_timeline_scrollable_data");
2362
- if(!scrollable){
2363
- scrollable = scheduler.$container.querySelector(".dhx_cal_data");
2364
- }
2365
-
2366
- if(scrollable){
2367
- top = scrollable.scrollTop;
2368
- left = scrollable.scrollLeft;
2369
- }
2370
-
2371
- callback();
2372
-
2373
- if(scrollable){
2374
- scrollable.scrollTop = top;
2375
- scrollable.scrollLeft = left;
2376
- }
2377
- },
2378
- enable: function(){
2379
- if(!scheduler.$container){
2380
- // do nothing if not initialized
2381
- return;
2382
- }
2383
-
2384
- this.isActive = true;
2385
- var self = this;
2386
- this.keepScrollPosition(function () {
2387
- self.globalNode.enable();
2388
- self.setActiveNode(self.getActiveNode());
2389
- });
2390
- },
2391
-
2392
- disable: function(){
2393
- this.isActive = false;
2394
- this.globalNode.disable();
2395
- },
2396
-
2397
- isEnabled: function(){
2398
- return !!this.isActive;
2399
- },
2400
-
2401
- getDefaultNode: function(){
2402
- return this.globalNode.getDefaultNode();
2403
- },
2404
-
2405
- setDefaultNode: function() {
2406
- this.setActiveNode(this.getDefaultNode());
2407
- },
2408
-
2409
- getActiveNode: function(){
2410
- var node = this.activeNode;
2411
- if(node && !node.isValid()){
2412
- node = node.fallback();
2413
- }
2414
- return node;
2415
- },
2416
-
2417
- focusGlobalNode: function(){
2418
- this.blurNode(this.globalNode);
2419
- this.focusNode(this.globalNode);
2420
- },
2421
-
2422
- setActiveNode: function(el){
2423
- if(!el || !el.isValid())
2424
- return;
2425
-
2426
- if(this.activeNode){
2427
- if(this.activeNode.compareTo(el)){
2428
- return;
2429
- }
2430
- }
2431
- if(this.isEnabled()){
2432
- this.blurNode(this.activeNode);
2433
- this.activeNode = el;
2434
- this.focusNode(this.activeNode);
2435
- }
2436
- },
2437
-
2438
- focusNode: function(el){
2439
- if(el && el.focus){
2440
- el.focus();
2441
- if(el.getNode && document.activeElement != el.getNode()){
2442
- this.setActiveNode(new scheduler.$keyboardNavigation.DataArea());
2443
- }
2444
- }
2445
- },
2446
- blurNode: function(el){
2447
- if(el && el.blur){
2448
- el.blur();
2449
- }
2450
- },
2451
-
2452
- getInlineEditor: function(id){
2453
- var editor = scheduler.$container.querySelector(".dhx_cal_editor[event_id='"+id+"'] textarea");
2454
- if(editor && editor.offsetWidth){
2455
- // if exists and visible
2456
- return editor;
2457
- }
2458
- return null;
2459
- },
2460
-
2461
- keyDownHandler: function (e) {
2462
-
2463
- if(e.defaultPrevented){
2464
- return;
2465
- }
2466
-
2467
- var activeElement = this.getActiveNode();
2468
-
2469
- if(scheduler.$keyboardNavigation.isModal() &&
2470
- !(activeElement && activeElement.container && scheduler._locate_css({target:activeElement.container}, "dhx_minical_popup", false)))
2471
- return;
2472
-
2473
- if(scheduler.getState().editor_id && this.getInlineEditor(scheduler.getState().editor_id))
2474
- return;
2475
-
2476
- if (!this.isEnabled())
2477
- return;
2478
-
2479
- e = e || window.event;
2480
-
2481
- var schedulerNode = this.globalNode;
2482
-
2483
- var command = scheduler.$keyboardNavigation.shortcuts.getCommandFromEvent(e);
2484
-
2485
- if(!activeElement){
2486
- this.setDefaultNode();
2487
- }else if(activeElement.findHandler(command)){
2488
- activeElement.doAction(command, e);
2489
- }else if(schedulerNode.findHandler(command)){
2490
- schedulerNode.doAction(command, e);
2491
- }
2492
-
2493
- },
2494
-
2495
- _timeout: null,
2496
- delay: function(callback, delay){
2497
-
2498
- clearTimeout(this._timeout);
2499
- this._timeout = setTimeout(callback, delay || 1);
2500
-
2501
- }
2502
- };
2503
- //Initial idea and implementation by Steve MC
2504
- scheduler._temp_key_scope = function (){
2505
-
2506
- scheduler.config.key_nav = true;
2507
-
2508
- scheduler.$keyboardNavigation._pasteDate = null; // used for copy and paste operations
2509
- scheduler.$keyboardNavigation._pasteSection = null; // used for copy and paste operations
2510
- var isCopy = null;
2511
-
2512
- var pos = {};
2513
-
2514
- if(!document.body){
2515
- scheduler.event(window, "load", function(){
2516
- scheduler.event(document.body, "mousemove", trackMousePosition);
2517
- });
2518
- }else{
2519
- scheduler.event(document.body, "mousemove", trackMousePosition);
2520
- }
2521
-
2522
- function trackMousePosition(event){
2523
- event = event || window.event;
2524
- pos.x = event.clientX;
2525
- pos.y = event.clientY;
2526
- }
2527
- function currentTarget(){
2528
-
2529
- var mousePointer = false;
2530
- var keyNavPointer = false;
2531
-
2532
- var target = document.elementFromPoint(pos.x, pos.y);
2533
- while(target && target != scheduler._obj){
2534
- target = target.parentNode;
2535
- }
2536
- mousePointer = !!(target == scheduler._obj);
2537
-
2538
- keyNavPointer = scheduler.$keyboardNavigation.dispatcher.isEnabled();
2539
-
2540
- return mousePointer || keyNavPointer;
2541
- }
2542
-
2543
- scheduler.attachEvent("onMouseMove", function(id,e){
2544
- var state = scheduler.getState();
2545
-
2546
- // make sure scheduler is fully initialized before calling scheduler.getActionData
2547
- if(!(state.mode && state.min_date)){
2548
- return;
2549
- }
2550
- var position = scheduler.getActionData(e);
2551
- scheduler.$keyboardNavigation._pasteDate = position.date;
2552
- scheduler.$keyboardNavigation._pasteSection = position.section;
2553
- });
2554
-
2555
- function clear_event_after(ev){
2556
- delete ev.rec_type; delete ev.rec_pattern;
2557
- delete ev.event_pid; delete ev.event_length;
2558
- }
2559
-
2560
- function copyEvent(ev){
2561
- return scheduler._lame_copy({}, ev);
2562
- }
2563
-
2564
- scheduler._make_pasted_event = function(ev){
2565
- var date = scheduler.$keyboardNavigation._pasteDate;
2566
- var section = scheduler.$keyboardNavigation._pasteSection;
2567
-
2568
- var event_duration = ev.end_date-ev.start_date;
2569
-
2570
- var copy = copyEvent(ev);
2571
- clear_event_after(copy);
2572
- copy.start_date = new Date(date);
2573
- copy.end_date = new Date(copy.start_date.valueOf() + event_duration);
2574
-
2575
- if(section){
2576
- var property = scheduler._get_section_property();
2577
-
2578
- if(scheduler.config.multisection)
2579
- copy[property] = ev[property]; // save initial set of resources for multisection view
2580
- else
2581
- copy[property] = section;
2582
- }
2583
- return copy;
2584
- };
2585
- scheduler._do_paste = function(is_copy, modified_ev, original_ev){
2586
- if(scheduler.callEvent("onBeforeEventPasted", [is_copy, modified_ev, original_ev]) === false){
2587
- return;
2588
- }
2589
- scheduler.addEvent(modified_ev);
2590
- scheduler.callEvent("onEventPasted", [is_copy, modified_ev, original_ev]);
2591
- };
2592
-
2593
- scheduler._is_key_nav_active = function(){
2594
- if(this._is_initialized() && !this._is_lightbox_open() && this.config.key_nav){
2595
- return true;
2596
- }
2597
- return false;
2598
- };
2599
-
2600
- function getSelectedEvent(){
2601
- var node = scheduler.$keyboardNavigation.dispatcher.getActiveNode();
2602
- if(node && node.eventId) return node.eventId;
2603
- return scheduler._select_id;
2604
- }
2605
-
2606
- scheduler.event(document, "keydown", function(e){
2607
- // compatibility fix - scheduler focus on ctrl+v on mouse hover
2608
- if(((e.ctrlKey || e.metaKey) && e.keyCode == 86) && scheduler._buffer_event && !scheduler.$keyboardNavigation.dispatcher.isEnabled()) {
2609
- scheduler.$keyboardNavigation.dispatcher.isActive = currentTarget();
2610
- }
2611
- });
2612
-
2613
- scheduler._key_nav_copy_paste = function(e){
2614
- if(!scheduler._is_key_nav_active()) return true;
2615
-
2616
- e=e||event;
2617
-
2618
- if (e.keyCode == 37 || e.keyCode == 39) { // Left, Right arrows
2619
- e.cancelBubble = true;
2620
-
2621
- var next = scheduler.date.add(scheduler._date,(e.keyCode == 37 ? -1 : 1 ),scheduler._mode);
2622
- scheduler.setCurrentView(next);
2623
- return true;
2624
- }
2625
-
2626
- var select_id = getSelectedEvent();
2627
- if ((e.ctrlKey || e.metaKey) && e.keyCode == 67) { // CTRL+C
2628
- if (select_id) {
2629
- scheduler._buffer_event = copyEvent(scheduler.getEvent(select_id));
2630
- isCopy = true;
2631
- scheduler.callEvent("onEventCopied", [scheduler.getEvent(select_id)]);
2632
- }
2633
- return true;
2634
- }
2635
- if ((e.ctrlKey || e.metaKey) && e.keyCode == 88) { // CTRL+X
2636
- if (select_id) {
2637
- isCopy = false;
2638
- var ev = scheduler._buffer_event = copyEvent(scheduler.getEvent(select_id));
2639
-
2640
- scheduler.updateEvent(ev.id);
2641
- scheduler.callEvent("onEventCut", [ev]);
2642
- }
2643
- }
2644
-
2645
- if ((e.ctrlKey || e.metaKey) && e.keyCode == 86 && currentTarget(e)) { // CTRL+V
2646
- var ev = scheduler._buffer_event ? scheduler.getEvent(scheduler._buffer_event.id) : scheduler._buffer_event;
2647
- ev = ev || scheduler._buffer_event;
2648
-
2649
- if (ev) {
2650
- var new_ev = scheduler._make_pasted_event(ev);
2651
- if (isCopy) {
2652
- new_ev.id = scheduler.uid();
2653
- scheduler._do_paste(isCopy, new_ev, ev);
2654
- }
2655
- else { // cut operation
2656
- var res = scheduler.callEvent("onBeforeEventChanged",[new_ev, e, false, ev]);
2657
- if (res) {
2658
- scheduler._do_paste(isCopy, new_ev, ev);
2659
- isCopy = true; // switch to copy after first paste operation
2660
- }
2661
- }
2662
-
2663
- }
2664
- return true;
2665
- }
2666
- };
2667
- };
2668
- scheduler._temp_key_scope();
2669
-
2670
-
2671
- (function(){
2672
- scheduler.$keyboardNavigation.attachSchedulerHandlers = function(){
2673
- var dispatcher = scheduler.$keyboardNavigation.dispatcher;
2674
-
2675
- var keyDownHandler = function(e){
2676
- if(!scheduler.config.key_nav) return;
2677
-
2678
- return dispatcher.keyDownHandler(e);
2679
- };
2680
-
2681
- var focusHandler = function () {
2682
- dispatcher.keepScrollPosition(function () {
2683
- dispatcher.focusGlobalNode();
2684
- });
2685
- };
2686
-
2687
- var waitCall;
2688
- scheduler.attachEvent("onDataRender", function(){
2689
- if(!scheduler.config.key_nav) return;
2690
- if(!(dispatcher.isEnabled() && !scheduler.getState().editor_id)) return;
2691
-
2692
- clearTimeout(waitCall);
2693
- waitCall = setTimeout(function(){
2694
- if(!dispatcher.isEnabled())
2695
- dispatcher.enable();
2696
- reFocusActiveNode();
2697
- });
2698
- });
2699
-
2700
- var reFocusActiveNode = function(){
2701
- if(!dispatcher.isEnabled())
2702
- return;
2703
-
2704
- var activeNode = dispatcher.getActiveNode();
2705
- if(!activeNode)
2706
- return;
2707
-
2708
- if(!activeNode.isValid()){
2709
- activeNode = activeNode.fallback();
2710
- }
2711
-
2712
- if(!activeNode || activeNode instanceof scheduler.$keyboardNavigation.MinicalButton || activeNode instanceof scheduler.$keyboardNavigation.MinicalCell)
2713
- return;
2714
-
2715
- dispatcher.keepScrollPosition(function () {
2716
- activeNode.focus(true);
2717
- });
2718
- };
2719
-
2720
- scheduler.attachEvent("onSchedulerReady", function(){
2721
- var container = scheduler.$container;
2722
- scheduler.eventRemove(document, "keydown", keyDownHandler);
2723
- scheduler.eventRemove(container, "mousedown", mousedownHandler);
2724
- scheduler.eventRemove(container, "focus", focusHandler);
2725
-
2726
-
2727
- if(scheduler.config.key_nav){
2728
-
2729
- scheduler.event(document, "keydown", keyDownHandler);
2730
- scheduler.event(container, "mousedown", mousedownHandler);
2731
- scheduler.event(container, "focus", focusHandler);
2732
-
2733
- container.setAttribute("tabindex", "0");
2734
-
2735
- }else{
2736
- container.removeAttribute("tabindex");
2737
- }
2738
- });
2739
-
2740
- function mousedownHandler(e){
2741
- if(!scheduler.config.key_nav) return true;
2742
-
2743
-
2744
- var dataAreaClick = scheduler.$keyboardNavigation.isChildOf(e.target || e.srcElement, scheduler.$container.querySelector(".dhx_cal_data"));
2745
-
2746
-
2747
- var pos = scheduler.getActionData(e);
2748
-
2749
- var focusNode;
2750
- if(scheduler._locate_event(e.target || e.srcElement)){
2751
- focusNode = new scheduler.$keyboardNavigation.Event(scheduler._locate_event(e.target || e.srcElement));
2752
- }else if(dataAreaClick){
2753
- focusNode = new scheduler.$keyboardNavigation.TimeSlot();
2754
- if(pos.date && dataAreaClick){
2755
- focusNode = focusNode.nextSlot(new scheduler.$keyboardNavigation.TimeSlot(pos.date, null, pos.section));
2756
- }
2757
- }
2758
-
2759
- if(focusNode) {
2760
- if (!dispatcher.isEnabled()) {
2761
- dispatcher.activeNode = focusNode;
2762
-
2763
- } else {
2764
- if (pos.date && dataAreaClick) {
2765
- dispatcher.delay(function () {
2766
- dispatcher.setActiveNode(focusNode);
2767
- });
2768
- }
2769
- }
2770
- }
2771
- }
2772
-
2773
- function focusEvent(evNode){
2774
- if(!scheduler.config.key_nav) return;
2775
- if(!dispatcher.isEnabled()) return;
2776
-
2777
-
2778
- var prevState = evNode;
2779
- var focusNode = new scheduler.$keyboardNavigation.Event(prevState.eventId);
2780
- if(!focusNode.isValid()){
2781
- var lastStart = focusNode.start || prevState.start;
2782
- var lastEnd = focusNode.end || prevState.end;
2783
- var lastSection = focusNode.section || prevState.section;
2784
-
2785
- focusNode = new scheduler.$keyboardNavigation.TimeSlot(lastStart, lastEnd, lastSection);
2786
- if(!focusNode.isValid()){
2787
- focusNode = new scheduler.$keyboardNavigation.TimeSlot();
2788
- }
2789
- }
2790
-
2791
- dispatcher.setActiveNode(focusNode);
2792
- var node = dispatcher.getActiveNode();
2793
- if(node && node.getNode && document.activeElement != node.getNode()){
2794
- dispatcher.focusNode(dispatcher.getActiveNode());
2795
- }
2796
- }
2797
-
2798
-
2799
- var updateEvent = scheduler.updateEvent;
2800
- scheduler.updateEvent = function(id){
2801
- var res = updateEvent.apply(this, arguments);
2802
- if(scheduler.config.key_nav && dispatcher.isEnabled()){
2803
- if(scheduler.getState().select_id == id){
2804
- var element = new scheduler.$keyboardNavigation.Event(id);
2805
-
2806
- if(!scheduler.getState().lightbox_id){
2807
- focusEvent(element);
2808
- }
2809
- }
2810
- }
2811
- return res;
2812
- };
2813
-
2814
- scheduler.attachEvent("onEventDeleted", function(id) {
2815
- if(!scheduler.config.key_nav) return true;
2816
- if(dispatcher.isEnabled()){
2817
- var activeNode = dispatcher.getActiveNode();
2818
- if(activeNode.eventId == id){
2819
- dispatcher.setActiveNode(new scheduler.$keyboardNavigation.TimeSlot());
2820
- }
2821
- }
2822
- return true;
2823
- });
2824
-
2825
- scheduler.attachEvent("onClearAll", function(){
2826
- if(!scheduler.config.key_nav) return true;
2827
- if(dispatcher.isEnabled()){
2828
- if(dispatcher.getActiveNode() instanceof scheduler.$keyboardNavigation.Event){
2829
- dispatcher.setActiveNode(new scheduler.$keyboardNavigation.TimeSlot());
2830
- }
2831
- }
2832
- });
2833
-
2834
- };
2835
- scheduler.$keyboardNavigation._minicalendars = [];
2836
-
2837
- scheduler.$keyboardNavigation.isMinical = function(node){
2838
- var minicalendars = scheduler.$keyboardNavigation._minicalendars;
2839
- for(var i = 0; i < minicalendars.length; i++){
2840
- if(this.isChildOf(node, minicalendars[i]))
2841
- return true;
2842
- }
2843
- return false;
2844
- };
2845
-
2846
- scheduler.$keyboardNavigation.isChildOf = function(child, parent){
2847
- while(child && child !== parent){
2848
- child = child.parentNode;
2849
- }
2850
-
2851
- return !!(child === parent);
2852
- };
2853
-
2854
- scheduler.$keyboardNavigation.patchMinicalendar = function(){
2855
- var dispatcher = scheduler.$keyboardNavigation.dispatcher;
2856
-
2857
- function focusMinical(e){
2858
- var target = e.target;
2859
-
2860
- dispatcher.enable();
2861
- dispatcher.setActiveNode(new scheduler.$keyboardNavigation.MinicalButton(target, 0));
2862
- }
2863
-
2864
- function minicalClick(e){
2865
- var target = e.target || e.srcElement;
2866
-
2867
- var prev = scheduler._locate_css(e, "dhx_cal_prev_button", false);
2868
- var next = scheduler._locate_css(e, "dhx_cal_next_button", false);
2869
- var cell = scheduler._locate_css(e, "dhx_year_body", false);
2870
-
2871
- var rowIndex = 0;
2872
- var cellIndex = 0;
2873
- if(cell){
2874
- var tr;
2875
- var td;
2876
- var current = target;
2877
- while(current && current.tagName.toLowerCase() != "td"){
2878
- current = current.parentNode;
2879
- }
2880
- if(current){
2881
- td = current;
2882
- tr = td.parentNode;
2883
- }
2884
-
2885
- if(tr && td){
2886
- var rows = tr.parentNode.querySelectorAll("tr");
2887
- for(var i = 0; i < rows.length; i++){
2888
- if(rows[i] == tr){
2889
- rowIndex = i;
2890
- break;
2891
- }
2892
- }
2893
- var cells = tr.querySelectorAll("td");
2894
- for(var i = 0; i < cells.length; i++){
2895
- if(cells[i] == td){
2896
- cellIndex = i;
2897
- break;
2898
- }
2899
- }
2900
- }
2901
- }
2902
- var root = e.currentTarget;
2903
- dispatcher.delay(function(){
2904
- if(prev || next || cell){
2905
-
2906
- var element;
2907
- if(prev){
2908
- element = new scheduler.$keyboardNavigation.MinicalButton(root, 0);
2909
- dispatcher.setActiveNode(new scheduler.$keyboardNavigation.MinicalButton(root, 0));
2910
- }else if(next){
2911
- element = new scheduler.$keyboardNavigation.MinicalButton(root, 1);
2912
- }else if(cell){
2913
- element = new scheduler.$keyboardNavigation.MinicalCell(root, rowIndex, cellIndex);
2914
-
2915
- }
2916
-
2917
- if(element){
2918
-
2919
- dispatcher.enable();
2920
- if(element.isValid()){
2921
- dispatcher.activeNode = null;
2922
- dispatcher.setActiveNode(element);
2923
- }
2924
-
2925
- }
2926
- }
2927
-
2928
- });
2929
- }
2930
-
2931
- if(scheduler.renderCalendar){
2932
- var renderMinical = scheduler.renderCalendar;
2933
- scheduler.renderCalendar = function(){
2934
- var cal = renderMinical.apply(this, arguments);
2935
- var minicalendars = scheduler.$keyboardNavigation._minicalendars;
2936
-
2937
- scheduler.eventRemove(cal, "click", minicalClick);
2938
- scheduler.event(cal, "click", minicalClick);
2939
-
2940
- scheduler.eventRemove(cal, "focus", focusMinical);
2941
- scheduler.event(cal, "focus", focusMinical);
2942
-
2943
- var added = false;
2944
- for(var i = 0; i < minicalendars.length; i++){
2945
- if(minicalendars[i] == cal){
2946
- added = true;
2947
- break;
2948
- }
2949
- }
2950
- if(!added)
2951
- minicalendars.push(cal);
2952
-
2953
- if(dispatcher.isEnabled()){
2954
- var node = dispatcher.getActiveNode();
2955
- if(node && node.container == cal){
2956
- dispatcher.focusNode(node);
2957
- }else{
2958
- cal.setAttribute("tabindex", "0");
2959
- }
2960
- }else{
2961
- cal.setAttribute("tabindex", "0");
2962
- }
2963
- return cal;
2964
- };
2965
- }
2966
-
2967
- if(scheduler.destroyCalendar){
2968
- var destroyMinical = scheduler.destroyCalendar;
2969
- scheduler.destroyCalendar = function(cal, force){
2970
- cal = cal || (scheduler._def_count ? scheduler._def_count.firstChild : null);
2971
- var res = destroyMinical.apply(this, arguments);
2972
-
2973
- if(!cal || !cal.parentNode){
2974
- var minicalendars = scheduler.$keyboardNavigation._minicalendars;
2975
- for(var i = 0; i < minicalendars.length; i++){
2976
- if(minicalendars[i] == cal){
2977
- scheduler.eventRemove(minicalendars[i], "focus", focusMinical);
2978
- minicalendars.splice(i, 1);
2979
- i--;
2980
- }
2981
- }
2982
- }
2983
-
2984
- return res;
2985
- };
2986
- }
2987
- };
2988
-
2989
-
2990
- var dispatcher = scheduler.$keyboardNavigation.dispatcher;
2991
-
2992
- scheduler.$keyboardNavigation.attachSchedulerHandlers();
2993
-
2994
- if(scheduler.renderCalendar){
2995
- // if minical ext loaded before key nav ext - patch it now
2996
- scheduler.$keyboardNavigation.patchMinicalendar();
2997
- }else{
2998
- // otherwise - wait until everything is loaded and try again
2999
- var attachOnce = scheduler.attachEvent("onSchedulerReady", function(){
3000
- scheduler.detachEvent(attachOnce);
3001
- scheduler.$keyboardNavigation.patchMinicalendar();
3002
- });
3003
- }
3004
-
3005
-
3006
-
3007
- function isSchedulerSelected(){
3008
- if(!scheduler.config.key_nav) return;
3009
-
3010
- var enable;
3011
- var focusElement = document.activeElement;
3012
- // halt key nav when focus is outside scheduler or in quick info popup
3013
- if(!focusElement || scheduler._locate_css(focusElement, "dhx_cal_quick_info", false)){
3014
- enable = false;
3015
- }else{
3016
- enable = scheduler.$keyboardNavigation.isChildOf(focusElement, scheduler.$container) || scheduler.$keyboardNavigation.isMinical(focusElement);
3017
- }
3018
-
3019
- return enable;
3020
- }
3021
-
3022
-
3023
-
3024
- function changeState(enable){
3025
- if(enable && !dispatcher.isEnabled()){
3026
- dispatcher.enable();
3027
- }else if(!enable && dispatcher.isEnabled()){
3028
- dispatcher.disable();
3029
- }
3030
- }
3031
-
3032
- setInterval(function(){
3033
- if(!scheduler.$container || !scheduler.$keyboardNavigation.isChildOf(scheduler.$container, document.body)){
3034
- return;
3035
- }
3036
-
3037
- var enable = isSchedulerSelected();
3038
-
3039
- if(enable){
3040
- changeState(enable);
3041
- }else if(!enable && dispatcher.isEnabled()){
3042
- setTimeout(function(){
3043
- // doublecheck in case checking is done in handler before focus element is repainted
3044
- if(scheduler.config.key_nav){
3045
- changeState(isSchedulerSelected());
3046
- }else{
3047
- scheduler.$container.removeAttribute("tabindex");
3048
- }
3049
-
3050
- }, 100);
3051
- }
3052
- }, 500);
3053
-
3054
- })();
3055
-
3056
- }
3057
-
3058
- if(window.Scheduler){
3059
- window.Scheduler.plugin(setupKeyNav);
3060
- }else{
3061
- setupKeyNav(window.scheduler);
3062
- }
3063
-
3064
-
3065
- })();