coalla-cms 0.4.2.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 (300) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +81 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +168 -0
  5. data/Rakefile +29 -0
  6. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.eot +0 -0
  7. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.svg +229 -0
  8. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.ttf +0 -0
  9. data/app/assets/fonts/glyphicons/glyphicons-halflings-regular.woff +0 -0
  10. data/app/assets/images/ajax-loader.gif +0 -0
  11. data/app/assets/images/blank.gif +0 -0
  12. data/app/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  13. data/app/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  14. data/app/assets/javascripts/admin/admin.js +295 -0
  15. data/app/assets/javascripts/admin/custom_admin.js +0 -0
  16. data/app/assets/javascripts/admin/jquery-migrate.min.js +2 -0
  17. data/app/assets/javascripts/admin/photo_uploader.js +67 -0
  18. data/app/assets/javascripts/admin/vendor/bootstrap.min.js +7 -0
  19. data/app/assets/javascripts/admin/vendor/jquery-ui-timepicker-addon-ru.js +40 -0
  20. data/app/assets/javascripts/admin/vendor/jquery.tagsinput.js +365 -0
  21. data/app/assets/javascripts/admin/vendor/jquery.tokeninput.patched.js +875 -0
  22. data/app/assets/javascripts/admin/vendor/underscore-min.js +5 -0
  23. data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +209 -0
  24. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  25. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  26. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +64 -0
  27. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/LICENSE.txt +303 -0
  28. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad-gallery-css-diff.htm +831 -0
  29. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_next.png +0 -0
  30. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_prev.png +0 -0
  31. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_back.png +0 -0
  32. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_forward.png +0 -0
  33. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.css +185 -0
  34. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.js +984 -0
  35. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min - ref.js +10 -0
  36. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min.js +1 -0
  37. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/loader.gif +0 -0
  38. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/opa75.png +0 -0
  39. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/placeholder.png +0 -0
  40. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/ad-gallery/trans.gif +0 -0
  41. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/blank.gif +0 -0
  42. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading.gif +0 -0
  43. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading@2x.gif +0 -0
  44. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_overlay.png +0 -0
  45. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite.png +0 -0
  46. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite@2x.png +0 -0
  47. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/fancybox_buttons.png +0 -0
  48. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.css +97 -0
  49. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.js +122 -0
  50. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-media.js +199 -0
  51. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.css +55 -0
  52. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.js +162 -0
  53. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.css +274 -0
  54. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.js +2020 -0
  55. data/app/assets/javascripts/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.pack.js +46 -0
  56. data/app/assets/javascripts/ckeditor/plugins/slideshow/README.md +66 -0
  57. data/app/assets/javascripts/ckeditor/plugins/slideshow/dialogs/slideshow.js +1396 -0
  58. data/app/assets/javascripts/ckeditor/plugins/slideshow/dialogs/slideshow.min.js +1 -0
  59. data/app/assets/javascripts/ckeditor/plugins/slideshow/icons/placeholder.png +0 -0
  60. data/app/assets/javascripts/ckeditor/plugins/slideshow/icons/slideshow.png +0 -0
  61. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/Serbian_translation.txt +9 -0
  62. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/el.js +37 -0
  63. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/en.js +35 -0
  64. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/fr.js +35 -0
  65. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/ru.js +35 -0
  66. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/sr-latn.js +35 -0
  67. data/app/assets/javascripts/ckeditor/plugins/slideshow/lang/sr.js +35 -0
  68. data/app/assets/javascripts/ckeditor/plugins/slideshow/plugin.js +217 -0
  69. data/app/assets/stylesheets/admin/admin.scss +302 -0
  70. data/app/assets/stylesheets/admin/custom_admin.scss +1 -0
  71. data/app/assets/stylesheets/admin/vendor/bootstrap.min.css +14 -0
  72. data/app/assets/stylesheets/admin/vendor/jquery.tagsinput.css +99 -0
  73. data/app/assets/stylesheets/admin/vendor/token-input-facebook.patched.css +126 -0
  74. data/app/assets/stylesheets/admin/vendor/token-input.patched.css +116 -0
  75. data/app/controllers/admin/autocomplete_controller.rb +14 -0
  76. data/app/controllers/admin/image_upload_controller.rb +27 -0
  77. data/app/controllers/admin/lookups_controller.rb +47 -0
  78. data/app/controllers/admin/sortable_controller.rb +26 -0
  79. data/app/controllers/concerns/admin/path_history.rb +39 -0
  80. data/app/helpers/admin/search_helper.rb +59 -0
  81. data/app/helpers/admin_helper.rb +29 -0
  82. data/app/helpers/common_helper.rb +16 -0
  83. data/app/helpers/lookup_helper.rb +45 -0
  84. data/app/helpers/nested_fields_helper.rb +12 -0
  85. data/app/helpers/static_text_formatter.rb +25 -0
  86. data/app/helpers/twitter_builder_helper.rb +253 -0
  87. data/app/helpers/twitter_form_builder.rb +196 -0
  88. data/app/models/file_upload.rb +19 -0
  89. data/app/models/lookup.rb +6 -0
  90. data/app/uploaders/file_uploader.rb +10 -0
  91. data/app/uploaders/generic_image_uploader.rb +74 -0
  92. data/app/utils/admin_structure.rb +67 -0
  93. data/app/utils/bootstrap_link_renderer.rb +40 -0
  94. data/app/utils/table_helpers.rb +196 -0
  95. data/app/views/admin/base/_sort.haml +34 -0
  96. data/app/views/admin/common/_file_upload_template.haml +14 -0
  97. data/app/views/admin/common/_header.html.haml +27 -0
  98. data/app/views/admin/common/_image_upload_template.html.haml +40 -0
  99. data/app/views/admin/common/_menu.html.haml +2 -0
  100. data/app/views/admin/common/_menu_section.haml +10 -0
  101. data/app/views/admin/common/_menu_separator.haml +1 -0
  102. data/app/views/admin/common/_nested_fields_for.html.haml +5 -0
  103. data/app/views/admin/common/_nested_fields_for_element.html.haml +5 -0
  104. data/app/views/admin/common/_slide.haml +41 -0
  105. data/app/views/admin/common/_slides.html.haml +17 -0
  106. data/app/views/admin/common/_table_template.html.haml +14 -0
  107. data/app/views/admin/common/_upload_form.html.haml +5 -0
  108. data/app/views/admin/common/image_uploaded.js.haml +7 -0
  109. data/app/views/admin/common/upload_failed.js.erb +11 -0
  110. data/app/views/admin/common/upload_image.js.erb +6 -0
  111. data/app/views/admin/home/dashboard.html.haml +5 -0
  112. data/app/views/admin/lookups/_form.html.haml +16 -0
  113. data/app/views/admin/lookups/edit.html.haml +5 -0
  114. data/app/views/admin/lookups/index.html.haml +6 -0
  115. data/app/views/layouts/admin.html.haml +38 -0
  116. data/app/views/structure/_section.haml +16 -0
  117. data/coalla-cms.gemspec +39 -0
  118. data/config/locales/devise.ru.yml +59 -0
  119. data/config/locales/will_paginate.ru.yml +6 -0
  120. data/lib/coalla/cms/engine.rb +16 -0
  121. data/lib/coalla/cms/version.rb +5 -0
  122. data/lib/coalla/ext/mapper.rb +14 -0
  123. data/lib/coalla/orm/page_slider.rb +53 -0
  124. data/lib/coalla/orm/relation.rb +32 -0
  125. data/lib/coalla/orm/sanitized.rb +16 -0
  126. data/lib/coalla/sanitize/config/default.rb +526 -0
  127. data/lib/coalla-cms.rb +16 -0
  128. data/lib/generators/coalla/cms/create_admin_generator.rb +50 -0
  129. data/lib/generators/coalla/cms/create_admin_login_view_generator.rb +23 -0
  130. data/lib/generators/coalla/cms/file_uploads/install_generator.rb +35 -0
  131. data/lib/generators/coalla/cms/file_uploads/mount_generator.rb +34 -0
  132. data/lib/generators/coalla/cms/file_uploads/templates/add_column_migration.rb.erb +5 -0
  133. data/lib/generators/coalla/cms/file_uploads/templates/migration.rb +17 -0
  134. data/lib/generators/coalla/cms/image/install_generator.rb +39 -0
  135. data/lib/generators/coalla/cms/image/mount_generator.rb +50 -0
  136. data/lib/generators/coalla/cms/image/templates/migration.rb.erb +9 -0
  137. data/lib/generators/coalla/cms/image/templates/model.rb.erb +5 -0
  138. data/lib/generators/coalla/cms/image/templates/mount/migration.rb.erb +6 -0
  139. data/lib/generators/coalla/cms/image/templates/mount/uploader.rb.erb +3 -0
  140. data/lib/generators/coalla/cms/image/templates/uploader.rb.erb +3 -0
  141. data/lib/generators/coalla/cms/init_generator.rb +113 -0
  142. data/lib/generators/coalla/cms/lookups/install_generator.rb +43 -0
  143. data/lib/generators/coalla/cms/lookups/templates/migration.rb +13 -0
  144. data/lib/generators/coalla/cms/market/install_generator.rb +71 -0
  145. data/lib/generators/coalla/cms/market/templates/controllers/categories_controller.rb +47 -0
  146. data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +50 -0
  147. data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +59 -0
  148. data/lib/generators/coalla/cms/market/templates/market.rb +5 -0
  149. data/lib/generators/coalla/cms/market/templates/market.ru.yml +53 -0
  150. data/lib/generators/coalla/cms/market/templates/migrations/create_categories.rb +15 -0
  151. data/lib/generators/coalla/cms/market/templates/migrations/create_product_properties.rb +18 -0
  152. data/lib/generators/coalla/cms/market/templates/migrations/create_products.rb +18 -0
  153. data/lib/generators/coalla/cms/market/templates/migrations/create_properties.rb +11 -0
  154. data/lib/generators/coalla/cms/market/templates/models/category.rb +36 -0
  155. data/lib/generators/coalla/cms/market/templates/models/product.rb +16 -0
  156. data/lib/generators/coalla/cms/market/templates/models/product_property.rb +14 -0
  157. data/lib/generators/coalla/cms/market/templates/models/property.rb +7 -0
  158. data/lib/generators/coalla/cms/market/templates/views/categories/_form.html.haml +10 -0
  159. data/lib/generators/coalla/cms/market/templates/views/categories/edit.html.haml +5 -0
  160. data/lib/generators/coalla/cms/market/templates/views/categories/index.html.haml +17 -0
  161. data/lib/generators/coalla/cms/market/templates/views/categories/new.html.haml +4 -0
  162. data/lib/generators/coalla/cms/market/templates/views/products/_form.html.haml +17 -0
  163. data/lib/generators/coalla/cms/market/templates/views/products/_product_property_fields.html.haml +13 -0
  164. data/lib/generators/coalla/cms/market/templates/views/products/edit.html.haml +5 -0
  165. data/lib/generators/coalla/cms/market/templates/views/products/index.html.haml +17 -0
  166. data/lib/generators/coalla/cms/market/templates/views/products/new.html.haml +4 -0
  167. data/lib/generators/coalla/cms/market/templates/views/properties/_form.html.haml +9 -0
  168. data/lib/generators/coalla/cms/market/templates/views/properties/edit.html.haml +5 -0
  169. data/lib/generators/coalla/cms/market/templates/views/properties/index.html.haml +15 -0
  170. data/lib/generators/coalla/cms/market/templates/views/properties/new.html.haml +4 -0
  171. data/lib/generators/coalla/cms/news/scaffold_generator.rb +50 -0
  172. data/lib/generators/coalla/cms/news/templates/entity.rb.erb +10 -0
  173. data/lib/generators/coalla/cms/news/templates/entity_controller_template.rb.erb +47 -0
  174. data/lib/generators/coalla/cms/news/templates/entity_image_uploader.rb.erb +7 -0
  175. data/lib/generators/coalla/cms/news/templates/migration.rb.erb +15 -0
  176. data/lib/generators/coalla/cms/news/templates/views/_form.haml.erb +16 -0
  177. data/lib/generators/coalla/cms/news/templates/views/edit.haml.erb +5 -0
  178. data/lib/generators/coalla/cms/news/templates/views/index.haml.erb +18 -0
  179. data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +5 -0
  180. data/lib/generators/coalla/cms/orm_helpers.rb +31 -0
  181. data/lib/generators/coalla/cms/scaffold_generator.rb +53 -0
  182. data/lib/generators/coalla/cms/scaffold_helper.rb +11 -0
  183. data/lib/generators/coalla/cms/setup_admin_generator.rb +60 -0
  184. data/lib/generators/coalla/cms/setup_routes_generator.rb +28 -0
  185. data/lib/generators/coalla/cms/slider/init_generator.rb +41 -0
  186. data/lib/generators/coalla/cms/slider/templates/migration.rb.erb +25 -0
  187. data/lib/generators/coalla/cms/slider/templates/slider_image.rb.erb +10 -0
  188. data/lib/generators/coalla/cms/slider/templates/slider_image_uploader.rb.erb +7 -0
  189. data/lib/generators/coalla/cms/slider/templates/slider_upload_controller.rb.erb +19 -0
  190. data/lib/generators/coalla/cms/templates/.gitattributes +4 -0
  191. data/lib/generators/coalla/cms/templates/.gitignore +86 -0
  192. data/lib/generators/coalla/cms/templates/activerecord.ru.yml +13 -0
  193. data/lib/generators/coalla/cms/templates/assets.rb +13 -0
  194. data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +35 -0
  195. data/lib/generators/coalla/cms/templates/controllers/admin/home_controller.rb.erb +6 -0
  196. data/lib/generators/coalla/cms/templates/controllers/admin/scaffold_controller_template.rb.erb +45 -0
  197. data/lib/generators/coalla/cms/templates/controllers/home_controller.rb.erb +6 -0
  198. data/lib/generators/coalla/cms/templates/database.yml.erb +35 -0
  199. data/lib/generators/coalla/cms/templates/devise.ru.yml +59 -0
  200. data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +51 -0
  201. data/lib/generators/coalla/cms/templates/migration.rb +11 -0
  202. data/lib/generators/coalla/cms/templates/migration_existing.rb +15 -0
  203. data/lib/generators/coalla/cms/templates/schedule.rb +3 -0
  204. data/lib/generators/coalla/cms/templates/structure.rb +0 -0
  205. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/_form.html.haml.erb +14 -0
  206. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +5 -0
  207. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/index.html.haml.erb +15 -0
  208. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +4 -0
  209. data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +19 -0
  210. data/lib/generators/coalla/cms/templates/views/home/index.html.haml.erb +1 -0
  211. data/lib/generators/coalla/cms/wysiwyg/ckeditor_generator.rb +17 -0
  212. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  213. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  214. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/mediaembed/plugin.js +64 -0
  215. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/LICENSE.txt +303 -0
  216. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad-gallery-css-diff.htm +831 -0
  217. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_next.png +0 -0
  218. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_prev.png +0 -0
  219. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_back.png +0 -0
  220. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/ad_scroll_forward.png +0 -0
  221. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.css +185 -0
  222. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.js +984 -0
  223. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min - ref.js +10 -0
  224. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/jquery.ad-gallery.min.js +1 -0
  225. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/loader.gif +0 -0
  226. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/opa75.png +0 -0
  227. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/placeholder.png +0 -0
  228. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/ad-gallery/trans.gif +0 -0
  229. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/blank.gif +0 -0
  230. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading.gif +0 -0
  231. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_loading@2x.gif +0 -0
  232. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_overlay.png +0 -0
  233. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite.png +0 -0
  234. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/fancybox_sprite@2x.png +0 -0
  235. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/fancybox_buttons.png +0 -0
  236. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.css +97 -0
  237. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-buttons.js +122 -0
  238. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-media.js +199 -0
  239. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.css +55 -0
  240. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/helpers/jquery.fancybox-thumbs.js +162 -0
  241. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.css +274 -0
  242. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.js +2020 -0
  243. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/3rdParty/fancybox2/jquery.fancybox.pack.js +46 -0
  244. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/README.md +66 -0
  245. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/dialogs/slideshow.js +1396 -0
  246. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/dialogs/slideshow.min.js +1 -0
  247. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/icons/placeholder.png +0 -0
  248. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/icons/slideshow.png +0 -0
  249. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/Serbian_translation.txt +9 -0
  250. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/el.js +37 -0
  251. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/en.js +35 -0
  252. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/fr.js +35 -0
  253. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/ru.js +35 -0
  254. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/sr-latn.js +35 -0
  255. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/lang/sr.js +35 -0
  256. data/lib/generators/coalla/cms/wysiwyg/templates/ckeditor/plugins/slideshow/plugin.js +217 -0
  257. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  258. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h1.png +0 -0
  259. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h2.png +0 -0
  260. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h3.png +0 -0
  261. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h4.png +0 -0
  262. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h5.png +0 -0
  263. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h6.png +0 -0
  264. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-p.png +0 -0
  265. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-pre.png +0 -0
  266. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.css +276 -0
  267. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.html +26 -0
  268. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/jquery.wymeditor.js +4819 -0
  269. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/en.js +45 -0
  270. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/ru.js +55 -0
  271. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/icons.png +0 -0
  272. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/jquery.wymeditor.imageupload.js +150 -0
  273. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +91 -0
  274. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/readme.txt +124 -0
  275. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/icons.png +0 -0
  276. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.css +134 -0
  277. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.js +35 -0
  278. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/icons.png +0 -0
  279. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.css +341 -0
  280. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.js +40 -0
  281. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  282. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  283. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  284. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  285. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.css +131 -0
  286. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.js +30 -0
  287. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/COPYING +674 -0
  288. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/README +27 -0
  289. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.header.gif +0 -0
  290. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  291. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  292. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  293. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.css +297 -0
  294. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.js +61 -0
  295. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/icons.png +0 -0
  296. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.css +134 -0
  297. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.js +39 -0
  298. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/wymeditor_icon.png +0 -0
  299. data/lib/generators/coalla/cms/wysiwyg/wymeditor_generator.rb +17 -0
  300. metadata +581 -0
