less-rails-semantic_ui 1.12.3.0 → 2.0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/assets/javascripts/semantic_ui/definitions/behaviors/api.js +394 -188
  3. data/assets/javascripts/semantic_ui/definitions/behaviors/colorize.js +4 -2
  4. data/assets/javascripts/semantic_ui/definitions/behaviors/form.js +263 -125
  5. data/assets/javascripts/semantic_ui/definitions/behaviors/state.js +3 -3
  6. data/assets/javascripts/semantic_ui/definitions/behaviors/visibility.js +213 -96
  7. data/assets/javascripts/semantic_ui/definitions/behaviors/visit.js +6 -4
  8. data/assets/javascripts/semantic_ui/definitions/globals/site.js +4 -4
  9. data/assets/javascripts/semantic_ui/definitions/modules/accordion.js +66 -52
  10. data/assets/javascripts/semantic_ui/definitions/modules/checkbox.js +309 -112
  11. data/assets/javascripts/semantic_ui/definitions/modules/dimmer.js +24 -26
  12. data/assets/javascripts/semantic_ui/definitions/modules/dropdown.js +2005 -590
  13. data/assets/javascripts/semantic_ui/definitions/modules/embed.js +662 -0
  14. data/assets/javascripts/semantic_ui/definitions/modules/modal.js +106 -79
  15. data/assets/javascripts/semantic_ui/definitions/modules/nag.js +7 -8
  16. data/assets/javascripts/semantic_ui/definitions/modules/popup.js +323 -194
  17. data/assets/javascripts/semantic_ui/definitions/modules/progress.js +111 -103
  18. data/assets/javascripts/semantic_ui/definitions/modules/rating.js +78 -54
  19. data/assets/javascripts/semantic_ui/definitions/modules/search.js +304 -122
  20. data/assets/javascripts/semantic_ui/definitions/modules/shape.js +93 -47
  21. data/assets/javascripts/semantic_ui/definitions/modules/sidebar.js +83 -149
  22. data/assets/javascripts/semantic_ui/definitions/modules/sticky.js +99 -29
  23. data/assets/javascripts/semantic_ui/definitions/modules/tab.js +219 -124
  24. data/assets/javascripts/semantic_ui/definitions/modules/transition.js +202 -171
  25. data/assets/stylesheets/semantic_ui/definitions/collections/breadcrumb.less +2 -1
  26. data/assets/stylesheets/semantic_ui/definitions/collections/form.less +135 -58
  27. data/assets/stylesheets/semantic_ui/definitions/collections/grid.less +366 -383
  28. data/assets/stylesheets/semantic_ui/definitions/collections/menu.less +838 -631
  29. data/assets/stylesheets/semantic_ui/definitions/collections/message.less +89 -71
  30. data/assets/stylesheets/semantic_ui/definitions/collections/table.less +183 -131
  31. data/assets/stylesheets/semantic_ui/definitions/elements/button.less +1097 -300
  32. data/assets/stylesheets/semantic_ui/definitions/elements/container.less +135 -0
  33. data/assets/stylesheets/semantic_ui/definitions/elements/divider.less +31 -30
  34. data/assets/stylesheets/semantic_ui/definitions/elements/flag.less +1 -1
  35. data/assets/stylesheets/semantic_ui/definitions/elements/header.less +209 -121
  36. data/assets/stylesheets/semantic_ui/definitions/elements/icon.less +201 -96
  37. data/assets/stylesheets/semantic_ui/definitions/elements/image.less +26 -11
  38. data/assets/stylesheets/semantic_ui/definitions/elements/input.less +49 -14
  39. data/assets/stylesheets/semantic_ui/definitions/elements/label.less +391 -221
  40. data/assets/stylesheets/semantic_ui/definitions/elements/list.less +107 -68
  41. data/assets/stylesheets/semantic_ui/definitions/elements/loader.less +3 -1
  42. data/assets/stylesheets/semantic_ui/definitions/elements/rail.less +34 -25
  43. data/assets/stylesheets/semantic_ui/definitions/elements/reveal.less +25 -10
  44. data/assets/stylesheets/semantic_ui/definitions/elements/segment.less +261 -173
  45. data/assets/stylesheets/semantic_ui/definitions/elements/step.less +169 -70
  46. data/assets/stylesheets/semantic_ui/definitions/globals/reset.less +1 -1
  47. data/assets/stylesheets/semantic_ui/definitions/globals/site.less +3 -1
  48. data/assets/stylesheets/semantic_ui/definitions/modules/accordion.less +1 -2
  49. data/assets/stylesheets/semantic_ui/definitions/modules/checkbox.less +175 -103
  50. data/assets/stylesheets/semantic_ui/definitions/modules/dimmer.less +26 -15
  51. data/assets/stylesheets/semantic_ui/definitions/modules/dropdown.less +349 -80
  52. data/assets/stylesheets/semantic_ui/definitions/modules/embed.less +174 -0
  53. data/assets/stylesheets/semantic_ui/definitions/modules/modal.less +83 -36
  54. data/assets/stylesheets/semantic_ui/definitions/modules/nag.less +1 -1
  55. data/assets/stylesheets/semantic_ui/definitions/modules/popup.less +48 -7
  56. data/assets/stylesheets/semantic_ui/definitions/modules/progress.less +160 -107
  57. data/assets/stylesheets/semantic_ui/definitions/modules/rating.less +57 -54
  58. data/assets/stylesheets/semantic_ui/definitions/modules/search.less +55 -10
  59. data/assets/stylesheets/semantic_ui/definitions/modules/shape.less +5 -6
  60. data/assets/stylesheets/semantic_ui/definitions/modules/sidebar.less +9 -5
  61. data/assets/stylesheets/semantic_ui/definitions/modules/sticky.less +1 -1
  62. data/assets/stylesheets/semantic_ui/definitions/modules/tab.less +1 -1
  63. data/assets/stylesheets/semantic_ui/definitions/modules/transition.less +3 -4
  64. data/assets/stylesheets/semantic_ui/definitions/views/card.less +240 -130
  65. data/assets/stylesheets/semantic_ui/definitions/views/comment.less +1 -1
  66. data/assets/stylesheets/semantic_ui/definitions/views/feed.less +15 -8
  67. data/assets/stylesheets/semantic_ui/definitions/views/item.less +13 -13
  68. data/assets/stylesheets/semantic_ui/definitions/views/statistic.less +230 -86
  69. data/assets/stylesheets/semantic_ui/theme.less +22 -15
  70. data/assets/stylesheets/semantic_ui/themes/amazon/elements/button.overrides +5 -5
  71. data/assets/stylesheets/semantic_ui/themes/amazon/elements/button.variables +5 -4
  72. data/assets/stylesheets/semantic_ui/themes/basic/collections/table.variables +1 -0
  73. data/assets/stylesheets/semantic_ui/themes/basic/views/card.variables +6 -4
  74. data/assets/stylesheets/semantic_ui/themes/bookish/elements/header.variables +4 -4
  75. data/assets/stylesheets/semantic_ui/themes/bootstrap3/elements/button.variables +1 -1
  76. data/assets/stylesheets/semantic_ui/themes/chubby/collections/form.overrides +8 -0
  77. data/assets/stylesheets/semantic_ui/themes/chubby/collections/menu.overrides +0 -0
  78. data/assets/stylesheets/semantic_ui/themes/chubby/collections/menu.variables +40 -0
  79. data/assets/stylesheets/semantic_ui/themes/classic/modules/progress.variables +1 -0
  80. data/assets/stylesheets/semantic_ui/themes/classic/views/card.overrides +1 -1
  81. data/assets/stylesheets/semantic_ui/themes/colored/modules/checkbox.overrides +0 -0
  82. data/assets/stylesheets/semantic_ui/themes/colored/modules/checkbox.variables +17 -0
  83. data/assets/stylesheets/semantic_ui/themes/default/collections/breadcrumb.overrides +0 -0
  84. data/assets/stylesheets/semantic_ui/themes/default/collections/breadcrumb.variables +5 -15
  85. data/assets/stylesheets/semantic_ui/themes/default/collections/form.overrides +0 -0
  86. data/assets/stylesheets/semantic_ui/themes/default/collections/form.variables +31 -35
  87. data/assets/stylesheets/semantic_ui/themes/default/collections/grid.overrides +0 -0
  88. data/assets/stylesheets/semantic_ui/themes/default/collections/grid.variables +34 -28
  89. data/assets/stylesheets/semantic_ui/themes/default/collections/menu.overrides +0 -0
  90. data/assets/stylesheets/semantic_ui/themes/default/collections/menu.variables +259 -163
  91. data/assets/stylesheets/semantic_ui/themes/default/collections/message.overrides +0 -0
  92. data/assets/stylesheets/semantic_ui/themes/default/collections/message.variables +42 -19
  93. data/assets/stylesheets/semantic_ui/themes/default/collections/table.overrides +0 -3
  94. data/assets/stylesheets/semantic_ui/themes/default/collections/table.variables +63 -59
  95. data/assets/stylesheets/semantic_ui/themes/default/elements/button.overrides +0 -0
  96. data/assets/stylesheets/semantic_ui/themes/default/elements/button.variables +90 -50
  97. data/assets/stylesheets/semantic_ui/themes/default/elements/container.overrides +3 -0
  98. data/assets/stylesheets/semantic_ui/themes/default/elements/container.variables +45 -0
  99. data/assets/stylesheets/semantic_ui/themes/default/elements/divider.overrides +15 -0
  100. data/assets/stylesheets/semantic_ui/themes/default/elements/divider.variables +3 -4
  101. data/assets/stylesheets/semantic_ui/themes/default/elements/flag.overrides +0 -0
  102. data/assets/stylesheets/semantic_ui/themes/default/elements/header.overrides +0 -0
  103. data/assets/stylesheets/semantic_ui/themes/default/elements/header.variables +40 -36
  104. data/assets/stylesheets/semantic_ui/themes/default/elements/icon.overrides +4 -3
  105. data/assets/stylesheets/semantic_ui/themes/default/elements/icon.variables +29 -12
  106. data/assets/stylesheets/semantic_ui/themes/default/elements/image.overrides +0 -0
  107. data/assets/stylesheets/semantic_ui/themes/default/elements/image.variables +5 -3
  108. data/assets/stylesheets/semantic_ui/themes/default/elements/input.overrides +0 -0
  109. data/assets/stylesheets/semantic_ui/themes/default/elements/input.variables +10 -24
  110. data/assets/stylesheets/semantic_ui/themes/default/elements/label.overrides +0 -0
  111. data/assets/stylesheets/semantic_ui/themes/default/elements/label.variables +88 -35
  112. data/assets/stylesheets/semantic_ui/themes/default/elements/list.overrides +0 -0
  113. data/assets/stylesheets/semantic_ui/themes/default/elements/list.variables +53 -34
  114. data/assets/stylesheets/semantic_ui/themes/default/elements/loader.overrides +0 -0
  115. data/assets/stylesheets/semantic_ui/themes/default/elements/loader.variables +9 -10
  116. data/assets/stylesheets/semantic_ui/themes/default/elements/rail.overrides +0 -0
  117. data/assets/stylesheets/semantic_ui/themes/default/elements/rail.variables +13 -5
  118. data/assets/stylesheets/semantic_ui/themes/default/elements/reveal.overrides +0 -0
  119. data/assets/stylesheets/semantic_ui/themes/default/elements/reveal.variables +6 -4
  120. data/assets/stylesheets/semantic_ui/themes/default/elements/segment.overrides +0 -0
  121. data/assets/stylesheets/semantic_ui/themes/default/elements/segment.variables +66 -28
  122. data/assets/stylesheets/semantic_ui/themes/default/elements/step.overrides +0 -0
  123. data/assets/stylesheets/semantic_ui/themes/default/elements/step.variables +60 -31
  124. data/assets/stylesheets/semantic_ui/themes/default/globals/reset.overrides +0 -0
  125. data/assets/stylesheets/semantic_ui/themes/default/globals/site.variables +477 -303
  126. data/assets/stylesheets/semantic_ui/themes/default/modules/accordion.overrides +0 -0
  127. data/assets/stylesheets/semantic_ui/themes/default/modules/accordion.variables +6 -7
  128. data/assets/stylesheets/semantic_ui/themes/default/modules/chatroom.overrides +0 -0
  129. data/assets/stylesheets/semantic_ui/themes/default/modules/checkbox.overrides +19 -16
  130. data/assets/stylesheets/semantic_ui/themes/default/modules/checkbox.variables +71 -43
  131. data/assets/stylesheets/semantic_ui/themes/default/modules/dimmer.overrides +0 -0
  132. data/assets/stylesheets/semantic_ui/themes/default/modules/dimmer.variables +12 -9
  133. data/assets/stylesheets/semantic_ui/themes/default/modules/dropdown.overrides +0 -5
  134. data/assets/stylesheets/semantic_ui/themes/default/modules/dropdown.variables +146 -64
  135. data/assets/stylesheets/semantic_ui/themes/default/modules/{video.overrides → embed.overrides} +0 -0
  136. data/assets/stylesheets/semantic_ui/themes/default/modules/embed.variables +53 -0
  137. data/assets/stylesheets/semantic_ui/themes/default/modules/modal.overrides +0 -0
  138. data/assets/stylesheets/semantic_ui/themes/default/modules/modal.variables +24 -18
  139. data/assets/stylesheets/semantic_ui/themes/default/modules/nag.overrides +0 -0
  140. data/assets/stylesheets/semantic_ui/themes/default/modules/popup.overrides +0 -0
  141. data/assets/stylesheets/semantic_ui/themes/default/modules/popup.variables +3 -9
  142. data/assets/stylesheets/semantic_ui/themes/default/modules/progress.variables +13 -7
  143. data/assets/stylesheets/semantic_ui/themes/default/modules/rating.overrides +0 -0
  144. data/assets/stylesheets/semantic_ui/themes/default/modules/rating.variables +71 -33
  145. data/assets/stylesheets/semantic_ui/themes/default/modules/search.overrides +0 -0
  146. data/assets/stylesheets/semantic_ui/themes/default/modules/search.variables +36 -34
  147. data/assets/stylesheets/semantic_ui/themes/default/modules/shape.overrides +0 -0
  148. data/assets/stylesheets/semantic_ui/themes/default/modules/shape.variables +7 -2
  149. data/assets/stylesheets/semantic_ui/themes/default/modules/sidebar.overrides +0 -0
  150. data/assets/stylesheets/semantic_ui/themes/default/modules/sidebar.variables +2 -5
  151. data/assets/stylesheets/semantic_ui/themes/default/modules/sticky.overrides +0 -0
  152. data/assets/stylesheets/semantic_ui/themes/default/modules/sticky.variables +2 -7
  153. data/assets/stylesheets/semantic_ui/themes/default/modules/tab.variables +1 -3
  154. data/assets/stylesheets/semantic_ui/themes/default/modules/transition.overrides +8 -9
  155. data/assets/stylesheets/semantic_ui/themes/default/views/ad.variables +2 -2
  156. data/assets/stylesheets/semantic_ui/themes/default/views/card.variables +33 -23
  157. data/assets/stylesheets/semantic_ui/themes/default/views/comment.overrides +0 -0
  158. data/assets/stylesheets/semantic_ui/themes/default/views/feed.overrides +0 -0
  159. data/assets/stylesheets/semantic_ui/themes/default/views/feed.variables +15 -23
  160. data/assets/stylesheets/semantic_ui/themes/default/views/item.overrides +0 -0
  161. data/assets/stylesheets/semantic_ui/themes/default/views/item.variables +12 -11
  162. data/assets/stylesheets/semantic_ui/themes/default/views/statistic.overrides +0 -0
  163. data/assets/stylesheets/semantic_ui/themes/default/views/statistic.variables +25 -24
  164. data/assets/stylesheets/semantic_ui/themes/flat/collections/form.overrides +4 -0
  165. data/assets/stylesheets/semantic_ui/themes/flat/collections/form.variables +1 -2
  166. data/assets/stylesheets/semantic_ui/themes/flat/globals/site.variables +1 -0
  167. data/assets/stylesheets/semantic_ui/themes/github/collections/form.variables +1 -1
  168. data/assets/stylesheets/semantic_ui/themes/github/collections/menu.variables +10 -15
  169. data/assets/stylesheets/semantic_ui/themes/github/elements/button.variables +2 -2
  170. data/assets/stylesheets/semantic_ui/themes/github/elements/step.variables +2 -2
  171. data/assets/stylesheets/semantic_ui/themes/instagram/views/card.overrides +12 -0
  172. data/assets/stylesheets/semantic_ui/themes/instagram/views/card.variables +23 -0
  173. data/assets/stylesheets/semantic_ui/themes/material/collections/menu.overrides +1 -0
  174. data/assets/stylesheets/semantic_ui/themes/material/collections/menu.variables +10 -0
  175. data/assets/stylesheets/semantic_ui/themes/material/elements/button.overrides +1 -0
  176. data/assets/stylesheets/semantic_ui/themes/material/elements/button.variables +14 -6
  177. data/assets/stylesheets/semantic_ui/themes/material/globals/site.variables +3 -2
  178. data/assets/stylesheets/semantic_ui/themes/material/modules/dropdown.overrides +5 -0
  179. data/assets/stylesheets/semantic_ui/themes/material/modules/dropdown.variables +20 -0
  180. data/assets/stylesheets/semantic_ui/themes/raised/elements/button.variables +5 -5
  181. data/assets/stylesheets/semantic_ui/themes/round/elements/button.variables +1 -1
  182. data/assets/stylesheets/semantic_ui/themes/timeline/views/feed.overrides +4 -12
  183. data/assets/stylesheets/semantic_ui/themes/timeline/views/feed.variables +3 -7
  184. data/lib/generators/semantic_ui/install/templates/config/elements/container.overrides +3 -0
  185. data/lib/generators/semantic_ui/install/templates/config/elements/container.variables +3 -0
  186. data/lib/generators/semantic_ui/install/templates/config/modules/embed.overrides +3 -0
  187. data/lib/generators/semantic_ui/install/templates/config/modules/embed.variables +0 -0
  188. data/lib/generators/semantic_ui/install/templates/semantic_ui.css +2 -1
  189. data/lib/generators/semantic_ui/install/templates/semantic_ui.js +1 -1
  190. data/lib/generators/semantic_ui/install/templates/theme.config +5 -3
  191. data/lib/less/rails/semantic_ui/version.rb +1 -1
  192. data/tasks/update.rake +21 -6
  193. metadata +23 -7
  194. data/assets/fonts/semantic_ui/themes/default/assets/fonts/icons.otf +0 -0
  195. data/assets/javascripts/semantic_ui/definitions/modules/video.js +0 -540
  196. data/assets/stylesheets/semantic_ui/definitions/modules/video.less +0 -135
  197. data/assets/stylesheets/semantic_ui/themes/default/modules/video.variables +0 -16
