@coderevivehq/selectize 0.15.3

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 (400) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +146 -0
  3. package/dist/css/selectize.bootstrap2.css +20 -0
  4. package/dist/css/selectize.bootstrap3.css +20 -0
  5. package/dist/css/selectize.bootstrap4.css +20 -0
  6. package/dist/css/selectize.bootstrap5.css +20 -0
  7. package/dist/css/selectize.css +20 -0
  8. package/dist/css/selectize.default.css +20 -0
  9. package/dist/js/selectize.js +3497 -0
  10. package/dist/js/selectize.min.js +32 -0
  11. package/dist/less/plugins/auto_position.less +15 -0
  12. package/dist/less/plugins/clear_button.less +29 -0
  13. package/dist/less/plugins/drag_drop.less +16 -0
  14. package/dist/less/plugins/dropdown_header.less +21 -0
  15. package/dist/less/plugins/optgroup_columns.less +17 -0
  16. package/dist/less/plugins/remove_button.less +43 -0
  17. package/dist/less/selectize.bootstrap2.less +147 -0
  18. package/dist/less/selectize.bootstrap3.less +134 -0
  19. package/dist/less/selectize.default.less +68 -0
  20. package/dist/less/selectize.less +301 -0
  21. package/dist/lib/bootstrap-sass/_alerts.scss +73 -0
  22. package/dist/lib/bootstrap-sass/_badges.scss +68 -0
  23. package/dist/lib/bootstrap-sass/_breadcrumbs.scss +28 -0
  24. package/dist/lib/bootstrap-sass/_button-groups.scss +244 -0
  25. package/dist/lib/bootstrap-sass/_buttons.scss +168 -0
  26. package/dist/lib/bootstrap-sass/_carousel.scss +272 -0
  27. package/dist/lib/bootstrap-sass/_close.scss +37 -0
  28. package/dist/lib/bootstrap-sass/_code.scss +70 -0
  29. package/dist/lib/bootstrap-sass/_component-animations.scss +38 -0
  30. package/dist/lib/bootstrap-sass/_dropdowns.scss +213 -0
  31. package/dist/lib/bootstrap-sass/_forms.scss +608 -0
  32. package/dist/lib/bootstrap-sass/_glyphicons.scss +307 -0
  33. package/dist/lib/bootstrap-sass/_grid.scss +94 -0
  34. package/dist/lib/bootstrap-sass/_input-groups.scss +171 -0
  35. package/dist/lib/bootstrap-sass/_jumbotron.scss +55 -0
  36. package/dist/lib/bootstrap-sass/_labels.scss +66 -0
  37. package/dist/lib/bootstrap-sass/_list-group.scss +128 -0
  38. package/dist/lib/bootstrap-sass/_media.scss +66 -0
  39. package/dist/lib/bootstrap-sass/_mixins.scss +40 -0
  40. package/dist/lib/bootstrap-sass/_modals.scss +150 -0
  41. package/dist/lib/bootstrap-sass/_navbar.scss +657 -0
  42. package/dist/lib/bootstrap-sass/_navs.scss +242 -0
  43. package/dist/lib/bootstrap-sass/_normalize.scss +427 -0
  44. package/dist/lib/bootstrap-sass/_pager.scss +54 -0
  45. package/dist/lib/bootstrap-sass/_pagination.scss +86 -0
  46. package/dist/lib/bootstrap-sass/_panels.scss +271 -0
  47. package/dist/lib/bootstrap-sass/_popovers.scss +126 -0
  48. package/dist/lib/bootstrap-sass/_print.scss +99 -0
  49. package/dist/lib/bootstrap-sass/_progress-bars.scss +87 -0
  50. package/dist/lib/bootstrap-sass/_responsive-embed.scss +35 -0
  51. package/dist/lib/bootstrap-sass/_responsive-utilities.scss +179 -0
  52. package/dist/lib/bootstrap-sass/_scaffolding.scss +161 -0
  53. package/dist/lib/bootstrap-sass/_tables.scss +234 -0
  54. package/dist/lib/bootstrap-sass/_theme.scss +295 -0
  55. package/dist/lib/bootstrap-sass/_thumbnails.scss +38 -0
  56. package/dist/lib/bootstrap-sass/_tooltip.scss +112 -0
  57. package/dist/lib/bootstrap-sass/_type.scss +299 -0
  58. package/dist/lib/bootstrap-sass/_utilities.scss +55 -0
  59. package/dist/lib/bootstrap-sass/_variables.scss +875 -0
  60. package/dist/lib/bootstrap-sass/_wells.scss +29 -0
  61. package/dist/lib/bootstrap-sass/mixins/_alerts.scss +15 -0
  62. package/dist/lib/bootstrap-sass/mixins/_background-variant.scss +12 -0
  63. package/dist/lib/bootstrap-sass/mixins/_border-radius.scss +18 -0
  64. package/dist/lib/bootstrap-sass/mixins/_buttons.scss +61 -0
  65. package/dist/lib/bootstrap-sass/mixins/_center-block.scss +7 -0
  66. package/dist/lib/bootstrap-sass/mixins/_clearfix.scss +22 -0
  67. package/dist/lib/bootstrap-sass/mixins/_forms.scss +88 -0
  68. package/dist/lib/bootstrap-sass/mixins/_gradients.scss +56 -0
  69. package/dist/lib/bootstrap-sass/mixins/_grid-framework.scss +82 -0
  70. package/dist/lib/bootstrap-sass/mixins/_grid.scss +123 -0
  71. package/dist/lib/bootstrap-sass/mixins/_hide-text.scss +21 -0
  72. package/dist/lib/bootstrap-sass/mixins/_image.scss +28 -0
  73. package/dist/lib/bootstrap-sass/mixins/_labels.scss +12 -0
  74. package/dist/lib/bootstrap-sass/mixins/_list-group.scss +32 -0
  75. package/dist/lib/bootstrap-sass/mixins/_nav-divider.scss +11 -0
  76. package/dist/lib/bootstrap-sass/mixins/_nav-vertical-align.scss +10 -0
  77. package/dist/lib/bootstrap-sass/mixins/_opacity.scss +7 -0
  78. package/dist/lib/bootstrap-sass/mixins/_pagination.scss +24 -0
  79. package/dist/lib/bootstrap-sass/mixins/_panels.scss +24 -0
  80. package/dist/lib/bootstrap-sass/mixins/_progress-bar.scss +10 -0
  81. package/dist/lib/bootstrap-sass/mixins/_reset-filter.scss +8 -0
  82. package/dist/lib/bootstrap-sass/mixins/_reset-text.scss +18 -0
  83. package/dist/lib/bootstrap-sass/mixins/_resize.scss +6 -0
  84. package/dist/lib/bootstrap-sass/mixins/_responsive-visibility.scss +17 -0
  85. package/dist/lib/bootstrap-sass/mixins/_size.scss +10 -0
  86. package/dist/lib/bootstrap-sass/mixins/_tab-focus.scss +9 -0
  87. package/dist/lib/bootstrap-sass/mixins/_table-row.scss +28 -0
  88. package/dist/lib/bootstrap-sass/mixins/_text-emphasis.scss +12 -0
  89. package/dist/lib/bootstrap-sass/mixins/_text-overflow.scss +8 -0
  90. package/dist/lib/bootstrap-sass/mixins/_vendor-prefixes.scss +222 -0
  91. package/dist/lib/bootstrap2/accordion.less +34 -0
  92. package/dist/lib/bootstrap2/alerts.less +79 -0
  93. package/dist/lib/bootstrap2/bootstrap.less +63 -0
  94. package/dist/lib/bootstrap2/breadcrumbs.less +24 -0
  95. package/dist/lib/bootstrap2/button-groups.less +229 -0
  96. package/dist/lib/bootstrap2/buttons.less +228 -0
  97. package/dist/lib/bootstrap2/carousel.less +158 -0
  98. package/dist/lib/bootstrap2/close.less +32 -0
  99. package/dist/lib/bootstrap2/code.less +61 -0
  100. package/dist/lib/bootstrap2/component-animations.less +22 -0
  101. package/dist/lib/bootstrap2/dropdowns.less +248 -0
  102. package/dist/lib/bootstrap2/forms.less +690 -0
  103. package/dist/lib/bootstrap2/grid.less +21 -0
  104. package/dist/lib/bootstrap2/hero-unit.less +25 -0
  105. package/dist/lib/bootstrap2/labels-badges.less +84 -0
  106. package/dist/lib/bootstrap2/layouts.less +16 -0
  107. package/dist/lib/bootstrap2/media.less +55 -0
  108. package/dist/lib/bootstrap2/mixins.less +702 -0
  109. package/dist/lib/bootstrap2/modals.less +95 -0
  110. package/dist/lib/bootstrap2/navbar.less +497 -0
  111. package/dist/lib/bootstrap2/navs.less +409 -0
  112. package/dist/lib/bootstrap2/pager.less +43 -0
  113. package/dist/lib/bootstrap2/pagination.less +123 -0
  114. package/dist/lib/bootstrap2/popovers.less +133 -0
  115. package/dist/lib/bootstrap2/progress-bars.less +122 -0
  116. package/dist/lib/bootstrap2/reset.less +216 -0
  117. package/dist/lib/bootstrap2/responsive-1200px-min.less +28 -0
  118. package/dist/lib/bootstrap2/responsive-767px-max.less +193 -0
  119. package/dist/lib/bootstrap2/responsive-768px-979px.less +19 -0
  120. package/dist/lib/bootstrap2/responsive-navbar.less +189 -0
  121. package/dist/lib/bootstrap2/responsive-utilities.less +59 -0
  122. package/dist/lib/bootstrap2/responsive.less +48 -0
  123. package/dist/lib/bootstrap2/scaffolding.less +53 -0
  124. package/dist/lib/bootstrap2/sprites.less +197 -0
  125. package/dist/lib/bootstrap2/tables.less +244 -0
  126. package/dist/lib/bootstrap2/tests/buttons.html +139 -0
  127. package/dist/lib/bootstrap2/tests/css-tests.css +150 -0
  128. package/dist/lib/bootstrap2/tests/css-tests.html +1399 -0
  129. package/dist/lib/bootstrap2/tests/forms-responsive.html +71 -0
  130. package/dist/lib/bootstrap2/tests/forms.html +179 -0
  131. package/dist/lib/bootstrap2/tests/navbar-fixed-top.html +104 -0
  132. package/dist/lib/bootstrap2/tests/navbar-static-top.html +107 -0
  133. package/dist/lib/bootstrap2/tests/navbar.html +107 -0
  134. package/dist/lib/bootstrap2/thumbnails.less +53 -0
  135. package/dist/lib/bootstrap2/tooltip.less +70 -0
  136. package/dist/lib/bootstrap2/type.less +247 -0
  137. package/dist/lib/bootstrap2/utilities.less +30 -0
  138. package/dist/lib/bootstrap2/variables.less +301 -0
  139. package/dist/lib/bootstrap2/wells.less +29 -0
  140. package/dist/lib/bootstrap3/alerts.less +73 -0
  141. package/dist/lib/bootstrap3/badges.less +66 -0
  142. package/dist/lib/bootstrap3/bootstrap.less +56 -0
  143. package/dist/lib/bootstrap3/breadcrumbs.less +26 -0
  144. package/dist/lib/bootstrap3/button-groups.less +246 -0
  145. package/dist/lib/bootstrap3/buttons.less +168 -0
  146. package/dist/lib/bootstrap3/carousel.less +273 -0
  147. package/dist/lib/bootstrap3/close.less +37 -0
  148. package/dist/lib/bootstrap3/code.less +69 -0
  149. package/dist/lib/bootstrap3/component-animations.less +36 -0
  150. package/dist/lib/bootstrap3/dropdowns.less +213 -0
  151. package/dist/lib/bootstrap3/forms.less +605 -0
  152. package/dist/lib/bootstrap3/glyphicons.less +307 -0
  153. package/dist/lib/bootstrap3/grid.less +94 -0
  154. package/dist/lib/bootstrap3/input-groups.less +173 -0
  155. package/dist/lib/bootstrap3/jumbotron.less +54 -0
  156. package/dist/lib/bootstrap3/labels.less +64 -0
  157. package/dist/lib/bootstrap3/list-group.less +130 -0
  158. package/dist/lib/bootstrap3/media.less +66 -0
  159. package/dist/lib/bootstrap3/mixins/alerts.less +15 -0
  160. package/dist/lib/bootstrap3/mixins/background-variant.less +9 -0
  161. package/dist/lib/bootstrap3/mixins/border-radius.less +18 -0
  162. package/dist/lib/bootstrap3/mixins/buttons.less +61 -0
  163. package/dist/lib/bootstrap3/mixins/center-block.less +7 -0
  164. package/dist/lib/bootstrap3/mixins/clearfix.less +22 -0
  165. package/dist/lib/bootstrap3/mixins/forms.less +85 -0
  166. package/dist/lib/bootstrap3/mixins/gradients.less +59 -0
  167. package/dist/lib/bootstrap3/mixins/grid-framework.less +91 -0
  168. package/dist/lib/bootstrap3/mixins/grid.less +122 -0
  169. package/dist/lib/bootstrap3/mixins/hide-text.less +23 -0
  170. package/dist/lib/bootstrap3/mixins/image.less +30 -0
  171. package/dist/lib/bootstrap3/mixins/labels.less +12 -0
  172. package/dist/lib/bootstrap3/mixins/list-group.less +30 -0
  173. package/dist/lib/bootstrap3/mixins/nav-divider.less +10 -0
  174. package/dist/lib/bootstrap3/mixins/nav-vertical-align.less +9 -0
  175. package/dist/lib/bootstrap3/mixins/opacity.less +7 -0
  176. package/dist/lib/bootstrap3/mixins/pagination.less +24 -0
  177. package/dist/lib/bootstrap3/mixins/panels.less +24 -0
  178. package/dist/lib/bootstrap3/mixins/progress-bar.less +10 -0
  179. package/dist/lib/bootstrap3/mixins/reset-filter.less +8 -0
  180. package/dist/lib/bootstrap3/mixins/reset-text.less +18 -0
  181. package/dist/lib/bootstrap3/mixins/resize.less +6 -0
  182. package/dist/lib/bootstrap3/mixins/responsive-visibility.less +13 -0
  183. package/dist/lib/bootstrap3/mixins/size.less +10 -0
  184. package/dist/lib/bootstrap3/mixins/tab-focus.less +9 -0
  185. package/dist/lib/bootstrap3/mixins/table-row.less +28 -0
  186. package/dist/lib/bootstrap3/mixins/text-emphasis.less +9 -0
  187. package/dist/lib/bootstrap3/mixins/text-overflow.less +8 -0
  188. package/dist/lib/bootstrap3/mixins/vendor-prefixes.less +229 -0
  189. package/dist/lib/bootstrap3/mixins.less +40 -0
  190. package/dist/lib/bootstrap3/modals.less +150 -0
  191. package/dist/lib/bootstrap3/navbar.less +656 -0
  192. package/dist/lib/bootstrap3/navs.less +244 -0
  193. package/dist/lib/bootstrap3/normalize.less +429 -0
  194. package/dist/lib/bootstrap3/pager.less +54 -0
  195. package/dist/lib/bootstrap3/pagination.less +86 -0
  196. package/dist/lib/bootstrap3/panels.less +273 -0
  197. package/dist/lib/bootstrap3/popovers.less +126 -0
  198. package/dist/lib/bootstrap3/print.less +101 -0
  199. package/dist/lib/bootstrap3/progress-bars.less +89 -0
  200. package/dist/lib/bootstrap3/responsive-embed.less +35 -0
  201. package/dist/lib/bootstrap3/responsive-utilities.less +196 -0
  202. package/dist/lib/bootstrap3/scaffolding.less +161 -0
  203. package/dist/lib/bootstrap3/tables.less +236 -0
  204. package/dist/lib/bootstrap3/theme.less +297 -0
  205. package/dist/lib/bootstrap3/thumbnails.less +38 -0
  206. package/dist/lib/bootstrap3/tooltip.less +112 -0
  207. package/dist/lib/bootstrap3/type.less +304 -0
  208. package/dist/lib/bootstrap3/utilities.less +57 -0
  209. package/dist/lib/bootstrap3/variables.less +871 -0
  210. package/dist/lib/bootstrap3/wells.less +29 -0
  211. package/dist/lib/bootstrap4/_alert.scss +52 -0
  212. package/dist/lib/bootstrap4/_badge.scss +54 -0
  213. package/dist/lib/bootstrap4/_breadcrumb.scss +42 -0
  214. package/dist/lib/bootstrap4/_button-group.scss +163 -0
  215. package/dist/lib/bootstrap4/_buttons.scss +142 -0
  216. package/dist/lib/bootstrap4/_card.scss +286 -0
  217. package/dist/lib/bootstrap4/_carousel.scss +197 -0
  218. package/dist/lib/bootstrap4/_close.scss +40 -0
  219. package/dist/lib/bootstrap4/_code.scss +48 -0
  220. package/dist/lib/bootstrap4/_custom-forms.scss +526 -0
  221. package/dist/lib/bootstrap4/_dropdown.scss +192 -0
  222. package/dist/lib/bootstrap4/_forms.scss +347 -0
  223. package/dist/lib/bootstrap4/_functions.scss +144 -0
  224. package/dist/lib/bootstrap4/_grid.scss +73 -0
  225. package/dist/lib/bootstrap4/_images.scss +42 -0
  226. package/dist/lib/bootstrap4/_input-group.scss +208 -0
  227. package/dist/lib/bootstrap4/_jumbotron.scss +17 -0
  228. package/dist/lib/bootstrap4/_list-group.scss +154 -0
  229. package/dist/lib/bootstrap4/_media.scss +8 -0
  230. package/dist/lib/bootstrap4/_mixins.scss +47 -0
  231. package/dist/lib/bootstrap4/_modal.scss +240 -0
  232. package/dist/lib/bootstrap4/_nav.scss +120 -0
  233. package/dist/lib/bootstrap4/_navbar.scss +332 -0
  234. package/dist/lib/bootstrap4/_pagination.scss +74 -0
  235. package/dist/lib/bootstrap4/_popover.scss +170 -0
  236. package/dist/lib/bootstrap4/_print.scss +141 -0
  237. package/dist/lib/bootstrap4/_progress.scss +47 -0
  238. package/dist/lib/bootstrap4/_reboot.scss +484 -0
  239. package/dist/lib/bootstrap4/_root.scss +19 -0
  240. package/dist/lib/bootstrap4/_spinners.scss +65 -0
  241. package/dist/lib/bootstrap4/_tables.scss +185 -0
  242. package/dist/lib/bootstrap4/_toasts.scss +46 -0
  243. package/dist/lib/bootstrap4/_tooltip.scss +115 -0
  244. package/dist/lib/bootstrap4/_transitions.scss +20 -0
  245. package/dist/lib/bootstrap4/_type.scss +125 -0
  246. package/dist/lib/bootstrap4/_utilities.scss +18 -0
  247. package/dist/lib/bootstrap4/_variables.scss +1146 -0
  248. package/dist/lib/bootstrap4/bootstrap-grid.scss +30 -0
  249. package/dist/lib/bootstrap4/bootstrap-reboot.scss +12 -0
  250. package/dist/lib/bootstrap4/bootstrap.scss +44 -0
  251. package/dist/lib/bootstrap4/mixins/_alert.scss +13 -0
  252. package/dist/lib/bootstrap4/mixins/_background-variant.scss +23 -0
  253. package/dist/lib/bootstrap4/mixins/_badge.scss +17 -0
  254. package/dist/lib/bootstrap4/mixins/_border-radius.scss +76 -0
  255. package/dist/lib/bootstrap4/mixins/_box-shadow.scss +20 -0
  256. package/dist/lib/bootstrap4/mixins/_breakpoints.scss +123 -0
  257. package/dist/lib/bootstrap4/mixins/_buttons.scss +110 -0
  258. package/dist/lib/bootstrap4/mixins/_caret.scss +62 -0
  259. package/dist/lib/bootstrap4/mixins/_clearfix.scss +7 -0
  260. package/dist/lib/bootstrap4/mixins/_deprecate.scss +10 -0
  261. package/dist/lib/bootstrap4/mixins/_float.scss +14 -0
  262. package/dist/lib/bootstrap4/mixins/_forms.scss +185 -0
  263. package/dist/lib/bootstrap4/mixins/_gradients.scss +45 -0
  264. package/dist/lib/bootstrap4/mixins/_grid-framework.scss +80 -0
  265. package/dist/lib/bootstrap4/mixins/_grid.scss +69 -0
  266. package/dist/lib/bootstrap4/mixins/_hover.scss +37 -0
  267. package/dist/lib/bootstrap4/mixins/_image.scss +36 -0
  268. package/dist/lib/bootstrap4/mixins/_list-group.scss +21 -0
  269. package/dist/lib/bootstrap4/mixins/_lists.scss +7 -0
  270. package/dist/lib/bootstrap4/mixins/_nav-divider.scss +11 -0
  271. package/dist/lib/bootstrap4/mixins/_pagination.scss +22 -0
  272. package/dist/lib/bootstrap4/mixins/_reset-text.scss +17 -0
  273. package/dist/lib/bootstrap4/mixins/_resize.scss +6 -0
  274. package/dist/lib/bootstrap4/mixins/_screen-reader.scss +34 -0
  275. package/dist/lib/bootstrap4/mixins/_size.scss +7 -0
  276. package/dist/lib/bootstrap4/mixins/_table-row.scss +39 -0
  277. package/dist/lib/bootstrap4/mixins/_text-emphasis.scss +17 -0
  278. package/dist/lib/bootstrap4/mixins/_text-hide.scss +11 -0
  279. package/dist/lib/bootstrap4/mixins/_text-truncate.scss +8 -0
  280. package/dist/lib/bootstrap4/mixins/_transition.scss +26 -0
  281. package/dist/lib/bootstrap4/mixins/_visibility.scss +8 -0
  282. package/dist/lib/bootstrap4/utilities/_align.scss +8 -0
  283. package/dist/lib/bootstrap4/utilities/_background.scss +19 -0
  284. package/dist/lib/bootstrap4/utilities/_borders.scss +75 -0
  285. package/dist/lib/bootstrap4/utilities/_clearfix.scss +3 -0
  286. package/dist/lib/bootstrap4/utilities/_display.scss +26 -0
  287. package/dist/lib/bootstrap4/utilities/_embed.scss +39 -0
  288. package/dist/lib/bootstrap4/utilities/_flex.scss +51 -0
  289. package/dist/lib/bootstrap4/utilities/_float.scss +11 -0
  290. package/dist/lib/bootstrap4/utilities/_interactions.scss +5 -0
  291. package/dist/lib/bootstrap4/utilities/_overflow.scss +5 -0
  292. package/dist/lib/bootstrap4/utilities/_position.scss +32 -0
  293. package/dist/lib/bootstrap4/utilities/_screenreaders.scss +11 -0
  294. package/dist/lib/bootstrap4/utilities/_shadows.scss +6 -0
  295. package/dist/lib/bootstrap4/utilities/_sizing.scss +20 -0
  296. package/dist/lib/bootstrap4/utilities/_spacing.scss +73 -0
  297. package/dist/lib/bootstrap4/utilities/_stretched-link.scss +19 -0
  298. package/dist/lib/bootstrap4/utilities/_text.scss +72 -0
  299. package/dist/lib/bootstrap4/utilities/_visibility.scss +13 -0
  300. package/dist/lib/bootstrap4/vendor/_rfs.scss +204 -0
  301. package/dist/lib/bootstrap5/_accordion.scss +149 -0
  302. package/dist/lib/bootstrap5/_alert.scss +71 -0
  303. package/dist/lib/bootstrap5/_badge.scss +38 -0
  304. package/dist/lib/bootstrap5/_breadcrumb.scss +40 -0
  305. package/dist/lib/bootstrap5/_button-group.scss +142 -0
  306. package/dist/lib/bootstrap5/_buttons.scss +207 -0
  307. package/dist/lib/bootstrap5/_card.scss +234 -0
  308. package/dist/lib/bootstrap5/_carousel.scss +226 -0
  309. package/dist/lib/bootstrap5/_close.scss +40 -0
  310. package/dist/lib/bootstrap5/_containers.scss +41 -0
  311. package/dist/lib/bootstrap5/_dropdown.scss +249 -0
  312. package/dist/lib/bootstrap5/_forms.scss +9 -0
  313. package/dist/lib/bootstrap5/_functions.scss +302 -0
  314. package/dist/lib/bootstrap5/_grid.scss +33 -0
  315. package/dist/lib/bootstrap5/_helpers.scss +10 -0
  316. package/dist/lib/bootstrap5/_images.scss +42 -0
  317. package/dist/lib/bootstrap5/_list-group.scss +192 -0
  318. package/dist/lib/bootstrap5/_maps.scss +54 -0
  319. package/dist/lib/bootstrap5/_mixins.scss +43 -0
  320. package/dist/lib/bootstrap5/_modal.scss +237 -0
  321. package/dist/lib/bootstrap5/_nav.scss +172 -0
  322. package/dist/lib/bootstrap5/_navbar.scss +278 -0
  323. package/dist/lib/bootstrap5/_offcanvas.scss +144 -0
  324. package/dist/lib/bootstrap5/_pagination.scss +109 -0
  325. package/dist/lib/bootstrap5/_placeholders.scss +51 -0
  326. package/dist/lib/bootstrap5/_popover.scss +196 -0
  327. package/dist/lib/bootstrap5/_progress.scss +59 -0
  328. package/dist/lib/bootstrap5/_reboot.scss +610 -0
  329. package/dist/lib/bootstrap5/_root.scss +73 -0
  330. package/dist/lib/bootstrap5/_spinners.scss +85 -0
  331. package/dist/lib/bootstrap5/_tables.scss +164 -0
  332. package/dist/lib/bootstrap5/_toasts.scss +73 -0
  333. package/dist/lib/bootstrap5/_tooltip.scss +120 -0
  334. package/dist/lib/bootstrap5/_transitions.scss +27 -0
  335. package/dist/lib/bootstrap5/_type.scss +106 -0
  336. package/dist/lib/bootstrap5/_utilities.scss +647 -0
  337. package/dist/lib/bootstrap5/_variables.scss +1634 -0
  338. package/dist/lib/bootstrap5/bootstrap-grid.scss +64 -0
  339. package/dist/lib/bootstrap5/bootstrap-reboot.scss +9 -0
  340. package/dist/lib/bootstrap5/bootstrap-utilities.scss +18 -0
  341. package/dist/lib/bootstrap5/bootstrap.scss +51 -0
  342. package/dist/lib/bootstrap5/forms/_floating-labels.scss +75 -0
  343. package/dist/lib/bootstrap5/forms/_form-check.scss +175 -0
  344. package/dist/lib/bootstrap5/forms/_form-control.scss +194 -0
  345. package/dist/lib/bootstrap5/forms/_form-range.scss +91 -0
  346. package/dist/lib/bootstrap5/forms/_form-select.scss +71 -0
  347. package/dist/lib/bootstrap5/forms/_form-text.scss +11 -0
  348. package/dist/lib/bootstrap5/forms/_input-group.scss +132 -0
  349. package/dist/lib/bootstrap5/forms/_labels.scss +36 -0
  350. package/dist/lib/bootstrap5/forms/_validation.scss +12 -0
  351. package/dist/lib/bootstrap5/helpers/_clearfix.scss +3 -0
  352. package/dist/lib/bootstrap5/helpers/_color-bg.scss +10 -0
  353. package/dist/lib/bootstrap5/helpers/_colored-links.scss +12 -0
  354. package/dist/lib/bootstrap5/helpers/_position.scss +36 -0
  355. package/dist/lib/bootstrap5/helpers/_ratio.scss +26 -0
  356. package/dist/lib/bootstrap5/helpers/_stacks.scss +15 -0
  357. package/dist/lib/bootstrap5/helpers/_stretched-link.scss +15 -0
  358. package/dist/lib/bootstrap5/helpers/_text-truncation.scss +7 -0
  359. package/dist/lib/bootstrap5/helpers/_visually-hidden.scss +8 -0
  360. package/dist/lib/bootstrap5/helpers/_vr.scss +8 -0
  361. package/dist/lib/bootstrap5/mixins/_alert.scss +15 -0
  362. package/dist/lib/bootstrap5/mixins/_backdrop.scss +14 -0
  363. package/dist/lib/bootstrap5/mixins/_banner.scss +9 -0
  364. package/dist/lib/bootstrap5/mixins/_border-radius.scss +78 -0
  365. package/dist/lib/bootstrap5/mixins/_box-shadow.scss +18 -0
  366. package/dist/lib/bootstrap5/mixins/_breakpoints.scss +127 -0
  367. package/dist/lib/bootstrap5/mixins/_buttons.scss +70 -0
  368. package/dist/lib/bootstrap5/mixins/_caret.scss +64 -0
  369. package/dist/lib/bootstrap5/mixins/_clearfix.scss +9 -0
  370. package/dist/lib/bootstrap5/mixins/_color-scheme.scss +7 -0
  371. package/dist/lib/bootstrap5/mixins/_container.scss +11 -0
  372. package/dist/lib/bootstrap5/mixins/_deprecate.scss +10 -0
  373. package/dist/lib/bootstrap5/mixins/_forms.scss +152 -0
  374. package/dist/lib/bootstrap5/mixins/_gradients.scss +47 -0
  375. package/dist/lib/bootstrap5/mixins/_grid.scss +151 -0
  376. package/dist/lib/bootstrap5/mixins/_image.scss +16 -0
  377. package/dist/lib/bootstrap5/mixins/_list-group.scss +24 -0
  378. package/dist/lib/bootstrap5/mixins/_lists.scss +7 -0
  379. package/dist/lib/bootstrap5/mixins/_pagination.scss +10 -0
  380. package/dist/lib/bootstrap5/mixins/_reset-text.scss +17 -0
  381. package/dist/lib/bootstrap5/mixins/_resize.scss +6 -0
  382. package/dist/lib/bootstrap5/mixins/_table-variants.scss +24 -0
  383. package/dist/lib/bootstrap5/mixins/_text-truncate.scss +8 -0
  384. package/dist/lib/bootstrap5/mixins/_transition.scss +26 -0
  385. package/dist/lib/bootstrap5/mixins/_utilities.scss +97 -0
  386. package/dist/lib/bootstrap5/mixins/_visually-hidden.scss +29 -0
  387. package/dist/lib/bootstrap5/utilities/_api.scss +47 -0
  388. package/dist/lib/bootstrap5/vendor/_rfs.scss +354 -0
  389. package/dist/scss/plugins/auto_position.scss +16 -0
  390. package/dist/scss/plugins/clear_button.scss +29 -0
  391. package/dist/scss/plugins/drag_drop.scss +19 -0
  392. package/dist/scss/plugins/dropdown_header.scss +24 -0
  393. package/dist/scss/plugins/optgroup_columns.scss +22 -0
  394. package/dist/scss/plugins/remove_button.scss +38 -0
  395. package/dist/scss/selectize.bootstrap3.scss +138 -0
  396. package/dist/scss/selectize.bootstrap4.scss +199 -0
  397. package/dist/scss/selectize.bootstrap5.scss +206 -0
  398. package/dist/scss/selectize.default.scss +71 -0
  399. package/dist/scss/selectize.scss +377 -0
  400. package/package.json +100 -0
