fomantic-ui 2.9.1-beta.3 → 2.9.1-beta.30

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 (540) hide show
  1. package/.eslint/eqeqeq-rule.js +18 -0
  2. package/.eslint/index.js +26 -0
  3. package/.eslint/no-extra-parens-rule.js +17 -0
  4. package/.eslint/package.json +11 -0
  5. package/.eslintrc.js +124 -0
  6. package/.github/workflows/ci.yml +37 -4
  7. package/.github/workflows/nightly.yml +1 -1
  8. package/.github/workflows/release.yml +1 -1
  9. package/.prettierrc.js +12 -0
  10. package/.stylelintrc.js +48 -0
  11. package/README.md +1 -1
  12. package/dist/components/accordion.css +35 -53
  13. package/dist/components/accordion.js +568 -595
  14. package/dist/components/accordion.min.css +2 -2
  15. package/dist/components/accordion.min.js +2 -2
  16. package/dist/components/ad.css +34 -45
  17. package/dist/components/ad.min.css +2 -2
  18. package/dist/components/api.js +1157 -1179
  19. package/dist/components/api.min.js +2 -2
  20. package/dist/components/breadcrumb.css +5 -5
  21. package/dist/components/breadcrumb.min.css +2 -2
  22. package/dist/components/button.css +709 -1121
  23. package/dist/components/button.min.css +2 -2
  24. package/dist/components/calendar.css +24 -27
  25. package/dist/components/calendar.js +1934 -1809
  26. package/dist/components/calendar.min.css +2 -2
  27. package/dist/components/calendar.min.js +2 -2
  28. package/dist/components/card.css +219 -365
  29. package/dist/components/card.min.css +2 -2
  30. package/dist/components/checkbox.css +119 -187
  31. package/dist/components/checkbox.js +842 -841
  32. package/dist/components/checkbox.min.css +2 -2
  33. package/dist/components/checkbox.min.js +2 -2
  34. package/dist/components/comment.css +41 -59
  35. package/dist/components/comment.min.css +2 -2
  36. package/dist/components/container.css +7 -6
  37. package/dist/components/container.min.css +2 -2
  38. package/dist/components/dimmer.css +53 -172
  39. package/dist/components/dimmer.js +706 -737
  40. package/dist/components/dimmer.min.css +2 -2
  41. package/dist/components/dimmer.min.js +2 -2
  42. package/dist/components/divider.css +43 -61
  43. package/dist/components/divider.min.css +2 -2
  44. package/dist/components/dropdown.css +252 -386
  45. package/dist/components/dropdown.js +4179 -4236
  46. package/dist/components/dropdown.min.css +2 -2
  47. package/dist/components/dropdown.min.js +2 -2
  48. package/dist/components/embed.css +18 -29
  49. package/dist/components/embed.js +645 -675
  50. package/dist/components/embed.min.css +2 -2
  51. package/dist/components/embed.min.js +2 -2
  52. package/dist/components/emoji.css +9 -9
  53. package/dist/components/emoji.min.css +1 -1
  54. package/dist/components/feed.css +35 -57
  55. package/dist/components/feed.min.css +2 -2
  56. package/dist/components/flag.css +6 -4
  57. package/dist/components/flag.min.css +2 -2
  58. package/dist/components/flyout.css +86 -141
  59. package/dist/components/flyout.js +1457 -1465
  60. package/dist/components/flyout.min.css +2 -2
  61. package/dist/components/flyout.min.js +2 -2
  62. package/dist/components/form.css +244 -339
  63. package/dist/components/form.js +2020 -2004
  64. package/dist/components/form.min.css +2 -2
  65. package/dist/components/form.min.js +2 -2
  66. package/dist/components/grid.css +172 -319
  67. package/dist/components/grid.min.css +2 -2
  68. package/dist/components/header.css +118 -142
  69. package/dist/components/header.min.css +2 -2
  70. package/dist/components/icon.css +660 -718
  71. package/dist/components/icon.min.css +2 -2
  72. package/dist/components/image.css +39 -63
  73. package/dist/components/image.min.css +2 -2
  74. package/dist/components/input.css +356 -274
  75. package/dist/components/input.min.css +2 -2
  76. package/dist/components/item.css +84 -131
  77. package/dist/components/item.min.css +2 -2
  78. package/dist/components/label.css +359 -410
  79. package/dist/components/label.min.css +2 -2
  80. package/dist/components/list.css +49 -70
  81. package/dist/components/list.min.css +2 -2
  82. package/dist/components/loader.css +67 -155
  83. package/dist/components/loader.min.css +2 -2
  84. package/dist/components/menu.css +269 -431
  85. package/dist/components/menu.min.css +1 -1
  86. package/dist/components/message.css +125 -197
  87. package/dist/components/message.min.css +2 -2
  88. package/dist/components/modal.css +119 -154
  89. package/dist/components/modal.js +1488 -1486
  90. package/dist/components/modal.min.css +2 -2
  91. package/dist/components/modal.min.js +2 -2
  92. package/dist/components/nag.css +53 -63
  93. package/dist/components/nag.js +520 -526
  94. package/dist/components/nag.min.css +2 -2
  95. package/dist/components/nag.min.js +2 -2
  96. package/dist/components/placeholder.css +22 -42
  97. package/dist/components/placeholder.min.css +2 -2
  98. package/dist/components/popup.css +423 -201
  99. package/dist/components/popup.js +1454 -1456
  100. package/dist/components/popup.min.css +2 -2
  101. package/dist/components/popup.min.js +2 -2
  102. package/dist/components/progress.css +106 -211
  103. package/dist/components/progress.js +969 -997
  104. package/dist/components/progress.min.css +2 -2
  105. package/dist/components/progress.min.js +2 -2
  106. package/dist/components/rail.css +15 -20
  107. package/dist/components/rail.min.css +1 -1
  108. package/dist/components/rating.css +80 -121
  109. package/dist/components/rating.js +505 -523
  110. package/dist/components/rating.min.css +2 -2
  111. package/dist/components/rating.min.js +2 -2
  112. package/dist/components/reset.css +8 -13
  113. package/dist/components/reset.min.css +2 -2
  114. package/dist/components/reveal.css +44 -83
  115. package/dist/components/reveal.min.css +2 -2
  116. package/dist/components/search.css +69 -98
  117. package/dist/components/search.js +1493 -1534
  118. package/dist/components/search.min.css +2 -2
  119. package/dist/components/search.min.js +2 -2
  120. package/dist/components/segment.css +148 -224
  121. package/dist/components/segment.min.css +2 -2
  122. package/dist/components/shape.css +14 -30
  123. package/dist/components/shape.js +781 -810
  124. package/dist/components/shape.min.css +2 -2
  125. package/dist/components/shape.min.js +2 -2
  126. package/dist/components/sidebar.css +103 -206
  127. package/dist/components/sidebar.js +1061 -1099
  128. package/dist/components/sidebar.min.css +2 -2
  129. package/dist/components/sidebar.min.js +2 -2
  130. package/dist/components/site.css +28 -41
  131. package/dist/components/site.js +436 -476
  132. package/dist/components/site.min.css +2 -2
  133. package/dist/components/site.min.js +2 -2
  134. package/dist/components/slider.css +93 -121
  135. package/dist/components/slider.js +1310 -1311
  136. package/dist/components/slider.min.css +1 -1
  137. package/dist/components/slider.min.js +2 -2
  138. package/dist/components/state.js +639 -657
  139. package/dist/components/state.min.js +2 -2
  140. package/dist/components/statistic.css +75 -116
  141. package/dist/components/statistic.min.css +2 -2
  142. package/dist/components/step.css +77 -150
  143. package/dist/components/step.min.css +2 -2
  144. package/dist/components/sticky.css +1 -5
  145. package/dist/components/sticky.js +848 -901
  146. package/dist/components/sticky.min.css +2 -2
  147. package/dist/components/sticky.min.js +2 -2
  148. package/dist/components/tab.css +10 -14
  149. package/dist/components/tab.js +922 -965
  150. package/dist/components/tab.min.css +2 -2
  151. package/dist/components/tab.min.js +2 -2
  152. package/dist/components/table.css +547 -774
  153. package/dist/components/table.min.css +2 -2
  154. package/dist/components/text.css +32 -32
  155. package/dist/components/text.min.css +1 -1
  156. package/dist/components/toast.css +69 -147
  157. package/dist/components/toast.js +910 -884
  158. package/dist/components/toast.min.css +2 -2
  159. package/dist/components/toast.min.js +2 -2
  160. package/dist/components/transition.css +369 -1280
  161. package/dist/components/transition.js +1047 -1077
  162. package/dist/components/transition.min.css +2 -2
  163. package/dist/components/transition.min.js +2 -2
  164. package/dist/components/visibility.js +1213 -1245
  165. package/dist/components/visibility.min.js +2 -2
  166. package/dist/semantic.css +5637 -8398
  167. package/dist/semantic.js +29021 -29405
  168. package/dist/semantic.min.css +2 -2
  169. package/dist/semantic.min.js +2 -2
  170. package/dist/themes/basic/assets/fonts/icons.woff2 +0 -0
  171. package/dist/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  172. package/dist/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  173. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  174. package/dist/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  175. package/dist/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  176. package/dist/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  177. package/dist/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  178. package/dist/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  179. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  180. package/dist/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  181. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  182. package/dist/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  183. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  184. package/dist/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  185. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  186. package/dist/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  187. package/dist/themes/github/assets/fonts/octicons.woff2 +0 -0
  188. package/examples/.eslintrc.js +6 -0
  189. package/examples/assets/show-examples.js +13 -13
  190. package/examples/components/sticky-context.html +1 -1
  191. package/examples/fixed.html +2 -2
  192. package/examples/grid.html +4 -4
  193. package/examples/login.html +1 -1
  194. package/examples/responsive.html +1 -1
  195. package/examples/sticky.html +3 -3
  196. package/gulpfile.js +10 -11
  197. package/package.json +18 -11
  198. package/scripts/nightly-version.js +83 -75
  199. package/src/_site/collections/menu.overrides +1 -1
  200. package/src/_site/elements/flag.variables +2 -2
  201. package/src/_site/globals/site.variables +1 -1
  202. package/src/_site/modules/embed.variables +3 -0
  203. package/src/definitions/behaviors/api.js +1158 -1180
  204. package/src/definitions/behaviors/form.js +2019 -2003
  205. package/src/definitions/behaviors/state.js +645 -663
  206. package/src/definitions/behaviors/visibility.js +1212 -1244
  207. package/src/definitions/collections/breadcrumb.less +43 -47
  208. package/src/definitions/collections/form.less +866 -884
  209. package/src/definitions/collections/grid.less +1680 -1699
  210. package/src/definitions/collections/menu.less +1521 -1544
  211. package/src/definitions/collections/message.less +294 -298
  212. package/src/definitions/collections/table.less +1657 -1661
  213. package/src/definitions/elements/button.less +1714 -1756
  214. package/src/definitions/elements/container.less +211 -211
  215. package/src/definitions/elements/divider.less +198 -211
  216. package/src/definitions/elements/emoji.less +41 -48
  217. package/src/definitions/elements/flag.less +46 -48
  218. package/src/definitions/elements/header.less +351 -359
  219. package/src/definitions/elements/icon.less +541 -484
  220. package/src/definitions/elements/image.less +216 -227
  221. package/src/definitions/elements/input.less +692 -698
  222. package/src/definitions/elements/label.less +784 -806
  223. package/src/definitions/elements/list.less +810 -814
  224. package/src/definitions/elements/loader.less +273 -268
  225. package/src/definitions/elements/placeholder.less +173 -170
  226. package/src/definitions/elements/rail.less +93 -93
  227. package/src/definitions/elements/reveal.less +192 -198
  228. package/src/definitions/elements/segment.less +742 -749
  229. package/src/definitions/elements/step.less +423 -437
  230. package/src/definitions/elements/text.less +34 -36
  231. package/src/definitions/globals/reset.less +11 -8
  232. package/src/definitions/globals/site.js +435 -475
  233. package/src/definitions/globals/site.less +108 -110
  234. package/src/definitions/modules/accordion.js +567 -594
  235. package/src/definitions/modules/accordion.less +244 -248
  236. package/src/definitions/modules/calendar.js +1933 -1808
  237. package/src/definitions/modules/calendar.less +100 -97
  238. package/src/definitions/modules/checkbox.js +841 -840
  239. package/src/definitions/modules/checkbox.less +531 -552
  240. package/src/definitions/modules/dimmer.js +705 -736
  241. package/src/definitions/modules/dimmer.less +294 -305
  242. package/src/definitions/modules/dropdown.js +4178 -4235
  243. package/src/definitions/modules/dropdown.less +1568 -1598
  244. package/src/definitions/modules/embed.js +644 -674
  245. package/src/definitions/modules/embed.less +82 -84
  246. package/src/definitions/modules/flyout.js +1456 -1464
  247. package/src/definitions/modules/flyout.less +445 -456
  248. package/src/definitions/modules/modal.js +1487 -1485
  249. package/src/definitions/modules/modal.less +458 -467
  250. package/src/definitions/modules/nag.js +519 -525
  251. package/src/definitions/modules/nag.less +136 -149
  252. package/src/definitions/modules/popup.js +1453 -1455
  253. package/src/definitions/modules/popup.less +737 -692
  254. package/src/definitions/modules/progress.js +968 -996
  255. package/src/definitions/modules/progress.less +523 -499
  256. package/src/definitions/modules/rating.js +504 -522
  257. package/src/definitions/modules/rating.less +98 -103
  258. package/src/definitions/modules/search.js +1492 -1533
  259. package/src/definitions/modules/search.less +374 -394
  260. package/src/definitions/modules/shape.js +780 -809
  261. package/src/definitions/modules/shape.less +70 -79
  262. package/src/definitions/modules/sidebar.js +1060 -1098
  263. package/src/definitions/modules/sidebar.less +463 -476
  264. package/src/definitions/modules/slider.js +1309 -1310
  265. package/src/definitions/modules/slider.less +309 -310
  266. package/src/definitions/modules/sticky.js +864 -917
  267. package/src/definitions/modules/sticky.less +17 -25
  268. package/src/definitions/modules/tab.js +921 -964
  269. package/src/definitions/modules/tab.less +48 -54
  270. package/src/definitions/modules/toast.js +909 -883
  271. package/src/definitions/modules/toast.less +589 -589
  272. package/src/definitions/modules/transition.js +1046 -1076
  273. package/src/definitions/modules/transition.less +65 -31
  274. package/src/definitions/views/ad.less +207 -208
  275. package/src/definitions/views/card.less +955 -973
  276. package/src/definitions/views/comment.less +192 -200
  277. package/src/definitions/views/feed.less +222 -226
  278. package/src/definitions/views/item.less +437 -448
  279. package/src/definitions/views/statistic.less +273 -279
  280. package/src/semantic.less +8 -6
  281. package/src/theme.config.example +53 -53
  282. package/src/theme.less +30 -33
  283. package/src/themes/amazon/elements/button.overrides +23 -24
  284. package/src/themes/amazon/elements/button.variables +18 -23
  285. package/src/themes/amazon/globals/site.variables +16 -17
  286. package/src/themes/basic/assets/fonts/icons.woff2 +0 -0
  287. package/src/themes/basic/collections/table.overrides +0 -1
  288. package/src/themes/basic/collections/table.variables +3 -3
  289. package/src/themes/basic/elements/button.overrides +0 -1
  290. package/src/themes/basic/elements/button.variables +9 -9
  291. package/src/themes/basic/elements/icon.overrides +9 -169
  292. package/src/themes/basic/elements/icon.variables +161 -18
  293. package/src/themes/basic/elements/step.overrides +2 -2
  294. package/src/themes/basic/elements/step.variables +2 -2
  295. package/src/themes/basic/globals/reset.overrides +1 -1
  296. package/src/themes/basic/globals/reset.variables +1 -1
  297. package/src/themes/basic/modules/progress.variables +2 -2
  298. package/src/themes/basic/views/card.overrides +0 -1
  299. package/src/themes/basic/views/card.variables +6 -6
  300. package/src/themes/bookish/elements/header.overrides +4 -4
  301. package/src/themes/bookish/elements/header.variables +5 -5
  302. package/src/themes/bootstrap3/elements/button.overrides +3 -0
  303. package/src/themes/bootstrap3/elements/button.variables +20 -25
  304. package/src/themes/chubby/collections/form.overrides +9 -9
  305. package/src/themes/chubby/collections/form.variables +3 -3
  306. package/src/themes/chubby/collections/menu.overrides +3 -0
  307. package/src/themes/chubby/collections/menu.variables +3 -3
  308. package/src/themes/chubby/elements/button.overrides +8 -10
  309. package/src/themes/chubby/elements/button.variables +10 -10
  310. package/src/themes/chubby/elements/header.overrides +1 -1
  311. package/src/themes/chubby/elements/header.variables +4 -4
  312. package/src/themes/chubby/modules/accordion.overrides +2 -2
  313. package/src/themes/chubby/modules/accordion.variables +4 -4
  314. package/src/themes/chubby/views/comment.overrides +5 -5
  315. package/src/themes/chubby/views/comment.variables +11 -11
  316. package/src/themes/classic/collections/table.variables +3 -3
  317. package/src/themes/classic/elements/button.variables +36 -43
  318. package/src/themes/classic/elements/header.variables +4 -4
  319. package/src/themes/classic/modules/progress.variables +3 -3
  320. package/src/themes/classic/views/card.overrides +25 -27
  321. package/src/themes/classic/views/card.variables +7 -7
  322. package/src/themes/colored/modules/checkbox.overrides +3 -0
  323. package/src/themes/colored/modules/checkbox.variables +1 -3
  324. package/src/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  325. package/src/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  326. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  327. package/src/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  328. package/src/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  329. package/src/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  330. package/src/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  331. package/src/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  332. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  333. package/src/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  334. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  335. package/src/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  336. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  337. package/src/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  338. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  339. package/src/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  340. package/src/themes/default/collections/breadcrumb.variables +4 -4
  341. package/src/themes/default/collections/form.variables +15 -16
  342. package/src/themes/default/collections/grid.overrides +0 -1
  343. package/src/themes/default/collections/grid.variables +14 -16
  344. package/src/themes/default/collections/menu.variables +31 -45
  345. package/src/themes/default/collections/message.variables +84 -123
  346. package/src/themes/default/collections/table.overrides +3 -0
  347. package/src/themes/default/collections/table.variables +30 -34
  348. package/src/themes/default/elements/button.variables +45 -52
  349. package/src/themes/default/elements/container.variables +8 -16
  350. package/src/themes/default/elements/divider.overrides +8 -9
  351. package/src/themes/default/elements/divider.variables +5 -6
  352. package/src/themes/default/elements/emoji.overrides +0 -1
  353. package/src/themes/default/elements/emoji.variables +3555 -3555
  354. package/src/themes/default/elements/flag.variables +1594 -1594
  355. package/src/themes/default/elements/header.overrides +0 -1
  356. package/src/themes/default/elements/header.variables +21 -21
  357. package/src/themes/default/elements/icon.variables +2023 -2009
  358. package/src/themes/default/elements/image.variables +6 -7
  359. package/src/themes/default/elements/input.variables +11 -12
  360. package/src/themes/default/elements/label.variables +25 -26
  361. package/src/themes/default/elements/list.variables +17 -21
  362. package/src/themes/default/elements/loader.variables +16 -17
  363. package/src/themes/default/elements/placeholder.variables +12 -9
  364. package/src/themes/default/elements/rail.variables +4 -5
  365. package/src/themes/default/elements/reveal.variables +1 -1
  366. package/src/themes/default/elements/segment.variables +24 -36
  367. package/src/themes/default/elements/step.overrides +4 -4
  368. package/src/themes/default/elements/step.variables +19 -22
  369. package/src/themes/default/elements/text.variables +2 -3
  370. package/src/themes/default/globals/colors.less +588 -588
  371. package/src/themes/default/globals/reset.overrides +63 -59
  372. package/src/themes/default/globals/reset.variables +1 -1
  373. package/src/themes/default/globals/site.variables +1075 -1123
  374. package/src/themes/default/globals/variation.variables +13 -4
  375. package/src/themes/default/modules/accordion.overrides +11 -11
  376. package/src/themes/default/modules/accordion.variables +15 -20
  377. package/src/themes/default/modules/calendar.variables +2 -0
  378. package/src/themes/default/modules/chatroom.variables +1 -1
  379. package/src/themes/default/modules/checkbox.overrides +8 -9
  380. package/src/themes/default/modules/checkbox.variables +24 -33
  381. package/src/themes/default/modules/dimmer.variables +14 -17
  382. package/src/themes/default/modules/dropdown.overrides +17 -17
  383. package/src/themes/default/modules/dropdown.variables +29 -31
  384. package/src/themes/default/modules/embed.variables +9 -13
  385. package/src/themes/default/modules/flyout.variables +8 -8
  386. package/src/themes/default/modules/modal.variables +64 -67
  387. package/src/themes/default/modules/nag.variables +11 -14
  388. package/src/themes/default/modules/popup.variables +14 -13
  389. package/src/themes/default/modules/progress.variables +17 -19
  390. package/src/themes/default/modules/rating.variables +10 -12
  391. package/src/themes/default/modules/search.variables +12 -17
  392. package/src/themes/default/modules/shape.variables +7 -8
  393. package/src/themes/default/modules/sidebar.variables +4 -4
  394. package/src/themes/default/modules/slider.variables +55 -54
  395. package/src/themes/default/modules/sticky.variables +1 -1
  396. package/src/themes/default/modules/toast.variables +8 -8
  397. package/src/themes/default/modules/transition.overrides +936 -915
  398. package/src/themes/default/modules/transition.variables +8 -1
  399. package/src/themes/default/views/ad.variables +1 -1
  400. package/src/themes/default/views/card.variables +33 -45
  401. package/src/themes/default/views/comment.variables +7 -9
  402. package/src/themes/default/views/feed.variables +10 -10
  403. package/src/themes/default/views/item.variables +20 -23
  404. package/src/themes/default/views/statistic.variables +8 -8
  405. package/src/themes/duo/elements/loader.variables +1 -1
  406. package/src/themes/famfamfam/elements/flag.overrides +263 -268
  407. package/src/themes/famfamfam/elements/flag.variables +4 -4
  408. package/src/themes/fixed-width/collections/grid.variables +4 -4
  409. package/src/themes/fixed-width/modules/modal.variables +11 -13
  410. package/src/themes/flat/collections/form.overrides +9 -9
  411. package/src/themes/flat/collections/form.variables +16 -17
  412. package/src/themes/flat/globals/site.variables +69 -74
  413. package/src/themes/github/assets/fonts/octicons.woff2 +0 -0
  414. package/src/themes/github/collections/breadcrumb.variables +0 -1
  415. package/src/themes/github/collections/form.overrides +7 -8
  416. package/src/themes/github/collections/form.variables +16 -18
  417. package/src/themes/github/collections/grid.variables +1 -2
  418. package/src/themes/github/collections/menu.overrides +2 -2
  419. package/src/themes/github/collections/menu.variables +24 -26
  420. package/src/themes/github/collections/message.overrides +3 -3
  421. package/src/themes/github/collections/message.variables +12 -14
  422. package/src/themes/github/collections/table.variables +2 -2
  423. package/src/themes/github/elements/button.overrides +0 -1
  424. package/src/themes/github/elements/button.variables +26 -30
  425. package/src/themes/github/elements/header.variables +2 -2
  426. package/src/themes/github/elements/icon.overrides +3 -208
  427. package/src/themes/github/elements/icon.variables +234 -19
  428. package/src/themes/github/elements/image.variables +1 -1
  429. package/src/themes/github/elements/input.overrides +16 -16
  430. package/src/themes/github/elements/input.variables +4 -5
  431. package/src/themes/github/elements/label.overrides +3 -3
  432. package/src/themes/github/elements/label.variables +0 -1
  433. package/src/themes/github/elements/segment.variables +9 -10
  434. package/src/themes/github/elements/step.overrides +13 -13
  435. package/src/themes/github/elements/step.variables +6 -6
  436. package/src/themes/github/globals/site.variables +16 -16
  437. package/src/themes/github/modules/dropdown.overrides +18 -19
  438. package/src/themes/github/modules/dropdown.variables +8 -10
  439. package/src/themes/github/modules/popup.variables +0 -2
  440. package/src/themes/gmail/collections/message.overrides +3 -0
  441. package/src/themes/gmail/collections/message.variables +4 -4
  442. package/src/themes/instagram/views/card.overrides +4 -5
  443. package/src/themes/instagram/views/card.variables +7 -8
  444. package/src/themes/joypixels/elements/emoji.overrides +0 -2
  445. package/src/themes/joypixels/elements/emoji.variables +3554 -3554
  446. package/src/themes/material/collections/menu.overrides +1 -1
  447. package/src/themes/material/collections/menu.variables +4 -4
  448. package/src/themes/material/elements/button.overrides +7 -9
  449. package/src/themes/material/elements/button.variables +44 -46
  450. package/src/themes/material/elements/header.overrides +3 -3
  451. package/src/themes/material/elements/header.variables +8 -10
  452. package/src/themes/material/elements/icon.overrides +3 -934
  453. package/src/themes/material/elements/icon.variables +958 -18
  454. package/src/themes/material/globals/site.overrides +3 -0
  455. package/src/themes/material/globals/site.variables +83 -84
  456. package/src/themes/material/modules/dropdown.overrides +2 -2
  457. package/src/themes/material/modules/dropdown.variables +5 -5
  458. package/src/themes/material/modules/modal.overrides +3 -3
  459. package/src/themes/material/modules/modal.variables +4 -5
  460. package/src/themes/pulsar/elements/loader.overrides +23 -61
  461. package/src/themes/raised/elements/button.variables +8 -9
  462. package/src/themes/resetcss/globals/reset.overrides +115 -33
  463. package/src/themes/resetcss/globals/reset.variables +1 -1
  464. package/src/themes/round/elements/button.overrides +3 -0
  465. package/src/themes/round/elements/button.variables +33 -38
  466. package/src/themes/rtl/globals/site.overrides +1 -1
  467. package/src/themes/rtl/globals/site.variables +5 -6
  468. package/src/themes/striped/modules/progress.overrides +20 -16
  469. package/src/themes/systemfont/globals/reset.overrides +1 -1
  470. package/src/themes/systemfont/globals/site.variables +6 -6
  471. package/src/themes/timeline/views/feed.overrides +12 -12
  472. package/src/themes/timeline/views/feed.variables +8 -8
  473. package/src/themes/twitter/elements/button.overrides +4 -5
  474. package/src/themes/twitter/elements/button.variables +17 -18
  475. package/src/themes/twitter/elements/emoji.variables +3555 -3555
  476. package/tasks/.eslintrc.js +9 -0
  477. package/tasks/README.md +2 -4
  478. package/tasks/admin/components/create.js +268 -277
  479. package/tasks/admin/components/init.js +123 -130
  480. package/tasks/admin/components/update.js +151 -159
  481. package/tasks/admin/distributions/create.js +183 -189
  482. package/tasks/admin/distributions/init.js +125 -132
  483. package/tasks/admin/distributions/update.js +147 -154
  484. package/tasks/admin/publish.js +5 -9
  485. package/tasks/admin/register.js +37 -39
  486. package/tasks/admin/release.js +8 -12
  487. package/tasks/build/assets.js +43 -40
  488. package/tasks/build/css.js +230 -217
  489. package/tasks/build/javascript.js +120 -114
  490. package/tasks/build.js +11 -11
  491. package/tasks/check-install.js +15 -17
  492. package/tasks/clean.js +6 -6
  493. package/tasks/collections/README.md +3 -5
  494. package/tasks/collections/admin.js +34 -36
  495. package/tasks/collections/build.js +18 -20
  496. package/tasks/collections/docs.js +10 -12
  497. package/tasks/collections/install.js +10 -12
  498. package/tasks/collections/rtl.js +9 -11
  499. package/tasks/collections/various.js +9 -11
  500. package/tasks/config/admin/github.js +17 -19
  501. package/tasks/config/admin/oauth.example.js +4 -4
  502. package/tasks/config/admin/release.js +98 -98
  503. package/tasks/config/admin/templates/README.md +8 -8
  504. package/tasks/config/admin/templates/bower.json +3 -2
  505. package/tasks/config/admin/templates/component-package.js +9 -10
  506. package/tasks/config/admin/templates/css-package.js +19 -21
  507. package/tasks/config/admin/templates/less-package.js +12 -14
  508. package/tasks/config/admin/templates/package.json +5 -5
  509. package/tasks/config/defaults.js +116 -116
  510. package/tasks/config/docs.js +23 -23
  511. package/tasks/config/npm/gulpfile.js +13 -14
  512. package/tasks/config/project/config.js +124 -136
  513. package/tasks/config/project/install.js +722 -719
  514. package/tasks/config/project/release.js +34 -41
  515. package/tasks/config/tasks.js +168 -167
  516. package/tasks/config/user.js +28 -29
  517. package/tasks/docs/build.js +100 -96
  518. package/tasks/docs/metadata.js +91 -98
  519. package/tasks/docs/serve.js +84 -82
  520. package/tasks/install.js +373 -382
  521. package/tasks/rtl/build.js +2 -4
  522. package/tasks/rtl/watch.js +2 -4
  523. package/tasks/version.js +4 -6
  524. package/tasks/watch.js +29 -31
  525. package/test/.eslintrc.js +23 -0
  526. package/test/meteor/assets.js +11 -14
  527. package/test/meteor/fonts.js +12 -13
  528. package/test/modules/accordion.spec.js +6 -8
  529. package/test/modules/checkbox.spec.js +5 -7
  530. package/test/modules/dropdown.spec.js +5 -7
  531. package/test/modules/modal.spec.js +6 -8
  532. package/test/modules/module.spec.js +158 -178
  533. package/test/modules/popup.spec.js +5 -7
  534. package/test/modules/search.spec.js +5 -7
  535. package/test/modules/shape.spec.js +5 -7
  536. package/test/modules/sidebar.spec.js +5 -7
  537. package/test/modules/tab.spec.js +6 -8
  538. package/test/modules/transition.spec.js +5 -7
  539. package/test/modules/video.spec.js +5 -7
  540. package/.github/workflows/codeql.yml +0 -68
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * # Fomantic-UI 2.9.1-beta.3+4b673d8 - Search
2
+ * # Fomantic-UI 2.9.1-beta.30+42e4040 - Search
3
3
  * https://github.com/fomantic/Fomantic-UI/
