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
  *
@@ -29,7 +29,9 @@ $.fn.search = function(parameters) {
29
29
  $(this)
30
30
  .each(function() {
31
31
  var
32
- settings = $.extend(true, {}, $.fn.search.settings, parameters),
32
+ settings = ( $.isPlainObject(parameters) )
33
+ ? $.extend(true, {}, $.fn.search.settings, parameters)
34
+ : $.extend({}, $.fn.search.settings),
33
35
 
34
36
  className = settings.className,
35
37
  metadata = settings.metadata,
@@ -53,37 +55,15 @@ $.fn.search = function(parameters) {
53
55
 
54
56
  module
55
57
  ;
58
+
56
59
  module = {
57
60
 
58
61
  initialize: function() {
59
62
  module.verbose('Initializing module');
60
- var
61
- prompt = $prompt[0],
62
- inputEvent = (prompt !== undefined && prompt.oninput !== undefined)
63
- ? 'input'
64
- : (prompt !== undefined && prompt.onpropertychange !== undefined)
65
- ? 'propertychange'
66
- : 'keyup'
67
- ;
68
- if(settings.automatic) {
69
- $prompt
70
- .on(inputEvent + eventNamespace, module.throttle)
71
- .attr('autocomplete', 'off')
72
- ;
73
- }
74
- $prompt
75
- .on('focus' + eventNamespace, module.event.focus)
76
- .on('blur' + eventNamespace, module.event.blur)
77
- .on('keydown' + eventNamespace, module.handleKeyboard)
78
- ;
79
- $searchButton
80
- .on('click' + eventNamespace, module.query)
81
- ;
82
- $results
83
- .on('mousedown' + eventNamespace, module.event.result.mousedown)
84
- .on('mouseup' + eventNamespace, module.event.result.mouseup)
85
- .on('click' + eventNamespace, selector.result, module.event.result.click)
86
- ;
63
+ module.determine.searchFields();
64
+ module.bind.events();
65
+ module.set.type();
66
+ module.create.results();
87
67
  module.instantiate();
88
68
  },
89
69
  instantiate: function() {
@@ -96,24 +76,56 @@ $.fn.search = function(parameters) {
96
76
  destroy: function() {
97
77
  module.verbose('Destroying instance');
98
78
  $module
99
- .removeData(moduleNamespace)
100
- ;
101
- $prompt
102
- .off(eventNamespace)
103
- ;
104
- $searchButton
105
- .off(eventNamespace)
106
- ;
107
- $results
108
79
  .off(eventNamespace)
80
+ .removeData(moduleNamespace)
109
81
  ;
110
82
  },
83
+
84
+ bind: {
85
+ events: function() {
86
+ module.verbose('Binding events to search');
87
+ if(settings.automatic) {
88
+ $module
89
+ .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)
90
+ ;
91
+ $prompt
92
+ .attr('autocomplete', 'off')
93
+ ;
94
+ }
95
+ $module
96
+ // prompt
97
+ .on('focus' + eventNamespace, selector.prompt, module.event.focus)
98
+ .on('blur' + eventNamespace, selector.prompt, module.event.blur)
99
+ .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)
100
+ // search button
101
+ .on('click' + eventNamespace, selector.searchButton, module.query)
102
+ // results
103
+ .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)
104
+ .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)
105
+ .on('click' + eventNamespace, selector.result, module.event.result.click)
106
+ ;
107
+ }
108
+ },
109
+
110
+ determine: {
111
+ searchFields: function() {
112
+ // this makes sure $.extend does not add specified search fields to default fields
113
+ // this is the only setting which should not extend defaults
114
+ if(parameters && parameters.searchFields !== undefined) {
115
+ settings.searchFields = parameters.searchFields;
116
+ }
117
+ }
118
+ },
119
+
111
120
  event: {
121
+ input: function() {
122
+ clearTimeout(module.timer);
123
+ module.timer = setTimeout(module.query, settings.searchDelay);
124
+ },
112
125
  focus: function() {
113
126
  module.set.focus();
114
- clearTimeout(module.timer);
115
- module.throttle();
116
127
  if( module.has.minimumCharacters() ) {
128
+ module.query();
117
129
  module.showResults();
118
130
  }
119
131
  },
@@ -143,11 +155,12 @@ $.fn.search = function(parameters) {
143
155
  href = $link.attr('href') || false,
144
156
  target = $link.attr('target') || false,
145
157
  title = $title.html(),
146
- name = ($title.length > 0)
158
+ // title is used for result lookup
159
+ value = ($title.length > 0)
147
160
  ? $title.text()
148
161
  : false,
149
162
  results = module.get.results(),
150
- result = module.get.result(name, results),
163
+ result = $result.data(metadata.result) || module.get.result(value, results),
151
164
  returnedValue
152
165
  ;
153
166
  if( $.isFunction(settings.onSelect) ) {
@@ -157,8 +170,8 @@ $.fn.search = function(parameters) {
157
170
  }
158
171
  }
159
172
  module.hideResults();
160
- if(name) {
161
- module.set.value(name);
173
+ if(value) {
174
+ module.set.value(value);
162
175
  }
163
176
  if(href) {
164
177
  module.verbose('Opening search link found in result', $link);
@@ -258,9 +271,11 @@ $.fn.search = function(parameters) {
258
271
  api: function() {
259
272
  var
260
273
  apiSettings = {
274
+ debug : settings.debug,
261
275
  on : false,
276
+ cache : 'local',
262
277
  action : 'search',
263
- onFailure : module.error
278
+ onError : module.error
264
279
  },
265
280
  searchHTML
266
281
  ;
@@ -291,6 +306,17 @@ $.fn.search = function(parameters) {
291
306
  },
292
307
 
293
308
  get: {
309
+ inputEvent: function() {
310
+ var
311
+ prompt = $prompt[0],
312
+ inputEvent = (prompt !== undefined && prompt.oninput !== undefined)
313
+ ? 'input'
314
+ : (prompt !== undefined && prompt.onpropertychange !== undefined)
315
+ ? 'propertychange'
316
+ : 'keyup'
317
+ ;
318
+ return inputEvent;
319
+ },
294
320
  value: function() {
295
321
  return $prompt.val();
296
322
  },
@@ -302,26 +328,34 @@ $.fn.search = function(parameters) {
302
328
  },
303
329
  result: function(value, results) {
304
330
  var
305
- result = false
331
+ lookupFields = ['title', 'id'],
332
+ result = false
333
+ ;
334
+ value = (value !== undefined)
335
+ ? value
336
+ : module.get.value()
337
+ ;
338
+ results = (results !== undefined)
339
+ ? results
340
+ : module.get.results()
306
341
  ;
307
- value = value || module.get.value();
308
- results = results || module.get.results();
309
342
  if(settings.type === 'category') {
310
343
  module.debug('Finding result that matches', value);
311
344
  $.each(results, function(index, category) {
312
345
  if($.isArray(category.results)) {
313
- result = module.search.object(value, category.results)[0];
314
- if(result && result.length > 0) {
315
- return true;
346
+ result = module.search.object(value, category.results, lookupFields)[0];
347
+ // dont continue searching if a result is found
348
+ if(result) {
349
+ return false;
316
350
  }
317
351
  }
318
352
  });
319
353
  }
320
354
  else {
321
355
  module.debug('Finding result in results object', value);
322
- result = module.search.object(value, results)[0];
356
+ result = module.search.object(value, results, lookupFields)[0];
323
357
  }
324
- return result;
358
+ return result || false;
325
359
  },
326
360
  },
327
361
 
@@ -334,8 +368,15 @@ $.fn.search = function(parameters) {
334
368
  },
335
369
  value: function(value) {
336
370
  module.verbose('Setting search input value', value);
337
- $prompt.val(value);
338
- module.query();
371
+ $prompt
372
+ .val(value)
373
+ ;
374
+ },
375
+ type: function(type) {
376
+ type = type || settings.type;
377
+ if(settings.type == 'category') {
378
+ $module.addClass(settings.type);
379
+ }
339
380
  },
340
381
  buttonPressed: function() {
341
382
  $searchButton.addClass(className.pressed);
@@ -359,55 +400,52 @@ $.fn.search = function(parameters) {
359
400
  searchTerm = module.get.value(),
360
401
  cache = module.read.cache(searchTerm)
361
402
  ;
362
- if(cache) {
363
- module.debug('Reading result for ' + searchTerm + ' from cache');
364
- module.save.results(cache.results);
365
- module.addResults(cache.html);
366
- }
367
- else {
368
- module.debug('Querying for ' + searchTerm);
369
- if($.isPlainObject(settings.source) || $.isArray(settings.source)) {
370
- module.search.local(searchTerm);
403
+ if( module.has.minimumCharacters() ) {
404
+ if(cache) {
405
+ module.debug('Reading result from cache', searchTerm);
406
+ module.save.results(cache.results);
407
+ module.addResults(cache.html);
408
+ module.inject.id(cache.results);
371
409
  }
372
- else if( module.can.useAPI() ) {
373
- if(settings.apiSettings) {
374
- module.debug('Searching with specified API settings', settings.apiSettings);
375
- module.search.remote(searchTerm);
410
+ else {
411
+ module.debug('Querying for', searchTerm);
412
+ if($.isPlainObject(settings.source) || $.isArray(settings.source)) {
413
+ module.search.local(searchTerm);
376
414
  }
377
- else if($.api.settings.api.search !== undefined) {
378
- module.debug('Searching with default search API endpoint');
415
+ else if( module.can.useAPI() ) {
379
416
  module.search.remote(searchTerm);
380
417
  }
381
418
  else {
382
- module.error(error.noEndpoint);
419
+ module.error(error.source);
383
420
  }
421
+ settings.onSearchQuery.call(element, searchTerm);
384
422
  }
385
- else {
386
- module.error(error.source);
387
- }
388
- settings.onSearchQuery.call(element, searchTerm);
423
+ }
424
+ else {
425
+ module.hideResults();
389
426
  }
390
427
  },
391
428
 
392
429
  search: {
393
430
  local: function(searchTerm) {
394
431
  var
395
- searchResults = module.search.object(searchTerm, settings.content),
432
+ results = module.search.object(searchTerm, settings.content),
396
433
  searchHTML
397
434
  ;
398
435
  module.set.loading();
399
- module.save.results(searchResults);
400
- module.debug('Returned local search results', searchResults);
436
+ module.save.results(results);
437
+ module.debug('Returned local search results', results);
401
438
 
402
439
  searchHTML = module.generateResults({
403
- results: searchResults
440
+ results: results
404
441
  });
405
442
  module.remove.loading();
443
+ module.addResults(searchHTML);
444
+ module.inject.id(results);
406
445
  module.write.cache(searchTerm, {
407
446
  html : searchHTML,
408
- results : searchResults
447
+ results : results
409
448
  });
410
- module.addResults(searchHTML);
411
449
  },
412
450
  remote: function(searchTerm) {
413
451
  var
@@ -415,6 +453,9 @@ $.fn.search = function(parameters) {
415
453
  onSuccess : function(response) {
416
454
  module.parse.response.call(element, response, searchTerm);
417
455
  },
456
+ onFailure: function() {
457
+ module.displayMessage(error.serverError);
458
+ },
418
459
  urlData: {
419
460
  query: searchTerm
420
461
  }
@@ -431,43 +472,60 @@ $.fn.search = function(parameters) {
431
472
  .api('query')
432
473
  ;
433
474
  },
434
- object: function(searchTerm, source) {
475
+ object: function(searchTerm, source, searchFields) {
435
476
  var
436
- results = [],
437
- fullTextResults = [],
438
- searchFields = $.isArray(settings.searchFields)
439
- ? settings.searchFields
440
- : [settings.searchFields],
441
- searchExp = searchTerm.replace(regExp.escape, '\\$&'),
442
- searchRegExp = new RegExp(regExp.exact + searchExp, 'i')
443
- ;
477
+ results = [],
478
+ fuzzyResults = [],
479
+ searchExp = searchTerm.toString().replace(regExp.escape, '\\$&'),
480
+ matchRegExp = new RegExp(regExp.beginsWith + searchExp, 'i'),
444
481
 
482
+ // avoid duplicates when pushing results
483
+ addResult = function(array, result) {
484
+ var
485
+ notResult = ($.inArray(result, results) == -1),
486
+ notFuzzyResult = ($.inArray(result, fuzzyResults) == -1)
487
+ ;
488
+ if(notResult && notFuzzyResult) {
489
+ array.push(result);
490
+ }
491
+ }
492
+ ;
445
493
  source = source || settings.source;
494
+ searchFields = (searchFields !== undefined)
495
+ ? searchFields
496
+ : settings.searchFields
497
+ ;
498
+
499
+ // search fields should be array to loop correctly
500
+ if(!$.isArray(searchFields)) {
501
+ searchFields = [searchFields];
502
+ }
446
503
 
447
- // exit conditions on no source
448
- if(source === undefined) {
504
+ // exit conditions if no source
505
+ if(source === undefined || source === false) {
449
506
  module.error(error.source);
450
507
  return [];
451
508
  }
452
509
 
453
- // iterate through search fields in array order
510
+ // iterate through search fields looking for matches
454
511
  $.each(searchFields, function(index, field) {
455
512
  $.each(source, function(label, content) {
456
513
  var
457
- fieldExists = (typeof content[field] == 'string'),
458
- notAlreadyResult = ($.inArray(content, results) == -1 && $.inArray(content, fullTextResults) == -1)
514
+ fieldExists = (typeof content[field] == 'string')
459
515
  ;
460
- if(fieldExists && notAlreadyResult) {
461
- if( content[field].match(searchRegExp) ) {
462
- results.push(content);
516
+ if(fieldExists) {
517
+ if( content[field].search(matchRegExp) !== -1) {
518
+ // content starts with value (first in results)
519
+ addResult(results, content);
463
520
  }
464
521
  else if(settings.searchFullText && module.fuzzySearch(searchTerm, content[field]) ) {
465
- fullTextResults.push(content);
522
+ // content fuzzy matches (last in results)
523
+ addResult(fuzzyResults, content);
466
524
  }
467
525
  }
468
526
  });
469
527
  });
470
- return $.merge(results, fullTextResults);
528
+ return $.merge(results, fuzzyResults);
471
529
  }
472
530
  },
473
531
 
@@ -476,6 +534,9 @@ $.fn.search = function(parameters) {
476
534
  termLength = term.length,
477
535
  queryLength = query.length
478
536
  ;
537
+ if(typeof query !== 'string') {
538
+ return false;
539
+ }
479
540
  query = query.toLowerCase();
480
541
  term = term.toLowerCase();
481
542
  if(queryLength > termLength) {
@@ -506,27 +567,18 @@ $.fn.search = function(parameters) {
506
567
  module.verbose('Parsing server response', response);
507
568
  if(response !== undefined) {
508
569
  if(searchTerm !== undefined && response.results !== undefined) {
570
+ module.addResults(searchHTML);
571
+ module.inject.id(response.results);
509
572
  module.write.cache(searchTerm, {
510
573
  html : searchHTML,
511
574
  results : response.results
512
575
  });
513
576
  module.save.results(response.results);
514
- module.addResults(searchHTML);
515
577
  }
516
578
  }
517
579
  }
518
580
  },
519
581
 
520
- throttle: function() {
521
- clearTimeout(module.timer);
522
- if(module.has.minimumCharacters()) {
523
- module.timer = setTimeout(module.query, settings.searchDelay);
524
- }
525
- else {
526
- module.hideResults();
527
- }
528
- },
529
-
530
582
  cancel: {
531
583
  query: function() {
532
584
  if( module.can.useAPI() ) {
@@ -545,6 +597,23 @@ $.fn.search = function(parameters) {
545
597
  }
546
598
  },
547
599
 
600
+ clear: {
601
+ cache: function(value) {
602
+ var
603
+ cache = $module.data(metadata.cache)
604
+ ;
605
+ if(!value) {
606
+ module.debug('Clearing cache', value);
607
+ $module.removeData(metadata.cache);
608
+ }
609
+ else if(value && cache && cache[value]) {
610
+ module.debug('Removing value from cache', value);
611
+ delete cache[value];
612
+ $module.data(metadata.cache, cache);
613
+ }
614
+ }
615
+ },
616
+
548
617
  read: {
549
618
  cache: function(name) {
550
619
  var
@@ -561,6 +630,94 @@ $.fn.search = function(parameters) {
561
630
  }
562
631
  },
563
632
 
633
+ create: {
634
+ id: function(resultIndex, categoryIndex) {
635
+ var
636
+ resultID = (resultIndex + 1), // not zero indexed
637
+ categoryID = (categoryIndex + 1),
638
+ firstCharCode,
639
+ letterID,
640
+ id
641
+ ;
642
+ if(categoryIndex !== undefined) {
643
+ // start char code for "A"
644
+ letterID = String.fromCharCode(97 + categoryIndex);
645
+ id = letterID + resultID;
646
+ module.verbose('Creating category result id', id);
647
+ }
648
+ else {
649
+ id = resultID;
650
+ module.verbose('Creating result id', id);
651
+ }
652
+ return id;
653
+ },
654
+ results: function() {
655
+ if($results.length === 0) {
656
+ $results = $('<div />')
657
+ .addClass(className.results)
658
+ .appendTo($module)
659
+ ;
660
+ }
661
+ }
662
+ },
663
+
664
+ inject: {
665
+ result: function(result, resultIndex, categoryIndex) {
666
+ module.verbose('Injecting result into results');
667
+ var
668
+ $selectedResult = (categoryIndex !== undefined)
669
+ ? $results
670
+ .children().eq(categoryIndex)
671
+ .children(selector.result).eq(resultIndex)
672
+ : $results
673
+ .children(selector.result).eq(resultIndex)
674
+ ;
675
+ module.verbose('Injecting results metadata', $selectedResult);
676
+ $selectedResult
677
+ .data(metadata.result, result)
678
+ ;
679
+ },
680
+ id: function(results) {
681
+ module.debug('Injecting unique ids into results');
682
+ var
683
+ // since results may be object, we must use counters
684
+ categoryIndex = 0,
685
+ resultIndex = 0
686
+ ;
687
+ if(settings.type === 'category') {
688
+ // iterate through each category result
689
+ $.each(results, function(index, category) {
690
+ resultIndex = 0;
691
+ $.each(category.results, function(index, value) {
692
+ var
693
+ result = category.results[index]
694
+ ;
695
+ if(result.id === undefined) {
696
+ result.id = module.create.id(resultIndex, categoryIndex);
697
+ }
698
+ module.inject.result(result, resultIndex, categoryIndex);
699
+ resultIndex++;
700
+ });
701
+ categoryIndex++;
702
+ });
703
+ }
704
+ else {
705
+ // top level
706
+ $.each(results, function(index, value) {
707
+ var
708
+ result = results[index]
709
+ ;
710
+ if(result.id === undefined) {
711
+ result.id = module.create.id(resultIndex);
712
+ }
713
+ module.inject.result(result, resultIndex);
714
+ resultIndex++;
715
+ });
716
+ }
717
+ return results;
718
+ }
719
+ },
720
+
564
721
  save: {
565
722
  results: function(results) {
566
723
  module.verbose('Saving current search results to metadata', results);
@@ -605,6 +762,8 @@ $.fn.search = function(parameters) {
605
762
  $results
606
763
  .transition({
607
764
  animation : settings.transition + ' in',
765
+ debug : settings.debug,
766
+ verbose : settings.verbose,
608
767
  duration : settings.duration,
609
768
  queue : true
610
769
  })
@@ -627,6 +786,8 @@ $.fn.search = function(parameters) {
627
786
  $results
628
787
  .transition({
629
788
  animation : settings.transition + ' out',
789
+ debug : settings.debug,
790
+ verbose : settings.verbose,
630
791
  duration : settings.duration,
631
792
  queue : true
632
793
  })
@@ -751,7 +912,7 @@ $.fn.search = function(parameters) {
751
912
  });
752
913
  }
753
914
  clearTimeout(module.performance.timer);
754
- module.performance.timer = setTimeout(module.performance.display, 100);
915
+ module.performance.timer = setTimeout(module.performance.display, 500);
755
916
  },
756
917
  display: function() {
757
918
  var
@@ -863,36 +1024,55 @@ $.fn.search = function(parameters) {
863
1024
 
864
1025
  $.fn.search.settings = {
865
1026
 
866
- name : 'Search Module',
1027
+ name : 'Search',
867
1028
  namespace : 'search',
868
1029
 
869
1030
  debug : false,
870
- verbose : true,
1031
+ verbose : false,
871
1032
  performance : true,
872
1033
 
873
1034
  type : 'standard',
1035
+ // template to use (specified in settings.templates)
1036
+
874
1037
  minCharacters : 1,
1038
+ // minimum characters required to search
875
1039
 
876
- // api config
877
1040
  apiSettings : false,
1041
+ // API config
878
1042
 
879
1043
  source : false,
1044
+ // object to search
1045
+
880
1046
  searchFields : [
881
1047
  'title',
882
1048
  'description'
883
1049
  ],
1050
+ // fields to search
1051
+
884
1052
  searchFullText : true,
1053
+ // whether to include fuzzy results in local search
1054
+
1055
+ automatic : true,
1056
+ // whether to add events to prompt automatically
885
1057
 
886
- automatic : 'true',
887
1058
  hideDelay : 0,
888
- searchDelay : 100,
1059
+ // delay before hiding menu after blur
1060
+
1061
+ searchDelay : 200,
1062
+ // delay before searching
1063
+
889
1064
  maxResults : 7,
1065
+ // maximum results returned from local
1066
+
890
1067
  cache : true,
1068
+ // whether to store lookups in local cache
891
1069
 
1070
+ // transition settings
892
1071
  transition : 'scale',
893
- duration : 300,
1072
+ duration : 200,
894
1073
  easing : 'easeOutExpo',
895
1074
 
1075
+ // callbacks
896
1076
  onSelect : false,
897
1077
  onResultsAdd : false,
898
1078
 
@@ -907,6 +1087,7 @@ $.fn.search.settings = {
907
1087
  empty : 'empty',
908
1088
  focus : 'focus',
909
1089
  loading : 'loading',
1090
+ results : 'results',
910
1091
  pressed : 'down'
911
1092
  },
912
1093
 
@@ -916,19 +1097,20 @@ $.fn.search.settings = {
916
1097
  logging : 'Error in debug logging, exiting.',
917
1098
  noEndpoint : 'No search endpoint was specified',
918
1099
  noTemplate : 'A valid template name was not specified.',
919
- serverError : 'There was an issue with querying the server.',
1100
+ serverError : 'There was an issue querying the server.',
920
1101
  maxResults : 'Results must be an array to use maxResults setting',
921
1102
  method : 'The method you called is not defined.'
922
1103
  },
923
1104
 
924
1105
  metadata: {
925
1106
  cache : 'cache',
926
- results : 'results'
1107
+ results : 'results',
1108
+ result : 'result'
927
1109
  },
928
1110
 
929
1111
  regExp: {
930
- escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
931
- exact : '(?:\s|^)'
1112
+ escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
1113
+ beginsWith : '(?:\s|^)'
932
1114
  },
933
1115
 
934
1116
  selector : {