alchemy_cms 2.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. data/.gitignore +7 -0
  2. data/.yardopts +6 -0
  3. data/Gemfile +8 -0
  4. data/LICENSE +619 -0
  5. data/README.md +113 -0
  6. data/Rakefile +30 -0
  7. data/TODO.txt +1 -0
  8. data/alchemy.gemspec +36 -0
  9. data/app/controllers/admin/attachments_controller.rb +119 -0
  10. data/app/controllers/admin/clipboard_controller.rb +43 -0
  11. data/app/controllers/admin/contents_controller.rb +69 -0
  12. data/app/controllers/admin/elements_controller.rb +137 -0
  13. data/app/controllers/admin/essence_audios_controller.rb +14 -0
  14. data/app/controllers/admin/essence_files_controller.rb +35 -0
  15. data/app/controllers/admin/essence_flashes_controller.rb +14 -0
  16. data/app/controllers/admin/essence_pictures_controller.rb +89 -0
  17. data/app/controllers/admin/essence_videos_controller.rb +14 -0
  18. data/app/controllers/admin/languages_controller.rb +70 -0
  19. data/app/controllers/admin/layoutpages_controller.rb +11 -0
  20. data/app/controllers/admin/pages_controller.rb +244 -0
  21. data/app/controllers/admin/pictures_controller.rb +132 -0
  22. data/app/controllers/admin/trash_controller.rb +25 -0
  23. data/app/controllers/admin/users_controller.rb +75 -0
  24. data/app/controllers/admin_controller.rb +78 -0
  25. data/app/controllers/alchemy_controller.rb +239 -0
  26. data/app/controllers/attachments_controller.rb +30 -0
  27. data/app/controllers/elements_controller.rb +18 -0
  28. data/app/controllers/messages_controller.rb +98 -0
  29. data/app/controllers/pages_controller.rb +137 -0
  30. data/app/controllers/pictures_controller.rb +68 -0
  31. data/app/helpers/admin/attachments_helper.rb +7 -0
  32. data/app/helpers/admin/elements_helper.rb +28 -0
  33. data/app/helpers/admin/pages_helper.rb +3 -0
  34. data/app/helpers/admin/pictures_helper.rb +26 -0
  35. data/app/helpers/alchemy_helper.rb +1168 -0
  36. data/app/helpers/elements_helper.rb +2 -0
  37. data/app/helpers/errors_helper.rb +37 -0
  38. data/app/helpers/layout_helper.rb +37 -0
  39. data/app/helpers/pages_helper.rb +141 -0
  40. data/app/mailers/messages.rb +15 -0
  41. data/app/mailers/notifications.rb +23 -0
  42. data/app/models/attachment.rb +73 -0
  43. data/app/models/cell.rb +63 -0
  44. data/app/models/content.rb +145 -0
  45. data/app/models/element.rb +423 -0
  46. data/app/models/essence_audio.rb +17 -0
  47. data/app/models/essence_date.rb +20 -0
  48. data/app/models/essence_file.rb +17 -0
  49. data/app/models/essence_flash.rb +15 -0
  50. data/app/models/essence_html.rb +19 -0
  51. data/app/models/essence_picture.rb +27 -0
  52. data/app/models/essence_richtext.rb +50 -0
  53. data/app/models/essence_text.rb +28 -0
  54. data/app/models/essence_video.rb +17 -0
  55. data/app/models/folded_page.rb +3 -0
  56. data/app/models/language.rb +75 -0
  57. data/app/models/message.rb +57 -0
  58. data/app/models/page.rb +501 -0
  59. data/app/models/picture.rb +100 -0
  60. data/app/models/user.rb +72 -0
  61. data/app/models/user_session.rb +10 -0
  62. data/app/sweepers/content_sweeper.rb +20 -0
  63. data/app/sweepers/pages_sweeper.rb +46 -0
  64. data/app/sweepers/pictures_sweeper.rb +20 -0
  65. data/app/views/_contact.html.erb +3 -0
  66. data/app/views/_intro.html.erb +3 -0
  67. data/app/views/_news.html.erb +3 -0
  68. data/app/views/_newsletter_layout.html.erb +1 -0
  69. data/app/views/_search.html.erb +3 -0
  70. data/app/views/_standard.html.erb +1 -0
  71. data/app/views/admin/attachments/_attachment.html.erb +58 -0
  72. data/app/views/admin/attachments/_file_to_assign.html.erb +20 -0
  73. data/app/views/admin/attachments/_files_list.html.erb +24 -0
  74. data/app/views/admin/attachments/archive_overlay.html.erb +8 -0
  75. data/app/views/admin/attachments/create.js.erb +6 -0
  76. data/app/views/admin/attachments/edit.html.erb +12 -0
  77. data/app/views/admin/attachments/index.html.erb +30 -0
  78. data/app/views/admin/attachments/new.html.erb +11 -0
  79. data/app/views/admin/clipboard/clear.js.erb +6 -0
  80. data/app/views/admin/clipboard/index.html.erb +19 -0
  81. data/app/views/admin/clipboard/insert.js.erb +14 -0
  82. data/app/views/admin/clipboard/remove.js.erb +10 -0
  83. data/app/views/admin/contents/_missing.html.erb +20 -0
  84. data/app/views/admin/contents/create.js.erb +93 -0
  85. data/app/views/admin/contents/new.html.erb +15 -0
  86. data/app/views/admin/elements/_add_content.html.erb +16 -0
  87. data/app/views/admin/elements/_element.html.erb +22 -0
  88. data/app/views/admin/elements/_element_foot.html.erb +35 -0
  89. data/app/views/admin/elements/_element_head.html.erb +29 -0
  90. data/app/views/admin/elements/_elements_select.html.erb +8 -0
  91. data/app/views/admin/elements/_new_element_form.html.erb +25 -0
  92. data/app/views/admin/elements/_picture_editor.html.erb +25 -0
  93. data/app/views/admin/elements/create.js.erb +20 -0
  94. data/app/views/admin/elements/destroy.js.erb +6 -0
  95. data/app/views/admin/elements/fold.js.erb +37 -0
  96. data/app/views/admin/elements/index.html.erb +33 -0
  97. data/app/views/admin/elements/list.js.erb +20 -0
  98. data/app/views/admin/elements/new.html.erb +33 -0
  99. data/app/views/admin/elements/order.js.erb +7 -0
  100. data/app/views/admin/elements/trash.js.erb +13 -0
  101. data/app/views/admin/elements/update.js.erb +10 -0
  102. data/app/views/admin/essence_files/edit.html.erb +91 -0
  103. data/app/views/admin/essence_pictures/assign.js.erb +15 -0
  104. data/app/views/admin/essence_pictures/crop.html.erb +36 -0
  105. data/app/views/admin/essence_pictures/destroy.js.erb +17 -0
  106. data/app/views/admin/essence_pictures/edit.html.erb +75 -0
  107. data/app/views/admin/essence_pictures/update.js.erb +16 -0
  108. data/app/views/admin/index.html.erb +92 -0
  109. data/app/views/admin/infos.html.erb +5 -0
  110. data/app/views/admin/languages/_form.html.erb +34 -0
  111. data/app/views/admin/languages/_language.html.erb +35 -0
  112. data/app/views/admin/languages/edit.html.erb +1 -0
  113. data/app/views/admin/languages/index.html.erb +41 -0
  114. data/app/views/admin/languages/new.html.erb +1 -0
  115. data/app/views/admin/layoutpages/_layoutpage.html.erb +80 -0
  116. data/app/views/admin/layoutpages/index.html.erb +75 -0
  117. data/app/views/admin/leave.html.erb +11 -0
  118. data/app/views/admin/login.html.erb +46 -0
  119. data/app/views/admin/logout.html.erb +5 -0
  120. data/app/views/admin/pages/_contactform_links.html.erb +66 -0
  121. data/app/views/admin/pages/_create_language_form.html.erb +42 -0
  122. data/app/views/admin/pages/_external_link.html.erb +54 -0
  123. data/app/views/admin/pages/_file_link.html.erb +52 -0
  124. data/app/views/admin/pages/_internal_link.html.erb +47 -0
  125. data/app/views/admin/pages/_new_page_form.html.erb +29 -0
  126. data/app/views/admin/pages/_page.html.erb +114 -0
  127. data/app/views/admin/pages/_page_for_links.html.erb +43 -0
  128. data/app/views/admin/pages/_page_infos.html.erb +3 -0
  129. data/app/views/admin/pages/_page_status.html.erb +9 -0
  130. data/app/views/admin/pages/_sitemap.html.erb +99 -0
  131. data/app/views/admin/pages/configure.html.erb +71 -0
  132. data/app/views/admin/pages/configure_external.html.erb +40 -0
  133. data/app/views/admin/pages/destroy.js.erb +12 -0
  134. data/app/views/admin/pages/edit.html.erb +185 -0
  135. data/app/views/admin/pages/flush.js.erb +2 -0
  136. data/app/views/admin/pages/fold.js.erb +4 -0
  137. data/app/views/admin/pages/index.html.erb +108 -0
  138. data/app/views/admin/pages/link.html.erb +30 -0
  139. data/app/views/admin/pages/locked.html.erb +3 -0
  140. data/app/views/admin/pages/new.html.erb +50 -0
  141. data/app/views/admin/pages/show.html.erb +1 -0
  142. data/app/views/admin/pages/sort.js.erb +6 -0
  143. data/app/views/admin/pages/unlock.js.erb +8 -0
  144. data/app/views/admin/pages/update.js.erb +19 -0
  145. data/app/views/admin/partials/_flash.html.erb +4 -0
  146. data/app/views/admin/partials/_flash_notices.html.erb +5 -0
  147. data/app/views/admin/partials/_mainnavigation_entry.html.erb +27 -0
  148. data/app/views/admin/partials/_pagination_links.html.erb +7 -0
  149. data/app/views/admin/partials/_per_page_links.html.erb +17 -0
  150. data/app/views/admin/partials/_remote_pagination_links.html.erb +11 -0
  151. data/app/views/admin/partials/_remote_search_form.html.erb +36 -0
  152. data/app/views/admin/partials/_search_form.html.erb +17 -0
  153. data/app/views/admin/partials/_sub_navigation.html.erb +14 -0
  154. data/app/views/admin/partials/_upload_form.html.erb +116 -0
  155. data/app/views/admin/pictures/_archive_overlay_images.html.erb +17 -0
  156. data/app/views/admin/pictures/_filter_and_size_bar.html.erb +88 -0
  157. data/app/views/admin/pictures/_picture.html.erb +36 -0
  158. data/app/views/admin/pictures/_picture_to_assign.html.erb +32 -0
  159. data/app/views/admin/pictures/_pictures_list.html.erb +12 -0
  160. data/app/views/admin/pictures/archive_overlay.html.erb +3 -0
  161. data/app/views/admin/pictures/create.js.erb +12 -0
  162. data/app/views/admin/pictures/index.html.erb +56 -0
  163. data/app/views/admin/pictures/new.html.erb +11 -0
  164. data/app/views/admin/pictures/show_in_window.html.erb +1 -0
  165. data/app/views/admin/pictures/update.js.erb +11 -0
  166. data/app/views/admin/signup.html.erb +16 -0
  167. data/app/views/admin/trash/index.html.erb +25 -0
  168. data/app/views/admin/users/_table.html.erb +54 -0
  169. data/app/views/admin/users/_user.html.erb +36 -0
  170. data/app/views/admin/users/edit.html.erb +6 -0
  171. data/app/views/admin/users/index.html.erb +41 -0
  172. data/app/views/admin/users/new.html.erb +6 -0
  173. data/app/views/attachments/show.html.erb +1 -0
  174. data/app/views/elements/_article_editor.html.erb +4 -0
  175. data/app/views/elements/_article_view.html.erb +25 -0
  176. data/app/views/elements/_bild_editor.html.erb +1 -0
  177. data/app/views/elements/_bild_text_editor.html.erb +2 -0
  178. data/app/views/elements/_bild_text_view.html.erb +9 -0
  179. data/app/views/elements/_bild_view.html.erb +9 -0
  180. data/app/views/elements/_claim_editor.html.erb +1 -0
  181. data/app/views/elements/_claim_view.html.erb +1 -0
  182. data/app/views/elements/_contactform_editor.html.erb +7 -0
  183. data/app/views/elements/_contactform_view.html.erb +92 -0
  184. data/app/views/elements/_editor_not_found.html.erb +5 -0
  185. data/app/views/elements/_footnote_editor.html.erb +1 -0
  186. data/app/views/elements/_footnote_view.html.erb +5 -0
  187. data/app/views/elements/_header_editor.html.erb +1 -0
  188. data/app/views/elements/_header_view.html.erb +1 -0
  189. data/app/views/elements/_headline_editor.html.erb +1 -0
  190. data/app/views/elements/_headline_view.html.erb +1 -0
  191. data/app/views/elements/_image_mosaic_editor.html.erb +2 -0
  192. data/app/views/elements/_image_mosaic_view.html.erb +12 -0
  193. data/app/views/elements/_intro_editor.html.erb +1 -0
  194. data/app/views/elements/_intro_image_text_editor.html.erb +3 -0
  195. data/app/views/elements/_intro_image_text_view.html.erb +16 -0
  196. data/app/views/elements/_intro_view.html.erb +3 -0
  197. data/app/views/elements/_news_editor.html.erb +3 -0
  198. data/app/views/elements/_news_view.html.erb +11 -0
  199. data/app/views/elements/_searchresult_editor.html.erb +1 -0
  200. data/app/views/elements/_searchresult_view.html.erb +42 -0
  201. data/app/views/elements/_sitemap_editor.html.erb +3 -0
  202. data/app/views/elements/_sitemap_view.html.erb +38 -0
  203. data/app/views/elements/_sitename_editor.html.erb +1 -0
  204. data/app/views/elements/_sitename_view.html.erb +1 -0
  205. data/app/views/elements/_subheadline_editor.html.erb +1 -0
  206. data/app/views/elements/_subheadline_view.html.erb +5 -0
  207. data/app/views/elements/_text_editor.html.erb +1 -0
  208. data/app/views/elements/_text_view.html.erb +3 -0
  209. data/app/views/elements/_view_not_found.html.erb +1 -0
  210. data/app/views/elements/show.html.erb +6 -0
  211. data/app/views/elements/show.js.erb +11 -0
  212. data/app/views/essences/_essence_audio_editor.html.erb +1 -0
  213. data/app/views/essences/_essence_audio_view.html.erb +33 -0
  214. data/app/views/essences/_essence_date_editor.html.erb +12 -0
  215. data/app/views/essences/_essence_date_view.html.erb +7 -0
  216. data/app/views/essences/_essence_file_editor.html.erb +63 -0
  217. data/app/views/essences/_essence_file_view.html.erb +6 -0
  218. data/app/views/essences/_essence_flash_editor.html.erb +1 -0
  219. data/app/views/essences/_essence_flash_view.html.erb +26 -0
  220. data/app/views/essences/_essence_html_editor.html.erb +8 -0
  221. data/app/views/essences/_essence_html_view.html.erb +1 -0
  222. data/app/views/essences/_essence_picture_editor.html.erb +70 -0
  223. data/app/views/essences/_essence_picture_tools.html.erb +60 -0
  224. data/app/views/essences/_essence_picture_view.html.erb +42 -0
  225. data/app/views/essences/_essence_richtext_editor.html.erb +9 -0
  226. data/app/views/essences/_essence_richtext_view.html.erb +5 -0
  227. data/app/views/essences/_essence_text_editor.html.erb +82 -0
  228. data/app/views/essences/_essence_text_view.html.erb +11 -0
  229. data/app/views/essences/_essence_video_editor.html.erb +1 -0
  230. data/app/views/essences/_essence_video_view.html.erb +35 -0
  231. data/app/views/layouts/alchemy.html.erb +60 -0
  232. data/app/views/layouts/login.html.erb +60 -0
  233. data/app/views/layouts/pages.html.erb +31 -0
  234. data/app/views/layouts/sitemap.xml.erb +4 -0
  235. data/app/views/messages/mail.text.erb +10 -0
  236. data/app/views/messages/new.html.erb +1 -0
  237. data/app/views/notifications/admin_user_created.text.erb +13 -0
  238. data/app/views/notifications/registered_user_created.text.erb +10 -0
  239. data/app/views/page_layouts/_contact.html.erb +14 -0
  240. data/app/views/page_layouts/_external.html.erb +1 -0
  241. data/app/views/page_layouts/_intro.html.erb +14 -0
  242. data/app/views/page_layouts/_layout_footer.html.erb +14 -0
  243. data/app/views/page_layouts/_layout_header.html.erb +14 -0
  244. data/app/views/page_layouts/_news.html.erb +14 -0
  245. data/app/views/page_layouts/_newsletter_layout.html.erb +1 -0
  246. data/app/views/page_layouts/_search.html.erb +14 -0
  247. data/app/views/page_layouts/_standard.html.erb +14 -0
  248. data/app/views/pages/show.html.erb +1 -0
  249. data/app/views/pages/show.rss.builder +27 -0
  250. data/app/views/pages/sitemap.xml.erb +8 -0
  251. data/app/views/partials/_navigation_image_link.html.erb +14 -0
  252. data/app/views/partials/_navigation_link.html.erb +20 -0
  253. data/app/views/partials/_navigation_renderer.html.erb +23 -0
  254. data/app/views/pictures/show.gif.flexi +19 -0
  255. data/app/views/pictures/show.jpg.flexi +19 -0
  256. data/app/views/pictures/show.png.flexi +19 -0
  257. data/app/views/pictures/thumbnail.png.flexi +13 -0
  258. data/app/views/pictures/zoom.png.flexi +3 -0
  259. data/assets/images/ajax_loader.gif +0 -0
  260. data/assets/images/alchemy-logo.png +0 -0
  261. data/assets/images/flags.png +0 -0
  262. data/assets/images/gui/navi-tab.png +0 -0
  263. data/assets/images/gui/shading.png +0 -0
  264. data/assets/images/gui/shading_90.png +0 -0
  265. data/assets/images/gui/toggle.png +0 -0
  266. data/assets/images/icons.png +0 -0
  267. data/assets/images/jquery-sb/select_arrow.gif +0 -0
  268. data/assets/images/jquery-sb/select_arrow_bg.gif +0 -0
  269. data/assets/images/jquery-sb/select_arrow_bg_hover.gif +0 -0
  270. data/assets/images/jquery-ui/ui-icons_666666_256x240.png +0 -0
  271. data/assets/images/placeholder.png +0 -0
  272. data/assets/images/swfupload/browse_button.png +0 -0
  273. data/assets/javascripts/alchemy.element_editor_selector.js +88 -0
  274. data/assets/javascripts/alchemy.growler.js +44 -0
  275. data/assets/javascripts/alchemy.image_cropper.js +56 -0
  276. data/assets/javascripts/alchemy.js +892 -0
  277. data/assets/javascripts/alchemy.link_overlay.js +221 -0
  278. data/assets/javascripts/alchemy.page_sorter.js +42 -0
  279. data/assets/javascripts/alchemy.preview.js +145 -0
  280. data/assets/javascripts/jquery-ui.js +428 -0
  281. data/assets/javascripts/jquery.Jcrop.min.js +246 -0
  282. data/assets/javascripts/jquery.dialogextend.min.js +8 -0
  283. data/assets/javascripts/jquery.in-place-edit.js +171 -0
  284. data/assets/javascripts/jquery.js +18 -0
  285. data/assets/javascripts/jquery.rails.js +315 -0
  286. data/assets/javascripts/jquery.sb.min.js +14 -0
  287. data/assets/javascripts/jquery.scrollTo-1.4.2-min.js +11 -0
  288. data/assets/javascripts/jquery.ui.nestedSortable.js +291 -0
  289. data/assets/javascripts/jquery.ui.tabspaging.js +281 -0
  290. data/assets/javascripts/swfupload/fileprogress.js +203 -0
  291. data/assets/javascripts/swfupload/handlers.js +171 -0
  292. data/assets/javascripts/swfupload/queue.js +98 -0
  293. data/assets/javascripts/swfupload/swfupload.js +980 -0
  294. data/assets/javascripts/swfupload/swfupload.swf +0 -0
  295. data/assets/javascripts/tiny_mce/jquery.tinymce.js +1 -0
  296. data/assets/javascripts/tiny_mce/langs/de.js +1 -0
  297. data/assets/javascripts/tiny_mce/langs/en.js +223 -0
  298. data/assets/javascripts/tiny_mce/license.txt +504 -0
  299. data/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +43 -0
  300. data/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/de.js +4 -0
  301. data/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/en.js +4 -0
  302. data/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  303. data/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +109 -0
  304. data/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  305. data/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +402 -0
  306. data/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  307. data/assets/javascripts/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  308. data/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  309. data/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  310. data/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  311. data/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +1 -0
  312. data/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  313. data/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +27 -0
  314. data/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +21 -0
  315. data/assets/javascripts/tiny_mce/plugins/table/cell.htm +180 -0
  316. data/assets/javascripts/tiny_mce/plugins/table/css/cell.css +17 -0
  317. data/assets/javascripts/tiny_mce/plugins/table/css/row.css +25 -0
  318. data/assets/javascripts/tiny_mce/plugins/table/css/table.css +13 -0
  319. data/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -0
  320. data/assets/javascripts/tiny_mce/plugins/table/js/cell.js +319 -0
  321. data/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  322. data/assets/javascripts/tiny_mce/plugins/table/js/row.js +237 -0
  323. data/assets/javascripts/tiny_mce/plugins/table/js/table.js +450 -0
  324. data/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +1 -0
  325. data/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +75 -0
  326. data/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +32 -0
  327. data/assets/javascripts/tiny_mce/plugins/table/row.htm +158 -0
  328. data/assets/javascripts/tiny_mce/plugins/table/table.htm +188 -0
  329. data/assets/javascripts/tiny_mce/themes/advanced/about.htm +52 -0
  330. data/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +26 -0
  331. data/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +51 -0
  332. data/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +74 -0
  333. data/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  334. data/assets/javascripts/tiny_mce/themes/advanced/image.htm +80 -0
  335. data/assets/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  336. data/assets/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
  337. data/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  338. data/assets/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  339. data/assets/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  340. data/assets/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  341. data/assets/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  342. data/assets/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  343. data/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
  344. data/assets/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
  345. data/assets/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  346. data/assets/javascripts/tiny_mce/themes/advanced/js/about.js +73 -0
  347. data/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +42 -0
  348. data/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +355 -0
  349. data/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +329 -0
  350. data/assets/javascripts/tiny_mce/themes/advanced/js/image.js +247 -0
  351. data/assets/javascripts/tiny_mce/themes/advanced/js/link.js +153 -0
  352. data/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +56 -0
  353. data/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -0
  354. data/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -0
  355. data/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +68 -0
  356. data/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +54 -0
  357. data/assets/javascripts/tiny_mce/themes/advanced/link.htm +57 -0
  358. data/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  359. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +47 -0
  360. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  361. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  362. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  363. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  364. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  365. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  366. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  367. data/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +214 -0
  368. data/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +23 -0
  369. data/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  370. data/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  371. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +46 -0
  372. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -0
  373. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  374. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  375. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  376. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -0
  377. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  378. data/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  379. data/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +25 -0
  380. data/assets/javascripts/tiny_mce/themes/simple/langs/de.js +1 -0
  381. data/assets/javascripts/tiny_mce/tiny_mce.js +1 -0
  382. data/assets/javascripts/tiny_mce/tiny_mce_popup.js +5 -0
  383. data/assets/javascripts/tiny_mce/utils/editable_selects.js +70 -0
  384. data/assets/javascripts/tiny_mce/utils/form_utils.js +210 -0
  385. data/assets/javascripts/tiny_mce/utils/mctabs.js +162 -0
  386. data/assets/javascripts/tiny_mce/utils/validate.js +252 -0
  387. data/assets/stylesheets/Jcrop.gif +0 -0
  388. data/assets/stylesheets/alchemy.css +3629 -0
  389. data/assets/stylesheets/alchemy_tinymce_content.css +94 -0
  390. data/assets/stylesheets/alchemy_tinymce_dialog.css +415 -0
  391. data/assets/stylesheets/default/img/tabs.gif +0 -0
  392. data/assets/stylesheets/elements.css +900 -0
  393. data/assets/stylesheets/flags.css +1 -0
  394. data/assets/stylesheets/ie6.css +18 -0
  395. data/assets/stylesheets/jquery-ui-1.8.7.alchemy.css +2023 -0
  396. data/assets/stylesheets/jquery.Jcrop.css +35 -0
  397. data/assets/stylesheets/jquery.sb.css +244 -0
  398. data/assets/stylesheets/standard_set.css +374 -0
  399. data/bin/alchemy +347 -0
  400. data/config/alchemy/config.yml +199 -0
  401. data/config/alchemy/elements.yml +219 -0
  402. data/config/alchemy/page_layouts.yml +65 -0
  403. data/config/asset_packages.yml +32 -0
  404. data/config/authorization_rules.rb +96 -0
  405. data/config/initializers/authorization.rb +4 -0
  406. data/config/initializers/cache_storage.rb +1 -0
  407. data/config/initializers/fast_gettext.rb +2 -0
  408. data/config/initializers/tiny_mce_hammer.rb +32 -0
  409. data/config/locales/de.yml +370 -0
  410. data/config/locales/en.yml +364 -0
  411. data/config/routes.rb +141 -0
  412. data/db/migrate/20100607143125_create_pages.rb +34 -0
  413. data/db/migrate/20100607144254_create_elements.rb +20 -0
  414. data/db/migrate/20100607145256_create_contents.rb +18 -0
  415. data/db/migrate/20100607145719_create_users.rb +32 -0
  416. data/db/migrate/20100607150611_create_pictures.rb +16 -0
  417. data/db/migrate/20100607150812_create_attachments.rb +16 -0
  418. data/db/migrate/20100607153647_create_folded_pages.rb +13 -0
  419. data/db/migrate/20100607161345_create_essence_texts.rb +19 -0
  420. data/db/migrate/20100607162339_create_elements_pages.rb +12 -0
  421. data/db/migrate/20100607193638_create_essence_pictures.rb +23 -0
  422. data/db/migrate/20100607193646_create_essence_richtexts.rb +16 -0
  423. data/db/migrate/20100607193653_create_essence_htmls.rb +13 -0
  424. data/db/migrate/20100609111653_create_essence_dates.rb +13 -0
  425. data/db/migrate/20100609111809_create_essence_files.rb +15 -0
  426. data/db/migrate/20100609111821_create_essence_flashes.rb +16 -0
  427. data/db/migrate/20100609111837_create_essence_videos.rb +18 -0
  428. data/db/migrate/20100616150753_create_essence_audios.rb +17 -0
  429. data/db/migrate/20100812085225_add_crop_from_and_crop_size_to_essence_pictures.rb +11 -0
  430. data/db/migrate/20100909140701_change_essence_htmls_source_column_type.rb +9 -0
  431. data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +9 -0
  432. data/db/migrate/20101109151812_create_languages.rb +19 -0
  433. data/db/migrate/20101216151419_add_language_id_to_pages.rb +19 -0
  434. data/db/migrate/20101216155216_add_index_to_languages.rb +9 -0
  435. data/db/migrate/20101216173323_add_default_to_languages.rb +9 -0
  436. data/db/migrate/20101218130049_add_urlname_index_to_pages.rb +9 -0
  437. data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +11 -0
  438. data/db/migrate/20110224105120_change_pages_visible_default.rb +11 -0
  439. data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +11 -0
  440. data/db/migrate/20110414163140_remove_display_name_from_elements.rb +11 -0
  441. data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +9 -0
  442. data/db/migrate/20110529130429_create_cells.rb +14 -0
  443. data/db/migrate/20110529130500_add_cell_id_to_elements.rb +11 -0
  444. data/db/migrate/20110530102804_change_pages_page_layout_column.rb +11 -0
  445. data/db/migrate/20110707190728_add_render_size_to_essence_pictures.rb +9 -0
  446. data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +19 -0
  447. data/lib/alchemy.rb +24 -0
  448. data/lib/alchemy/config.rb +51 -0
  449. data/lib/alchemy/controller.rb +79 -0
  450. data/lib/alchemy/engine.rb +29 -0
  451. data/lib/alchemy/essence.rb +178 -0
  452. data/lib/alchemy/file_utilz.rb +73 -0
  453. data/lib/alchemy/page_layout.rb +66 -0
  454. data/lib/alchemy/remote_pagination_link_renderer.rb +17 -0
  455. data/lib/alchemy/seeder.rb +112 -0
  456. data/lib/alchemy/version.rb +5 -0
  457. data/lib/extensions/action_view.rb +17 -0
  458. data/lib/extensions/array.rb +25 -0
  459. data/lib/extensions/hash.rb +34 -0
  460. data/lib/middleware/flash_session_cookie.rb +22 -0
  461. data/lib/rails/generators/alchemy/elements/elements_generator.rb +35 -0
  462. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +9 -0
  463. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +21 -0
  464. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +32 -0
  465. data/lib/rails/generators/alchemy/page_layouts/templates/layout.html.erb +1 -0
  466. data/lib/rails/generators/alchemy/plugin/plugin_generator.rb +29 -0
  467. data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +5 -0
  468. data/lib/rails/generators/alchemy/plugin/templates/config.yml +30 -0
  469. data/lib/rails/generators/alchemy/plugin/templates/init.rb +4 -0
  470. data/lib/rails/generators/alchemy/plugin/templates/routes.rb +4 -0
  471. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +35 -0
  472. data/lib/rails/generators/alchemy/scaffold/templates/elements.yml +91 -0
  473. data/lib/rails/generators/alchemy/scaffold/templates/page_layouts.yml +29 -0
  474. data/lib/rails/templates/alchemy.rb +14 -0
  475. data/lib/tasks/fleximage.rake +154 -0
  476. data/lib/tasks/gettext.rake +75 -0
  477. data/lib/tasks/install.rake +123 -0
  478. data/lib/tasks/upgrade.rake +211 -0
  479. data/lib/translation_extras/alchemy_core_modules.rb +11 -0
  480. data/lib/vendor/i18n_label.rb +23 -0
  481. data/locale/alchemy.pot +1728 -0
  482. data/locale/de/LC_MESSAGES/alchemy.mo +0 -0
  483. data/locale/de/alchemy.po +1774 -0
  484. data/locale/en/LC_MESSAGES/alchemy.mo +0 -0
  485. data/locale/en/alchemy.po +1742 -0
  486. data/locale/missing_translations.rb +4 -0
  487. data/locale/model_attributes.rb +56 -0
  488. data/recipes/alchemy_capistrano_tasks.rb +83 -0
  489. metadata +769 -0