4
4
  *
5
5
  *
@@ -8,1587 +8,1546 @@
8
8
  *
9
9
  */
10
10
 
11
- ;(function ($, window, document, undefined) {
12
-
13
- 'use strict';
14
-
15
- $.isFunction = $.isFunction || function(obj) {
16
- return typeof obj === "function" && typeof obj.nodeType !== "number";
17
- };
18
-
19
- window = (typeof window != 'undefined' && window.Math == Math)
20
- ? window
21
- : (typeof self != 'undefined' && self.Math == Math)
22
- ? self
23
- : Function('return this')()
24
- ;
25
-
26
- $.fn.search = function(parameters) {
27
- var
28
- $allModules = $(this),
29
- moduleSelector = $allModules.selector || '',
30
-
31
- time = new Date().getTime(),
32
- performance = [],
33
-
34
- query = arguments[0],
35
- methodInvoked = (typeof query == 'string'),
36
- queryArguments = [].slice.call(arguments, 1),
37
- returnedValue
38
- ;
39
- $(this)
40
- .each(function() {
41
- var
42
- settings = ( $.isPlainObject(parameters) )
43
- ? $.extend(true, {}, $.fn.search.settings, parameters)
44
- : $.extend({}, $.fn.search.settings),
45
-
46
- className = settings.className,
47
- metadata = settings.metadata,
48
- regExp = settings.regExp,
49
- fields = settings.fields,
50
- selector = settings.selector,
51
- error = settings.error,
52
- namespace = settings.namespace,
53
-
54
- eventNamespace = '.' + namespace,
55
- moduleNamespace = namespace + '-module',
56
-
57
- $module = $(this),
58
- $prompt = $module.find(selector.prompt),
59
- $searchButton = $module.find(selector.searchButton),
60
- $results = $module.find(selector.results),
61
- $result = $module.find(selector.result),
62
- $category = $module.find(selector.category),
63
-
64
- element = this,
65
- instance = $module.data(moduleNamespace),
66
-
67
- disabledBubbled = false,
68
- resultsDismissed = false,
69
-
70
- module
71
- ;
72
-
73
- module = {
74
-
75
- initialize: function() {
76
- module.verbose('Initializing module');
77
- module.get.settings();
78
- module.determine.searchFields();
79
- module.bind.events();
80
- module.set.type();
81
- module.create.results();
82
- module.instantiate();
83
- },
84
- instantiate: function() {
85
- module.verbose('Storing instance of module', module);
86
- instance = module;
87
- $module
88
- .data(moduleNamespace, module)
89
- ;
90
- },
91
- destroy: function() {
92
- module.verbose('Destroying instance');
93
- $module
94
- .off(eventNamespace)
95
- .removeData(moduleNamespace)
96
- ;
97
- },
11
+ (function ($, window, document) {
12
+ 'use strict';
98
13
 
99
- refresh: function() {
100
- module.debug('Refreshing selector cache');
101
- $prompt = $module.find(selector.prompt);
102
- $searchButton = $module.find(selector.searchButton);
103
- $category = $module.find(selector.category);
104
- $results = $module.find(selector.results);
105
- $result = $module.find(selector.result);
106
- },
14
+ function isFunction(obj) {
15
+ return typeof obj === 'function' && typeof obj.nodeType !== 'number';
16
+ }
107
17
 
108
- refreshResults: function() {
109
- $results = $module.find(selector.results);
110
- $result = $module.find(selector.result);
111
- },
18
+ window = window !== undefined && window.Math === Math
19
+ ? window
20
+ : globalThis;
112
21
 
113
- bind: {
114
- events: function() {
115
- module.verbose('Binding events to search');
116
- if(settings.automatic) {
117
- $module
118
- .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)
119
- ;
120
- $prompt
121
- .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
122
- ;
123
- }
124
- $module
125
- // prompt
126
- .on('focus' + eventNamespace, selector.prompt, module.event.focus)
127
- .on('blur' + eventNamespace, selector.prompt, module.event.blur)
128
- .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)
129
- // search button
130
- .on('click' + eventNamespace, selector.searchButton, module.query)
131
- // results
132
- .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)
133
- .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)
134
- .on('click' + eventNamespace, selector.result, module.event.result.click)
135
- ;
136
- }
137
- },
22
+ $.fn.search = function (parameters) {
23
+ var
24
+ $allModules = $(this),
25
+ moduleSelector = $allModules.selector || '',
138
26
 
139
- determine: {
140
- searchFields: function() {
141
- // this makes sure $.extend does not add specified search fields to default fields
142
- // this is the only setting which should not extend defaults
143
- if(parameters && parameters.searchFields !== undefined) {
144
- settings.searchFields = parameters.searchFields;
145
- }
146
- }
147
- },
27
+ time = Date.now(),
28
+ performance = [],
148
29
 
149
- event: {
150
- input: function() {
151
- if(settings.searchDelay) {
152
- clearTimeout(module.timer);
153
- module.timer = setTimeout(function() {
154
- if(module.is.focused()) {
155
- module.query();
156
- }
157
- }, settings.searchDelay);
158
- }
159
- else {
160
- module.query();
161
- }
162
- },
163
- focus: function() {
164
- module.set.focus();
165
- if(settings.searchOnFocus && module.has.minimumCharacters() ) {
166
- module.query(function() {
167
- if(module.can.show() ) {
168
- module.showResults();
169
- }
170
- });
171
- }
172
- },
173
- blur: function(event) {
30
+ query = arguments[0],
31
+ methodInvoked = typeof query === 'string',
32
+ queryArguments = [].slice.call(arguments, 1),
33
+ returnedValue
34
+ ;
35
+ $allModules.each(function () {
174
36
  var
175
- pageLostFocus = (document.activeElement === this),
176
- callback = function() {
177
- module.cancel.query();
178
- module.remove.focus();
179
- module.timer = setTimeout(module.hideResults, settings.hideDelay);
180
- }
37
+ settings = $.isPlainObject(parameters)
38
+ ? $.extend(true, {}, $.fn.search.settings, parameters)
39
+ : $.extend({}, $.fn.search.settings),
40
+
41
+ className = settings.className,
42
+ metadata = settings.metadata,
43
+ regExp = settings.regExp,
44
+ fields = settings.fields,
45
+ selector = settings.selector,
46
+ error = settings.error,
47
+ namespace = settings.namespace,
48
+
49
+ eventNamespace = '.' + namespace,
50
+ moduleNamespace = namespace + '-module',
51
+
52
+ $module = $(this),
53
+ $prompt = $module.find(selector.prompt),
54
+ $searchButton = $module.find(selector.searchButton),
55
+ $results = $module.find(selector.results),
56
+ $result = $module.find(selector.result),
57
+ $category = $module.find(selector.category),
58
+
59
+ element = this,
60
+ instance = $module.data(moduleNamespace),
61
+
62
+ disabledBubbled = false,
63
+ resultsDismissed = false,
64
+
65
+ module
181
66
  ;
182
- if(pageLostFocus) {
183
- return;
184
- }
185
- resultsDismissed = false;
186
- if(module.resultsClicked) {
187
- module.debug('Determining if user action caused search to close');
188
- $module
189
- .one('click.close' + eventNamespace, selector.results, function(event) {
190
- if(module.is.inMessage(event) || disabledBubbled) {
191
- $prompt.focus();
192
- return;
193
- }
194
- disabledBubbled = false;
195
- if( !module.is.animating() && !module.is.hidden()) {
196
- callback();
197
- }
198
- })
199
- ;
200
- }
201
- else {
202
- module.debug('Input blurred without user action, closing results');
203
- callback();
204
- }
205
- },
206
- result: {
207
- mousedown: function() {
208
- module.resultsClicked = true;
209
- },
210
- mouseup: function() {
211
- module.resultsClicked = false;
212
- },
213
- click: function(event) {
214
- module.debug('Search result selected');
215
- var
216
- $result = $(this),
217
- $title = $result.find(selector.title).eq(0),
218
- $link = $result.is('a[href]')
219
- ? $result
220
- : $result.find('a[href]').eq(0),
221
- href = $link.attr('href') || false,
222
- target = $link.attr('target') || false,
223
- // title is used for result lookup
224
- value = ($title.length > 0)
225
- ? $title.text()
226
- : false,
227
- results = module.get.results(),
228
- result = $result.data(metadata.result) || module.get.result(value, results)
229
- ;
230
- var oldValue = module.get.value();
231
- if( $.isFunction(settings.onSelect) ) {
232
- if(settings.onSelect.call(element, result, results) === false) {
233
- module.debug('Custom onSelect callback cancelled default select action');
234
- disabledBubbled = true;
235
- return;
236
- }
237
- }
238
- module.hideResults();
239
- if(value && module.get.value() === oldValue) {
240
- module.set.value(value);
241
- }
242
- if(href) {
243
- event.preventDefault();
244
- module.verbose('Opening search link found in result', $link);
245
- if(target == '_blank' || event.ctrlKey) {
246
- window.open(href);
247
- }
248
- else {
249
- window.location.href = (href);
250
- }
251
- }
252
- }
253
- }
254
- },
255
- ensureVisible: function($el) {
256
- var elTop, elBottom, resultsScrollTop, resultsHeight;
257
- if($el.length === 0) {
258
- return;
259
- }
260
- elTop = $el.position().top;
261
- elBottom = elTop + $el.outerHeight(true);
262
-
263
- resultsScrollTop = $results.scrollTop();
264
- resultsHeight = $results.height();
265
-
266
- if (elTop < 0) {
267
- $results.scrollTop(resultsScrollTop + elTop);
268
- }
269
-
270
- else if (resultsHeight < elBottom) {
271
- $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight));
272
- }
273
- },
274
- handleKeyboard: function(event) {
275
- var
276
- // force selector refresh
277
- $result = $module.find(selector.result),
278
- $category = $module.find(selector.category),
279
- $activeResult = $result.filter('.' + className.active),
280
- currentIndex = $result.index( $activeResult ),
281
- resultSize = $result.length,
282
- hasActiveResult = $activeResult.length > 0,
283
-
284
- keyCode = event.which,
285
- keys = {
286
- backspace : 8,
287
- enter : 13,
288
- escape : 27,
289
- upArrow : 38,
290
- downArrow : 40
291
- },
292
- newIndex
293
- ;
294
- // search shortcuts
295
- if(keyCode == keys.escape) {
296
- if(!module.is.visible()) {
297
- module.verbose('Escape key pressed, blurring search field');
298
- $prompt.blur();
299
- } else {
300
- module.hideResults();
301
- }
302
- event.stopPropagation();
303
- resultsDismissed = true;
304
- }
305
- if( module.is.visible() ) {
306
- if(keyCode == keys.enter) {
307
- module.verbose('Enter key pressed, selecting active result');
308
- if( $result.filter('.' + className.active).length > 0 ) {
309
- module.event.result.click.call($result.filter('.' + className.active), event);
310
- event.preventDefault();
311
- return false;
312
- }
313
- }
314
- else if(keyCode == keys.upArrow && hasActiveResult) {
315
- module.verbose('Up key pressed, changing active result');
316
- newIndex = (currentIndex - 1 < 0)
317
- ? currentIndex
318
- : currentIndex - 1
319
- ;
320
- $category
321
- .removeClass(className.active)
322
- ;
323
- $result
324
- .removeClass(className.active)
325
- .eq(newIndex)
326
- .addClass(className.active)
327
- .closest($category)
328
- .addClass(className.active)
329
- ;
330
- module.ensureVisible($result.eq(newIndex));
331
- event.preventDefault();
332
- }
333
- else if(keyCode == keys.downArrow) {
334
- module.verbose('Down key pressed, changing active result');
335
- newIndex = (currentIndex + 1 >= resultSize)
336
- ? currentIndex
337
- : currentIndex + 1
338
- ;
339
- $category
340
- .removeClass(className.active)
341
- ;
342
- $result
343
- .removeClass(className.active)
344
- .eq(newIndex)
345
- .addClass(className.active)
346
- .closest($category)
347
- .addClass(className.active)
348
- ;
349
- module.ensureVisible($result.eq(newIndex));
350
- event.preventDefault();
351
- }
352
- }
353
- else {
354
- // query shortcuts
355
- if(keyCode == keys.enter) {
356
- module.verbose('Enter key pressed, executing query');
357
- module.query();
358
- module.set.buttonPressed();
359
- $prompt.one('keyup', module.remove.buttonFocus);
360
- }
361
- }
362
- },
363
67
 
364
- setup: {
365
- api: function(searchTerm, callback) {
366
- var
367
- apiSettings = {
368
- debug : settings.debug,
369
- on : false,
370
- cache : settings.cache,
371
- action : 'search',
372
- urlData : {
373
- query : searchTerm
68
+ module = {
69
+
70
+ initialize: function () {
71
+ module.verbose('Initializing module');
72
+ module.get.settings();
73
+ module.determine.searchFields();
74
+ module.bind.events();
75
+ module.set.type();
76
+ module.create.results();
77
+ module.instantiate();
374
78
  },
375
- },
376
- apiCallbacks = {
377
- onSuccess : function(response, $module, xhr) {
378
- module.parse.response.call(element, response, searchTerm);
379
- callback();
380
- if(settings.apiSettings && typeof settings.apiSettings.onSuccess === 'function') {
381
- settings.apiSettings.onSuccess.call(this, response, $module, xhr);
382
- }
79
+ instantiate: function () {
80
+ module.verbose('Storing instance of module', module);
81
+ instance = module;
82
+ $module
83
+ .data(moduleNamespace, module)
84
+ ;
383
85
  },
384
- onFailure : function(response, $module, xhr) {
385
- module.displayMessage(error.serverError);
386
- callback();
387
- if(settings.apiSettings && typeof settings.apiSettings.onFailure === 'function') {
388
- settings.apiSettings.onFailure.call(this, response, $module, xhr);
389
- }
86
+ destroy: function () {
87
+ module.verbose('Destroying instance');
88
+ $module
89
+ .off(eventNamespace)
90
+ .removeData(moduleNamespace)
91
+ ;
390
92
  },
391
- onAbort : function(status, $module, xhr) {
392
- if(settings.apiSettings && typeof settings.apiSettings.onAbort === 'function') {
393
- settings.apiSettings.onAbort.call(this, status, $module, xhr);
394
- }
93
+
94
+ refresh: function () {
95
+ module.debug('Refreshing selector cache');
96
+ $prompt = $module.find(selector.prompt);
97
+ $searchButton = $module.find(selector.searchButton);
98
+ $category = $module.find(selector.category);
99
+ $results = $module.find(selector.results);
100
+ $result = $module.find(selector.result);
395
101
  },
396
- onError : function(errorMessage, $module, xhr){
397
- module.error();
398
- if(settings.apiSettings && typeof settings.apiSettings.onError === 'function') {
399
- settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
400
- }
401
- }
402
- }
403
- ;
404
- $.extend(true, apiSettings, settings.apiSettings, apiCallbacks);
405
- module.verbose('Setting up API request', apiSettings);
406
- $module.api(apiSettings);
407
- }
408
- },
409
102
 
410
- can: {
411
- useAPI: function() {
412
- return $.fn.api !== undefined;
413
- },
414
- show: function() {
415
- return module.is.focused() && !module.is.visible() && !module.is.empty();
416
- },
417
- transition: function() {
418
- return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');
419
- }
420
- },
103
+ refreshResults: function () {
104
+ $results = $module.find(selector.results);
105
+ $result = $module.find(selector.result);
106
+ },
421
107
 
422
- is: {
423
- animating: function() {
424
- return $results.hasClass(className.animating);
425
- },
426
- chrome: function() {
427
- return !!window.chrome && !window.StyleMedia;
428
- },
429
- hidden: function() {
430
- return $results.hasClass(className.hidden);
431
- },
432
- inMessage: function(event) {
433
- if(!event.target) {
434
- return;
435
- }
436
- var
437
- $target = $(event.target),
438
- isInDOM = $.contains(document.documentElement, event.target)
439
- ;
440
- return (isInDOM && $target.closest(selector.message).length > 0);
441
- },
442
- empty: function() {
443
- return ($results.html() === '');
444
- },
445
- visible: function() {
446
- return ($results.filter(':visible').length > 0);
447
- },
448
- focused: function() {
449
- return ($prompt.filter(':focus').length > 0);
450
- }
451
- },
108
+ bind: {
109
+ events: function () {
110
+ module.verbose('Binding events to search');
111
+ if (settings.automatic) {
112
+ $module
113
+ .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)
114
+ ;
115
+ $prompt
116
+ .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
117
+ ;
118
+ }
119
+ $module
120
+ // prompt
121
+ .on('focus' + eventNamespace, selector.prompt, module.event.focus)
122
+ .on('blur' + eventNamespace, selector.prompt, module.event.blur)
123
+ .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)
124
+ // search button
125
+ .on('click' + eventNamespace, selector.searchButton, module.query)
126
+ // results
127
+ .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)
128
+ .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)
129
+ .on('click' + eventNamespace, selector.result, module.event.result.click)
130
+ ;
131
+ },
132
+ },
452
133
 
453
- get: {
454
- settings: function() {
455
- if($.isPlainObject(parameters) && parameters.searchFullText) {
456
- settings.fullTextSearch = parameters.searchFullText;
457
- module.error(settings.error.oldSearchSyntax, element);
458
- }
459
- if (settings.ignoreDiacritics && !String.prototype.normalize) {
460
- settings.ignoreDiacritics = false;
461
- module.error(error.noNormalize, element);
462
- }
463
- },
464
- inputEvent: function() {
465
- var
466
- prompt = $prompt[0],
467
- inputEvent = (prompt !== undefined && prompt.oninput !== undefined)
468
- ? 'input'
469
- : (prompt !== undefined && prompt.onpropertychange !== undefined)
470
- ? 'propertychange'
471
- : 'keyup'
472
- ;
473
- return inputEvent;
474
- },
475
- value: function() {
476
- return $prompt.val();
477
- },
478
- results: function() {
479
- return $module.data(metadata.results);
480
- },
481
- result: function(value, results) {
482
- var
483
- result = false
484
- ;
485
- value = (value !== undefined)
486
- ? value
487
- : module.get.value()
488
- ;
489
- results = (results !== undefined)
490
- ? results
491
- : module.get.results()
492
- ;
493
- if(settings.type === 'category') {
494
- module.debug('Finding result that matches', value);
495
- $.each(results, function(index, category) {
496
- if(Array.isArray(category.results)) {
497
- result = module.search.object(value, category.results)[0];
498
- // don't continue searching if a result is found
499
- if(result) {
500
- return false;
501
- }
502
- }
503
- });
504
- }
505
- else {
506
- module.debug('Finding result in results object', value);
507
- result = module.search.object(value, results)[0];
508
- }
509
- return result || false;
510
- },
511
- },
134
+ determine: {
135
+ searchFields: function () {
136
+ // this makes sure $.extend does not add specified search fields to default fields
137
+ // this is the only setting which should not extend defaults
138
+ if (parameters && parameters.searchFields !== undefined) {
139
+ settings.searchFields = parameters.searchFields;
140
+ }
141
+ },
142
+ },
512
143
 
513
- select: {
514
- firstResult: function() {
515
- module.verbose('Selecting first result');
516
- $result.first().addClass(className.active);
517
- }
518
- },
144
+ event: {
145
+ input: function () {
146
+ if (settings.searchDelay) {
147
+ clearTimeout(module.timer);
148
+ module.timer = setTimeout(function () {
149
+ if (module.is.focused()) {
150
+ module.query();
151
+ }
152
+ }, settings.searchDelay);
153
+ } else {
154
+ module.query();
155
+ }
156
+ },
157
+ focus: function () {
158
+ module.set.focus();
159
+ if (settings.searchOnFocus && module.has.minimumCharacters()) {
160
+ module.query(function () {
161
+ if (module.can.show()) {
162
+ module.showResults();
163
+ }
164
+ });
165
+ }
166
+ },
167
+ blur: function (event) {
168
+ var
169
+ pageLostFocus = document.activeElement === this,
170
+ callback = function () {
171
+ module.cancel.query();
172
+ module.remove.focus();
173
+ module.timer = setTimeout(module.hideResults, settings.hideDelay);
174
+ }
175
+ ;
176
+ if (pageLostFocus) {
177
+ return;
178
+ }
179
+ resultsDismissed = false;
180
+ if (module.resultsClicked) {
181
+ module.debug('Determining if user action caused search to close');
182
+ $module
183
+ .one('click.close' + eventNamespace, selector.results, function (event) {
184
+ if (module.is.inMessage(event) || disabledBubbled) {
185
+ $prompt.trigger('focus');
186
+
187
+ return;
188
+ }
189
+ disabledBubbled = false;
190
+ if (!module.is.animating() && !module.is.hidden()) {
191
+ callback();
192
+ }
193
+ })
194
+ ;
195
+ } else {
196
+ module.debug('Input blurred without user action, closing results');
197
+ callback();
198
+ }
199
+ },
200
+ result: {
201
+ mousedown: function () {
202
+ module.resultsClicked = true;
203
+ },
204
+ mouseup: function () {
205
+ module.resultsClicked = false;
206
+ },
207
+ click: function (event) {
208
+ module.debug('Search result selected');
209
+ var
210
+ $result = $(this),
211
+ $title = $result.find(selector.title).eq(0),
212
+ $link = $result.is('a[href]')
213
+ ? $result
214
+ : $result.find('a[href]').eq(0),
215
+ href = $link.attr('href') || false,
216
+ target = $link.attr('target') || false,
217
+ // title is used for result lookup
218
+ value = $title.length > 0
219
+ ? $title.text()
220
+ : false,
221
+ results = module.get.results(),
222
+ result = $result.data(metadata.result) || module.get.result(value, results)
223
+ ;
224
+ var oldValue = module.get.value();
225
+ if (isFunction(settings.onSelect)) {
226
+ if (settings.onSelect.call(element, result, results) === false) {
227
+ module.debug('Custom onSelect callback cancelled default select action');
228
+ disabledBubbled = true;
229
+
230
+ return;
231
+ }
232
+ }
233
+ module.hideResults();
234
+ if (value && module.get.value() === oldValue) {
235
+ module.set.value(value);
236
+ }
237
+ if (href) {
238
+ event.preventDefault();
239
+ module.verbose('Opening search link found in result', $link);
240
+ if (target === '_blank' || event.ctrlKey) {
241
+ window.open(href);
242
+ } else {
243
+ window.location.href = href;
244
+ }
245
+ }
246
+ },
247
+ },
248
+ },
249
+ ensureVisible: function ($el) {
250
+ var
251
+ elTop,
252
+ elBottom,
253
+ resultsScrollTop,
254
+ resultsHeight
255
+ ;
256
+ if ($el.length === 0) {
257
+ return;
258
+ }
259
+ elTop = $el.position().top;
260
+ elBottom = elTop + $el.outerHeight(true);
519
261
 
520
- set: {
521
- focus: function() {
522
- $module.addClass(className.focus);
523
- },
524
- loading: function() {
525
- $module.addClass(className.loading);
526
- },
527
- value: function(value) {
528
- module.verbose('Setting search input value', value);
529
- $prompt
530
- .val(value)
531
- ;
532
- },
533
- type: function(type) {
534
- type = type || settings.type;
535
- if(className[type]) {
536
- $module.addClass(className[type]);
537
- }
538
- },
539
- buttonPressed: function() {
540
- $searchButton.addClass(className.pressed);
541
- }
542
- },
262
+ resultsScrollTop = $results.scrollTop();
263
+ resultsHeight = $results.height();
543
264
 
544
- remove: {
545
- loading: function() {
546
- $module.removeClass(className.loading);
547
- },
548
- focus: function() {
549
- $module.removeClass(className.focus);
550
- },
551
- buttonPressed: function() {
552
- $searchButton.removeClass(className.pressed);
553
- },
554
- diacritics: function(text) {
555
- return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036f]/g, '') : text;
556
- }
557
- },
265
+ if (elTop < 0) {
266
+ $results.scrollTop(resultsScrollTop + elTop);
267
+ } else if (resultsHeight < elBottom) {
268
+ $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight));
269
+ }
270
+ },
271
+ handleKeyboard: function (event) {
272
+ var
273
+ // force selector refresh
274
+ $result = $module.find(selector.result),
275
+ $category = $module.find(selector.category),
276
+ $activeResult = $result.filter('.' + className.active),
277
+ currentIndex = $result.index($activeResult),
278
+ resultSize = $result.length,
279
+ hasActiveResult = $activeResult.length > 0,
280
+
281
+ keyCode = event.which,
282
+ keys = {
283
+ backspace: 8,
284
+ enter: 13,
285
+ escape: 27,
286
+ upArrow: 38,
287
+ downArrow: 40,
288
+ },
289
+ newIndex
290
+ ;
291
+ // search shortcuts
292
+ if (keyCode === keys.escape) {
293
+ if (!module.is.visible()) {
294
+ module.verbose('Escape key pressed, blurring search field');
295
+ $prompt.trigger('blur');
296
+ } else {
297
+ module.hideResults();
298
+ }
299
+ event.stopPropagation();
300
+ resultsDismissed = true;
301
+ }
302
+ if (module.is.visible()) {
303
+ if (keyCode === keys.enter) {
304
+ module.verbose('Enter key pressed, selecting active result');
305
+ if ($result.filter('.' + className.active).length > 0) {
306
+ module.event.result.click.call($result.filter('.' + className.active), event);
307
+ event.preventDefault();
308
+
309
+ return false;
310
+ }
311
+ } else if (keyCode === keys.upArrow && hasActiveResult) {
312
+ module.verbose('Up key pressed, changing active result');
313
+ newIndex = currentIndex - 1 < 0
314
+ ? currentIndex
315
+ : currentIndex - 1;
316
+ $category
317
+ .removeClass(className.active)
318
+ ;
319
+ $result
320
+ .removeClass(className.active)
321
+ .eq(newIndex)
322
+ .addClass(className.active)
323
+ .closest($category)
324
+ .addClass(className.active)
325
+ ;
326
+ module.ensureVisible($result.eq(newIndex));
327
+ event.preventDefault();
328
+ } else if (keyCode === keys.downArrow) {
329
+ module.verbose('Down key pressed, changing active result');
330
+ newIndex = currentIndex + 1 >= resultSize
331
+ ? currentIndex
332
+ : currentIndex + 1;
333
+ $category
334
+ .removeClass(className.active)
335
+ ;
336
+ $result
337
+ .removeClass(className.active)
338
+ .eq(newIndex)
339
+ .addClass(className.active)
340
+ .closest($category)
341
+ .addClass(className.active)
342
+ ;
343
+ module.ensureVisible($result.eq(newIndex));
344
+ event.preventDefault();
345
+ }
346
+ } else {
347
+ // query shortcuts
348
+ if (keyCode === keys.enter) {
349
+ module.verbose('Enter key pressed, executing query');
350
+ module.query();
351
+ module.set.buttonPressed();
352
+ $prompt.one('keyup', module.remove.buttonFocus);
353
+ }
354
+ }
355
+ },
558
356
 
559
- query: function(callback) {
560
- callback = $.isFunction(callback)
561
- ? callback
562
- : function(){}
563
- ;
564
- var
565
- searchTerm = module.get.value(),
566
- cache = module.read.cache(searchTerm)
567
- ;
568
- callback = callback || function() {};
569
- if( module.has.minimumCharacters() ) {
570
- if(cache) {
571
- module.debug('Reading result from cache', searchTerm);
572
- module.save.results(cache.results);
573
- module.addResults(cache.html);
574
- module.inject.id(cache.results);
575
- callback();
576
- }
577
- else {
578
- module.debug('Querying for', searchTerm);
579
- if($.isPlainObject(settings.source) || Array.isArray(settings.source)) {
580
- module.search.local(searchTerm);
581
- callback();
582
- }
583
- else if( module.can.useAPI() ) {
584
- module.search.remote(searchTerm, callback);
585
- }
586
- else {
587
- module.error(error.source);
588
- callback();
589
- }
590
- }
591
- settings.onSearchQuery.call(element, searchTerm);
592
- }
593
- else {
594
- module.hideResults();
595
- }
596
- },
357
+ setup: {
358
+ api: function (searchTerm, callback) {
359
+ var
360
+ apiSettings = {
361
+ debug: settings.debug,
362
+ on: false,
363
+ cache: settings.cache,
364
+ action: 'search',
365
+ urlData: {
366
+ query: searchTerm,
367
+ },
368
+ },
369
+ apiCallbacks = {
370
+ onSuccess: function (response, $module, xhr) {
371
+ module.parse.response.call(element, response, searchTerm);
372
+ callback();
373
+ if (settings.apiSettings && typeof settings.apiSettings.onSuccess === 'function') {
374
+ settings.apiSettings.onSuccess.call(this, response, $module, xhr);
375
+ }
376
+ },
377
+ onFailure: function (response, $module, xhr) {
378
+ module.displayMessage(error.serverError);
379
+ callback();
380
+ if (settings.apiSettings && typeof settings.apiSettings.onFailure === 'function') {
381
+ settings.apiSettings.onFailure.call(this, response, $module, xhr);
382
+ }
383
+ },
384
+ onAbort: function (status, $module, xhr) {
385
+ if (settings.apiSettings && typeof settings.apiSettings.onAbort === 'function') {
386
+ settings.apiSettings.onAbort.call(this, status, $module, xhr);
387
+ }
388
+ },
389
+ onError: function (errorMessage, $module, xhr) {
390
+ module.error();
391
+ if (settings.apiSettings && typeof settings.apiSettings.onError === 'function') {
392
+ settings.apiSettings.onError.call(this, errorMessage, $module, xhr);
393
+ }
394
+ },
395
+ }
396
+ ;
397
+ $.extend(true, apiSettings, settings.apiSettings, apiCallbacks);
398
+ module.verbose('Setting up API request', apiSettings);
399
+ $module.api(apiSettings);
400
+ },
401
+ },
597
402
 
598
- search: {
599
- local: function(searchTerm) {
600
- var
601
- results = module.search.object(searchTerm, settings.source),
602
- searchHTML
603
- ;
604
- module.set.loading();
605
- module.save.results(results);
606
- module.debug('Returned full local search results', results);
607
- if(settings.maxResults > 0) {
608
- module.debug('Using specified max results', results);
609
- results = results.slice(0, settings.maxResults);
610
- }
611
- if(settings.type == 'category') {
612
- results = module.create.categoryResults(results);
613
- }
614
- searchHTML = module.generateResults({
615
- results: results
616
- });
617
- module.remove.loading();
618
- module.addResults(searchHTML);
619
- module.inject.id(results);
620
- module.write.cache(searchTerm, {
621
- html : searchHTML,
622
- results : results
623
- });
624
- },
625
- remote: function(searchTerm, callback) {
626
- callback = $.isFunction(callback)
627
- ? callback
628
- : function(){}
629
- ;
630
- if($module.api('is loading')) {
631
- $module.api('abort');
632
- }
633
- module.setup.api(searchTerm, callback);
634
- $module
635
- .api('query')
636
- ;
637
- },
638
- object: function(searchTerm, source, searchFields) {
639
- searchTerm = module.remove.diacritics(String(searchTerm));
640
- var
641
- results = [],
642
- exactResults = [],
643
- fuzzyResults = [],
644
- searchExp = searchTerm.replace(regExp.escape, '\\$&'),
645
- matchRegExp = new RegExp(regExp.beginsWith + searchExp, 'i'),
646
-
647
- // avoid duplicates when pushing results
648
- addResult = function(array, result) {
649
- var
650
- notResult = ($.inArray(result, results) == -1),
651
- notFuzzyResult = ($.inArray(result, fuzzyResults) == -1),
652
- notExactResults = ($.inArray(result, exactResults) == -1)
653
- ;
654
- if(notResult && notFuzzyResult && notExactResults) {
655
- array.push(result);
656
- }
657
- }
658
- ;
659
- source = source || settings.source;
660
- searchFields = (searchFields !== undefined)
661
- ? searchFields
662
- : settings.searchFields
663
- ;
403
+ can: {
404
+ useAPI: function () {
405
+ return $.fn.api !== undefined;
406
+ },
407
+ show: function () {
408
+ return module.is.focused() && !module.is.visible() && !module.is.empty();
409
+ },
410
+ transition: function () {
411
+ return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');
412
+ },
413
+ },
664
414
 
665
- // search fields should be array to loop correctly
666
- if(!Array.isArray(searchFields)) {
667
- searchFields = [searchFields];
668
- }
415
+ is: {
416
+ animating: function () {
417
+ return $results.hasClass(className.animating);
418
+ },
419
+ chrome: function () {
420
+ return !!window.chrome && !window.StyleMedia;
421
+ },
422
+ hidden: function () {
423
+ return $results.hasClass(className.hidden);
424
+ },
425
+ inMessage: function (event) {
426
+ if (!event.target) {
427
+ return;
428
+ }
429
+ var
430
+ $target = $(event.target),
431
+ isInDOM = $.contains(document.documentElement, event.target)
432
+ ;
433
+
434
+ return isInDOM && $target.closest(selector.message).length > 0;
435
+ },
436
+ empty: function () {
437
+ return $results.html() === '';
438
+ },
439
+ visible: function () {
440
+ return $results.filter(':visible').length > 0;
441
+ },
442
+ focused: function () {
443
+ return $prompt.filter(':focus').length > 0;
444
+ },
445
+ },
669
446
 
670
- // exit conditions if no source
671
- if(source === undefined || source === false) {
672
- module.error(error.source);
673
- return [];
674
- }
675
- // iterate through search fields looking for matches
676
- $.each(searchFields, function(index, field) {
677
- $.each(source, function(label, content) {
678
- var
679
- fieldExists = (typeof content[field] == 'string') || (typeof content[field] == 'number')
680
- ;
681
- if(fieldExists) {
682
- var text;
683
- if (typeof content[field] === 'string'){
684
- text = module.remove.diacritics(content[field]);
685
- } else {
686
- text = content[field].toString();
687
- }
688
- if( text.search(matchRegExp) !== -1) {
689
- // content starts with value (first in results)
690
- addResult(results, content);
691
- }
692
- else if(settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text) ) {
693
- // content fuzzy matches (last in results)
694
- addResult(exactResults, content);
695
- }
696
- else if(settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text) ) {
697
- // content fuzzy matches (last in results)
698
- addResult(fuzzyResults, content);
699
- }
700
- }
701
- });
702
- });
703
- $.merge(exactResults, fuzzyResults);
704
- $.merge(results, exactResults);
705
- return results;
706
- }
707
- },
708
- exactSearch: function (query, term) {
709
- query = query.toLowerCase();
710
- term = term.toLowerCase();
711
- return term.indexOf(query) > -1;
712
- },
713
- fuzzySearch: function(query, term) {
714
- var
715
- termLength = term.length,
716
- queryLength = query.length
717
- ;
718
- if(typeof query !== 'string') {
719
- return false;
720
- }
721
- query = query.toLowerCase();
722
- term = term.toLowerCase();
723
- if(queryLength > termLength) {
724
- return false;
725
- }
726
- if(queryLength === termLength) {
727
- return (query === term);
728
- }
729
- search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
730
- var
731
- queryCharacter = query.charCodeAt(characterIndex)
732
- ;
733
- while(nextCharacterIndex < termLength) {
734
- if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
735
- continue search;
736
- }
737
- }
738
- return false;
739
- }
740
- return true;
741
- },
447
+ get: {
448
+ settings: function () {
449
+ if ($.isPlainObject(parameters) && parameters.searchFullText) {
450
+ settings.fullTextSearch = parameters.searchFullText;
451
+ module.error(settings.error.oldSearchSyntax, element);
452
+ }
453
+ if (settings.ignoreDiacritics && !String.prototype.normalize) {
454
+ settings.ignoreDiacritics = false;
455
+ module.error(error.noNormalize, element);
456
+ }
457
+ },
458
+ inputEvent: function () {
459
+ var
460
+ prompt = $prompt[0],
461
+ inputEvent = prompt !== undefined && prompt.oninput !== undefined
462
+ ? 'input'
463
+ : (prompt !== undefined && prompt.onpropertychange !== undefined
464
+ ? 'propertychange'
465
+ : 'keyup')
466
+ ;
467
+
468
+ return inputEvent;
469
+ },
470
+ value: function () {
471
+ return $prompt.val();
472
+ },
473
+ results: function () {
474
+ return $module.data(metadata.results);
475
+ },
476
+ result: function (value, results) {
477
+ var
478
+ result = false
479
+ ;
480
+ value = value !== undefined
481
+ ? value
482
+ : module.get.value();
483
+ results = results !== undefined
484
+ ? results
485
+ : module.get.results();
486
+ if (settings.type === 'category') {
487
+ module.debug('Finding result that matches', value);
488
+ $.each(results, function (index, category) {
489
+ if (Array.isArray(category.results)) {
490
+ result = module.search.object(value, category.results)[0];
491
+ // don't continue searching if a result is found
492
+ if (result) {
493
+ return false;
494
+ }
495
+ }
496
+ });
497
+ } else {
498
+ module.debug('Finding result in results object', value);
499
+ result = module.search.object(value, results)[0];
500
+ }
501
+
502
+ return result || false;
503
+ },
504
+ },
742
505
 
