camaleon_cms_rails6 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (719) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +202 -0
  3. data/Rakefile +32 -0
  4. data/app/apps/plugins/attack/admin_controller.rb +17 -0
  5. data/app/apps/plugins/attack/attack_helper.rb +94 -0
  6. data/app/apps/plugins/attack/config/config.json +31 -0
  7. data/app/apps/plugins/attack/config/custom_models.rb +8 -0
  8. data/app/apps/plugins/attack/config/locales/readme.txt +1 -0
  9. data/app/apps/plugins/attack/config/locales/translation.yml +129 -0
  10. data/app/apps/plugins/attack/config/routes_admin.txt +2 -0
  11. data/app/apps/plugins/attack/models/attack.rb +3 -0
  12. data/app/apps/plugins/attack/views/admin/settings.html.erb +49 -0
  13. data/app/apps/plugins/authoring_post/authoring_post_helper.rb +51 -0
  14. data/app/apps/plugins/authoring_post/config/config.json +24 -0
  15. data/app/apps/plugins/front_cache/admin_controller.rb +29 -0
  16. data/app/apps/plugins/front_cache/config/config.json +21 -0
  17. data/app/apps/plugins/front_cache/config/initializer.rb +7 -0
  18. data/app/apps/plugins/front_cache/config/locales/readme.txt +1 -0
  19. data/app/apps/plugins/front_cache/config/locales/translation.yml +149 -0
  20. data/app/apps/plugins/front_cache/config/routes_admin.txt +3 -0
  21. data/app/apps/plugins/front_cache/front_cache_helper.rb +137 -0
  22. data/app/apps/plugins/front_cache/views/admin/settings.html.erb +81 -0
  23. data/app/apps/plugins/visibility_post/assets/js/form.js +30 -0
  24. data/app/apps/plugins/visibility_post/config/config.json +24 -0
  25. data/app/apps/plugins/visibility_post/visibility_post_helper.rb +124 -0
  26. data/app/apps/themes/camaleon_first/assets/css/magnific-ver.css +394 -0
  27. data/app/apps/themes/camaleon_first/assets/css/main.css +16 -0
  28. data/app/apps/themes/camaleon_first/assets/css/style-ver.css.scss +251 -0
  29. data/app/apps/themes/camaleon_first/assets/css/wpbase.css +1 -0
  30. data/app/apps/themes/camaleon_first/assets/images/empe.jpg +0 -0
  31. data/app/apps/themes/camaleon_first/assets/images/image.png +0 -0
  32. data/app/apps/themes/camaleon_first/assets/images/loader.gif +0 -0
  33. data/app/apps/themes/camaleon_first/assets/images/zoom.png +0 -0
  34. data/app/apps/themes/camaleon_first/assets/js/hover.zoom.js +67 -0
  35. data/app/apps/themes/camaleon_first/assets/js/magnific.min.js +3 -0
  36. data/app/apps/themes/camaleon_first/assets/js/main-ver.js +46 -0
  37. data/app/apps/themes/camaleon_first/assets/js/main.js +18 -0
  38. data/app/apps/themes/camaleon_first/assets/js/modernizr.custom.js +4 -0
  39. data/app/apps/themes/camaleon_first/config/config.json +14 -0
  40. data/app/apps/themes/camaleon_first/main_helper.rb +33 -0
  41. data/app/apps/themes/camaleon_first/views/index.html.erb +28 -0
  42. data/app/apps/themes/camaleon_first/views/layouts/camaleon_cms/mailer.html.erb +22 -0
  43. data/app/apps/themes/camaleon_first/views/layouts/index.html.erb +84 -0
  44. data/app/apps/themes/camaleon_first/views/mailer.html.erb +4 -0
  45. data/app/apps/themes/camaleon_first/views/partials/readme.txt +1 -0
  46. data/app/apps/themes/camaleon_first/views/template_sample_page.html.erb +6 -0
  47. data/app/apps/themes/default/assets/css/main.css +13 -0
  48. data/app/apps/themes/default/assets/css/style.css.scss +3398 -0
  49. data/app/apps/themes/default/assets/css/styles.css.scss +175 -0
  50. data/app/apps/themes/default/assets/genericons/COPYING.txt +9 -0
  51. data/app/apps/themes/default/assets/genericons/Genericons-Regular.otf +0 -0
  52. data/app/apps/themes/default/assets/genericons/LICENSE.txt +339 -0
  53. data/app/apps/themes/default/assets/genericons/README.txt +123 -0
  54. data/app/apps/themes/default/assets/genericons/font/genericons-regular-webfont.eot +0 -0
  55. data/app/apps/themes/default/assets/genericons/font/genericons-regular-webfont.svg +135 -0
  56. data/app/apps/themes/default/assets/genericons/font/genericons-regular-webfont.ttf +0 -0
  57. data/app/apps/themes/default/assets/genericons/font/genericons-regular-webfont.woff +0 -0
  58. data/app/apps/themes/default/assets/genericons/genericons.css +197 -0
  59. data/app/apps/themes/default/assets/images/circle.png +0 -0
  60. data/app/apps/themes/default/assets/images/dotted-line-2x.png +0 -0
  61. data/app/apps/themes/default/assets/images/dotted-line-light-2x.png +0 -0
  62. data/app/apps/themes/default/assets/images/dotted-line-light.png +0 -0
  63. data/app/apps/themes/default/assets/images/dotted-line.png +0 -0
  64. data/app/apps/themes/default/assets/images/headers/circle-thumbnail.png +0 -0
  65. data/app/apps/themes/default/assets/images/headers/circle.png +0 -0
  66. data/app/apps/themes/default/assets/images/headers/diamond-thumbnail.png +0 -0
  67. data/app/apps/themes/default/assets/images/headers/diamond.png +0 -0
  68. data/app/apps/themes/default/assets/images/headers/star-thumbnail.png +0 -0
  69. data/app/apps/themes/default/assets/images/headers/star.png +0 -0
  70. data/app/apps/themes/default/assets/images/image.png +0 -0
  71. data/app/apps/themes/default/assets/images/search-icon-2x.png +0 -0
  72. data/app/apps/themes/default/assets/images/search-icon.png +0 -0
  73. data/app/apps/themes/default/assets/js/main.js +13 -0
  74. data/app/apps/themes/default/config/config.json +19 -0
  75. data/app/apps/themes/default/default_helper.rb +28 -0
  76. data/app/apps/themes/default/views/admin/settings.html.erb +0 -0
  77. data/app/apps/themes/default/views/category.html.erb +16 -0
  78. data/app/apps/themes/default/views/index.html.erb +35 -0
  79. data/app/apps/themes/default/views/layouts/index.html.erb +84 -0
  80. data/app/apps/themes/default/views/page.html.erb +14 -0
  81. data/app/apps/themes/default/views/partials/_breadcrumb.html.erb +10 -0
  82. data/app/apps/themes/default/views/partials/_categories_list.html.erb +23 -0
  83. data/app/apps/themes/default/views/partials/_comments.html.erb +40 -0
  84. data/app/apps/themes/default/views/partials/_comments_list.html.erb +20 -0
  85. data/app/apps/themes/default/views/partials/_flash_messages.html.erb +26 -0
  86. data/app/apps/themes/default/views/partials/_forms.html.erb +19 -0
  87. data/app/apps/themes/default/views/partials/_post_list_item.html.erb +34 -0
  88. data/app/apps/themes/default/views/partials/_search_form.html.erb +8 -0
  89. data/app/apps/themes/default/views/partials/_sidebar.html.erb +50 -0
  90. data/app/apps/themes/default/views/post.html.erb +14 -0
  91. data/app/apps/themes/default/views/post_tag.html.erb +14 -0
  92. data/app/apps/themes/default/views/post_type.html.erb +33 -0
  93. data/app/apps/themes/default/views/search.html.erb +17 -0
  94. data/app/apps/themes/new/assets/css/main.css +14 -0
  95. data/app/apps/themes/new/assets/css/styles.css.scss +175 -0
  96. data/app/apps/themes/new/assets/images/image.png +0 -0
  97. data/app/apps/themes/new/assets/js/main.js +14 -0
  98. data/app/apps/themes/new/config/config.json +26 -0
  99. data/app/apps/themes/new/custom_helper.rb +31 -0
  100. data/app/apps/themes/new/image.png +0 -0
  101. data/app/apps/themes/new/views/admin/settings.html.erb +1 -0
  102. data/app/apps/themes/new/views/category.html.erb +33 -0
  103. data/app/apps/themes/new/views/index.html.erb +71 -0
  104. data/app/apps/themes/new/views/layouts/_footer.html.erb +17 -0
  105. data/app/apps/themes/new/views/layouts/_header.html.erb +38 -0
  106. data/app/apps/themes/new/views/layouts/index.html.erb +32 -0
  107. data/app/apps/themes/new/views/page.html.erb +16 -0
  108. data/app/apps/themes/new/views/post.html.erb +20 -0
  109. data/app/apps/themes/new/views/post_tag.html.erb +22 -0
  110. data/app/apps/themes/new/views/post_type.html.erb +33 -0
  111. data/app/apps/themes/new/views/search.html.erb +18 -0
  112. data/app/assets/config/camaleon-cms.js +7 -0
  113. data/app/assets/fonts/camaleon_cms/glyphicons-halflings-regular.eot +0 -0
  114. data/app/assets/fonts/camaleon_cms/glyphicons-halflings-regular.svg +288 -0
  115. data/app/assets/fonts/camaleon_cms/glyphicons-halflings-regular.ttf +0 -0
  116. data/app/assets/fonts/camaleon_cms/glyphicons-halflings-regular.woff +0 -0
  117. data/app/assets/fonts/camaleon_cms/glyphicons-halflings-regular.woff2 +0 -0
  118. data/app/assets/images/camaleon.png +0 -0
  119. data/app/assets/images/camaleon_cms/admin/admin_spinner.gif +0 -0
  120. data/app/assets/images/camaleon_cms/admin/glyphicons-halflings.png +0 -0
  121. data/app/assets/images/camaleon_cms/admin/intro/menus.png +0 -0
  122. data/app/assets/images/camaleon_cms/admin/no_image.jpg +0 -0
  123. data/app/assets/images/camaleon_cms/bg-tree.jpeg +0 -0
  124. data/app/assets/images/camaleon_cms/camaleon-dark.png +0 -0
  125. data/app/assets/images/camaleon_cms/camaleon.png +0 -0
  126. data/app/assets/images/camaleon_cms/category-icon.png +0 -0
  127. data/app/assets/images/camaleon_cms/favicon.ico +0 -0
  128. data/app/assets/images/camaleon_cms/image-not-found.png +0 -0
  129. data/app/assets/images/camaleon_cms/language/de.png +0 -0
  130. data/app/assets/images/camaleon_cms/language/en.png +0 -0
  131. data/app/assets/images/camaleon_cms/language/es.png +0 -0
  132. data/app/assets/images/camaleon_cms/language/fr.png +0 -0
  133. data/app/assets/images/camaleon_cms/language/it.png +0 -0
  134. data/app/assets/images/camaleon_cms/language/nl.png +0 -0
  135. data/app/assets/images/camaleon_cms/language/pl.png +0 -0
  136. data/app/assets/images/camaleon_cms/language/pt-BR.png +0 -0
  137. data/app/assets/images/camaleon_cms/language/pt.png +0 -0
  138. data/app/assets/images/camaleon_cms/language/ru.png +0 -0
  139. data/app/assets/images/camaleon_cms/language/uk.png +0 -0
  140. data/app/assets/images/camaleon_cms/language/zh-CN.png +0 -0
  141. data/app/assets/images/camaleon_cms/loader.gif +0 -0
  142. data/app/assets/images/camaleon_cms/users/no-image.jpg +0 -0
  143. data/app/assets/javascripts/camaleon_cms/admin/_actions.js +91 -0
  144. data/app/assets/javascripts/camaleon_cms/admin/_bootstrap-datepicker.js +2558 -0
  145. data/app/assets/javascripts/camaleon_cms/admin/_bootstrap-select.js +7 -0
  146. data/app/assets/javascripts/camaleon_cms/admin/_custom_fields.js +273 -0
  147. data/app/assets/javascripts/camaleon_cms/admin/_data.js +69 -0
  148. data/app/assets/javascripts/camaleon_cms/admin/_i18n.js +32 -0
  149. data/app/assets/javascripts/camaleon_cms/admin/_jquery-ui.min.js +10 -0
  150. data/app/assets/javascripts/camaleon_cms/admin/_jquery.slugify.js +67 -0
  151. data/app/assets/javascripts/camaleon_cms/admin/_jquery.tagsinput.min.js +1 -0
  152. data/app/assets/javascripts/camaleon_cms/admin/_libraries.js +136 -0
  153. data/app/assets/javascripts/camaleon_cms/admin/_modal.js +156 -0
  154. data/app/assets/javascripts/camaleon_cms/admin/_post.js +317 -0
  155. data/app/assets/javascripts/camaleon_cms/admin/_posttype.js.coffee +27 -0
  156. data/app/assets/javascripts/camaleon_cms/admin/_translator.js +123 -0
  157. data/app/assets/javascripts/camaleon_cms/admin/_underscore.js +1536 -0
  158. data/app/assets/javascripts/camaleon_cms/admin/_user_profile.js +28 -0
  159. data/app/assets/javascripts/camaleon_cms/admin/admin-basic-manifest.js +3 -0
  160. data/app/assets/javascripts/camaleon_cms/admin/admin-manifest.js +55 -0
  161. data/app/assets/javascripts/camaleon_cms/admin/bootstrap-colorpicker.js +540 -0
  162. data/app/assets/javascripts/camaleon_cms/admin/custom_fields_form.js +94 -0
  163. data/app/assets/javascripts/camaleon_cms/admin/introjs/_intro.min.js +1317 -0
  164. data/app/assets/javascripts/camaleon_cms/admin/jquery-sieve.js +6 -0
  165. data/app/assets/javascripts/camaleon_cms/admin/jquery.nestable.js +485 -0
  166. data/app/assets/javascripts/camaleon_cms/admin/jquery.validate.js +123 -0
  167. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/de.js +20 -0
  168. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/es.js +27 -0
  169. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/fr.js +49 -0
  170. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/it.js +23 -0
  171. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/nl.js +33 -0
  172. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/pt-BR.js +74 -0
  173. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/ru.js +19 -0
  174. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/uk.js +23 -0
  175. data/app/assets/javascripts/camaleon_cms/admin/jquery_validate/zh-CN.js +23 -0
  176. data/app/assets/javascripts/camaleon_cms/admin/lte/app.js +758 -0
  177. data/app/assets/javascripts/camaleon_cms/admin/momentjs/_moment.js +3606 -0
  178. data/app/assets/javascripts/camaleon_cms/admin/momentjs/ar.js +136 -0
  179. data/app/assets/javascripts/camaleon_cms/admin/momentjs/ca.js +79 -0
  180. data/app/assets/javascripts/camaleon_cms/admin/momentjs/de.js +76 -0
  181. data/app/assets/javascripts/camaleon_cms/admin/momentjs/es.js +79 -0
  182. data/app/assets/javascripts/camaleon_cms/admin/momentjs/fr.js +62 -0
  183. data/app/assets/javascripts/camaleon_cms/admin/momentjs/it.js +70 -0
  184. data/app/assets/javascripts/camaleon_cms/admin/momentjs/ja.js +65 -0
  185. data/app/assets/javascripts/camaleon_cms/admin/momentjs/nl.js +71 -0
  186. data/app/assets/javascripts/camaleon_cms/admin/momentjs/pl.js +105 -0
  187. data/app/assets/javascripts/camaleon_cms/admin/momentjs/pt-BR.js +60 -0
  188. data/app/assets/javascripts/camaleon_cms/admin/momentjs/pt.js +64 -0
  189. data/app/assets/javascripts/camaleon_cms/admin/momentjs/ru.js +166 -0
  190. data/app/assets/javascripts/camaleon_cms/admin/momentjs/uk.js +151 -0
  191. data/app/assets/javascripts/camaleon_cms/admin/momentjs/zh-CN.js +127 -0
  192. data/app/assets/javascripts/camaleon_cms/admin/nav_menu.js.coffee +139 -0
  193. data/app/assets/javascripts/camaleon_cms/admin/tageditor/_jquery.caret.min.js +2 -0
  194. data/app/assets/javascripts/camaleon_cms/admin/tageditor/_jquery.tag-editor.js +352 -0
  195. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/de.js +219 -0
  196. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/en.js +179 -0
  197. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/es.js +177 -0
  198. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/fr.js +219 -0
  199. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/it.js +219 -0
  200. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/nl.js +219 -0
  201. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/pt-BR.js +219 -0
  202. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/readme.md +3 -0
  203. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/ru.js +219 -0
  204. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/uk.js +219 -0
  205. data/app/assets/javascripts/camaleon_cms/admin/tinymce/langs/zh-CN.js +228 -0
  206. data/app/assets/javascripts/camaleon_cms/admin/tinymce/plugins/filemanager/plugin.min.js +30 -0
  207. data/app/assets/javascripts/camaleon_cms/admin/uploader/_cropper.min.js +3003 -0
  208. data/app/assets/javascripts/camaleon_cms/admin/uploader/_jquery.form.js +1277 -0
  209. data/app/assets/javascripts/camaleon_cms/admin/uploader/_jquery.uploadfile.min.js +8 -0
  210. data/app/assets/javascripts/camaleon_cms/admin/uploader/_media_manager.js.coffee +455 -0
  211. data/app/assets/javascripts/camaleon_cms/admin/uploader/uploader_manifest.js +5 -0
  212. data/app/assets/javascripts/camaleon_cms/bootstrap.min.js +7 -0
  213. data/app/assets/stylesheets/camaleon_cms/admin/_bootstrap-datepicker.css.scss +373 -0
  214. data/app/assets/stylesheets/camaleon_cms/admin/_bootstrap-select.css +7 -0
  215. data/app/assets/stylesheets/camaleon_cms/admin/_custom_admin.css.scss +359 -0
  216. data/app/assets/stylesheets/camaleon_cms/admin/_jquery.tagsinput.css +72 -0
  217. data/app/assets/stylesheets/camaleon_cms/admin/admin-basic-manifest.css +16 -0
  218. data/app/assets/stylesheets/camaleon_cms/admin/admin-manifest.css +28 -0
  219. data/app/assets/stylesheets/camaleon_cms/admin/colorpicker.css.scss +96 -0
  220. data/app/assets/stylesheets/camaleon_cms/admin/img/bg.png +0 -0
  221. data/app/assets/stylesheets/camaleon_cms/admin/img/colorpicker/alpha.png +0 -0
  222. data/app/assets/stylesheets/camaleon_cms/admin/img/colorpicker/hue.png +0 -0
  223. data/app/assets/stylesheets/camaleon_cms/admin/img/colorpicker/saturation.png +0 -0
  224. data/app/assets/stylesheets/camaleon_cms/admin/img/girls-1.jpg +0 -0
  225. data/app/assets/stylesheets/camaleon_cms/admin/img/jquery/resize-icon.png +0 -0
  226. data/app/assets/stylesheets/camaleon_cms/admin/img/loading.gif +1 -0
  227. data/app/assets/stylesheets/camaleon_cms/admin/img/logo-small.png +0 -0
  228. data/app/assets/stylesheets/camaleon_cms/admin/img/logo.png +0 -0
  229. data/app/assets/stylesheets/camaleon_cms/admin/img/no_image.jpg +0 -0
  230. data/app/assets/stylesheets/camaleon_cms/admin/img/rormeleon-white.png +0 -0
  231. data/app/assets/stylesheets/camaleon_cms/admin/img/thumb_no_found.jpg +0 -0
  232. data/app/assets/stylesheets/camaleon_cms/admin/introjs/_introjs.min.css +1 -0
  233. data/app/assets/stylesheets/camaleon_cms/admin/jquery/_jquery-ui.scss +1226 -0
  234. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  235. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  236. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  237. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  238. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  239. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  240. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  241. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  242. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-icons_222222_256x240.png +0 -0
  243. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  244. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-icons_454545_256x240.png +0 -0
  245. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-icons_888888_256x240.png +0 -0
  246. data/app/assets/stylesheets/camaleon_cms/admin/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  247. data/app/assets/stylesheets/camaleon_cms/admin/lte/_admin.css.scss +4561 -0
  248. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-black-light.css +176 -0
  249. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-black.css +154 -0
  250. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-blue-light.css +167 -0
  251. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-blue.css +142 -0
  252. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-green-light.css +156 -0
  253. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-green.css +134 -0
  254. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-purple-light.css +156 -0
  255. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-purple.css +135 -0
  256. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-red-light.css +156 -0
  257. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-red.css +134 -0
  258. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-yellow-light.css +156 -0
  259. data/app/assets/stylesheets/camaleon_cms/admin/lte/skins/skin-yellow.css +134 -0
  260. data/app/assets/stylesheets/camaleon_cms/admin/nestable/jquery.nestable.css +103 -0
  261. data/app/assets/stylesheets/camaleon_cms/admin/tageditor/_jquery.tag-editor.css.scss +49 -0
  262. data/app/assets/stylesheets/camaleon_cms/admin/uploader/_cropper.min.css +9 -0
  263. data/app/assets/stylesheets/camaleon_cms/admin/uploader/_uploadfile.css.scss +256 -0
  264. data/app/assets/stylesheets/camaleon_cms/admin/uploader/uploader_manifest.css +4 -0
  265. data/app/assets/stylesheets/camaleon_cms/admin/widgets.css.scss +26 -0
  266. data/app/assets/stylesheets/camaleon_cms/bootstrap.min.css.scss +6799 -0
  267. data/app/controllers/camaleon_cms/admin/appearances/nav_menus_controller.rb +129 -0
  268. data/app/controllers/camaleon_cms/admin/appearances/themes_controller.rb +29 -0
  269. data/app/controllers/camaleon_cms/admin/appearances/widgets/assign_controller.rb +41 -0
  270. data/app/controllers/camaleon_cms/admin/appearances/widgets/main_controller.rb +55 -0
  271. data/app/controllers/camaleon_cms/admin/appearances/widgets/sidebar_controller.rb +56 -0
  272. data/app/controllers/camaleon_cms/admin/categories_controller.rb +80 -0
  273. data/app/controllers/camaleon_cms/admin/comments_controller.rb +90 -0
  274. data/app/controllers/camaleon_cms/admin/installers_controller.rb +32 -0
  275. data/app/controllers/camaleon_cms/admin/media_controller.rb +109 -0
  276. data/app/controllers/camaleon_cms/admin/plugins_controller.rb +46 -0
  277. data/app/controllers/camaleon_cms/admin/post_tags_controller.rb +81 -0
  278. data/app/controllers/camaleon_cms/admin/posts/drafts_controller.rb +58 -0
  279. data/app/controllers/camaleon_cms/admin/posts_controller.rb +212 -0
  280. data/app/controllers/camaleon_cms/admin/sessions_controller.rb +172 -0
  281. data/app/controllers/camaleon_cms/admin/settings/custom_fields_controller.rb +108 -0
  282. data/app/controllers/camaleon_cms/admin/settings/post_types_controller.rb +63 -0
  283. data/app/controllers/camaleon_cms/admin/settings/sites_controller.rb +87 -0
  284. data/app/controllers/camaleon_cms/admin/settings_controller.rb +86 -0
  285. data/app/controllers/camaleon_cms/admin/user_roles_controller.rb +74 -0
  286. data/app/controllers/camaleon_cms/admin/users_controller.rb +124 -0
  287. data/app/controllers/camaleon_cms/admin_controller.rb +82 -0
  288. data/app/controllers/camaleon_cms/apps/plugins_admin_controller.rb +19 -0
  289. data/app/controllers/camaleon_cms/apps/plugins_front_controller.rb +19 -0
  290. data/app/controllers/camaleon_cms/apps/themes_admin_controller.rb +12 -0
  291. data/app/controllers/camaleon_cms/apps/themes_front_controller.rb +12 -0
  292. data/app/controllers/camaleon_cms/camaleon_controller.rb +139 -0
  293. data/app/controllers/camaleon_cms/frontend_controller.rb +277 -0
  294. data/app/controllers/concerns/camaleon_cms/frontend_concern.rb +66 -0
  295. data/app/decorators/camaleon_cms/application_decorator.rb +54 -0
  296. data/app/decorators/camaleon_cms/category_decorator.rb +58 -0
  297. data/app/decorators/camaleon_cms/custom_field_decorator.rb +11 -0
  298. data/app/decorators/camaleon_cms/custom_fields_concern.rb +81 -0
  299. data/app/decorators/camaleon_cms/metas_decorator_methods.rb +11 -0
  300. data/app/decorators/camaleon_cms/nav_menu_item_decorator.rb +4 -0
  301. data/app/decorators/camaleon_cms/plugin_decorator.rb +3 -0
  302. data/app/decorators/camaleon_cms/post_comment_decorator.rb +39 -0
  303. data/app/decorators/camaleon_cms/post_decorator.rb +251 -0
  304. data/app/decorators/camaleon_cms/post_tag_decorator.rb +45 -0
  305. data/app/decorators/camaleon_cms/post_type_decorator.rb +87 -0
  306. data/app/decorators/camaleon_cms/site_decorator.rb +200 -0
  307. data/app/decorators/camaleon_cms/term_taxonomy_decorator.rb +93 -0
  308. data/app/decorators/camaleon_cms/theme_decorator.rb +18 -0
  309. data/app/decorators/camaleon_cms/user_decorator.rb +73 -0
  310. data/app/decorators/camaleon_cms/user_role_decorator.rb +12 -0
  311. data/app/decorators/camaleon_cms/widget_decorator.rb +4 -0
  312. data/app/helpers/camaleon_cms/admin/application_helper.rb +36 -0
  313. data/app/helpers/camaleon_cms/admin/breadcrumb_helper.rb +15 -0
  314. data/app/helpers/camaleon_cms/admin/category_helper.rb +24 -0
  315. data/app/helpers/camaleon_cms/admin/custom_fields_helper.rb +354 -0
  316. data/app/helpers/camaleon_cms/admin/menus_helper.rb +182 -0
  317. data/app/helpers/camaleon_cms/admin/post_type_helper.rb +67 -0
  318. data/app/helpers/camaleon_cms/camaleon_helper.rb +88 -0
  319. data/app/helpers/camaleon_cms/captcha_helper.rb +93 -0
  320. data/app/helpers/camaleon_cms/comment_helper.rb +48 -0
  321. data/app/helpers/camaleon_cms/content_helper.rb +29 -0
  322. data/app/helpers/camaleon_cms/email_helper.rb +56 -0
  323. data/app/helpers/camaleon_cms/frontend/application_helper.rb +36 -0
  324. data/app/helpers/camaleon_cms/frontend/content_select_helper.rb +161 -0
  325. data/app/helpers/camaleon_cms/frontend/nav_menu_helper.rb +237 -0
  326. data/app/helpers/camaleon_cms/frontend/seo_helper.rb +86 -0
  327. data/app/helpers/camaleon_cms/frontend/site_helper.rb +70 -0
  328. data/app/helpers/camaleon_cms/hooks_helper.rb +57 -0
  329. data/app/helpers/camaleon_cms/html_helper.rb +134 -0
  330. data/app/helpers/camaleon_cms/plugins_helper.rb +173 -0
  331. data/app/helpers/camaleon_cms/session_helper.rb +161 -0
  332. data/app/helpers/camaleon_cms/short_code_helper.rb +283 -0
  333. data/app/helpers/camaleon_cms/site_helper.rb +103 -0
  334. data/app/helpers/camaleon_cms/theme_helper.rb +95 -0
  335. data/app/helpers/camaleon_cms/uploader_helper.rb +329 -0
  336. data/app/helpers/camaleon_cms/user_roles_helper.rb +13 -0
  337. data/app/mailers/camaleon_cms/html_mailer.rb +87 -0
  338. data/app/models/camaleon_cms/ability.rb +109 -0
  339. data/app/models/camaleon_cms/category.rb +52 -0
  340. data/app/models/camaleon_cms/custom_field.rb +35 -0
  341. data/app/models/camaleon_cms/custom_field_group.rb +136 -0
  342. data/app/models/camaleon_cms/custom_fields_relationship.rb +27 -0
  343. data/app/models/camaleon_cms/media.rb +54 -0
  344. data/app/models/camaleon_cms/meta.rb +4 -0
  345. data/app/models/camaleon_cms/nav_menu.rb +29 -0
  346. data/app/models/camaleon_cms/nav_menu_item.rb +64 -0
  347. data/app/models/camaleon_cms/plugin.rb +76 -0
  348. data/app/models/camaleon_cms/post.rb +265 -0
  349. data/app/models/camaleon_cms/post_comment.rb +44 -0
  350. data/app/models/camaleon_cms/post_default.rb +78 -0
  351. data/app/models/camaleon_cms/post_relationship.rb +20 -0
  352. data/app/models/camaleon_cms/post_tag.rb +7 -0
  353. data/app/models/camaleon_cms/post_type.rb +189 -0
  354. data/app/models/camaleon_cms/site.rb +242 -0
  355. data/app/models/camaleon_cms/term_relationship.rb +18 -0
  356. data/app/models/camaleon_cms/term_taxonomy.rb +61 -0
  357. data/app/models/camaleon_cms/theme.rb +31 -0
  358. data/app/models/camaleon_cms/user.rb +18 -0
  359. data/app/models/camaleon_cms/user_role.rb +138 -0
  360. data/app/models/camaleon_cms/widget.rb +5 -0
  361. data/app/models/camaleon_cms/widget/assigned.rb +27 -0
  362. data/app/models/camaleon_cms/widget/main.rb +44 -0
  363. data/app/models/camaleon_cms/widget/sidebar.rb +20 -0
  364. data/app/models/concerns/camaleon_cms/categories_tags_for_posts.rb +132 -0
  365. data/app/models/concerns/camaleon_cms/custom_fields_read.rb +310 -0
  366. data/app/models/concerns/camaleon_cms/metas.rb +138 -0
  367. data/app/models/concerns/camaleon_cms/site_default_settings.rb +87 -0
  368. data/app/models/concerns/camaleon_cms/user_methods.rb +133 -0
  369. data/app/models/plugins.rb +5 -0
  370. data/app/models/themes.rb +5 -0
  371. data/app/uploaders/camaleon_cms_aws_uploader.rb +132 -0
  372. data/app/uploaders/camaleon_cms_local_uploader.rb +108 -0
  373. data/app/uploaders/camaleon_cms_uploader.rb +164 -0
  374. data/app/views/camaleon_cms/404.html.erb +4 -0
  375. data/app/views/camaleon_cms/500.html.erb +4 -0
  376. data/app/views/camaleon_cms/_flash_messages.html.erb +39 -0
  377. data/app/views/camaleon_cms/admin/appearances/nav_menus/_custom_fields.html.erb +6 -0
  378. data/app/views/camaleon_cms/admin/appearances/nav_menus/_custom_menus.html.erb +42 -0
  379. data/app/views/camaleon_cms/admin/appearances/nav_menus/_external_menu.html.erb +23 -0
  380. data/app/views/camaleon_cms/admin/appearances/nav_menus/_form.html.erb +13 -0
  381. data/app/views/camaleon_cms/admin/appearances/nav_menus/_left_menu_items.html.erb +77 -0
  382. data/app/views/camaleon_cms/admin/appearances/nav_menus/_menu_items.html.erb +19 -0
  383. data/app/views/camaleon_cms/admin/appearances/nav_menus/_menu_items_list.html.erb +12 -0
  384. data/app/views/camaleon_cms/admin/appearances/nav_menus/_menu_options.html.erb +21 -0
  385. data/app/views/camaleon_cms/admin/appearances/nav_menus/index.html.erb +14 -0
  386. data/app/views/camaleon_cms/admin/appearances/themes/index.html.erb +70 -0
  387. data/app/views/camaleon_cms/admin/appearances/themes/preview.html.erb +1 -0
  388. data/app/views/camaleon_cms/admin/appearances/themes/theme_load_data.html.erb +40 -0
  389. data/app/views/camaleon_cms/admin/appearances/widgets/assign/_form.html.erb +35 -0
  390. data/app/views/camaleon_cms/admin/appearances/widgets/main/_sidebar.html.erb +29 -0
  391. data/app/views/camaleon_cms/admin/appearances/widgets/main/form.html.erb +27 -0
  392. data/app/views/camaleon_cms/admin/appearances/widgets/main/index.html.erb +41 -0
  393. data/app/views/camaleon_cms/admin/appearances/widgets/sidebar/form.html.erb +23 -0
  394. data/app/views/camaleon_cms/admin/categories/_form.html.erb +34 -0
  395. data/app/views/camaleon_cms/admin/categories/edit.html.erb +14 -0
  396. data/app/views/camaleon_cms/admin/categories/index.html.erb +68 -0
  397. data/app/views/camaleon_cms/admin/comments/form.html.erb +12 -0
  398. data/app/views/camaleon_cms/admin/comments/form_answer.html.erb +12 -0
  399. data/app/views/camaleon_cms/admin/comments/index.html.erb +21 -0
  400. data/app/views/camaleon_cms/admin/comments/list.html.erb +36 -0
  401. data/app/views/camaleon_cms/admin/dashboard.html.erb +25 -0
  402. data/app/views/camaleon_cms/admin/installers/form.html.erb +19 -0
  403. data/app/views/camaleon_cms/admin/installers/welcome.html.erb +8 -0
  404. data/app/views/camaleon_cms/admin/media/_render_file_item.html.erb +57 -0
  405. data/app/views/camaleon_cms/admin/media/index.html.erb +70 -0
  406. data/app/views/camaleon_cms/admin/plugins/_plugins_list.html.erb +43 -0
  407. data/app/views/camaleon_cms/admin/plugins/index.html.erb +43 -0
  408. data/app/views/camaleon_cms/admin/post_tags/_form.html.erb +26 -0
  409. data/app/views/camaleon_cms/admin/post_tags/edit.html.erb +14 -0
  410. data/app/views/camaleon_cms/admin/post_tags/index.html.erb +59 -0
  411. data/app/views/camaleon_cms/admin/posts/_filter_posts.html.erb +5 -0
  412. data/app/views/camaleon_cms/admin/posts/_sidebar.html.erb +156 -0
  413. data/app/views/camaleon_cms/admin/posts/form.html.erb +96 -0
  414. data/app/views/camaleon_cms/admin/posts/index.html.erb +112 -0
  415. data/app/views/camaleon_cms/admin/posts/show.html.erb +20 -0
  416. data/app/views/camaleon_cms/admin/search.html.erb +73 -0
  417. data/app/views/camaleon_cms/admin/sessions/forgot.html.erb +44 -0
  418. data/app/views/camaleon_cms/admin/sessions/login.html.erb +47 -0
  419. data/app/views/camaleon_cms/admin/sessions/register.html.erb +63 -0
  420. data/app/views/camaleon_cms/admin/settings/_configuration_settings.html.erb +75 -0
  421. data/app/views/camaleon_cms/admin/settings/_email_settings.html.erb +58 -0
  422. data/app/views/camaleon_cms/admin/settings/_file_system_settings.html.erb +32 -0
  423. data/app/views/camaleon_cms/admin/settings/_media_settings.html.erb +14 -0
  424. data/app/views/camaleon_cms/admin/settings/_seo_settings.html.erb +22 -0
  425. data/app/views/camaleon_cms/admin/settings/custom_fields/_get_items.html.erb +185 -0
  426. data/app/views/camaleon_cms/admin/settings/custom_fields/_meta_data.html.erb +93 -0
  427. data/app/views/camaleon_cms/admin/settings/custom_fields/_render.html.erb +50 -0
  428. data/app/views/camaleon_cms/admin/settings/custom_fields/_render_category_simple.html.erb +25 -0
  429. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_audio.html.erb +4 -0
  430. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_categories.html.erb +11 -0
  431. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkbox.html.erb +8 -0
  432. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_checkboxes.html.erb +5 -0
  433. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_colorpicker.html.erb +7 -0
  434. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_date.html.erb +6 -0
  435. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_editor.html.erb +3 -0
  436. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_email.html.erb +3 -0
  437. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_field_attrs.html.erb +8 -0
  438. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_file.html.erb +4 -0
  439. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_image.html.erb +16 -0
  440. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_numeric.html.erb +4 -0
  441. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_phone.html.erb +3 -0
  442. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_post_types.html.erb +8 -0
  443. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_posts.html.erb +14 -0
  444. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_private_file.html.erb +4 -0
  445. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_radio.html.erb +5 -0
  446. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select.html.erb +7 -0
  447. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_select_eval.html.erb +3 -0
  448. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_text_area.html.erb +3 -0
  449. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_text_box.html.erb +3 -0
  450. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_url.html.erb +3 -0
  451. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_users.html.erb +8 -0
  452. data/app/views/camaleon_cms/admin/settings/custom_fields/fields/_video.html.erb +4 -0
  453. data/app/views/camaleon_cms/admin/settings/custom_fields/form.html.erb +167 -0
  454. data/app/views/camaleon_cms/admin/settings/custom_fields/index.html.erb +111 -0
  455. data/app/views/camaleon_cms/admin/settings/languages.html.erb +60 -0
  456. data/app/views/camaleon_cms/admin/settings/post_types/_form.html.erb +171 -0
  457. data/app/views/camaleon_cms/admin/settings/post_types/edit.html.erb +14 -0
  458. data/app/views/camaleon_cms/admin/settings/post_types/index.html.erb +55 -0
  459. data/app/views/camaleon_cms/admin/settings/shortcodes.html.erb +37 -0
  460. data/app/views/camaleon_cms/admin/settings/site.html.erb +98 -0
  461. data/app/views/camaleon_cms/admin/settings/sites/form.html.erb +35 -0
  462. data/app/views/camaleon_cms/admin/settings/sites/index.html.erb +60 -0
  463. data/app/views/camaleon_cms/admin/settings/theme.html.erb +20 -0
  464. data/app/views/camaleon_cms/admin/user_roles/form.html.erb +156 -0
  465. data/app/views/camaleon_cms/admin/user_roles/index.html.erb +57 -0
  466. data/app/views/camaleon_cms/admin/users/form.html.erb +161 -0
  467. data/app/views/camaleon_cms/admin/users/index.html.erb +63 -0
  468. data/app/views/camaleon_cms/admin/users/profile.html.erb +1 -0
  469. data/app/views/camaleon_cms/admin/users/profile/_activity.html.erb +180 -0
  470. data/app/views/camaleon_cms/admin/users/profile/_settings.html.erb +15 -0
  471. data/app/views/camaleon_cms/default_theme/category.html.erb +26 -0
  472. data/app/views/camaleon_cms/default_theme/category.json.jbuilder +15 -0
  473. data/app/views/camaleon_cms/default_theme/category.rss.builder +23 -0
  474. data/app/views/camaleon_cms/default_theme/custom_fields/audio.html.erb +3 -0
  475. data/app/views/camaleon_cms/default_theme/custom_fields/checkbox.html.erb +3 -0
  476. data/app/views/camaleon_cms/default_theme/custom_fields/checkboxes.html.erb +3 -0
  477. data/app/views/camaleon_cms/default_theme/custom_fields/colorpicker.html.erb +3 -0
  478. data/app/views/camaleon_cms/default_theme/custom_fields/date.html.erb +3 -0
  479. data/app/views/camaleon_cms/default_theme/custom_fields/editor.html.erb +3 -0
  480. data/app/views/camaleon_cms/default_theme/custom_fields/email.html.erb +3 -0
  481. data/app/views/camaleon_cms/default_theme/custom_fields/field_attrs.html.erb +3 -0
  482. data/app/views/camaleon_cms/default_theme/custom_fields/file.html.erb +3 -0
  483. data/app/views/camaleon_cms/default_theme/custom_fields/image.html.erb +3 -0
  484. data/app/views/camaleon_cms/default_theme/custom_fields/numeric.html.erb +3 -0
  485. data/app/views/camaleon_cms/default_theme/custom_fields/phone.html.erb +3 -0
  486. data/app/views/camaleon_cms/default_theme/custom_fields/posts.html.erb +3 -0
  487. data/app/views/camaleon_cms/default_theme/custom_fields/radio.html.erb +3 -0
  488. data/app/views/camaleon_cms/default_theme/custom_fields/select.html.erb +3 -0
  489. data/app/views/camaleon_cms/default_theme/custom_fields/select_eval.html.erb +3 -0
  490. data/app/views/camaleon_cms/default_theme/custom_fields/text_area.html.erb +3 -0
  491. data/app/views/camaleon_cms/default_theme/custom_fields/text_box.html.erb +3 -0
  492. data/app/views/camaleon_cms/default_theme/custom_fields/url.html.erb +3 -0
  493. data/app/views/camaleon_cms/default_theme/custom_fields/users.html.erb +3 -0
  494. data/app/views/camaleon_cms/default_theme/custom_fields/video.html.erb +3 -0
  495. data/app/views/camaleon_cms/default_theme/index.html.erb +70 -0
  496. data/app/views/camaleon_cms/default_theme/index.json.jbuilder +14 -0
  497. data/app/views/camaleon_cms/default_theme/partials/_breadcrumb.html.erb +10 -0
  498. data/app/views/camaleon_cms/default_theme/partials/_cama_category_entry.json.jbuilder +6 -0
  499. data/app/views/camaleon_cms/default_theme/partials/_cama_comments_entry.json.jbuilder +6 -0
  500. data/app/views/camaleon_cms/default_theme/partials/_cama_post_entry.json.jbuilder +6 -0
  501. data/app/views/camaleon_cms/default_theme/partials/_cama_post_type_entry.json.jbuilder +6 -0
  502. data/app/views/camaleon_cms/default_theme/partials/_cama_posts_entries.json.jbuilder +8 -0
  503. data/app/views/camaleon_cms/default_theme/partials/_cama_tag_entry.json.jbuilder +5 -0
  504. data/app/views/camaleon_cms/default_theme/partials/_cama_user_entry.json.jbuilder +5 -0
  505. data/app/views/camaleon_cms/default_theme/partials/_categories_list.html.erb +23 -0
  506. data/app/views/camaleon_cms/default_theme/partials/_comments.html.erb +48 -0
  507. data/app/views/camaleon_cms/default_theme/partials/_comments_list.html.erb +21 -0
  508. data/app/views/camaleon_cms/default_theme/partials/_comments_list2.html.erb +24 -0
  509. data/app/views/camaleon_cms/default_theme/partials/_flash_messages.html.erb +26 -0
  510. data/app/views/camaleon_cms/default_theme/partials/_forms.html.erb +19 -0
  511. data/app/views/camaleon_cms/default_theme/partials/_post_list_item.html.erb +13 -0
  512. data/app/views/camaleon_cms/default_theme/partials/_render_custom_field.html.erb +55 -0
  513. data/app/views/camaleon_cms/default_theme/partials/_search_form.html.erb +8 -0
  514. data/app/views/camaleon_cms/default_theme/partials/_sidebar.html.erb +66 -0
  515. data/app/views/camaleon_cms/default_theme/post_tag.html.erb +18 -0
  516. data/app/views/camaleon_cms/default_theme/post_tag.json.jbuilder +10 -0
  517. data/app/views/camaleon_cms/default_theme/post_tag.rss.builder +22 -0
  518. data/app/views/camaleon_cms/default_theme/post_type.html.erb +25 -0
  519. data/app/views/camaleon_cms/default_theme/post_type.json.jbuilder +13 -0
  520. data/app/views/camaleon_cms/default_theme/post_type.rss.builder +22 -0
  521. data/app/views/camaleon_cms/default_theme/profile.html.erb +18 -0
  522. data/app/views/camaleon_cms/default_theme/profile.json.jbuilder +4 -0
  523. data/app/views/camaleon_cms/default_theme/robots.text.erb +1 -0
  524. data/app/views/camaleon_cms/default_theme/rss.rss.builder +21 -0
  525. data/app/views/camaleon_cms/default_theme/search.html.erb +13 -0
  526. data/app/views/camaleon_cms/default_theme/search.json.jbuilder +1 -0
  527. data/app/views/camaleon_cms/default_theme/single.html.erb +32 -0
  528. data/app/views/camaleon_cms/default_theme/single.json.jbuilder +21 -0
  529. data/app/views/camaleon_cms/default_theme/single.rss.builder +12 -0
  530. data/app/views/camaleon_cms/default_theme/sitemap.html.erb +23 -0
  531. data/app/views/camaleon_cms/default_theme/sitemap.xml.builder +60 -0
  532. data/app/views/camaleon_cms/html_mailer/confirm_email.html.erb +3 -0
  533. data/app/views/camaleon_cms/html_mailer/mailer.html.erb +4 -0
  534. data/app/views/camaleon_cms/html_mailer/password_reset.html.erb +3 -0
  535. data/app/views/camaleon_cms/shortcode_templates/widget.html.erb +11 -0
  536. data/app/views/layouts/camaleon_cms/admin.html.erb +54 -0
  537. data/app/views/layouts/camaleon_cms/admin/_ajax.html.erb +8 -0
  538. data/app/views/layouts/camaleon_cms/admin/_flash_messages.html.erb +43 -0
  539. data/app/views/layouts/camaleon_cms/admin/_footer.html.erb +13 -0
  540. data/app/views/layouts/camaleon_cms/admin/_form_error.html.erb +10 -0
  541. data/app/views/layouts/camaleon_cms/admin/_header.html.erb +51 -0
  542. data/app/views/layouts/camaleon_cms/admin/_sidebar.html.erb +19 -0
  543. data/app/views/layouts/camaleon_cms/admin/installer.html.erb +35 -0
  544. data/app/views/layouts/camaleon_cms/application.html.erb +15 -0
  545. data/app/views/layouts/camaleon_cms/login.html.erb +22 -0
  546. data/app/views/layouts/camaleon_cms/mailer.html.erb +22 -0
  547. data/config/initializers/action_view.rb +56 -0
  548. data/config/initializers/active_record_extension.rb +104 -0
  549. data/config/initializers/assets.rb +27 -0
  550. data/config/initializers/custom_initializers.rb +10 -0
  551. data/config/initializers/mobu.rb +24 -0
  552. data/config/initializers/model_alias.rb +18 -0
  553. data/config/initializers/sass.rb +52 -0
  554. data/config/locales/ar.yml +275 -0
  555. data/config/locales/camaleon_cms/admin/ar.yml +683 -0
  556. data/config/locales/camaleon_cms/admin/de.yml +682 -0
  557. data/config/locales/camaleon_cms/admin/en.yml +682 -0
  558. data/config/locales/camaleon_cms/admin/es.yml +654 -0
  559. data/config/locales/camaleon_cms/admin/fr.yml +663 -0
  560. data/config/locales/camaleon_cms/admin/it.yml +633 -0
  561. data/config/locales/camaleon_cms/admin/js.yml +435 -0
  562. data/config/locales/camaleon_cms/admin/nl.yml +659 -0
  563. data/config/locales/camaleon_cms/admin/pt-BR.yml +643 -0
  564. data/config/locales/camaleon_cms/admin/pt.yml +641 -0
  565. data/config/locales/camaleon_cms/admin/ru.yml +670 -0
  566. data/config/locales/camaleon_cms/admin/uk.yml +670 -0
  567. data/config/locales/camaleon_cms/admin/zh-CH.yml +703 -0
  568. data/config/locales/camaleon_cms/common.yml +784 -0
  569. data/config/locales/camaleon_cms/languages.yml +167 -0
  570. data/config/locales/camaleon_cms/routes.yml +71 -0
  571. data/config/locales/de.yml +210 -0
  572. data/config/locales/en.yml +207 -0
  573. data/config/locales/es.yml +198 -0
  574. data/config/locales/fr.yml +207 -0
  575. data/config/locales/it.yml +205 -0
  576. data/config/locales/nl.yml +209 -0
  577. data/config/locales/pl.yml +237 -0
  578. data/config/locales/pt-BR.yml +203 -0
  579. data/config/locales/pt.yml +201 -0
  580. data/config/locales/ru.yml +207 -0
  581. data/config/locales/uk.yml +257 -0
  582. data/config/locales/zh-CH.yml +194 -0
  583. data/config/routes.rb +11 -0
  584. data/config/routes/admin.rb +148 -0
  585. data/config/routes/frontend.rb +96 -0
  586. data/config/system.json +19 -0
  587. data/db/migrate/20150611161134_post_table_into_utf8.rb +124 -0
  588. data/db/migrate/20150926095310_rename_column_posts.rb +18 -0
  589. data/db/migrate/20151212095328_add_confirm_token_to_users.rb +7 -0
  590. data/db/migrate/20160504155652_add_feature_to_posts.rb +5 -0
  591. data/db/migrate/20160504155653_move_first_name_of_users.rb +9 -0
  592. data/db/migrate/20160606135421_improve_menus_structure.rb +7 -0
  593. data/db/migrate/20160609121449_add_group_to_custom_field_values.rb +5 -0
  594. data/db/migrate/20161206211917_install_migrated_seo_plugin.rb +8 -0
  595. data/db/migrate/20161215202255_drop_user_relationship_table.rb +5 -0
  596. data/db/migrate/20180124132318_create_media.rb +17 -0
  597. data/db/migrate/20180704211100_adjust_field_length.rb +10 -0
  598. data/lib/camaleon_cms.rb +5 -0
  599. data/lib/camaleon_cms/engine.rb +84 -0
  600. data/lib/camaleon_cms/version.rb +3 -0
  601. data/lib/captcha/bumpyroad.ttf +0 -0
  602. data/lib/captcha/captcha_0.jpg +0 -0
  603. data/lib/captcha/captcha_1.jpg +0 -0
  604. data/lib/captcha/captcha_10.jpg +0 -0
  605. data/lib/captcha/captcha_11.jpg +0 -0
  606. data/lib/captcha/captcha_2.jpg +0 -0
  607. data/lib/captcha/captcha_3.jpg +0 -0
  608. data/lib/captcha/captcha_4.jpg +0 -0
  609. data/lib/captcha/captcha_5.jpg +0 -0
  610. data/lib/captcha/captcha_6.jpg +0 -0
  611. data/lib/captcha/captcha_7.jpg +0 -0
  612. data/lib/captcha/captcha_8.jpg +0 -0
  613. data/lib/captcha/captcha_9.jpg +0 -0
  614. data/lib/ext/array.rb +59 -0
  615. data/lib/ext/hash.rb +41 -0
  616. data/lib/ext/string.rb +162 -0
  617. data/lib/ext/translator.rb +84 -0
  618. data/lib/generators/camaleon_cms/gem_plugin_generator.rb +140 -0
  619. data/lib/generators/camaleon_cms/gem_plugin_template/app/controllers/plugins/my_plugin/admin_controller.rb +18 -0
  620. data/lib/generators/camaleon_cms/gem_plugin_template/app/controllers/plugins/my_plugin/front_controller.rb +8 -0
  621. data/lib/generators/camaleon_cms/gem_plugin_template/app/helpers/plugins/my_plugin/main_helper.rb +29 -0
  622. data/lib/generators/camaleon_cms/gem_plugin_template/app/models/plugins/my_plugin/my_plugin.rb +6 -0
  623. data/lib/generators/camaleon_cms/gem_plugin_template/app/views/plugins/my_plugin/admin/index.html.erb +9 -0
  624. data/lib/generators/camaleon_cms/gem_plugin_template/app/views/plugins/my_plugin/admin/settings.html.erb +21 -0
  625. data/lib/generators/camaleon_cms/gem_plugin_template/app/views/plugins/my_plugin/front/index.html.erb +2 -0
  626. data/lib/generators/camaleon_cms/gem_plugin_template/app/views/plugins/my_plugin/layouts/readme.txt +2 -0
  627. data/lib/generators/camaleon_cms/gem_plugin_template/config/camaleon_plugin.json +14 -0
  628. data/lib/generators/camaleon_cms/gem_plugin_template/config/initializers/custom_models.rb +5 -0
  629. data/lib/generators/camaleon_cms/install_generator.rb +43 -0
  630. data/lib/generators/camaleon_cms/install_template/apps/themes/readme.txt +0 -0
  631. data/lib/generators/camaleon_cms/install_template/plugin_routes.rb +22 -0
  632. data/lib/generators/camaleon_cms/install_template/system.json +11 -0
  633. data/lib/generators/camaleon_cms/theme_generator.rb +66 -0
  634. data/lib/generators/camaleon_cms/theme_template/assets/css/main.css +13 -0
  635. data/lib/generators/camaleon_cms/theme_template/assets/images/image.png +0 -0
  636. data/lib/generators/camaleon_cms/theme_template/assets/js/main.js +14 -0
  637. data/lib/generators/camaleon_cms/theme_template/config/config.json +14 -0
  638. data/lib/generators/camaleon_cms/theme_template/main_helper.rb +27 -0
  639. data/lib/generators/camaleon_cms/theme_template/views/admin/settings.html.erb +2 -0
  640. data/lib/generators/camaleon_cms/theme_template/views/index.html.erb +1 -0
  641. data/lib/generators/camaleon_cms/theme_template/views/layouts/index.html.erb +69 -0
  642. data/lib/generators/camaleon_cms/theme_template/views/partials/readme.txt +1 -0
  643. data/lib/plugin_routes.rb +439 -0
  644. data/lib/tasks/camaleon_cms/camaleon_tasks.rake +30 -0
  645. data/lib/tasks/camaleon_cms/rspec_test.rake +20 -0
  646. data/spec/dummy/README.rdoc +28 -0
  647. data/spec/dummy/Rakefile +6 -0
  648. data/spec/dummy/app/assets/config/manifest.js +8 -0
  649. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  650. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  651. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  652. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  653. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  654. data/spec/dummy/bin/bundle +3 -0
  655. data/spec/dummy/bin/rails +4 -0
  656. data/spec/dummy/bin/rake +4 -0
  657. data/spec/dummy/bin/setup +36 -0
  658. data/spec/dummy/bin/update +31 -0
  659. data/spec/dummy/bin/yarn +11 -0
  660. data/spec/dummy/config.ru +4 -0
  661. data/spec/dummy/config/application.rb +27 -0
  662. data/spec/dummy/config/boot.rb +5 -0
  663. data/spec/dummy/config/database.yml +25 -0
  664. data/spec/dummy/config/environment.rb +5 -0
  665. data/spec/dummy/config/environments/development.rb +41 -0
  666. data/spec/dummy/config/environments/production.rb +79 -0
  667. data/spec/dummy/config/environments/test.rb +44 -0
  668. data/spec/dummy/config/initializers/assets.rb +11 -0
  669. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  670. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  671. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  672. data/spec/dummy/config/initializers/inflections.rb +16 -0
  673. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  674. data/spec/dummy/config/initializers/session_store.rb +3 -0
  675. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  676. data/spec/dummy/config/locales/en.yml +23 -0
  677. data/spec/dummy/config/routes.rb +4 -0
  678. data/spec/dummy/config/secrets.yml +22 -0
  679. data/spec/dummy/db/schema.rb +186 -0
  680. data/spec/factories/post.rb +44 -0
  681. data/spec/factories/post_type.rb +9 -0
  682. data/spec/factories/site.rb +18 -0
  683. data/spec/factories/user.rb +19 -0
  684. data/spec/features/admin/categories_spec.rb +25 -0
  685. data/spec/features/admin/comments_spec.rb +52 -0
  686. data/spec/features/admin/contact_form_spec.rb +60 -0
  687. data/spec/features/admin/content_groups_spec.rb +53 -0
  688. data/spec/features/admin/custom_fields_spec.rb +49 -0
  689. data/spec/features/admin/languages_spec.rb +37 -0
  690. data/spec/features/admin/media_spec.rb +50 -0
  691. data/spec/features/admin/menus_spec.rb +50 -0
  692. data/spec/features/admin/pages_spec.rb +35 -0
  693. data/spec/features/admin/plugins_spec.rb +29 -0
  694. data/spec/features/admin/posts_spec.rb +37 -0
  695. data/spec/features/admin/session_spec.rb +102 -0
  696. data/spec/features/admin/settings_spec.rb +17 -0
  697. data/spec/features/admin/shortcodes_spec.rb +11 -0
  698. data/spec/features/admin/sites_spec.rb +53 -0
  699. data/spec/features/admin/tags_spec.rb +34 -0
  700. data/spec/features/admin/themes_spec.rb +18 -0
  701. data/spec/features/admin/user_roles_spec.rb +66 -0
  702. data/spec/features/admin/users_spec.rb +81 -0
  703. data/spec/features/admin/widgets_spec.rb +59 -0
  704. data/spec/features/frontend/pages_spec.rb +136 -0
  705. data/spec/features/frontend/post_type_spec.rb +16 -0
  706. data/spec/helpers/email_helper_spec.rb +16 -0
  707. data/spec/helpers/short_code_helper_spec.rb +64 -0
  708. data/spec/helpers/uploader_helper_spec.rb +56 -0
  709. data/spec/mailers/send_mail_spec.rb +37 -0
  710. data/spec/models/post_spec.rb +50 -0
  711. data/spec/models/user_spec.rb +12 -0
  712. data/spec/rails_helper.rb +50 -0
  713. data/spec/routing/post_type_routes_spec.rb +12 -0
  714. data/spec/spec_helper.rb +167 -0
  715. data/spec/support/capybara_normalize_whitespace_patch.rb +17 -0
  716. data/spec/support/common.rb +119 -0
  717. data/spec/support/fixtures/rails.png +0 -0
  718. data/spec/support/wait_for_ajax.rb +30 -0
  719. metadata +1213 -0
