less-rails-semantic_ui 1.12.3.0 → 2.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 : {