743
- parse: {
744
- response: function(response, searchTerm) {
745
- if(Array.isArray(response)){
746
- var o={};
747
- o[fields.results]=response;
748
- response = o;
749
- }
750
- var
751
- searchHTML = module.generateResults(response)
752
- ;
753
- module.verbose('Parsing server response', response);
754
- if(response !== undefined) {
755
- if(searchTerm !== undefined && response[fields.results] !== undefined) {
756
- module.addResults(searchHTML);
757
- module.inject.id(response[fields.results]);
758
- module.write.cache(searchTerm, {
759
- html : searchHTML,
760
- results : response[fields.results]
761
- });
762
- module.save.results(response[fields.results]);
763
- }
764
- }
765
- }
766
- },
506
+ select: {
507
+ firstResult: function () {
508
+ module.verbose('Selecting first result');
509
+ $result.first().addClass(className.active);
510
+ },
511
+ },
767
512
 
768
- cancel: {
769
- query: function() {
770
- if( module.can.useAPI() ) {
771
- $module.api('abort');
772
- }
773
- }
774
- },
513
+ set: {
514
+ focus: function () {
515
+ $module.addClass(className.focus);
516
+ },
517
+ loading: function () {
518
+ $module.addClass(className.loading);
519
+ },
520
+ value: function (value) {
521
+ module.verbose('Setting search input value', value);
522
+ $prompt
523
+ .val(value)
524
+ ;
525
+ },
526
+ type: function (type) {
527
+ type = type || settings.type;
528
+ if (className[type]) {
529
+ $module.addClass(className[type]);
530
+ }
531
+ },
532
+ buttonPressed: function () {
533
+ $searchButton.addClass(className.pressed);
534
+ },
535
+ },
775
536
 