@@ -0,0 +1,875 @@
1
+ /*
2
+ * jQuery Plugin: Tokenizing Autocomplete Text Entry
3
+ * Version 1.6.0
4
+ *
5
+ * Copyright (c) 2009 James Smith (http://loopj.com)
6
+ * Licensed jointly under the GPL and MIT licenses,
7
+ * choose which one suits your project best!
8
+ *
9
+ */
10
+
11
+ (function ($) {
12
+ // Default settings
13
+ var DEFAULT_SETTINGS = {
14
+ // Search settings
15
+ method: "GET",
16
+ contentType: "json",
17
+ queryParam: "q",
18
+ searchDelay: 300,
19
+ minChars: 1,
20
+ propertyToSearch: "name",
21
+ jsonContainer: null,
22
+
23
+ // Display settings
24
+ hintText: "Type in a search term",
25
+ noResultsText: "No results",
26
+ searchingText: "Searching...",
27
+ deleteText: "×",
28
+ animateDropdown: true,
29
+
30
+ // Tokenization settings
31
+ tokenLimit: null,
32
+ tokenDelimiter: ",",
33
+ preventDuplicates: false,
34
+
35
+ // Output settings
36
+ tokenValue: "id",
37
+
38
+ // Prepopulation settings
39
+ prePopulate: null,
40
+ processPrePopulate: false,
41
+
42
+ //Coalla patch
43
+ showAllOnFocus: false,
44
+ useCache: true,
45
+
46
+ // Manipulation settings
47
+ idPrefix: "token-input-",
48
+
49
+ // Formatters
50
+ resultsFormatter: function(item){ return "<li>" + item[this.propertyToSearch]+ "</li>" },
51
+ tokenFormatter: function(item) { return "<li><p>" + item[this.propertyToSearch] + "</p></li>" },
52
+
53
+ // Callbacks
54
+ onResult: null,
55
+ onAdd: null,
56
+ onDelete: null,
57
+ onReady: null
58
+ };
59
+
60
+ // Default classes to use when theming
61
+ var DEFAULT_CLASSES = {
62
+ tokenList: "token-input-list",
63
+ token: "token-input-token",
64
+ tokenDelete: "token-input-delete-token",
65
+ selectedToken: "token-input-selected-token",
66
+ highlightedToken: "token-input-highlighted-token",
67
+ dropdown: "token-input-dropdown",
68
+ dropdownItem: "token-input-dropdown-item",
69
+ dropdownItem2: "token-input-dropdown-item2",
70
+ selectedDropdownItem: "token-input-selected-dropdown-item",
71
+ inputToken: "token-input-input-token"
72
+ };
73
+
74
+ // Input box position "enum"
75
+ var POSITION = {
76
+ BEFORE: 0,
77
+ AFTER: 1,
78
+ END: 2
79
+ };
80
+
81
+ // Keys "enum"
82
+ var KEY = {
83
+ BACKSPACE: 8,
84
+ TAB: 9,
85
+ ENTER: 13,
86
+ ESCAPE: 27,
87
+ SPACE: 32,
88
+ PAGE_UP: 33,
89
+ PAGE_DOWN: 34,
90
+ END: 35,
91
+ HOME: 36,
92
+ LEFT: 37,
93
+ UP: 38,
94
+ RIGHT: 39,
95
+ DOWN: 40,
96
+ NUMPAD_ENTER: 108,
97
+ COMMA: 188
98
+ };
99
+
100
+ // Additional public (exposed) methods
101
+ var methods = {
102
+ init: function(url_or_data_or_function, options) {
103
+ var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
104
+
105
+ return this.each(function () {
106
+ $(this).data("tokenInputObject", new $.TokenList(this, url_or_data_or_function, settings));
107
+ });
108
+ },
109
+ clear: function() {
110
+ this.data("tokenInputObject").clear();
111
+ return this;
112
+ },
113
+ add: function(item) {
114
+ this.data("tokenInputObject").add(item);
115
+ return this;
116
+ },
117
+ remove: function(item) {
118
+ this.data("tokenInputObject").remove(item);
119
+ return this;
120
+ },
121
+ get: function() {
122
+ return this.data("tokenInputObject").getTokens();
123
+ }
124
+ }
125
+
126
+ // Expose the .tokenInput function to jQuery as a plugin
127
+ $.fn.tokenInput = function (method) {
128
+ // Method calling and initialization logic
129
+ if(methods[method]) {
130
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
131
+ } else {
132
+ return methods.init.apply(this, arguments);
133
+ }
134
+ };
135
+
136
+ // TokenList class for each input
137
+ $.TokenList = function (input, url_or_data, settings) {
138
+ //
139
+ // Initialization
140
+ //
141
+
142
+ // Configure the data source
143
+ if($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
144
+ // Set the url to query against
145
+ settings.url = url_or_data;
146
+
147
+ // If the URL is a function, evaluate it here to do our initalization work
148
+ var url = computeURL();
149
+
150
+ // Make a smart guess about cross-domain if it wasn't explicitly specified
151
+ if(settings.crossDomain === undefined) {
152
+ if(url.indexOf("://") === -1) {
153
+ settings.crossDomain = false;
154
+ } else {
155
+ settings.crossDomain = (location.href.split(/\/+/g)[1] !== url.split(/\/+/g)[1]);
156
+ }
157
+ }
158
+ } else if(typeof(url_or_data) === "object") {
159
+ // Set the local data to search through
160
+ settings.local_data = url_or_data;
161
+ }
162
+
163
+ // Build class names
164
+ if(settings.classes) {
165
+ // Use custom class names
166
+ settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
167
+ } else if(settings.theme) {
168
+ // Use theme-suffixed default class names
169
+ settings.classes = {};
170
+ $.each(DEFAULT_CLASSES, function(key, value) {
171
+ settings.classes[key] = value + "-" + settings.theme;
172
+ });
173
+ } else {
174
+ settings.classes = DEFAULT_CLASSES;
175
+ }
176
+
177
+
178
+ // Save the tokens
179
+ var saved_tokens = [];
180
+
181
+ // Keep track of the number of tokens in the list
182
+ var token_count = 0;
183
+
184
+ // Basic cache to save on db hits
185
+ var cache = new $.TokenList.Cache();
186
+
187
+ // Keep track of the timeout, old vals
188
+ var timeout;
189
+ var input_val;
190
+
191
+ // Create a new text input an attach keyup events
192
+ var input_box = $("<input type=\"text\" autocomplete=\"off\">")
193
+ .css({
194
+ outline: "none"
195
+ })
196
+ .attr("id", settings.idPrefix + input.id)
197
+ .focus(function () {
198
+ if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
199
+ //Coalla patch
200
+ if (settings.showAllOnFocus) {
201
+ run_search('');
202
+ } else {
203
+ show_dropdown_hint();
204
+ }
205
+ }
206
+ })
207
+ .blur(function () {
208
+ hide_dropdown();
209
+ $(this).val("");
210
+ })
211
+ .bind("keyup keydown blur update", resize_input)
212
+ .keydown(function (event) {
213
+ var previous_token;
214
+ var next_token;
215
+
216
+ switch(event.keyCode) {
217
+ case KEY.LEFT:
218
+ case KEY.RIGHT:
219
+ case KEY.UP:
220
+ case KEY.DOWN:
221
+ if(!$(this).val()) {
222
+ previous_token = input_token.prev();
223
+ next_token = input_token.next();
224
+
225
+ if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
226
+ // Check if there is a previous/next token and it is selected
227
+ if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
228
+ deselect_token($(selected_token), POSITION.BEFORE);
229
+ } else {
230
+ deselect_token($(selected_token), POSITION.AFTER);
231
+ }
232
+ } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
233
+ // We are moving left, select the previous token if it exists
234
+ select_token($(previous_token.get(0)));
235
+ } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
236
+ // We are moving right, select the next token if it exists
237
+ select_token($(next_token.get(0)));
238
+ }
239
+ } else {
240
+ var dropdown_item = null;
241
+
242
+ if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
243
+ dropdown_item = $(selected_dropdown_item).next();
244
+ } else {
245
+ dropdown_item = $(selected_dropdown_item).prev();
246
+ }
247
+
248
+ if(dropdown_item.length) {
249
+ select_dropdown_item(dropdown_item);
250
+ }
251
+ return false;
252
+ }
253
+ break;
254
+
255
+ case KEY.BACKSPACE:
256
+ previous_token = input_token.prev();
257
+
258
+ if(!$(this).val().length) {
259
+ if(selected_token) {
260
+ delete_token($(selected_token));
261
+ hidden_input.change();
262
+ } else if(previous_token.length) {
263
+ select_token($(previous_token.get(0)));
264
+ }
265
+
266
+ return false;
267
+ } else if($(this).val().length === 1) {
268
+ hide_dropdown();
269
+ } else {
270
+ // set a timeout just long enough to let this function finish.
271
+ setTimeout(function(){do_search();}, 5);
272
+ }
273
+ break;
274
+
275
+ case KEY.TAB:
276
+ case KEY.ENTER:
277
+ case KEY.NUMPAD_ENTER:
278
+ // case KEY.COMMA: - Coalla patch, webkit интерпретирует букву 'б' как запятую
279
+ if(selected_dropdown_item) {
280
+ add_token($(selected_dropdown_item).data("tokeninput"));
281
+ hidden_input.change();
282
+ return false;
283
+ }
284
+ break;
285
+
286
+ case KEY.ESCAPE:
287
+ hide_dropdown();
288
+ return true;
289
+
290
+ default:
291
+ if(String.fromCharCode(event.which)) {
292
+ // set a timeout just long enough to let this function finish.
293
+ setTimeout(function(){do_search();}, 5);
294
+ }
295
+ break;
296
+ }
297
+ });
298
+
299
+ // Keep a reference to the original input box
300
+ var hidden_input = $(input)
301
+ .hide()
302
+ .val("")
303
+ .focus(function () {
304
+ input_box.focus();
305
+ })
306
+ .blur(function () {
307
+ input_box.blur();
308
+ });
309
+
310
+ // Keep a reference to the selected token and dropdown item
311
+ var selected_token = null;
312
+ var selected_token_index = 0;
313
+ var selected_dropdown_item = null;
314
+
315
+ // The list to store the token items in
316
+ var token_list = $("<ul />")
317
+ .addClass(settings.classes.tokenList)
318
+ .click(function (event) {
319
+ var li = $(event.target).closest("li");
320
+ if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
321
+ toggle_select_token(li);
322
+ } else {
323
+ // Deselect selected token
324
+ if(selected_token) {
325
+ deselect_token($(selected_token), POSITION.END);
326
+ }
327
+
328
+ // Focus input box
329
+ input_box.focus();
330
+ }
331
+ })
332
+ .mouseover(function (event) {
333
+ var li = $(event.target).closest("li");
334
+ if(li && selected_token !== this) {
335
+ li.addClass(settings.classes.highlightedToken);
336
+ }
337
+ })
338
+ .mouseout(function (event) {
339
+ var li = $(event.target).closest("li");
340
+ if(li && selected_token !== this) {
341
+ li.removeClass(settings.classes.highlightedToken);
342
+ }
343
+ })
344
+ .insertBefore(hidden_input);
345
+
346
+ // The token holding the input box
347
+ var input_token = $("<li />")
348
+ .addClass(settings.classes.inputToken)
349
+ .appendTo(token_list)
350
+ .append(input_box);
351
+
352
+ // The list to store the dropdown items in
353
+ var dropdown = $("<div>")
354
+ .addClass(settings.classes.dropdown)
355
+ .appendTo("body")
356
+ .hide();
357
+
358
+ // Magic element to help us resize the text input
359
+ var input_resizer = $("<tester/>")
360
+ .insertAfter(input_box)
361
+ .css({
362
+ position: "absolute",
363
+ top: -9999,
364
+ left: -9999,
365
+ width: "auto",
366
+ fontSize: input_box.css("fontSize"),
367
+ fontFamily: input_box.css("fontFamily"),
368
+ fontWeight: input_box.css("fontWeight"),
369
+ letterSpacing: input_box.css("letterSpacing"),
370
+ whiteSpace: "nowrap"
371
+ });
372
+
373
+ // Pre-populate list if items exist
374
+ hidden_input.val("");
375
+ var li_data = settings.prePopulate || hidden_input.data("pre");
376
+ if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
377
+ li_data = settings.onResult.call(hidden_input, li_data);
378
+ }
379
+ if(li_data && li_data.length) {
380
+ $.each(li_data, function (index, value) {
381
+ insert_token(value);
382
+ checkTokenLimit();
383
+ });
384
+ }
385
+
386
+ // Initialization is done
387
+ if($.isFunction(settings.onReady)) {
388
+ settings.onReady.call();
389
+ }
390
+
391
+ //
392
+ // Public functions
393
+ //
394
+
395
+ this.clear = function() {
396
+ token_list.children("li").each(function() {
397
+ if ($(this).children("input").length === 0) {
398
+ delete_token($(this));
399
+ }
400
+ });
401
+ }
402
+
403
+ this.add = function(item) {
404
+ add_token(item);
405
+ }
406
+
407
+ this.remove = function(item) {
408
+ token_list.children("li").each(function() {
409
+ if ($(this).children("input").length === 0) {
410
+ var currToken = $(this).data("tokeninput");
411
+ var match = true;
412
+ for (var prop in item) {
413
+ if (item[prop] !== currToken[prop]) {
414
+ match = false;
415
+ break;
416
+ }
417
+ }
418
+ if (match) {
419
+ delete_token($(this));
420
+ }
421
+ }
422
+ });
423
+ }
424
+
425
+ this.getTokens = function() {
426
+ return saved_tokens;
427
+ }
428
+
429
+ //
430
+ // Private functions
431
+ //
432
+
433
+ function checkTokenLimit() {
434
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
435
+ input_box.hide();
436
+ hide_dropdown();
437
+ return;
438
+ }
439
+ }
440
+
441
+ function resize_input() {
442
+ if(input_val === (input_val = input_box.val())) {return;}
443
+
444
+ // Enter new content into resizer and resize input accordingly
445
+ var escaped = input_val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
446
+ input_resizer.html(escaped);
447
+ input_box.width(input_resizer.width() + 30);
448
+ }
449
+
450
+ function is_printable_character(keycode) {
451
+ return ((keycode >= 48 && keycode <= 90) || // 0-1a-z
452
+ (keycode >= 96 && keycode <= 111) || // numpad 0-9 + - / * .
453
+ (keycode >= 186 && keycode <= 192) || // ; = , - . / ^
454
+ (keycode >= 219 && keycode <= 222)); // ( \ ) '
455
+ }
456
+
457
+ // Inner function to a token to the list
458
+ function insert_token(item) {
459
+ var this_token = settings.tokenFormatter(item);
460
+ this_token = $(this_token)
461
+ .addClass(settings.classes.token)
462
+ .insertBefore(input_token);
463
+
464
+ // The 'delete token' button
465
+ $("<span>" + settings.deleteText + "</span>")
466
+ .addClass(settings.classes.tokenDelete)
467
+ .appendTo(this_token)
468
+ .click(function () {
469
+ delete_token($(this).parent());
470
+ hidden_input.change();
471
+ return false;
472
+ });
473
+
474
+ // Store data on the token
475
+ var token_data = {"id": item.id};
476
+ token_data[settings.propertyToSearch] = item[settings.propertyToSearch];
477
+ $.data(this_token.get(0), "tokeninput", item);
478
+
479
+ // Save this token for duplicate checking
480
+ saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
481
+ selected_token_index++;
482
+
483
+ // Update the hidden input
484
+ update_hidden_input(saved_tokens, hidden_input);
485
+
486
+ token_count += 1;
487
+
488
+ // Check the token limit
489
+ if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
490
+ input_box.hide();
491
+ hide_dropdown();
492
+ }
493
+
494
+ return this_token;
495
+ }
496
+
497
+ // Add a token to the token list based on user input
498
+ function add_token (item) {
499
+ var callback = settings.onAdd;
500
+
501
+ // See if the token already exists and select it if we don't want duplicates
502
+ if(token_count > 0 && settings.preventDuplicates) {
503
+ var found_existing_token = null;
504
+ token_list.children().each(function () {
505
+ var existing_token = $(this);
506
+ var existing_data = $.data(existing_token.get(0), "tokeninput");
507
+ if(existing_data && existing_data.id === item.id) {
508
+ found_existing_token = existing_token;
509
+ return false;
510
+ }
511
+ });
512
+
513
+ if(found_existing_token) {
514
+ select_token(found_existing_token);
515
+ input_token.insertAfter(found_existing_token);
516
+ input_box.focus();
517
+ return;
518
+ }
519
+ }
520
+
521
+ // Insert the new tokens
522
+ if(settings.tokenLimit == null || token_count < settings.tokenLimit) {
523
+ insert_token(item);
524
+ checkTokenLimit();
525
+ }
526
+
527
+ // Clear input box
528
+ input_box.val("");
529
+
530
+ // Don't show the help dropdown, they've got the idea
531
+ hide_dropdown();
532
+
533
+ // Execute the onAdd callback if defined
534
+ if($.isFunction(callback)) {
535
+ callback.call(hidden_input,item);
536
+ }
537
+ }
538
+
539
+ // Select a token in the token list
540
+ function select_token (token) {
541
+ token.addClass(settings.classes.selectedToken);
542
+ selected_token = token.get(0);
543
+
544
+ // Hide input box
545
+ input_box.val("");
546
+
547
+ // Hide dropdown if it is visible (eg if we clicked to select token)
548
+ hide_dropdown();
549
+ }
550
+
551
+ // Deselect a token in the token list
552
+ function deselect_token (token, position) {
553
+ token.removeClass(settings.classes.selectedToken);
554
+ selected_token = null;
555
+
556
+ if(position === POSITION.BEFORE) {
557
+ input_token.insertBefore(token);
558
+ selected_token_index--;
559
+ } else if(position === POSITION.AFTER) {
560
+ input_token.insertAfter(token);
561
+ selected_token_index++;
562
+ } else {
563
+ input_token.appendTo(token_list);
564
+ selected_token_index = token_count;
565
+ }
566
+
567
+ // Show the input box and give it focus again
568
+ input_box.focus();
569
+ }
570
+
571
+ // Toggle selection of a token in the token list
572
+ function toggle_select_token(token) {
573
+ var previous_selected_token = selected_token;
574
+
575
+ if(selected_token) {
576
+ deselect_token($(selected_token), POSITION.END);
577
+ }
578
+
579
+ if(previous_selected_token === token.get(0)) {
580
+ deselect_token(token, POSITION.END);
581
+ } else {
582
+ select_token(token);
583
+ }
584
+ }
585
+
586
+ // Delete a token from the token list
587
+ function delete_token (token) {
588
+ // Remove the id from the saved list
589
+ var token_data = $.data(token.get(0), "tokeninput");
590
+ var callback = settings.onDelete;
591
+
592
+ var index = token.prevAll().length;
593
+ if(index > selected_token_index) index--;
594
+
595
+ // Delete the token
596
+ token.remove();
597
+ selected_token = null;
598
+
599
+ // Show the input box and give it focus again
600
+ input_box.focus();
601
+
602
+ // Remove this token from the saved list
603
+ saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
604
+ if(index < selected_token_index) selected_token_index--;
605
+
606
+ // Update the hidden input
607
+ update_hidden_input(saved_tokens, hidden_input);
608
+
609
+ token_count -= 1;
610
+
611
+ if(settings.tokenLimit !== null) {
612
+ input_box
613
+ .show()
614
+ .val("")
615
+ .focus();
616
+ }
617
+
618
+ // Execute the onDelete callback if defined
619
+ if($.isFunction(callback)) {
620
+ callback.call(hidden_input,token_data);
621
+ }
622
+ }
623
+
624
+ // Update the hidden input box value
625
+ function update_hidden_input(saved_tokens, hidden_input) {
626
+ var token_values = $.map(saved_tokens, function (el) {
627
+ return el[settings.tokenValue];
628
+ });
629
+ hidden_input.val(token_values.join(settings.tokenDelimiter));
630
+
631
+ }
632
+
633
+ // Hide and clear the results dropdown
634
+ function hide_dropdown () {
635
+ dropdown.hide().empty();
636
+ selected_dropdown_item = null;
637
+ }
638
+
639
+ function show_dropdown() {
640
+ dropdown
641
+ .css({
642
+ position: "absolute",
643
+ top: $(token_list).offset().top + $(token_list).outerHeight(),
644
+ left: $(token_list).offset().left,
645
+ zindex: 999
646
+ })
647
+ .show();
648
+ }
649
+
650
+ function show_dropdown_searching () {
651
+ if(settings.searchingText) {
652
+ dropdown.html("<p>"+settings.searchingText+"</p>");
653
+ show_dropdown();
654
+ }
655
+ }
656
+
657
+ function show_dropdown_hint () {
658
+ if(settings.hintText) {
659
+ dropdown.html("<p>"+settings.hintText+"</p>");
660
+ show_dropdown();
661
+ }
662
+ }
663
+
664
+ // Highlight the query part of the search term
665
+ function highlight_term(value, term) {
666
+ return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
667
+ }
668
+
669
+ var regexp_special_chars = new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]', 'g');
670
+ function regexp_escape(term) {
671
+ return term.replace(regexp_special_chars, '\\$&');
672
+ }
673
+
674
+ function find_value_and_highlight_term(template, value, term) {
675
+ return template.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + regexp_escape(value) + ")(?![^<>]*>)(?![^&;]+;)", "g"), highlight_term(value, term));
676
+ }
677
+
678
+ // Populate the results dropdown with some results
679
+ function populate_dropdown (query, results) {
680
+ if(results && results.length) {
681
+ dropdown.empty();
682
+ var dropdown_ul = $("<ul>")
683
+ .appendTo(dropdown)
684
+ .mouseover(function (event) {
685
+ select_dropdown_item($(event.target).closest("li"));
686
+ })
687
+ .mousedown(function (event) {
688
+ add_token($(event.target).closest("li").data("tokeninput"));
689
+ hidden_input.change();
690
+ return false;
691
+ })
692
+ .hide();
693
+
694
+ $.each(results, function(index, value) {
695
+ var this_li = settings.resultsFormatter(value);
696
+
697
+ this_li = find_value_and_highlight_term(this_li ,value[settings.propertyToSearch], query);
698
+
699
+ this_li = $(this_li).appendTo(dropdown_ul);
700
+
701
+ if(index % 2) {
702
+ this_li.addClass(settings.classes.dropdownItem);
703
+ } else {
704
+ this_li.addClass(settings.classes.dropdownItem2);
705
+ }
706
+
707
+ if(index === 0) {
708
+ select_dropdown_item(this_li);
709
+ }
710
+
711
+ $.data(this_li.get(0), "tokeninput", value);
712
+ });
713
+
714
+ show_dropdown();
715
+
716
+ if(settings.animateDropdown) {
717
+ dropdown_ul.slideDown("fast");
718
+ } else {
719
+ dropdown_ul.show();
720
+ }
721
+ } else {
722
+ if(settings.noResultsText) {
723
+ dropdown.html("<p>"+settings.noResultsText+"</p>");
724
+ show_dropdown();
725
+ }
726
+ }
727
+ }
728
+
729
+ // Highlight an item in the results dropdown
730
+ function select_dropdown_item (item) {
731
+ if(item) {
732
+ if(selected_dropdown_item) {
733
+ deselect_dropdown_item($(selected_dropdown_item));
734
+ }
735
+
736
+ item.addClass(settings.classes.selectedDropdownItem);
737
+ selected_dropdown_item = item.get(0);
738
+ }
739
+ }
740
+
741
+ // Remove highlighting from an item in the results dropdown
742
+ function deselect_dropdown_item (item) {
743
+ item.removeClass(settings.classes.selectedDropdownItem);
744
+ selected_dropdown_item = null;
745
+ }
746
+
747
+ // Do a search and show the "searching" dropdown if the input is longer
748
+ // than settings.minChars
749
+ function do_search() {
750
+ var query = input_box.val().toLowerCase();
751
+
752
+ if(query && query.length) {
753
+ if(selected_token) {
754
+ deselect_token($(selected_token), POSITION.AFTER);
755
+ }
756
+
757
+ if(query.length >= settings.minChars) {
758
+ show_dropdown_searching();
759
+ clearTimeout(timeout);
760
+
761
+ timeout = setTimeout(function(){
762
+ run_search(query);
763
+ }, settings.searchDelay);
764
+ } else {
765
+ hide_dropdown();
766
+ }
767
+ }
768
+ }
769
+
770
+ // Do the actual search
771
+ function run_search(query) {
772
+ var cache_key = query + computeURL();
773
+ var cached_results = cache.get(cache_key);
774
+ //Coalla patch
775
+ if(settings.useCache && cached_results) {
776
+ populate_dropdown(query, cached_results);
777
+ } else {
778
+ // Are we doing an ajax search or local data search?
779
+ if(settings.url) {
780
+ var url = computeURL();
781
+ // Extract exisiting get params
782
+ var ajax_params = {};
783
+ ajax_params.data = {};
784
+ if(url.indexOf("?") > -1) {
785
+ var parts = url.split("?");
786
+ ajax_params.url = parts[0];
787
+
788
+ var param_array = parts[1].split("&");
789
+ $.each(param_array, function (index, value) {
790
+ var kv = value.split("=");
791
+ ajax_params.data[kv[0]] = kv[1];
792
+ });
793
+ } else {
794
+ ajax_params.url = url;
795
+ }
796
+
797
+ // Prepare the request
798
+ ajax_params.data[settings.queryParam] = query;
799
+ ajax_params.type = settings.method;
800
+ ajax_params.dataType = settings.contentType;
801
+ if(settings.crossDomain) {
802
+ ajax_params.dataType = "jsonp";
803
+ }
804
+
805
+ // Attach the success callback
806
+ ajax_params.success = function(results) {
807
+ if($.isFunction(settings.onResult)) {
808
+ results = settings.onResult.call(hidden_input, results);
809
+ }
810
+ cache.add(cache_key, settings.jsonContainer ? results[settings.jsonContainer] : results);
811
+
812
+ // only populate the dropdown if the results are associated with the active search query
813
+ if(input_box.val().toLowerCase() === query) {
814
+ populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
815
+ }
816
+ };
817
+
818
+ // Make the request
819
+ $.ajax(ajax_params);
820
+ } else if(settings.local_data) {
821
+ // Do the search through local data
822
+ var results = $.grep(settings.local_data, function (row) {
823
+ return row[settings.propertyToSearch].toLowerCase().indexOf(query.toLowerCase()) > -1;
824
+ });
825
+
826
+ if($.isFunction(settings.onResult)) {
827
+ results = settings.onResult.call(hidden_input, results);
828
+ }
829
+ cache.add(cache_key, results);
830
+ populate_dropdown(query, results);
831
+ }
832
+ }
833
+ }
834
+
835
+ // compute the dynamic URL
836
+ function computeURL() {
837
+ var url = settings.url;
838
+ if(typeof settings.url == 'function') {
839
+ url = settings.url.call();
840
+ }
841
+ return url;
842
+ }
843
+ };
844
+
845
+ // Really basic cache for the results
846
+ $.TokenList.Cache = function (options) {
847
+ var settings = $.extend({
848
+ max_size: 500
849
+ }, options);
850
+
851
+ var data = {};
852
+ var size = 0;
853
+
854
+ var flush = function () {
855
+ data = {};
856
+ size = 0;
857
+ };
858
+
859
+ this.add = function (query, results) {
860
+ if(size > settings.max_size) {
861
+ flush();
862
+ }
863
+
864
+ if(!data[query]) {
865
+ size += 1;
866
+ }
867
+
868
+ data[query] = results;
869
+ };
870
+
871
+ this.get = function (query) {
872
+ return data[query];
873
+ };
874
+ };
875
+ }(jQuery));