bootstrap3_autocomplete_input 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +32 -0
  4. data/app/inputs/autocomplete_input.rb +65 -0
  5. data/lib/assets/javascripts/bootstrap3-autocomplete-input.js +87 -0
  6. data/lib/assets/javascripts/bootstrap3-autocomplete-input.min.js +1 -0
  7. data/lib/assets/javascripts/bootstrap3-typeahead.js +476 -0
  8. data/lib/assets/javascripts/bootstrap3-typeahead.min.js +1 -0
  9. data/lib/bootstrap3_autocomplete_input.rb +24 -0
  10. data/lib/bootstrap3_autocomplete_input/controllers/autocomplete.rb +66 -0
  11. data/lib/bootstrap3_autocomplete_input/orm.rb +7 -0
  12. data/lib/bootstrap3_autocomplete_input/orm/active_record.rb +51 -0
  13. data/lib/bootstrap3_autocomplete_input/orm/mongo_mapper.rb +30 -0
  14. data/lib/bootstrap3_autocomplete_input/orm/mongoid.rb +44 -0
  15. data/lib/bootstrap3_autocomplete_input/rails/engine.rb +15 -0
  16. data/lib/bootstrap3_autocomplete_input/simple_form_inputs.rb +78 -0
  17. data/lib/bootstrap3_autocomplete_input/version.rb +3 -0
  18. data/lib/generators/autocomplete/install_generator.rb +0 -0
  19. data/lib/tasks/bootstrap3_autocomplete_input_tasks.rake +4 -0
  20. data/test/bootstrap3_autocomplete_input_test.rb +7 -0
  21. data/test/dummy/README.rdoc +28 -0
  22. data/test/dummy/Rakefile +6 -0
  23. data/test/dummy/app/assets/javascripts/application.js +18 -0
  24. data/test/dummy/app/assets/stylesheets/application.css.scss +3 -0
  25. data/test/dummy/app/controllers/application_controller.rb +5 -0
  26. data/test/dummy/app/controllers/clients_controller.rb +58 -0
  27. data/test/dummy/app/controllers/orders_controller.rb +60 -0
  28. data/test/dummy/app/helpers/application_helper.rb +2 -0
  29. data/test/dummy/app/helpers/clients_helper.rb +2 -0
  30. data/test/dummy/app/helpers/orders_helper.rb +2 -0
  31. data/test/dummy/app/models/client.rb +3 -0
  32. data/test/dummy/app/models/order.rb +3 -0
  33. data/test/dummy/app/views/clients/_form.html.erb +18 -0
  34. data/test/dummy/app/views/clients/edit.html.erb +6 -0
  35. data/test/dummy/app/views/clients/index.html.erb +24 -0
  36. data/test/dummy/app/views/clients/new.html.erb +5 -0
  37. data/test/dummy/app/views/clients/show.html.erb +4 -0
  38. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  39. data/test/dummy/app/views/orders/_form.html.erb +50 -0
  40. data/test/dummy/app/views/orders/edit.html.erb +6 -0
  41. data/test/dummy/app/views/orders/index.html.erb +23 -0
  42. data/test/dummy/app/views/orders/new.html.erb +5 -0
  43. data/test/dummy/app/views/orders/show.html.erb +4 -0
  44. data/test/dummy/bin/bundle +3 -0
  45. data/test/dummy/bin/rails +4 -0
  46. data/test/dummy/bin/rake +4 -0
  47. data/test/dummy/config.ru +4 -0
  48. data/test/dummy/config/application.rb +25 -0
  49. data/test/dummy/config/boot.rb +5 -0
  50. data/test/dummy/config/database.yml +25 -0
  51. data/test/dummy/config/environment.rb +5 -0
  52. data/test/dummy/config/environments/development.rb +37 -0
  53. data/test/dummy/config/environments/production.rb +78 -0
  54. data/test/dummy/config/environments/test.rb +39 -0
  55. data/test/dummy/config/initializers/assets.rb +8 -0
  56. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  57. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  58. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  59. data/test/dummy/config/initializers/inflections.rb +16 -0
  60. data/test/dummy/config/initializers/mime_types.rb +4 -0
  61. data/test/dummy/config/initializers/session_store.rb +3 -0
  62. data/test/dummy/config/initializers/simple_form.rb +166 -0
  63. data/test/dummy/config/initializers/simple_form_bootstrap.rb +136 -0
  64. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  65. data/test/dummy/config/locales/en.yml +23 -0
  66. data/test/dummy/config/locales/simple_form.en.yml +31 -0
  67. data/test/dummy/config/routes.rb +62 -0
  68. data/test/dummy/config/secrets.yml +22 -0
  69. data/test/dummy/db/development.sqlite3 +0 -0
  70. data/test/dummy/db/migrate/20141224031843_create_clients.rb +10 -0
  71. data/test/dummy/db/migrate/20141224031854_create_orders.rb +12 -0
  72. data/test/dummy/db/migrate/20141224032000_add_client_to_order.rb +6 -0
  73. data/test/dummy/db/schema.rb +30 -0
  74. data/test/dummy/lib/templates/erb/scaffold/_form.html.erb +13 -0
  75. data/test/dummy/log/development.log +163 -0
  76. data/test/dummy/public/404.html +67 -0
  77. data/test/dummy/public/422.html +67 -0
  78. data/test/dummy/public/500.html +66 -0
  79. data/test/dummy/public/assets/application-c75a9a9deda9531070f576f4b4f75c82.js +5 -0
  80. data/test/dummy/public/assets/application-c75a9a9deda9531070f576f4b4f75c82.js.gz +0 -0
  81. data/test/dummy/public/assets/application-f44356f250333028ca1fd1097ad49074.css +8146 -0
  82. data/test/dummy/public/assets/application-f44356f250333028ca1fd1097ad49074.css.gz +0 -0
  83. data/test/dummy/public/assets/bootstrap/glyphicons-halflings-regular-195cb410b49d75c104a5bc6ad385ac77.woff +0 -0
  84. data/test/dummy/public/assets/bootstrap/glyphicons-halflings-regular-38831bbd01504eaf996d291c5e157661.ttf +0 -0
  85. data/test/dummy/public/assets/bootstrap/glyphicons-halflings-regular-69ff52480052cf785cc3f4472e1d56d9.eot +0 -0
  86. data/test/dummy/public/assets/bootstrap/glyphicons-halflings-regular-8acb5264b8eab48469867b225a7f3eb5.svg +229 -0
  87. data/test/dummy/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-cf2b341a1531cbc2fc6ef5ad4701a2f2.png +0 -0
  88. data/test/dummy/public/assets/jquery-ui/ui-bg_flat_75_ffffff_40x100-5858cfe74efe6264f22d7173d47d59ff.png +0 -0
  89. data/test/dummy/public/assets/jquery-ui/ui-bg_glass_55_fbf9ee_1x400-ea25ba87e2239186bff03593a01ee8b9.png +0 -0
  90. data/test/dummy/public/assets/jquery-ui/ui-bg_glass_65_ffffff_1x400-c338312c804e21990fd135b4cfd47e34.png +0 -0
  91. data/test/dummy/public/assets/jquery-ui/ui-bg_glass_75_dadada_1x400-f341292284f79753f6c7437a4a56706e.png +0 -0
  92. data/test/dummy/public/assets/jquery-ui/ui-bg_glass_75_e6e6e6_1x400-d78f160584dc06a42b7309e5d6a6f181.png +0 -0
  93. data/test/dummy/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400-e9751011cbae1cab664dca499087cf35.png +0 -0
  94. data/test/dummy/public/assets/jquery-ui/ui-bg_highlight-soft_75_cccccc_1x100-648c6d3e57afdb3827bcf9da30572df6.png +0 -0
  95. data/test/dummy/public/assets/jquery-ui/ui-icons_222222_256x240-af300280aedd6d5650563b1c4ddb4170.png +0 -0
  96. data/test/dummy/public/assets/jquery-ui/ui-icons_2e83ff_256x240-6e705c14341602e315c8320420582407.png +0 -0
  97. data/test/dummy/public/assets/jquery-ui/ui-icons_454545_256x240-79df93e060c7f26739b6bdab208a83bb.png +0 -0
  98. data/test/dummy/public/assets/jquery-ui/ui-icons_888888_256x240-a37e590d37d1a4614f1e05f9a3fa270c.png +0 -0
  99. data/test/dummy/public/assets/jquery-ui/ui-icons_cd0a0a_256x240-d350ff5c368b707165371738d74a45f3.png +0 -0
  100. data/test/dummy/public/assets/manifest-2c14fa9337f42e56d7ee7bc25e91853c.json +1 -0
  101. data/test/dummy/public/favicon.ico +0 -0
  102. data/test/dummy/test/controllers/clients_controller_test.rb +49 -0
  103. data/test/dummy/test/controllers/orders_controller_test.rb +49 -0
  104. data/test/dummy/test/fixtures/clients.yml +11 -0
  105. data/test/dummy/test/fixtures/orders.yml +11 -0
  106. data/test/dummy/test/helpers/clients_helper_test.rb +4 -0
  107. data/test/dummy/test/helpers/orders_helper_test.rb +4 -0
  108. data/test/dummy/test/models/client_test.rb +7 -0
  109. data/test/dummy/test/models/order_test.rb +7 -0
  110. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_alerts.scssc +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_badges.scssc +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_breadcrumbs.scssc +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_button-groups.scssc +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_buttons.scssc +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_carousel.scssc +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_close.scssc +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_code.scssc +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_component-animations.scssc +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_dropdowns.scssc +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_forms.scssc +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_glyphicons.scssc +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_grid.scssc +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_input-groups.scssc +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_jumbotron.scssc +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_labels.scssc +0 -0
  126. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_list-group.scssc +0 -0
  127. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_media.scssc +0 -0
  128. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_mixins.scssc +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_modals.scssc +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_navbar.scssc +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_navs.scssc +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_normalize.scssc +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_pager.scssc +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_pagination.scssc +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_panels.scssc +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_popovers.scssc +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_print.scssc +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_progress-bars.scssc +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_responsive-embed.scssc +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_responsive-utilities.scssc +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_scaffolding.scssc +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_tables.scssc +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_thumbnails.scssc +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_tooltip.scssc +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_type.scssc +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_utilities.scssc +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_variables.scssc +0 -0
  148. data/test/dummy/tmp/cache/assets/development/sass/00c0d190ddd8c2872a4734aa8f23fac8f3f4f27c/_wells.scssc +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_alerts.scssc +0 -0
  150. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_background-variant.scssc +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_border-radius.scssc +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_buttons.scssc +0 -0
  153. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_center-block.scssc +0 -0
  154. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_clearfix.scssc +0 -0
  155. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_forms.scssc +0 -0
  156. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_gradients.scssc +0 -0
  157. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_grid-framework.scssc +0 -0
  158. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_grid.scssc +0 -0
  159. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_hide-text.scssc +0 -0
  160. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_image.scssc +0 -0
  161. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_labels.scssc +0 -0
  162. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_list-group.scssc +0 -0
  163. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_nav-divider.scssc +0 -0
  164. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_nav-vertical-align.scssc +0 -0
  165. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_opacity.scssc +0 -0
  166. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_pagination.scssc +0 -0
  167. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_panels.scssc +0 -0
  168. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_progress-bar.scssc +0 -0
  169. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_reset-filter.scssc +0 -0
  170. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_resize.scssc +0 -0
  171. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_responsive-visibility.scssc +0 -0
  172. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_size.scssc +0 -0
  173. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_tab-focus.scssc +0 -0
  174. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_table-row.scssc +0 -0
  175. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_text-emphasis.scssc +0 -0
  176. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_text-overflow.scssc +0 -0
  177. data/test/dummy/tmp/cache/assets/development/sass/826344a9bdbb4ce67201515fbc2643c96b5692c8/_vendor-prefixes.scssc +0 -0
  178. data/test/dummy/tmp/cache/assets/development/sass/a39e0369930579ee8c9c371998d66bc75345b4be/application.css.scssc +0 -0
  179. data/test/dummy/tmp/cache/assets/development/sass/cec4c201800e8a79a141df13cd1029773a871cb4/_bootstrap-sprockets.scssc +0 -0
  180. data/test/dummy/tmp/cache/assets/development/sass/cec4c201800e8a79a141df13cd1029773a871cb4/_bootstrap.scssc +0 -0
  181. data/test/dummy/tmp/cache/assets/development/sprockets/05304e2722415bbc5142bded0d637d5b +0 -0
  182. data/test/dummy/tmp/cache/assets/development/sprockets/067de15f6eed2b96ff2fef4779e1495f +0 -0
  183. data/test/dummy/tmp/cache/assets/development/sprockets/097f3cf94fac7a339daf65b4fbbbf469 +0 -0
  184. data/test/dummy/tmp/cache/assets/development/sprockets/09e7eed3751645884590e16723e8c7b4 +0 -0
  185. data/test/dummy/tmp/cache/assets/development/sprockets/0bf93caacb628748207c7b18f44e2ce5 +0 -0
  186. data/test/dummy/tmp/cache/assets/development/sprockets/13bbf50c11c4a0032c43cfedab28589c +0 -0
  187. data/test/dummy/tmp/cache/assets/development/sprockets/14ff7948a4a406b91a86768262212334 +0 -0
  188. data/test/dummy/tmp/cache/assets/development/sprockets/158c207e246f777fd1b202837deb4d2a +0 -0
  189. data/test/dummy/tmp/cache/assets/development/sprockets/15bf67bdb925b7dd96d635ec0088a5e1 +0 -0
  190. data/test/dummy/tmp/cache/assets/development/sprockets/1e9dbac6bb0ab62a1258e8e450ffc43a +0 -0
  191. data/test/dummy/tmp/cache/assets/development/sprockets/278146df7d7c18920d86a4ae7852fd8b +0 -0
  192. data/test/dummy/tmp/cache/assets/development/sprockets/28105053ec5c84ff23ba9a772770ae92 +0 -0
  193. data/test/dummy/tmp/cache/assets/development/sprockets/2acf447a8c29da6e4d89163a70ef0ae8 +0 -0
  194. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  195. data/test/dummy/tmp/cache/assets/development/sprockets/32f6f752901c13c529a37eb337113f1f +0 -0
  196. data/test/dummy/tmp/cache/assets/development/sprockets/346e797e518b143a4d66645c95d73528 +0 -0
  197. data/test/dummy/tmp/cache/assets/development/sprockets/38929ac56b95af9ff0142cfe13972e8f +0 -0
  198. data/test/dummy/tmp/cache/assets/development/sprockets/3afb0d89e1e96802e9878dbf7b9ba3a8 +0 -0
  199. data/test/dummy/tmp/cache/assets/development/sprockets/3b5b4cd2a1abf7f59590adc0be9c2e4b +0 -0
  200. data/test/dummy/tmp/cache/assets/development/sprockets/3e25f4c5c007ec48c5febf3a06a6c301 +0 -0
  201. data/test/dummy/tmp/cache/assets/development/sprockets/4127f13a5b8ce6faf84acfa698bcfbaf +0 -0
  202. data/test/dummy/tmp/cache/assets/development/sprockets/423defc0a61e0f9d7158ad173b4440d0 +0 -0
  203. data/test/dummy/tmp/cache/assets/development/sprockets/4708cc029aeffd33fd6d871326a69195 +0 -0
  204. data/test/dummy/tmp/cache/assets/development/sprockets/4a5472adf761a1d2f647e7900b5ef968 +0 -0
  205. data/test/dummy/tmp/cache/assets/development/sprockets/4bdbccbeace1fffd0d66c45b11c1cd39 +0 -0
  206. data/test/dummy/tmp/cache/assets/development/sprockets/4f494d96ea9500f27cd13f8f0023387b +0 -0
  207. data/test/dummy/tmp/cache/assets/development/sprockets/50dea07ea281a8cbea66d410c600a2ff +0 -0
  208. data/test/dummy/tmp/cache/assets/development/sprockets/5629567743085156cc027749c19c1ffb +0 -0
  209. data/test/dummy/tmp/cache/assets/development/sprockets/56bc640a0f9583792c60571e60eddae5 +0 -0
  210. data/test/dummy/tmp/cache/assets/development/sprockets/5d8aa60f935c97dcad777bcd7b918e91 +0 -0
  211. data/test/dummy/tmp/cache/assets/development/sprockets/61049b8df6c1b633546ac4d6b352977e +0 -0
  212. data/test/dummy/tmp/cache/assets/development/sprockets/69770d4ab285a55d14293db680d92d76 +0 -0
  213. data/test/dummy/tmp/cache/assets/development/sprockets/720375e2e5e9dbdd1d2596eb6f4ffea2 +0 -0
  214. data/test/dummy/tmp/cache/assets/development/sprockets/7403249712f49d78cd3a754390ee69d6 +0 -0
  215. data/test/dummy/tmp/cache/assets/development/sprockets/7a356d0e966dd72c226bcf7135d06241 +0 -0
  216. data/test/dummy/tmp/cache/assets/development/sprockets/7c653abf8262bcbff815599a9d6eb6bc +0 -0
  217. data/test/dummy/tmp/cache/assets/development/sprockets/8940a3fa55913c130433eaf2b1147b8a +0 -0
  218. data/test/dummy/tmp/cache/assets/development/sprockets/8ab512c9b33ac90e699b73469d71f061 +0 -0
  219. data/test/dummy/tmp/cache/assets/development/sprockets/8eda70465594d269ff72217d71e139f7 +0 -0
  220. data/test/dummy/tmp/cache/assets/development/sprockets/92f86cdf28d08db9f59aa10f2eb19a6e +0 -0
  221. data/test/dummy/tmp/cache/assets/development/sprockets/9b033013c82fee3eadfd068f18eb5fde +0 -0
  222. data/test/dummy/tmp/cache/assets/development/sprockets/a42a698569fb032e296fd80b809d31e1 +0 -0
  223. data/test/dummy/tmp/cache/assets/development/sprockets/a4d0dcd6736789a4e61a05c0b0d4f6d8 +0 -0
  224. data/test/dummy/tmp/cache/assets/development/sprockets/b2e65f0fccfa235b5d60262df3e10aae +0 -0
  225. data/test/dummy/tmp/cache/assets/development/sprockets/b48b23ce9dee63a2449cc13d923a587e +0 -0
  226. data/test/dummy/tmp/cache/assets/development/sprockets/bafa439ba35a0831ed26638af2634282 +0 -0
  227. data/test/dummy/tmp/cache/assets/development/sprockets/bb06a5a9c23f9fedeb77029977958bed +0 -0
  228. data/test/dummy/tmp/cache/assets/development/sprockets/bcca522c6302f184f12fe0e8a7d7e71a +0 -0
  229. data/test/dummy/tmp/cache/assets/development/sprockets/c13fc73ceafa45876a901b3e775b83ae +0 -0
  230. data/test/dummy/tmp/cache/assets/development/sprockets/c1539958d8d5f93bfaad4f3cc9d21047 +0 -0
  231. data/test/dummy/tmp/cache/assets/development/sprockets/c99fb99f69104b46f747c743409df324 +0 -0
  232. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  233. data/test/dummy/tmp/cache/assets/development/sprockets/d2c64b08d25425455b7d9d66e142fa0b +0 -0
  234. data/test/dummy/tmp/cache/assets/development/sprockets/d5a46b2a46d7423c5287fc57e24aba11 +0 -0
  235. data/test/dummy/tmp/cache/assets/development/sprockets/d5e8ebed7a8e96a30f28d4b06fa5a6c4 +0 -0
  236. data/test/dummy/tmp/cache/assets/development/sprockets/d6f08cc14c885cf7a55e95ed54172a89 +0 -0
  237. data/test/dummy/tmp/cache/assets/development/sprockets/dab5e3951e6d81b6edca28eb6c66964c +0 -0
  238. data/test/dummy/tmp/cache/assets/development/sprockets/db8ec0c14f31d98a8ceb8365ade470e6 +0 -0
  239. data/test/dummy/tmp/cache/assets/development/sprockets/ee91e123536718a81d5d676d83f421c4 +0 -0
  240. data/test/dummy/tmp/cache/assets/development/sprockets/f2ad9aef860b7792f7542318c4731fe0 +0 -0
  241. data/test/dummy/tmp/cache/assets/development/sprockets/f62fbf566f3d7493edb2d257079b377a +0 -0
  242. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  243. data/test/dummy/tmp/cache/assets/development/sprockets/f8f634cf3fb2563597257d30d0cc25fc +0 -0
  244. data/test/dummy/tmp/cache/assets/development/sprockets/fc1c8dd76249106a788624558da20062 +0 -0
  245. data/test/dummy/tmp/cache/assets/development/sprockets/fff835239214e2c684bd8ff954854862 +0 -0
  246. data/test/test_helper.rb +16 -0
  247. metadata +558 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f9ff47d919377d27c92add43fea84e923e9d4aae
