rbbt-rest 1.8.42 → 1.8.43

Sign up to get free protection for your applications and to get access to all the features.
Files changed (421) hide show
  1. checksums.yaml +4 -4
  2. data/share/views/compass/old/base/backgrounds.sass +41 -0
  3. data/share/views/compass/old/base/blocks.sass +92 -0
  4. data/share/views/compass/old/base/color.sass +66 -0
  5. data/share/views/compass/old/base/colors.sass +66 -0
  6. data/share/views/compass/old/base/font-scale.sass +20 -0
  7. data/share/views/compass/old/base/fonts.sass +56 -0
  8. data/share/views/compass/old/base/hide.sass +95 -0
  9. data/share/views/compass/old/base/icon_content.scss +569 -0
  10. data/share/views/compass/old/base/icons.sass +75 -0
  11. data/share/views/compass/old/base/material.sass +223 -0
  12. data/share/views/compass/old/base/misc.sass +2 -0
  13. data/share/views/compass/old/base/screen_sizes.sass +16 -0
  14. data/share/views/compass/old/base/text.sass +70 -0
  15. data/share/views/compass/old/base/util.sass +6 -0
  16. data/share/views/compass/old/base/variables.sass +68 -0
  17. data/share/views/compass/old/base/variables/color.sass +27 -0
  18. data/share/views/compass/old/blocks.sass +0 -0
  19. data/share/views/compass/old/cards.sass +131 -0
  20. data/share/views/compass/old/color.sass +10 -0
  21. data/share/views/compass/old/color/blocks.sass +0 -0
  22. data/share/views/compass/old/color/buttons.sass +36 -0
  23. data/share/views/compass/old/color/elements.sass +2 -0
  24. data/share/views/compass/old/color/font.sass +13 -0
  25. data/share/views/compass/old/color/top_bar.sass +18 -0
  26. data/share/views/compass/old/elements.sass +218 -0
  27. data/share/views/compass/old/elements/buttons.sass +18 -0
  28. data/share/views/compass/old/elements/forms.sass +197 -0
  29. data/share/views/compass/old/elements/lists.sass +14 -0
  30. data/share/views/compass/old/elements/materials.sass +1 -0
  31. data/share/views/compass/old/elements/movement.sass +84 -0
  32. data/share/views/compass/old/elements/positions.sass +18 -0
  33. data/share/views/compass/old/elements/table.sass +176 -0
  34. data/share/views/compass/old/elements/tool.sass +60 -0
  35. data/share/views/compass/old/grid.sass +3 -0
  36. data/share/views/compass/old/init.sass +9 -0
  37. data/share/views/compass/old/layout.sass +5 -0
  38. data/share/views/compass/old/layout/body.sass +23 -0
  39. data/share/views/compass/old/layout/footer.sass +44 -0
  40. data/share/views/compass/old/layout/result.sass +6 -0
  41. data/share/views/compass/old/layout/reveal.sass +50 -0
  42. data/share/views/compass/old/layout/top_bar.sass +99 -0
  43. data/share/views/compass/old/layout/top_menu.sass +87 -0
  44. data/share/views/compass/old/menu.sass +43 -0
  45. data/share/views/compass/old/menu/accordion_menu.sass +30 -0
  46. data/share/views/compass/old/menu/actionable.sass +1 -0
  47. data/share/views/compass/old/menu/dropdown_menu.sass +31 -0
  48. data/share/views/compass/old/menu/hide.sass +14 -0
  49. data/share/views/compass/old/menu/menu.sass +98 -0
  50. data/share/views/compass/old/menu/tab_menu.sass +14 -0
  51. data/share/views/compass/old/menu/top_bar.sass +105 -0
  52. data/share/views/compass/old/menu/vertical_menu.sass +21 -0
  53. data/share/views/compass/old/mixins/_all.sass +24 -0
  54. data/share/views/compass/old/mixins/_blocks.sass +79 -0
  55. data/share/views/compass/old/mixins/_compass.sass +0 -0
  56. data/share/views/compass/old/mixins/_deps.sass +5 -0
  57. data/share/views/compass/old/mixins/_hide.sass +76 -0
  58. data/share/views/compass/old/mixins/_keyframes.scss +4 -0
  59. data/share/views/compass/old/mixins/_semantic-ui.sass +2 -0
  60. data/share/views/compass/old/new.sass +1 -0
  61. data/share/views/compass/old/offcanvas.sass +52 -0
  62. data/share/views/compass/old/position/basic.sass +0 -0
  63. data/share/views/compass/old/responsive.sass +53 -0
  64. data/share/views/compass/old/semantic-ui.css +1 -0
  65. data/share/views/compass/old/semantic-ui/semantic-ui.css +19776 -0
  66. data/share/views/compass/old/space/button.sass +74 -0
  67. data/share/views/compass/old/table.sass +142 -0
  68. data/share/views/compass/old/text.sass +48 -0
  69. data/share/views/compass/old/variables/colors.sass +7 -0
  70. data/share/views/compass/old/variables/sizes.sass +5 -0
  71. data/share/views/layout/header.haml +1 -1
  72. data/share/views/public/js/helpers/helpers.js +25 -0
  73. data/share/views/public/js/rbbt.views.js +78 -18
  74. data/share/views/public/js/rbbt/table.js +0 -1
  75. data/share/views/public/plugins/FileSaver/js/FileSaver.js +74 -134
  76. data/share/views/public/plugins/jquery/js/jquery-3.1.1.js +10220 -0
  77. data/share/views/public/plugins/semantic-ui/CONTRIBUTING.md +48 -6
  78. data/share/views/public/plugins/semantic-ui/README.md +40 -15
  79. data/share/views/public/plugins/semantic-ui/RELEASE-NOTES.md +669 -14
  80. data/share/views/public/plugins/semantic-ui/bower.json +1 -3
  81. data/share/views/public/plugins/semantic-ui/dist/components/accordion.css +7 -10
  82. data/share/views/public/plugins/semantic-ui/dist/components/accordion.js +39 -21
  83. data/share/views/public/plugins/semantic-ui/dist/components/accordion.min.css +2 -3
  84. data/share/views/public/plugins/semantic-ui/dist/components/accordion.min.js +2 -3
  85. data/share/views/public/plugins/semantic-ui/dist/components/ad.css +2 -3
  86. data/share/views/public/plugins/semantic-ui/dist/components/ad.min.css +2 -2
  87. data/share/views/public/plugins/semantic-ui/dist/components/api.js +161 -71
  88. data/share/views/public/plugins/semantic-ui/dist/components/api.min.js +2 -3
  89. data/share/views/public/plugins/semantic-ui/dist/components/breadcrumb.css +5 -6
  90. data/share/views/public/plugins/semantic-ui/dist/components/breadcrumb.min.css +2 -3
  91. data/share/views/public/plugins/semantic-ui/dist/components/button.css +658 -432
  92. data/share/views/public/plugins/semantic-ui/dist/components/button.min.css +2 -3
  93. data/share/views/public/plugins/semantic-ui/dist/components/card.css +68 -44
  94. data/share/views/public/plugins/semantic-ui/dist/components/card.min.css +2 -3
  95. data/share/views/public/plugins/semantic-ui/dist/components/checkbox.css +126 -89
  96. data/share/views/public/plugins/semantic-ui/dist/components/checkbox.js +216 -91
  97. data/share/views/public/plugins/semantic-ui/dist/components/checkbox.min.css +2 -3
  98. data/share/views/public/plugins/semantic-ui/dist/components/checkbox.min.js +2 -3
  99. data/share/views/public/plugins/semantic-ui/dist/components/colorize.js +1 -1
  100. data/share/views/public/plugins/semantic-ui/dist/components/comment.css +17 -6
  101. data/share/views/public/plugins/semantic-ui/dist/components/comment.min.css +2 -3
  102. data/share/views/public/plugins/semantic-ui/dist/components/container.css +29 -7
  103. data/share/views/public/plugins/semantic-ui/dist/components/container.min.css +2 -3
  104. data/share/views/public/plugins/semantic-ui/dist/components/dimmer.css +7 -9
  105. data/share/views/public/plugins/semantic-ui/dist/components/dimmer.js +80 -39
  106. data/share/views/public/plugins/semantic-ui/dist/components/dimmer.min.css +2 -3
  107. data/share/views/public/plugins/semantic-ui/dist/components/dimmer.min.js +2 -3
  108. data/share/views/public/plugins/semantic-ui/dist/components/divider.css +8 -8
  109. data/share/views/public/plugins/semantic-ui/dist/components/divider.min.css +2 -3
  110. data/share/views/public/plugins/semantic-ui/dist/components/dropdown.css +127 -98
  111. data/share/views/public/plugins/semantic-ui/dist/components/dropdown.js +918 -400
  112. data/share/views/public/plugins/semantic-ui/dist/components/dropdown.min.css +2 -3
  113. data/share/views/public/plugins/semantic-ui/dist/components/dropdown.min.js +3 -5
  114. data/share/views/public/plugins/semantic-ui/dist/components/embed.css +12 -8
  115. data/share/views/public/plugins/semantic-ui/dist/components/embed.js +51 -17
  116. data/share/views/public/plugins/semantic-ui/dist/components/embed.min.css +2 -3
  117. data/share/views/public/plugins/semantic-ui/dist/components/embed.min.js +2 -3
  118. data/share/views/public/plugins/semantic-ui/dist/components/feed.css +5 -6
  119. data/share/views/public/plugins/semantic-ui/dist/components/feed.min.css +2 -3
  120. data/share/views/public/plugins/semantic-ui/dist/components/flag.css +10 -3
  121. data/share/views/public/plugins/semantic-ui/dist/components/flag.min.css +2 -3
  122. data/share/views/public/plugins/semantic-ui/dist/components/form.css +208 -121
  123. data/share/views/public/plugins/semantic-ui/dist/components/form.js +469 -167
  124. data/share/views/public/plugins/semantic-ui/dist/components/form.min.css +2 -3
  125. data/share/views/public/plugins/semantic-ui/dist/components/form.min.js +2 -3
  126. data/share/views/public/plugins/semantic-ui/dist/components/grid.css +222 -71
  127. data/share/views/public/plugins/semantic-ui/dist/components/grid.min.css +2 -3
  128. data/share/views/public/plugins/semantic-ui/dist/components/header.css +47 -48
  129. data/share/views/public/plugins/semantic-ui/dist/components/header.min.css +2 -3
  130. data/share/views/public/plugins/semantic-ui/dist/components/icon.css +839 -280
  131. data/share/views/public/plugins/semantic-ui/dist/components/icon.min.css +2 -3
  132. data/share/views/public/plugins/semantic-ui/dist/components/image.css +7 -3
  133. data/share/views/public/plugins/semantic-ui/dist/components/image.min.css +2 -3
  134. data/share/views/public/plugins/semantic-ui/dist/components/input.css +91 -61
  135. data/share/views/public/plugins/semantic-ui/dist/components/input.min.css +2 -3
  136. data/share/views/public/plugins/semantic-ui/dist/components/item.css +17 -18
  137. data/share/views/public/plugins/semantic-ui/dist/components/item.min.css +2 -3
  138. data/share/views/public/plugins/semantic-ui/dist/components/label.css +497 -304
  139. data/share/views/public/plugins/semantic-ui/dist/components/label.min.css +2 -3
  140. data/share/views/public/plugins/semantic-ui/dist/components/list.css +56 -27
  141. data/share/views/public/plugins/semantic-ui/dist/components/list.min.css +2 -3
  142. data/share/views/public/plugins/semantic-ui/dist/components/loader.css +101 -40
  143. data/share/views/public/plugins/semantic-ui/dist/components/loader.min.css +2 -3
  144. data/share/views/public/plugins/semantic-ui/dist/components/menu.css +335 -179
  145. data/share/views/public/plugins/semantic-ui/dist/components/menu.min.css +1 -1
  146. data/share/views/public/plugins/semantic-ui/dist/components/message.css +83 -65
  147. data/share/views/public/plugins/semantic-ui/dist/components/message.min.css +2 -3
  148. data/share/views/public/plugins/semantic-ui/dist/components/modal.css +16 -18
  149. data/share/views/public/plugins/semantic-ui/dist/components/modal.js +68 -42
  150. data/share/views/public/plugins/semantic-ui/dist/components/modal.min.css +2 -3
  151. data/share/views/public/plugins/semantic-ui/dist/components/modal.min.js +2 -3
  152. data/share/views/public/plugins/semantic-ui/dist/components/nag.css +6 -7
  153. data/share/views/public/plugins/semantic-ui/dist/components/nag.js +41 -10
  154. data/share/views/public/plugins/semantic-ui/dist/components/nag.min.css +2 -3
  155. data/share/views/public/plugins/semantic-ui/dist/components/nag.min.js +2 -3
  156. data/share/views/public/plugins/semantic-ui/dist/components/popup.css +423 -39
  157. data/share/views/public/plugins/semantic-ui/dist/components/popup.js +275 -153
  158. data/share/views/public/plugins/semantic-ui/dist/components/popup.min.css +2 -3
  159. data/share/views/public/plugins/semantic-ui/dist/components/popup.min.js +2 -3
  160. data/share/views/public/plugins/semantic-ui/dist/components/progress.css +47 -48
  161. data/share/views/public/plugins/semantic-ui/dist/components/progress.js +202 -64
  162. data/share/views/public/plugins/semantic-ui/dist/components/progress.min.css +2 -3
  163. data/share/views/public/plugins/semantic-ui/dist/components/progress.min.js +2 -3
  164. data/share/views/public/plugins/semantic-ui/dist/components/rail.css +24 -4
  165. data/share/views/public/plugins/semantic-ui/dist/components/rail.min.css +2 -3
  166. data/share/views/public/plugins/semantic-ui/dist/components/rating.css +12 -13
  167. data/share/views/public/plugins/semantic-ui/dist/components/rating.js +43 -10
  168. data/share/views/public/plugins/semantic-ui/dist/components/rating.min.css +2 -3
  169. data/share/views/public/plugins/semantic-ui/dist/components/rating.min.js +2 -3
  170. data/share/views/public/plugins/semantic-ui/dist/components/reset.css +1 -6
  171. data/share/views/public/plugins/semantic-ui/dist/components/reset.min.css +2 -3
  172. data/share/views/public/plugins/semantic-ui/dist/components/reveal.css +13 -41
  173. data/share/views/public/plugins/semantic-ui/dist/components/reveal.min.css +2 -3
  174. data/share/views/public/plugins/semantic-ui/dist/components/search.css +53 -21
  175. data/share/views/public/plugins/semantic-ui/dist/components/search.js +261 -132
  176. data/share/views/public/plugins/semantic-ui/dist/components/search.min.css +2 -3
  177. data/share/views/public/plugins/semantic-ui/dist/components/search.min.js +2 -3
  178. data/share/views/public/plugins/semantic-ui/dist/components/segment.css +124 -72
  179. data/share/views/public/plugins/semantic-ui/dist/components/segment.min.css +2 -3
  180. data/share/views/public/plugins/semantic-ui/dist/components/shape.css +11 -8
  181. data/share/views/public/plugins/semantic-ui/dist/components/shape.js +68 -23
  182. data/share/views/public/plugins/semantic-ui/dist/components/shape.min.css +2 -3
  183. data/share/views/public/plugins/semantic-ui/dist/components/shape.min.js +2 -3
  184. data/share/views/public/plugins/semantic-ui/dist/components/sidebar.css +45 -36
  185. data/share/views/public/plugins/semantic-ui/dist/components/sidebar.js +23 -10
  186. data/share/views/public/plugins/semantic-ui/dist/components/sidebar.min.css +2 -3
  187. data/share/views/public/plugins/semantic-ui/dist/components/sidebar.min.js +2 -3
  188. data/share/views/public/plugins/semantic-ui/dist/components/site.css +6 -7
  189. data/share/views/public/plugins/semantic-ui/dist/components/site.js +5 -5
  190. data/share/views/public/plugins/semantic-ui/dist/components/site.min.css +2 -3
  191. data/share/views/public/plugins/semantic-ui/dist/components/site.min.js +2 -3
  192. data/share/views/public/plugins/semantic-ui/dist/components/state.js +22 -9
  193. data/share/views/public/plugins/semantic-ui/dist/components/state.min.js +2 -3
  194. data/share/views/public/plugins/semantic-ui/dist/components/statistic.css +46 -45
  195. data/share/views/public/plugins/semantic-ui/dist/components/statistic.min.css +2 -3
  196. data/share/views/public/plugins/semantic-ui/dist/components/step.css +83 -44
  197. data/share/views/public/plugins/semantic-ui/dist/components/step.min.css +2 -3
  198. data/share/views/public/plugins/semantic-ui/dist/components/sticky.css +2 -3
  199. data/share/views/public/plugins/semantic-ui/dist/components/sticky.js +138 -78
  200. data/share/views/public/plugins/semantic-ui/dist/components/sticky.min.css +1 -2
  201. data/share/views/public/plugins/semantic-ui/dist/components/sticky.min.js +2 -3
  202. data/share/views/public/plugins/semantic-ui/dist/components/tab.css +1 -2
  203. data/share/views/public/plugins/semantic-ui/dist/components/tab.js +95 -46
  204. data/share/views/public/plugins/semantic-ui/dist/components/tab.min.css +1 -2
  205. data/share/views/public/plugins/semantic-ui/dist/components/tab.min.js +2 -3
  206. data/share/views/public/plugins/semantic-ui/dist/components/table.css +136 -77
  207. data/share/views/public/plugins/semantic-ui/dist/components/table.min.css +2 -3
  208. data/share/views/public/plugins/semantic-ui/dist/components/transition.css +1 -19
  209. data/share/views/public/plugins/semantic-ui/dist/components/transition.js +58 -32
  210. data/share/views/public/plugins/semantic-ui/dist/components/transition.min.css +2 -3
  211. data/share/views/public/plugins/semantic-ui/dist/components/transition.min.js +2 -3
  212. data/share/views/public/plugins/semantic-ui/dist/components/video.js +1 -1
  213. data/share/views/public/plugins/semantic-ui/dist/components/visibility.js +99 -29
  214. data/share/views/public/plugins/semantic-ui/dist/components/visibility.min.js +2 -3
  215. data/share/views/public/plugins/semantic-ui/dist/semantic.css +5051 -3645
  216. data/share/views/public/plugins/semantic-ui/dist/semantic.js +3345 -1456
  217. data/share/views/public/plugins/semantic-ui/dist/semantic.min.css +2 -2
  218. data/share/views/public/plugins/semantic-ui/dist/semantic.min.js +10 -10
  219. data/share/views/public/plugins/semantic-ui/dist/themes/default/assets/fonts/icons.eot +0 -0
  220. data/share/views/public/plugins/semantic-ui/dist/themes/default/assets/fonts/icons.svg +146 -26
  221. data/share/views/public/plugins/semantic-ui/dist/themes/default/assets/fonts/icons.ttf +0 -0
  222. data/share/views/public/plugins/semantic-ui/dist/themes/default/assets/fonts/icons.woff +0 -0
  223. data/share/views/public/plugins/semantic-ui/dist/themes/default/assets/fonts/icons.woff2 +0 -0
  224. data/share/views/public/plugins/semantic-ui/dist/themes/github/assets/fonts/octicons-local.ttf +0 -0
  225. data/share/views/public/plugins/semantic-ui/dist/themes/github/assets/fonts/octicons.svg +200 -0
  226. data/share/views/public/plugins/semantic-ui/dist/themes/github/assets/fonts/octicons.ttf +0 -0
  227. data/share/views/public/plugins/semantic-ui/dist/themes/github/assets/fonts/octicons.woff +0 -0
  228. data/share/views/public/plugins/semantic-ui/dist/themes/material/assets/fonts/icons.eot +0 -0
  229. data/share/views/public/plugins/semantic-ui/dist/themes/material/assets/fonts/icons.svg +2373 -0
  230. data/share/views/public/plugins/semantic-ui/dist/themes/material/assets/fonts/icons.ttf +0 -0
  231. data/share/views/public/plugins/semantic-ui/dist/themes/material/assets/fonts/icons.woff +0 -0
  232. data/share/views/public/plugins/semantic-ui/examples/assets/library/iframe-content.js +8 -8
  233. data/share/views/public/plugins/semantic-ui/examples/assets/library/iframe.js +1 -1
  234. data/share/views/public/plugins/semantic-ui/examples/attached.html +381 -0
  235. data/share/views/public/plugins/semantic-ui/examples/bootstrap.html +4 -4
  236. data/share/views/public/plugins/semantic-ui/examples/components/site.html +1 -1
  237. data/share/views/public/plugins/semantic-ui/examples/fixed.html +10 -10
  238. data/share/views/public/plugins/semantic-ui/examples/grid.html +1 -1
  239. data/share/views/public/plugins/semantic-ui/examples/homepage.html +3 -3
  240. data/share/views/public/plugins/semantic-ui/examples/login.html +1 -1
  241. data/share/views/public/plugins/semantic-ui/examples/responsive.html +5 -5
  242. data/share/views/public/plugins/semantic-ui/examples/sticky.html +1 -1
  243. data/share/views/public/plugins/semantic-ui/examples/theming.html +1 -1
  244. data/share/views/public/plugins/semantic-ui/gulpfile.js +3 -3
  245. data/share/views/public/plugins/semantic-ui/package.json +36 -31
  246. data/share/views/public/plugins/semantic-ui/semantic.json.example +1 -0
  247. data/share/views/public/plugins/semantic-ui/src/_site/collections/message.overrides +1 -1
  248. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/api.js +160 -70
  249. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/colorize.js +235 -229
  250. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/form.js +468 -166
  251. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/state.js +21 -8
  252. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/visibility.js +98 -28
  253. data/share/views/public/plugins/semantic-ui/src/definitions/behaviors/visit.js +14 -6
  254. data/share/views/public/plugins/semantic-ui/src/definitions/collections/breadcrumb.less +2 -3
  255. data/share/views/public/plugins/semantic-ui/src/definitions/collections/form.less +154 -74
  256. data/share/views/public/plugins/semantic-ui/src/definitions/collections/grid.less +171 -41
  257. data/share/views/public/plugins/semantic-ui/src/definitions/collections/menu.less +235 -99
  258. data/share/views/public/plugins/semantic-ui/src/definitions/collections/message.less +28 -10
  259. data/share/views/public/plugins/semantic-ui/src/definitions/collections/table.less +77 -16
  260. data/share/views/public/plugins/semantic-ui/src/definitions/elements/button.less +326 -109
  261. data/share/views/public/plugins/semantic-ui/src/definitions/elements/container.less +25 -7
  262. data/share/views/public/plugins/semantic-ui/src/definitions/elements/divider.less +7 -7
  263. data/share/views/public/plugins/semantic-ui/src/definitions/elements/flag.less +2 -3
  264. data/share/views/public/plugins/semantic-ui/src/definitions/elements/header.less +3 -4
  265. data/share/views/public/plugins/semantic-ui/src/definitions/elements/icon.less +37 -6
  266. data/share/views/public/plugins/semantic-ui/src/definitions/elements/image.less +324 -319
  267. data/share/views/public/plugins/semantic-ui/src/definitions/elements/input.less +70 -39
  268. data/share/views/public/plugins/semantic-ui/src/definitions/elements/label.less +363 -245
  269. data/share/views/public/plugins/semantic-ui/src/definitions/elements/list.less +49 -19
  270. data/share/views/public/plugins/semantic-ui/src/definitions/elements/loader.less +72 -9
  271. data/share/views/public/plugins/semantic-ui/src/definitions/elements/rail.less +21 -2
  272. data/share/views/public/plugins/semantic-ui/src/definitions/elements/reveal.less +6 -14
  273. data/share/views/public/plugins/semantic-ui/src/definitions/elements/segment.less +72 -21
  274. data/share/views/public/plugins/semantic-ui/src/definitions/elements/step.less +68 -34
  275. data/share/views/public/plugins/semantic-ui/src/definitions/globals/reset.less +1 -2
  276. data/share/views/public/plugins/semantic-ui/src/definitions/globals/site.js +4 -4
  277. data/share/views/public/plugins/semantic-ui/src/definitions/globals/site.less +3 -1
  278. data/share/views/public/plugins/semantic-ui/src/definitions/modules/accordion.js +38 -20
  279. data/share/views/public/plugins/semantic-ui/src/definitions/modules/accordion.less +2 -2
  280. data/share/views/public/plugins/semantic-ui/src/definitions/modules/checkbox.js +215 -90
  281. data/share/views/public/plugins/semantic-ui/src/definitions/modules/checkbox.less +105 -69
  282. data/share/views/public/plugins/semantic-ui/src/definitions/modules/dimmer.js +79 -38
  283. data/share/views/public/plugins/semantic-ui/src/definitions/modules/dimmer.less +1 -2
  284. data/share/views/public/plugins/semantic-ui/src/definitions/modules/dropdown.js +917 -399
  285. data/share/views/public/plugins/semantic-ui/src/definitions/modules/dropdown.less +62 -25
  286. data/share/views/public/plugins/semantic-ui/src/definitions/modules/embed.js +51 -17
  287. data/share/views/public/plugins/semantic-ui/src/definitions/modules/embed.less +163 -164
  288. data/share/views/public/plugins/semantic-ui/src/definitions/modules/modal.js +67 -41
  289. data/share/views/public/plugins/semantic-ui/src/definitions/modules/modal.less +7 -8
  290. data/share/views/public/plugins/semantic-ui/src/definitions/modules/nag.js +40 -9
  291. data/share/views/public/plugins/semantic-ui/src/definitions/modules/nag.less +158 -159
  292. data/share/views/public/plugins/semantic-ui/src/definitions/modules/popup.js +274 -152
  293. data/share/views/public/plugins/semantic-ui/src/definitions/modules/popup.less +712 -332
  294. data/share/views/public/plugins/semantic-ui/src/definitions/modules/progress.js +201 -63
  295. data/share/views/public/plugins/semantic-ui/src/definitions/modules/progress.less +0 -1
  296. data/share/views/public/plugins/semantic-ui/src/definitions/modules/rating.js +42 -9
  297. data/share/views/public/plugins/semantic-ui/src/definitions/modules/rating.less +0 -1
  298. data/share/views/public/plugins/semantic-ui/src/definitions/modules/search.js +260 -131
  299. data/share/views/public/plugins/semantic-ui/src/definitions/modules/search.less +35 -2
  300. data/share/views/public/plugins/semantic-ui/src/definitions/modules/shape.js +67 -22
  301. data/share/views/public/plugins/semantic-ui/src/definitions/modules/shape.less +1 -2
  302. data/share/views/public/plugins/semantic-ui/src/definitions/modules/sidebar.js +22 -9
  303. data/share/views/public/plugins/semantic-ui/src/definitions/modules/sidebar.less +13 -15
  304. data/share/views/public/plugins/semantic-ui/src/definitions/modules/sticky.js +137 -77
  305. data/share/views/public/plugins/semantic-ui/src/definitions/modules/sticky.less +1 -2
  306. data/share/views/public/plugins/semantic-ui/src/definitions/modules/tab.js +94 -45
  307. data/share/views/public/plugins/semantic-ui/src/definitions/modules/tab.less +1 -2
  308. data/share/views/public/plugins/semantic-ui/src/definitions/modules/transition.js +57 -31
  309. data/share/views/public/plugins/semantic-ui/src/definitions/modules/transition.less +1 -2
  310. data/share/views/public/plugins/semantic-ui/src/definitions/views/ad.less +1 -1
  311. data/share/views/public/plugins/semantic-ui/src/definitions/views/card.less +23 -2
  312. data/share/views/public/plugins/semantic-ui/src/definitions/views/comment.less +18 -5
  313. data/share/views/public/plugins/semantic-ui/src/definitions/views/feed.less +0 -1
  314. data/share/views/public/plugins/semantic-ui/src/definitions/views/item.less +3 -4
  315. data/share/views/public/plugins/semantic-ui/src/definitions/views/statistic.less +18 -19
  316. data/share/views/public/plugins/semantic-ui/src/theme.less +13 -7
  317. data/share/views/public/plugins/semantic-ui/src/themes/amazon/globals/site.variables +43 -0
  318. data/share/views/public/plugins/semantic-ui/src/themes/basic/elements/step.overrides +3 -0
  319. data/share/views/public/plugins/semantic-ui/src/themes/basic/elements/step.variables +12 -4
  320. data/share/views/public/plugins/semantic-ui/src/themes/basic/globals/reset.overrides +1 -1
  321. data/share/views/public/plugins/semantic-ui/src/themes/bookish/elements/header.variables +5 -5
  322. data/share/views/public/plugins/semantic-ui/src/themes/chubby/elements/header.variables +5 -5
  323. data/share/views/public/plugins/semantic-ui/src/themes/colored/modules/checkbox.variables +15 -3
  324. data/share/views/public/plugins/semantic-ui/src/themes/default/assets/fonts/icons.eot +0 -0
  325. data/share/views/public/plugins/semantic-ui/src/themes/default/assets/fonts/icons.svg +146 -26
  326. data/share/views/public/plugins/semantic-ui/src/themes/default/assets/fonts/icons.ttf +0 -0
  327. data/share/views/public/plugins/semantic-ui/src/themes/default/assets/fonts/icons.woff +0 -0
  328. data/share/views/public/plugins/semantic-ui/src/themes/default/assets/fonts/icons.woff2 +0 -0
  329. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/breadcrumb.variables +1 -1
  330. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/form.variables +20 -14
  331. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/grid.variables +5 -0
  332. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/menu.variables +57 -28
  333. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/message.variables +48 -1
  334. data/share/views/public/plugins/semantic-ui/src/themes/default/collections/table.variables +18 -4
  335. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/button.variables +28 -4
  336. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/container.variables +14 -1
  337. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/flag.overrides +8 -0
  338. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/icon.overrides +263 -86
  339. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/icon.variables +3 -1
  340. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/input.variables +7 -10
  341. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/label.variables +37 -10
  342. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/list.variables +2 -1
  343. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/loader.variables +17 -5
  344. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/rail.variables +2 -2
  345. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/segment.variables +6 -5
  346. data/share/views/public/plugins/semantic-ui/src/themes/default/elements/step.variables +7 -4
  347. data/share/views/public/plugins/semantic-ui/src/themes/default/globals/reset.overrides +1 -6
  348. data/share/views/public/plugins/semantic-ui/src/themes/default/globals/site.variables +216 -67
  349. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/checkbox.variables +36 -11
  350. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/dropdown.variables +27 -18
  351. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/popup.variables +52 -4
  352. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/rating.overrides +2 -2
  353. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/search.variables +16 -0
  354. data/share/views/public/plugins/semantic-ui/src/themes/default/modules/sticky.variables +1 -1
  355. data/share/views/public/plugins/semantic-ui/src/themes/default/views/card.variables +11 -0
  356. data/share/views/public/plugins/semantic-ui/src/themes/flat/collections/form.variables +1 -0
  357. data/share/views/public/plugins/semantic-ui/src/themes/github/assets/fonts/octicons-local.ttf +0 -0
  358. data/share/views/public/plugins/semantic-ui/src/themes/github/assets/fonts/octicons.svg +200 -0
  359. data/share/views/public/plugins/semantic-ui/src/themes/github/assets/fonts/octicons.ttf +0 -0
  360. data/share/views/public/plugins/semantic-ui/src/themes/github/assets/fonts/octicons.woff +0 -0
  361. data/share/views/public/plugins/semantic-ui/src/themes/github/collections/breadcrumb.variables +11 -0
  362. data/share/views/public/plugins/semantic-ui/src/themes/github/collections/grid.variables +2 -0
  363. data/share/views/public/plugins/semantic-ui/src/themes/github/collections/table.variables +8 -0
  364. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/header.variables +9 -0
  365. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/icon.overrides +208 -0
  366. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/icon.variables +13 -0
  367. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/image.variables +5 -0
  368. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/input.overrides +32 -0
  369. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/input.variables +16 -0
  370. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/label.overrides +9 -0
  371. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/label.variables +4 -0
  372. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/segment.variables +0 -1
  373. data/share/views/public/plugins/semantic-ui/src/themes/github/elements/step.variables +7 -1
  374. data/share/views/public/plugins/semantic-ui/src/themes/github/globals/site.variables +47 -0
  375. data/share/views/public/plugins/semantic-ui/src/themes/github/modules/dropdown.overrides +53 -0
  376. data/share/views/public/plugins/semantic-ui/src/themes/github/modules/dropdown.variables +35 -0
  377. data/share/views/public/plugins/semantic-ui/src/themes/github/modules/popup.variables +12 -0
  378. data/share/views/public/plugins/semantic-ui/src/themes/material/assets/fonts/icons.eot +0 -0
  379. data/share/views/public/plugins/semantic-ui/src/themes/material/assets/fonts/icons.svg +2373 -0
  380. data/share/views/public/plugins/semantic-ui/src/themes/material/assets/fonts/icons.ttf +0 -0
  381. data/share/views/public/plugins/semantic-ui/src/themes/material/assets/fonts/icons.woff +0 -0
  382. data/share/views/public/plugins/semantic-ui/src/themes/material/collections/menu.overrides +1 -1
  383. data/share/views/public/plugins/semantic-ui/src/themes/material/collections/menu.variables +1 -1
  384. data/share/views/public/plugins/semantic-ui/src/themes/material/elements/button.overrides +2 -10
  385. data/share/views/public/plugins/semantic-ui/src/themes/material/elements/button.variables +4 -2
  386. data/share/views/public/plugins/semantic-ui/src/themes/material/elements/header.overrides +2 -2
  387. data/share/views/public/plugins/semantic-ui/src/themes/material/elements/icon.overrides +934 -0
  388. data/share/views/public/plugins/semantic-ui/src/themes/material/elements/icon.variables +11 -0
  389. data/share/views/public/plugins/semantic-ui/src/themes/material/globals/site.variables +8 -0
  390. data/share/views/public/plugins/semantic-ui/src/themes/material/modules/dropdown.overrides +2 -2
  391. data/share/views/public/plugins/semantic-ui/src/themes/material/modules/modal.overrides +2 -2
  392. data/share/views/public/plugins/semantic-ui/src/themes/twitter/elements/button.variables +1 -2
  393. data/share/views/public/plugins/semantic-ui/tasks/README.md +2 -2
  394. data/share/views/public/plugins/semantic-ui/tasks/admin/components/create.js +8 -8
  395. data/share/views/public/plugins/semantic-ui/tasks/admin/distributions/create.js +6 -6
  396. data/share/views/public/plugins/semantic-ui/tasks/admin/distributions/init.js +11 -12
  397. data/share/views/public/plugins/semantic-ui/tasks/admin/distributions/update.js +0 -3
  398. data/share/views/public/plugins/semantic-ui/tasks/build.js +22 -9
  399. data/share/views/public/plugins/semantic-ui/tasks/build/css.js +13 -5
  400. data/share/views/public/plugins/semantic-ui/tasks/collections/build.js +19 -0
  401. data/share/views/public/plugins/semantic-ui/tasks/collections/internal.js +23 -10
  402. data/share/views/public/plugins/semantic-ui/tasks/collections/rtl.js +16 -0
  403. data/share/views/public/plugins/semantic-ui/tasks/config/admin/github.js +1 -2
  404. data/share/views/public/plugins/semantic-ui/tasks/config/admin/oauth.example.js +4 -3
  405. data/share/views/public/plugins/semantic-ui/tasks/config/admin/release.js +1 -0
  406. data/share/views/public/plugins/semantic-ui/tasks/config/admin/templates/README.md +3 -0
  407. data/share/views/public/plugins/semantic-ui/tasks/config/npm/gulpfile.js +3 -3
  408. data/share/views/public/plugins/semantic-ui/tasks/config/project/config.js +3 -4
  409. data/share/views/public/plugins/semantic-ui/tasks/config/project/install.js +13 -6
  410. data/share/views/public/plugins/semantic-ui/tasks/config/project/release.js +16 -12
  411. data/share/views/public/plugins/semantic-ui/tasks/config/tasks.js +11 -5
  412. data/share/views/public/plugins/semantic-ui/tasks/docs/build.js +1 -1
  413. data/share/views/public/plugins/semantic-ui/tasks/docs/metadata.js +6 -5
  414. data/share/views/public/plugins/semantic-ui/tasks/docs/serve.js +2 -2
  415. data/share/views/public/plugins/semantic-ui/tasks/install.js +332 -272
  416. data/share/views/public/plugins/semantic-ui/tasks/rtl/build.js +2 -2
  417. data/share/views/public/plugins/semantic-ui/tasks/rtl/watch.js +2 -2
  418. data/share/views/public/plugins/semantic-ui/tasks/watch.js +7 -4
  419. data/share/views/public/plugins/semantic-ui/test/helpers/sinon.js +11 -11
  420. data/share/views/public/plugins/semantic-ui/test/modules/module.spec.js +1 -1
  421. metadata +109 -2