@@ -0,0 +1,132 @@
1
+ class Admin::PicturesController < AlchemyController
2
+ unloadable
3
+ protect_from_forgery :except => [:create]
4
+
5
+ before_filter :set_translation
6
+
7
+ filter_access_to :all
8
+
9
+ cache_sweeper :pictures_sweeper, :only => [:update, :destroy]
10
+
11
+ def index
12
+ if params[:per_page] == 'all'
13
+ @pictures = Picture.where("name LIKE '%#{params[:query]}%'").order(:name)
14
+ else
15
+ @pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
16
+ :page => params[:page] || 1,
17
+ :per_page => params[:per_page] || 32
18
+ ).order(:name)
19
+ end
20
+ end
21
+
22
+ def new
23
+ @picture = Picture.new
24
+ @while_assigning = params[:while_assigning] == 'true'
25
+ if @while_assigning
26
+ @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
27
+ @element = Element.find(params[:element_id], :select => 'id')
28
+ @size = params[:size]
29
+ @options = params[:options]
30
+ @page = params[:page]
31
+ @per_page = params[:per_page]
32
+ end
33
+ render :layout => false
34
+ end
35
+
36
+ def create
37
+ @picture = Picture.new(:image_file => params[:Filedata])
38
+ @picture.name = @picture.image_filename
39
+ @picture.save
40
+ @while_assigning = params[:while_assigning] == 'true'
41
+ if @while_assigning
42
+ @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
43
+ @element = Element.find(params[:element_id], :select => 'id')
44
+ @size = params[:size] || 'medium'
45
+ @options = params[:options]
46
+ @page = params[:page] || 1
47
+ @per_page = pictures_per_page_for_size(@size)
48
+ end
49
+ if params[:per_page] == 'all'
50
+ @pictures = Picture.where("name LIKE '%#{params[:query]}%'").order(:name)
51
+ else
52
+ @pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
53
+ :page => (params[:page] || 1),
54
+ :per_page => (params[:per_page] || @per_page || 32)
55
+ ).order(:name)
56
+ end
57
+ @message = _('Picture %{name} uploaded succesfully') % {:name => @picture.name}
58
+ if params[Rails.application.config.session_options[:key]].blank?
59
+ flash[:notice] = @message
60
+ redirect_to :back
61
+ end
62
+ rescue Exception => e
63
+ exception_handler(e)
64
+ end
65
+
66
+ def archive_overlay
67
+ @content = Content.find_by_id(params[:content_id], :select => 'id')
68
+ @element = Element.find_by_id(params[:element_id], :select => 'id')
69
+ @size = params[:size] || 'medium'
70
+ @pictures = Picture.where("name LIKE '%#{params[:query]}%'").paginate(
71
+ :page => params[:page] || 1,
72
+ :per_page => pictures_per_page_for_size(@size)
73
+ ).order(:name)
74
+ @options = params[:options]
75
+ if params[:remote] == 'true'
76
+ render :update do |page|
77
+ page.replace_html 'alchemy_window_body', :partial => 'archive_overlay_images'
78
+ end
79
+ else
80
+ render :layout => false
81
+ end
82
+ end
83
+
84
+ def update
85
+ @picture = Picture.find(params[:id])
86
+ oldname = @picture.name
87
+ @picture.name = params[:name]
88
+ @picture.save
89
+ @message = _("Image renamed successfully from: '%{from}' to '%{to}'") % {:from => oldname, :to => @picture.name}
90
+ rescue Exception => e
91
+ exception_handler(e)
92
+ end
93
+
94
+ def destroy
95
+ @picture = Picture.find(params[:id])
96
+ name = @picture.name
97
+ @picture.destroy
98
+ render :update do |page|
99
+ flash[:notice] = ( _("Image: '%{name}' deleted successfully") % {:name => name} )
100
+ page.redirect_to admin_pictures_path(:per_page => params[:per_page], :page => params[:page], :query => params[:query])
101
+ end
102
+ end
103
+
104
+ def flush
105
+ Picture.all.each do |picture|
106
+ FileUtils.rm_rf("#{Rails.root}/public/pictures/show/#{picture.id}")
107
+ FileUtils.rm_rf("#{Rails.root}/public/pictures/thumbnails/#{picture.id}")
108
+ expire_page(:controller => '/pictures', :action => 'zoom', :id => picture.id)
109
+ end
110
+ render :update do |page|
111
+ page.call('Alchemy.growl', _('Picture cache flushed'))
112
+ end
113
+ end
114
+
115
+ def show_in_window
116
+ @picture = Picture.find(params[:id])
117
+ render :layout => false
118
+ end
119
+
120
+ private
121
+
122
+ def pictures_per_page_for_size(size)
123
+ case size
124
+ when 'small' then per_page = 35
125
+ when 'large' then per_page = 4
126
+ else
127
+ per_page = 12
128
+ end
129
+ return per_page
130
+ end
131
+
132
+ end
@@ -0,0 +1,25 @@
1
+ class Admin::TrashController < AlchemyController
2
+
3
+ filter_access_to [:index, :clear]
4
+
5
+ def index
6
+ @elements = Element.trashed
7
+ @page = Page.find_by_id(params[:page_id])
8
+ @allowed_elements = Element.all_for_page(@page)
9
+ render :layout => false
10
+ end
11
+
12
+ def clear
13
+ @page = Page.find_by_id(params[:page_id])
14
+ @elements = Element.trashed
15
+ @elements.map(&:destroy)
16
+ render :update do |page|
17
+ page.call('Alchemy.growl', _("Cleared trash"))
18
+ page << "Alchemy.refreshTrashWindow(#{@page.id})"
19
+ page << "jQuery('#element_trash_button .icon').removeClass('full')"
20
+ end
21
+ rescue Exception => e
22
+ exception_handler(e)
23
+ end
24
+
25
+ end
@@ -0,0 +1,75 @@
1
+ class Admin::UsersController < AlchemyController
2
+ unloadable
3
+
4
+ filter_access_to [:edit, :update, :destroy], :attribute_check => true
5
+ filter_access_to [:index, :new, :create], :attribute_check => false
6
+
7
+ before_filter :set_translation
8
+
9
+ def index
10
+ if !params[:query].blank?
11
+ @users = User.where([
12
+ "users.login LIKE ? OR users.email LIKE ? OR users.firstname LIKE ? OR users.lastname LIKE ?",
13
+ "%#{params[:query]}%",
14
+ "%#{params[:query]}%",
15
+ "%#{params[:query]}%",
16
+ "%#{params[:query]}%"
17
+ ]).order('login')
18
+ else
19
+ @users = User.all
20
+ end
21
+ end
22
+
23
+ def new
24
+ @user = User.new
25
+ render :layout => false
26
+ end
27
+
28
+ def create
29
+ @user = User.new(params[:user])
30
+ if @user.save
31
+ if @user.role == "registered" && params[:send_credentials]
32
+ Notifications.registered_user_created(@user).deliver
33
+ elsif params[:send_credentials]
34
+ Notifications.admin_user_created(@user).deliver
35
+ end
36
+ end
37
+ render_errors_or_redirect(
38
+ @user,
39
+ admin_users_path,
40
+ ( _("User: '%{name}' created") % {:name => @user.name} ),
41
+ "form#new_user button.button"
42
+ )
43
+ rescue
44
+ exception_handler($!)
45
+ end
46
+
47
+ def edit
48
+ # User is fetched via before filter from authentication plugin
49
+ render :layout => false
50
+ end
51
+
52
+ def update
53
+ # User is fetched via before filter from authentication plugin
54
+ @user.update_attributes(params[:user])
55
+ Notifications.admin_user_created(@user).deliver if params[:send_credentials]
56
+ render_errors_or_redirect(
57
+ @user,
58
+ admin_users_path,
59
+ ( _("User: '%{name}' updated") % {:name => @user.name} ),
60
+ "form#edit_user_#{@user.id} button.button"
61
+ )
62
+ end
63
+
64
+ def destroy
65
+ # User is fetched via before filter from authentication plugin
66
+ name = @user.name
67
+ if @user.destroy
68
+ flash[:notice] = ( _("User: '%{name}' deleted") % {:name => name} )
69
+ end
70
+ render :update do |page|
71
+ page.redirect_to admin_users_path
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,78 @@
1
+ class AdminController < AlchemyController
2
+
3
+ unloadable
4
+
5
+ filter_access_to :index
6
+ before_filter :set_translation
7
+ before_filter :check_user_count, :only => :login
8
+
9
+ layout 'alchemy'
10
+
11
+ def index
12
+ @alchemy_version = Alchemy::VERSION
13
+ @clipboard_items = session[:clipboard]
14
+ @last_edited_pages = Page.all_last_edited_from(current_user)
15
+ @locked_pages = Page.all_locked
16
+ @online_users = User.all_online
17
+ end
18
+
19
+ # Signup only works if no user is present in database.
20
+ def signup
21
+ if request.get?
22
+ redirect_to admin_path if User.count != 0
23
+ @user = User.new({:role => 'admin'})
24
+ else
25
+ @user = User.new(params[:user])
26
+ if @user.save
27
+ if params[:send_credentials]
28
+ Notifications.admin_user_created(@user).deliver
29
+ end
30
+ redirect_to :action => :index
31
+ end
32
+ end
33
+ end
34
+
35
+ def login
36
+ if request.get?
37
+ @user_session = UserSession.new()
38
+ flash.now[:info] = params[:message] || _("welcome_please_identify_notice")
39
+ render :layout => 'login'
40
+ else
41
+ @user_session = UserSession.new(params[:user_session])
42
+ if @user_session.save
43
+ if session[:redirect_url].blank?
44
+ redirect_to :action => :index
45
+ else
46
+ redirect_to session[:redirect_url]
47
+ end
48
+ else
49
+ render :layout => 'login'
50
+ end
51
+ end
52
+ end
53
+
54
+ def leave
55
+ render :layout => false
56
+ end
57
+
58
+ def logout
59
+ message = params[:message] || _("logged_out")
60
+ @user_session = UserSession.find
61
+ if @user_session
62
+ @user_session.destroy
63
+ end
64
+ flash[:info] = message
65
+ redirect_to root_url
66
+ end
67
+
68
+ private
69
+
70
+ def check_user_count
71
+ if User.count == 0
72
+ redirect_to :action => 'signup'
73
+ else
74
+ return true
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,239 @@
1
+ # This is the main Alchemy controller all other controllers inheret from.
2
+
3
+ require 'userstamp'
4
+ require 'dynamic_form'
5
+
6
+ class AlchemyController < ApplicationController
7
+
8
+ include FastGettext::Translation
9
+ include Alchemy
10
+ include Userstamp
11
+
12
+ unloadable
13
+
14
+ protect_from_forgery
15
+
16
+ before_filter :init_gettext
17
+ before_filter :set_translation
18
+ before_filter :set_language
19
+ before_filter :mailer_set_url_options
20
+
21
+ helper_method :current_server, :configuration, :multi_language?, :current_user, :clipboard_empty?, :trash_empty?, :get_clipboard
22
+ helper :errors, :layout
23
+
24
+ def render_errors_or_redirect(object, redicrect_url, flash_notice, button = nil)
25
+ if object.errors.empty?
26
+ flash[:notice] = _(flash_notice)
27
+ render(:update) { |page| page.redirect_to(redicrect_url) }
28
+ else
29
+ render_remote_errors(object, button)
30
+ end
31
+ end
32
+
33
+ def render_remote_errors(object, button = nil)
34
+ render :update do |page|
35
+ page << "jQuery('#errors').html('<ul>" + object.errors.sum{|a, b| "<li>" + _(b) + "</li>"} + "</ul>')"
36
+ page << "jQuery('#errors').show()"
37
+ page << "Alchemy.enableButton('#{button}')" unless button.blank?
38
+ end
39
+ end
40
+
41
+ # Returns a host string with the domain the app is running on.
42
+ def current_server
43
+ # For local development server
44
+ if request.port != 80
45
+ "http://#{request.host}:#{request.port}"
46
+ # For remote production server
47
+ else
48
+ "http://#{request.host}"
49
+ end
50
+ end
51
+
52
+ def configuration(name)
53
+ return Alchemy::Config.get(name)
54
+ end
55
+
56
+ def set_language_to(language_id)
57
+ @language = Language.find(language_id)
58
+ if @language
59
+ session[:language_id] = @language.id
60
+ session[:language_code] = @language.code
61
+ I18n.locale = @language.code
62
+ else
63
+ logger.error "+++++++ Language not found for language_id: #{language_id}"
64
+ end
65
+ end
66
+
67
+ def multi_language?
68
+ Language.published.count > 1
69
+ end
70
+
71
+ def current_user
72
+ return @current_user if defined?(@current_user)
73
+ @current_user = current_user_session && current_user_session.record
74
+ end
75
+
76
+ def current_user_session
77
+ return @current_user_session if defined?(@current_user_session)
78
+ @current_user_session = UserSession.find
79
+ end
80
+
81
+ def logged_in?
82
+ !current_user.blank?
83
+ end
84
+
85
+ private
86
+
87
+ def last_request_update_allowed?
88
+ true #action_name =! "update_session_time_left"
89
+ end
90
+
91
+ # Handles exceptions
92
+ def exception_handler(e)
93
+ exception_logger(e)
94
+ show_error_notice(e)
95
+ # TODO: Exception Mailer!
96
+ end
97
+
98
+ # Logs the current exception to the error log.
99
+ def exception_logger(e)
100
+ message = "\n+++++++++ Error: #{e} +++++++++++++\n\n"
101
+ e.backtrace.each do |line|
102
+ message += "#{line}\n"
103
+ end
104
+ logger.error(message)
105
+ end
106
+
107
+ # Displays an error notice in the Alchemy backend.
108
+ def show_error_notice(e)
109
+ notice = "Error: #{e}"
110
+ if request.xhr?
111
+ render(:update) { |page| page.call("Alchemy.growl", notice, 'error') }
112
+ else
113
+ flash[:error] = notice
114
+ end
115
+ end
116
+
117
+ def set_language_from_client
118
+ if params[:lang].blank?
119
+ lang = request.env['HTTP_ACCEPT_LANGUAGE'][0..1] unless request.env['HTTP_ACCEPT_LANGUAGE'].blank?
120
+ language_code = lang
121
+ else
122
+ language_code = params[:lang]
123
+ end
124
+ @language = Language.find_by_code(language_code) || Language.get_default
125
+ if @language.blank?
126
+ logger.warn "+++++++ Language not found for code: #{language_code}"
127
+ render :file => Rails.root + 'public/404.html', :code => 404
128
+ else
129
+ session[:language_id] = @language.id
130
+ session[:language_code] = @language.code
131
+ I18n.locale = @language.code
132
+ end
133
+ end
134
+
135
+ def store_location
136
+ session[:redirect_url] = request.url
137
+ end
138
+
139
+ def set_stamper
140
+ FastGettext.text_domain = 'alchemy'
141
+ User.stamper = self.current_user
142
+ end
143
+
144
+ def reset_stamper
145
+ User.reset_stamper
146
+ end
147
+
148
+ def mailer_set_url_options
149
+ ActionMailer::Base.default_url_options[:host] = request.host_with_port
150
+ end
151
+
152
+ protected
153
+
154
+ def init_gettext#:nodoc:
155
+ FastGettext.text_domain = 'alchemy'
156
+ FastGettext.available_locales = configuration(:translations).collect { |l| l[:language_code] }
157
+ end
158
+
159
+ # Setting the Alchemy GUI translation to users preffered language, or to the default translation.
160
+ # You can set the default_translation in your config/alchemy/config.yml file
161
+ def set_translation
162
+ if current_user.blank? || current_user.language.blank?
163
+ FastGettext.locale = configuration(:default_translation)
164
+ else
165
+ FastGettext.locale = current_user.language
166
+ end
167
+ end
168
+
169
+ def set_language
170
+ if session[:language_id].blank?
171
+ set_language_to_default
172
+ else
173
+ set_language_to(session[:language_id])
174
+ end
175
+ end
176
+
177
+ def permission_denied
178
+ if current_user
179
+ flash[:error] = _('You are not authorized')
180
+ if current_user.role == 'registered'
181
+ redirect_to root_path
182
+ else
183
+ if request.referer == login_url
184
+ render :file => File.join(Rails.root.to_s, 'public', '422.html'), :status => 422, :layout => false
185
+ else
186
+ redirect_to admin_path
187
+ end
188
+ end
189
+ else
190
+ flash[:info] = _('Please log in')
191
+ if request.xhr?
192
+ render :update do |page|
193
+ page.redirect_to login_path
194
+ end
195
+ else
196
+ store_location
197
+ redirect_to login_path
198
+ end
199
+ end
200
+ end
201
+
202
+ def redirect_back_or_to_default(default_path = admin_path)
203
+ if request.env["HTTP_REFERER"].blank?
204
+ redirect_to default_path
205
+ else
206
+ redirect_to :back
207
+ end
208
+ end
209
+
210
+ # Setting language relevant stuff to defaults.
211
+ def set_language_to_default
212
+ @language = Language.get_default
213
+ session[:language_id] = @language.id
214
+ session[:language_code] = @language.code
215
+ I18n.locale = @language.code
216
+ rescue
217
+ exception_logger($!)
218
+ flash[:error] = _('no_default_language_found')
219
+ end
220
+
221
+ def get_clipboard(category = nil)
222
+ clipboard = (session[:clipboard] ||= {})
223
+ clipboard[category.to_sym] ||= [] if category
224
+ end
225
+
226
+ def clipboard_empty?(category = nil)
227
+ return true if session[:clipboard].blank?
228
+ if category
229
+ session[:clipboard][category.to_sym].blank?
230
+ else
231
+ false
232
+ end
233
+ end
234
+
235
+ def trash_empty?(category)
236
+ category.singularize.classify.constantize.trashed.blank?
237
+ end
238
+
239
+ end