@@ -0,0 +1,3497 @@
1
+ /**
2
+ * Selectize (v0.15.3)
3
+ * https://selectize.dev
4
+ *
5
+ * Copyright (c) 2013-2015 Brian Reavis & contributors
6
+ * Copyright (c) 2020-2026 Selectize Team & contributors
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
9
+ * file except in compliance with the License. You may obtain a copy of the License at:
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software distributed under
13
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
14
+ * ANY KIND, either express or implied. See the License for the specific language
15
+ * governing permissions and limitations under the License.
16
+ *
17
+ * @author Brian Reavis <brian@thirdroute.com>
18
+ * @author Ris Adams <selectize@risadams.com>
19
+ */
20
+ (function (root, factory) {
21
+ if (typeof define === 'function' && define.amd) {
22
+ define(['jquery'], factory);
23
+ } else if (typeof module === 'object' && typeof module.exports === 'object') {
24
+ module.exports = factory(require('jquery'));
25
+ } else {
26
+ root.Selectize = factory(root.jQuery);
27
+ }
28
+ }(this, function ($) {
29
+ 'use strict';
30
+ var highlight = function ($element, pattern) {
31
+ if (typeof pattern === 'string' && !pattern.length) return;
32
+ var regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;
33
+
34
+ var highlight = function (node) {
35
+ var skip = 0;
36
+ if (node.nodeType === 3) {
37
+ var pos = node.data.search(regex);
38
+ if (pos >= 0 && node.data.length > 0) {
39
+ var match = node.data.match(regex);
40
+ var spannode = document.createElement('span');
41
+ spannode.className = 'highlight';
42
+ var middlebit = node.splitText(pos);
43
+ var endbit = middlebit.splitText(match[0].length);
44
+ var middleclone = middlebit.cloneNode(true);
45
+ spannode.appendChild(middleclone);
46
+ middlebit.parentNode.replaceChild(spannode, middlebit);
47
+ skip = 1;
48
+ }
49
+ }
50
+ else if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName) && (node.className !== 'highlight' || node.tagName !== 'SPAN')) {
51
+ for (var i = 0; i < node.childNodes.length; ++i) {
52
+ i += highlight(node.childNodes[i]);
53
+ }
54
+ }
55
+ return skip;
56
+ };
57
+
58
+ return $element.each(function () {
59
+ highlight(this);
60
+ });
61
+ };
62
+
63
+ $.fn.removeHighlight = function () {
64
+ return this.find("span.highlight").each(function () {
65
+ this.parentNode.firstChild.nodeName;
66
+ var parent = this.parentNode;
67
+ parent.replaceChild(this.firstChild, this);
68
+ parent.normalize();
69
+ }).end();
70
+ };
71
+
72
+ var MicroEvent = function () { };
73
+ MicroEvent.prototype = {
74
+ on: function (event, fct) {
75
+ this._events = this._events || {};
76
+ this._events[event] = this._events[event] || [];
77
+ this._events[event].push(fct);
78
+ },
79
+ off: function (event, fct) {
80
+ var n = arguments.length;
81
+ if (n === 0) return delete this._events;
82
+ if (n === 1) return delete this._events[event];
83
+
84
+ this._events = this._events || {};
85
+ if (event in this._events === false) return;
86
+ this._events[event].splice(this._events[event].indexOf(fct), 1);
87
+ },
88
+ trigger: function (event ) {
89
+ const events = this._events = this._events || {};
90
+ if (event in events === false) return;
91
+ for (var i = 0; i < events[event].length; i++) {
92
+ events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
93
+ }
94
+ }
95
+ };
96
+
97
+ MicroEvent.mixin = function (destObject) {
98
+ var props = ['on', 'off', 'trigger'];
99
+ for (var i = 0; i < props.length; i++) {
100
+ destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
101
+ }
102
+ };
103
+
104
+ var MicroPlugin = {};
105
+ MicroPlugin.mixin = function (Interface) {
106
+
107
+ Interface.plugins = {};
108
+
109
+ Interface.prototype.initializePlugins = function (plugins) {
110
+ var i, n, key;
111
+ var self = this;
112
+ var queue = [];
113
+
114
+ self.plugins = {
115
+ names: [],
116
+ settings: {},
117
+ requested: {},
118
+ loaded: {}
119
+ };
120
+
121
+ if (isArray(plugins)) {
122
+ for (i = 0, n = plugins.length; i < n; i++) {
123
+ if (typeof plugins[i] === 'string') {
124
+ queue.push(plugins[i]);
125
+ } else {
126
+ self.plugins.settings[plugins[i].name] = plugins[i].options;
127
+ queue.push(plugins[i].name);
128
+ }
129
+ }
130
+ } else if (plugins) {
131
+ for (key in plugins) {
132
+ if (plugins.hasOwnProperty(key)) {
133
+ self.plugins.settings[key] = plugins[key];
134
+ queue.push(key);
135
+ }
136
+ }
137
+ }
138
+
139
+ while (queue.length) {
140
+ self.require(queue.shift());
141
+ }
142
+ };
143
+
144
+
145
+ Interface.prototype.loadPlugin = function (name) {
146
+ var self = this;
147
+ var plugins = self.plugins;
148
+ var plugin = Interface.plugins[name];
149
+
150
+ if (!Interface.plugins.hasOwnProperty(name)) {
151
+ throw new Error('Unable to find "' + name + '" plugin');
152
+ }
153
+
154
+ plugins.requested[name] = true;
155
+ plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);
156
+ plugins.names.push(name);
157
+ };
158
+
159
+ Interface.prototype.require = function (name) {
160
+ var self = this;
161
+ var plugins = self.plugins;
162
+
163
+ if (!self.plugins.loaded.hasOwnProperty(name)) {
164
+ if (plugins.requested[name]) {
165
+ throw new Error('Plugin has circular dependency ("' + name + '")');
166
+ }
167
+ self.loadPlugin(name);
168
+ }
169
+
170
+ return plugins.loaded[name];
171
+ };
172
+
173
+ Interface.define = function (name, fn) {
174
+ Interface.plugins[name] = {
175
+ 'name': name,
176
+ 'fn': fn
177
+ };
178
+ };
179
+ };
180
+
181
+ const nanoid = (t = 21) => crypto.getRandomValues(new Uint8Array(t))
182
+ .reduce(((t, e) =>
183
+ t += (e &= 63) < 36 ? e.toString(36) :
184
+ e < 62 ? (e - 26).toString(36).toUpperCase()
185
+ : e > 62 ? "-" : "_"), "");
186
+
187
+
188
+ var Sifter = function (items, settings) {
189
+ this.items = items;
190
+ this.settings = settings || { diacritics: true };
191
+ };
192
+
193
+ Sifter.prototype.tokenize = function (query, respect_word_boundaries) {
194
+ query = trim(String(query || '').toLowerCase());
195
+ if (!query || !query.length) return [];
196
+
197
+ var i, n, regex, letter;
198
+ var tokens = [];
199
+ var words = query.split(/ +/);
200
+
201
+ for (i = 0, n = words.length; i < n; i++) {
202
+ regex = escape_regex(words[i]);
203
+ if (this.settings.diacritics) {
204
+ for (letter in DIACRITICS) {
205
+ if (DIACRITICS.hasOwnProperty(letter)) {
206
+ regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);
207
+ }
208
+ }
209
+ }
210
+ if (respect_word_boundaries) regex = "\\b" + regex
211
+ tokens.push({
212
+ string: words[i],
213
+ regex: new RegExp(regex, 'i')
214
+ });
215
+ }
216
+
217
+ return tokens;
218
+ };
219
+
220
+ Sifter.prototype.iterator = function (object, callback) {
221
+ var iterator;
222
+ if (is_array(object)) {
223
+ iterator = Array.prototype.forEach || function (callback) {
224
+ for (var i = 0, n = this.length; i < n; i++) {
225
+ callback(this[i], i, this);
226
+ }
227
+ };
228
+ } else {
229
+ iterator = function (callback) {
230
+ for (var key in this) {
231
+ if (this.hasOwnProperty(key)) {
232
+ callback(this[key], key, this);
233
+ }
234
+ }
235
+ };
236
+ }
237
+
238
+ iterator.apply(object, [callback]);
239
+ };
240
+
241
+ Sifter.prototype.getScoreFunction = function (search, options) {
242
+ var self, fields, tokens, token_count, nesting;
243
+
244
+ self = this;
245
+ search = self.prepareSearch(search, options);
246
+ tokens = search.tokens;
247
+ fields = search.options.fields;
248
+ token_count = tokens.length;
249
+ nesting = search.options.nesting;
250
+
251
+ var scoreValue = function (value, token) {
252
+ var score, pos;
253
+
254
+ if (!value) return 0;
255
+ value = String(value || '');
256
+ pos = value.search(token.regex);
257
+ if (pos === -1) return 0;
258
+ score = token.string.length / value.length;
259
+ if (pos === 0) score += 0.5;
260
+ return score;
261
+ };
262
+
263
+ var scoreObject = (function () {
264
+ var field_count = fields.length;
265
+ if (!field_count) {
266
+ return function () { return 0; };
267
+ }
268
+ if (field_count === 1) {
269
+ return function (token, data) {
270
+ return scoreValue(getattr(data, fields[0], nesting), token);
271
+ };
272
+ }
273
+ return function (token, data) {
274
+ for (var i = 0, sum = 0; i < field_count; i++) {
275
+ sum += scoreValue(getattr(data, fields[i], nesting), token);
276
+ }
277
+ return sum / field_count;
278
+ };
279
+ })();
280
+
281
+ if (!token_count) {
282
+ return function () { return 0; };
283
+ }
284
+ if (token_count === 1) {
285
+ return function (data) {
286
+ return scoreObject(tokens[0], data);
287
+ };
288
+ }
289
+
290
+ if (search.options.conjunction === 'and') {
291
+ return function (data) {
292
+ var score;
293
+ for (var i = 0, sum = 0; i < token_count; i++) {
294
+ score = scoreObject(tokens[i], data);
295
+ if (score <= 0) return 0;
296
+ sum += score;
297
+ }
298
+ return sum / token_count;
299
+ };
300
+ } else {
301
+ return function (data) {
302
+ for (var i = 0, sum = 0; i < token_count; i++) {
303
+ sum += scoreObject(tokens[i], data);
304
+ }
305
+ return sum / token_count;
306
+ };
307
+ }
308
+ };
309
+
310
+ Sifter.prototype.getSortFunction = function (search, options) {
311
+ var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;
312
+
313
+ self = this;
314
+ search = self.prepareSearch(search, options);
315
+ sort = (!search.query && options.sort_empty) || options.sort;
316
+
317
+ get_field = function (name, result) {
318
+ if (name === '$score') return result.score;
319
+ return getattr(self.items[result.id], name, options.nesting);
320
+ };
321
+
322
+ fields = [];
323
+ if (sort) {
324
+ for (i = 0, n = sort.length; i < n; i++) {
325
+ if (search.query || sort[i].field !== '$score') {
326
+ fields.push(sort[i]);
327
+ }
328
+ }
329
+ }
330
+
331
+ if (search.query) {
332
+ implicit_score = true;
333
+ for (i = 0, n = fields.length; i < n; i++) {
334
+ if (fields[i].field === '$score') {
335
+ implicit_score = false;
336
+ break;
337
+ }
338
+ }
339
+ if (implicit_score) {
340
+ fields.unshift({ field: '$score', direction: 'desc' });
341
+ }
342
+ } else {
343
+ for (i = 0, n = fields.length; i < n; i++) {
344
+ if (fields[i].field === '$score') {
345
+ fields.splice(i, 1);
346
+ break;
347
+ }
348
+ }
349
+ }
350
+
351
+ multipliers = [];
352
+ for (i = 0, n = fields.length; i < n; i++) {
353
+ multipliers.push(fields[i].direction === 'desc' ? -1 : 1);
354
+ }
355
+
356
+ fields_count = fields.length;
357
+ if (!fields_count) {
358
+ return null;
359
+ } else if (fields_count === 1) {
360
+ field = fields[0].field;
361
+ multiplier = multipliers[0];
362
+ return function (a, b) {
363
+ return multiplier * cmp(
364
+ get_field(field, a),
365
+ get_field(field, b)
366
+ );
367
+ };
368
+ } else {
369
+ return function (a, b) {
370
+ var i, result, a_value, b_value, field;
371
+ for (i = 0; i < fields_count; i++) {
372
+ field = fields[i].field;
373
+ result = multipliers[i] * cmp(
374
+ get_field(field, a),
375
+ get_field(field, b)
376
+ );
377
+ if (result) return result;
378
+ }
379
+ return 0;
380
+ };
381
+ }
382
+ };
383
+
384
+ Sifter.prototype.prepareSearch = function (query, options) {
385
+ if (typeof query === 'object') return query;
386
+
387
+ options = extend({}, options);
388
+
389
+ var option_fields = options.fields;
390
+ var option_sort = options.sort;
391
+ var option_sort_empty = options.sort_empty;
392
+
393
+ if (option_fields && !is_array(option_fields)) options.fields = [option_fields];
394
+ if (option_sort && !is_array(option_sort)) options.sort = [option_sort];
395
+ if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];
396
+
397
+ return {
398
+ options: options,
399
+ query: String(query || '').toLowerCase(),
400
+ tokens: this.tokenize(query, options.respect_word_boundaries),
401
+ total: 0,
402
+ items: []
403
+ };
404
+ };
405
+
406
+ Sifter.prototype.search = function (query, options) {
407
+ var self = this, value, score, search, calculateScore;
408
+ var fn_sort;
409
+ var fn_score;
410
+
411
+ search = this.prepareSearch(query, options);
412
+ options = search.options;
413
+ query = search.query;
414
+
415
+ fn_score = options.score || self.getScoreFunction(search);
416
+
417
+ if (query.length) {
418
+ self.iterator(self.items, function (item, id) {
419
+ score = fn_score(item);
420
+ if (options.filter === false || score > 0) {
421
+ search.items.push({ 'score': score, 'id': id });
422
+ }
423
+ });
424
+ } else {
425
+ self.iterator(self.items, function (item, id) {
426
+ search.items.push({ 'score': 1, 'id': id });
427
+ });
428
+ }
429
+
430
+ fn_sort = self.getSortFunction(search, options);
431
+ if (fn_sort) search.items.sort(fn_sort);
432
+
433
+ search.total = search.items.length;
434
+ if (typeof options.limit === 'number') {
435
+ search.items = search.items.slice(0, options.limit);
436
+ }
437
+
438
+ return search;
439
+ };
440
+
441
+ var cmp = function (a, b) {
442
+ if (typeof a === 'number' && typeof b === 'number') {
443
+ return a > b ? 1 : (a < b ? -1 : 0);
444
+ }
445
+ a = asciifold(String(a || ''));
446
+ b = asciifold(String(b || ''));
447
+ if (a > b) return 1;
448
+ if (b > a) return -1;
449
+ return 0;
450
+ };
451
+
452
+ var extend = function (a, b) {
453
+ var i, n, k, object;
454
+ for (i = 1, n = arguments.length; i < n; i++) {
455
+ object = arguments[i];
456
+ if (!object) continue;
457
+ for (k in object) {
458
+ if (object.hasOwnProperty(k)) {
459
+ a[k] = object[k];
460
+ }
461
+ }
462
+ }
463
+ return a;
464
+ };
465
+
466
+ var getattr = function (obj, name, nesting) {
467
+ if (!obj || !name) return;
468
+ if (!nesting) return obj[name];
469
+ var names = name.split(".");
470
+ while (names.length && (obj = obj[names.shift()]));
471
+ return obj;
472
+ };
473
+
474
+ var trim = function (str) {
475
+ return (str + '').replace(/^\s+|\s+$|/g, '');
476
+ };
477
+
478
+ var escape_regex = function (str) {
479
+ return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
480
+ };
481
+
482
+ var is_array = Array.isArray || function (object) {
483
+ return Object.prototype.toString.call(object) === '[object Array]';
484
+ };
485
+
486
+ var DIACRITICS = {
487
+ 'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',
488
+ 'b': '[b␢βΒB฿𐌁ᛒ]',
489
+ 'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄCc]',
490
+ 'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅDdð]',
491
+ 'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇEeɘǝƏƐε]',
492
+ 'f': '[fƑƒḞḟ]',
493
+ 'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',
494
+ 'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',
495
+ 'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪIi]',
496
+ 'j': '[jȷĴĵɈɉʝɟʲ]',
497
+ 'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',
498
+ 'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟLl]',
499
+ 'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴNnŊŋ]',
500
+ 'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',
501
+ 'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',
502
+ 'q': '[qꝖꝗʠɊɋꝘꝙq̃]',
503
+ 'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',
504
+ 's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',
505
+ 't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',
506
+ 'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',
507
+ 'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',
508
+ 'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',
509
+ 'x': '[xẌẍẊẋχ]',
510
+ 'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',
511
+ 'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'
512
+ };
513
+
514
+ var asciifold = (function () {
515
+ var i, n, k, chunk;
516
+ var i18nChars = '';
517
+ var lookup = {};
518
+ for (k in DIACRITICS) {
519
+ if (DIACRITICS.hasOwnProperty(k)) {
520
+ chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);
521
+ i18nChars += chunk;
522
+ for (i = 0, n = chunk.length; i < n; i++) {
523
+ lookup[chunk.charAt(i)] = k;
524
+ }
525
+ }
526
+ }
527
+ var regexp = new RegExp('[' + i18nChars + ']', 'g');
528
+ return function (str) {
529
+ return str.replace(regexp, function (i18nChar) {
530
+ return lookup[i18nChar];
531
+ }).toLowerCase();
532
+ };
533
+ })();
534
+
535
+ var IS_MAC = uaDetect("macOS", /Mac/);
536
+ var KEY_A = 65;
537
+ var KEY_COMMA = 188;
538
+ var KEY_RETURN = 13;
539
+ var KEY_ESC = 27;
540
+ var KEY_LEFT = 37;
541
+ var KEY_UP = 38;
542
+ var KEY_P = 80;
543
+ var KEY_RIGHT = 39;
544
+ var KEY_DOWN = 40;
545
+ var KEY_N = 78;
546
+ var KEY_BACKSPACE = 8;
547
+ var KEY_DELETE = 46;
548
+ var KEY_SHIFT = 16;
549
+ var KEY_CMD = IS_MAC ? 91 : 17;
550
+ var KEY_CTRL = IS_MAC ? 18 : 17;
551
+ var KEY_TAB = 9;
552
+ var TAG_SELECT = 1;
553
+ var TAG_INPUT = 2;
554
+
555
+ var SUPPORTS_VALIDITY_API = !uaDetect("Android", /android/i) && !!document.createElement('input').validity;
556
+
557
+ var isset = function (object) {
558
+ return typeof object !== 'undefined';
559
+ };
560
+
561
+ var isArray = Array.isArray || function (vArg) {
562
+ return Object.prototype.toString.call(vArg) === '[object Array]';
563
+ }
564
+
565
+ var hash_key = function (value) {
566
+ if (typeof value === 'undefined' || value === null) return null;
567
+ if (typeof value === 'boolean') return value ? '1' : '0';
568
+ return value + '';
569
+ };
570
+
571
+ var escape_html = function (str) {
572
+ return (str + '')
573
+ .replace(/&/g, '&amp;')
574
+ .replace(/</g, '&lt;')
575
+ .replace(/>/g, '&gt;')
576
+ .replace(/"/g, '&quot;');
577
+ };
578
+
579
+ var escape_replace = function (str) {
580
+ return (str + '').replace(/\$/g, '$$$$');
581
+ };
582
+
583
+ var hook = {};
584
+
585
+ hook.before = function (self, method, fn) {
586
+ var original = self[method];
587
+ self[method] = function () {
588
+ fn.apply(self, arguments);
589
+ return original.apply(self, arguments);
590
+ };
591
+ };
592
+
593
+ hook.after = function (self, method, fn) {
594
+ var original = self[method];
595
+ self[method] = function () {
596
+ var result = original.apply(self, arguments);
597
+ fn.apply(self, arguments);
598
+ return result;
599
+ };
600
+ };
601
+
602
+ var once = function (fn) {
603
+ var called = false;
604
+ return function () {
605
+ if (called) return;
606
+ called = true;
607
+ fn.apply(this, arguments);
608
+ };
609
+ };
610
+
611
+ var debounce = function (fn, delay) {
612
+ var timeout;
613
+ return function () {
614
+ var self = this;
615
+ var args = arguments;
616
+ window.clearTimeout(timeout);
617
+ timeout = window.setTimeout(function () {
618
+ fn.apply(self, args);
619
+ }, delay);
620
+ };
621
+ };
622
+
623
+ var debounce_events = function (self, types, fn) {
624
+ var type;
625
+ var trigger = self.trigger;
626
+ var event_args = {};
627
+
628
+ self.trigger = function () {
629
+ var type = arguments[0];
630
+ if (types.indexOf(type) !== -1) {
631
+ event_args[type] = arguments;
632
+ } else {
633
+ return trigger.apply(self, arguments);
634
+ }
635
+ };
636
+
637
+ fn.apply(self, []);
638
+ self.trigger = trigger;
639
+
640
+ for (type in event_args) {
641
+ if (event_args.hasOwnProperty(type)) {
642
+ trigger.apply(self, event_args[type]);
643
+ }
644
+ }
645
+ };
646
+
647
+ var watchChildEvent = function ($parent, event, selector, fn) {
648
+ $parent.on(event, selector, function (e) {
649
+ var child = e.target;
650
+ while (child && child.parentNode !== $parent[0]) {
651
+ child = child.parentNode;
652
+ }
653
+ e.currentTarget = child;
654
+ return fn.apply(this, [e]);
655
+ });
656
+ };
657
+
658
+ var getInputSelection = function (input) {
659
+ var result = {};
660
+ if (input === undefined) {
661
+ console.warn('WARN getInputSelection cannot locate input control');
662
+ return result;
663
+ }
664
+ if ('selectionStart' in input) {
665
+ result.start = input.selectionStart;
666
+ result.length = input.selectionEnd - result.start;
667
+ } else if (document.selection) {
668
+ input.focus();
669
+ var sel = document.selection.createRange();
670
+ var selLen = document.selection.createRange().text.length;
671
+ sel.moveStart('character', -input.value.length);
672
+ result.start = sel.text.length - selLen;
673
+ result.length = selLen;
674
+ }
675
+ return result;
676
+ };
677
+
678
+ var transferStyles = function ($from, $to, properties) {
679
+ var i, n, styles = {};
680
+ if (properties) {
681
+ for (i = 0, n = properties.length; i < n; i++) {
682
+ styles[properties[i]] = $from.css(properties[i]);
683
+ }
684
+ } else {
685
+ styles = $from.css();
686
+ }
687
+ $to.css(styles);
688
+ };
689
+
690
+ var measureString = function (str, $parent) {
691
+ if (!str) {
692
+ return 0;
693
+ }
694
+
695
+ if (!Selectize.$testInput) {
696
+ Selectize.$testInput = $('<span />').css({
697
+ position: 'absolute',
698
+ width: 'auto',
699
+ padding: 0,
700
+ whiteSpace: 'pre'
701
+ });
702
+
703
+ $('<div />').css({
704
+ position: 'absolute',
705
+ width: 0,
706
+ height: 0,
707
+ overflow: 'hidden'
708
+ }).attr({
709
+ 'aria-hidden': true
710
+ }).append(Selectize.$testInput).appendTo('body');
711
+ }
712
+
713
+ Selectize.$testInput.text(str);
714
+
715
+ transferStyles($parent, Selectize.$testInput, [
716
+ 'letterSpacing',
717
+ 'fontSize',
718
+ 'fontFamily',
719
+ 'fontWeight',
720
+ 'textTransform'
721
+ ]);
722
+
723
+ return Selectize.$testInput.width();
724
+ };
725
+
726
+ var autoGrow = function ($input) {
727
+ var currentWidth = null;
728
+
729
+ var update = function (e, options) {
730
+ var value, keyCode, printable, width;
731
+ var placeholder, placeholderWidth;
732
+ var shift, character, selection;
733
+ e = e || window.event || {};
734
+ options = options || {};
735
+
736
+ if (e.metaKey || e.altKey) return;
737
+ if (!options.force && $input.data('grow') === false) return;
738
+
739
+ value = $input.val();
740
+ if (e.type && e.type.toLowerCase() === 'keydown') {
741
+ keyCode = e.keyCode;
742
+ printable = (
743
+ (keyCode >= 48 && keyCode <= 57) ||
744
+ (keyCode >= 65 && keyCode <= 90) ||
745
+ (keyCode >= 96 && keyCode <= 111) ||
746
+ (keyCode >= 186 && keyCode <= 222) ||
747
+ keyCode === 32
748
+ );
749
+
750
+ if (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {
751
+ selection = getInputSelection($input[0]);
752
+ if (selection.length) {
753
+ value = value.substring(0, selection.start) + value.substring(selection.start + selection.length);
754
+ } else if (keyCode === KEY_BACKSPACE && selection.start) {
755
+ value = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);
756
+ } else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {
757
+ value = value.substring(0, selection.start) + value.substring(selection.start + 1);
758
+ }
759
+ } else if (printable) {
760
+ shift = e.shiftKey;
761
+ character = String.fromCharCode(e.keyCode);
762
+ if (shift) character = character.toUpperCase();
763
+ else character = character.toLowerCase();
764
+ value += character;
765
+ }
766
+ }
767
+
768
+ var width = $input.attr('readonly') ? 0 : 4;
769
+ placeholder = $input.attr('placeholder');
770
+ if (placeholder) {
771
+ placeholderWidth = measureString(placeholder, $input) + width;
772
+ } else {
773
+ placeholderWidth = 0;
774
+ }
775
+
776
+ width = Math.max(measureString(value, $input), placeholderWidth) + width;
777
+ if (width !== currentWidth) {
778
+ currentWidth = width;
779
+ $input.width(width);
780
+ $input.triggerHandler('resize');
781
+ }
782
+ };
783
+
784
+ $input.on('keydown keyup update blur', update);
785
+ update();
786
+ };
787
+
788
+ var domToString = function (d) {
789
+ var tmp = document.createElement('div');
790
+
791
+ tmp.appendChild(d.cloneNode(true));
792
+
793
+ return tmp.innerHTML;
794
+ };
795
+
796
+ var logError = function (message, options) {
797
+ if (!options) options = {};
798
+ var component = "Selectize";
799
+
800
+ console.error(component + ": " + message)
801
+
802
+ if (options.explanation) {
803
+ if (console.group) console.group();
804
+ console.error(options.explanation);
805
+ if (console.group) console.groupEnd();
806
+ }
807
+ };
808
+
809
+ var isJSON = function (data) {
810
+ try {
811
+ JSON.parse(data);
812
+ } catch (e) {
813
+ return false;
814
+ }
815
+ return true;
816
+ };
817
+
818
+ function uaDetect(platform, re) {
819
+ if (navigator.userAgentData) {
820
+ return platform === navigator.userAgentData.platform;
821
+ }
822
+
823
+ return re.test(navigator.userAgent);
824
+ }
825
+
826
+ var Selectize = function($input, settings) {
827
+ var key, i, n, dir, input, self = this;
828
+ input = $input[0];
829
+ input.selectize = self;
830
+
831
+ var computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);
832
+ dir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;
833
+ dir = dir || $input.parents('[dir]:first').attr('dir') || '';
834
+
835
+ self.settings = {};
836
+
837
+ $.extend(self, {
838
+ order : 0,
839
+ settings : settings,
840
+ $input : $input,
841
+ tabIndex : $input.attr('tabindex') || '',
842
+ tagType : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,
843
+ rtl : /rtl/i.test(dir),
844
+
845
+ eventNS : '.selectize' + (++Selectize.count),
846
+ highlightedValue : null,
847
+ isBlurring : false,
848
+ isOpen : false,
849
+ isDisabled : false,
850
+ isRequired : $input.is('[required]'),
851
+ isInvalid : false,
852
+ isLocked : false,
853
+ isFocused : false,
854
+ isInputHidden : false,
855
+ isSetup : false,
856
+ isShiftDown : false,
857
+ isCmdDown : false,
858
+ isCtrlDown : false,
859
+ ignoreFocus : false,
860
+ ignoreBlur : false,
861
+ ignoreHover : false,
862
+ hasOptions : false,
863
+ currentResults : null,
864
+ lastValue : '',
865
+ lastValidValue : '',
866
+ lastOpenTarget : false,
867
+ caretPos : 0,
868
+ loading : 0,
869
+ loadedSearches : {},
870
+ isDropdownClosing: false,
871
+
872
+ $activeOption : null,
873
+ $activeItems : [],
874
+
875
+ optgroups : {},
876
+ options : {},
877
+ userOptions : {},
878
+ items : [],
879
+ renderCache : {},
880
+ onSearchChange : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)
881
+ });
882
+
883
+ self.sifter = new Sifter(this.options, {diacritics: settings.diacritics});
884
+
885
+ if (self.settings.options) {
886
+ for (i = 0, n = self.settings.options.length; i < n; i++) {
887
+ self.registerOption(self.settings.options[i]);
888
+ }
889
+ delete self.settings.options;
890
+ }
891
+
892
+ if (self.settings.optgroups) {
893
+ for (i = 0, n = self.settings.optgroups.length; i < n; i++) {
894
+ self.registerOptionGroup(self.settings.optgroups[i]);
895
+ }
896
+ delete self.settings.optgroups;
897
+ }
898
+
899
+ self.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');
900
+ if (typeof self.settings.hideSelected !== 'boolean') {
901
+ self.settings.hideSelected = self.settings.mode === 'multi';
902
+ }
903
+
904
+ self.initializePlugins(self.settings.plugins);
905
+ self.setupCallbacks();
906
+ self.setupTemplates();
907
+ self.setup();
908
+ };
909
+
910
+ MicroEvent.mixin(Selectize);
911
+ MicroPlugin.mixin(Selectize);
912
+
913
+ $.extend(Selectize.prototype, {
914
+
915
+ setup: function() {
916
+ var self = this;
917
+ var settings = self.settings;
918
+ var eventNS = self.eventNS;
919
+ var $window = $(window);
920
+ var $document = $(document);
921
+ var $input = self.$input;
922
+
923
+ var $wrapper;
924
+ var $control;
925
+ var $control_input;
926
+ var $dropdown;
927
+ var $dropdown_content;
928
+ var $dropdown_parent;
929
+ var inputMode;
930
+ var timeout_blur;
931
+ var timeout_focus;
932
+ var classes;
933
+ var classes_plugins;
934
+ var inputId;
935
+ var noArrowClass;
936
+
937
+ inputMode = self.settings.mode;
938
+ classes = $input.attr('class') || '';
939
+ noArrowClass = settings.showArrow ? '' : ' no-arrow';
940
+
941
+ $wrapper = $('<div>').addClass(settings.wrapperClass).addClass(classes + ' selectize-control').addClass(inputMode);
942
+ $control = $('<div>').addClass(settings.inputClass + noArrowClass + ' selectize-input items').appendTo($wrapper);
943
+ $control_input = $('<input type="text" autocomplete="new-password" autofill="no" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);
944
+ $dropdown_parent = $(settings.dropdownParent || $wrapper);
945
+ $dropdown = $('<div>').addClass(settings.dropdownClass).addClass(inputMode + ' selectize-dropdown').hide().appendTo($dropdown_parent);
946
+ $dropdown_content = $('<div>').addClass(settings.dropdownContentClass + ' selectize-dropdown-content').attr('tabindex', '-1').appendTo($dropdown);
947
+
948
+ if(inputId = $input.attr('id')) {
949
+ $control_input.attr('id', inputId + '-selectized');
950
+ $("label[for='"+inputId+"']").attr('for', inputId + '-selectized');
951
+ }
952
+
953
+ if(self.settings.copyClassesToDropdown) {
954
+ $dropdown.addClass(classes);
955
+ }
956
+
957
+ $wrapper.css({
958
+ width: $input[0].style.width
959
+ });
960
+
961
+ if (self.plugins.names.length) {
962
+ classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');
963
+ $wrapper.addClass(classes_plugins);
964
+ $dropdown.addClass(classes_plugins);
965
+ }
966
+
967
+ if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {
968
+ $input.attr('multiple', 'multiple');
969
+ }
970
+
971
+ if (self.settings.placeholder) {
972
+ $control_input.attr('placeholder', settings.placeholder);
973
+ }
974
+
975
+ if (!self.settings.search) {
976
+ $control_input.attr('readonly', true);
977
+ $control_input.attr('inputmode', 'none');
978
+ $control.css('cursor', 'pointer');
979
+ }
980
+
981
+ if (!self.settings.splitOn && self.settings.delimiter) {
982
+ var delimiterEscaped = self.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
983
+ self.settings.splitOn = new RegExp('\\s*' + delimiterEscaped + '+\\s*');
984
+ }
985
+
986
+ if ($input.attr('autocorrect')) {
987
+ $control_input.attr('autocorrect', $input.attr('autocorrect'));
988
+ }
989
+
990
+ if ($input.attr('autocapitalize')) {
991
+ $control_input.attr('autocapitalize', $input.attr('autocapitalize'));
992
+ }
993
+ if ($input.is('input')) {
994
+ $control_input[0].type = $input[0].type;
995
+ }
996
+
997
+ self.$wrapper = $wrapper;
998
+ self.$control = $control;
999
+ self.$control_input = $control_input;
1000
+ self.$dropdown = $dropdown;
1001
+ self.$dropdown_content = $dropdown_content;
1002
+
1003
+ $dropdown.on('mouseenter mousedown mouseup click', '[data-disabled]>[data-selectable]', function(e) { e.stopImmediatePropagation(); });
1004
+ $dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });
1005
+ $dropdown.on('mouseup click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });
1006
+ watchChildEvent($control, 'mouseup', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });
1007
+ autoGrow($control_input);
1008
+
1009
+ $control.on({
1010
+ mousedown : function() { return self.onMouseDown.apply(self, arguments); },
1011
+ click : function() { return self.onClick.apply(self, arguments); }
1012
+ });
1013
+
1014
+ $control_input.on({
1015
+ mousedown : function(e) {
1016
+ if (self.$control_input.val() !== '' || self.settings.openOnFocus) {
1017
+ e.stopPropagation();
1018
+ }
1019
+ },
1020
+ keydown : function() { return self.onKeyDown.apply(self, arguments); },
1021
+ keypress : function() { return self.onKeyPress.apply(self, arguments); },
1022
+ input : function() { return self.onInput.apply(self, arguments); },
1023
+ resize : function() { self.positionDropdown.apply(self, []); },
1024
+ blur : function() { return self.onBlur.apply(self, arguments); },
1025
+ focus : function() { return self.onFocus.apply(self, arguments); },
1026
+ paste : function() { return self.onPaste.apply(self, arguments); }
1027
+ });
1028
+
1029
+ $document.on('keydown' + eventNS, function(e) {
1030
+ self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];
1031
+ self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];
1032
+ self.isShiftDown = e.shiftKey;
1033
+ });
1034
+
1035
+ $document.on('keyup' + eventNS, function(e) {
1036
+ if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;
1037
+ if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;
1038
+ if (e.keyCode === KEY_CMD) self.isCmdDown = false;
1039
+ });
1040
+
1041
+ $document.on('mousedown' + eventNS, function(e) {
1042
+ if (self.isFocused) {
1043
+ if (
1044
+ e.target === self.$dropdown[0] ||
1045
+ self.$dropdown.has(e.target).length)
1046
+ {
1047
+ return false;
1048
+ }
1049
+ if (e.target !== self.$control[0]) {
1050
+ self.blur(e.target);
1051
+ }
1052
+ }
1053
+ });
1054
+
1055
+ $window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {
1056
+ if (self.isOpen) {
1057
+ self.positionDropdown.apply(self, arguments);
1058
+ }
1059
+ });
1060
+ $window.on('mousemove' + eventNS, function() {
1061
+ self.ignoreHover = self.settings.ignoreHover;
1062
+ });
1063
+
1064
+ var inputPlaceholder = $('<div></div>');
1065
+ var inputChildren = $input.children().detach();
1066
+
1067
+ $input.replaceWith(inputPlaceholder);
1068
+ inputPlaceholder.replaceWith($input);
1069
+
1070
+ this.revertSettings = {
1071
+ $children : inputChildren,
1072
+ tabindex : $input.attr('tabindex')
1073
+ };
1074
+
1075
+ $input.attr('tabindex', -1).hide().after(self.$wrapper);
1076
+
1077
+ if (Array.isArray(settings.items)) {
1078
+ self.lastValidValue = settings.items;
1079
+ self.setValue(settings.items);
1080
+ delete settings.items;
1081
+ }
1082
+
1083
+ if (SUPPORTS_VALIDITY_API) {
1084
+ $input.on('invalid' + eventNS, function(e) {
1085
+ e.preventDefault();
1086
+ self.isInvalid = true;
1087
+ self.refreshState();
1088
+ });
1089
+ }
1090
+
1091
+ self.updateOriginalInput();
1092
+ self.refreshItems();
1093
+ self.refreshState();
1094
+ self.updatePlaceholder();
1095
+ self.isSetup = true;
1096
+
1097
+ if ($input.is(':disabled')) {
1098
+ self.disable();
1099
+ }
1100
+
1101
+ self.on('change', this.onChange);
1102
+
1103
+ $input.data('selectize', self);
1104
+ $input.addClass('selectized');
1105
+ self.trigger('initialize');
1106
+
1107
+ if (settings.preload === true) {
1108
+ self.onSearchChange('');
1109
+ }
1110
+
1111
+ },
1112
+
1113
+ setupTemplates: function() {
1114
+ var self = this;
1115
+ var field_label = self.settings.labelField;
1116
+ var field_value = self.settings.valueField;
1117
+ var field_optgroup = self.settings.optgroupLabelField;
1118
+
1119
+ var templates = {
1120
+ 'optgroup': function(data) {
1121
+ return '<div class="optgroup">' + data.html + '</div>';
1122
+ },
1123
+ 'optgroup_header': function(data, escape) {
1124
+ return '<div class="optgroup-header">' + escape(data[field_optgroup]) + '</div>';
1125
+ },
1126
+ 'option': function(data, escape) {
1127
+ var classes = data.classes ? ' ' + data.classes : '';
1128
+ classes += data[field_value] === '' ? ' selectize-dropdown-emptyoptionlabel' : '';
1129
+
1130
+ var styles = data.styles ? ' style="' + data.styles + '"': '';
1131
+ return '<div' + styles + ' class="option' + classes + '">' + escape(data[field_label]) + '</div>';
1132
+ },
1133
+ 'item': function(data, escape) {
1134
+ return '<div class="item">' + escape(data[field_label]) + '</div>';
1135
+ },
1136
+ 'option_create': function(data, escape) {
1137
+ return '<div class="create">Add <strong>' + escape(data.input) + '</strong>&#x2026;</div>';
1138
+ }
1139
+ };
1140
+
1141
+ self.settings.render = $.extend({}, templates, self.settings.render);
1142
+ },
1143
+
1144
+ setupCallbacks: function() {
1145
+ var key, fn, callbacks = {
1146
+ 'initialize' : 'onInitialize',
1147
+ 'change' : 'onChange',
1148
+ 'item_add' : 'onItemAdd',
1149
+ 'item_remove' : 'onItemRemove',
1150
+ 'clear' : 'onClear',
1151
+ 'option_add' : 'onOptionAdd',
1152
+ 'option_remove' : 'onOptionRemove',
1153
+ 'option_clear' : 'onOptionClear',
1154
+ 'optgroup_add' : 'onOptionGroupAdd',
1155
+ 'optgroup_remove' : 'onOptionGroupRemove',
1156
+ 'optgroup_clear' : 'onOptionGroupClear',
1157
+ 'dropdown_open' : 'onDropdownOpen',
1158
+ 'dropdown_close' : 'onDropdownClose',
1159
+ 'type' : 'onType',
1160
+ 'load' : 'onLoad',
1161
+ 'focus' : 'onFocus',
1162
+ 'blur' : 'onBlur',
1163
+ 'dropdown_item_activate' : 'onDropdownItemActivate',
1164
+ 'dropdown_item_deactivate' : 'onDropdownItemDeactivate'
1165
+ };
1166
+
1167
+ for (key in callbacks) {
1168
+ if (callbacks.hasOwnProperty(key)) {
1169
+ fn = this.settings[callbacks[key]];
1170
+ if (fn) this.on(key, fn);
1171
+ }
1172
+ }
1173
+ },
1174
+
1175
+ onClick: function(e) {
1176
+ var self = this;
1177
+
1178
+ if (self.isDropdownClosing) {
1179
+ return;
1180
+ }
1181
+
1182
+ if (!self.isFocused || !self.isOpen) {
1183
+ self.focus();
1184
+ e.preventDefault();
1185
+ }
1186
+ },
1187
+
1188
+ onMouseDown: function(e) {
1189
+ var self = this;
1190
+ var defaultPrevented = e.isDefaultPrevented();
1191
+ var $target = $(e.target);
1192
+
1193
+ if (e.button && e.button === 2) {
1194
+ return;
1195
+ }
1196
+
1197
+ if (!self.isFocused) {
1198
+ if (!defaultPrevented) {
1199
+ window.setTimeout(function () {
1200
+ if (!self.isOpen) {
1201
+ self.focus();
1202
+ }
1203
+ }, 0);
1204
+ }
1205
+ }
1206
+ if ($target !== self.$control_input[0] || self.$control_input.val() === '') {
1207
+ if (self.settings.mode === 'single') {
1208
+ self.isOpen ? self.close() : self.open();
1209
+ } else {
1210
+ if (!defaultPrevented) {
1211
+ self.setActiveItem(null);
1212
+ }
1213
+ if (!self.settings.openOnFocus) {
1214
+ if (self.isOpen && $target === self.lastOpenTarget) {
1215
+ self.close();
1216
+ self.lastOpenTarget = false;
1217
+ } else if (!self.isOpen) {
1218
+ self.refreshOptions();
1219
+ self.open();
1220
+ self.lastOpenTarget = $target;
1221
+ } else {
1222
+ self.lastOpenTarget = $target;
1223
+ }
1224
+ }
1225
+ }
1226
+ return false;
1227
+ }
1228
+ },
1229
+
1230
+ onChange: function() {
1231
+ var self = this;
1232
+ if (self.getValue() !== "") {
1233
+ self.lastValidValue = self.getValue();
1234
+ }
1235
+ this.$input.trigger('input');
1236
+ this.$input.trigger('change');
1237
+ },
1238
+
1239
+ onPaste: function(e) {
1240
+ var self = this;
1241
+
1242
+ if (self.isFull() || self.isInputHidden || self.isLocked) {
1243
+ e.preventDefault();
1244
+ return;
1245
+ }
1246
+
1247
+ if (self.settings.splitOn) {
1248
+
1249
+ setTimeout(function() {
1250
+ var pastedText = self.$control_input.val();
1251
+ if(!pastedText.match(self.settings.splitOn)){ return }
1252
+
1253
+ var splitInput = pastedText
1254
+ .trim()
1255
+ .split(self.settings.splitOn);
1256
+ for (var i = 0, n = splitInput.length; i < n; i++) {
1257
+ self.createItem(splitInput[i]);
1258
+ }
1259
+ }, 0);
1260
+ }
1261
+ },
1262
+
1263
+ onKeyPress: function(e) {
1264
+ if (this.isLocked) return e && e.preventDefault();
1265
+ var character = String.fromCharCode(e.keyCode || e.which);
1266
+ if (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {
1267
+ this.createItem();
1268
+ e.preventDefault();
1269
+ return false;
1270
+ }
1271
+ },
1272
+
1273
+ onKeyDown: function(e) {
1274
+ var isInput = e.target === this.$control_input[0];
1275
+ var self = this;
1276
+
1277
+ if (self.isLocked) {
1278
+ if (e.keyCode !== KEY_TAB) {
1279
+ e.preventDefault();
1280
+ }
1281
+ return;
1282
+ }
1283
+
1284
+ switch (e.keyCode) {
1285
+ case KEY_A:
1286
+ if (self.isCmdDown) {
1287
+ self.selectAll();
1288
+ return;
1289
+ }
1290
+ break;
1291
+ case KEY_ESC:
1292
+ if (self.isOpen) {
1293
+ e.preventDefault();
1294
+ e.stopPropagation();
1295
+ self.close();
1296
+ }
1297
+ return;
1298
+ case KEY_N:
1299
+ if (!e.ctrlKey || e.altKey) break;
1300
+ case KEY_DOWN:
1301
+ if (!self.isOpen && self.hasOptions) {
1302
+ self.open();
1303
+ } else if (self.$activeOption) {
1304
+ self.ignoreHover = true;
1305
+ var $next = self.getAdjacentOption(self.$activeOption, 1);
1306
+ if ($next.length) self.setActiveOption($next, true, true);
1307
+ }
1308
+ e.preventDefault();
1309
+ return;
1310
+ case KEY_P:
1311
+ if (!e.ctrlKey || e.altKey) break;
1312
+ case KEY_UP:
1313
+ if (self.$activeOption) {
1314
+ self.ignoreHover = true;
1315
+ var $prev = self.getAdjacentOption(self.$activeOption, -1);
1316
+ if ($prev.length) self.setActiveOption($prev, true, true);
1317
+ }
1318
+ e.preventDefault();
1319
+ return;
1320
+ case KEY_RETURN:
1321
+ if (self.isOpen && self.$activeOption) {
1322
+ self.onOptionSelect({currentTarget: self.$activeOption});
1323
+ e.preventDefault();
1324
+ }
1325
+ return;
1326
+ case KEY_LEFT:
1327
+ self.advanceSelection(-1, e);
1328
+ return;
1329
+ case KEY_RIGHT:
1330
+ self.advanceSelection(1, e);
1331
+ return;
1332
+ case KEY_TAB:
1333
+ if (self.settings.selectOnTab && self.isOpen && self.$activeOption) {
1334
+ self.onOptionSelect({currentTarget: self.$activeOption});
1335
+
1336
+ if (!self.isFull()) {
1337
+ e.preventDefault();
1338
+ }
1339
+ }
1340
+ if (self.settings.create && self.createItem() && self.settings.showAddOptionOnCreate) {
1341
+ e.preventDefault();
1342
+ }
1343
+ return;
1344
+ case KEY_BACKSPACE:
1345
+ case KEY_DELETE:
1346
+ self.deleteSelection(e);
1347
+ return;
1348
+ }
1349
+
1350
+ if ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {
1351
+ e.preventDefault();
1352
+ return;
1353
+ }
1354
+ },
1355
+
1356
+ onInput: function(e) {
1357
+ var self = this;
1358
+
1359
+ var value = self.$control_input.val() || '';
1360
+ if (self.lastValue !== value) {
1361
+ self.lastValue = value;
1362
+ self.onSearchChange(value);
1363
+ self.refreshOptions();
1364
+ self.trigger('type', value);
1365
+ }
1366
+ },
1367
+
1368
+ onSearchChange: function(value) {
1369
+ var self = this;
1370
+ var fn = self.settings.load;
1371
+ if (!fn) return;
1372
+ if (self.loadedSearches.hasOwnProperty(value)) return;
1373
+ self.loadedSearches[value] = true;
1374
+ self.load(function(callback) {
1375
+ fn.apply(self, [value, callback]);
1376
+ });
1377
+ },
1378
+
1379
+ onFocus: function(e) {
1380
+ var self = this;
1381
+ var wasFocused = self.isFocused;
1382
+
1383
+ if (self.isDisabled) {
1384
+ self.blur();
1385
+ e && e.preventDefault();
1386
+ return false;
1387
+ }
1388
+
1389
+ if (self.ignoreFocus) return;
1390
+ self.isFocused = true;
1391
+ if (self.settings.preload === 'focus') self.onSearchChange('');
1392
+
1393
+ if (!wasFocused) self.trigger('focus');
1394
+
1395
+ if (!self.$activeItems.length) {
1396
+ self.showInput();
1397
+ self.setActiveItem(null);
1398
+ self.refreshOptions(!!self.settings.openOnFocus);
1399
+ }
1400
+
1401
+ self.refreshState();
1402
+ },
1403
+
1404
+ onBlur: function(e, dest) {
1405
+ var self = this;
1406
+
1407
+ if (!self.isFocused) return;
1408
+ self.isFocused = false;
1409
+
1410
+ if (self.ignoreFocus) {
1411
+ return;
1412
+ }
1413
+
1414
+ var deactivate = function() {
1415
+ self.close();
1416
+ self.setTextboxValue('');
1417
+ self.setActiveItem(null);
1418
+ self.setActiveOption(null);
1419
+ self.setCaret(self.items.length);
1420
+ self.refreshState();
1421
+
1422
+ dest && dest.focus && dest.focus();
1423
+
1424
+ self.isBlurring = false;
1425
+ self.ignoreFocus = false;
1426
+ self.trigger('blur');
1427
+ };
1428
+
1429
+ self.isBlurring = true;
1430
+ self.ignoreFocus = true;
1431
+ if (self.settings.create && self.settings.createOnBlur) {
1432
+ self.createItem(null, false, deactivate);
1433
+ } else {
1434
+ deactivate();
1435
+ }
1436
+ },
1437
+
1438
+ onOptionHover: function(e) {
1439
+ if (this.ignoreHover) return;
1440
+ this.setActiveOption(e.currentTarget, false);
1441
+ },
1442
+
1443
+ onOptionSelect: function(e) {
1444
+ var value, $target, $option, self = this;
1445
+
1446
+ if (e.preventDefault) {
1447
+ e.preventDefault();
1448
+ e.stopPropagation();
1449
+ }
1450
+
1451
+ if (e.button && e.button === 2) {
1452
+ return;
1453
+ }
1454
+
1455
+ $target = $(e.currentTarget);
1456
+ if ($target.hasClass('create')) {
1457
+ self.createItem(null, function() {
1458
+ if (self.settings.closeAfterSelect) {
1459
+ self.close();
1460
+ }
1461
+ });
1462
+ } else {
1463
+ value = $target.attr('data-value');
1464
+ if (typeof value !== 'undefined') {
1465
+ self.lastQuery = null;
1466
+ self.setTextboxValue('');
1467
+ self.addItem(value);
1468
+ if (self.settings.closeAfterSelect) {
1469
+ self.close();
1470
+ } else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {
1471
+ self.setActiveOption(self.getOption(value));
1472
+ }
1473
+ }
1474
+ }
1475
+ },
1476
+
1477
+ onItemSelect: function(e) {
1478
+ var self = this;
1479
+
1480
+ if (self.isLocked) return;
1481
+ if (self.settings.mode === 'multi') {
1482
+ e.preventDefault();
1483
+ self.setActiveItem(e.currentTarget, e);
1484
+ }
1485
+ },
1486
+
1487
+ load: function(fn) {
1488
+ var self = this;
1489
+ var $wrapper = self.$wrapper.addClass(self.settings.loadingClass);
1490
+
1491
+ self.loading++;
1492
+ fn.apply(self, [function(results) {
1493
+ self.loading = Math.max(self.loading - 1, 0);
1494
+ if (results && results.length) {
1495
+ self.addOption(results);
1496
+ self.refreshOptions(self.isFocused && !self.isInputHidden);
1497
+ }
1498
+ if (!self.loading) {
1499
+ $wrapper.removeClass(self.settings.loadingClass);
1500
+ }
1501
+ self.trigger('load', results);
1502
+ }]);
1503
+ },
1504
+
1505
+ getTextboxValue: function() {
1506
+ var $input = this.$control_input;
1507
+ return $input.val();
1508
+ },
1509
+
1510
+ setTextboxValue: function(value) {
1511
+ var $input = this.$control_input;
1512
+ var changed = $input.val() !== value;
1513
+ if (changed) {
1514
+ $input.val(value).triggerHandler('update');
1515
+ this.lastValue = value;
1516
+ }
1517
+ },
1518
+
1519
+ getValue: function() {
1520
+ if (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {
1521
+ return this.items;
1522
+ } else {
1523
+ return this.items.join(this.settings.delimiter);
1524
+ }
1525
+ },
1526
+
1527
+ setValue: function(value, silent) {
1528
+ const items = Array.isArray(value) ? value : [value];
1529
+ if (items.join('') === this.items.join('')) {
1530
+ return;
1531
+ }
1532
+
1533
+ var events = silent ? [] : ['change'];
1534
+
1535
+ debounce_events(this, events, function() {
1536
+ this.clear(silent);
1537
+ this.addItems(value, silent);
1538
+ });
1539
+ },
1540
+
1541
+ setMaxItems: function(value){
1542
+ if(value === 0) value = null;
1543
+ this.settings.maxItems = value;
1544
+ this.settings.mode = this.settings.mode || (this.settings.maxItems === 1 ? 'single' : 'multi');
1545
+ this.refreshState();
1546
+ },
1547
+
1548
+ setActiveItem: function($item, e) {
1549
+ var self = this;
1550
+ var eventName;
1551
+ var i, idx, begin, end, item, swap;
1552
+ var $last;
1553
+
1554
+ if (self.settings.mode === 'single') return;
1555
+ $item = $($item);
1556
+
1557
+ if (!$item.length) {
1558
+ $(self.$activeItems).removeClass('active');
1559
+ self.$activeItems = [];
1560
+ if (self.isFocused) {
1561
+ self.showInput();
1562
+ }
1563
+ return;
1564
+ }
1565
+
1566
+ eventName = e && e.type.toLowerCase();
1567
+
1568
+ if (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {
1569
+ $last = self.$control.children('.active:last');
1570
+ begin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);
1571
+ end = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);
1572
+ if (begin > end) {
1573
+ swap = begin;
1574
+ begin = end;
1575
+ end = swap;
1576
+ }
1577
+ for (i = begin; i <= end; i++) {
1578
+ item = self.$control[0].childNodes[i];
1579
+ if (self.$activeItems.indexOf(item) === -1) {
1580
+ $(item).addClass('active');
1581
+ self.$activeItems.push(item);
1582
+ }
1583
+ }
1584
+ e.preventDefault();
1585
+ } else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {
1586
+ if ($item.hasClass('active')) {
1587
+ idx = self.$activeItems.indexOf($item[0]);
1588
+ self.$activeItems.splice(idx, 1);
1589
+ $item.removeClass('active');
1590
+ } else {
1591
+ self.$activeItems.push($item.addClass('active')[0]);
1592
+ }
1593
+ } else {
1594
+ $(self.$activeItems).removeClass('active');
1595
+ self.$activeItems = [$item.addClass('active')[0]];
1596
+ }
1597
+
1598
+ self.hideInput();
1599
+ if (!this.isFocused) {
1600
+ self.focus();
1601
+ }
1602
+ },
1603
+
1604
+ setActiveOption: function($option, scroll, animate) {
1605
+ var height_menu, height_item, y;
1606
+ var scroll_top, scroll_bottom;
1607
+ var self = this;
1608
+
1609
+ if (self.$activeOption) {
1610
+ self.$activeOption.removeClass('active');
1611
+ self.trigger('dropdown_item_deactivate', self.$activeOption.attr('data-value'));
1612
+ }
1613
+ self.$activeOption = null;
1614
+
1615
+ $option = $($option);
1616
+ if (!$option.length) return;
1617
+
1618
+ self.$activeOption = $option.addClass('active');
1619
+ if (self.isOpen) self.trigger('dropdown_item_activate', self.$activeOption.attr('data-value'));
1620
+
1621
+ if (scroll || !isset(scroll)) {
1622
+
1623
+ height_menu = self.$dropdown_content.height();
1624
+ height_item = self.$activeOption.outerHeight(true);
1625
+ scroll = self.$dropdown_content.scrollTop() || 0;
1626
+ y = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;
1627
+ scroll_top = y;
1628
+ scroll_bottom = y - height_menu + height_item;
1629
+
1630
+ if (y + height_item > height_menu + scroll) {
1631
+ self.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);
1632
+ } else if (y < scroll) {
1633
+ self.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);
1634
+ }
1635
+
1636
+ }
1637
+ },
1638
+
1639
+ selectAll: function() {
1640
+ var self = this;
1641
+ if (self.settings.mode === 'single') return;
1642
+
1643
+ self.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));
1644
+ if (self.$activeItems.length) {
1645
+ self.hideInput();
1646
+ self.close();
1647
+ }
1648
+ self.focus();
1649
+ },
1650
+
1651
+ hideInput: function() {
1652
+ var self = this;
1653
+
1654
+ self.setTextboxValue('');
1655
+ self.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : 0});
1656
+ self.isInputHidden = true;
1657
+ },
1658
+
1659
+ showInput: function() {
1660
+ this.$control_input.css({opacity: 1, position: 'relative', left: 0});
1661
+ this.isInputHidden = false;
1662
+ },
1663
+
1664
+ focus: function() {
1665
+ var self = this;
1666
+ if (self.isDisabled) return self;
1667
+
1668
+ self.ignoreFocus = true;
1669
+ self.$control_input[0].focus();
1670
+ window.setTimeout(function() {
1671
+ self.ignoreFocus = false;
1672
+ self.onFocus();
1673
+ }, 0);
1674
+ return self;
1675
+ },
1676
+
1677
+ blur: function(dest) {
1678
+ this.$control_input[0].blur();
1679
+ this.onBlur(null, dest);
1680
+ return this;
1681
+ },
1682
+
1683
+ getScoreFunction: function(query) {
1684
+ return this.sifter.getScoreFunction(query, this.getSearchOptions());
1685
+ },
1686
+
1687
+ getSearchOptions: function() {
1688
+ var settings = this.settings;
1689
+ var sort = settings.sortField;
1690
+ if (typeof sort === 'string') {
1691
+ sort = [{field: sort}];
1692
+ }
1693
+
1694
+ return {
1695
+ fields : settings.searchField,
1696
+ conjunction : settings.searchConjunction,
1697
+ sort : sort,
1698
+ nesting : settings.nesting,
1699
+ filter : settings.filter,
1700
+ respect_word_boundaries : settings.respect_word_boundaries
1701
+ };
1702
+ },
1703
+
1704
+ search: function(query) {
1705
+ var i, value, score, result, calculateScore;
1706
+ var self = this;
1707
+ var settings = self.settings;
1708
+ var options = this.getSearchOptions();
1709
+
1710
+ if (settings.score) {
1711
+ calculateScore = self.settings.score.apply(this, [query]);
1712
+ if (typeof calculateScore !== 'function') {
1713
+ throw new Error('Selectize "score" setting must be a function that returns a function');
1714
+ }
1715
+ }
1716
+
1717
+ if (query !== self.lastQuery) {
1718
+ if (settings.normalize) query = query.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
1719
+ self.lastQuery = query;
1720
+ result = self.sifter.search(query, $.extend(options, {score: calculateScore}));
1721
+ self.currentResults = result;
1722
+ } else {
1723
+ result = $.extend(true, {}, self.currentResults);
1724
+ }
1725
+
1726
+ if (settings.hideSelected) {
1727
+ for (i = result.items.length - 1; i >= 0; i--) {
1728
+ if (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {
1729
+ result.items.splice(i, 1);
1730
+ }
1731
+ }
1732
+ }
1733
+
1734
+ return result;
1735
+ },
1736
+
1737
+ refreshOptions: function(triggerDropdown) {
1738
+ var i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;
1739
+ var $active, $active_before, $create;
1740
+
1741
+ if (typeof triggerDropdown === 'undefined') {
1742
+ triggerDropdown = true;
1743
+ }
1744
+
1745
+ var self = this;
1746
+ var query = (self.$control_input.val()).trim();
1747
+ var results = self.search(query);
1748
+ var $dropdown_content = self.$dropdown_content;
1749
+ var active_before = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));
1750
+
1751
+ n = results.items.length;
1752
+ if (typeof self.settings.maxOptions === 'number') {
1753
+ n = Math.min(n, self.settings.maxOptions);
1754
+ }
1755
+
1756
+ groups = {};
1757
+ groups_order = [];
1758
+
1759
+ for (i = 0; i < n; i++) {
1760
+ option = self.options[results.items[i].id];
1761
+ option_html = self.render('option', option);
1762
+ optgroup = option[self.settings.optgroupField] || '';
1763
+ optgroups = Array.isArray(optgroup) ? optgroup : [optgroup];
1764
+
1765
+ for (j = 0, k = optgroups && optgroups.length; j < k; j++) {
1766
+ optgroup = optgroups[j];
1767
+ if (!self.optgroups.hasOwnProperty(optgroup) && typeof self.settings.optionGroupRegister === 'function') {
1768
+ var regGroup;
1769
+ if (regGroup = self.settings.optionGroupRegister.apply(self, [optgroup])) {
1770
+ self.registerOptionGroup(regGroup);
1771
+ }
1772
+ }
1773
+ if (!self.optgroups.hasOwnProperty(optgroup)) {
1774
+ optgroup = '';
1775
+ }
1776
+ if (!groups.hasOwnProperty(optgroup)) {
1777
+ groups[optgroup] = document.createDocumentFragment();
1778
+ groups_order.push(optgroup);
1779
+ }
1780
+ groups[optgroup].appendChild(option_html);
1781
+ }
1782
+ }
1783
+
1784
+ if (this.settings.lockOptgroupOrder) {
1785
+ groups_order.sort(function(a, b) {
1786
+ var a_order = self.optgroups[a] && self.optgroups[a].$order || 0;
1787
+ var b_order = self.optgroups[b] && self.optgroups[b].$order || 0;
1788
+ return a_order - b_order;
1789
+ });
1790
+ }
1791
+
1792
+ html = document.createDocumentFragment();
1793
+ for (i = 0, n = groups_order.length; i < n; i++) {
1794
+ optgroup = groups_order[i];
1795
+ if (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {
1796
+ html_children = document.createDocumentFragment();
1797
+ html_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));
1798
+ html_children.appendChild(groups[optgroup]);
1799
+
1800
+ html.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {
1801
+ html: domToString(html_children),
1802
+ dom: html_children
1803
+ })));
1804
+ } else {
1805
+ html.appendChild(groups[optgroup]);
1806
+ }
1807
+ }
1808
+
1809
+ $dropdown_content.html(html);
1810
+
1811
+ if (self.settings.highlight) {
1812
+ $dropdown_content.removeHighlight();
1813
+ if (results.query.length && results.tokens.length) {
1814
+ for (i = 0, n = results.tokens.length; i < n; i++) {
1815
+ highlight($dropdown_content, results.tokens[i].regex);
1816
+ }
1817
+ }
1818
+ }
1819
+
1820
+ if (!self.settings.hideSelected) {
1821
+ self.$dropdown.find('.selected').removeClass('selected');
1822
+
1823
+ for (i = 0, n = self.items.length; i < n; i++) {
1824
+ self.getOption(self.items[i]).addClass('selected');
1825
+ }
1826
+ }
1827
+
1828
+ if (self.settings.dropdownSize.sizeType !== 'auto' && self.isOpen) {
1829
+ self.setupDropdownHeight();
1830
+ }
1831
+
1832
+ self.positionDropdown();
1833
+
1834
+ has_create_option = self.canCreate(query);
1835
+ if (has_create_option) {
1836
+ if(self.settings.showAddOptionOnCreate) {
1837
+ $dropdown_content.prepend(self.render('option_create', {input: query}));
1838
+ $create = $($dropdown_content[0].childNodes[0]);
1839
+ }
1840
+ }
1841
+
1842
+ self.hasOptions = results.items.length > 0 || ( has_create_option && self.settings.showAddOptionOnCreate ) || self.settings.setFirstOptionActive;
1843
+
1844
+ if (self.hasOptions) {
1845
+ if (results.items.length > 0) {
1846
+ $active_before = active_before && self.getOption(active_before);
1847
+ if (results.query !== "" && self.settings.setFirstOptionActive) {
1848
+ $active = $dropdown_content.find('[data-selectable]:first')
1849
+ } else if (results.query !== "" && $active_before && $active_before.length) {
1850
+ $active = $active_before;
1851
+ } else if (self.settings.mode === 'single' && self.items.length) {
1852
+ $active = self.getOption(self.items[0]);
1853
+ }
1854
+ if (!$active || !$active.length) {
1855
+ if ($create && !self.settings.addPrecedence) {
1856
+ $active = self.getAdjacentOption($create, 1);
1857
+ } else {
1858
+ $active = $dropdown_content.find('[data-selectable]:first');
1859
+ }
1860
+ }
1861
+ } else {
1862
+ $active = $create;
1863
+ }
1864
+ self.setActiveOption($active);
1865
+ if (triggerDropdown && !self.isOpen) { self.open(); }
1866
+ } else {
1867
+ self.setActiveOption(null);
1868
+ if (triggerDropdown && self.isOpen) { self.close(); }
1869
+ }
1870
+ },
1871
+
1872
+ addOption: function(data) {
1873
+ var i, n, value, self = this;
1874
+
1875
+ if (Array.isArray(data)) {
1876
+ for (i = 0, n = data.length; i < n; i++) {
1877
+ self.addOption(data[i]);
1878
+ }
1879
+ return;
1880
+ }
1881
+
1882
+ if (value = self.registerOption(data)) {
1883
+ self.userOptions[value] = true;
1884
+ self.lastQuery = null;
1885
+ self.trigger('option_add', value, data);
1886
+ }
1887
+ },
1888
+
1889
+ registerOption: function(data) {
1890
+ var key = hash_key(data[this.settings.valueField]);
1891
+ if (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;
1892
+ data.$order = data.$order || ++this.order;
1893
+ this.options[key] = data;
1894
+ return key;
1895
+ },
1896
+
1897
+ registerOptionGroup: function(data) {
1898
+ var key = hash_key(data[this.settings.optgroupValueField]);
1899
+ if (!key) return false;
1900
+
1901
+ data.$order = data.$order || ++this.order;
1902
+ this.optgroups[key] = data;
1903
+ return key;
1904
+ },
1905
+
1906
+ addOptionGroup: function(id, data) {
1907
+ data[this.settings.optgroupValueField] = id;
1908
+ if (id = this.registerOptionGroup(data)) {
1909
+ this.trigger('optgroup_add', id, data);
1910
+ }
1911
+ },
1912
+
1913
+ removeOptionGroup: function(id) {
1914
+ if (this.optgroups.hasOwnProperty(id)) {
1915
+ delete this.optgroups[id];
1916
+ this.renderCache = {};
1917
+ this.trigger('optgroup_remove', id);
1918
+ }
1919
+ },
1920
+
1921
+ clearOptionGroups: function() {
1922
+ this.optgroups = {};
1923
+ this.renderCache = {};
1924
+ this.trigger('optgroup_clear');
1925
+ },
1926
+
1927
+ updateOption: function(value, data) {
1928
+ var self = this;
1929
+ var $item, $item_new;
1930
+ var value_new, index_item, cache_items, cache_options, order_old;
1931
+
1932
+ value = hash_key(value);
1933
+ value_new = hash_key(data[self.settings.valueField]);
1934
+
1935
+ if (value === null) return;
1936
+ if (!self.options.hasOwnProperty(value)) return;
1937
+ if (typeof value_new !== 'string') throw new Error('Value must be set in option data');
1938
+
1939
+ order_old = self.options[value].$order;
1940
+
1941
+ if (value_new !== value) {
1942
+ delete self.options[value];
1943
+ index_item = self.items.indexOf(value);
1944
+ if (index_item !== -1) {
1945
+ self.items.splice(index_item, 1, value_new);
1946
+ }
1947
+ }
1948
+ data.$order = data.$order || order_old;
1949
+ self.options[value_new] = data;
1950
+
1951
+ cache_items = self.renderCache['item'];
1952
+ cache_options = self.renderCache['option'];
1953
+
1954
+ if (cache_items) {
1955
+ delete cache_items[value];
1956
+ delete cache_items[value_new];
1957
+ }
1958
+ if (cache_options) {
1959
+ delete cache_options[value];
1960
+ delete cache_options[value_new];
1961
+ }
1962
+
1963
+ if (self.items.indexOf(value_new) !== -1) {
1964
+ $item = self.getItem(value);
1965
+ $item_new = $(self.render('item', data));
1966
+ if ($item.hasClass('active')) $item_new.addClass('active');
1967
+ $item.replaceWith($item_new);
1968
+ }
1969
+
1970
+ self.lastQuery = null;
1971
+
1972
+ if (self.isOpen) {
1973
+ self.refreshOptions(false);
1974
+ }
1975
+ },
1976
+
1977
+ removeOption: function(value, silent) {
1978
+ var self = this;
1979
+ value = hash_key(value);
1980
+
1981
+ var cache_items = self.renderCache['item'];
1982
+ var cache_options = self.renderCache['option'];
1983
+ if (cache_items) delete cache_items[value];
1984
+ if (cache_options) delete cache_options[value];
1985
+
1986
+ delete self.userOptions[value];
1987
+ delete self.options[value];
1988
+ self.lastQuery = null;
1989
+ self.trigger('option_remove', value);
1990
+ self.removeItem(value, silent);
1991
+ },
1992
+
1993
+ clearOptions: function(silent) {
1994
+ var self = this;
1995
+
1996
+ self.loadedSearches = {};
1997
+ self.userOptions = {};
1998
+ self.renderCache = {};
1999
+ var options = self.options;
2000
+ $.each(self.options, function(key, value) {
2001
+ if(self.items.indexOf(key) == -1) {
2002
+ delete options[key];
2003
+ }
2004
+ });
2005
+ self.options = self.sifter.items = options;
2006
+ self.lastQuery = null;
2007
+ self.trigger('option_clear');
2008
+ self.clear(silent);
2009
+ },
2010
+
2011
+ getOption: function(value) {
2012
+ return this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));
2013
+ },
2014
+
2015
+ getFirstOption: function() {
2016
+ var $options = this.$dropdown.find('[data-selectable]');
2017
+ return $options.length > 0 ? $options.eq(0) : $();
2018
+ },
2019
+
2020
+ getAdjacentOption: function($option, direction) {
2021
+ var $options = this.$dropdown.find('[data-selectable]');
2022
+ var index = $options.index($option) + direction;
2023
+
2024
+ return index >= 0 && index < $options.length ? $options.eq(index) : $();
2025
+ },
2026
+
2027
+ getElementWithValue: function(value, $els) {
2028
+ value = hash_key(value);
2029
+
2030
+ if (typeof value !== 'undefined' && value !== null) {
2031
+ for (var i = 0, n = $els.length; i < n; i++) {
2032
+ if ($els[i].getAttribute('data-value') === value) {
2033
+ return $($els[i]);
2034
+ }
2035
+ }
2036
+ }
2037
+
2038
+ return $();
2039
+ },
2040
+
2041
+ getElementWithTextContent: function(textContent, ignoreCase ,$els) {
2042
+ textContent = hash_key(textContent);
2043
+
2044
+ if (typeof textContent !== 'undefined' && textContent !== null) {
2045
+ for (var i = 0, n = $els.length; i < n; i++) {
2046
+ var eleTextContent = $els[i].textContent
2047
+ if (ignoreCase == true) {
2048
+ eleTextContent = (eleTextContent !== null) ? eleTextContent.toLowerCase() : null;
2049
+ textContent = textContent.toLowerCase();
2050
+ }
2051
+ if (eleTextContent === textContent) {
2052
+ return $($els[i]);
2053
+ }
2054
+ }
2055
+ }
2056
+
2057
+ return $();
2058
+ },
2059
+
2060
+ getItem: function(value) {
2061
+ return this.getElementWithValue(value, this.$control.children());
2062
+ },
2063
+
2064
+ getFirstItemMatchedByTextContent: function(textContent, ignoreCase) {
2065
+ ignoreCase = (ignoreCase !== null && ignoreCase === true) ? true : false;
2066
+ return this.getElementWithTextContent(textContent, ignoreCase, this.$dropdown_content.find('[data-selectable]'));
2067
+ },
2068
+
2069
+ addItems: function(values, silent) {
2070
+ this.buffer = document.createDocumentFragment();
2071
+
2072
+ var childNodes = this.$control[0].childNodes;
2073
+ for (var i = 0; i < childNodes.length; i++) {
2074
+ this.buffer.appendChild(childNodes[i]);
2075
+ }
2076
+
2077
+ var items = Array.isArray(values) ? values : [values];
2078
+ for (var i = 0, n = items.length; i < n; i++) {
2079
+ this.isPending = (i < n - 1);
2080
+ this.addItem(items[i], silent);
2081
+ }
2082
+
2083
+ var control = this.$control[0];
2084
+ control.insertBefore(this.buffer, control.firstChild);
2085
+
2086
+ this.buffer = null;
2087
+ },
2088
+
2089
+ addItem: function(value, silent) {
2090
+ var events = silent ? [] : ['change'];
2091
+
2092
+ debounce_events(this, events, function() {
2093
+ var $item, $option, $options;
2094
+ var self = this;
2095
+ var inputMode = self.settings.mode;
2096
+ var i, active, value_next, wasFull;
2097
+ value = hash_key(value);
2098
+
2099
+ if (self.items.indexOf(value) !== -1) {
2100
+ if (inputMode === 'single') self.close();
2101
+ return;
2102
+ }
2103
+
2104
+ if (!self.options.hasOwnProperty(value)) return;
2105
+ if (inputMode === 'single') self.clear(silent);
2106
+ if (inputMode === 'multi' && self.isFull()) return;
2107
+
2108
+ $item = $(self.render('item', self.options[value]));
2109
+ wasFull = self.isFull();
2110
+ self.items.splice(self.caretPos, 0, value);
2111
+ self.insertAtCaret($item);
2112
+ if (!self.isPending || (!wasFull && self.isFull())) {
2113
+ self.refreshState();
2114
+ }
2115
+
2116
+ if (self.isSetup) {
2117
+ $options = self.$dropdown_content.find('[data-selectable]');
2118
+
2119
+ if (!self.isPending) {
2120
+ $option = self.getOption(value);
2121
+ value_next = self.getAdjacentOption($option, 1).attr('data-value');
2122
+ self.refreshOptions(self.isFocused && inputMode !== 'single');
2123
+ if (value_next) {
2124
+ self.setActiveOption(self.getOption(value_next));
2125
+ }
2126
+ }
2127
+
2128
+ if (!$options.length || self.isFull()) {
2129
+ self.close();
2130
+ } else if (!self.isPending) {
2131
+ self.positionDropdown();
2132
+ }
2133
+
2134
+ self.updatePlaceholder();
2135
+ self.trigger('item_add', value, $item);
2136
+
2137
+ if (!self.isPending) {
2138
+ self.updateOriginalInput({silent: silent});
2139
+ }
2140
+ }
2141
+ });
2142
+ },
2143
+
2144
+ removeItem: function(value, silent) {
2145
+ var self = this;
2146
+ var $item, i, idx;
2147
+
2148
+ $item = (value instanceof $) ? value : self.getItem(value);
2149
+ value = hash_key($item.attr('data-value'));
2150
+ i = self.items.indexOf(value);
2151
+
2152
+ if (i !== -1) {
2153
+ self.trigger('item_before_remove', value, $item);
2154
+ $item.remove();
2155
+ if ($item.hasClass('active')) {
2156
+ $item.removeClass('active');
2157
+ idx = self.$activeItems.indexOf($item[0]);
2158
+ self.$activeItems.splice(idx, 1);
2159
+ $item.removeClass('active');
2160
+ }
2161
+
2162
+ self.items.splice(i, 1);
2163
+ self.lastQuery = null;
2164
+ if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {
2165
+ self.removeOption(value, silent);
2166
+ }
2167
+
2168
+ if (i < self.caretPos) {
2169
+ self.setCaret(self.caretPos - 1);
2170
+ }
2171
+
2172
+ self.refreshState();
2173
+ self.updatePlaceholder();
2174
+ self.updateOriginalInput({silent: silent});
2175
+ self.positionDropdown();
2176
+ self.trigger('item_remove', value, $item);
2177
+ }
2178
+ },
2179
+
2180
+ createItem: function(input, triggerDropdown) {
2181
+ var self = this;
2182
+ var caret = self.caretPos;
2183
+ input = input || (self.$control_input.val() || '').trim();
2184
+
2185
+ var callback = arguments[arguments.length - 1];
2186
+ if (typeof callback !== 'function') callback = function() {};
2187
+
2188
+ if (typeof triggerDropdown !== 'boolean') {
2189
+ triggerDropdown = true;
2190
+ }
2191
+
2192
+ if (!self.canCreate(input)) {
2193
+ callback();
2194
+ return false;
2195
+ }
2196
+
2197
+ self.lock();
2198
+
2199
+ var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {
2200
+ var data = {};
2201
+ data[self.settings.labelField] = input;
2202
+ var key = input;
2203
+ if ( self.settings.formatValueToKey && typeof self.settings.formatValueToKey === 'function' ) {
2204
+ key = self.settings.formatValueToKey.apply(this, [key]);
2205
+ if (key === null || typeof key === 'undefined' || typeof key === 'object' || typeof key === 'function') {
2206
+ throw new Error('Selectize "formatValueToKey" setting must be a function that returns a value other than object or function.');
2207
+ }
2208
+ }
2209
+ data[self.settings.valueField] = key;
2210
+ return data;
2211
+ };
2212
+
2213
+ var create = once(function(data) {
2214
+ self.unlock();
2215
+
2216
+ if (!data || typeof data !== 'object') return callback();
2217
+ var value = hash_key(data[self.settings.valueField]);
2218
+ if (typeof value !== 'string') return callback();
2219
+
2220
+ self.setTextboxValue('');
2221
+ self.addOption(data);
2222
+ self.setCaret(caret);
2223
+ self.addItem(value);
2224
+ self.refreshOptions(triggerDropdown && self.settings.mode !== 'single');
2225
+ callback(data);
2226
+ });
2227
+
2228
+ var output = setup.apply(this, [input, create]);
2229
+ if (typeof output !== 'undefined') {
2230
+ create(output);
2231
+ }
2232
+
2233
+ return true;
2234
+ },
2235
+
2236
+ refreshItems: function(silent) {
2237
+ this.lastQuery = null;
2238
+
2239
+ if (this.isSetup) {
2240
+ this.addItem(this.items, silent);
2241
+ }
2242
+
2243
+ this.refreshState();
2244
+ this.updateOriginalInput({silent: silent});
2245
+ },
2246
+
2247
+ refreshState: function() {
2248
+ this.refreshValidityState();
2249
+ this.refreshClasses();
2250
+ },
2251
+
2252
+ refreshValidityState: function() {
2253
+ if (!this.isRequired) return false;
2254
+
2255
+ var invalid = !this.items.length;
2256
+
2257
+ this.isInvalid = invalid;
2258
+ this.$control_input.prop('required', invalid);
2259
+ this.$input.prop('required', !invalid);
2260
+ },
2261
+
2262
+ refreshClasses: function() {
2263
+ var self = this;
2264
+ var isFull = self.isFull();
2265
+ var isLocked = self.isLocked;
2266
+
2267
+ self.$wrapper
2268
+ .toggleClass('rtl', self.rtl);
2269
+
2270
+ self.$control
2271
+ .toggleClass('focus', self.isFocused)
2272
+ .toggleClass('disabled', self.isDisabled)
2273
+ .toggleClass('required', self.isRequired)
2274
+ .toggleClass('invalid', self.isInvalid)
2275
+ .toggleClass('locked', isLocked)
2276
+ .toggleClass('full', isFull).toggleClass('not-full', !isFull)
2277
+ .toggleClass('input-active', self.isFocused && !self.isInputHidden)
2278
+ .toggleClass('dropdown-active', self.isOpen)
2279
+ .toggleClass('has-options', !$.isEmptyObject(self.options))
2280
+ .toggleClass('has-items', self.items.length > 0);
2281
+
2282
+ self.$control_input.data('grow', !isFull && !isLocked);
2283
+ },
2284
+
2285
+ isFull: function() {
2286
+ return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;
2287
+ },
2288
+
2289
+ updateOriginalInput: function(opts) {
2290
+ var i, n, existing, fresh, old, $options, label, value, values, self = this;
2291
+ opts = opts || {};
2292
+
2293
+ if (self.tagType === TAG_SELECT) {
2294
+ $options = self.$input.find('option');
2295
+ existing = [];
2296
+ fresh = [];
2297
+ old = [];
2298
+ values = [];
2299
+
2300
+ $options.get().forEach(function(option) {
2301
+ existing.push(option.value);
2302
+ });
2303
+
2304
+ self.items.forEach(function(item) {
2305
+ label = self.options[item][self.settings.labelField] || '';
2306
+
2307
+ values.push(item);
2308
+
2309
+ if (existing.indexOf(item) != -1) {
2310
+ return;
2311
+ }
2312
+
2313
+ fresh.push('<option value="' + escape_html(item) + '" selected="selected">' + escape_html(label) + '</option>');
2314
+ });
2315
+
2316
+ old = existing.filter(function(value) {
2317
+ return values.indexOf(value) < 0;
2318
+ }).map(function(value) {
2319
+ return 'option[value="' + escape_html(value) + '"]';
2320
+ });
2321
+
2322
+ if (existing.length - old.length + fresh.length === 0 && !self.$input.attr('multiple')) {
2323
+ fresh.push('<option value="" selected="selected"></option>');
2324
+ }
2325
+
2326
+ self.$input.find(old.join(', ')).remove();
2327
+ self.$input.append(fresh.join(''));
2328
+ } else {
2329
+ self.$input.val(self.getValue());
2330
+ self.$input.attr('value',self.$input.val());
2331
+ }
2332
+
2333
+ if (self.isSetup) {
2334
+ if (!opts.silent) {
2335
+ self.trigger('change', self.$input.val());
2336
+ }
2337
+ }
2338
+ },
2339
+
2340
+ updatePlaceholder: function() {
2341
+ if (!this.settings.placeholder) return;
2342
+ var $input = this.$control_input;
2343
+
2344
+ if (this.items.length) {
2345
+ $input.removeAttr('placeholder');
2346
+ } else {
2347
+ $input.attr('placeholder', this.settings.placeholder);
2348
+ }
2349
+ $input.triggerHandler('update', {force: true});
2350
+ },
2351
+
2352
+ open: function() {
2353
+ var self = this;
2354
+
2355
+ if (
2356
+ self.isLocked ||
2357
+ self.isOpen ||
2358
+ (self.settings.mode === "multi" && self.isFull())
2359
+ )
2360
+ return;
2361
+ self.focus();
2362
+ self.isOpen = true;
2363
+ self.refreshState();
2364
+ self.$dropdown.css({ visibility: 'hidden', display: 'block' });
2365
+ self.setupDropdownHeight();
2366
+ self.positionDropdown();
2367
+ self.$dropdown.css({visibility: 'visible'});
2368
+ self.trigger('dropdown_open', self.$dropdown);
2369
+ },
2370
+
2371
+ close: function() {
2372
+ var self = this;
2373
+ var trigger = self.isOpen;
2374
+
2375
+ if (self.settings.mode === 'single' && self.items.length) {
2376
+ self.hideInput();
2377
+
2378
+ if (self.isBlurring) {
2379
+ self.$control_input[0].blur();
2380
+ }
2381
+ }
2382
+
2383
+ self.isOpen = false;
2384
+ self.$dropdown.hide();
2385
+ self.setActiveOption(null);
2386
+ self.refreshState();
2387
+
2388
+ if (trigger) self.trigger('dropdown_close', self.$dropdown);
2389
+ },
2390
+
2391
+ positionDropdown: function() {
2392
+ var $control = this.$control;
2393
+ var offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();
2394
+ offset.top += $control.outerHeight(true);
2395
+ var w = this.$wrapper[0].style.width !== 'fit-content' ? this.settings.dropdownParent === 'body' ? 'max-content' : '100%' : 'max-content';
2396
+ if (this.settings.minWidth && this.settings.minWidth > w)
2397
+ {
2398
+ w = this.settings.minWidth;
2399
+ }
2400
+
2401
+ if (this.settings.dropdownParent !== 'body' && w === 'max-content' && $control.outerWidth(true) >= this.$dropdown.outerWidth(true)) {
2402
+ w = '100%';
2403
+ }
2404
+
2405
+ this.$dropdown.css({
2406
+ width : w,
2407
+ minWidth : $control.outerWidth(true),
2408
+ top : offset.top,
2409
+ left : offset.left
2410
+ });
2411
+ },
2412
+
2413
+ setupDropdownHeight: function () {
2414
+ if (typeof this.settings.dropdownSize === 'object' && this.settings.dropdownSize.sizeType !== 'auto') {
2415
+ var height = this.settings.dropdownSize.sizeValue;
2416
+
2417
+ if (this.settings.dropdownSize.sizeType === 'numberItems') {
2418
+ var $items = this.$dropdown_content.find('*').not('.optgroup, .highlight').not(this.settings.ignoreOnDropwdownHeight);
2419
+ var totalHeight = 0;
2420
+ var marginTop = 0;
2421
+ var marginBottom = 0;
2422
+ var separatorHeight = 0;
2423
+
2424
+
2425
+ for (var i = 0; i < height; i++) {
2426
+ var $item = $($items[i]);
2427
+
2428
+ if ($item.length === 0) {
2429
+ break;
2430
+ }
2431
+
2432
+ totalHeight += $item.outerHeight(true);
2433
+ if (typeof $item.data('selectable') == 'undefined') {
2434
+ if ($item.hasClass('optgroup-header')) {
2435
+ var styles = window.getComputedStyle($item.parent()[0], ':before');
2436
+
2437
+ if (styles) {
2438
+ marginTop = styles.marginTop ? Number(styles.marginTop.replace(/\W*(\w)\w*/g, '$1')) : 0;
2439
+ marginBottom = styles.marginBottom ? Number(styles.marginBottom.replace(/\W*(\w)\w*/g, '$1')) : 0;
2440
+ separatorHeight = styles.borderTopWidth ? Number(styles.borderTopWidth.replace(/\W*(\w)\w*/g, '$1')) : 0;
2441
+ }
2442
+ }
2443
+ height++;
2444
+ }
2445
+
2446
+ }
2447
+
2448
+ var paddingTop = this.$dropdown_content.css('padding-top') ? Number(this.$dropdown_content.css('padding-top').replace(/\W*(\w)\w*/g, '$1')) : 0;
2449
+ var paddingBottom = this.$dropdown_content.css('padding-bottom') ? Number(this.$dropdown_content.css('padding-bottom').replace(/\W*(\w)\w*/g, '$1')) : 0;
2450
+
2451
+ height = (totalHeight + paddingTop + paddingBottom + marginTop + marginBottom + separatorHeight) + 'px';
2452
+ } else if (this.settings.dropdownSize.sizeType !== 'fixedHeight') {
2453
+ console.warn('Selectize.js - Value of "sizeType" must be "fixedHeight" or "numberItems');
2454
+ return;
2455
+ }
2456
+
2457
+ this.$dropdown_content.css({ height: height, maxHeight: 'none' });
2458
+ }
2459
+ },
2460
+
2461
+ clear: function(silent) {
2462
+ var self = this;
2463
+
2464
+ if (!self.items.length) return;
2465
+ self.$control.children(':not(input)').remove();
2466
+ self.items = [];
2467
+ self.lastQuery = null;
2468
+ self.setCaret(0);
2469
+ self.setActiveItem(null);
2470
+ self.updatePlaceholder();
2471
+ self.updateOriginalInput({silent: silent});
2472
+ self.refreshState();
2473
+ self.showInput();
2474
+ self.trigger('clear');
2475
+ },
2476
+
2477
+ insertAtCaret: function($el) {
2478
+ var caret = Math.min(this.caretPos, this.items.length);
2479
+ var el = $el[0];
2480
+ var target = this.buffer || this.$control[0];
2481
+
2482
+ if (caret === 0) {
2483
+ target.insertBefore(el, target.firstChild);
2484
+ } else {
2485
+ target.insertBefore(el, target.childNodes[caret]);
2486
+ }
2487
+
2488
+ this.setCaret(caret + 1);
2489
+ },
2490
+
2491
+ deleteSelection: function(e) {
2492
+ var i, n, direction, selection, values, caret, option_select, $option_select, $tail;
2493
+ var self = this;
2494
+
2495
+ direction = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;
2496
+ selection = getInputSelection(self.$control_input[0]);
2497
+
2498
+ if (self.$activeOption && !self.settings.hideSelected) {
2499
+ if (typeof self.settings.deselectBehavior === 'string' && self.settings.deselectBehavior === 'top') {
2500
+ option_select = self.getFirstOption().attr('data-value');
2501
+ } else {
2502
+ option_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');
2503
+ }
2504
+ }
2505
+
2506
+ values = [];
2507
+
2508
+ if (self.$activeItems.length) {
2509
+ $tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));
2510
+ caret = self.$control.children(':not(input)').index($tail);
2511
+ if (direction > 0) { caret++; }
2512
+
2513
+ for (i = 0, n = self.$activeItems.length; i < n; i++) {
2514
+ values.push($(self.$activeItems[i]).attr('data-value'));
2515
+ }
2516
+ if (e) {
2517
+ e.preventDefault();
2518
+ e.stopPropagation();
2519
+ }
2520
+ } else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {
2521
+ if (direction < 0 && selection.start === 0 && selection.length === 0) {
2522
+ values.push(self.items[self.caretPos - 1]);
2523
+ } else if (direction > 0 && selection.start === self.$control_input.val().length) {
2524
+ values.push(self.items[self.caretPos]);
2525
+ }
2526
+ }
2527
+
2528
+ if (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {
2529
+ return false;
2530
+ }
2531
+
2532
+ if (typeof caret !== 'undefined') {
2533
+ self.setCaret(caret);
2534
+ }
2535
+ while (values.length) {
2536
+ self.removeItem(values.pop());
2537
+ }
2538
+
2539
+ self.showInput();
2540
+ self.positionDropdown();
2541
+ self.refreshOptions(true);
2542
+
2543
+ if (option_select) {
2544
+ $option_select = self.getOption(option_select);
2545
+ if ($option_select.length) {
2546
+ self.setActiveOption($option_select);
2547
+ }
2548
+ }
2549
+
2550
+ return true;
2551
+ },
2552
+
2553
+ advanceSelection: function(direction, e) {
2554
+ var tail, selection, idx, valueLength, cursorAtEdge, $tail;
2555
+ var self = this;
2556
+
2557
+ if (direction === 0) return;
2558
+ if (self.rtl) direction *= -1;
2559
+
2560
+ tail = direction > 0 ? 'last' : 'first';
2561
+ selection = getInputSelection(self.$control_input[0]);
2562
+
2563
+ if (self.isFocused && !self.isInputHidden) {
2564
+ valueLength = self.$control_input.val().length;
2565
+ cursorAtEdge = direction < 0
2566
+ ? selection.start === 0 && selection.length === 0
2567
+ : selection.start === valueLength;
2568
+
2569
+ if (cursorAtEdge && !valueLength) {
2570
+ self.advanceCaret(direction, e);
2571
+ }
2572
+ } else {
2573
+ $tail = self.$control.children('.active:' + tail);
2574
+ if ($tail.length) {
2575
+ idx = self.$control.children(':not(input)').index($tail);
2576
+ self.setActiveItem(null);
2577
+ self.setCaret(direction > 0 ? idx + 1 : idx);
2578
+ }
2579
+ }
2580
+ },
2581
+
2582
+ advanceCaret: function(direction, e) {
2583
+ var self = this, fn, $adj;
2584
+
2585
+ if (direction === 0) return;
2586
+
2587
+ fn = direction > 0 ? 'next' : 'prev';
2588
+ if (self.isShiftDown) {
2589
+ $adj = self.$control_input[fn]();
2590
+ if ($adj.length) {
2591
+ self.hideInput();
2592
+ self.setActiveItem($adj);
2593
+ e && e.preventDefault();
2594
+ }
2595
+ } else {
2596
+ self.setCaret(self.caretPos + direction);
2597
+ }
2598
+ },
2599
+
2600
+ setCaret: function(i) {
2601
+ var self = this;
2602
+
2603
+ if (self.settings.mode === 'single') {
2604
+ i = self.items.length;
2605
+ } else {
2606
+ i = Math.max(0, Math.min(self.items.length, i));
2607
+ }
2608
+
2609
+ if(!self.isPending) {
2610
+ var j, n, fn, $children, $child;
2611
+ $children = self.$control.children(':not(input)');
2612
+ for (j = 0, n = $children.length; j < n; j++) {
2613
+ $child = $($children[j]).detach();
2614
+ if (j < i) {
2615
+ self.$control_input.before($child);
2616
+ } else {
2617
+ self.$control.append($child);
2618
+ }
2619
+ }
2620
+ }
2621
+
2622
+ self.caretPos = i;
2623
+ },
2624
+
2625
+ lock: function() {
2626
+ this.close();
2627
+ this.isLocked = true;
2628
+ this.refreshState();
2629
+ },
2630
+
2631
+ unlock: function() {
2632
+ this.isLocked = false;
2633
+ this.refreshState();
2634
+ },
2635
+
2636
+ disable: function() {
2637
+ var self = this;
2638
+ self.$input.prop('disabled', true);
2639
+ self.$control_input.prop('disabled', true).prop('tabindex', -1);
2640
+ self.isDisabled = true;
2641
+ self.lock();
2642
+ },
2643
+
2644
+ enable: function() {
2645
+ var self = this;
2646
+ self.$input.prop('disabled', false);
2647
+ self.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);
2648
+ self.isDisabled = false;
2649
+ self.unlock();
2650
+ },
2651
+
2652
+ destroy: function() {
2653
+ var self = this;
2654
+ var eventNS = self.eventNS;
2655
+ var revertSettings = self.revertSettings;
2656
+
2657
+ self.trigger('destroy');
2658
+ self.off();
2659
+ self.$wrapper.remove();
2660
+ self.$dropdown.remove();
2661
+
2662
+ self.$input
2663
+ .html('')
2664
+ .append(revertSettings.$children)
2665
+ .removeAttr('tabindex')
2666
+ .removeClass('selectized')
2667
+ .attr({tabindex: revertSettings.tabindex})
2668
+ .show();
2669
+
2670
+ self.$control_input.removeData('grow');
2671
+ self.$input.removeData('selectize');
2672
+
2673
+ if (--Selectize.count == 0 && Selectize.$testInput) {
2674
+ Selectize.$testInput.remove();
2675
+ Selectize.$testInput = undefined;
2676
+ }
2677
+
2678
+ $(window).off(eventNS);
2679
+ $(document).off(eventNS);
2680
+ $(document.body).off(eventNS);
2681
+
2682
+ delete self.$input[0].selectize;
2683
+ },
2684
+
2685
+ render: function(templateName, data) {
2686
+ var value, id, label;
2687
+ var html = '';
2688
+ var cache = false;
2689
+ var self = this;
2690
+ var regex_tag = /^[\t \r\n]*<([a-z][a-z0-9\-_]*(?:\:[a-z][a-z0-9\-_]*)?)/i;
2691
+
2692
+ if (templateName === 'option' || templateName === 'item') {
2693
+ value = hash_key(data[self.settings.valueField]);
2694
+ cache = !!value;
2695
+ }
2696
+
2697
+ if (cache) {
2698
+ if (!isset(self.renderCache[templateName])) {
2699
+ self.renderCache[templateName] = {};
2700
+ }
2701
+ if (self.renderCache[templateName].hasOwnProperty(value)) {
2702
+ return self.renderCache[templateName][value];
2703
+ }
2704
+ }
2705
+
2706
+ html = $(self.settings.render[templateName].apply(this, [data, escape_html]));
2707
+
2708
+ if (templateName === 'option' || templateName === 'option_create') {
2709
+ if (!data[self.settings.disabledField]) {
2710
+ html.attr('data-selectable', '');
2711
+ }
2712
+ }
2713
+ else if (templateName === 'optgroup') {
2714
+ id = data[self.settings.optgroupValueField] || '';
2715
+ html.attr('data-group', id);
2716
+ if(data[self.settings.disabledField]) {
2717
+ html.attr('data-disabled', '');
2718
+ }
2719
+ }
2720
+ if (templateName === 'option' || templateName === 'item') {
2721
+ html.attr('data-value', value || '');
2722
+ }
2723
+
2724
+ if (cache) {
2725
+ self.renderCache[templateName][value] = html[0];
2726
+ }
2727
+
2728
+ return html[0];
2729
+ },
2730
+
2731
+ clearCache: function(templateName) {
2732
+ var self = this;
2733
+ if (typeof templateName === 'undefined') {
2734
+ self.renderCache = {};
2735
+ } else {
2736
+ delete self.renderCache[templateName];
2737
+ }
2738
+ },
2739
+
2740
+ canCreate: function(input) {
2741
+ var self = this;
2742
+ if (!self.settings.create) return false;
2743
+ var filter = self.settings.createFilter;
2744
+ return input.length
2745
+ && (typeof filter !== 'function' || filter.apply(self, [input]))
2746
+ && (typeof filter !== 'string' || new RegExp(filter).test(input))
2747
+ && (!(filter instanceof RegExp) || filter.test(input));
2748
+ }
2749
+ });
2750
+
2751
+ Selectize.count = 0;
2752
+ Selectize.defaults = {
2753
+ options: [],
2754
+ optgroups: [],
2755
+
2756
+ plugins: [],
2757
+ delimiter: ',',
2758
+ splitOn: null,
2759
+ persist: true,
2760
+ diacritics: true,
2761
+ create: false,
2762
+ showAddOptionOnCreate: true,
2763
+ createOnBlur: false,
2764
+ createFilter: null,
2765
+ highlight: true,
2766
+ openOnFocus: true,
2767
+ maxOptions: 1000,
2768
+ maxItems: null,
2769
+ hideSelected: null,
2770
+ addPrecedence: false,
2771
+ selectOnTab: true,
2772
+ preload: false,
2773
+ allowEmptyOption: false,
2774
+ showEmptyOptionInDropdown: false,
2775
+ emptyOptionLabel: '--',
2776
+ setFirstOptionActive: false,
2777
+ closeAfterSelect: false,
2778
+ closeDropdownThreshold: 250,
2779
+
2780
+ scrollDuration: 60,
2781
+ deselectBehavior: 'previous',
2782
+ loadThrottle: 300,
2783
+ loadingClass: 'loading',
2784
+
2785
+ dataAttr: 'data-data',
2786
+ optgroupField: 'optgroup',
2787
+ valueField: 'value',
2788
+ labelField: 'text',
2789
+ disabledField: 'disabled',
2790
+ optgroupLabelField: 'label',
2791
+ optgroupValueField: 'value',
2792
+ lockOptgroupOrder: false,
2793
+
2794
+ sortField: '$order',
2795
+ searchField: ['text'],
2796
+ searchConjunction: 'and',
2797
+ respect_word_boundaries: false,
2798
+ normalize: true,
2799
+
2800
+ mode: null,
2801
+ wrapperClass: '',
2802
+ inputClass: '',
2803
+ dropdownClass: '',
2804
+ dropdownContentClass: '',
2805
+
2806
+ dropdownParent: null,
2807
+
2808
+ copyClassesToDropdown: true,
2809
+ dropdownSize: {
2810
+ sizeType: 'auto',
2811
+ sizeValue: 'auto',
2812
+ },
2813
+
2814
+ ignoreOnDropwdownHeight: 'img, i',
2815
+ search: true,
2816
+ showArrow: true,
2817
+
2818
+ render: {
2819
+ }
2820
+ };
2821
+
2822
+ $.fn.selectize = function (settings_user) {
2823
+ var defaults = $.fn.selectize.defaults;
2824
+ var settings = $.extend({}, defaults, settings_user);
2825
+ var attr_data = settings.dataAttr;
2826
+ var field_label = settings.labelField;
2827
+ var field_value = settings.valueField;
2828
+ var field_disabled = settings.disabledField;
2829
+ var field_optgroup = settings.optgroupField;
2830
+ var field_optgroup_label = settings.optgroupLabelField;
2831
+ var field_optgroup_value = settings.optgroupValueField;
2832
+
2833
+ var init_textbox = function ($input, settings_element) {
2834
+ var i, n, values, option;
2835
+
2836
+ var data_raw = $input.attr(attr_data);
2837
+
2838
+ if (!data_raw) {
2839
+ var value = ($input.val() || '').trim();
2840
+ if (!settings.allowEmptyOption && !value.length) return;
2841
+ values = value.split(settings.delimiter);
2842
+ for (i = 0, n = values.length; i < n; i++) {
2843
+ option = {};
2844
+ option[field_label] = values[i];
2845
+ option[field_value] = values[i];
2846
+ settings_element.options.push(option);
2847
+ }
2848
+ settings_element.items = values;
2849
+ } else {
2850
+ settings_element.options = JSON.parse(data_raw);
2851
+ for (i = 0, n = settings_element.options.length; i < n; i++) {
2852
+ settings_element.items.push(settings_element.options[i][field_value]);
2853
+ }
2854
+ }
2855
+ };
2856
+
2857
+ var init_select = function ($input, settings_element) {
2858
+ var i, n, tagName, $children, order = 0;
2859
+ var options = settings_element.options;
2860
+ var optionsMap = {};
2861
+
2862
+ var readData = function ($el) {
2863
+ var data = attr_data && $el.attr(attr_data);
2864
+ var allData = $el.data();
2865
+ var obj = {};
2866
+
2867
+ if (typeof data === 'string' && data.length) {
2868
+ if (isJSON(data)) {
2869
+ Object.assign(obj, JSON.parse(data))
2870
+ } else {
2871
+ obj[data] = data;
2872
+ }
2873
+ }
2874
+
2875
+
2876
+ Object.assign(obj, allData);
2877
+
2878
+ return obj || null;
2879
+ };
2880
+
2881
+ var addOption = function ($option, group) {
2882
+ $option = $($option);
2883
+
2884
+ var value = hash_key($option.val());
2885
+ if (!value && !settings.allowEmptyOption) return;
2886
+
2887
+ if (optionsMap.hasOwnProperty(value)) {
2888
+ if (group) {
2889
+ var arr = optionsMap[value][field_optgroup];
2890
+ if (!arr) {
2891
+ optionsMap[value][field_optgroup] = group;
2892
+ } else if (!Array.isArray(arr)) {
2893
+ optionsMap[value][field_optgroup] = [arr, group];
2894
+ } else {
2895
+ arr.push(group);
2896
+ }
2897
+ }
2898
+ return;
2899
+ }
2900
+
2901
+ var option = readData($option) || {};
2902
+ option[field_value] = option[field_value] || value;
2903
+ option[field_label] = option[field_label] || $option.text() || option[field_value];
2904
+ option[field_disabled] = option[field_disabled] || $option.prop('disabled');
2905
+ option[field_optgroup] = option[field_optgroup] || group;
2906
+ option.styles = $option.attr('style') || '';
2907
+ option.classes = $option.attr('class') || '';
2908
+
2909
+ optionsMap[value] = option;
2910
+ options.push(option);
2911
+
2912
+ if ($option.is(':selected')) {
2913
+ settings_element.items.push(value);
2914
+ }
2915
+ };
2916
+
2917
+ var addGroup = function ($optgroup) {
2918
+ var i, n, id, optgroup, $options;
2919
+
2920
+ $optgroup = $($optgroup);
2921
+ id = $optgroup.attr('label');
2922
+
2923
+ if (id) {
2924
+ optgroup = readData($optgroup) || {};
2925
+ optgroup[field_optgroup_label] = id;
2926
+ optgroup[field_optgroup_value] = id;
2927
+ optgroup[field_disabled] = $optgroup.prop('disabled');
2928
+ settings_element.optgroups.push(optgroup);
2929
+ }
2930
+
2931
+ $options = $('option', $optgroup);
2932
+ for (i = 0, n = $options.length; i < n; i++) {
2933
+ addOption($options[i], id);
2934
+ }
2935
+ };
2936
+
2937
+ settings_element.maxItems = $input.attr('multiple') ? null : 1;
2938
+
2939
+ $children = $input.children();
2940
+ for (i = 0, n = $children.length; i < n; i++) {
2941
+ tagName = $children[i].tagName.toLowerCase();
2942
+ if (tagName === 'optgroup') {
2943
+ addGroup($children[i]);
2944
+ } else if (tagName === 'option') {
2945
+ addOption($children[i]);
2946
+ }
2947
+ }
2948
+ };
2949
+
2950
+ return this.each(function () {
2951
+ if (this.selectize) return;
2952
+
2953
+ var instance;
2954
+ var $input = $(this);
2955
+ var tag_name = this.tagName.toLowerCase();
2956
+ var placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');
2957
+ if (!placeholder && !settings.allowEmptyOption) {
2958
+ placeholder = $input.children('option[value=""]').text();
2959
+ }
2960
+ if (settings.allowEmptyOption && settings.showEmptyOptionInDropdown && !$input.children('option[value=""]').length) {
2961
+ var input_html = $input.html();
2962
+ var label = escape_html(settings.emptyOptionLabel || '--');
2963
+ $input.html('<option value="">' + label + '</option>' + input_html);
2964
+ }
2965
+
2966
+ var settings_element = {
2967
+ 'placeholder': placeholder,
2968
+ 'options': [],
2969
+ 'optgroups': [],
2970
+ 'items': []
2971
+ };
2972
+
2973
+ if (tag_name === 'select') {
2974
+ init_select($input, settings_element);
2975
+ } else {
2976
+ init_textbox($input, settings_element);
2977
+ }
2978
+
2979
+ instance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));
2980
+ instance.settings_user = settings_user;
2981
+ });
2982
+ };
2983
+
2984
+ $.fn.selectize.defaults = Selectize.defaults;
2985
+ $.fn.selectize.support = {
2986
+ validity: SUPPORTS_VALIDITY_API
2987
+ };
2988
+
2989
+ Selectize.define("auto_position", function () {
2990
+ var self = this;
2991
+
2992
+ const POSITION = {
2993
+ top: 'top',
2994
+ bottom: 'bottom',
2995
+ };
2996
+
2997
+ self.positionDropdown = (function () {
2998
+ return function () {
2999
+ const $control = this.$control;
3000
+ const offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();
3001
+ offset.top += $control.outerHeight(true);
3002
+
3003
+ const dropdownHeight = this.$dropdown.prop('scrollHeight') + 5;
3004
+ const controlPosTop = this.$control.get(0).getBoundingClientRect().top;
3005
+ const wrapperHeight = this.$wrapper.height();
3006
+ const controlPosBottom = self.$control.get(0).getBoundingClientRect().bottom
3007
+ const position =
3008
+ controlPosTop + dropdownHeight + wrapperHeight > window.innerHeight &&
3009
+ controlPosBottom - dropdownHeight - wrapperHeight >= 0 ?
3010
+ POSITION.top :
3011
+ POSITION.bottom;
3012
+ let w = this.$wrapper[0].style.width !== 'fit-content' ? this.settings.dropdownParent === 'body' ? 'max-content' : '100%' : 'max-content';
3013
+ const styles = {
3014
+ width: w,
3015
+ minWidth : $control.outerWidth(true),
3016
+ left: offset.left
3017
+ };
3018
+
3019
+ if (position === POSITION.top) {
3020
+ const styleToAdd = { bottom: offset.top, top: 'unset' };
3021
+
3022
+ if (this.settings.dropdownParent === 'body') {
3023
+ styleToAdd.top = offset.top - this.$dropdown.outerHeight(true) - $control.outerHeight(true);
3024
+ styleToAdd.bottom = 'unset';
3025
+ }
3026
+ Object.assign(styles, styleToAdd);
3027
+ this.$dropdown.addClass('selectize-position-top');
3028
+ this.$control.addClass('selectize-position-top');
3029
+ } else {
3030
+ Object.assign(styles, { top: offset.top, bottom: 'unset' });
3031
+ this.$dropdown.removeClass('selectize-position-top');
3032
+ this.$control.removeClass('selectize-position-top');
3033
+ }
3034
+
3035
+ if (this.settings.dropdownParent !== 'body' && w === 'max-content' && $control.outerWidth(true) >= this.$dropdown.outerWidth(true)) {
3036
+ w = '100%';
3037
+ }
3038
+
3039
+ this.$dropdown.css(styles);
3040
+ };
3041
+ }());
3042
+ });
3043
+
3044
+ Selectize.define('auto_select_on_type', function(options) {
3045
+ var self = this;
3046
+
3047
+ self.onBlur = (function() {
3048
+ var originalBlur = self.onBlur;
3049
+ return function(e) {
3050
+ var $matchedItem = self.getFirstItemMatchedByTextContent(self.lastValue, true);
3051
+ if (typeof $matchedItem.attr('data-value') !== 'undefined' && self.getValue() !== $matchedItem.attr('data-value'))
3052
+ {
3053
+ self.setValue($matchedItem.attr('data-value'));
3054
+ }
3055
+ return originalBlur.apply(this, arguments);
3056
+ }
3057
+ }());
3058
+ });
3059
+
3060
+ Selectize.define("autofill_disable", function (options) {
3061
+ var self = this;
3062
+
3063
+ self.setup = (function () {
3064
+ var original = self.setup;
3065
+ return function () {
3066
+ original.apply(self, arguments);
3067
+
3068
+ self.$control_input.attr({ name: nanoid(21), autocomplete: nanoid(21) });
3069
+ };
3070
+ })();
3071
+ });
3072
+
3073
+ Selectize.define("clear_button", function (options) {
3074
+ var self = this;
3075
+
3076
+ options = $.extend(
3077
+ {
3078
+ title: "Clear",
3079
+ className: "clear",
3080
+ label: "×",
3081
+ html: function (data) {
3082
+ return (
3083
+ '<a class="' + data.className + '" title="' + data.title + '"> ' + data.label + '</a>'
3084
+ );
3085
+ },
3086
+ },
3087
+ options
3088
+ );
3089
+
3090
+ self.setup = (function () {
3091
+ var original = self.setup;
3092
+ return function () {
3093
+ original.apply(self, arguments);
3094
+ self.$button_clear = $(options.html(options));
3095
+
3096
+ if (self.settings.mode === "single") self.$wrapper.addClass("single");
3097
+
3098
+ self.$wrapper.append(self.$button_clear);
3099
+
3100
+ if (self.getValue() === "" || self.getValue().length === 0) {
3101
+ self.$wrapper.find("." + options.className).css("display", "none");
3102
+ }
3103
+
3104
+ self.on("change", function () {
3105
+ if (self.getValue() === "" || self.getValue().length === 0) {
3106
+ self.$wrapper.find("." + options.className).css("display", "none");
3107
+ } else {
3108
+ self.$wrapper.find("." + options.className).css("display", "");
3109
+ }
3110
+ });
3111
+
3112
+ self.$wrapper.on("click", "." + options.className, function (e) {
3113
+ e.preventDefault();
3114
+ e.stopImmediatePropagation();
3115
+ e.stopPropagation();
3116
+
3117
+ if (self.isLocked) return;
3118
+
3119
+ self.clear();
3120
+ self.$wrapper.find("." + options.className).css("display", "none");
3121
+ });
3122
+ };
3123
+ })();
3124
+ });
3125
+
3126
+ Selectize.define('drag_drop', function(options) {
3127
+ if (!$.fn.sortable) throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');
3128
+ if (this.settings.mode !== 'multi') return;
3129
+ var self = this;
3130
+
3131
+ self.lock = (function() {
3132
+ var original = self.lock;
3133
+ return function() {
3134
+ var sortable = self.$control.data('sortable');
3135
+ if (sortable) sortable.disable();
3136
+ return original.apply(self, arguments);
3137
+ };
3138
+ })();
3139
+
3140
+ self.unlock = (function() {
3141
+ var original = self.unlock;
3142
+ return function() {
3143
+ var sortable = self.$control.data('sortable');
3144
+ if (sortable) sortable.enable();
3145
+ return original.apply(self, arguments);
3146
+ };
3147
+ })();
3148
+
3149
+ self.setup = (function() {
3150
+ var original = self.setup;
3151
+ return function() {
3152
+ original.apply(this, arguments);
3153
+
3154
+ var $control = self.$control.sortable({
3155
+ items: '[data-value]',
3156
+ forcePlaceholderSize: true,
3157
+ disabled: self.isLocked,
3158
+ start: function(e, ui) {
3159
+ ui.placeholder.css('width', ui.helper.css('width'));
3160
+ $control.addClass('dragging');
3161
+ },
3162
+ stop: function() {
3163
+ $control.removeClass('dragging');
3164
+ var active = self.$activeItems ? self.$activeItems.slice() : null;
3165
+ var values = [];
3166
+ $control.children('[data-value]').each(function() {
3167
+ values.push($(this).attr('data-value'));
3168
+ });
3169
+ self.isFocused = false;
3170
+ self.setValue(values);
3171
+ self.isFocused = true;
3172
+ self.setActiveItem(active);
3173
+ self.positionDropdown();
3174
+ }
3175
+ });
3176
+ };
3177
+ })();
3178
+
3179
+ });
3180
+
3181
+ Selectize.define('dropdown_header', function(options) {
3182
+ var self = this;
3183
+
3184
+ options = $.extend({
3185
+ title : 'Untitled',
3186
+ headerClass : 'selectize-dropdown-header',
3187
+ titleRowClass : 'selectize-dropdown-header-title',
3188
+ labelClass : 'selectize-dropdown-header-label',
3189
+ closeClass : 'selectize-dropdown-header-close',
3190
+
3191
+ html: function(data) {
3192
+ return (
3193
+ '<div class="' + data.headerClass + '">' +
3194
+ '<div class="' + data.titleRowClass + '">' +
3195
+ '<span class="' + data.labelClass + '">' + data.title + '</span>' +
3196
+ '<a href="javascript:void(0)" class="' + data.closeClass + '">&#xd7;</a>' +
3197
+ '</div>' +
3198
+ '</div>'
3199
+ );
3200
+ }
3201
+ }, options);
3202
+
3203
+ self.setup = (function() {
3204
+ var original = self.setup;
3205
+ return function() {
3206
+ original.apply(self, arguments);
3207
+ self.$dropdown_header = $(options.html(options));
3208
+ self.$dropdown.prepend(self.$dropdown_header);
3209
+ self.$dropdown_header.find('.' + options.closeClass).on('click', function () {
3210
+ self.close();
3211
+ });
3212
+ };
3213
+ })();
3214
+
3215
+ });
3216
+
3217
+ Selectize.define('optgroup_columns', function(options) {
3218
+ var self = this;
3219
+
3220
+ options = $.extend({
3221
+ equalizeWidth : true,
3222
+ equalizeHeight : true
3223
+ }, options);
3224
+
3225
+ this.getAdjacentOption = function($option, direction) {
3226
+ var $options = $option.closest('[data-group]').find('[data-selectable]');
3227
+ var index = $options.index($option) + direction;
3228
+
3229
+ return index >= 0 && index < $options.length ? $options.eq(index) : $();
3230
+ };
3231
+
3232
+ this.onKeyDown = (function() {
3233
+ var original = self.onKeyDown;
3234
+ return function(e) {
3235
+ var index, $option, $options, $optgroup;
3236
+
3237
+ if (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {
3238
+ self.ignoreHover = true;
3239
+ $optgroup = this.$activeOption.closest('[data-group]');
3240
+ index = $optgroup.find('[data-selectable]').index(this.$activeOption);
3241
+
3242
+ if(e.keyCode === KEY_LEFT) {
3243
+ $optgroup = $optgroup.prev('[data-group]');
3244
+ } else {
3245
+ $optgroup = $optgroup.next('[data-group]');
3246
+ }
3247
+
3248
+ $options = $optgroup.find('[data-selectable]');
3249
+ $option = $options.eq(Math.min($options.length - 1, index));
3250
+ if ($option.length) {
3251
+ this.setActiveOption($option);
3252
+ }
3253
+ return;
3254
+ }
3255
+
3256
+ return original.apply(this, arguments);
3257
+ };
3258
+ })();
3259
+
3260
+ var getScrollbarWidth = function() {
3261
+ var div;
3262
+ var width = getScrollbarWidth.width;
3263
+ var doc = document;
3264
+
3265
+ if (typeof width === 'undefined') {
3266
+ div = doc.createElement('div');
3267
+ div.innerHTML = '<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>';
3268
+ div = div.firstChild;
3269
+ doc.body.appendChild(div);
3270
+ width = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;
3271
+ doc.body.removeChild(div);
3272
+ }
3273
+ return width;
3274
+ };
3275
+
3276
+ var equalizeSizes = function() {
3277
+ var i, n, height_max, width, width_last, width_parent, $optgroups;
3278
+
3279
+ $optgroups = $('[data-group]', self.$dropdown_content);
3280
+ n = $optgroups.length;
3281
+ if (!n || !self.$dropdown_content.width()) return;
3282
+
3283
+ if (options.equalizeHeight) {
3284
+ height_max = 0;
3285
+ for (i = 0; i < n; i++) {
3286
+ height_max = Math.max(height_max, $optgroups.eq(i).height());
3287
+ }
3288
+ $optgroups.css({height: height_max});
3289
+ }
3290
+
3291
+ if (options.equalizeWidth) {
3292
+ width_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();
3293
+ width = Math.round(width_parent / n);
3294
+ $optgroups.css({width: width});
3295
+ if (n > 1) {
3296
+ width_last = width_parent - width * (n - 1);
3297
+ $optgroups.eq(n - 1).css({width: width_last});
3298
+ }
3299
+ }
3300
+ };
3301
+
3302
+ if (options.equalizeHeight || options.equalizeWidth) {
3303
+ hook.after(this, 'positionDropdown', equalizeSizes);
3304
+ hook.after(this, 'refreshOptions', equalizeSizes);
3305
+ }
3306
+
3307
+
3308
+ });
3309
+
3310
+ Selectize.define('read-only', function(options){
3311
+ var self = this;
3312
+ this.setup = (function() {
3313
+ var original = self.setup;
3314
+ return function() {
3315
+ original.apply(this, arguments);
3316
+ if(this.$dropdown.hasClass("read-only"))this.$control_input.attr('readonly', 'readonly');
3317
+ };
3318
+ })();
3319
+ this.readonly = (function() {
3320
+ return function(state) {
3321
+ if(state){
3322
+ this.$control_input.attr('readonly', 'readonly');
3323
+ this.$dropdown.addClass("read-only")
3324
+ }
3325
+ else{
3326
+ this.$control_input.removeAttr('readonly');
3327
+ this.$dropdown.removeClass("read-only")
3328
+ }
3329
+ };
3330
+ })();
3331
+ });
3332
+
3333
+ Selectize.define('remove_button', function (options) {
3334
+ if (this.settings.mode === 'single') return;
3335
+
3336
+ options = $.extend({
3337
+ label : '&#xd7;',
3338
+ title : 'Remove',
3339
+ className : 'remove',
3340
+ append : true
3341
+ }, options);
3342
+
3343
+ var multiClose = function(thisRef, options) {
3344
+
3345
+ var self = thisRef;
3346
+ var html = '<a href="javascript:void(0)" class="' + options.className + '" tabindex="-1" title="' + escape_html(options.title) + '">' + options.label + '</a>';
3347
+
3348
+ var append = function(html_container, html_element) {
3349
+ var pos = html_container.search(/(<\/[^>]+>\s*)$/);
3350
+ return html_container.substring(0, pos) + html_element + html_container.substring(pos);
3351
+ };
3352
+
3353
+ thisRef.setup = (function() {
3354
+ var original = self.setup;
3355
+ return function() {
3356
+ if (options.append) {
3357
+ var render_item = self.settings.render.item;
3358
+ self.settings.render.item = function(data) {
3359
+ return append(render_item.apply(thisRef, arguments), html);
3360
+ };
3361
+ }
3362
+
3363
+ original.apply(thisRef, arguments);
3364
+
3365
+ thisRef.$control.on('click', '.' + options.className, function(e) {
3366
+ e.preventDefault();
3367
+ if (self.isLocked) return;
3368
+
3369
+ var $item = $(e.currentTarget).parent();
3370
+ self.setActiveItem($item);
3371
+ if (self.deleteSelection()) {
3372
+ self.setCaret(self.items.length);
3373
+ }
3374
+ return false;
3375
+ });
3376
+
3377
+ };
3378
+ })();
3379
+ };
3380
+
3381
+ multiClose(this, options);
3382
+ });
3383
+
3384
+ Selectize.define('restore_on_backspace', function(options) {
3385
+ var self = this;
3386
+
3387
+ options.text = options.text || function(option) {
3388
+ return option[this.settings.labelField];
3389
+ };
3390
+
3391
+ this.onKeyDown = (function() {
3392
+ var original = self.onKeyDown;
3393
+ return function(e) {
3394
+ var index, option;
3395
+ if (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {
3396
+ index = this.caretPos - 1;
3397
+ if (index >= 0 && index < this.items.length) {
3398
+ option = this.options[this.items[index]];
3399
+ if (this.deleteSelection(e)) {
3400
+ this.setTextboxValue(options.text.apply(this, [option]));
3401
+ this.refreshOptions(true);
3402
+ }
3403
+ e.preventDefault();
3404
+ return;
3405
+ }
3406
+ }
3407
+ return original.apply(this, arguments);
3408
+ };
3409
+ })();
3410
+ });
3411
+
3412
+ Selectize.define('select_on_focus', function(options) {
3413
+ var self = this;
3414
+
3415
+ self.on('focus', function() {
3416
+ var originalFocus = self.onFocus;
3417
+ return function(e) {
3418
+ var value = self.getItem(self.getValue()).text();
3419
+ self.clear();
3420
+ self.setTextboxValue(value);
3421
+ self.$control_input.select();
3422
+ setTimeout( function () {
3423
+ if (self.settings.selectOnTab) {
3424
+ self.setActiveOption(self.getFirstItemMatchedByTextContent(value));
3425
+ }
3426
+ self.settings.score = null;
3427
+ },0);
3428
+ return originalFocus.apply(this, arguments);
3429
+ };
3430
+ }());
3431
+
3432
+ self.onBlur = (function() {
3433
+ var originalBlur = self.onBlur;
3434
+ return function(e) {
3435
+ if (self.getValue() === "" && self.lastValidValue !== self.getValue()) {
3436
+ self.setValue(self.lastValidValue);
3437
+ }
3438
+ setTimeout( function () {
3439
+ self.settings.score = function() {
3440
+ return function() {
3441
+ return 1;
3442
+ };
3443
+ };
3444
+ }, 0 );
3445
+ return originalBlur.apply(this, arguments);
3446
+ }
3447
+ }());
3448
+ self.settings.score = function() {
3449
+ return function() { return 1; };
3450
+ };
3451
+
3452
+ });
3453
+
3454
+ Selectize.define('tag_limit', function (options) {
3455
+ const self = this
3456
+ options.tagLimit = options.tagLimit
3457
+ this.onBlur = (function (e) {
3458
+ const original = self.onBlur
3459
+
3460
+ return function (e) {
3461
+ original.apply(this, e);
3462
+ if (!e)
3463
+ return
3464
+ const $control = this.$control
3465
+ const $items = $control.find('.item')
3466
+ const limit = options.tagLimit
3467
+ if (limit === undefined || $items.length <= limit)
3468
+ return
3469
+
3470
+ $items.toArray().forEach(function(item, index) {
3471
+ if (index < limit)
3472
+ return
3473
+ $(item).hide()
3474
+ });
3475
+
3476
+ $control.append('<span><b>' + ($items.length - limit) + '</b></span>')
3477
+ };
3478
+ })()
3479
+
3480
+ this.onFocus = (function (e) {
3481
+ const original = self.onFocus
3482
+
3483
+ return function (e) {
3484
+ original.apply(this, e);
3485
+ if (!e)
3486
+ return
3487
+ const $control = this.$control
3488
+ const $items = $control.find('.item')
3489
+ $items.show()
3490
+ $control.find('span').remove()
3491
+
3492
+ };
3493
+ })()
3494
+ });
3495
+
3496
+ return Selectize;
3497
+ }));