@@ -1,18 +1,24 @@
1
1
  /*!
2
- * # Semantic UI 2.0.0 - Form Validation
2
+ * # Semantic UI 2.2.6 - Form Validation
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2015 Contributors
7
6
  * Released under the MIT license
8
7
  * http://opensource.org/licenses/MIT
9
8
  *
10
9
  */
11
10
 
12
- ;(function ( $, window, document, undefined ) {
11
+ ;(function ($, window, document, undefined) {
13
12
 
14
13
  "use strict";
15
14
 
15
+ window = (typeof window != 'undefined' && window.Math == Math)
16
+ ? window
17
+ : (typeof self != 'undefined' && self.Math == Math)
18
+ ? self
19
+ : Function('return this')()
20
+ ;
21
+
16
22
  $.fn.form = function(parameters) {
17
23
  var
18
24
  $allModules = $(this),
@@ -74,6 +80,9 @@ $.fn.form = function(parameters) {
74
80
  module.invoke(query);
75
81
  }
76
82
  else {
83
+ if(instance !== undefined) {
84
+ instance.invoke('destroy');
85
+ }
77
86
  module.verbose('Initializing form validation', $module, settings);
78
87
  module.bindEvents();
79
88
  module.set.defaults();
@@ -201,7 +210,7 @@ $.fn.form = function(parameters) {
201
210
  isErrored = $fieldGroup.hasClass(className.error)
202
211
  ;
203
212
  if(defaultValue === undefined) {
204
- defaultValue = '';
213
+ return;
205
214
  }
206
215
  if(isErrored) {
207
216
  module.verbose('Resetting error on field', $fieldGroup);
@@ -225,13 +234,30 @@ $.fn.form = function(parameters) {
225
234
  },
226
235
 
227
236
  is: {
237
+ bracketedRule: function(rule) {
238
+ return (rule.type && rule.type.match(settings.regExp.bracket));
239
+ },
240
+ empty: function($field) {
241
+ if(!$field || $field.length === 0) {
242
+ return true;
243
+ }
244
+ else if($field.is('input[type="checkbox"]')) {
245
+ return !$field.is(':checked');
246
+ }
247
+ else {
248
+ return module.is.blank($field);
249
+ }
250
+ },
251
+ blank: function($field) {
252
+ return $.trim($field.val()) === '';
253
+ },
228
254
  valid: function() {
229
255
  var
230
256
  allValid = true
231
257
  ;
232
258
  module.verbose('Checking if form is valid');
233
259
  $.each(validation, function(fieldName, field) {
234
- if( !( module.validate.field(field) ) ) {
260
+ if( !( module.validate.field(field, fieldName) ) ) {
235
261
  allValid = false;
236
262
  }
237
263
  });
@@ -258,9 +284,12 @@ $.fn.form = function(parameters) {
258
284
  field: {
259
285
  keydown: function(event) {
260
286
  var
261
- $field = $(this),
262
- key = event.which,
263
- keyCode = {
287
+ $field = $(this),
288
+ key = event.which,
289
+ isInput = $field.is(selector.input),
290
+ isCheckbox = $field.is(selector.checkbox),
291
+ isInDropdown = ($field.closest(selector.uiDropdown).length > 0),
292
+ keyCode = {
264
293
  enter : 13,
265
294
  escape : 27
266
295
  }
@@ -271,7 +300,7 @@ $.fn.form = function(parameters) {
271
300
  .blur()
272
301
  ;
273
302
  }
274
- if(!event.ctrlKey && key == keyCode.enter && $field.is(selector.input) && $field.not(selector.checkbox).length > 0 ) {
303
+ if(!event.ctrlKey && key == keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
275
304
  if(!keyHeldDown) {
276
305
  $field
277
306
  .one('keyup' + eventNamespace, module.event.field.keyup)
@@ -285,7 +314,7 @@ $.fn.form = function(parameters) {
285
314
  keyup: function() {
286
315
  keyHeldDown = false;
287
316
  },
288
- blur: function() {
317
+ blur: function(event) {
289
318
  var
290
319
  $field = $(this),
291
320
  $fieldGroup = $field.closest($group),
@@ -293,22 +322,27 @@ $.fn.form = function(parameters) {
293
322
  ;
294
323
  if( $fieldGroup.hasClass(className.error) ) {
295
324
  module.debug('Revalidating field', $field, validationRules);
296
- module.validate.field( validationRules );
325
+ if(validationRules) {
326
+ module.validate.field( validationRules );
327
+ }
297
328
  }
298
329
  else if(settings.on == 'blur' || settings.on == 'change') {
299
- module.validate.field( validationRules );
330
+ if(validationRules) {
331
+ module.validate.field( validationRules );
332
+ }
300
333
  }
301
334
  },
302
- change: function() {
335
+ change: function(event) {
303
336
  var
304
337
  $field = $(this),
305
- $fieldGroup = $field.closest($group)
338
+ $fieldGroup = $field.closest($group),
339
+ validationRules = module.get.validation($field)
306
340
  ;
307
341
  if(settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) ) {
308
342
  clearTimeout(module.timer);
309
343
  module.timer = setTimeout(function() {
310
344
  module.debug('Revalidating field', $field, module.get.validation($field));
311
- module.validate.field( module.get.validation($field) );
345
+ module.validate.field( validationRules );
312
346
  }, settings.delay);
313
347
  }
314
348
  }
@@ -317,6 +351,21 @@ $.fn.form = function(parameters) {
317
351
  },
318
352
 
319
353
  get: {
354
+ ancillaryValue: function(rule) {
355
+ if(!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {
356
+ return false;
357
+ }
358
+ return (rule.value !== undefined)
359
+ ? rule.value
360
+ : rule.type.match(settings.regExp.bracket)[1] + ''
361
+ ;
362
+ },
363
+ ruleName: function(rule) {
364
+ if( module.is.bracketedRule(rule) ) {
365
+ return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');
366
+ }
367
+ return rule.type;
368
+ },
320
369
  changeEvent: function(type, $input) {
321
370
  if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {
322
371
  return 'change';
@@ -333,16 +382,46 @@ $.fn.form = function(parameters) {
333
382
  : 'keyup'
334
383
  ;
335
384
  },
336
- settings: function() {
385
+ prompt: function(rule, field) {
337
386
  var
338
- firstProperty
387
+ ruleName = module.get.ruleName(rule),
388
+ ancillary = module.get.ancillaryValue(rule),
389
+ prompt = rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,
390
+ requiresValue = (prompt.search('{value}') !== -1),
391
+ requiresName = (prompt.search('{name}') !== -1),
392
+ $label,
393
+ $field,
394
+ name
339
395
  ;
396
+ if(requiresName || requiresValue) {
397
+ $field = module.get.field(field.identifier);
398
+ }
399
+ if(requiresValue) {
400
+ prompt = prompt.replace('{value}', $field.val());
401
+ }
402
+ if(requiresName) {
403
+ $label = $field.closest(selector.group).find('label').eq(0);
404
+ name = ($label.length == 1)
405
+ ? $label.text()
406
+ : $field.prop('placeholder') || settings.text.unspecifiedField
407
+ ;
408
+ prompt = prompt.replace('{name}', name);
409
+ }
410
+ prompt = prompt.replace('{identifier}', field.identifier);
411
+ prompt = prompt.replace('{ruleValue}', ancillary);
412
+ if(!rule.prompt) {
413
+ module.verbose('Using default validation prompt for type', prompt, ruleName);
414
+ }
415
+ return prompt;
416
+ },
417
+ settings: function() {
340
418
  if($.isPlainObject(parameters)) {
341
419
  var
342
- keys = Object.keys(parameters),
420
+ keys = Object.keys(parameters),
343
421
  isLegacySettings = (keys.length > 0)
344
- ? (parameters[keys[0]].identifier !== undefined)
345
- : false
422
+ ? (parameters[keys[0]].identifier !== undefined && parameters[keys[0]].rules !== undefined)
423
+ : false,
424
+ ruleKeys
346
425
  ;
347
426
  if(isLegacySettings) {
348
427
  // 1.x (ducktyped)
@@ -353,6 +432,23 @@ $.fn.form = function(parameters) {
353
432
  }
354
433
  else {
355
434
  // 2.x
435
+ if(parameters.fields) {
436
+ ruleKeys = Object.keys(parameters.fields);
437
+ if( typeof parameters.fields[ruleKeys[0]] == 'string' || $.isArray(parameters.fields[ruleKeys[0]]) ) {
438
+ $.each(parameters.fields, function(name, rules) {
439
+ if(typeof rules == 'string') {
440
+ rules = [rules];
441
+ }
442
+ parameters.fields[name] = {
443
+ rules: []
444
+ };
445
+ $.each(rules, function(index, rule) {
446
+ parameters.fields[name].rules.push({ type: rule });
447
+ });
448
+ });
449
+ }
450
+ }
451
+
356
452
  settings = $.extend(true, {}, $.fn.form.settings, parameters);
357
453
  validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
358
454
  module.verbose('Extending settings', validation, settings);
@@ -406,17 +502,20 @@ $.fn.form = function(parameters) {
406
502
  },
407
503
  validation: function($field) {
408
504
  var
409
- rules
505
+ fieldValidation,
506
+ identifier
410
507
  ;
411
508
  if(!validation) {
412
509
  return false;
413
510
  }
414
511
  $.each(validation, function(fieldName, field) {
415
- if( module.get.field(field.identifier)[0] == $field[0] ) {
416
- rules = field;
512
+ identifier = field.identifier || fieldName;
513
+ if( module.get.field(identifier)[0] == $field[0] ) {
514
+ field.identifier = identifier;
515
+ fieldValidation = field;
417
516
  }
418
517
  });
419
- return rules || false;
518
+ return fieldValidation || false;
420
519
  },
421
520
  value: function (field) {
422
521
  var
@@ -455,11 +554,10 @@ $.fn.form = function(parameters) {
455
554
  }
456
555
  if(isCheckbox) {
457
556
  if(isChecked) {
458
- values[name].push(value);
557
+ values[name].push(value || true);
459
558
  }
460
559
  else {
461
- module.debug('Omitted unchecked checkbox', $field);
462
- return true;
560
+ values[name].push(false);
463
561
  }
464
562
  }
465
563
  else {
@@ -474,11 +572,10 @@ $.fn.form = function(parameters) {
474
572
  }
475
573
  else if(isCheckbox) {
476
574
  if(isChecked) {
477
- values[name] = true;
575
+ values[name] = value || true;
478
576
  }
479
577
  else {
480
- module.debug('Omitted unchecked checkbox', $field);
481
- return true;
578
+ values[name] = false;
482
579
  }
483
580
  }
484
581
  else {
@@ -495,6 +592,9 @@ $.fn.form = function(parameters) {
495
592
 
496
593
  field: function(identifier) {
497
594
  module.verbose('Checking for existence of a field with identifier', identifier);
595
+ if(typeof identifier !== 'string') {
596
+ module.error(error.identifier, identifier);
597
+ }
498
598
  if( $field.filter('#' + identifier).length > 0 ) {
499
599
  return true;
500
600
  }
@@ -554,6 +654,7 @@ $.fn.form = function(parameters) {
554
654
  },
555
655
  errors: function(errors) {
556
656
  module.debug('Adding form error messages', errors);
657
+ module.set.error();
557
658
  $message
558
659
  .html( settings.templates.error(errors) )
559
660
  ;
@@ -561,9 +662,9 @@ $.fn.form = function(parameters) {
561
662
  },
562
663
 
563
664
  remove: {
564
- prompt: function(field) {
665
+ prompt: function(identifier) {
565
666
  var
566
- $field = module.get.field(field.identifier),
667
+ $field = module.get.field(identifier),
567
668
  $fieldGroup = $field.closest($group),
568
669
  $prompt = $fieldGroup.children(selector.prompt)
569
670
  ;
@@ -571,7 +672,7 @@ $.fn.form = function(parameters) {
571
672
  .removeClass(className.error)
572
673
  ;
573
674
  if(settings.inline && $prompt.is(':visible')) {
574
- module.verbose('Removing prompt for field', field);
675
+ module.verbose('Removing prompt for field', identifier);
575
676
  if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
576
677
  $prompt.transition(settings.transition + ' out', settings.duration, function() {
577
678
  $prompt.remove();
@@ -680,8 +781,9 @@ $.fn.form = function(parameters) {
680
781
 
681
782
  validate: {
682
783
 
683
- form: function(event) {
784
+ form: function(event, ignoreCallbacks) {
684
785
  var
786
+ values = module.get.values(),
685
787
  apiRequest
686
788
  ;
687
789
 
@@ -695,7 +797,9 @@ $.fn.form = function(parameters) {
695
797
  if( module.is.valid() ) {
696
798
  module.debug('Form has no validation errors, submitting');
697
799
  module.set.success();
698
- return settings.onSuccess.call(element, event);
800
+ if(ignoreCallbacks !== true) {
801
+ return settings.onSuccess.call(element, event, values);
802
+ }
699
803
  }
700
804
  else {
701
805
  module.debug('Form has errors');
@@ -707,41 +811,55 @@ $.fn.form = function(parameters) {
707
811
  if($module.data('moduleApi') !== undefined) {
708
812
  event.stopImmediatePropagation();
709
813
  }
710
- return settings.onFailure.call(element, formErrors);
814
+ if(ignoreCallbacks !== true) {
815
+ return settings.onFailure.call(element, formErrors, values);
816
+ }
711
817
  }
712
818
  },
713
819
 
714
820
  // takes a validation object and returns whether field passes validation
715
- field: function(field) {
821
+ field: function(field, fieldName) {
716
822
  var
717
- $field = module.get.field(field.identifier),
823
+ identifier = field.identifier || fieldName,
824
+ $field = module.get.field(identifier),
825
+ $dependsField = (field.depends)
826
+ ? module.get.field(field.depends)
827
+ : false,
718
828
  fieldValid = true,
719
829
  fieldErrors = []
720
830
  ;
831
+ if(!field.identifier) {
832
+ module.debug('Using field name as identifier', identifier);
833
+ field.identifier = identifier;
834
+ }
721
835
  if($field.prop('disabled')) {
722
- module.debug('Field is disabled. Skipping', field.identifier);
836
+ module.debug('Field is disabled. Skipping', identifier);
723
837
  fieldValid = true;
724
838
  }
725
- else if(field.optional && $.trim($field.val()) === ''){
726
- module.debug('Field is optional and empty. Skipping', field.identifier);
839
+ else if(field.optional && module.is.blank($field)){
840
+ module.debug('Field is optional and blank. Skipping', identifier);
841
+ fieldValid = true;
842
+ }
843
+ else if(field.depends && module.is.empty($dependsField)) {
844
+ module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);
727
845
  fieldValid = true;
728
846
  }
729
847
  else if(field.rules !== undefined) {
730
848
  $.each(field.rules, function(index, rule) {
731
- if( module.has.field(field.identifier) && !( module.validate.rule(field, rule) ) ) {
732
- module.debug('Field is invalid', field.identifier, rule.type);
733
- fieldErrors.push(rule.prompt);
849
+ if( module.has.field(identifier) && !( module.validate.rule(field, rule) ) ) {
850
+ module.debug('Field is invalid', identifier, rule.type);
851
+ fieldErrors.push(module.get.prompt(rule, field));
734
852
  fieldValid = false;
735
853
  }
736
854
  });
737
855
  }
738
856
  if(fieldValid) {
739
- module.remove.prompt(field, fieldErrors);
857
+ module.remove.prompt(identifier, fieldErrors);
740
858
  settings.onValid.call($field);
741
859
  }
742
860
  else {
743
861
  formErrors = formErrors.concat(fieldErrors);
744
- module.add.prompt(field.identifier, fieldErrors);
862
+ module.add.prompt(identifier, fieldErrors);
745
863
  settings.onInvalid.call($field, fieldErrors);
746
864
  return false;
747
865
  }
@@ -749,40 +867,26 @@ $.fn.form = function(parameters) {
749
867
  },
750
868
 
751
869
  // takes validation rule and returns whether field passes rule
752
- rule: function(field, validation) {
870
+ rule: function(field, rule) {
753
871
  var
754
- $field = module.get.field(field.identifier),
755
- type = validation.type,
756
- value = $field.val(),
757
- bracket = type.match(settings.regExp.bracket),
758
- isValid = true,
759
- rule,
760
- ancillary,
761
- functionType
872
+ $field = module.get.field(field.identifier),
873
+ type = rule.type,
874
+ value = $field.val(),
875
+ isValid = true,
876
+ ancillary = module.get.ancillaryValue(rule),
877
+ ruleName = module.get.ruleName(rule),
878
+ ruleFunction = settings.rules[ruleName]
762
879
  ;
763
- // cast to string
764
- value = $.trim($field.val() + '');
765
-
766
- // if bracket notation is used, pass in extra parameters
767
- if(bracket) {
768
- ancillary = '' + bracket[1];
769
- functionType = type.replace(bracket[0], '');
770
- rule = settings.rules[functionType];
771
- if( !$.isFunction(rule) ) {
772
- module.error(error.noRule, functionType);
773
- return;
774
- }
775
- isValid = rule.call($field, value, ancillary);
776
- }
777
- else {
778
- rule = settings.rules[type];
779
- if( !$.isFunction(rule) ) {
780
- module.error(error.noRule, type);
781
- return;
782
- }
783
- isValid = rule.call($field, value);
880
+ if( !$.isFunction(ruleFunction) ) {
881
+ module.error(error.noRule, ruleName);
882
+ return;
784
883
  }
785
- return isValid;
884
+ // cast to string avoiding encoding special values
885
+ value = (value === undefined || value === '' || value === null)
886
+ ? ''
887
+ : $.trim(value + '')
888
+ ;
889
+ return ruleFunction.call($field, value, ancillary);
786
890
  }
787
891
  },
788
892
 
@@ -809,7 +913,7 @@ $.fn.form = function(parameters) {
809
913
  }
810
914
  },
811
915
  debug: function() {
812
- if(settings.debug) {
916
+ if(!settings.silent && settings.debug) {
813
917
  if(settings.performance) {
814
918
  module.performance.log(arguments);
815
919
  }
@@ -820,7 +924,7 @@ $.fn.form = function(parameters) {
820
924
  }
821
925
  },
822
926
  verbose: function() {
823
- if(settings.verbose && settings.debug) {
927
+ if(!settings.silent && settings.verbose && settings.debug) {
824
928
  if(settings.performance) {
825
929
  module.performance.log(arguments);
826
930
  }
@@ -831,8 +935,10 @@ $.fn.form = function(parameters) {
831
935
  }
832
936
  },
833
937
  error: function() {
834
- module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
835
- module.error.apply(console, arguments);
938
+ if(!settings.silent) {
939
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
940
+ module.error.apply(console, arguments);
941
+ }
836
942
  },
837
943
  performance: {
838
944
  log: function(message) {
@@ -985,11 +1091,47 @@ $.fn.form.settings = {
985
1091
 
986
1092
  regExp: {
987
1093
  bracket : /\[(.*)\]/i,
1094
+ decimal : /^\d*(\.)\d+/,
1095
+ email : /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
988
1096
  escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
989
- email : "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
990
- integer : /^\-?\d+$/,
991
1097
  flags : /^\/(.*)\/(.*)?/,
992
- url : /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i
1098
+ integer : /^\-?\d+$/,
1099
+ number : /^\-?\d*(\.\d+)?$/,
1100
+ url : /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/i
1101
+ },
1102
+
1103
+ text: {
1104
+ unspecifiedRule : 'Please enter a valid value',
1105
+ unspecifiedField : 'This field'
1106
+ },
1107
+
1108
+ prompt: {
1109
+ empty : '{name} must have a value',
1110
+ checked : '{name} must be checked',
1111
+ email : '{name} must be a valid e-mail',
1112
+ url : '{name} must be a valid url',
1113
+ regExp : '{name} is not formatted correctly',
1114
+ integer : '{name} must be an integer',
1115
+ decimal : '{name} must be a decimal number',
1116
+ number : '{name} must be set to a number',
1117
+ is : '{name} must be "{ruleValue}"',
1118
+ isExactly : '{name} must be exactly "{ruleValue}"',
1119
+ not : '{name} cannot be set to "{ruleValue}"',
1120
+ notExactly : '{name} cannot be set to exactly "{ruleValue}"',
1121
+ contain : '{name} cannot contain "{ruleValue}"',
1122
+ containExactly : '{name} cannot contain exactly "{ruleValue}"',
1123
+ doesntContain : '{name} must contain "{ruleValue}"',
1124
+ doesntContainExactly : '{name} must contain exactly "{ruleValue}"',
1125
+ minLength : '{name} must be at least {ruleValue} characters',
1126
+ length : '{name} must be at least {ruleValue} characters',
1127
+ exactLength : '{name} must be exactly {ruleValue} characters',
1128
+ maxLength : '{name} cannot be longer than {ruleValue} characters',
1129
+ match : '{name} must match {ruleValue} field',
1130
+ different : '{name} must have a different value than {ruleValue} field',
1131
+ creditCard : '{name} must be a valid credit card number',
1132
+ minCount : '{name} must have at least {ruleValue} choices',
1133
+ exactCount : '{name} must have exactly {ruleValue} choices',
1134
+ maxCount : '{name} must have {ruleValue} or less choices'
993
1135
  },
994
1136
 
995
1137
  selector : {
@@ -1015,9 +1157,10 @@ $.fn.form.settings = {
1015
1157
  },
1016
1158
 
1017
1159
  error: {
1018
- oldSyntax : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.',
1019
- noRule : 'There is no rule matching the one you specified',
1020
- method : 'The method you called is not defined.'
1160
+ identifier : 'You must specify a string identifier for each field',
1161
+ method : 'The method you called is not defined.',
1162
+ noRule : 'There is no rule matching the one you specified',
1163
+ oldSyntax : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.'
1021
1164
  },
1022
1165
 
1023
1166
  templates: {
@@ -1037,7 +1180,7 @@ $.fn.form.settings = {
1037
1180
  // template that produces label
1038
1181
  prompt: function(errors) {
1039
1182
  return $('<div/>')
1040
- .addClass('ui red pointing prompt label')
1183
+ .addClass('ui basic red pointing prompt label')
1041
1184
  .html(errors[0])
1042
1185
  ;
1043
1186
  }
@@ -1045,39 +1188,50 @@ $.fn.form.settings = {
1045
1188
 
1046
1189
  rules: {
1047
1190
 
1191
+ // is not empty or blank string
1192
+ empty: function(value) {
1193
+ return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);
1194
+ },
1195
+
1048
1196
  // checkbox checked
1049
1197
  checked: function() {
1050
1198
  return ($(this).filter(':checked').length > 0);
1051
1199
  },
1052
1200
 
1053
- // value contains text (insensitive)
1054
- contains: function(value, text) {
1055
- // escape regex characters
1056
- text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1057
- return (value.search( new RegExp(text, 'i') ) !== -1);
1201
+ // is most likely an email
1202
+ email: function(value){
1203
+ return $.fn.form.settings.regExp.email.test(value);
1058
1204
  },
1059
1205
 
1060
- // value contains text (case sensitive)
1061
- containsExactly: function(value, text) {
1062
- // escape regex characters
1063
- text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1064
- return (value.search( new RegExp(text) ) !== -1);
1206
+ // value is most likely url
1207
+ url: function(value) {
1208
+ return $.fn.form.settings.regExp.url.test(value);
1065
1209
  },
1066
1210
 
1067
- // is most likely an email
1068
- email: function(value){
1211
+ // matches specified regExp
1212
+ regExp: function(value, regExp) {
1213
+ if(regExp instanceof RegExp) {
1214
+ return value.match(regExp);
1215
+ }
1069
1216
  var
1070
- emailRegExp = new RegExp($.fn.form.settings.regExp.email, 'i')
1217
+ regExpParts = regExp.match($.fn.form.settings.regExp.flags),
1218
+ flags
1071
1219
  ;
1072
- return emailRegExp.test(value);
1073
- },
1074
-
1075
- // is not empty or blank string
1076
- empty: function(value) {
1077
- return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);
1220
+ // regular expression specified as /baz/gi (flags)
1221
+ if(regExpParts) {
1222
+ regExp = (regExpParts.length >= 2)
1223
+ ? regExpParts[1]
1224
+ : regExp
1225
+ ;
1226
+ flags = (regExpParts.length >= 3)
1227
+ ? regExpParts[2]
1228
+ : ''
1229
+ ;
1230
+ }
1231
+ return value.match( new RegExp(regExp, flags) );
1078
1232
  },
1079
1233
 
1080
- // is valid integer
1234
+ // is valid integer or matches range
1081
1235
  integer: function(value, range) {
1082
1236
  var
1083
1237
  intRegExp = $.fn.form.settings.regExp.integer,
@@ -1085,7 +1239,7 @@ $.fn.form.settings = {
1085
1239
  max,
1086
1240
  parts
1087
1241
  ;
1088
- if(range === undefined || range === '' || range === '..') {
1242
+ if( !range || ['', '..'].indexOf(range) !== -1) {
1089
1243
  // do nothing
1090
1244
  }
1091
1245
  else if(range.indexOf('..') == -1) {
@@ -1109,6 +1263,16 @@ $.fn.form.settings = {
1109
1263
  );
1110
1264
  },
1111
1265
 
1266
+ // is valid number (with decimal)
1267
+ decimal: function(value) {
1268
+ return $.fn.form.settings.regExp.decimal.test(value);
1269
+ },
1270
+
1271
+ // is valid number
1272
+ number: function(value) {
1273
+ return $.fn.form.settings.regExp.number.test(value);
1274
+ },
1275
+
1112
1276
  // is value (case insensitive)
1113
1277
  is: function(value, text) {
1114
1278
  text = (typeof text == 'string')
@@ -1127,7 +1291,61 @@ $.fn.form.settings = {
1127
1291
  return (value == text);
1128
1292
  },
1129
1293
 
1294
+ // value is not another value (case insensitive)
1295
+ not: function(value, notValue) {
1296
+ value = (typeof value == 'string')
1297
+ ? value.toLowerCase()
1298
+ : value
1299
+ ;
1300
+ notValue = (typeof notValue == 'string')
1301
+ ? notValue.toLowerCase()
1302
+ : notValue
1303
+ ;
1304
+ return (value != notValue);
1305
+ },
1306
+
1307
+ // value is not another value (case sensitive)
1308
+ notExactly: function(value, notValue) {
1309
+ return (value != notValue);
1310
+ },
1311
+
1312
+ // value contains text (insensitive)
1313
+ contains: function(value, text) {
1314
+ // escape regex characters
1315
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1316
+ return (value.search( new RegExp(text, 'i') ) !== -1);
1317
+ },
1318
+
1319
+ // value contains text (case sensitive)
1320
+ containsExactly: function(value, text) {
1321
+ // escape regex characters
1322
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1323
+ return (value.search( new RegExp(text) ) !== -1);
1324
+ },
1325
+
1326
+ // value contains text (insensitive)
1327
+ doesntContain: function(value, text) {
1328
+ // escape regex characters
1329
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1330
+ return (value.search( new RegExp(text, 'i') ) === -1);
1331
+ },
1332
+
1333
+ // value contains text (case sensitive)
1334
+ doesntContainExactly: function(value, text) {
1335
+ // escape regex characters
1336
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
1337
+ return (value.search( new RegExp(text) ) === -1);
1338
+ },
1339
+
1130
1340
  // is at least string length
1341
+ minLength: function(value, requiredLength) {
1342
+ return (value !== undefined)
1343
+ ? (value.length >= requiredLength)
1344
+ : false
1345
+ ;
1346
+ },
1347
+
1348
+ // see rls notes for 2.0.6 (this is a duplicate of minLength)
1131
1349
  length: function(value, requiredLength) {
1132
1350
  return (value !== undefined)
1133
1351
  ? (value.length >= requiredLength)
@@ -1135,9 +1353,24 @@ $.fn.form.settings = {
1135
1353
  ;
1136
1354
  },
1137
1355
 
1356
+ // is exactly length
1357
+ exactLength: function(value, requiredLength) {
1358
+ return (value !== undefined)
1359
+ ? (value.length == requiredLength)
1360
+ : false
1361
+ ;
1362
+ },
1363
+
1364
+ // is less than length
1365
+ maxLength: function(value, maxLength) {
1366
+ return (value !== undefined)
1367
+ ? (value.length <= maxLength)
1368
+ : false
1369
+ ;
1370
+ },
1371
+
1138
1372
  // matches another field
1139
- different: function(value, identifier) {
1140
- // use either id or name of field
1373
+ match: function(value, identifier) {
1141
1374
  var
1142
1375
  $form = $(this),
1143
1376
  matchingValue
@@ -1155,13 +1388,13 @@ $.fn.form.settings = {
1155
1388
  matchingValue = $('[name="' + identifier +'[]"]');
1156
1389
  }
1157
1390
  return (matchingValue !== undefined)
1158
- ? ( value.toString() !== matchingValue.toString() )
1391
+ ? ( value.toString() == matchingValue.toString() )
1159
1392
  : false
1160
1393
  ;
1161
1394
  },
1162
1395
 
1163
- // matches another field
1164
- match: function(value, identifier) {
1396
+ // different than another field
1397
+ different: function(value, identifier) {
1165
1398
  // use either id or name of field
1166
1399
  var
1167
1400
  $form = $(this),
@@ -1180,77 +1413,146 @@ $.fn.form.settings = {
1180
1413
  matchingValue = $('[name="' + identifier +'[]"]');
1181
1414
  }
1182
1415
  return (matchingValue !== undefined)
1183
- ? ( value.toString() == matchingValue.toString() )
1416
+ ? ( value.toString() !== matchingValue.toString() )
1184
1417
  : false
1185
1418
  ;
1186
1419
  },
1187
1420
 
1188
- maxCount: function(value, count) {
1189
- value = value.split(',');
1190
- return ($.isArray(value) && value.length <= count);
1191
- },
1421
+ creditCard: function(cardNumber, cardTypes) {
1422
+ var
1423
+ cards = {
1424
+ visa: {
1425
+ pattern : /^4/,
1426
+ length : [16]
1427
+ },
1428
+ amex: {
1429
+ pattern : /^3[47]/,
1430
+ length : [15]
1431
+ },
1432
+ mastercard: {
1433
+ pattern : /^5[1-5]/,
1434
+ length : [16]
1435
+ },
1436
+ discover: {
1437
+ pattern : /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,
1438
+ length : [16]
1439
+ },
1440
+ unionPay: {
1441
+ pattern : /^(62|88)/,
1442
+ length : [16, 17, 18, 19]
1443
+ },
1444
+ jcb: {
1445
+ pattern : /^35(2[89]|[3-8][0-9])/,
1446
+ length : [16]
1447
+ },
1448
+ maestro: {
1449
+ pattern : /^(5018|5020|5038|6304|6759|676[1-3])/,
1450
+ length : [12, 13, 14, 15, 16, 17, 18, 19]
1451
+ },
1452
+ dinersClub: {
1453
+ pattern : /^(30[0-5]|^36)/,
1454
+ length : [14]
1455
+ },
1456
+ laser: {
1457
+ pattern : /^(6304|670[69]|6771)/,
1458
+ length : [16, 17, 18, 19]
1459
+ },
1460
+ visaElectron: {
1461
+ pattern : /^(4026|417500|4508|4844|491(3|7))/,
1462
+ length : [16]
1463
+ }
1464
+ },
1465
+ valid = {},
1466
+ validCard = false,
1467
+ requiredTypes = (typeof cardTypes == 'string')
1468
+ ? cardTypes.split(',')
1469
+ : false,
1470
+ unionPay,
1471
+ validation
1472
+ ;
1192
1473
 
1193
- exactCount: function(value, count) {
1194
- value = value.split(',');
1195
- return ($.isArray(value) && value.length == count);
1196
- },
1474
+ if(typeof cardNumber !== 'string' || cardNumber.length === 0) {
1475
+ return;
1476
+ }
1197
1477
 
1198
- minCount: function(value, count) {
1199
- value = value.split(',');
1200
- return ($.isArray(value) && value.length >= count);
1201
- },
1478
+ // verify card types
1479
+ if(requiredTypes) {
1480
+ $.each(requiredTypes, function(index, type){
1481
+ // verify each card type
1482
+ validation = cards[type];
1483
+ if(validation) {
1484
+ valid = {
1485
+ length : ($.inArray(cardNumber.length, validation.length) !== -1),
1486
+ pattern : (cardNumber.search(validation.pattern) !== -1)
1487
+ };
1488
+ if(valid.length && valid.pattern) {
1489
+ validCard = true;
1490
+ }
1491
+ }
1492
+ });
1202
1493
 
1203
- regExp: function(value, regExp) {
1204
- var
1205
- regExpParts = regExp.match($.fn.form.settings.regExp.flags),
1206
- flags
1207
- ;
1208
- // regular expression specified as /baz/gi (flags)
1209
- if(regExpParts) {
1210
- regExp = (regExpParts.length >= 2)
1211
- ? regExpParts[1]
1212
- : regExp
1213
- ;
1214
- flags = (regExpParts.length >= 3)
1215
- ? regExpParts[2]
1216
- : ''
1217
- ;
1494
+ if(!validCard) {
1495
+ return false;
1496
+ }
1218
1497
  }
1219
- return value.match( new RegExp(regExp, flags) );
1220
- },
1221
1498
 
1222
- // string length is less than max length
1223
- maxLength: function(value, maxLength) {
1224
- return (value !== undefined)
1225
- ? (value.length <= maxLength)
1226
- : false
1499
+ // skip luhn for UnionPay
1500
+ unionPay = {
1501
+ number : ($.inArray(cardNumber.length, cards.unionPay.length) !== -1),
1502
+ pattern : (cardNumber.search(cards.unionPay.pattern) !== -1)
1503
+ };
1504
+ if(unionPay.number && unionPay.pattern) {
1505
+ return true;
1506
+ }
1507
+
1508
+ // verify luhn, adapted from <https://gist.github.com/2134376>
1509
+ var
1510
+ length = cardNumber.length,
1511
+ multiple = 0,
1512
+ producedValue = [
1513
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
1514
+ [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
1515
+ ],
1516
+ sum = 0
1227
1517
  ;
1518
+ while (length--) {
1519
+ sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];
1520
+ multiple ^= 1;
1521
+ }
1522
+ return (sum % 10 === 0 && sum > 0);
1228
1523
  },
1229
1524
 
1230
- // value is not value (case insensitive)
1231
- not: function(value, notValue) {
1232
- value = (typeof value == 'string')
1233
- ? value.toLowerCase()
1234
- : value
1235
- ;
1236
- notValue = (typeof notValue == 'string')
1237
- ? notValue.toLowerCase()
1238
- : notValue
1239
- ;
1240
- return (value != notValue);
1525
+ minCount: function(value, minCount) {
1526
+ if(minCount == 0) {
1527
+ return true;
1528
+ }
1529
+ if(minCount == 1) {
1530
+ return (value !== '');
1531
+ }
1532
+ return (value.split(',').length >= minCount);
1241
1533
  },
1242
1534
 
1243
- // value is not value (case sensitive)
1244
- notExactly: function(value, notValue) {
1245
- return (value != notValue);
1535
+ exactCount: function(value, exactCount) {
1536
+ if(exactCount == 0) {
1537
+ return (value === '');
1538
+ }
1539
+ if(exactCount == 1) {
1540
+ return (value !== '' && value.search(',') === -1);
1541
+ }
1542
+ return (value.split(',').length == exactCount);
1246
1543
  },
1247
1544
 
1248
- // value is most likely url
1249
- url: function(value) {
1250
- return $.fn.form.settings.regExp.url.match(value);
1545
+ maxCount: function(value, maxCount) {
1546
+ if(maxCount == 0) {
1547
+ return false;
1548
+ }
1549
+ if(maxCount == 1) {
1550
+ return (value.search(',') === -1);
1551
+ }
1552
+ return (value.split(',').length <= maxCount);
1251
1553
  }
1252
1554
  }
1253
1555
 
1254
1556
  };
1255
1557
 
1256
- })( jQuery, window , document );
1558
+ })( jQuery, window, document );