@@ -0,0 +1,94 @@
1
+ // add actions to assign custom fields to any model selected
2
+ jQuery(function($){
3
+ var panel = $("#cama_custom_field_form");
4
+ var group_class_name = panel.attr("data-group_class_name");
5
+ var $content_fields = $( "#sortable-fields", panel);
6
+ $content_fields.sortable({
7
+ handle: ".panel-sortable"
8
+ });
9
+ var slugger_count = $content_fields.children().length;
10
+ cama_custom_field_set_slug();
11
+
12
+ $("#content-items-default > a", panel).click(function(){
13
+ var href = $(this).attr('href');
14
+ showLoading();
15
+ $.post(href, function(html){
16
+ hideLoading();
17
+ var li = $('<li class="item">' + html + '</li>');
18
+ $content_fields.append(li);
19
+ cama_custom_field_set_slug(li);
20
+ var title_field = li.find("input.text-title");
21
+ title_field.val(title_field.val() + '-' + (slugger_count ++));
22
+ title_field.trigger("keyup");
23
+ $('[data-toggle="tooltip"], a[title!=""]', $content_fields).tooltip();
24
+ });
25
+ return false;
26
+ });
27
+
28
+ panel.on("click", ".panel-delete", function(){
29
+ var parent = $(this).parents(".item:first");
30
+ if(confirm(I18n("msg.delete_item"))){
31
+ parent.remove()
32
+ }
33
+ return false;
34
+ });
35
+
36
+ $('#select_assign_group', panel).change(function(){
37
+ var option = $(this).find('option:checked');
38
+ _change_additional_select(option);
39
+ var txt_help = option.data('help');
40
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
41
+ $('#select_assign_group_help', panel).html(txt_help);
42
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ' ' + option.text());
43
+ }).val(_search_group_class_name(group_class_name)).trigger('change');
44
+
45
+ $('#select_post_simple', panel).change(function(){
46
+ var option = $(this).find('option:checked');
47
+ var txt_help = option.data('help');
48
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
49
+ $('#select_assign_group_help', panel).html(txt_help);
50
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
51
+ }).val(group_class_name).trigger('change');
52
+
53
+ $('#select_category_simple', panel).change(function(){
54
+ var option = $(this).find('option:checked');
55
+ var txt_help = option.data('help');
56
+ if(txt_help) txt_help = '<div class="alert alert-info"><i class="fa fa-info-circle"></i>&nbsp; ' + txt_help + ' </div>';
57
+ $('#select_assign_group_help', panel).html(txt_help);
58
+ $('#select_assign_group_caption', panel).val(option.parent('optgroup').attr("label") + ': ' + option.text());
59
+ }).val(group_class_name).trigger('change');
60
+
61
+ function _change_additional_select(option){
62
+ var option_value = option.attr('value'),
63
+ additional_options = ['_post_simple', '_category_simple'];
64
+
65
+ for (key in additional_options) {
66
+ if (option_value === additional_options[key]){
67
+ $('#select'+additional_options[key], panel).show().removeAttr('disabled');
68
+ }else{
69
+ $('#select'+additional_options[key], panel).hide().attr('disabled','disabled');
70
+ }
71
+ }
72
+ }
73
+
74
+ function _search_group_class_name(group_class_name) {
75
+ if (group_class_name.search("Post,") == 0) group_class_name = '_post_simple';
76
+ if (group_class_name.search("Category_Post,") == 0) group_class_name = '_category_simple';
77
+ return group_class_name;
78
+ }
79
+
80
+ function cama_custom_field_set_slug(_panel){
81
+ $('.text-slug:not(.runned)', _panel || panel).each(function(){
82
+ var $parent = $(this).parents('.panel-item');
83
+ var $label = $parent.find('.span-title');
84
+ $(this).slugify($parent.find('.text-title'), {
85
+ slugFunc: function(str, originalFunc) {
86
+ $label.html(str);
87
+ return originalFunc(str);
88
+ }
89
+ }
90
+ );
91
+ $(this).addClass('runned')
92
+ });
93
+ }
94
+ });
@@ -0,0 +1,1317 @@
1
+ /**
2
+ * Intro.js v1.1.1
3
+ * https://github.com/usablica/intro.js
4
+ * MIT licensed
5
+ *
6
+ * Copyright (C) 2013 usabli.ca - A weekend project by Afshin Mehrabani (@afshinmeh)
7
+ */
8
+
9
+ (function (root, factory) {
10
+ if (typeof exports === 'object') {
11
+ // CommonJS
12
+ factory(exports);
13
+ } else if (typeof define === 'function' && define.amd) {
14
+ // AMD. Register as an anonymous module.
15
+ define(['exports'], factory);
16
+ } else {
17
+ // Browser globals
18
+ factory(root);
19
+ }
20
+ } (this, function (exports) {
21
+ //Default config/variables
22
+ var VERSION = '1.1.1';
23
+
24
+ /**
25
+ * IntroJs main class
26
+ *
27
+ * @class IntroJs
28
+ */
29
+ function IntroJs(obj) {
30
+ this._targetElement = obj;
31
+
32
+ this._options = {
33
+ /* Next button label in tooltip box */
34
+ nextLabel: 'Next &rarr;',
35
+ /* Previous button label in tooltip box */
36
+ prevLabel: '&larr; Back',
37
+ /* Skip button label in tooltip box */
38
+ skipLabel: 'Skip',
39
+ /* Done button label in tooltip box */
40
+ doneLabel: 'Done',
41
+ /* Default tooltip box position */
42
+ tooltipPosition: 'bottom',
43
+ /* Next CSS class for tooltip boxes */
44
+ tooltipClass: '',
45
+ /* CSS class that is added to the helperLayer */
46
+ highlightClass: '',
47
+ /* Close introduction when pressing Escape button? */
48
+ exitOnEsc: true,
49
+ /* Close introduction when clicking on overlay layer? */
50
+ exitOnOverlayClick: true,
51
+ /* Show step numbers in introduction? */
52
+ showStepNumbers: true,
53
+ /* Let user use keyboard to navigate the tour? */
54
+ keyboardNavigation: true,
55
+ /* Show tour control buttons? */
56
+ showButtons: true,
57
+ /* Show tour bullets? */
58
+ showBullets: true,
59
+ /* Show tour progress? */
60
+ showProgress: false,
61
+ /* Scroll to highlighted element? */
62
+ scrollToElement: true,
63
+ /* Set the overlay opacity */
64
+ overlayOpacity: 0.8,
65
+ /* Precedence of positions, when auto is enabled */
66
+ positionPrecedence: ["bottom", "top", "right", "left"],
67
+ /* Disable an interaction with element? */
68
+ disableInteraction: false
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Initiate a new introduction/guide from an element in the page
74
+ *
75
+ * @api private
76
+ * @method _introForElement
77
+ * @param {Object} targetElm
78
+ * @returns {Boolean} Success or not?
79
+ */
80
+ function _introForElement(targetElm) {
81
+ var introItems = [],
82
+ self = this;
83
+
84
+ if (this._options.steps) {
85
+ //use steps passed programmatically
86
+ for (var i = 0, stepsLength = this._options.steps.length; i < stepsLength; i++) {
87
+ var currentItem = _cloneObject(this._options.steps[i]);
88
+ //set the step
89
+ currentItem.step = introItems.length + 1;
90
+ //use querySelector function only when developer used CSS selector
91
+ if (typeof(currentItem.element) === 'string') {
92
+ //grab the element with given selector from the page
93
+ currentItem.element = document.querySelector(currentItem.element);
94
+ }
95
+
96
+ //intro without element
97
+ if (typeof(currentItem.element) === 'undefined' || currentItem.element == null) {
98
+ var floatingElementQuery = document.querySelector(".introjsFloatingElement");
99
+
100
+ if (floatingElementQuery == null) {
101
+ floatingElementQuery = document.createElement('div');
102
+ floatingElementQuery.className = 'introjsFloatingElement';
103
+
104
+ document.body.appendChild(floatingElementQuery);
105
+ }
106
+
107
+ currentItem.element = floatingElementQuery;
108
+ currentItem.position = 'floating';
109
+ }
110
+
111
+ if (currentItem.element != null) {
112
+ introItems.push(currentItem);
113
+ }
114
+ }
115
+
116
+ } else {
117
+ //use steps from data-* annotations
118
+ var allIntroSteps = targetElm.querySelectorAll('*[data-intro]');
119
+ //if there's no element to intro
120
+ if (allIntroSteps.length < 1) {
121
+ return false;
122
+ }
123
+
124
+ //first add intro items with data-step
125
+ for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {
126
+ var currentElement = allIntroSteps[i];
127
+ var step = parseInt(currentElement.getAttribute('data-step'), 10);
128
+
129
+ if (step > 0) {
130
+ introItems[step - 1] = {
131
+ element: currentElement,
132
+ intro: currentElement.getAttribute('data-intro'),
133
+ step: parseInt(currentElement.getAttribute('data-step'), 10),
134
+ tooltipClass: currentElement.getAttribute('data-tooltipClass'),
135
+ highlightClass: currentElement.getAttribute('data-highlightClass'),
136
+ position: currentElement.getAttribute('data-position') || this._options.tooltipPosition
137
+ };
138
+ }
139
+ }
140
+
141
+ //next add intro items without data-step
142
+ //todo: we need a cleanup here, two loops are redundant
143
+ var nextStep = 0;
144
+ for (var i = 0, elmsLength = allIntroSteps.length; i < elmsLength; i++) {
145
+ var currentElement = allIntroSteps[i];
146
+
147
+ if (currentElement.getAttribute('data-step') == null) {
148
+
149
+ while (true) {
150
+ if (typeof introItems[nextStep] == 'undefined') {
151
+ break;
152
+ } else {
153
+ nextStep++;
154
+ }
155
+ }
156
+
157
+ introItems[nextStep] = {
158
+ element: currentElement,
159
+ intro: currentElement.getAttribute('data-intro'),
160
+ step: nextStep + 1,
161
+ tooltipClass: currentElement.getAttribute('data-tooltipClass'),
162
+ highlightClass: currentElement.getAttribute('data-highlightClass'),
163
+ position: currentElement.getAttribute('data-position') || this._options.tooltipPosition
164
+ };
165
+ }
166
+ }
167
+ }
168
+
169
+ //removing undefined/null elements
170
+ var tempIntroItems = [];
171
+ for (var z = 0; z < introItems.length; z++) {
172
+ introItems[z] && tempIntroItems.push(introItems[z]); // copy non-empty values to the end of the array
173
+ }
174
+
175
+ introItems = tempIntroItems;
176
+
177
+ //Ok, sort all items with given steps
178
+ introItems.sort(function (a, b) {
179
+ return a.step - b.step;
180
+ });
181
+
182
+ //set it to the introJs object
183
+ self._introItems = introItems;
184
+
185
+ //add overlay layer to the page
186
+ if(_addOverlayLayer.call(self, targetElm)) {
187
+ //then, start the show
188
+ _nextStep.call(self);
189
+
190
+ var skipButton = targetElm.querySelector('.introjs-skipbutton'),
191
+ nextStepButton = targetElm.querySelector('.introjs-nextbutton');
192
+
193
+ self._onKeyDown = function(e) {
194
+ if (e.keyCode === 27 && self._options.exitOnEsc == true) {
195
+ //escape key pressed, exit the intro
196
+ //check if exit callback is defined
197
+ if (self._introExitCallback != undefined) {
198
+ self._introExitCallback.call(self);
199
+ }
200
+ _exitIntro.call(self, targetElm);
201
+ } else if(e.keyCode === 37) {
202
+ //left arrow
203
+ _previousStep.call(self);
204
+ } else if (e.keyCode === 39) {
205
+ //right arrow
206
+ _nextStep.call(self);
207
+ } else if (e.keyCode === 13) {
208
+ //srcElement === ie
209
+ var target = e.target || e.srcElement;
210
+ if (target && target.className.indexOf('introjs-prevbutton') > 0) {
211
+ //user hit enter while focusing on previous button
212
+ _previousStep.call(self);
213
+ } else if (target && target.className.indexOf('introjs-skipbutton') > 0) {
214
+ //user hit enter while focusing on skip button
215
+ if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {
216
+ self._introCompleteCallback.call(self);
217
+ }
218
+ //check if any callback is defined
219
+ if (self._introExitCallback != undefined) {
220
+ self._introExitCallback.call(self);
221
+ }
222
+ _exitIntro.call(self, targetElm);
223
+ } else {
224
+ //default behavior for responding to enter
225
+ _nextStep.call(self);
226
+ }
227
+
228
+ //prevent default behaviour on hitting Enter, to prevent steps being skipped in some browsers
229
+ if(e.preventDefault) {
230
+ e.preventDefault();
231
+ } else {
232
+ e.returnValue = false;
233
+ }
234
+ }
235
+ };
236
+
237
+ self._onResize = function(e) {
238
+ _setHelperLayerPosition.call(self, document.querySelector('.introjs-helperLayer'));
239
+ _setHelperLayerPosition.call(self, document.querySelector('.introjs-tooltipReferenceLayer'));
240
+ };
241
+
242
+ if (window.addEventListener) {
243
+ if (this._options.keyboardNavigation) {
244
+ window.addEventListener('keydown', self._onKeyDown, true);
245
+ }
246
+ //for window resize
247
+ window.addEventListener('resize', self._onResize, true);
248
+ } else if (document.attachEvent) { //IE
249
+ if (this._options.keyboardNavigation) {
250
+ document.attachEvent('onkeydown', self._onKeyDown);
251
+ }
252
+ //for window resize
253
+ document.attachEvent('onresize', self._onResize);
254
+ }
255
+ }
256
+ return false;
257
+ }
258
+
259
+ /*
260
+ * makes a copy of the object
261
+ * @api private
262
+ * @method _cloneObject
263
+ */
264
+ function _cloneObject(object) {
265
+ if (object == null || typeof (object) != 'object' || typeof (object.nodeType) != 'undefined') {
266
+ return object;
267
+ }
268
+ var temp = {};
269
+ for (var key in object) {
270
+ if (typeof (jQuery) != 'undefined' && object[key] instanceof jQuery) {
271
+ temp[key] = object[key];
272
+ } else {
273
+ temp[key] = _cloneObject(object[key]);
274
+ }
275
+ }
276
+ return temp;
277
+ }
278
+ /**
279
+ * Go to specific step of introduction
280
+ *
281
+ * @api private
282
+ * @method _goToStep
283
+ */
284
+ function _goToStep(step) {
285
+ //because steps starts with zero
286
+ this._currentStep = step - 2;
287
+ if (typeof (this._introItems) !== 'undefined') {
288
+ _nextStep.call(this);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Go to next step on intro
294
+ *
295
+ * @api private
296
+ * @method _nextStep
297
+ */
298
+ function _nextStep() {
299
+ this._direction = 'forward';
300
+
301
+ if (typeof (this._currentStep) === 'undefined') {
302
+ this._currentStep = 0;
303
+ } else {
304
+ ++this._currentStep;
305
+ }
306
+
307
+ if ((this._introItems.length) <= this._currentStep) {
308
+ //end of the intro
309
+ //check if any callback is defined
310
+ if (typeof (this._introCompleteCallback) === 'function') {
311
+ this._introCompleteCallback.call(this);
312
+ }
313
+ _exitIntro.call(this, this._targetElement);
314
+ return;
315
+ }
316
+
317
+ var nextStep = this._introItems[this._currentStep];
318
+ if (typeof (this._introBeforeChangeCallback) !== 'undefined') {
319
+ this._introBeforeChangeCallback.call(this, nextStep.element);
320
+ }
321
+
322
+ //_showElement.call(this, nextStep);
323
+ var w = $(nextStep.element).attr("data-wait");
324
+ var thiss = this;
325
+ var _f = function(){ _showElement.call(thiss, nextStep); };
326
+ if(w) setTimeout(_f, w); else _f();
327
+ }
328
+
329
+ /**
330
+ * Go to previous step on intro
331
+ *
332
+ * @api private
333
+ * @method _nextStep
334
+ */
335
+ function _previousStep() {
336
+ this._direction = 'backward';
337
+
338
+ if (this._currentStep === 0) {
339
+ return false;
340
+ }
341
+
342
+ var nextStep = this._introItems[--this._currentStep];
343
+ if (typeof (this._introBeforeChangeCallback) !== 'undefined') {
344
+ this._introBeforeChangeCallback.call(this, nextStep.element);
345
+ }
346
+
347
+ //_showElement.call(this, nextStep);
348
+ var w = $(nextStep.element).attr("data-wait");
349
+ var thiss = this;
350
+ var _f = function(){ _showElement.call(thiss, nextStep); };
351
+ if(w) setTimeout(_f, w); else _f();
352
+ }
353
+
354
+ /**
355
+ * Exit from intro
356
+ *
357
+ * @api private
358
+ * @method _exitIntro
359
+ * @param {Object} targetElement
360
+ */
361
+ function _exitIntro(targetElement) {
362
+ //remove overlay layer from the page
363
+ var overlayLayer = targetElement.querySelector('.introjs-overlay');
364
+
365
+ //return if intro already completed or skipped
366
+ if (overlayLayer == null) {
367
+ return;
368
+ }
369
+
370
+ //for fade-out animation
371
+ overlayLayer.style.opacity = 0;
372
+ setTimeout(function () {
373
+ if (overlayLayer.parentNode) {
374
+ overlayLayer.parentNode.removeChild(overlayLayer);
375
+ }
376
+ }, 500);
377
+
378
+ //remove all helper layers
379
+ var helperLayer = targetElement.querySelector('.introjs-helperLayer');
380
+ if (helperLayer) {
381
+ helperLayer.parentNode.removeChild(helperLayer);
382
+ }
383
+
384
+ var referenceLayer = targetElement.querySelector('.introjs-tooltipReferenceLayer');
385
+ if (referenceLayer) {
386
+ referenceLayer.parentNode.removeChild(referenceLayer);
387
+ }
388
+ //remove disableInteractionLayer
389
+ var disableInteractionLayer = targetElement.querySelector('.introjs-disableInteraction');
390
+ if (disableInteractionLayer) {
391
+ disableInteractionLayer.parentNode.removeChild(disableInteractionLayer);
392
+ }
393
+
394
+ //remove intro floating element
395
+ var floatingElement = document.querySelector('.introjsFloatingElement');
396
+ if (floatingElement) {
397
+ floatingElement.parentNode.removeChild(floatingElement);
398
+ }
399
+
400
+ //remove `introjs-showElement` class from the element
401
+ var showElement = document.querySelector('.introjs-showElement');
402
+ if (showElement) {
403
+ showElement.className = showElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\s+|\s+$/g, ''); // This is a manual trim.
404
+ }
405
+
406
+ //remove `introjs-fixParent` class from the elements
407
+ var fixParents = document.querySelectorAll('.introjs-fixParent');
408
+ if (fixParents && fixParents.length > 0) {
409
+ for (var i = fixParents.length - 1; i >= 0; i--) {
410
+ fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\s+|\s+$/g, '');
411
+ }
412
+ }
413
+
414
+ //clean listeners
415
+ if (window.removeEventListener) {
416
+ window.removeEventListener('keydown', this._onKeyDown, true);
417
+ } else if (document.detachEvent) { //IE
418
+ document.detachEvent('onkeydown', this._onKeyDown);
419
+ }
420
+
421
+ //set the step to zero
422
+ this._currentStep = undefined;
423
+ }
424
+
425
+ /**
426
+ * Render tooltip box in the page
427
+ *
428
+ * @api private
429
+ * @method _placeTooltip
430
+ * @param {HTMLElement} targetElement
431
+ * @param {HTMLElement} tooltipLayer
432
+ * @param {HTMLElement} arrowLayer
433
+ * @param {HTMLElement} helperNumberLayer
434
+ */
435
+ function _placeTooltip(targetElement, tooltipLayer, arrowLayer, helperNumberLayer) {
436
+ var tooltipCssClass = '',
437
+ currentStepObj,
438
+ tooltipOffset,
439
+ targetOffset,
440
+ windowSize,
441
+ currentTooltipPosition;
442
+
443
+ //reset the old style
444
+ tooltipLayer.style.top = null;
445
+ tooltipLayer.style.right = null;
446
+ tooltipLayer.style.bottom = null;
447
+ tooltipLayer.style.left = null;
448
+ tooltipLayer.style.marginLeft = null;
449
+ tooltipLayer.style.marginTop = null;
450
+
451
+ arrowLayer.style.display = 'inherit';
452
+
453
+ if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {
454
+ helperNumberLayer.style.top = null;
455
+ helperNumberLayer.style.left = null;
456
+ }
457
+
458
+ //prevent error when `this._currentStep` is undefined
459
+ if (!this._introItems[this._currentStep]) return;
460
+
461
+ //if we have a custom css class for each step
462
+ currentStepObj = this._introItems[this._currentStep];
463
+ if (typeof (currentStepObj.tooltipClass) === 'string') {
464
+ tooltipCssClass = currentStepObj.tooltipClass;
465
+ } else {
466
+ tooltipCssClass = this._options.tooltipClass;
467
+ }
468
+
469
+ tooltipLayer.className = ('introjs-tooltip ' + tooltipCssClass).replace(/^\s+|\s+$/g, '');
470
+
471
+ currentTooltipPosition = this._introItems[this._currentStep].position;
472
+ if ((currentTooltipPosition == "auto" || this._options.tooltipPosition == "auto")) {
473
+ if (currentTooltipPosition != "floating") { // Floating is always valid, no point in calculating
474
+ currentTooltipPosition = _determineAutoPosition.call(this, targetElement, tooltipLayer, currentTooltipPosition);
475
+ }
476
+ }
477
+ targetOffset = _getOffset(targetElement);
478
+ tooltipOffset = _getOffset(tooltipLayer);
479
+ windowSize = _getWinSize();
480
+ switch (currentTooltipPosition) {
481
+ case 'top':
482
+ arrowLayer.className = 'introjs-arrow bottom';
483
+
484
+ var tooltipLayerStyleLeft = 15;
485
+ _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);
486
+ tooltipLayer.style.bottom = (targetOffset.height + 20) + 'px';
487
+ break;
488
+ case 'right':
489
+ tooltipLayer.style.left = (targetOffset.width + 20) + 'px';
490
+ if (targetOffset.top + tooltipOffset.height > windowSize.height) {
491
+ // In this case, right would have fallen below the bottom of the screen.
492
+ // Modify so that the bottom of the tooltip connects with the target
493
+ arrowLayer.className = "introjs-arrow left-bottom";
494
+ tooltipLayer.style.top = "-" + (tooltipOffset.height - targetOffset.height - 20) + "px";
495
+ } else {
496
+ arrowLayer.className = 'introjs-arrow left';
497
+ }
498
+ break;
499
+ case 'left':
500
+ if (this._options.showStepNumbers == true) {
501
+ tooltipLayer.style.top = '15px';
502
+ }
503
+
504
+ if (targetOffset.top + tooltipOffset.height > windowSize.height) {
505
+ // In this case, left would have fallen below the bottom of the screen.
506
+ // Modify so that the bottom of the tooltip connects with the target
507
+ tooltipLayer.style.top = "-" + (tooltipOffset.height - targetOffset.height - 20) + "px";
508
+ arrowLayer.className = 'introjs-arrow right-bottom';
509
+ } else {
510
+ arrowLayer.className = 'introjs-arrow right';
511
+ }
512
+ tooltipLayer.style.right = (targetOffset.width + 20) + 'px';
513
+
514
+ break;
515
+ case 'floating':
516
+ arrowLayer.style.display = 'none';
517
+
518
+ //we have to adjust the top and left of layer manually for intro items without element
519
+ tooltipLayer.style.left = '50%';
520
+ tooltipLayer.style.top = '50%';
521
+ tooltipLayer.style.marginLeft = '-' + (tooltipOffset.width / 2) + 'px';
522
+ tooltipLayer.style.marginTop = '-' + (tooltipOffset.height / 2) + 'px';
523
+
524
+ if (typeof(helperNumberLayer) != 'undefined' && helperNumberLayer != null) {
525
+ helperNumberLayer.style.left = '-' + ((tooltipOffset.width / 2) + 18) + 'px';
526
+ helperNumberLayer.style.top = '-' + ((tooltipOffset.height / 2) + 18) + 'px';
527
+ }
528
+
529
+ break;
530
+ case 'bottom-right-aligned':
531
+ arrowLayer.className = 'introjs-arrow top-right';
532
+
533
+ var tooltipLayerStyleRight = 0;
534
+ _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer);
535
+ tooltipLayer.style.top = (targetOffset.height + 20) + 'px';
536
+ break;
537
+
538
+ case 'bottom-middle-aligned':
539
+ arrowLayer.className = 'introjs-arrow top-middle';
540
+
541
+ var tooltipLayerStyleLeftRight = targetOffset.width / 2 - tooltipOffset.width / 2;
542
+ if (_checkLeft(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, tooltipLayer)) {
543
+ tooltipLayer.style.right = null;
544
+ _checkRight(targetOffset, tooltipLayerStyleLeftRight, tooltipOffset, windowSize, tooltipLayer);
545
+ }
546
+ tooltipLayer.style.top = (targetOffset.height + 20) + 'px';
547
+ break;
548
+
549
+ case 'bottom-left-aligned':
550
+ // Bottom-left-aligned is the same as the default bottom
551
+ case 'bottom':
552
+ // Bottom going to follow the default behavior
553
+ default:
554
+ arrowLayer.className = 'introjs-arrow top';
555
+
556
+ var tooltipLayerStyleLeft = 0;
557
+ _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer);
558
+ tooltipLayer.style.top = (targetOffset.height + 20) + 'px';
559
+ break;
560
+ }
561
+ }
562
+
563
+ /**
564
+ * Set tooltip left so it doesn't go off the right side of the window
565
+ *
566
+ * @return boolean true, if tooltipLayerStyleLeft is ok. false, otherwise.
567
+ */
568
+ function _checkRight(targetOffset, tooltipLayerStyleLeft, tooltipOffset, windowSize, tooltipLayer) {
569
+ if (targetOffset.left + tooltipLayerStyleLeft + tooltipOffset.width > windowSize.width) {
570
+ // off the right side of the window
571
+ tooltipLayer.style.left = (windowSize.width - tooltipOffset.width - targetOffset.left) + 'px';
572
+ return false;
573
+ }
574
+ tooltipLayer.style.left = tooltipLayerStyleLeft + 'px';
575
+ return true;
576
+ }
577
+
578
+ /**
579
+ * Set tooltip right so it doesn't go off the left side of the window
580
+ *
581
+ * @return boolean true, if tooltipLayerStyleRight is ok. false, otherwise.
582
+ */
583
+ function _checkLeft(targetOffset, tooltipLayerStyleRight, tooltipOffset, tooltipLayer) {
584
+ if (targetOffset.left + targetOffset.width - tooltipLayerStyleRight - tooltipOffset.width < 0) {
585
+ // off the left side of the window
586
+ tooltipLayer.style.left = (-targetOffset.left) + 'px';
587
+ return false;
588
+ }
589
+ tooltipLayer.style.right = tooltipLayerStyleRight + 'px';
590
+ return true;
591
+ }
592
+
593
+ /**
594
+ * Determines the position of the tooltip based on the position precedence and availability
595
+ * of screen space.
596
+ *
597
+ * @param {Object} targetElement
598
+ * @param {Object} tooltipLayer
599
+ * @param {Object} desiredTooltipPosition
600
+ *
601
+ */
602
+ function _determineAutoPosition(targetElement, tooltipLayer, desiredTooltipPosition) {
603
+
604
+ // Take a clone of position precedence. These will be the available
605
+ var possiblePositions = this._options.positionPrecedence.slice();
606
+
607
+ var windowSize = _getWinSize();
608
+ var tooltipHeight = _getOffset(tooltipLayer).height + 10;
609
+ var tooltipWidth = _getOffset(tooltipLayer).width + 20;
610
+ var targetOffset = _getOffset(targetElement);
611
+
612
+ // If we check all the possible areas, and there are no valid places for the tooltip, the element
613
+ // must take up most of the screen real estate. Show the tooltip floating in the middle of the screen.
614
+ var calculatedPosition = "floating";
615
+
616
+ // Check if the width of the tooltip + the starting point would spill off the right side of the screen
617
+ // If no, neither bottom or top are valid
618
+ if (targetOffset.left + tooltipWidth > windowSize.width || ((targetOffset.left + (targetOffset.width / 2)) - tooltipWidth) < 0) {
619
+ _removeEntry(possiblePositions, "bottom");
620
+ _removeEntry(possiblePositions, "top");
621
+ } else {
622
+ // Check for space below
623
+ if ((targetOffset.height + targetOffset.top + tooltipHeight) > windowSize.height) {
624
+ _removeEntry(possiblePositions, "bottom");
625
+ }
626
+
627
+ // Check for space above
628
+ if (targetOffset.top - tooltipHeight < 0) {
629
+ _removeEntry(possiblePositions, "top");
630
+ }
631
+ }
632
+
633
+ // Check for space to the right
634
+ if (targetOffset.width + targetOffset.left + tooltipWidth > windowSize.width) {
635
+ _removeEntry(possiblePositions, "right");
636
+ }
637
+
638
+ // Check for space to the left
639
+ if (targetOffset.left - tooltipWidth < 0) {
640
+ _removeEntry(possiblePositions, "left");
641
+ }
642
+
643
+ // At this point, our array only has positions that are valid. Pick the first one, as it remains in order
644
+ if (possiblePositions.length > 0) {
645
+ calculatedPosition = possiblePositions[0];
646
+ }
647
+
648
+ // If the requested position is in the list, replace our calculated choice with that
649
+ if (desiredTooltipPosition && desiredTooltipPosition != "auto") {
650
+ if (possiblePositions.indexOf(desiredTooltipPosition) > -1) {
651
+ calculatedPosition = desiredTooltipPosition;
652
+ }
653
+ }
654
+
655
+ return calculatedPosition;
656
+ }
657
+
658
+ /**
659
+ * Remove an entry from a string array if it's there, does nothing if it isn't there.
660
+ *
661
+ * @param {Array} stringArray
662
+ * @param {String} stringToRemove
663
+ */
664
+ function _removeEntry(stringArray, stringToRemove) {
665
+ if (stringArray.indexOf(stringToRemove) > -1) {
666
+ stringArray.splice(stringArray.indexOf(stringToRemove), 1);
667
+ }
668
+ }
669
+
670
+ /**
671
+ * Update the position of the helper layer on the screen
672
+ *
673
+ * @api private
674
+ * @method _setHelperLayerPosition
675
+ * @param {Object} helperLayer
676
+ */
677
+ function _setHelperLayerPosition(helperLayer) {
678
+ if (helperLayer) {
679
+ //prevent error when `this._currentStep` in undefined
680
+ if (!this._introItems[this._currentStep]) return;
681
+
682
+ var currentElement = this._introItems[this._currentStep],
683
+ elementPosition = _getOffset(currentElement.element),
684
+ widthHeightPadding = 10;
685
+
686
+ if (currentElement.position == 'floating') {
687
+ widthHeightPadding = 0;
688
+ }
689
+
690
+ //set new position to helper layer
691
+ helperLayer.setAttribute('style', 'width: ' + (elementPosition.width + widthHeightPadding) + 'px; ' +
692
+ 'height:' + (elementPosition.height + widthHeightPadding) + 'px; ' +
693
+ 'top:' + (elementPosition.top - 5) + 'px;' +
694
+ 'left: ' + (elementPosition.left - 5) + 'px;');
695
+
696
+ }
697
+ }
698
+
699
+ /**
700
+ * Add disableinteraction layer and adjust the size and position of the layer
701
+ *
702
+ * @api private
703
+ * @method _disableInteraction
704
+ */
705
+ function _disableInteraction () {
706
+ var disableInteractionLayer = document.querySelector('.introjs-disableInteraction');
707
+ if (disableInteractionLayer === null) {
708
+ disableInteractionLayer = document.createElement('div');
709
+ disableInteractionLayer.className = 'introjs-disableInteraction';
710
+ this._targetElement.appendChild(disableInteractionLayer);
711
+ }
712
+
713
+ _setHelperLayerPosition.call(this, disableInteractionLayer);
714
+ }
715
+
716
+ /**
717
+ * Show an element on the page
718
+ *
719
+ * @api private
720
+ * @method _showElement
721
+ * @param {Object} targetElement
722
+ */
723
+ function _showElement(targetElement) {
724
+
725
+ if (typeof (this._introChangeCallback) !== 'undefined') {
726
+ this._introChangeCallback.call(this, targetElement.element);
727
+ }
728
+
729
+ var self = this,
730
+ oldHelperLayer = document.querySelector('.introjs-helperLayer'),
731
+ oldReferenceLayer = document.querySelector('.introjs-tooltipReferenceLayer'),
732
+ highlightClass = 'introjs-helperLayer',
733
+ elementPosition = _getOffset(targetElement.element);
734
+
735
+ //check for a current step highlight class
736
+ if (typeof (targetElement.highlightClass) === 'string') {
737
+ highlightClass += (' ' + targetElement.highlightClass);
738
+ }
739
+ //check for options highlight class
740
+ if (typeof (this._options.highlightClass) === 'string') {
741
+ highlightClass += (' ' + this._options.highlightClass);
742
+ }
743
+
744
+ if (oldHelperLayer != null) {
745
+ var oldHelperNumberLayer = oldReferenceLayer.querySelector('.introjs-helperNumberLayer'),
746
+ oldtooltipLayer = oldReferenceLayer.querySelector('.introjs-tooltiptext'),
747
+ oldArrowLayer = oldReferenceLayer.querySelector('.introjs-arrow'),
748
+ oldtooltipContainer = oldReferenceLayer.querySelector('.introjs-tooltip'),
749
+ skipTooltipButton = oldReferenceLayer.querySelector('.introjs-skipbutton'),
750
+ prevTooltipButton = oldReferenceLayer.querySelector('.introjs-prevbutton'),
751
+ nextTooltipButton = oldReferenceLayer.querySelector('.introjs-nextbutton');
752
+
753
+ //update or reset the helper highlight class
754
+ oldHelperLayer.className = highlightClass;
755
+ //hide the tooltip
756
+ oldtooltipContainer.style.opacity = 0;
757
+ oldtooltipContainer.style.display = "none";
758
+
759
+ if (oldHelperNumberLayer != null) {
760
+ var lastIntroItem = this._introItems[(targetElement.step - 2 >= 0 ? targetElement.step - 2 : 0)];
761
+
762
+ if (lastIntroItem != null && (this._direction == 'forward' && lastIntroItem.position == 'floating') || (this._direction == 'backward' && targetElement.position == 'floating')) {
763
+ oldHelperNumberLayer.style.opacity = 0;
764
+ }
765
+ }
766
+
767
+ //set new position to helper layer
768
+ _setHelperLayerPosition.call(self, oldHelperLayer);
769
+ _setHelperLayerPosition.call(self, oldReferenceLayer);
770
+
771
+ //remove `introjs-fixParent` class from the elements
772
+ var fixParents = document.querySelectorAll('.introjs-fixParent');
773
+ if (fixParents && fixParents.length > 0) {
774
+ for (var i = fixParents.length - 1; i >= 0; i--) {
775
+ fixParents[i].className = fixParents[i].className.replace(/introjs-fixParent/g, '').replace(/^\s+|\s+$/g, '');
776
+ };
777
+ }
778
+
779
+ //remove old classes
780
+ var oldShowElement = document.querySelector('.introjs-showElement');
781
+ oldShowElement.className = oldShowElement.className.replace(/introjs-[a-zA-Z]+/g, '').replace(/^\s+|\s+$/g, '');
782
+
783
+ //we should wait until the CSS3 transition is competed (it's 0.3 sec) to prevent incorrect `height` and `width` calculation
784
+ if (self._lastShowElementTimer) {
785
+ clearTimeout(self._lastShowElementTimer);
786
+ }
787
+ self._lastShowElementTimer = setTimeout(function() {
788
+ //set current step to the label
789
+ if (oldHelperNumberLayer != null) {
790
+ oldHelperNumberLayer.innerHTML = targetElement.step;
791
+ }
792
+ //set current tooltip text
793
+ oldtooltipLayer.innerHTML = targetElement.intro;
794
+ //set the tooltip position
795
+ oldtooltipContainer.style.display = "block";
796
+ _placeTooltip.call(self, targetElement.element, oldtooltipContainer, oldArrowLayer, oldHelperNumberLayer);
797
+
798
+ //change active bullet
799
+ oldReferenceLayer.querySelector('.introjs-bullets li > a.active').className = '';
800
+ oldReferenceLayer.querySelector('.introjs-bullets li > a[data-stepnumber="' + targetElement.step + '"]').className = 'active';
801
+
802
+ oldReferenceLayer.querySelector('.introjs-progress .introjs-progressbar').setAttribute('style', 'width:' + _getProgress.call(self) + '%;');
803
+
804
+ //show the tooltip
805
+ oldtooltipContainer.style.opacity = 1;
806
+ if (oldHelperNumberLayer) oldHelperNumberLayer.style.opacity = 1;
807
+
808
+ //reset button focus
809
+ if (nextTooltipButton.tabIndex === -1) {
810
+ //tabindex of -1 means we are at the end of the tour - focus on skip / done
811
+ skipTooltipButton.focus();
812
+ } else {
813
+ //still in the tour, focus on next
814
+ nextTooltipButton.focus();
815
+ }
816
+ }, 350);
817
+
818
+ } else {
819
+ var helperLayer = document.createElement('div'),
820
+ referenceLayer = document.createElement('div'),
821
+ arrowLayer = document.createElement('div'),
822
+ tooltipLayer = document.createElement('div'),
823
+ tooltipTextLayer = document.createElement('div'),
824
+ bulletsLayer = document.createElement('div'),
825
+ progressLayer = document.createElement('div'),
826
+ buttonsLayer = document.createElement('div');
827
+
828
+ helperLayer.className = highlightClass;
829
+ referenceLayer.className = 'introjs-tooltipReferenceLayer';
830
+
831
+ //set new position to helper layer
832
+ _setHelperLayerPosition.call(self, helperLayer);
833
+ _setHelperLayerPosition.call(self, referenceLayer);
834
+
835
+ //add helper layer to target element
836
+ this._targetElement.appendChild(helperLayer);
837
+ this._targetElement.appendChild(referenceLayer);
838
+
839
+ arrowLayer.className = 'introjs-arrow';
840
+
841
+ tooltipTextLayer.className = 'introjs-tooltiptext';
842
+ tooltipTextLayer.innerHTML = targetElement.intro;
843
+
844
+ bulletsLayer.className = 'introjs-bullets';
845
+
846
+ if (this._options.showBullets === false) {
847
+ bulletsLayer.style.display = 'none';
848
+ }
849
+
850
+ var ulContainer = document.createElement('ul');
851
+
852
+ for (var i = 0, stepsLength = this._introItems.length; i < stepsLength; i++) {
853
+ var innerLi = document.createElement('li');
854
+ var anchorLink = document.createElement('a');
855
+
856
+ anchorLink.onclick = function() {
857
+ self.goToStep(this.getAttribute('data-stepnumber'));
858
+ };
859
+
860
+ if (i === (targetElement.step-1)) anchorLink.className = 'active';
861
+
862
+ anchorLink.href = 'javascript:void(0);';
863
+ anchorLink.innerHTML = "&nbsp;";
864
+ anchorLink.setAttribute('data-stepnumber', this._introItems[i].step);
865
+
866
+ innerLi.appendChild(anchorLink);
867
+ ulContainer.appendChild(innerLi);
868
+ }
869
+
870
+ bulletsLayer.appendChild(ulContainer);
871
+
872
+ progressLayer.className = 'introjs-progress';
873
+
874
+ if (this._options.showProgress === false) {
875
+ progressLayer.style.display = 'none';
876
+ }
877
+ var progressBar = document.createElement('div');
878
+ progressBar.className = 'introjs-progressbar';
879
+ progressBar.setAttribute('style', 'width:' + _getProgress.call(this) + '%;');
880
+
881
+ progressLayer.appendChild(progressBar);
882
+
883
+ buttonsLayer.className = 'introjs-tooltipbuttons';
884
+ if (this._options.showButtons === false) {
885
+ buttonsLayer.style.display = 'none';
886
+ }
887
+
888
+ tooltipLayer.className = 'introjs-tooltip';
889
+ tooltipLayer.appendChild(tooltipTextLayer);
890
+ tooltipLayer.appendChild(bulletsLayer);
891
+ tooltipLayer.appendChild(progressLayer);
892
+
893
+ //add helper layer number
894
+ if (this._options.showStepNumbers == true) {
895
+ var helperNumberLayer = document.createElement('span');
896
+ helperNumberLayer.className = 'introjs-helperNumberLayer';
897
+ helperNumberLayer.innerHTML = targetElement.step;
898
+ referenceLayer.appendChild(helperNumberLayer);
899
+ }
900
+
901
+ tooltipLayer.appendChild(arrowLayer);
902
+ referenceLayer.appendChild(tooltipLayer);
903
+
904
+ //next button
905
+ var nextTooltipButton = document.createElement('a');
906
+
907
+ nextTooltipButton.onclick = function() {
908
+ if (self._introItems.length - 1 != self._currentStep) {
909
+ _nextStep.call(self);
910
+ }
911
+ };
912
+
913
+ nextTooltipButton.href = 'javascript:void(0);';
914
+ nextTooltipButton.innerHTML = this._options.nextLabel;
915
+
916
+ //previous button
917
+ var prevTooltipButton = document.createElement('a');
918
+
919
+ prevTooltipButton.onclick = function() {
920
+ if (self._currentStep != 0) {
921
+ _previousStep.call(self);
922
+ }
923
+ };
924
+
925
+ prevTooltipButton.href = 'javascript:void(0);';
926
+ prevTooltipButton.innerHTML = this._options.prevLabel;
927
+
928
+ //skip button
929
+ var skipTooltipButton = document.createElement('a');
930
+ skipTooltipButton.className = 'introjs-button introjs-skipbutton btn';
931
+ skipTooltipButton.id = 'introjs_skipbutton';
932
+ skipTooltipButton.href = 'javascript:void(0);';
933
+ skipTooltipButton.innerHTML = this._options.skipLabel;
934
+
935
+ skipTooltipButton.onclick = function() {
936
+ if (self._introItems.length - 1 == self._currentStep && typeof (self._introCompleteCallback) === 'function') {
937
+ self._introCompleteCallback.call(self);
938
+ }
939
+
940
+ if (self._introItems.length - 1 != self._currentStep && typeof (self._introExitCallback) === 'function') {
941
+ self._introExitCallback.call(self);
942
+ }
943
+
944
+ _exitIntro.call(self, self._targetElement);
945
+ };
946
+
947
+ buttonsLayer.appendChild(skipTooltipButton);
948
+
949
+ //in order to prevent displaying next/previous button always
950
+ if (this._introItems.length > 1) {
951
+ buttonsLayer.appendChild(prevTooltipButton);
952
+ buttonsLayer.appendChild(nextTooltipButton);
953
+ }
954
+
955
+ tooltipLayer.appendChild(buttonsLayer);
956
+
957
+ //set proper position
958
+ _placeTooltip.call(self, targetElement.element, tooltipLayer, arrowLayer, helperNumberLayer);
959
+ }
960
+
961
+ //disable interaction
962
+ if (this._options.disableInteraction === true) {
963
+ _disableInteraction.call(self);
964
+ }
965
+
966
+ prevTooltipButton.removeAttribute('tabIndex');
967
+ nextTooltipButton.removeAttribute('tabIndex');
968
+
969
+ if (this._currentStep == 0 && this._introItems.length > 1) {
970
+ prevTooltipButton.className = 'introjs-button introjs-prevbutton introjs-disabled disabled btn btn-success';
971
+ prevTooltipButton.tabIndex = '-1';
972
+ nextTooltipButton.className = 'introjs-button introjs-nextbutton btn btn-primary';
973
+ skipTooltipButton.innerHTML = this._options.skipLabel;
974
+ } else if (this._introItems.length - 1 == this._currentStep || this._introItems.length == 1) {
975
+ skipTooltipButton.innerHTML = this._options.doneLabel;
976
+ prevTooltipButton.className = 'introjs-button introjs-prevbutton btn btn-success';
977
+ nextTooltipButton.className = 'introjs-button introjs-nextbutton introjs-disabled disabled btn btn-primary';
978
+ nextTooltipButton.tabIndex = '-1';
979
+ } else {
980
+ prevTooltipButton.className = 'introjs-button introjs-prevbutton btn btn-success';
981
+ nextTooltipButton.className = 'introjs-button introjs-nextbutton btn btn-primary';
982
+ skipTooltipButton.innerHTML = this._options.skipLabel;
983
+ }
984
+
985
+ //Set focus on "next" button, so that hitting Enter always moves you onto the next step
986
+ nextTooltipButton.focus();
987
+
988
+ //add target element position style
989
+ targetElement.element.className += ' introjs-showElement';
990
+
991
+ var currentElementPosition = _getPropValue(targetElement.element, 'position');
992
+ if (currentElementPosition !== 'absolute' &&
993
+ currentElementPosition !== 'relative') {
994
+ //change to new intro item
995
+ targetElement.element.className += ' introjs-relativePosition';
996
+ }
997
+
998
+ var parentElm = targetElement.element.parentNode;
999
+ while (parentElm != null) {
1000
+ if (parentElm.tagName.toLowerCase() === 'body') break;
1001
+
1002
+ //fix The Stacking Contenxt problem.
1003
+ //More detail: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context
1004
+ var zIndex = _getPropValue(parentElm, 'z-index');
1005
+ var opacity = parseFloat(_getPropValue(parentElm, 'opacity'));
1006
+ var transform = _getPropValue(parentElm, 'transform') || _getPropValue(parentElm, '-webkit-transform') || _getPropValue(parentElm, '-moz-transform') || _getPropValue(parentElm, '-ms-transform') || _getPropValue(parentElm, '-o-transform');
1007
+ if (/[0-9]+/.test(zIndex) || opacity < 1 || (transform !== 'none' && transform !== undefined)) {
1008
+ parentElm.className += ' introjs-fixParent';
1009
+ }
1010
+
1011
+ parentElm = parentElm.parentNode;
1012
+ }
1013
+
1014
+ if (!_elementInViewport(targetElement.element) && this._options.scrollToElement === true) {
1015
+ var rect = targetElement.element.getBoundingClientRect(),
1016
+ winHeight = _getWinSize().height,
1017
+ top = rect.bottom - (rect.bottom - rect.top),
1018
+ bottom = rect.bottom - winHeight;
1019
+
1020
+ //Scroll up
1021
+ if (top < 0 || targetElement.element.clientHeight > winHeight) {
1022
+ window.scrollBy(0, top - 30); // 30px padding from edge to look nice
1023
+
1024
+ //Scroll down
1025
+ } else {
1026
+ window.scrollBy(0, bottom + 100); // 70px + 30px padding from edge to look nice
1027
+ }
1028
+ }
1029
+
1030
+ if (typeof (this._introAfterChangeCallback) !== 'undefined') {
1031
+ this._introAfterChangeCallback.call(this, targetElement.element);
1032
+ }
1033
+ }
1034
+
1035
+ /**
1036
+ * Get an element CSS property on the page
1037
+ * Thanks to JavaScript Kit: http://www.javascriptkit.com/dhtmltutors/dhtmlcascade4.shtml
1038
+ *
1039
+ * @api private
1040
+ * @method _getPropValue
1041
+ * @param {Object} element
1042
+ * @param {String} propName
1043
+ * @returns Element's property value
1044
+ */
1045
+ function _getPropValue (element, propName) {
1046
+ var propValue = '';
1047
+ if (element.currentStyle) { //IE
1048
+ propValue = element.currentStyle[propName];
1049
+ } else if (document.defaultView && document.defaultView.getComputedStyle) { //Others
1050
+ propValue = document.defaultView.getComputedStyle(element, null).getPropertyValue(propName);
1051
+ }
1052
+
1053
+ //Prevent exception in IE
1054
+ if (propValue && propValue.toLowerCase) {
1055
+ return propValue.toLowerCase();
1056
+ } else {
1057
+ return propValue;
1058
+ }
1059
+ }
1060
+
1061
+ /**
1062
+ * Provides a cross-browser way to get the screen dimensions
1063
+ * via: http://stackoverflow.com/questions/5864467/internet-explorer-innerheight
1064
+ *
1065
+ * @api private
1066
+ * @method _getWinSize
1067
+ * @returns {Object} width and height attributes
1068
+ */
1069
+ function _getWinSize() {
1070
+ if (window.innerWidth != undefined) {
1071
+ return { width: window.innerWidth, height: window.innerHeight };
1072
+ } else {
1073
+ var D = document.documentElement;
1074
+ return { width: D.clientWidth, height: D.clientHeight };
1075
+ }
1076
+ }
1077
+
1078
+ /**
1079
+ * Add overlay layer to the page
1080
+ * http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
1081
+ *
1082
+ * @api private
1083
+ * @method _elementInViewport
1084
+ * @param {Object} el
1085
+ */
1086
+ function _elementInViewport(el) {
1087
+ var rect = el.getBoundingClientRect();
1088
+
1089
+ return (
1090
+ rect.top >= 0 &&
1091
+ rect.left >= 0 &&
1092
+ (rect.bottom+80) <= window.innerHeight && // add 80 to get the text right
1093
+ rect.right <= window.innerWidth
1094
+ );
1095
+ }
1096
+
1097
+ /**
1098
+ * Add overlay layer to the page
1099
+ *
1100
+ * @api private
1101
+ * @method _addOverlayLayer
1102
+ * @param {Object} targetElm
1103
+ */
1104
+ function _addOverlayLayer(targetElm) {
1105
+ var overlayLayer = document.createElement('div'),
1106
+ styleText = '',
1107
+ self = this;
1108
+
1109
+ //set css class name
1110
+ overlayLayer.className = 'introjs-overlay';
1111
+
1112
+ //check if the target element is body, we should calculate the size of overlay layer in a better way
1113
+ if (targetElm.tagName.toLowerCase() === 'body') {
1114
+ styleText += 'top: 0;bottom: 0; left: 0;right: 0;position: fixed;';
1115
+ overlayLayer.setAttribute('style', styleText);
1116
+ } else {
1117
+ //set overlay layer position
1118
+ var elementPosition = _getOffset(targetElm);
1119
+ if (elementPosition) {
1120
+ styleText += 'width: ' + elementPosition.width + 'px; height:' + elementPosition.height + 'px; top:' + elementPosition.top + 'px;left: ' + elementPosition.left + 'px;';
1121
+ overlayLayer.setAttribute('style', styleText);
1122
+ }
1123
+ }
1124
+
1125
+ targetElm.appendChild(overlayLayer);
1126
+
1127
+ overlayLayer.onclick = function() {
1128
+ if (self._options.exitOnOverlayClick == true) {
1129
+
1130
+ //check if any callback is defined
1131
+ if (self._introExitCallback != undefined) {
1132
+ self._introExitCallback.call(self);
1133
+ }
1134
+ _exitIntro.call(self, targetElm);
1135
+ }
1136
+ };
1137
+
1138
+ setTimeout(function() {
1139
+ styleText += 'opacity: ' + self._options.overlayOpacity.toString() + ';';
1140
+ overlayLayer.setAttribute('style', styleText);
1141
+ }, 10);
1142
+
1143
+ return true;
1144
+ }
1145
+
1146
+ /**
1147
+ * Get an element position on the page
1148
+ * Thanks to `meouw`: http://stackoverflow.com/a/442474/375966
1149
+ *
1150
+ * @api private
1151
+ * @method _getOffset
1152
+ * @param {Object} element
1153
+ * @returns Element's position info
1154
+ */
1155
+ function _getOffset(element) {
1156
+ var elementPosition = {};
1157
+
1158
+ //set width
1159
+ elementPosition.width = element.offsetWidth;
1160
+
1161
+ //set height
1162
+ elementPosition.height = element.offsetHeight;
1163
+
1164
+ //calculate element top and left
1165
+ var _x = 0;
1166
+ var _y = 0;
1167
+ while (element && !isNaN(element.offsetLeft) && !isNaN(element.offsetTop)) {
1168
+ _x += element.offsetLeft;
1169
+ _y += element.offsetTop;
1170
+ element = element.offsetParent;
1171
+ }
1172
+ //set top
1173
+ elementPosition.top = _y;
1174
+ //set left
1175
+ elementPosition.left = _x;
1176
+
1177
+ return elementPosition;
1178
+ }
1179
+
1180
+ /**
1181
+ * Gets the current progress percentage
1182
+ *
1183
+ * @api private
1184
+ * @method _getProgress
1185
+ * @returns current progress percentage
1186
+ */
1187
+ function _getProgress() {
1188
+ // Steps are 0 indexed
1189
+ var currentStep = parseInt((this._currentStep + 1), 10);
1190
+ return ((currentStep / this._introItems.length) * 100);
1191
+ }
1192
+
1193
+ /**
1194
+ * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
1195
+ * via: http://stackoverflow.com/questions/171251/how-can-i-merge-properties-of-two-javascript-objects-dynamically
1196
+ *
1197
+ * @param obj1
1198
+ * @param obj2
1199
+ * @returns obj3 a new object based on obj1 and obj2
1200
+ */
1201
+ function _mergeOptions(obj1,obj2) {
1202
+ var obj3 = {};
1203
+ for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
1204
+ for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
1205
+ return obj3;
1206
+ }
1207
+
1208
+ var introJs = function (targetElm) {
1209
+ if (typeof (targetElm) === 'object') {
1210
+ //Ok, create a new instance
1211
+ return new IntroJs(targetElm);
1212
+
1213
+ } else if (typeof (targetElm) === 'string') {
1214
+ //select the target element with query selector
1215
+ var targetElement = document.querySelector(targetElm);
1216
+
1217
+ if (targetElement) {
1218
+ return new IntroJs(targetElement);
1219
+ } else {
1220
+ throw new Error('There is no element with given selector.');
1221
+ }
1222
+ } else {
1223
+ return new IntroJs(document.body);
1224
+ }
1225
+ };
1226
+
1227
+ /**
1228
+ * Current IntroJs version
1229
+ *
1230
+ * @property version
1231
+ * @type String
1232
+ */
1233
+ introJs.version = VERSION;
1234
+
1235
+ //Prototype
1236
+ introJs.fn = IntroJs.prototype = {
1237
+ clone: function () {
1238
+ return new IntroJs(this);
1239
+ },
1240
+ setOption: function(option, value) {
1241
+ this._options[option] = value;
1242
+ return this;
1243
+ },
1244
+ setOptions: function(options) {
1245
+ this._options = _mergeOptions(this._options, options);
1246
+ return this;
1247
+ },
1248
+ start: function () {
1249
+ _introForElement.call(this, this._targetElement);
1250
+ return this;
1251
+ },
1252
+ goToStep: function(step) {
1253
+ _goToStep.call(this, step);
1254
+ return this;
1255
+ },
1256
+ nextStep: function() {
1257
+ _nextStep.call(this);
1258
+ return this;
1259
+ },
1260
+ previousStep: function() {
1261
+ _previousStep.call(this);
1262
+ return this;
1263
+ },
1264
+ exit: function() {
1265
+ _exitIntro.call(this, this._targetElement);
1266
+ return this;
1267
+ },
1268
+ refresh: function() {
1269
+ _setHelperLayerPosition.call(this, document.querySelector('.introjs-helperLayer'));
1270
+ _setHelperLayerPosition.call(this, document.querySelector('.introjs-tooltipReferenceLayer'));
1271
+ return this;
1272
+ },
1273
+ onbeforechange: function(providedCallback) {
1274
+ if (typeof (providedCallback) === 'function') {
1275
+ this._introBeforeChangeCallback = providedCallback;
1276
+ } else {
1277
+ throw new Error('Provided callback for onbeforechange was not a function');
1278
+ }
1279
+ return this;
1280
+ },
1281
+ onchange: function(providedCallback) {
1282
+ if (typeof (providedCallback) === 'function') {
1283
+ this._introChangeCallback = providedCallback;
1284
+ } else {
1285
+ throw new Error('Provided callback for onchange was not a function.');
1286
+ }
1287
+ return this;
1288
+ },
1289
+ onafterchange: function(providedCallback) {
1290
+ if (typeof (providedCallback) === 'function') {
1291
+ this._introAfterChangeCallback = providedCallback;
1292
+ } else {
1293
+ throw new Error('Provided callback for onafterchange was not a function');
1294
+ }
1295
+ return this;
1296
+ },
1297
+ oncomplete: function(providedCallback) {
1298
+ if (typeof (providedCallback) === 'function') {
1299
+ this._introCompleteCallback = providedCallback;
1300
+ } else {
1301
+ throw new Error('Provided callback for oncomplete was not a function.');
1302
+ }
1303
+ return this;
1304
+ },
1305
+ onexit: function(providedCallback) {
1306
+ if (typeof (providedCallback) === 'function') {
1307
+ this._introExitCallback = providedCallback;
1308
+ } else {
1309
+ throw new Error('Provided callback for onexit was not a function.');
1310
+ }
1311
+ return this;
1312
+ }
1313
+ };
1314
+
1315
+ exports.introJs = introJs;
1316
+ return introJs;
1317
+ }));