776
- has: {
777
- minimumCharacters: function() {
778
- var
779
- searchTerm = module.get.value(),
780
- numCharacters = searchTerm.length
781
- ;
782
- return (numCharacters >= settings.minCharacters);
783
- },
784
- results: function() {
785
- if($results.length === 0) {
786
- return false;
787
- }
788
- var
789
- html = $results.html()
790
- ;
791
- return html != '';
792
- }
793
- },
537
+ remove: {
538
+ loading: function () {
539
+ $module.removeClass(className.loading);
540
+ },
541
+ focus: function () {
542
+ $module.removeClass(className.focus);
543
+ },
544
+ buttonPressed: function () {
545
+ $searchButton.removeClass(className.pressed);
546
+ },
547
+ diacritics: function (text) {
548
+ return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036F]/g, '') : text;
549
+ },
550
+ },
794
551
 
795
- clear: {
796
- cache: function(value) {
797
- var
798
- cache = $module.data(metadata.cache)
799
- ;
800
- if(!value) {
801
- module.debug('Clearing cache', value);
802
- $module.removeData(metadata.cache);
803
- }
804
- else if(value && cache && cache[value]) {
805
- module.debug('Removing value from cache', value);
806
- delete cache[value];
807
- $module.data(metadata.cache, cache);
808
- }
809
- }
810
- },
552
+ query: function (callback) {
553
+ callback = isFunction(callback)
554
+ ? callback
555
+ : function () {};
556
+ var
557
+ searchTerm = module.get.value(),
558
+ cache = module.read.cache(searchTerm)
559
+ ;
560
+ callback = callback || function () {};
561
+ if (module.has.minimumCharacters()) {
562
+ if (cache) {
563
+ module.debug('Reading result from cache', searchTerm);
564
+ module.save.results(cache.results);
565
+ module.addResults(cache.html);
566
+ module.inject.id(cache.results);
567
+ callback();
568
+ } else {
569
+ module.debug('Querying for', searchTerm);
570
+ if ($.isPlainObject(settings.source) || Array.isArray(settings.source)) {
571
+ module.search.local(searchTerm);
572
+ callback();
573
+ } else if (module.can.useAPI()) {
574
+ module.search.remote(searchTerm, callback);
575
+ } else {
576
+ module.error(error.source);
577
+ callback();
578
+ }
579
+ }
580
+ settings.onSearchQuery.call(element, searchTerm);
581
+ } else {
582
+ module.hideResults();
583
+ }
584
+ },
811
585
 