4
+ data.tar.gz: b1f33ef2c07de48cf3a423863c7ef00e5559db8f
5
+ SHA512:
6
+ metadata.gz: bd34548871bec34c6d3e73e5a1ff819b1a61f59032574a098cb2caef206aa16692b2084f0d3c52bdc48eb12231f3e835e3b958c2b9e7c057a9a277065e99f9af
7
+ data.tar.gz: b45f6b531d1abd6b589e5f04e03f0bc9cc27656c71d42dbb35165c87cbdd902a04221cbf3de8f12026458a0b4355550a4567a75a7209182149716348a68b6cce
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2014 Max Ivak
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Bootstrap3AutocompleteInput'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+ Bundler::GemHelper.install_tasks
21
+
22
+ require 'rake/testtask'
23
+
24
+ Rake::TestTask.new(:test) do |t|
25
+ t.libs << 'lib'
26
+ t.libs << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = false
29
+ end
30
+
31
+
32
+ task default: :test
@@ -0,0 +1,65 @@
1
+ class AutocompleteInput < SimpleForm::Inputs::TextInput
2
+ #enable :placeholder, :maxlength
3
+
4
+ def input(wrapper_options = nil)
5
+ out = ActiveSupport::SafeBuffer.new
6
+
7
+ # prepare options
8
+ new_html_options = merge_wrapper_options(prepare_html_options, wrapper_options)
9
+
10
+
11
+ # hidden field
12
+ if add_field_id?
13
+ hidden_name = "#{attribute_name}_id"
14
+ hidden_id = "#{object_name}_#{attribute_name}_id"
15
+ new_html_options["data-field-id"] ||= hidden_id
16
+
17
+ hidden_options = {}
18
+ hidden_options[:id] = hidden_id
19
+
20
+ # value
21
+ value_method = hidden_options[:id]
22
+ if object.respond_to?(value_method)
23
+ hidden_options[:value] = object.send(value_method)
24
+ end
25
+
26
+ out << @builder.hidden_field(hidden_name, hidden_options)
27
+ end
28
+
29
+ #
30
+ out << @builder.text_field(attribute_name, new_html_options)
31
+ out
32
+ end
33
+
34
+ def prepare_html_options
35
+ new_options = {}
36
+
37
+ new_options[:class] = [input_html_options[:class], options[:class]].compact
38
+
39
+ #
40
+ new_options["data-provide"] ||= "typeahead"
41
+ new_options["autocomplete"] ||= "off"
42
+
43
+ # source
44
+ if options[:source]
45
+ new_options["data-source"] = options[:source]
46
+ elsif options[:source_query]
47
+ new_options["data-source-query"] = options[:source_query]
48
+ elsif options[:source_array]
49
+ #new_options["data-source-array"] = options[:source_array].inspect.to_s # problem with quotes "
50
+ new_options["data-source-array"] = '['+options[:source_array].map{|r| "&quot;#{r}&quot;"}.join(',')+']'
51
+ end
52
+
53
+
54
+ # data options
55
+ new_options["data-items"] = options[:items] || 8
56
+ new_options["data-min-length"] = options[:minLength] || 1
57
+
58
+ input_html_options.merge new_options
59
+ end
60
+
61
+ def add_field_id?
62
+ !options[:source_array] && (options[:field_id].nil? || options[:field_id])
63
+ end
64
+ end
65
+
@@ -0,0 +1,87 @@
1
+ var autocomplete_data_static = {};
2
+
3
+ $(document).ready(function() {
4
+
5
+ // local array
6
+ $( 'input[data-provide="typeahead"][data-source-array]' ).each(function() {
7
+ obj = $(this);
8
+ var arr = JSON.parse(obj.attr('data-source-array').replace(/&quot;/g, '"'));
9
+
10
+ obj.typeahead({
11
+ source: arr
12
+ , items: obj.attr('data-items')
13
+ , minLength: obj.attr('data-min-length')
14
+ });//typeahead
15
+ });
16
+
17
+
18
+ // static data from server
19
+ $( 'input[data-provide="typeahead"][data-source]' ).each(function() {
20
+ obj = $(this);
21
+ var name = obj.attr('id');
22
+ autocomplete_data_static[name] = {"map":[], "values": []};
23
+
24
+ $.get(obj.attr('data-source'), function(data){
25
+ $.each(data, function (i, row) {
26
+ autocomplete_data_static[name]["values"].push(row[1]);
27
+ autocomplete_data_static[name]["map"][row[1]]=row[0];
28
+ });
29
+
30
+ obj.typeahead({
31
+ source: autocomplete_data_static[name]["values"]
32
+ , updater: function (item) {
33
+ // save the id value the hidden field
34
+ obj_id = $('#'+obj.attr("data-field-id"));
35
+ if (obj_id)
36
+ obj_id.val(autocomplete_data_static[name]["map"][item]);
37
+
38
+ return item;
39
+ }
40
+ , items: obj.attr('data-items')
41
+ , minLength: obj.attr('data-min-length')
42
+ });//typeahead
43
+ },
44
+ 'json'
45
+ );//get
46
+ });
47
+
48
+
49
+ // query data from server
50
+ $('input[data-provide="typeahead"][data-source-query]').each(function() {
51
+ obj = $(this);
52
+
53
+ obj.typeahead({
54
+ source: function (q, process) {
55
+ obj = this.$element;
56
+ rows = [];
57
+
58
+ var name = obj.attr('name');
59
+ autocomplete_data_static[name] = {"map":[], "values": []};
60
+
61
+ // load data from remote server
62
+ $.getJSON( obj.attr('data-source-query'), {q: q},
63
+ function( data ) {
64
+ $.each(data, function (i, row) {
65
+ autocomplete_data_static[name]["values"].push(row[1]);
66
+ autocomplete_data_static[name]["map"][row[1]]=row[0];
67
+ });
68
+ process(autocomplete_data_static[name]["values"]);
69
+ }
70
+ );// get json
71
+ }//source
72
+ , updater: function (item) {
73
+ obj = this.$element;
74
+ var name = obj.attr('name');
75
+ // save the id value the hidden field
76
+ obj_id = $('#'+obj.attr("data-field-id"));
77
+ if (obj_id)
78
+ obj_id.val(autocomplete_data_static[name]["map"][item]);
79
+
80
+ return item;
81
+ }
82
+ , items: obj.attr('data-items')
83
+ , minLength: obj.attr('data-min-length')
84
+ });// typeahead
85
+ });// each
86
+
87
+ });
@@ -0,0 +1 @@
1
+ var autocomplete_data_static={};$(document).ready(function(){$('input[data-provide="typeahead"][data-source-array]').each(function(){obj=$(this);var e=JSON.parse(obj.attr("data-source-array").replace(/&quot;/g,'"'));obj.typeahead({source:e,items:obj.attr("data-items"),minLength:obj.attr("data-min-length")})});$('input[data-provide="typeahead"][data-source]').each(function(){obj=$(this);var e=obj.attr("id");autocomplete_data_static[e]={map:[],values:[]};$.get(obj.attr("data-source"),function(t){$.each(t,function(t,n){autocomplete_data_static[e]["values"].push(n[1]);autocomplete_data_static[e]["map"][n[1]]=n[0]});obj.typeahead({source:autocomplete_data_static[e]["values"],updater:function(t){obj_id=$("#"+obj.attr("data-field-id"));if(obj_id)obj_id.val(autocomplete_data_static[e]["map"][t]);return t},items:obj.attr("data-items"),minLength:obj.attr("data-min-length")})},"json")});$('input[data-provide="typeahead"][data-source-query]').each(function(){obj=$(this);obj.typeahead({source:function(e,t){obj=this.$element;rows=[];var n=obj.attr("name");autocomplete_data_static[n]={map:[],values:[]};$.getJSON(obj.attr("data-source-query"),{q:e},function(e){$.each(e,function(e,t){autocomplete_data_static[n]["values"].push(t[1]);autocomplete_data_static[n]["map"][t[1]]=t[0]});t(autocomplete_data_static[n]["values"])})},updater:function(e){obj=this.$element;var t=obj.attr("name");obj_id=$("#"+obj.attr("data-field-id"));if(obj_id)obj_id.val(autocomplete_data_static[t]["map"][e]);return e},items:obj.attr("data-items"),minLength:obj.attr("data-min-length")})})})
@@ -0,0 +1,476 @@
1
+ /* =============================================================
2
+ * bootstrap3-typeahead.js v3.1.0
3
+ * https://github.com/bassjobsen/Bootstrap-3-Typeahead
4
+ * =============================================================
5
+ * Original written by @mdo and @fat
6
+ * =============================================================
7
+ * Copyright 2014 Bass Jobsen @bassjobsen
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the 'License');
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an 'AS IS' BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ * ============================================================ */
21
+
22
+
23
+ (function (root, factory) {
24
+
25
+ 'use strict';
26
+
27
+ // CommonJS module is defined
28
+ if (typeof module !== 'undefined' && module.exports) {
29
+ module.exports = factory(require('jquery'));
30
+ }
31
+ // AMD module is defined
32
+ else if (typeof define === 'function' && define.amd) {
33
+ define(['jquery'], function ($) {
34
+ return factory ($);
35
+ });
36
+ } else {
37
+ factory(root.jQuery);
38
+ }
39
+
40
+ }(this, function ($) {
41
+
42
+ 'use strict';
43
+ // jshint laxcomma: true
44
+
45
+
46
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
47
+ * ================================= */
48
+
49
+ var Typeahead = function (element, options) {
50
+ this.$element = $(element);
51
+ this.options = $.extend({}, $.fn.typeahead.defaults, options);
52
+ this.matcher = this.options.matcher || this.matcher;
53
+ this.sorter = this.options.sorter || this.sorter;
54
+ this.select = this.options.select || this.select;
55
+ this.autoSelect = typeof this.options.autoSelect == 'boolean' ? this.options.autoSelect : true;
56
+ this.highlighter = this.options.highlighter || this.highlighter;
57
+ this.render = this.options.render || this.render;
58
+ this.updater = this.options.updater || this.updater;
59
+ this.displayText = this.options.displayText || this.displayText;
60
+ this.source = this.options.source;
61
+ this.delay = this.options.delay;
62
+ this.$menu = $(this.options.menu);
63
+ this.$appendTo = this.options.appendTo ? $(this.options.appendTo) : null;
64
+ this.shown = false;
65
+ this.listen();
66
+ this.showHintOnFocus = typeof this.options.showHintOnFocus == 'boolean' ? this.options.showHintOnFocus : false;
67
+ this.afterSelect = this.options.afterSelect;
68
+ this.addItem = false;
69
+ };
70
+
71
+ Typeahead.prototype = {
72
+
73
+ constructor: Typeahead,
74
+
75
+ select: function () {
76
+ var val = this.$menu.find('.active').data('value');
77
+ this.$element.data('active', val);
78
+ if(this.autoSelect || val) {
79
+ var newVal = this.updater(val);
80
+ this.$element
81
+ .val(this.displayText(newVal) || newVal)
82
+ .change();
83
+ this.afterSelect(newVal);
84
+ }
85
+ return this.hide();
86
+ },
87
+
88
+ updater: function (item) {
89
+ return item;
90
+ },
91
+
92
+ setSource: function (source) {
93
+ this.source = source;
94
+ },
95
+
96
+ show: function () {
97
+ var pos = $.extend({}, this.$element.position(), {
98
+ height: this.$element[0].offsetHeight
99
+ }), scrollHeight;
100
+
101
+ scrollHeight = typeof this.options.scrollHeight == 'function' ?
102
+ this.options.scrollHeight.call() :
103
+ this.options.scrollHeight;
104
+
105
+ (this.$appendTo ? this.$menu.appendTo(this.$appendTo) : this.$menu.insertAfter(this.$element))
106
+ .css({
107
+ top: pos.top + pos.height + scrollHeight
108
+ , left: pos.left
109
+ })
110
+ .show();
111
+
112
+ this.shown = true;
113
+ return this;
114
+ },
115
+
116
+ hide: function () {
117
+ this.$menu.hide();
118
+ this.shown = false;
119
+ return this;
120
+ },
121
+
122
+ lookup: function (query) {
123
+ var items;
124
+ if (typeof(query) != 'undefined' && query !== null) {
125
+ this.query = query;
126
+ } else {
127
+ this.query = this.$element.val() || '';
128
+ }
129
+
130
+ if (this.query.length < this.options.minLength) {
131
+ return this.shown ? this.hide() : this;
132
+ }
133
+
134
+ var worker = $.proxy(function() {
135
+
136
+ if($.isFunction(this.source)) this.source(this.query, $.proxy(this.process, this));
137
+ else if (this.source) {
138
+ this.process(this.source);
139
+ }
140
+ }, this);
141
+
142
+ clearTimeout(this.lookupWorker);
143
+ this.lookupWorker = setTimeout(worker, this.delay);
144
+ },
145
+
146
+ process: function (items) {
147
+ var that = this;
148
+
149
+ items = $.grep(items, function (item) {
150
+ return that.matcher(item);
151
+ });
152
+
153
+ items = this.sorter(items);
154
+
155
+ if (!items.length && !this.options.addItem) {
156
+ return this.shown ? this.hide() : this;
157
+ }
158
+
159
+ if (items.length > 0) {
160
+ this.$element.data('active', items[0]);
161
+ } else {
162
+ this.$element.data('active', null);
163
+ }
164
+
165
+ // Add item
166
+ if (this.options.addItem){
167
+ items.push(this.options.addItem);
168
+ }
169
+
170
+ if (this.options.items == 'all') {
171
+ return this.render(items).show();
172
+ } else {
173
+ return this.render(items.slice(0, this.options.items)).show();
174
+ }
175
+ },
176
+
177
+ matcher: function (item) {
178
+ var it = this.displayText(item);
179
+ return ~it.toLowerCase().indexOf(this.query.toLowerCase());
180
+ },
181
+
182
+ sorter: function (items) {
183
+ var beginswith = []
184
+ , caseSensitive = []
185
+ , caseInsensitive = []
186
+ , item;
187
+
188
+ while ((item = items.shift())) {
189
+ var it = this.displayText(item);
190
+ if (!it.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item);
191
+ else if (~it.indexOf(this.query)) caseSensitive.push(item);
192
+ else caseInsensitive.push(item);
193
+ }
194
+
195
+ return beginswith.concat(caseSensitive, caseInsensitive);
196
+ },
197
+
198
+ highlighter: function (item) {
199
+ var html = $('<div></div>');
200
+ var query = this.query;
201
+ var i = item.toLowerCase().indexOf(query.toLowerCase());
202
+ var len, leftPart, middlePart, rightPart, strong;
203
+ len = query.length;
204
+ if(len === 0){
205
+ return html.text(item).html();
206
+ }
207
+ while (i > -1) {
208
+ leftPart = item.substr(0, i);
209
+ middlePart = item.substr(i, len);
210
+ rightPart = item.substr(i + len);
211
+ strong = $('<strong></strong>').text(middlePart);
212
+ html
213
+ .append(document.createTextNode(leftPart))
214
+ .append(strong);
215
+ item = rightPart;
216
+ i = item.toLowerCase().indexOf(query.toLowerCase());
217
+ }
218
+ return html.append(document.createTextNode(item)).html();
219
+ },
220
+
221
+ render: function (items) {
222
+ var that = this;
223
+ var self = this;
224
+ var activeFound = false;
225
+ items = $(items).map(function (i, item) {
226
+ var text = self.displayText(item);
227
+ i = $(that.options.item).data('value', item);
228
+ i.find('a').html(that.highlighter(text));
229
+ if (text == self.$element.val()) {
230
+ i.addClass('active');
231
+ self.$element.data('active', item);
232
+ activeFound = true;
233
+ }
234
+ return i[0];
235
+ });
236
+
237
+ if (this.autoSelect && !activeFound) {
238
+ items.first().addClass('active');
239
+ this.$element.data('active', items.first().data('value'));
240
+ }
241
+ this.$menu.html(items);
242
+ return this;
243
+ },
244
+
245
+ displayText: function(item) {
246
+ return item.name || item;
247
+ },
248
+
249
+ next: function (event) {
250
+ var active = this.$menu.find('.active').removeClass('active')
251
+ , next = active.next();
252
+
253
+ if (!next.length) {
254
+ next = $(this.$menu.find('li')[0]);
255
+ }
256
+
257
+ next.addClass('active');
258
+ },
259
+
260
+ prev: function (event) {
261
+ var active = this.$menu.find('.active').removeClass('active')
262
+ , prev = active.prev();
263
+
264
+ if (!prev.length) {
265
+ prev = this.$menu.find('li').last();
266
+ }
267
+
268
+ prev.addClass('active');
269
+ },
270
+
271
+ listen: function () {
272
+ this.$element
273
+ .on('focus', $.proxy(this.focus, this))
274
+ .on('blur', $.proxy(this.blur, this))
275
+ .on('keypress', $.proxy(this.keypress, this))
276
+ .on('keyup', $.proxy(this.keyup, this));
277
+
278
+ if (this.eventSupported('keydown')) {
279
+ this.$element.on('keydown', $.proxy(this.keydown, this));
280
+ }
281
+
282
+ this.$menu
283
+ .on('click', $.proxy(this.click, this))
284
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
285
+ .on('mouseleave', 'li', $.proxy(this.mouseleave, this));
286
+ },
287
+
288
+ destroy : function () {
289
+ this.$element.data('typeahead',null);
290
+ this.$element.data('active',null);
291
+ this.$element
292
+ .off('focus')
293
+ .off('blur')
294
+ .off('keypress')
295
+ .off('keyup');
296
+
297
+ if (this.eventSupported('keydown')) {
298
+ this.$element.off('keydown');
299
+ }
300
+
301
+ this.$menu.remove();
302
+ },
303
+
304
+ eventSupported: function(eventName) {
305
+ var isSupported = eventName in this.$element;
306
+ if (!isSupported) {
307
+ this.$element.setAttribute(eventName, 'return;');
308
+ isSupported = typeof this.$element[eventName] === 'function';
309
+ }
310
+ return isSupported;
311
+ },
312
+
313
+ move: function (e) {
314
+ if (!this.shown) return;
315
+
316
+ switch(e.keyCode) {
317
+ case 9: // tab
318
+ case 13: // enter
319
+ case 27: // escape
320
+ e.preventDefault();
321
+ break;
322
+
323
+ case 38: // up arrow
324
+ // with the shiftKey (this is actually the left parenthesis)
325
+ if (e.shiftKey) return;
326
+ e.preventDefault();
327
+ this.prev();
328
+ break;
329
+
330
+ case 40: // down arrow
331
+ // with the shiftKey (this is actually the right parenthesis)
332
+ if (e.shiftKey) return;
333
+ e.preventDefault();
334
+ this.next();
335
+ break;
336
+ }
337
+
338
+ e.stopPropagation();
339
+ },
340
+
341
+ keydown: function (e) {
342
+ this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]);
343
+ if (!this.shown && e.keyCode == 40) {
344
+ this.lookup();
345
+ } else {
346
+ this.move(e);
347
+ }
348
+ },
349
+
350
+ keypress: function (e) {
351
+ if (this.suppressKeyPressRepeat) return;
352
+ this.move(e);
353
+ },
354
+
355
+ keyup: function (e) {
356
+ switch(e.keyCode) {
357
+ case 40: // down arrow
358
+ case 38: // up arrow
359
+ case 16: // shift
360
+ case 17: // ctrl
361
+ case 18: // alt
362
+ break;
363
+
364
+ case 9: // tab
365
+ case 13: // enter
366
+ if (!this.shown) return;
367
+ this.select();
368
+ break;
369
+
370
+ case 27: // escape
371
+ if (!this.shown) return;
372
+ this.hide();
373
+ break;
374
+ default:
375
+ this.lookup();
376
+ }
377
+
378
+ e.stopPropagation();
379
+ e.preventDefault();
380
+ },
381
+
382
+ focus: function (e) {
383
+ if (!this.focused) {
384
+ this.focused = true;
385
+ if (this.options.showHintOnFocus) {
386
+ this.lookup('');
387
+ }
388
+ }
389
+ },
390
+
391
+ blur: function (e) {
392
+ this.focused = false;
393
+ if (!this.mousedover && this.shown) this.hide();
394
+ },
395
+
396
+ click: function (e) {
397
+ e.stopPropagation();
398
+ e.preventDefault();
399
+ this.select();
400
+ this.$element.focus();
401
+ },
402
+
403
+ mouseenter: function (e) {
404
+ this.mousedover = true;
405
+ this.$menu.find('.active').removeClass('active');
406
+ $(e.currentTarget).addClass('active');
407
+ },
408
+
409
+ mouseleave: function (e) {
410
+ this.mousedover = false;
411
+ if (!this.focused && this.shown) this.hide();
412
+ }
413
+
414
+ };
415
+
416
+
417
+ /* TYPEAHEAD PLUGIN DEFINITION
418
+ * =========================== */
419
+
420
+ var old = $.fn.typeahead;
421
+
422
+ $.fn.typeahead = function (option) {
423
+ var arg = arguments;
424
+ if (typeof option == 'string' && option == 'getActive') {
425
+ return this.data('active');
426
+ }
427
+ return this.each(function () {
428
+ var $this = $(this)
429
+ , data = $this.data('typeahead')
430
+ , options = typeof option == 'object' && option;
431
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)));
432
+ if (typeof option == 'string') {
433
+ if (arg.length > 1) {
434
+ data[option].apply(data, Array.prototype.slice.call(arg ,1));
435
+ } else {
436
+ data[option]();
437
+ }
438
+ }
439
+ });
440
+ };
441
+
442
+ $.fn.typeahead.defaults = {
443
+ source: []
444
+ , items: 8
445
+ , menu: '<ul class="typeahead dropdown-menu" role="listbox"></ul>'
446
+ , item: '<li><a href="#" role="option"></a></li>'
447
+ , minLength: 1
448
+ , scrollHeight: 0
449
+ , autoSelect: true
450
+ , afterSelect: $.noop
451
+ , addItem: false
452
+ , delay: 0
453
+ };
454
+
455
+ $.fn.typeahead.Constructor = Typeahead;
456
+
457
+
458
+ /* TYPEAHEAD NO CONFLICT
459
+ * =================== */
460
+
461
+ $.fn.typeahead.noConflict = function () {
462
+ $.fn.typeahead = old;
463
+ return this;
464
+ };
465
+
466
+
467
+ /* TYPEAHEAD DATA-API
468
+ * ================== */
469
+
470
+ $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
471
+ var $this = $(this);
472
+ if ($this.data('typeahead')) return;
473
+ $this.typeahead($this.data());
474
+ });
475
+
476
+ }));