@@ -3,7 +3,7 @@
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2014 Contributors
6
+ * Copyright 2015 Contributors
7
7
  * Released under the MIT license
8
8
  * http://opensource.org/licenses/MIT
9
9
  *
@@ -15,7 +15,9 @@
15
15
 
16
16
  $.fn.colorize = function(parameters) {
17
17
  var
18
- settings = $.extend(true, {}, $.fn.colorize.settings, parameters),
18
+ settings = ( $.isPlainObject(parameters) )
19
+ ? $.extend(true, {}, $.fn.colorize.settings, parameters)
20
+ : $.extend({}, $.fn.colorize.settings),
19
21
  // hoist arguments
20
22
  moduleArguments = arguments || false
21
23
  ;
@@ -3,7 +3,7 @@
3
3
  * http://github.com/semantic-org/semantic-ui/
4
4
  *
5
5
  *
6
- * Copyright 2014 Contributors
6
+ * Copyright 2015 Contributors
7
7
  * Released under the MIT license
8
8
  * http://opensource.org/licenses/MIT
9
9
  *
@@ -13,60 +13,72 @@
13
13
 
14
14
  "use strict";
15
15
 
16
- $.fn.form = function(fields, parameters) {
16
+ $.fn.form = function(parameters) {
17
17
  var
18
- $allModules = $(this),
18
+ $allModules = $(this),
19
+ moduleSelector = $allModules.selector || '',
19
20
 
20
- settings = $.extend(true, {}, $.fn.form.settings, parameters),
21
- validation = $.extend({}, $.fn.form.settings.defaults, fields),
21
+ time = new Date().getTime(),
22
+ performance = [],
22
23
 
23
- namespace = settings.namespace,
24
- metadata = settings.metadata,
25
- selector = settings.selector,
26
- className = settings.className,
27
- error = settings.error,
28
-
29
- eventNamespace = '.' + namespace,
30
- moduleNamespace = 'module-' + namespace,
31
-
32
- moduleSelector = $allModules.selector || '',
33
-
34
- time = new Date().getTime(),
35
- performance = [],
36
-
37
- query = arguments[0],
38
- methodInvoked = (typeof query == 'string'),
39
- queryArguments = [].slice.call(arguments, 1),
24
+ query = arguments[0],
25
+ legacyParameters = arguments[1],
26
+ methodInvoked = (typeof query == 'string'),
27
+ queryArguments = [].slice.call(arguments, 1),
40
28
  returnedValue
41
29
  ;
42
30
  $allModules
43
31
  .each(function() {
44
32
  var
45
33
  $module = $(this),
46
- $field = $(this).find(selector.field),
47
- $group = $(this).find(selector.group),
48
- $message = $(this).find(selector.message),
49
- $prompt = $(this).find(selector.prompt),
50
-
51
- $submit = $(this).find(selector.submit),
52
- $clear = $(this).find(selector.clear),
53
- $reset = $(this).find(selector.reset),
34
+ element = this,
54
35
 
55
36
  formErrors = [],
56
37
  keyHeldDown = false,
57
38
 
58
- element = this,
59
- instance = $module.data(moduleNamespace),
39
+ // set at run-time
40
+ $field,
41
+ $group,
42
+ $message,
43
+ $prompt,
44
+ $submit,
45
+ $clear,
46
+ $reset,
47
+
48
+ settings,
49
+ validation,
50
+
51
+ metadata,
52
+ selector,
53
+ className,
54
+ error,
55
+
56
+ namespace,
57
+ moduleNamespace,
58
+ eventNamespace,
59
+
60
+ instance,
60
61
  module
61
62
  ;
62
63
 
63
64
  module = {
64
65
 
65
66
  initialize: function() {
66
- module.verbose('Initializing form validation', $module, validation, settings);
67
- module.bindEvents();
68
- module.set.defaults();
69
- module.instantiate();
67
+
68
+ // settings grabbed at run time
69
+ module.get.settings();
70
+ if(methodInvoked) {
71
+ if(instance === undefined) {
72
+ module.instantiate();
73
+ }
74
+ module.invoke(query);
75
+ }
76
+ else {
77
+ module.verbose('Initializing form validation', $module, settings);
78
+ module.bindEvents();
79
+ module.set.defaults();
80
+ module.instantiate();
81
+ }
70
82
  },
71
83
 
72
84
  instantiate: function() {
@@ -87,7 +99,14 @@ $.fn.form = function(fields, parameters) {
87
99
 
88
100
  refresh: function() {
89
101
  module.verbose('Refreshing selector cache');
90
- $field = $module.find(selector.field);
102
+ $field = $module.find(selector.field);
103
+ $group = $module.find(selector.group);
104
+ $message = $module.find(selector.message);
105
+ $prompt = $module.find(selector.prompt);
106
+
107
+ $submit = $module.find(selector.submit);
108
+ $clear = $module.find(selector.clear);
109
+ $reset = $module.find(selector.reset);
91
110
  },
92
111
 
93
112
  submit: function() {
@@ -100,7 +119,7 @@ $.fn.form = function(fields, parameters) {
100
119
  attachEvents: function(selector, action) {
101
120
  action = action || 'submit';
102
121
  $(selector)
103
- .on('click', function(event) {
122
+ .on('click' + eventNamespace, function(event) {
104
123
  module[action]();
105
124
  event.preventDefault();
106
125
  })
@@ -108,28 +127,25 @@ $.fn.form = function(fields, parameters) {
108
127
  },
109
128
 
110
129
  bindEvents: function() {
111
- if(settings.keyboardShortcuts) {
112
- $field
113
- .on('keydown' + eventNamespace, module.event.field.keydown)
114
- ;
115
- }
130
+ module.verbose('Attaching form events');
116
131
  $module
117
132
  .on('submit' + eventNamespace, module.validate.form)
133
+ .on('blur' + eventNamespace, selector.field, module.event.field.blur)
134
+ .on('click' + eventNamespace, selector.submit, module.submit)
135
+ .on('click' + eventNamespace, selector.reset, module.reset)
136
+ .on('click' + eventNamespace, selector.clear, module.clear)
118
137
  ;
119
- $field
120
- .on('blur' + eventNamespace, module.event.field.blur)
121
- ;
122
-
123
- // attach events to common elements
124
- module.attachEvents($submit, 'submit');
125
- module.attachEvents($reset, 'reset');
126
- module.attachEvents($clear, 'clear');
127
-
138
+ if(settings.keyboardShortcuts) {
139
+ $module
140
+ .on('keydown' + eventNamespace, selector.field, module.event.field.keydown)
141
+ ;
142
+ }
128
143
  $field
129
144
  .each(function() {
130
145
  var
131
- type = $(this).prop('type'),
132
- inputEvent = module.get.changeEvent(type)
146
+ $input = $(this),
147
+ type = $input.prop('type'),
148
+ inputEvent = module.get.changeEvent(type, $input)
133
149
  ;
134
150
  $(this)
135
151
  .on(inputEvent + eventNamespace, module.event.field.change)
@@ -161,7 +177,7 @@ $.fn.form = function(fields, parameters) {
161
177
  $element.dropdown('clear');
162
178
  }
163
179
  else if(isCheckbox) {
164
- $element.checkbox('uncheck');
180
+ $field.prop('checked', false);
165
181
  }
166
182
  else {
167
183
  module.verbose('Resetting field value', $field, defaultValue);
@@ -179,11 +195,14 @@ $.fn.form = function(fields, parameters) {
179
195
  $element = $field.parent(),
180
196
  $fieldGroup = $field.closest($group),
181
197
  $prompt = $fieldGroup.find(selector.prompt),
182
- defaultValue = $field.data(metadata.defaultValue) || '',
198
+ defaultValue = $field.data(metadata.defaultValue),
183
199
  isCheckbox = $element.is(selector.uiCheckbox),
184
200
  isDropdown = $element.is(selector.uiDropdown),
185
201
  isErrored = $fieldGroup.hasClass(className.error)
186
202
  ;
203
+ if(defaultValue === undefined) {
204
+ defaultValue = '';
205
+ }
187
206
  if(isErrored) {
188
207
  module.verbose('Resetting error on field', $fieldGroup);
189
208
  $fieldGroup.removeClass(className.error);
@@ -195,12 +214,7 @@ $.fn.form = function(fields, parameters) {
195
214
  }
196
215
  else if(isCheckbox) {
197
216
  module.verbose('Resetting checkbox value', $element, defaultValue);
198
- if(defaultValue === true) {
199
- $element.checkbox('check');
200
- }
201
- else {
202
- $element.checkbox('uncheck');
203
- }
217
+ $field.prop('checked', defaultValue);
204
218
  }
205
219
  else {
206
220
  module.verbose('Resetting field value', $field, defaultValue);
@@ -210,6 +224,21 @@ $.fn.form = function(fields, parameters) {
210
224
  ;
211
225
  },
212
226
 
227
+ is: {
228
+ valid: function() {
229
+ var
230
+ allValid = true
231
+ ;
232
+ module.verbose('Checking if form is valid');
233
+ $.each(validation, function(fieldName, field) {
234
+ if( !( module.validate.field(field) ) ) {
235
+ allValid = false;
236
+ }
237
+ });
238
+ return allValid;
239
+ }
240
+ },
241
+
213
242
  removeEvents: function() {
214
243
  $module
215
244
  .off(eventNamespace)
@@ -243,9 +272,6 @@ $.fn.form = function(fields, parameters) {
243
272
  ;
244
273
  }
245
274
  if(!event.ctrlKey && key == keyCode.enter && $field.is(selector.input) && $field.not(selector.checkbox).length > 0 ) {
246
- $submit
247
- .addClass(className.pressed)
248
- ;
249
275
  if(!keyHeldDown) {
250
276
  $field
251
277
  .one('keyup' + eventNamespace, module.event.field.keyup)
@@ -258,19 +284,19 @@ $.fn.form = function(fields, parameters) {
258
284
  },
259
285
  keyup: function() {
260
286
  keyHeldDown = false;
261
- $submit.removeClass(className.pressed);
262
287
  },
263
288
  blur: function() {
264
289
  var
265
- $field = $(this),
266
- $fieldGroup = $field.closest($group)
290
+ $field = $(this),
291
+ $fieldGroup = $field.closest($group),
292
+ validationRules = module.get.validation($field)
267
293
  ;
268
294
  if( $fieldGroup.hasClass(className.error) ) {
269
- module.debug('Revalidating field', $field, module.get.validation($field));
270
- module.validate.field( module.get.validation($field) );
295
+ module.debug('Revalidating field', $field, validationRules);
296
+ module.validate.field( validationRules );
271
297
  }
272
298
  else if(settings.on == 'blur' || settings.on == 'change') {
273
- module.validate.field( module.get.validation($field) );
299
+ module.validate.field( validationRules );
274
300
  }
275
301
  },
276
302
  change: function() {
@@ -291,8 +317,8 @@ $.fn.form = function(fields, parameters) {
291
317
  },
292
318
 
293
319
  get: {
294
- changeEvent: function(type) {
295
- if(type == 'checkbox' || type == 'radio' || type == 'hidden') {
320
+ changeEvent: function(type, $input) {
321
+ if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {
296
322
  return 'change';
297
323
  }
298
324
  else {
@@ -307,6 +333,52 @@ $.fn.form = function(fields, parameters) {
307
333
  : 'keyup'
308
334
  ;
309
335
  },
336
+ settings: function() {
337
+ var
338
+ firstProperty
339
+ ;
340
+ if($.isPlainObject(parameters)) {
341
+ var
342
+ keys = Object.keys(parameters),
343
+ isLegacySettings = (keys.length > 0)
344
+ ? (parameters[keys[0]].identifier !== undefined)
345
+ : false
346
+ ;
347
+ if(isLegacySettings) {
348
+ // 1.x (ducktyped)
349
+ settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
350
+ validation = $.extend({}, $.fn.form.settings.defaults, parameters);
351
+ module.error(settings.error.oldSyntax, element);
352
+ module.verbose('Extending settings from legacy parameters', validation, settings);
353
+ }
354
+ else {
355
+ // 2.x
356
+ settings = $.extend(true, {}, $.fn.form.settings, parameters);
357
+ validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
358
+ module.verbose('Extending settings', validation, settings);
359
+ }
360
+ }
361
+ else {
362
+ settings = $.fn.form.settings;
363
+ validation = $.fn.form.settings.defaults;
364
+ module.verbose('Using default form validation', validation, settings);
365
+ }
366
+
367
+ // shorthand
368
+ namespace = settings.namespace;
369
+ metadata = settings.metadata;
370
+ selector = settings.selector;
371
+ className = settings.className;
372
+ error = settings.error;
373
+ moduleNamespace = 'module-' + namespace;
374
+ eventNamespace = '.' + namespace;
375
+
376
+ // grab instance
377
+ instance = $module.data(moduleNamespace);
378
+
379
+ // refresh selector cache
380
+ module.refresh();
381
+ },
310
382
  field: function(identifier) {
311
383
  module.verbose('Finding field with identifier', identifier);
312
384
  if( $field.filter('#' + identifier).length > 0 ) {
@@ -336,8 +408,11 @@ $.fn.form = function(fields, parameters) {
336
408
  var
337
409
  rules
338
410
  ;
411
+ if(!validation) {
412
+ return false;
413
+ }
339
414
  $.each(validation, function(fieldName, field) {
340
- if( module.get.field(field.identifier).get(0) == $field.get(0) ) {
415
+ if( module.get.field(field.identifier)[0] == $field[0] ) {
341
416
  rules = field;
342
417
  }
343
418
  });
@@ -380,7 +455,7 @@ $.fn.form = function(fields, parameters) {
380
455
  }
381
456
  if(isCheckbox) {
382
457
  if(isChecked) {
383
- values[name].push(value)
458
+ values[name].push(value);
384
459
  }
385
460
  else {
386
461
  module.debug('Omitted unchecked checkbox', $field);
@@ -600,7 +675,6 @@ $.fn.form = function(fields, parameters) {
600
675
  }
601
676
  }
602
677
  });
603
- module.validate.form();
604
678
  }
605
679
  },
606
680
 
@@ -608,7 +682,6 @@ $.fn.form = function(fields, parameters) {
608
682
 
609
683
  form: function(event) {
610
684
  var
611
- allValid = true,
612
685
  apiRequest
613
686
  ;
614
687
 
@@ -619,12 +692,7 @@ $.fn.form = function(fields, parameters) {
619
692
 
620
693
  // reset errors
621
694
  formErrors = [];
622
- $.each(validation, function(fieldName, field) {
623
- if( !( module.validate.field(field) ) ) {
624
- allValid = false;
625
- }
626
- });
627
- if(allValid) {
695
+ if( module.is.valid() ) {
628
696
  module.debug('Form has no validation errors, submitting');
629
697
  module.set.success();
630
698
  return settings.onSuccess.call(element, event);
@@ -685,23 +753,34 @@ $.fn.form = function(fields, parameters) {
685
753
  var
686
754
  $field = module.get.field(field.identifier),
687
755
  type = validation.type,
688
- value = $.trim($field.val() + ''),
689
-
690
- bracketRegExp = /\[(.*)\]/i,
691
- bracket = bracketRegExp.exec(type),
756
+ value = $field.val(),
757
+ bracket = type.match(settings.regExp.bracket),
692
758
  isValid = true,
759
+ rule,
693
760
  ancillary,
694
761
  functionType
695
762
  ;
763
+ // cast to string
764
+ value = $.trim($field.val() + '');
765
+
696
766
  // if bracket notation is used, pass in extra parameters
697
- if(bracket !== undefined && bracket !== null) {
767
+ if(bracket) {
698
768
  ancillary = '' + bracket[1];
699
769
  functionType = type.replace(bracket[0], '');
700
- isValid = settings.rules[functionType].call(element, value, ancillary);
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);
701
776
  }
702
- // normal notation
703
777
  else {
704
- isValid = settings.rules[type].call($field, value);
778
+ rule = settings.rules[type];
779
+ if( !$.isFunction(rule) ) {
780
+ module.error(error.noRule, type);
781
+ return;
782
+ }
783
+ isValid = rule.call($field, value);
705
784
  }
706
785
  return isValid;
707
786
  }
@@ -775,7 +854,7 @@ $.fn.form = function(fields, parameters) {
775
854
  });
776
855
  }
777
856
  clearTimeout(module.performance.timer);
778
- module.performance.timer = setTimeout(module.performance.display, 100);
857
+ module.performance.timer = setTimeout(module.performance.display, 500);
779
858
  },
780
859
  display: function() {
781
860
  var
@@ -863,19 +942,7 @@ $.fn.form = function(fields, parameters) {
863
942
  return found;
864
943
  }
865
944
  };
866
- if(methodInvoked) {
867
- if(instance === undefined) {
868
- module.initialize();
869
- }
870
- module.invoke(query);
871
- }
872
- else {
873
- if(instance !== undefined) {
874
- instance.invoke('destroy');
875
- }
876
- module.initialize();
877
- }
878
-
945
+ module.initialize();
879
946
  })
880
947
  ;
881
948
 
@@ -891,9 +958,10 @@ $.fn.form.settings = {
891
958
  namespace : 'form',
892
959
 
893
960
  debug : false,
894
- verbose : true,
961
+ verbose : false,
895
962
  performance : true,
896
963
 
964
+ fields : false,
897
965
 
898
966
  keyboardShortcuts : true,
899
967
  on : 'submit',
@@ -915,6 +983,15 @@ $.fn.form.settings = {
915
983
  validate : 'validate'
916
984
  },
917
985
 
986
+ regExp: {
987
+ bracket : /\[(.*)\]/i,
988
+ 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
+ flags : /^\/(.*)\/(.*)?/,
992
+ url : /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i
993
+ },
994
+
918
995
  selector : {
919
996
  checkbox : 'input[type="checkbox"], input[type="radio"]',
920
997
  clear : '.clear',
@@ -924,8 +1001,8 @@ $.fn.form.settings = {
924
1001
  message : '.error.message',
925
1002
  prompt : '.prompt.label',
926
1003
  radio : 'input[type="radio"]',
927
- reset : '.reset',
928
- submit : '.submit',
1004
+ reset : '.reset:not([type="reset"])',
1005
+ submit : '.submit:not([type="submit"])',
929
1006
  uiCheckbox : '.ui.checkbox',
930
1007
  uiDropdown : '.ui.dropdown'
931
1008
  },
@@ -938,7 +1015,9 @@ $.fn.form.settings = {
938
1015
  },
939
1016
 
940
1017
  error: {
941
- method : 'The method you called is not defined.'
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.'
942
1021
  },
943
1022
 
944
1023
  templates: {
@@ -974,34 +1053,34 @@ $.fn.form.settings = {
974
1053
  // value contains text (insensitive)
975
1054
  contains: function(value, text) {
976
1055
  // escape regex characters
977
- text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
1056
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
978
1057
  return (value.search( new RegExp(text, 'i') ) !== -1);
979
1058
  },
980
1059
 
981
1060
  // value contains text (case sensitive)
982
1061
  containsExactly: function(value, text) {
983
1062
  // escape regex characters
984
- text = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
1063
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
985
1064
  return (value.search( new RegExp(text) ) !== -1);
986
1065
  },
987
1066
 
988
1067
  // is most likely an email
989
1068
  email: function(value){
990
1069
  var
991
- emailRegExp = new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", "i")
1070
+ emailRegExp = new RegExp($.fn.form.settings.regExp.email, 'i')
992
1071
  ;
993
1072
  return emailRegExp.test(value);
994
1073
  },
995
1074
 
996
1075
  // is not empty or blank string
997
1076
  empty: function(value) {
998
- return !(value === undefined || '' === value);
1077
+ return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);
999
1078
  },
1000
1079
 
1001
1080
  // is valid integer
1002
1081
  integer: function(value, range) {
1003
1082
  var
1004
- intRegExp = /^\-?\d+$/,
1083
+ intRegExp = $.fn.form.settings.regExp.integer,
1005
1084
  min,
1006
1085
  max,
1007
1086
  parts
@@ -1057,20 +1136,48 @@ $.fn.form.settings = {
1057
1136
  },
1058
1137
 
1059
1138
  // matches another field
1060
- match: function(value, fieldIdentifier) {
1139
+ different: function(value, identifier) {
1061
1140
  // use either id or name of field
1062
1141
  var
1063
1142
  $form = $(this),
1064
1143
  matchingValue
1065
1144
  ;
1066
- if($form.find('#' + fieldIdentifier).length > 0) {
1067
- matchingValue = $form.find('#' + fieldIdentifier).val();
1145
+ if( $('[data-validate="'+ identifier +'"]').length > 0 ) {
1146
+ matchingValue = $('[data-validate="'+ identifier +'"]').val();
1147
+ }
1148
+ else if($('#' + identifier).length > 0) {
1149
+ matchingValue = $('#' + identifier).val();
1068
1150
  }
1069
- else if($form.find('[name="' + fieldIdentifier +'"]').length > 0) {
1070
- matchingValue = $form.find('[name="' + fieldIdentifier + '"]').val();
1151
+ else if($('[name="' + identifier +'"]').length > 0) {
1152
+ matchingValue = $('[name="' + identifier + '"]').val();
1071
1153
  }
1072
- else if( $form.find('[data-validate="'+ fieldIdentifier +'"]').length > 0 ) {
1073
- matchingValue = $form.find('[data-validate="'+ fieldIdentifier +'"]').val();
1154
+ else if( $('[name="' + identifier +'[]"]').length > 0 ) {
1155
+ matchingValue = $('[name="' + identifier +'[]"]');
1156
+ }
1157
+ return (matchingValue !== undefined)
1158
+ ? ( value.toString() !== matchingValue.toString() )
1159
+ : false
1160
+ ;
1161
+ },
1162
+
1163
+ // matches another field
1164
+ match: function(value, identifier) {
1165
+ // use either id or name of field
1166
+ var
1167
+ $form = $(this),
1168
+ matchingValue
1169
+ ;
1170
+ if( $('[data-validate="'+ identifier +'"]').length > 0 ) {
1171
+ matchingValue = $('[data-validate="'+ identifier +'"]').val();
1172
+ }
1173
+ else if($('#' + identifier).length > 0) {
1174
+ matchingValue = $('#' + identifier).val();
1175
+ }
1176
+ else if($('[name="' + identifier +'"]').length > 0) {
1177
+ matchingValue = $('[name="' + identifier + '"]').val();
1178
+ }
1179
+ else if( $('[name="' + identifier +'[]"]').length > 0 ) {
1180
+ matchingValue = $('[name="' + identifier +'[]"]');
1074
1181
  }
1075
1182
  return (matchingValue !== undefined)
1076
1183
  ? ( value.toString() == matchingValue.toString() )
@@ -1078,6 +1185,40 @@ $.fn.form.settings = {
1078
1185
  ;
1079
1186
  },
1080
1187
 
1188
+ maxCount: function(value, count) {
1189
+ value = value.split(',');
1190
+ return ($.isArray(value) && value.length <= count);
1191
+ },
1192
+
1193
+ exactCount: function(value, count) {
1194
+ value = value.split(',');
1195
+ return ($.isArray(value) && value.length == count);
1196
+ },
1197
+
1198
+ minCount: function(value, count) {
1199
+ value = value.split(',');
1200
+ return ($.isArray(value) && value.length >= count);
1201
+ },
1202
+
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
+ ;
1218
+ }
1219
+ return value.match( new RegExp(regExp, flags) );
1220
+ },
1221
+
1081
1222
  // string length is less than max length
1082
1223
  maxLength: function(value, maxLength) {
1083
1224
  return (value !== undefined)
@@ -1106,10 +1247,7 @@ $.fn.form.settings = {
1106
1247
 
1107
1248
  // value is most likely url
1108
1249
  url: function(value) {
1109
- var
1110
- urlRegExp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
1111
- ;
1112
- return urlRegExp.test(value);
1250
+ return $.fn.form.settings.regExp.url.match(value);
1113
1251
  }
1114
1252
  }
1115
1253