812
- read: {
813
- cache: function(name) {
814
- var
815
- cache = $module.data(metadata.cache)
816
- ;
817
- if(settings.cache) {
818
- module.verbose('Checking cache for generated html for query', name);
819
- return (typeof cache == 'object') && (cache[name] !== undefined)
820
- ? cache[name]
821
- : false
822
- ;
823
- }
824
- return false;
825
- }
826
- },
586
+ search: {
587
+ local: function (searchTerm) {
588
+ var
589
+ results = module.search.object(searchTerm, settings.source),
590
+ searchHTML
591
+ ;
592
+ module.set.loading();
593
+ module.save.results(results);
594
+ module.debug('Returned full local search results', results);
595
+ if (settings.maxResults > 0) {
596
+ module.debug('Using specified max results', results);
597
+ results = results.slice(0, settings.maxResults);
598
+ }
599
+ if (settings.type === 'category') {
600
+ results = module.create.categoryResults(results);
601
+ }
602
+ searchHTML = module.generateResults({
603
+ results: results,
604
+ });
605
+ module.remove.loading();
606
+ module.addResults(searchHTML);
607
+ module.inject.id(results);
608
+ module.write.cache(searchTerm, {
609
+ html: searchHTML,
610
+ results: results,
611
+ });
612
+ },
613
+ remote: function (searchTerm, callback) {
614
+ callback = isFunction(callback)
615
+ ? callback
616
+ : function () {};
617
+ if ($module.api('is loading')) {
618
+ $module.api('abort');
619
+ }
620
+ module.setup.api(searchTerm, callback);
621
+ $module
622
+ .api('query')
623
+ ;
624
+ },
625
+ object: function (searchTerm, source, searchFields) {
626
+ searchTerm = module.remove.diacritics(String(searchTerm));
627
+ var
628
+ results = [],
629
+ exactResults = [],
630
+ fuzzyResults = [],
631
+ searchExp = searchTerm.replace(regExp.escape, '\\$&'),
632
+ matchRegExp = new RegExp(regExp.beginsWith + searchExp, 'i'),
633
+
634
+ // avoid duplicates when pushing results
635
+ addResult = function (array, result) {
636
+ var
637
+ notResult = $.inArray(result, results) === -1,
638
+ notFuzzyResult = $.inArray(result, fuzzyResults) === -1,
639
+ notExactResults = $.inArray(result, exactResults) === -1
640
+ ;
641
+ if (notResult && notFuzzyResult && notExactResults) {
642
+ array.push(result);
643
+ }
644
+ }
645
+ ;
646
+ source = source || settings.source;
647
+ searchFields = searchFields !== undefined
648
+ ? searchFields
649
+ : settings.searchFields;
650
+
651
+ // search fields should be array to loop correctly
652
+ if (!Array.isArray(searchFields)) {
653
+ searchFields = [searchFields];
654
+ }
655
+
656
+ // exit conditions if no source
657
+ if (source === undefined || source === false) {
658
+ module.error(error.source);
659
+
660
+ return [];
661
+ }
662
+ // iterate through search fields looking for matches
663
+ $.each(searchFields, function (index, field) {
664
+ $.each(source, function (label, content) {
665
+ var
666
+ fieldExists = (typeof content[field] === 'string') || (typeof content[field] === 'number')
667
+ ;
668
+ if (fieldExists) {
669
+ var text;
670
+ text = typeof content[field] === 'string'
671
+ ? module.remove.diacritics(content[field])
672
+ : content[field].toString();
673
+ if (text.search(matchRegExp) !== -1) {
674
+ // content starts with value (first in results)
675
+ addResult(results, content);
676
+ } else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {
677
+ // content fuzzy matches (last in results)
678
+ addResult(exactResults, content);
679
+ } else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {
680
+ // content fuzzy matches (last in results)
681
+ addResult(fuzzyResults, content);
682
+ }
683
+ }
684
+ });
685
+ });
686
+ $.merge(exactResults, fuzzyResults);
687
+ $.merge(results, exactResults);
688
+
689
+ return results;
690
+ },
691
+ },
692
+ exactSearch: function (query, term) {
693
+ query = query.toLowerCase();
694
+ term = term.toLowerCase();
827
695
 
828
- create: {
829
- categoryResults: function(results) {
830
- var
831
- categoryResults = {}
832
- ;
833
- $.each(results, function(index, result) {
834
- if(!result.category) {
835
- return;
836
- }
837
- if(categoryResults[result.category] === undefined) {
838
- module.verbose('Creating new category of results', result.category);
839
- categoryResults[result.category] = {
840
- name : result.category,
841
- results : [result]
842
- };
843
- }
844
- else {
845
- categoryResults[result.category].results.push(result);
846
- }
847
- });
848
- return categoryResults;
849
- },
850
- id: function(resultIndex, categoryIndex) {
851
- var
852
- resultID = (resultIndex + 1), // not zero indexed
853
- letterID,
854
- id
855
- ;
856
- if(categoryIndex !== undefined) {
857
- // start char code for "A"
858
- letterID = String.fromCharCode(97 + categoryIndex);
859
- id = letterID + resultID;
860
- module.verbose('Creating category result id', id);
861
- }
862
- else {
863
- id = resultID;
864
- module.verbose('Creating result id', id);
865
- }
866
- return id;
867
- },
868
- results: function() {
869
- if($results.length === 0) {
870
- $results = $('<div />')
871
- .addClass(className.results)
872
- .appendTo($module)
873
- ;
874
- }
875
- }
876
- },
696
+ return term.indexOf(query) > -1;
697
+ },
698
+ fuzzySearch: function (query, term) {
699
+ var
700
+ termLength = term.length,
701
+ queryLength = query.length
702
+ ;
703
+ if (typeof query !== 'string') {
704
+ return false;
705
+ }
706
+ query = query.toLowerCase();
707
+ term = term.toLowerCase();
708
+ if (queryLength > termLength) {
709
+ return false;
710
+ }
711
+ if (queryLength === termLength) {
712
+ return query === term;
713
+ }
714
+ for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
715
+ var
716
+ continueSearch = false,
717
+ queryCharacter = query.charCodeAt(characterIndex)
718
+ ;
719
+ while (nextCharacterIndex < termLength) {
720
+ if (term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
721
+ continueSearch = true;
722
+
723
+ break;
724
+ }
725
+ }
726
+
727
+ if (!continueSearch) {
728
+ return false;
729
+ }
730
+ }
877
731
 
878
- inject: {
879
- result: function(result, resultIndex, categoryIndex) {
880
- module.verbose('Injecting result into results');
881
- var
882
- $selectedResult = (categoryIndex !== undefined)
883
- ? $results
884
- .children().eq(categoryIndex)
885
- .children(selector.results)
886
- .first()
887
- .children(selector.result)
888
- .eq(resultIndex)
889
- : $results
890
- .children(selector.result).eq(resultIndex)
891
- ;
892
- module.verbose('Injecting results metadata', $selectedResult);
893
- $selectedResult
894
- .data(metadata.result, result)
895
- ;
896
- },
897
- id: function(results) {
898
- module.debug('Injecting unique ids into results');
899
- var
900
- // since results may be object, we must use counters
901
- categoryIndex = 0,
902
- resultIndex = 0
903
- ;
904
- if(settings.type === 'category') {
905
- // iterate through each category result
906
- $.each(results, function(index, category) {
907
- if(category.results.length > 0){
908
- resultIndex = 0;
909
- $.each(category.results, function(index, result) {
910
- if(result.id === undefined) {
911
- result.id = module.create.id(resultIndex, categoryIndex);
732
+ return true;
733
+ },
734
+
735
+ parse: {
736
+ response: function (response, searchTerm) {
737
+ if (Array.isArray(response)) {
738
+ var o = {};
739
+ o[fields.results] = response;
740
+ response = o;
741
+ }
742
+ var
743
+ searchHTML = module.generateResults(response)
744
+ ;
745
+ module.verbose('Parsing server response', response);
746
+ if (response !== undefined) {
747
+ if (searchTerm !== undefined && response[fields.results] !== undefined) {
748
+ module.addResults(searchHTML);
749
+ module.inject.id(response[fields.results]);
750
+ module.write.cache(searchTerm, {
751
+ html: searchHTML,
752
+ results: response[fields.results],
753
+ });
754
+ module.save.results(response[fields.results]);
755
+ }
756
+ }
757
+ },
758
+ },
759
+
760
+ cancel: {
761
+ query: function () {
762
+ if (module.can.useAPI()) {
763
+ $module.api('abort');
764
+ }
765
+ },
766
+ },
767
+
768
+ has: {
769
+ minimumCharacters: function () {
770
+ var
771
+ searchTerm = module.get.value(),
772
+ numCharacters = searchTerm.length
773
+ ;
774
+
775
+ return numCharacters >= settings.minCharacters;
776
+ },
777
+ results: function () {
778
+ if ($results.length === 0) {
779
+ return false;
780
+ }
781
+ var
782
+ html = $results.html()
783
+ ;
784
+
785
+ return html !== '';
786
+ },
787
+ },
788
+
789
+ clear: {
790
+ cache: function (value) {
791
+ var
792
+ cache = $module.data(metadata.cache)
793
+ ;
794
+ if (!value) {
795
+ module.debug('Clearing cache', value);
796
+ $module.removeData(metadata.cache);
797
+ } else if (value && cache && cache[value]) {
798
+ module.debug('Removing value from cache', value);
799
+ delete cache[value];
800
+ $module.data(metadata.cache, cache);
801
+ }
802
+ },
803
+ },
804
+
805
+ read: {
806
+ cache: function (name) {
807
+ var
808
+ cache = $module.data(metadata.cache)
809
+ ;
810
+ if (settings.cache) {
811
+ module.verbose('Checking cache for generated html for query', name);
812
+
813
+ return (typeof cache === 'object') && (cache[name] !== undefined)
814
+ ? cache[name]
815
+ : false;
816
+ }
817
+
818
+ return false;
819
+ },
820
+ },
821
+
822
+ create: {
823
+ categoryResults: function (results) {
824
+ var
825
+ categoryResults = {}
826
+ ;
827
+ $.each(results, function (index, result) {
828
+ if (!result.category) {
829
+ return;
830
+ }
831
+ if (categoryResults[result.category] === undefined) {
832
+ module.verbose('Creating new category of results', result.category);
833
+ categoryResults[result.category] = {
834
+ name: result.category,
835
+ results: [result],
836
+ };
837
+ } else {
838
+ categoryResults[result.category].results.push(result);
839
+ }
840
+ });
841
+
842
+ return categoryResults;
843
+ },
844
+ id: function (resultIndex, categoryIndex) {
845
+ var
846
+ resultID = resultIndex + 1, // not zero indexed
847
+ letterID,
848
+ id
849
+ ;
850
+ if (categoryIndex !== undefined) {
851
+ // start char code for "A"
852
+ letterID = String.fromCharCode(97 + categoryIndex);
853
+ id = letterID + resultID;
854
+ module.verbose('Creating category result id', id);
855
+ } else {
856
+ id = resultID;
857
+ module.verbose('Creating result id', id);
858
+ }
859
+
860
+ return id;
861
+ },
862
+ results: function () {
863
+ if ($results.length === 0) {
864
+ $results = $('<div />')
865
+ .addClass(className.results)
866
+ .appendTo($module)
867
+ ;
868
+ }
869
+ },
870
+ },
871
+
872
+ inject: {
873
+ result: function (result, resultIndex, categoryIndex) {
874
+ module.verbose('Injecting result into results');
875
+ var
876
+ $selectedResult = categoryIndex !== undefined
877
+ ? $results
878
+ .children().eq(categoryIndex)
879
+ .children(selector.results)
880
+ .first()
881
+ .children(selector.result)
882
+ .eq(resultIndex)
883
+ : $results
884
+ .children(selector.result).eq(resultIndex)
885
+ ;
886
+ module.verbose('Injecting results metadata', $selectedResult);
887
+ $selectedResult
888
+ .data(metadata.result, result)
889
+ ;
890
+ },
891
+ id: function (results) {
892
+ module.debug('Injecting unique ids into results');
893
+ var
894
+ // since results may be object, we must use counters
895
+ categoryIndex = 0,
896
+ resultIndex = 0
897
+ ;
898
+ if (settings.type === 'category') {
899
+ // iterate through each category result
900
+ $.each(results, function (index, category) {
901
+ if (category.results.length > 0) {
902
+ resultIndex = 0;
903
+ $.each(category.results, function (index, result) {
904
+ if (result.id === undefined) {
905
+ result.id = module.create.id(resultIndex, categoryIndex);
906
+ }
907
+ module.inject.result(result, resultIndex, categoryIndex);
908
+ resultIndex++;
909
+ });
910
+ categoryIndex++;
911
+ }
912
+ });
913
+ } else {
914
+ // top level
915
+ $.each(results, function (index, result) {
916
+ if (result.id === undefined) {
917
+ result.id = module.create.id(resultIndex);
918
+ }
919
+ module.inject.result(result, resultIndex);
920
+ resultIndex++;
921
+ });
922
+ }
923
+
924
+ return results;
925
+ },
926
+ },
927
+
928
+ save: {
929
+ results: function (results) {
930
+ module.verbose('Saving current search results to metadata', results);
931
+ $module.data(metadata.results, results);
932
+ },
933
+ },
934
+
935
+ write: {
936
+ cache: function (name, value) {
937
+ var
938
+ cache = $module.data(metadata.cache) !== undefined
939
+ ? $module.data(metadata.cache)
940
+ : {}
941
+ ;
942
+ if (settings.cache) {
943
+ module.verbose('Writing generated html to cache', name, value);
944
+ cache[name] = value;
945
+ $module
946
+ .data(metadata.cache, cache)
947
+ ;
948
+ }
949
+ },
950
+ },
951
+
952
+ addResults: function (html) {
953
+ if (isFunction(settings.onResultsAdd)) {
954
+ if (settings.onResultsAdd.call($results, html) === false) {
955
+ module.debug('onResultsAdd callback cancelled default action');
956
+
957
+ return false;
958
+ }
959
+ }
960
+ if (html) {
961
+ $results
962
+ .html(html)
963
+ ;
964
+ module.refreshResults();
965
+ if (settings.selectFirstResult) {
966
+ module.select.firstResult();
967
+ }
968
+ module.showResults();
969
+ } else {
970
+ module.hideResults(function () {
971
+ $results.empty();
972
+ });
973
+ }
974
+ },
975
+
976
+ showResults: function (callback) {
977
+ callback = isFunction(callback)
978
+ ? callback
979
+ : function () {};
980
+ if (resultsDismissed) {
981
+ return;
982
+ }
983
+ if (!module.is.visible() && module.has.results()) {
984
+ if (module.can.transition()) {
985
+ module.debug('Showing results with css animations');
986
+ $results
987
+ .transition({
988
+ animation: settings.transition + ' in',
989
+ debug: settings.debug,
990
+ verbose: settings.verbose,
991
+ silent: settings.silent,
992
+ duration: settings.duration,
993
+ onShow: function () {
994
+ var $firstResult = $module.find(selector.result).eq(0);
995
+ module.ensureVisible($firstResult);
996
+ },
997
+ onComplete: function () {
998
+ callback();
999
+ },
1000
+ queue: true,
1001
+ })
1002
+ ;
1003
+ } else {
1004
+ module.debug('Showing results with javascript');
1005
+ $results
1006
+ .stop()
1007
+ .fadeIn(settings.duration, settings.easing)
1008
+ ;
1009
+ }
1010
+ settings.onResultsOpen.call($results);
1011
+ }
1012
+ },
1013
+ hideResults: function (callback) {
1014
+ callback = isFunction(callback)
1015
+ ? callback
1016
+ : function () {};
1017
+ if (module.is.visible()) {
1018
+ if (module.can.transition()) {
1019
+ module.debug('Hiding results with css animations');
1020
+ $results
1021
+ .transition({
1022
+ animation: settings.transition + ' out',
1023
+ debug: settings.debug,
1024
+ verbose: settings.verbose,
1025
+ silent: settings.silent,
1026
+ duration: settings.duration,
1027
+ onComplete: function () {
1028
+ callback();
1029
+ },
1030
+ queue: true,
1031
+ })
1032
+ ;
1033
+ } else {
1034
+ module.debug('Hiding results with javascript');
1035
+ $results
1036
+ .stop()
1037
+ .fadeOut(settings.duration, settings.easing)
1038
+ ;
1039
+ }
1040
+ settings.onResultsClose.call($results);
1041
+ }
1042
+ },
1043
+
1044
+ generateResults: function (response) {
1045
+ module.debug('Generating html from response', response);
1046
+ var
1047
+ template = settings.templates[settings.type],
1048
+ isProperObject = $.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results]),
1049
+ isProperArray = Array.isArray(response[fields.results]) && response[fields.results].length > 0,
1050
+ html = ''
1051
+ ;
1052
+ if (isProperObject || isProperArray) {
1053
+ if (settings.maxResults > 0) {
1054
+ if (isProperObject) {
1055
+ if (settings.type === 'standard') {
1056
+ module.error(error.maxResults);
1057
+ }
1058
+ } else {
1059
+ response[fields.results] = response[fields.results].slice(0, settings.maxResults);
1060
+ }
1061
+ }
1062
+ if (isFunction(template)) {
1063
+ html = template(response, fields, settings.preserveHTML);
1064
+ } else {
1065
+ module.error(error.noTemplate, false);
1066
+ }
1067
+ } else if (settings.showNoResults) {
1068
+ html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader);
1069
+ }
1070
+ settings.onResults.call(element, response);
1071
+
1072
+ return html;
1073
+ },
1074
+
1075
+ displayMessage: function (text, type, header) {
1076
+ type = type || 'standard';
1077
+ module.debug('Displaying message', text, type, header);
1078
+ module.addResults(settings.templates.message(text, type, header));
1079
+
1080
+ return settings.templates.message(text, type, header);
1081
+ },
1082
+
1083
+ setting: function (name, value) {
1084
+ if ($.isPlainObject(name)) {
1085
+ $.extend(true, settings, name);
1086
+ } else if (value !== undefined) {
1087
+ settings[name] = value;
1088
+ } else {
1089
+ return settings[name];
1090
+ }
1091
+ },
1092
+ internal: function (name, value) {
1093
+ if ($.isPlainObject(name)) {
1094
+ $.extend(true, module, name);
1095
+ } else if (value !== undefined) {
1096
+ module[name] = value;
1097
+ } else {
1098
+ return module[name];
1099
+ }
1100
+ },
1101
+ debug: function () {
1102
+ if (!settings.silent && settings.debug) {
1103
+ if (settings.performance) {
1104
+ module.performance.log(arguments);
1105
+ } else {
1106
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1107
+ module.debug.apply(console, arguments);
1108
+ }
912
1109
  }
913
- module.inject.result(result, resultIndex, categoryIndex);
914
- resultIndex++;
915
- });
916
- categoryIndex++;
1110
+ },
1111
+ verbose: function () {
1112
+ if (!settings.silent && settings.verbose && settings.debug) {
1113
+ if (settings.performance) {
1114
+ module.performance.log(arguments);
1115
+ } else {
1116
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1117
+ module.verbose.apply(console, arguments);
1118
+ }
1119
+ }
1120
+ },
1121
+ error: function () {
1122
+ if (!settings.silent) {
1123
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1124
+ module.error.apply(console, arguments);
1125
+ }
1126
+ },
1127
+ performance: {
1128
+ log: function (message) {
1129
+ var
1130
+ currentTime,
1131
+ executionTime,
1132
+ previousTime
1133
+ ;
1134
+ if (settings.performance) {
1135
+ currentTime = Date.now();
1136
+ previousTime = time || currentTime;
1137
+ executionTime = currentTime - previousTime;
1138
+ time = currentTime;
1139
+ performance.push({
1140
+ Name: message[0],
1141
+ Arguments: [].slice.call(message, 1) || '',
1142
+ Element: element,
1143
+ 'Execution Time': executionTime,
1144
+ });
1145
+ }
1146
+ clearTimeout(module.performance.timer);
1147
+ module.performance.timer = setTimeout(module.performance.display, 500);
1148
+ },
1149
+ display: function () {
1150
+ var
1151
+ title = settings.name + ':',
1152
+ totalTime = 0
1153
+ ;
1154
+ time = false;
1155
+ clearTimeout(module.performance.timer);
1156
+ $.each(performance, function (index, data) {
1157
+ totalTime += data['Execution Time'];
1158
+ });
1159
+ title += ' ' + totalTime + 'ms';
1160
+ if (moduleSelector) {
1161
+ title += ' \'' + moduleSelector + '\'';
1162
+ }
1163
+ if ($allModules.length > 1) {
1164
+ title += ' (' + $allModules.length + ')';
1165
+ }
1166
+ if (performance.length > 0) {
1167
+ console.groupCollapsed(title);
1168
+ if (console.table) {
1169
+ console.table(performance);
1170
+ } else {
1171
+ $.each(performance, function (index, data) {
1172
+ console.log(data.Name + ': ' + data['Execution Time'] + 'ms');
1173
+ });
1174
+ }
1175
+ console.groupEnd();
1176
+ }
1177
+ performance = [];
1178
+ },
1179
+ },
1180
+ invoke: function (query, passedArguments, context) {
1181
+ var
1182
+ object = instance,
1183
+ maxDepth,
1184
+ found,
1185
+ response
1186
+ ;
1187
+ passedArguments = passedArguments || queryArguments;
1188
+ context = context || element;
1189
+ if (typeof query === 'string' && object !== undefined) {
1190
+ query = query.split(/[ .]/);
1191
+ maxDepth = query.length - 1;
1192
+ $.each(query, function (depth, value) {
1193
+ var camelCaseValue = depth !== maxDepth
1194
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1195
+ : query
1196
+ ;
1197
+ if ($.isPlainObject(object[camelCaseValue]) && (depth !== maxDepth)) {
1198
+ object = object[camelCaseValue];
1199
+ } else if (object[camelCaseValue] !== undefined) {
1200
+ found = object[camelCaseValue];
1201
+
1202
+ return false;
1203
+ } else if ($.isPlainObject(object[value]) && (depth !== maxDepth)) {
1204
+ object = object[value];
1205
+ } else if (object[value] !== undefined) {
1206
+ found = object[value];
1207
+
1208
+ return false;
1209
+ } else {
1210
+ return false;
1211
+ }
1212
+ });
1213
+ }
1214
+ if (isFunction(found)) {
1215
+ response = found.apply(context, passedArguments);
1216
+ } else if (found !== undefined) {
1217
+ response = found;
1218
+ }
1219
+ if (Array.isArray(returnedValue)) {
1220
+ returnedValue.push(response);
1221
+ } else if (returnedValue !== undefined) {
1222
+ returnedValue = [returnedValue, response];
1223
+ } else if (response !== undefined) {
1224
+ returnedValue = response;
1225
+ }
1226
+
1227
+ return found;
1228
+ },
1229
+ };
1230
+ if (methodInvoked) {
1231
+ if (instance === undefined) {
1232
+ module.initialize();
917
1233
  }
918
- });
919
- }
920
- else {
921
- // top level
922
- $.each(results, function(index, result) {
923
- if(result.id === undefined) {
924
- result.id = module.create.id(resultIndex);
1234
+ module.invoke(query);
1235
+ } else {
1236
+ if (instance !== undefined) {
1237
+ instance.invoke('destroy');
925
1238
  }
926
- module.inject.result(result, resultIndex);
927
- resultIndex++;
928
- });
1239
+ module.initialize();
929
1240
  }
930
- return results;
931
- }
1241
+ });
1242
+
1243
+ return returnedValue !== undefined
1244
+ ? returnedValue
1245
+ : this;
1246
+ };
1247
+
1248
+ $.fn.search.settings = {
1249
+
1250
+ name: 'Search',
1251
+ namespace: 'search',
1252
+
1253
+ silent: false,
1254
+ debug: false,
1255
+ verbose: false,
1256
+ performance: true,
1257
+
1258
+ // template to use (specified in settings.templates)
1259
+ type: 'standard',
1260
+
1261
+ // minimum characters required to search
1262
+ minCharacters: 1,
1263
+
1264
+ // whether to select first result after searching automatically
1265
+ selectFirstResult: false,
1266
+
1267
+ // API config
1268
+ apiSettings: false,
1269
+
1270
+ // object to search
1271
+ source: false,
1272
+
1273
+ // Whether search should query current term on focus
1274
+ searchOnFocus: true,
1275
+
1276
+ // fields to search
1277
+ searchFields: [
1278
+ 'id',
1279
+ 'title',
1280
+ 'description',
1281
+ ],
1282
+
1283
+ // field to display in standard results template
1284
+ displayField: '',
1285
+
1286
+ // search anywhere in value (set to 'exact' to require exact matches
1287
+ fullTextSearch: 'exact',
1288
+
1289
+ // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...)
1290
+ ignoreDiacritics: false,
1291
+
1292
+ // whether to add events to prompt automatically
1293
+ automatic: true,
1294
+
1295
+ // delay before hiding menu after blur
1296
+ hideDelay: 0,
1297
+
1298
+ // delay before searching
1299
+ searchDelay: 200,
1300
+
1301
+ // maximum results returned from search
1302
+ maxResults: 7,
1303
+
1304
+ // whether to store lookups in local cache
1305
+ cache: true,
1306
+
1307
+ // whether no results errors should be shown
1308
+ showNoResults: true,
1309
+
1310
+ // preserve possible html of resultset values
1311
+ preserveHTML: true,
1312
+
1313
+ // transition settings
1314
+ transition: 'scale',
1315
+ duration: 200,
1316
+ easing: 'easeOutExpo',
1317
+
1318
+ // callbacks
1319
+ onSelect: false,
1320
+ onResultsAdd: false,
1321
+
1322
+ onSearchQuery: function (query) {},
1323
+ onResults: function (response) {},
1324
+
1325
+ onResultsOpen: function () {},
1326
+ onResultsClose: function () {},
1327
+
1328
+ className: {
1329
+ animating: 'animating',
1330
+ active: 'active',
1331
+ category: 'category',
1332
+ empty: 'empty',
1333
+ focus: 'focus',
1334
+ hidden: 'hidden',
1335
+ loading: 'loading',
1336
+ results: 'results',
1337
+ pressed: 'down',
932
1338
  },
933
1339
 
934
- save: {
935
- results: function(results) {
936
- module.verbose('Saving current search results to metadata', results);
937
- $module.data(metadata.results, results);
938
- }
1340
+ error: {
1341
+ source: 'Cannot search. No source used, and Semantic API module was not included',
1342
+ noResultsHeader: 'No Results',
1343
+ noResults: 'Your search returned no results',
1344
+ logging: 'Error in debug logging, exiting.',
1345
+ noEndpoint: 'No search endpoint was specified',
1346
+ noTemplate: 'A valid template name was not specified.',
1347
+ oldSearchSyntax: 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',
1348
+ serverError: 'There was an issue querying the server.',
1349
+ maxResults: 'Results must be an array to use maxResults setting',
1350
+ method: 'The method you called is not defined.',
1351
+ noNormalize: '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including <https://cdn.jsdelivr.net/npm/unorm@1.4.1/lib/unorm.min.js> as a polyfill.',
939
1352
  },
940
1353
 
941
- write: {
942
- cache: function(name, value) {
943
- var
944
- cache = ($module.data(metadata.cache) !== undefined)
945
- ? $module.data(metadata.cache)
946
- : {}
947
- ;
948
- if(settings.cache) {
949
- module.verbose('Writing generated html to cache', name, value);
950
- cache[name] = value;
951
- $module
952
- .data(metadata.cache, cache)
953
- ;
954
- }
955
- }
1354
+ metadata: {
1355
+ cache: 'cache',
1356
+ results: 'results',
1357
+ result: 'result',
956
1358
  },
957
1359
 
958
- addResults: function(html) {
959
- if( $.isFunction(settings.onResultsAdd) ) {
960
- if( settings.onResultsAdd.call($results, html) === false ) {
961
- module.debug('onResultsAdd callback cancelled default action');
962
- return false;
963
- }
964
- }
965
- if(html) {
966
- $results
967
- .html(html)
968
- ;
969
- module.refreshResults();
970
- if(settings.selectFirstResult) {
971
- module.select.firstResult();
972
- }
973
- module.showResults();
974
- }
975
- else {
976
- module.hideResults(function() {
977
- $results.empty();
978
- });
979
- }
1360
+ regExp: {
1361
+ escape: /[$()*+./?[\\\]^{|}-]/g,
1362
+ beginsWith: '(?:\\s|^)',
980
1363
  },
981
1364
 
982
- showResults: function(callback) {
983
- callback = $.isFunction(callback)
984
- ? callback
985
- : function(){}
986
- ;
987
- if(resultsDismissed) {
988
- return;
989
- }
990
- if(!module.is.visible() && module.has.results()) {
991
- if( module.can.transition() ) {
992
- module.debug('Showing results with css animations');
993
- $results
994
- .transition({
995
- animation : settings.transition + ' in',
996
- debug : settings.debug,
997
- verbose : settings.verbose,
998
- silent : settings.silent,
999
- duration : settings.duration,
1000
- onShow : function() {
1001
- var $firstResult = $module.find(selector.result).eq(0);
1002
- module.ensureVisible($firstResult);
1003
- },
1004
- onComplete : function() {
1005
- callback();
1006
- },
1007
- queue : true
1008
- })
1009
- ;
1010
- }
1011
- else {
1012
- module.debug('Showing results with javascript');
1013
- $results
1014
- .stop()
1015
- .fadeIn(settings.duration, settings.easing)
1016
- ;
1017
- }
1018
- settings.onResultsOpen.call($results);
1019
- }
1365
+ // maps api response attributes to internal representation
1366
+ fields: {
1367
+ categories: 'results', // array of categories (category view)
1368
+ categoryName: 'name', // name of category (category view)
1369
+ categoryResults: 'results', // array of results (category view)
1370
+ description: 'description', // result description
1371
+ image: 'image', // result image
1372
+ price: 'price', // result price
1373
+ results: 'results', // array of results (standard)
1374
+ title: 'title', // result title
1375
+ url: 'url', // result url
1376
+ action: 'action', // "view more" object name
1377
+ actionText: 'text', // "view more" text
1378
+ actionURL: 'url', // "view more" url
1020
1379
  },
1021
- hideResults: function(callback) {
1022
- callback = $.isFunction(callback)
1023
- ? callback
1024
- : function(){}
1025
- ;
1026
- if( module.is.visible() ) {
1027
- if( module.can.transition() ) {
1028
- module.debug('Hiding results with css animations');
1029
- $results
1030
- .transition({
1031
- animation : settings.transition + ' out',
1032
- debug : settings.debug,
1033
- verbose : settings.verbose,
1034
- silent : settings.silent,
1035
- duration : settings.duration,
1036
- onComplete : function() {
1037
- callback();
1038
- },
1039
- queue : true
1040
- })
1041
- ;
1042
- }
1043
- else {
1044
- module.debug('Hiding results with javascript');
1045
- $results
1046
- .stop()
1047
- .fadeOut(settings.duration, settings.easing)
1048
- ;
1049
- }
1050
- settings.onResultsClose.call($results);
1051
- }
1380
+
1381
+ selector: {
1382
+ prompt: '.prompt',
1383
+ searchButton: '.search.button',
1384
+ results: '.results',
1385
+ message: '.results > .message',
1386
+ category: '.category',
1387
+ result: '.result',
1388
+ title: '.title, .name',
1052
1389
  },
1053
1390
 
1054
- generateResults: function(response) {
1055
- module.debug('Generating html from response', response);
1056
- var
1057
- template = settings.templates[settings.type],
1058
- isProperObject = ($.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results])),
1059
- isProperArray = (Array.isArray(response[fields.results]) && response[fields.results].length > 0),
1060
- html = ''
1061
- ;
1062
- if(isProperObject || isProperArray ) {
1063
- if(settings.maxResults > 0) {
1064
- if(isProperObject) {
1065
- if(settings.type == 'standard') {
1066
- module.error(error.maxResults);
1391
+ templates: {
1392
+ escape: function (string, preserveHTML) {
1393
+ if (preserveHTML) {
1394
+ return string;
1395
+ }
1396
+ var
1397
+ badChars = /["'<>`]/g,
1398
+ shouldEscape = /["&'<>`]/,
1399
+ escape = {
1400
+ '<': '&lt;',
1401
+ '>': '&gt;',
1402
+ '"': '&quot;',
1403
+ "'": '&#x27;',
1404
+ '`': '&#x60;',
1405
+ },
1406
+ escapedChar = function (chr) {
1407
+ return escape[chr];
1408
+ };
1409
+ if (shouldEscape.test(string)) {
1410
+ string = string.replace(/&(?![\d#a-z]{1,12};)/gi, '&amp;');
1411
+
1412
+ return string.replace(badChars, escapedChar);
1067
1413
  }
1068
- }
1069
- else {
1070
- response[fields.results] = response[fields.results].slice(0, settings.maxResults);
1071
- }
1072
- }
1073
- if($.isFunction(template)) {
1074
- html = template(response, fields, settings.preserveHTML);
1075
- }
1076
- else {
1077
- module.error(error.noTemplate, false);
1078
- }
1079
- }
1080
- else if(settings.showNoResults) {
1081
- html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader);
1082
- }
1083
- settings.onResults.call(element, response);
1084
- return html;
1085
- },
1086
1414
 
1087
- displayMessage: function(text, type, header) {
1088
- type = type || 'standard';
1089
- module.debug('Displaying message', text, type, header);
1090
- module.addResults( settings.templates.message(text, type, header) );
1091
- return settings.templates.message(text, type, header);
1092
- },
1415
+ return string;
1416
+ },
1417
+ message: function (message, type, header) {
1418
+ var
1419
+ html = ''
1420
+ ;
1421
+ if (message !== undefined && type !== undefined) {
1422
+ html += ''
1423
+ + '<div class="message ' + type + '">';
1424
+ if (header) {
1425
+ html += ''
1426
+ + '<div class="header">' + header + '</div>';
1427
+ }
1428
+ html += ' <div class="description">' + message + '</div>';
1429
+ html += '</div>';
1430
+ }
1093
1431
 
1094
- setting: function(name, value) {
1095
- if( $.isPlainObject(name) ) {
1096
- $.extend(true, settings, name);
1097
- }
1098
- else if(value !== undefined) {
1099
- settings[name] = value;
1100
- }
1101
- else {
1102
- return settings[name];
1103
- }
1104
- },
1105
- internal: function(name, value) {
1106
- if( $.isPlainObject(name) ) {
1107
- $.extend(true, module, name);
1108
- }
1109
- else if(value !== undefined) {
1110
- module[name] = value;
1111
- }
1112
- else {
1113
- return module[name];
1114
- }
1115
- },
1116
- debug: function() {
1117
- if(!settings.silent && settings.debug) {
1118
- if(settings.performance) {
1119
- module.performance.log(arguments);
1120
- }
1121
- else {
1122
- module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
1123
- module.debug.apply(console, arguments);
1124
- }
1125
- }
1126
- },
1127
- verbose: function() {
1128
- if(!settings.silent && settings.verbose && settings.debug) {
1129
- if(settings.performance) {
1130
- module.performance.log(arguments);
1131
- }
1132
- else {
1133
- module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
1134
- module.verbose.apply(console, arguments);
1135
- }
1136
- }
1137
- },
1138
- error: function() {
1139
- if(!settings.silent) {
1140
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
1141
- module.error.apply(console, arguments);
1142
- }
1143
- },
1144
- performance: {
1145
- log: function(message) {
1146
- var
1147
- currentTime,
1148
- executionTime,
1149
- previousTime
1150
- ;
1151
- if(settings.performance) {
1152
- currentTime = new Date().getTime();
1153
- previousTime = time || currentTime;
1154
- executionTime = currentTime - previousTime;
1155
- time = currentTime;
1156
- performance.push({
1157
- 'Name' : message[0],
1158
- 'Arguments' : [].slice.call(message, 1) || '',
1159
- 'Element' : element,
1160
- 'Execution Time' : executionTime
1161
- });
1162
- }
1163
- clearTimeout(module.performance.timer);
1164
- module.performance.timer = setTimeout(module.performance.display, 500);
1165
- },
1166
- display: function() {
1167
- var
1168
- title = settings.name + ':',
1169
- totalTime = 0
1170
- ;
1171
- time = false;
1172
- clearTimeout(module.performance.timer);
1173
- $.each(performance, function(index, data) {
1174
- totalTime += data['Execution Time'];
1175
- });
1176
- title += ' ' + totalTime + 'ms';
1177
- if(moduleSelector) {
1178
- title += ' \'' + moduleSelector + '\'';
1179
- }
1180
- if($allModules.length > 1) {
1181
- title += ' ' + '(' + $allModules.length + ')';
1182
- }
1183
- if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
1184
- console.groupCollapsed(title);
1185
- if(console.table) {
1186
- console.table(performance);
1187
- }
1188
- else {
1189
- $.each(performance, function(index, data) {
1190
- console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
1191
- });
1192
- }
1193
- console.groupEnd();
1194
- }
1195
- performance = [];
1196
- }
1197
- },
1198
- invoke: function(query, passedArguments, context) {
1199
- var
1200
- object = instance,
1201
- maxDepth,
1202
- found,
1203
- response
1204
- ;
1205
- passedArguments = passedArguments || queryArguments;
1206
- context = context || element;
1207
- if(typeof query == 'string' && object !== undefined) {
1208
- query = query.split(/[\. ]/);
1209
- maxDepth = query.length - 1;
1210
- $.each(query, function(depth, value) {
1211
- var camelCaseValue = (depth != maxDepth)
1212
- ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
1213
- : query
1214
- ;
1215
- if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
1216
- object = object[camelCaseValue];
1217
- }
1218
- else if( object[camelCaseValue] !== undefined ) {
1219
- found = object[camelCaseValue];
1220
- return false;
1221
- }
1222
- else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
1223
- object = object[value];
1224
- }
1225
- else if( object[value] !== undefined ) {
1226
- found = object[value];
1227
- return false;
1228
- }
1229
- else {
1230
- return false;
1231
- }
1232
- });
1233
- }
1234
- if( $.isFunction( found ) ) {
1235
- response = found.apply(context, passedArguments);
1236
- }
1237
- else if(found !== undefined) {
1238
- response = found;
1239
- }
1240
- if(Array.isArray(returnedValue)) {
1241
- returnedValue.push(response);
1242
- }
1243
- else if(returnedValue !== undefined) {
1244
- returnedValue = [returnedValue, response];
1245
- }
1246
- else if(response !== undefined) {
1247
- returnedValue = response;
1248
- }
1249
- return found;
1250
- }
1251
- };
1252
- if(methodInvoked) {
1253
- if(instance === undefined) {
1254
- module.initialize();
1255
- }
1256
- module.invoke(query);
1257
- }
1258
- else {
1259
- if(instance !== undefined) {
1260
- instance.invoke('destroy');
1261
- }
1262
- module.initialize();
1263
- }
1264
-
1265
- })
1266
- ;
1267
-
1268
- return (returnedValue !== undefined)
1269
- ? returnedValue
1270
- : this
1271
- ;
1272
- };
1273
-
1274
- $.fn.search.settings = {
1275
-
1276
- name : 'Search',
1277
- namespace : 'search',
1278
-
1279
- silent : false,
1280
- debug : false,
1281
- verbose : false,
1282
- performance : true,
1283
-
1284
- // template to use (specified in settings.templates)
1285
- type : 'standard',
1286
-
1287
- // minimum characters required to search
1288
- minCharacters : 1,
1289
-
1290
- // whether to select first result after searching automatically
1291
- selectFirstResult : false,
1292
-
1293
- // API config
1294
- apiSettings : false,
1295
-
1296
- // object to search
1297
- source : false,
1298
-
1299
- // Whether search should query current term on focus
1300
- searchOnFocus : true,
1301
-
1302
- // fields to search
1303
- searchFields : [
1304
- 'id',
1305
- 'title',
1306
- 'description'
1307
- ],
1308
-
1309
- // field to display in standard results template
1310
- displayField : '',
1311
-
1312
- // search anywhere in value (set to 'exact' to require exact matches
1313
- fullTextSearch : 'exact',
1314
-
1315
- // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à", etc...)
1316
- ignoreDiacritics : false,
1317
-
1318
- // whether to add events to prompt automatically
1319
- automatic : true,
1320
-
1321
- // delay before hiding menu after blur
1322
- hideDelay : 0,
1323
-
1324
- // delay before searching
1325
- searchDelay : 200,
1326
-
1327
- // maximum results returned from search
1328
- maxResults : 7,
1329
-
1330
- // whether to store lookups in local cache
1331
- cache : true,
1332
-
1333
- // whether no results errors should be shown
1334
- showNoResults : true,
1335
-
1336
- // preserve possible html of resultset values
1337
- preserveHTML : true,
1338
-
1339
- // transition settings
1340
- transition : 'scale',
1341
- duration : 200,
1342
- easing : 'easeOutExpo',
1343
-
1344
- // callbacks
1345
- onSelect : false,
1346
- onResultsAdd : false,
1347
-
1348
- onSearchQuery : function(query){},
1349
- onResults : function(response){},
1350
-
1351
- onResultsOpen : function(){},
1352
- onResultsClose : function(){},
1353
-
1354
- className: {
1355
- animating : 'animating',
1356
- active : 'active',
1357
- category : 'category',
1358
- empty : 'empty',
1359
- focus : 'focus',
1360
- hidden : 'hidden',
1361
- loading : 'loading',
1362
- results : 'results',
1363
- pressed : 'down'
1364
- },
1365
-
1366
- error : {
1367
- source : 'Cannot search. No source used, and Semantic API module was not included',
1368
- noResultsHeader : 'No Results',
1369
- noResults : 'Your search returned no results',
1370
- logging : 'Error in debug logging, exiting.',
1371
- noEndpoint : 'No search endpoint was specified',
1372
- noTemplate : 'A valid template name was not specified.',
1373
- oldSearchSyntax : 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',
1374
- serverError : 'There was an issue querying the server.',
1375
- maxResults : 'Results must be an array to use maxResults setting',
1376
- method : 'The method you called is not defined.',
1377
- noNormalize : '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including <https://cdn.jsdelivr.net/npm/unorm@1.4.1/lib/unorm.min.js> as a polyfill.'
1378
- },
1379
-
1380
- metadata: {
1381
- cache : 'cache',
1382
- results : 'results',
1383
- result : 'result'
1384
- },
1385
-
1386
- regExp: {
1387
- escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
1388
- beginsWith : '(?:\s|^)'
1389
- },
1390
-
1391
- // maps api response attributes to internal representation
1392
- fields: {
1393
- categories : 'results', // array of categories (category view)
1394
- categoryName : 'name', // name of category (category view)
1395
- categoryResults : 'results', // array of results (category view)
1396
- description : 'description', // result description
1397
- image : 'image', // result image
1398
- price : 'price', // result price
1399
- results : 'results', // array of results (standard)
1400
- title : 'title', // result title
1401
- url : 'url', // result url
1402
- action : 'action', // "view more" object name
1403
- actionText : 'text', // "view more" text
1404
- actionURL : 'url' // "view more" url
1405
- },
1406
-
1407
- selector : {
1408
- prompt : '.prompt',
1409
- searchButton : '.search.button',
1410
- results : '.results',
1411
- message : '.results > .message',
1412
- category : '.category',
1413
- result : '.result',
1414
- title : '.title, .name'
1415
- },
1416
-
1417
- templates: {
1418
- escape: function(string, preserveHTML) {
1419
- if (preserveHTML){
1420
- return string;
1421
- }
1422
- var
1423
- badChars = /[<>"'`]/g,
1424
- shouldEscape = /[&<>"'`]/,
1425
- escape = {
1426
- "<": "&lt;",
1427
- ">": "&gt;",
1428
- '"': "&quot;",
1429
- "'": "&#x27;",
1430
- "`": "&#x60;"
1431
- },
1432
- escapedChar = function(chr) {
1433
- return escape[chr];
1434
- }
1435
- ;
1436
- if(shouldEscape.test(string)) {
1437
- string = string.replace(/&(?![a-z0-9#]{1,12};)/gi, "&amp;");
1438
- return string.replace(badChars, escapedChar);
1439
- }
1440
- return string;
1441
- },
1442
- message: function(message, type, header) {
1443
- var
1444
- html = ''
1445
- ;
1446
- if(message !== undefined && type !== undefined) {
1447
- html += ''
1448
- + '<div class="message ' + type + '">'
1449
- ;
1450
- if(header) {
1451
- html += ''
1452
- + '<div class="header">' + header + '</div>'
1453
- ;
1454
- }
1455
- html += ' <div class="description">' + message + '</div>';
1456
- html += '</div>';
1457
- }
1458
- return html;
1459
- },
1460
- category: function(response, fields, preserveHTML) {
1461
- var
1462
- html = '',
1463
- escape = $.fn.search.settings.templates.escape
1464
- ;
1465
- if(response[fields.categoryResults] !== undefined) {
1466
-
1467
- // each category
1468
- $.each(response[fields.categoryResults], function(index, category) {
1469
- if(category[fields.results] !== undefined && category.results.length > 0) {
1470
-
1471
- html += '<div class="category">';
1472
-
1473
- if(category[fields.categoryName] !== undefined) {
1474
- html += '<div class="name">' + escape(category[fields.categoryName], preserveHTML) + '</div>';
1475
- }
1432
+ return html;
1433
+ },
1434
+ category: function (response, fields, preserveHTML) {
1435
+ var
1436
+ html = '',
1437
+ escape = $.fn.search.settings.templates.escape
1438
+ ;
1439
+ if (response[fields.categoryResults] !== undefined) {
1440
+ // each category
1441
+ $.each(response[fields.categoryResults], function (index, category) {
1442
+ if (category[fields.results] !== undefined && category.results.length > 0) {
1443
+ html += '<div class="category">';
1444
+
1445
+ if (category[fields.categoryName] !== undefined) {
1446
+ html += '<div class="name">' + escape(category[fields.categoryName], preserveHTML) + '</div>';
1447
+ }
1448
+
1449
+ // each item inside category
1450
+ html += '<div class="results">';
1451
+ $.each(category.results, function (index, result) {
1452
+ html += result[fields.url]
1453
+ ? '<a class="result" href="' + result[fields.url].replace(/"/g, '') + '">'
1454
+ : '<a class="result">';
1455
+ if (result[fields.image] !== undefined) {
1456
+ html += ''
1457
+ + '<div class="image">'
1458
+ + ' <img src="' + result[fields.image].replace(/"/g, '') + '">'
1459
+ + '</div>';
1460
+ }
1461
+ html += '<div class="content">';
1462
+ if (result[fields.price] !== undefined) {
1463
+ html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>';
1464
+ }
1465
+ if (result[fields.title] !== undefined) {
1466
+ html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>';
1467
+ }
1468
+ if (result[fields.description] !== undefined) {
1469
+ html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>';
1470
+ }
1471
+ html += ''
1472
+ + '</div>';
1473
+ html += '</a>';
1474
+ });
1475
+ html += '</div>';
1476
+ html += ''
1477
+ + '</div>';
1478
+ }
1479
+ });
1480
+ if (response[fields.action]) {
1481
+ html += fields.actionURL === false
1482
+ ? ''
1483
+ + '<div class="action">'
1484
+ + escape(response[fields.action][fields.actionText], preserveHTML)
1485
+ + '</div>'
1486
+ : ''
1487
+ + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g, '') + '" class="action">'
1488
+ + escape(response[fields.action][fields.actionText], preserveHTML)
1489
+ + '</a>';
1490
+ }
1491
+
1492
+ return html;
1493
+ }
1476
1494
 
1477
- // each item inside category
1478
- html += '<div class="results">';
1479
- $.each(category.results, function(index, result) {
1480
- if(result[fields.url]) {
1481
- html += '<a class="result" href="' + result[fields.url].replace(/"/g,"") + '">';
1482
- }
1483
- else {
1484
- html += '<a class="result">';
1485
- }
1486
- if(result[fields.image] !== undefined) {
1487
- html += ''
1488
- + '<div class="image">'
1489
- + ' <img src="' + result[fields.image].replace(/"/g,"") + '">'
1490
- + '</div>'
1495
+ return false;
1496
+ },
1497
+ standard: function (response, fields, preserveHTML) {
1498
+ var
1499
+ html = '',
1500
+ escape = $.fn.search.settings.templates.escape
1491
1501
  ;
1492
- }
1493
- html += '<div class="content">';
1494
- if(result[fields.price] !== undefined) {
1495
- html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>';
1496
- }
1497
- if(result[fields.title] !== undefined) {
1498
- html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>';
1499
- }
1500
- if(result[fields.description] !== undefined) {
1501
- html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>';
1502
- }
1503
- html += ''
1504
- + '</div>'
1505
- ;
1506
- html += '</a>';
1507
- });
1508
- html += '</div>';
1509
- html += ''
1510
- + '</div>'
1511
- ;
1512
- }
1513
- });
1514
- if(response[fields.action]) {
1515
- if(fields.actionURL === false) {
1516
- html += ''
1517
- + '<div class="action">'
1518
- + escape(response[fields.action][fields.actionText], preserveHTML)
1519
- + '</div>';
1520
- } else {
1521
- html += ''
1522
- + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g,"") + '" class="action">'
1523
- + escape(response[fields.action][fields.actionText], preserveHTML)
1524
- + '</a>';
1525
- }
1526
- }
1527
- return html;
1528
- }
1529
- return false;
1530
- },
1531
- standard: function(response, fields, preserveHTML) {
1532
- var
1533
- html = '',
1534
- escape = $.fn.search.settings.templates.escape
1535
- ;
1536
- if(response[fields.results] !== undefined) {
1537
-
1538
- // each result
1539
- $.each(response[fields.results], function(index, result) {
1540
- if(result[fields.url]) {
1541
- html += '<a class="result" href="' + result[fields.url].replace(/"/g,"") + '">';
1542
- }
1543
- else {
1544
- html += '<a class="result">';
1545
- }
1546
- if(result[fields.image] !== undefined) {
1547
- html += ''
1548
- + '<div class="image">'
1549
- + ' <img src="' + result[fields.image].replace(/"/g,"") + '">'
1550
- + '</div>'
1551
- ;
1552
- }
1553
- html += '<div class="content">';
1554
- if(result[fields.price] !== undefined) {
1555
- html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>';
1556
- }
1557
- if(result[fields.title] !== undefined) {
1558
- html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>';
1559
- }
1560
- if(result[fields.description] !== undefined) {
1561
- html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>';
1562
- }
1563
- html += ''
1564
- + '</div>'
1565
- ;
1566
- html += '</a>';
1567
- });
1568
- if(response[fields.action]) {
1569
- if(fields.actionURL === false) {
1570
- html += ''
1571
- + '<div class="action">'
1572
- + escape(response[fields.action][fields.actionText], preserveHTML)
1573
- + '</div>';
1574
- } else {
1575
- html += ''
1576
- + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g,"") + '" class="action">'
1577
- + escape(response[fields.action][fields.actionText], preserveHTML)
1578
- + '</a>';
1579
- }
1580
- }
1581
- return html;
1582
- }
1583
- return false;
1584
- }
1585
- }
1586
- };
1502
+ if (response[fields.results] !== undefined) {
1503
+ // each result
1504
+ $.each(response[fields.results], function (index, result) {
1505
+ html += result[fields.url]
1506
+ ? '<a class="result" href="' + result[fields.url].replace(/"/g, '') + '">'
1507
+ : '<a class="result">';
1508
+ if (result[fields.image] !== undefined) {
1509
+ html += ''
1510
+ + '<div class="image">'
1511
+ + ' <img src="' + result[fields.image].replace(/"/g, '') + '">'
1512
+ + '</div>';
1513
+ }
1514
+ html += '<div class="content">';
1515
+ if (result[fields.price] !== undefined) {
1516
+ html += '<div class="price">' + escape(result[fields.price], preserveHTML) + '</div>';
1517
+ }
1518
+ if (result[fields.title] !== undefined) {
1519
+ html += '<div class="title">' + escape(result[fields.title], preserveHTML) + '</div>';
1520
+ }
1521
+ if (result[fields.description] !== undefined) {
1522
+ html += '<div class="description">' + escape(result[fields.description], preserveHTML) + '</div>';
1523
+ }
1524
+ html += ''
1525
+ + '</div>';
1526
+ html += '</a>';
1527
+ });
1528
+ if (response[fields.action]) {
1529
+ html += fields.actionURL === false
1530
+ ? ''
1531
+ + '<div class="action">'
1532
+ + escape(response[fields.action][fields.actionText], preserveHTML)
1533
+ + '</div>'
1534
+ : ''
1535
+ + '<a href="' + response[fields.action][fields.actionURL].replace(/"/g, '') + '" class="action">'
1536
+ + escape(response[fields.action][fields.actionText], preserveHTML)
1537
+ + '</a>';
1538
+ }
1587
1539
 
1588
- $.extend($.easing, {
1589
- easeOutExpo: function(x) {
1590
- return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);
1591
- }
1592
- });
1540
+ return html;
1541
+ }
1593
1542
 
1594
- })( jQuery, window, document );
1543
+ return false;
1544
+ },
1545
+ },
1546
+ };
1547
+
1548
+ $.extend($.easing, {
1549
+ easeOutExpo: function (x) {
1550
+ return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);
1551
+ },
1552
+ });
1553
+ })(jQuery, window, document);