alchemy_cms 2.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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,44 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ (function($) {
6
+
7
+ var Growler = {};
8
+ $.extend(Alchemy, Growler);
9
+
10
+ Alchemy.Growler = {
11
+
12
+ build : function(message, flash_type) {
13
+ var $flash_container = $('<div class="flash '+flash_type+'" />');
14
+ var icon_class = flash_type === 'notice' ? 'tick' : 'error';
15
+ $flash_container.append('<span class="icon '+icon_class+'" />');
16
+ $flash_container.append(message);
17
+ $('#flash_notices').append($flash_container);
18
+ $('#flash_notices').show();
19
+ Alchemy.Growler.fade();
20
+ },
21
+
22
+ fade : function() {
23
+ $('#flash_notices div[class!="flash error"]').delay(5000).hide('drop', { direction: "up" }, 400, function() {
24
+ $(this).remove();
25
+ });
26
+ $('#flash_notices div[class="flash error"]')
27
+ .css({cursor: 'pointer'})
28
+ .click(function() {
29
+ $(this).hide('drop', { direction: "up" }, 400, function() {
30
+ $(this).remove();
31
+ });
32
+ });
33
+ }
34
+
35
+ },
36
+
37
+ Alchemy.growl = function(message, style) {
38
+ if (typeof(style) === 'undefined') {
39
+ style = 'notice';
40
+ }
41
+ Alchemy.Growler.build(message, style);
42
+ }
43
+
44
+ })(jQuery);
@@ -0,0 +1,56 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ (function($) {
6
+
7
+ var ImageCropper = {};
8
+ ImageCropper.initialized = false;
9
+ $.extend(Alchemy, ImageCropper);
10
+
11
+ Alchemy.ImageCropper = {
12
+
13
+ init : function (box, size_x, size_y, default_box, ratio) {
14
+ var crop_from_field = $('#essence_picture_crop_from');
15
+ var crop_size_field = $('#essence_picture_crop_size');
16
+ var options = {
17
+ onSelect: function(coords) {
18
+ crop_from_field.val(coords.x + "x" + coords.y);
19
+ crop_size_field.val(coords.w + "x" + coords.h);
20
+ },
21
+ setSelect: box,
22
+ aspectRatio: ratio ? ratio : undefined,
23
+ minSize: [size_x, size_y]
24
+ };
25
+ Alchemy.ImageCropper.box = box;
26
+ Alchemy.ImageCropper.default_box = default_box;
27
+ Alchemy.ImageCropper.crop_from_field = crop_from_field;
28
+ Alchemy.ImageCropper.crop_size_field = crop_size_field;
29
+
30
+ if (!Alchemy.ImageCropper.initialized) {
31
+ Alchemy.ImageCropper.api = $.Jcrop('#imageToCrop', options);
32
+ Alchemy.ImageCropper.initialized = true;
33
+ }
34
+
35
+ $('#image_cropper_form').submit(Alchemy.ImageCropper.destroy);
36
+ $('.ui-dialog-titlebar-close').click(Alchemy.ImageCropper.destroy);
37
+ },
38
+
39
+ undo : function() {
40
+ Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.box);
41
+ },
42
+
43
+ reset : function() {
44
+ Alchemy.ImageCropper.api.setSelect(Alchemy.ImageCropper.default_box);
45
+ Alchemy.ImageCropper.crop_from_field.val('');
46
+ Alchemy.ImageCropper.crop_size_field.val('');
47
+ },
48
+
49
+ destroy : function() {
50
+ Alchemy.ImageCropper.api.destroy();
51
+ Alchemy.ImageCropper.initialized = false;
52
+ }
53
+
54
+ }
55
+
56
+ })(jQuery);
@@ -0,0 +1,892 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ (function ($) {
6
+
7
+ // Setting jQueryUIs global animation duration
8
+ $.fx.speeds._default = 400;
9
+
10
+ // The Alchemy JavaScript Object contains all Functions
11
+ $.extend(Alchemy, {
12
+
13
+ inPlaceEditor : function (options) {
14
+ var defaults = {
15
+ save_label: 'save',
16
+ cancel_label: 'cancel'
17
+ };
18
+ var settings = jQuery.extend({}, defaults, options);
19
+ var cancel_handler = function(element) {
20
+ jQuery(element).css({overflow: 'hidden'});
21
+ return true;
22
+ };
23
+ var submit_handler = function(element, id, value) {
24
+ $(element).css({overflow: 'hidden'});
25
+ id = parseInt(id.replace(/^image_picture_/, ''));
26
+ $.ajax({url:'/admin/pictures/'+id, type: 'PUT', data: {name: value}});
27
+ return false;
28
+ };
29
+
30
+ $('#alchemy .rename').click(function () {
31
+ $(this).css({overflow: 'visible'});
32
+ });
33
+
34
+ $('#alchemy .rename').inPlaceEdit({
35
+ submit : submit_handler,
36
+ cancel : cancel_handler,
37
+ html : ' \
38
+ <div class="inplace-edit"> \
39
+ <input type="text" value="" class="thin_border field" /> \
40
+ <div class="buttons"> \
41
+ <input type="button" value="'+settings.save_label+'" class="save-button button" /> \
42
+ <input type="button" value="'+settings.cancel_label+'" class="cancel-button button" /> \
43
+ </div> \
44
+ </div>'
45
+ });
46
+
47
+ },
48
+
49
+ getOverlaySpinner : function (options) {
50
+ var defaults = {
51
+ x: '47%',
52
+ y: '33%'
53
+ };
54
+ var settings = $.extend({}, defaults, options);
55
+ var $spinner = $('<img src="/images/alchemy/ajax_loader.gif" />');
56
+ var left = (settings.x - 32) / 2;
57
+ var top = ((settings.y - 32) / 2) - 16;
58
+ top = top < 0 ? 0 : top;
59
+ $spinner.css({
60
+ marginLeft: left + 'px',
61
+ marginTop: top + 'px'
62
+ });
63
+ return $spinner;
64
+ },
65
+
66
+ AjaxErrorHandler : function($dialog, status, textStatus, errorThrown) {
67
+ var $div = $('<div class="with_padding" />');
68
+ var $errorDiv = $('<div id="errorExplanation" />');
69
+ $dialog.html($div);
70
+ $div.append($errorDiv);
71
+ if (status === 0) {
72
+ $errorDiv.append('<h2>The server does not respond!</h2>');
73
+ $errorDiv.append('<p>Please start server and try again.</p>');
74
+ } else {
75
+ $errorDiv.append('<h2>'+errorThrown+' ('+status+')</h2>');
76
+ $errorDiv.append('<p>Please check log and try again.</p>');
77
+ }
78
+ },
79
+
80
+ openPreviewWindow : function (url, title) {
81
+ var $iframe = $('#alchemyPreviewWindow');
82
+ if ($iframe.length === 0) {
83
+ $iframe = $('<iframe src="'+url+'" id="alchemyPreviewWindow"></iframe>');
84
+ $iframe.load(function() {
85
+ $('#preview_load_info').hide();
86
+ });
87
+ $iframe.css({'background-color': '#ffffff'});
88
+ Alchemy.PreviewWindow = $iframe.dialog({
89
+ modal: false,
90
+ title: title,
91
+ width: $(window).width() - 512,
92
+ height: $(window).height() - 94,
93
+ minWidth: 600,
94
+ minHeight: 300,
95
+ show: "fade",
96
+ hide: "fade",
97
+ position: [73, 84],
98
+ autoResize: true,
99
+ closeOnEscape: false,
100
+ create: function() {
101
+ var $spinner = $('<img src="/images/alchemy/ajax_loader.gif" alt="" id="preview_load_info" />');
102
+ $('#ui-dialog-title-alchemyPreviewWindow').after($spinner);
103
+ var $reload = $('<a href="#" class="ui-dialog-titlebar-refresh ui-corner-all" role="button"></a>');
104
+ $reload.append('<span class="ui-icon ui-icon-refresh">reload</span>');
105
+ $('#ui-dialog-title-alchemyPreviewWindow').after($reload);
106
+ $reload.click(Alchemy.reloadPreview);
107
+ },
108
+ close: function(event, ui) {
109
+ Alchemy.PreviewWindowButton.enable();
110
+ },
111
+ open: function (event, ui) {
112
+ $(this).css({width: '100%'});
113
+ Alchemy.PreviewWindowButton.disable();
114
+ Alchemy.previewWindowFrameWidth = $('#alchemyPreviewWindow').width();
115
+ }
116
+ }).dialogExtend({
117
+ "maximize" : true,
118
+ "dblclick" : "maximize",
119
+ "events" : {
120
+ beforeMaximize: function(evt, dlg) {
121
+ Alchemy.previewWindowPosition = $('#alchemyPreviewWindow').dialog('widget').offset();
122
+ Alchemy.previewWindowFrameWidth = $('#alchemyPreviewWindow').width();
123
+ },
124
+ maximize : function(evt, dlg) {
125
+ $('#alchemyPreviewWindow').css({width: "100%"});
126
+ },
127
+ restore : function(evt, dlg) {
128
+ $('#alchemyPreviewWindow').dialog('widget').css(Alchemy.previewWindowPosition);
129
+ $('#alchemyPreviewWindow').css({width: Alchemy.previewWindowFrameWidth});
130
+ }
131
+ }
132
+ });
133
+ } else {
134
+ $('#alchemyPreviewWindow').dialog('open');
135
+ }
136
+ Alchemy.PreviewWindow.refresh = function () {
137
+ var $iframe = $('#alchemyPreviewWindow');
138
+ $('#preview_load_info').show();
139
+ $iframe.load(function() {
140
+ $('#preview_load_info').hide();
141
+ });
142
+ $iframe.attr('src', $iframe.attr('src'));
143
+ return true;
144
+ };
145
+ },
146
+
147
+ PreviewWindowExists : function() {
148
+ if (Alchemy.PreviewWindow) {
149
+ return true;
150
+ } else {
151
+ return false;
152
+ }
153
+ },
154
+
155
+ reloadPreview : function() {
156
+ Alchemy.PreviewWindow.refresh();
157
+ },
158
+
159
+ ElementsWindowButton : {
160
+ enable: function() {
161
+ $('div#show_element_window').removeClass('disabled');
162
+ },
163
+ disable: function() {
164
+ $('div#show_element_window').addClass('disabled');
165
+ },
166
+ toggle: function() {
167
+ $('div#show_element_window').toggleClass('disabled');
168
+ }
169
+ },
170
+
171
+ PreviewWindowButton : {
172
+ enable: function() {
173
+ $('div#show_preview_window').removeClass('disabled');
174
+ },
175
+ disable: function() {
176
+ $('div#show_preview_window').addClass('disabled');
177
+ },
178
+ toggle: function() {
179
+ $('div#show_preview_window').toggleClass('disabled');
180
+ }
181
+ },
182
+
183
+ openElementsWindow : function (path, options) {
184
+ var $dialog = $('<div style="display: none" id="alchemyElementWindow"></div>');
185
+ var closeCallback = function() {
186
+ $dialog.dialog("destroy");
187
+ $('#alchemyElementWindow').remove();
188
+ Alchemy.ElementsWindowButton.enable();
189
+ };
190
+ $dialog.html(Alchemy.getOverlaySpinner({x: 420, y: 300}));
191
+ Alchemy.ElementsWindow = $dialog.dialog({
192
+ modal: false,
193
+ minWidth: 422,
194
+ minHeight: 300,
195
+ height: $(window).height() - 94,
196
+ title: options.texts.title,
197
+ show: "fade",
198
+ hide: "fade",
199
+ position: [$(window).width() - 432, 84],
200
+ closeOnEscape: false,
201
+ create: function() {
202
+ $dialog.before(Alchemy.createElementWindowToolbar(options.toolbarButtons));
203
+ },
204
+ open: function(event, ui) {
205
+ Alchemy.ElementsWindowButton.disable();
206
+ $.ajax({
207
+ url: path,
208
+ success: function(data, textStatus, XMLHttpRequest) {
209
+ $dialog.html(data);
210
+ Alchemy.ButtonObserver('#alchemyElementWindow button.button');
211
+ },
212
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
213
+ Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
214
+ }
215
+ });
216
+ },
217
+ beforeClose : function() {
218
+ if (Alchemy.isPageDirty()) {
219
+ Alchemy.openConfirmWindow({
220
+ title: options.texts.dirtyTitle,
221
+ message: options.texts.dirtyMessage,
222
+ okLabel: options.texts.okLabel,
223
+ cancelLabel: options.texts.cancelLabel,
224
+ okCallback: closeCallback
225
+ });
226
+ return false;
227
+ } else {
228
+ return true;
229
+ }
230
+ },
231
+ close: closeCallback
232
+ });
233
+ },
234
+
235
+ createElementWindowToolbar : function(buttons) {
236
+ var $toolbar = $('<div id="overlay_toolbar"></div>'), btn;
237
+ for (i = 0; i < buttons.length; i++) {
238
+ btn = buttons[i];
239
+ $toolbar.append(
240
+ Alchemy.createToolbarButton({
241
+ buttonTitle: btn.title,
242
+ buttonLabel: btn.label,
243
+ iconClass: btn.iconClass,
244
+ onClick: btn.onClick,
245
+ buttonId: btn.buttonId
246
+ })
247
+ );
248
+ }
249
+ return $toolbar;
250
+ },
251
+
252
+ createToolbarButton : function(options) {
253
+ var $btn = $('<div class="button_with_label"></div>'), $lnk;
254
+ if (options.buttonId) $btn.attr({'id': options.buttonId});
255
+ $lnk = $('<a title="'+options.buttonTitle+'" class="icon_button"></a>');
256
+ $lnk.click(options.onClick);
257
+ $lnk.append('<span class="icon '+options.iconClass+'"></span>');
258
+ $btn.append($lnk);
259
+ $btn.append('<br><label>'+options.buttonLabel+'</label>');
260
+ return $btn;
261
+ },
262
+
263
+ openConfirmWindow : function (options) {
264
+ var $confirmation = $('<div style="display:none" id="alchemyConfirmation"></div>');
265
+ $confirmation.appendTo('body');
266
+ $confirmation.html('<p>'+options.message+'</p>');
267
+ Alchemy.ConfirmationWindow = $confirmation.dialog({
268
+ resizable: false,
269
+ minHeight: 100,
270
+ minWidth: 300,
271
+ modal: true,
272
+ title: options.title,
273
+ show: "fade",
274
+ hide: "fade",
275
+ buttons: [
276
+ {
277
+ text: options.cancelLabel,
278
+ click: function() {
279
+ $(this).dialog("close");
280
+ }
281
+ },
282
+ {
283
+ text: options.okLabel,
284
+ click: function() {
285
+ $(this).dialog("close");
286
+ options.okCallback();
287
+ }
288
+ }
289
+ ],
290
+ open: function () {
291
+ Alchemy.ButtonObserver('#alchemyConfirmation .button');
292
+ },
293
+ close: function() {
294
+ $('#alchemyConfirmation').remove();
295
+ }
296
+ });
297
+ },
298
+
299
+ confirmToDeleteWindow : function (url, title, message, okLabel, cancelLabel) {
300
+ var $confirmation = $('<div style="display:none" id="alchemyConfirmation"></div>');
301
+ $confirmation.appendTo('body');
302
+ $confirmation.html('<p>'+message+'</p>');
303
+ Alchemy.ConfirmationWindow = $confirmation.dialog({
304
+ resizable: false,
305
+ minHeight: 100,
306
+ minWidth: 300,
307
+ modal: true,
308
+ title: title,
309
+ show: "fade",
310
+ hide: "fade",
311
+ buttons: [
312
+ {
313
+ text: cancelLabel,
314
+ click: function() {
315
+ $(this).dialog("close");
316
+ }
317
+ },
318
+ {
319
+ text: okLabel,
320
+ click: function() {
321
+ $(this).dialog("close");
322
+ $.ajax({
323
+ url: url,
324
+ type: 'DELETE'
325
+ });
326
+ }
327
+ }
328
+ ],
329
+ open: function () {
330
+ Alchemy.ButtonObserver('#alchemyConfirmation .button');
331
+ },
332
+ close: function() {
333
+ $('#alchemyConfirmation').remove();
334
+ }
335
+ });
336
+ },
337
+
338
+ openWindow : function (action_url, title, size_x, size_y, resizable, modal, overflow) {
339
+ overflow == undefined ? overflow = false: overflow = overflow;
340
+ if (size_x === 'fullscreen') {
341
+ size_x = $(window).width() - 50;
342
+ size_y = $(window).height() - 50;
343
+ }
344
+ var $dialog = $('<div style="display:none" id="alchemyOverlay"></div>');
345
+ $dialog.appendTo('body');
346
+ $dialog.html(Alchemy.getOverlaySpinner({x: size_x, y: size_y}));
347
+
348
+ Alchemy.CurrentWindow = $dialog.dialog({
349
+ modal: modal,
350
+ minWidth: size_x,
351
+ minHeight: size_y > 68 ? size_y : 68,
352
+ title: title,
353
+ resizable: resizable,
354
+ show: "fade",
355
+ hide: "fade",
356
+ open: function (event, ui) {
357
+ $.ajax({
358
+ url: action_url,
359
+ success: function(data, textStatus, XMLHttpRequest) {
360
+ $dialog.html(data);
361
+ $dialog.css({overflow: overflow ? 'visible' : 'auto'});
362
+ $dialog.dialog('widget').css({overflow: overflow ? 'visible' : 'hidden'});
363
+ Alchemy.SelectBox('#alchemyOverlay select');
364
+ Alchemy.ButtonObserver('#alchemyOverlay .button');
365
+ },
366
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
367
+ Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
368
+ }
369
+ });
370
+ },
371
+ beforeClose: function() {
372
+ $(".sb.open").triggerAll("close");
373
+ },
374
+ close: function () {
375
+ $dialog.remove();
376
+ }
377
+ });
378
+ },
379
+
380
+ closeCurrentWindow : function() {
381
+ if (Alchemy.CurrentWindow) {
382
+ Alchemy.CurrentWindow.dialog('close');
383
+ Alchemy.CurrentWindow = null;
384
+ } else {
385
+ $('#alchemyOverlay').dialog('close');
386
+ }
387
+ return true;
388
+ },
389
+
390
+ zoomImage : function(url, title, width, height) {
391
+ var window_height = height;
392
+ var window_width = width;
393
+ var $doc_width = $(window).width();
394
+ var $doc_height = $(window).height();
395
+ if (width > $doc_width) {
396
+ window_width = $doc_width - 50;
397
+ }
398
+ if (height > $doc_height) {
399
+ window_height = $doc_height - 50;
400
+ }
401
+ var $dialog = $('<div style="display:none" id="alchemyOverlay"></div>');
402
+ $dialog.appendTo('body');
403
+ $dialog.html(Alchemy.getOverlaySpinner({x: width, y: height}));
404
+ $dialog.dialog({
405
+ modal: false,
406
+ minWidth: window_width < 320 ? 320 : window_width,
407
+ minHeight: window_height < 240 ? 240 : window_height,
408
+ title: title,
409
+ show: "fade",
410
+ hide: "fade",
411
+ open: function (event, ui) {
412
+ $.ajax({
413
+ url: url,
414
+ success: function(data, textStatus, XMLHttpRequest) {
415
+ $dialog.html(data);
416
+ },
417
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
418
+ Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
419
+ }
420
+ });
421
+ },
422
+ close: function () {
423
+ $dialog.remove();
424
+ }
425
+ });
426
+ return false;
427
+ },
428
+
429
+ openLicencseWindow : function() {
430
+ var height = $(window).height() - 150;
431
+ var $iframe = $('<iframe src="http://www.gnu.org/licenses/gpl-3.0.txt"></iframe>');
432
+ $iframe.dialog({
433
+ bgiframe: true,
434
+ title: 'GNU GPL License',
435
+ width: 650,
436
+ height: height,
437
+ autoResize: true,
438
+ close: function(event, ui) { $(this).dialog('destroy'); },
439
+ open: function (event, ui) { $(this).css({width: '100%'}); }
440
+ });
441
+ },
442
+
443
+ pleaseWaitOverlay : function(show) {
444
+ if (typeof(show) == 'undefined') {
445
+ show = true;
446
+ }
447
+ var $overlay = $('#overlay');
448
+ $overlay.css("visibility", show ? 'visible': 'hidden');
449
+ },
450
+
451
+ toggleElement : function (id, url, token, text) {
452
+ var toggle = function() {
453
+ $('#element_'+id+'_folder').hide();
454
+ $('#element_'+id+'_folder_spinner').show();
455
+ $.post(url, {
456
+ authenticity_token: encodeURIComponent(token)
457
+ }, function(request) {
458
+ $('#element_'+id+'_folder').show();
459
+ $('#element_'+id+'_folder_spinner').hide();
460
+ });
461
+ }
462
+ if (Alchemy.isPageDirty()) {
463
+ Alchemy.openConfirmWindow({
464
+ title: text.title,
465
+ message: text.message,
466
+ okLabel: text.okLabel,
467
+ cancelLabel: text.cancelLabel,
468
+ okCallback: toggle
469
+ });
470
+ return false;
471
+ } else {
472
+ toggle();
473
+ }
474
+ },
475
+
476
+ ListFilter : function(selector) {
477
+ var text = $('#search_field').val().toLowerCase();
478
+ var $boxes = $(selector);
479
+ $boxes.map(function() {
480
+ $this = $(this);
481
+ $this.css({
482
+ display: $this.attr('name').toLowerCase().indexOf(text) != -1 ? '' : 'none'
483
+ });
484
+ });
485
+ },
486
+
487
+ fadeImage : function(image, spinner_selector) {
488
+ try {
489
+ $(spinner_selector).hide();
490
+ $(image).fadeIn(600);
491
+ } catch(e) {
492
+ Alchemy.debug(e);
493
+ };
494
+ },
495
+
496
+ saveElement : function(form) {
497
+ var $rtf_contents = $(form).find('div.content_rtf_editor');
498
+ if ($rtf_contents.size() > 0) {
499
+ $rtf_contents.each(function() {
500
+ var id = $(this).children('textarea.tinymce').attr('id');
501
+ tinymce.get(id).save();
502
+ });
503
+ }
504
+ },
505
+
506
+ setElementSaved : function(selector) {
507
+ var $element = $(selector);
508
+ Alchemy.setElementClean(selector);
509
+ Alchemy.enableButton(selector + ' button.button');
510
+ },
511
+
512
+ resizeFrame : function() {
513
+ var options = {
514
+ top: 90,
515
+ left: 65,
516
+ right: 0
517
+ };
518
+ var $mainFrame = $('#main_content');
519
+ var $topFrame = $('#top_menu');
520
+ var view_height = $(window).height();
521
+ var view_width = $(window).width();
522
+ var mainFrameHeight = view_height - options.top;
523
+ var topFrameHeight = options.top;
524
+ var width = view_width - options.left - options.right;
525
+ if ($mainFrame.length > 0) {
526
+ $mainFrame.css({
527
+ width: width,
528
+ height: mainFrameHeight
529
+ });
530
+ }
531
+ if ($topFrame.length > 0) {
532
+ $topFrame.css({
533
+ width: width,
534
+ height: topFrameHeight
535
+ });
536
+ }
537
+ },
538
+
539
+ SortableElements : function(page_id, form_token) {
540
+ $('#element_area .sortable_cell').sortable({
541
+ items: 'div.element_editor',
542
+ handle: '.element_handle',
543
+ axis: 'y',
544
+ placeholder: 'droppable_element_placeholder',
545
+ forcePlaceholderSize: true,
546
+ dropOnEmpty: true,
547
+ opacity: 0.5,
548
+ cursor: 'move',
549
+ tolerance: 'pointer',
550
+ update: function(event, ui) {
551
+ var ids = $.map($(event.target).children(), function(child) {
552
+ return child.id.replace(/element_/, '');
553
+ });
554
+ // Is the trash window open?
555
+ if ($('#alchemyTrashWindow').length > 0) {
556
+ // updating the trash icon
557
+ if ($('#trash_items div.element_editor').not('.dragged').length === 0) {
558
+ $('#element_trash_button .icon').removeClass('full');
559
+ $('#trash_empty_notice').show();
560
+ }
561
+ }
562
+ $(event.target).css("cursor", "progress");
563
+ $.ajax({
564
+ url: '/admin/elements/order',
565
+ type: 'POST',
566
+ data: "page_id=" + page_id + "&authenticity_token=" + encodeURIComponent(form_token) + "&" + $.param({element_ids: ids}),
567
+ complete: function () {
568
+ $(event.target).css("cursor", "auto");
569
+ Alchemy.refreshTrashWindow(page_id);
570
+ }
571
+ });
572
+ },
573
+ start: function(event, ui) {
574
+ var $textareas = ui.item.find('textarea.tinymce');
575
+ $textareas.each(function() {
576
+ tinymce.get(this.id).remove();
577
+ });
578
+ },
579
+ stop: function(event, ui) {
580
+ var $textareas = ui.item.find('textarea.tinymce');
581
+ $textareas.each(function() {
582
+ TinymceHammer.addEditor(this.id);
583
+ });
584
+ }
585
+ });
586
+ },
587
+
588
+ openTrashWindow : function (page_id, title) {
589
+ var size_x = 380, size_y = 270;
590
+ if (size_x === 'fullscreen') {
591
+ size_x = $(window).width() - 50;
592
+ size_y = $(window).height() - 50;
593
+ }
594
+ var $dialog = $('<div style="display:none" id="alchemyTrashWindow"></div>');
595
+ $dialog.appendTo('body');
596
+ $dialog.html(Alchemy.getOverlaySpinner({x: size_x, y: size_y}));
597
+
598
+ Alchemy.trashWindow = $dialog.dialog({
599
+ modal: false,
600
+ width: 380,
601
+ minHeight: 450,
602
+ maxHeight: $(window).height() - 50,
603
+ title: title,
604
+ resizable: false,
605
+ show: "fade",
606
+ hide: "fade",
607
+ open: function (event, ui) {
608
+ $.ajax({
609
+ url: '/admin/trash?page_id=' + page_id,
610
+ success: function(data, textStatus, XMLHttpRequest) {
611
+ $dialog.html(data);
612
+ // Need this for DragnDrop elements into elements window.
613
+ // Badly this is screwing up maxHeight option
614
+ $dialog.css({overflow: 'visible'}).dialog('widget').css({overflow: 'visible'});
615
+ },
616
+ error: function(XMLHttpRequest, textStatus, errorThrown) {
617
+ Alchemy.AjaxErrorHandler($dialog, XMLHttpRequest.status, textStatus, errorThrown);
618
+ }
619
+ });
620
+ },
621
+ close: function () {
622
+ $dialog.remove();
623
+ }
624
+ });
625
+ },
626
+
627
+ refreshTrashWindow: function(page_id) {
628
+ if ($('#alchemyTrashWindow').length > 0) {
629
+ $('#alchemyTrashWindow').html(Alchemy.getOverlaySpinner({x: 380, y: 270}));
630
+ $.get('/admin/trash?page_id='+page_id, function(html) {
631
+ $('#alchemyTrashWindow').html(html);
632
+ });
633
+ }
634
+ },
635
+
636
+ SortableContents : function(selector, token) {
637
+ $(selector).sortable({
638
+ items: 'div.dragable_picture',
639
+ handle: 'div.picture_handle',
640
+ placeholder: 'droppable_content_placeholder',
641
+ opacity: 0.5,
642
+ cursor: 'move',
643
+ tolerance: 'pointer',
644
+ containment: 'parent',
645
+ update: function(event, ui) {
646
+ var ids = $.map($(event.target).children('div.dragable_picture'), function (child) {
647
+ return child.id.replace(/essence_picture_/, '');
648
+ });
649
+ $(event.originalTarget).css("cursor", "progress");
650
+ $.ajax({
651
+ url: '/admin/contents/order',
652
+ type: 'POST',
653
+ data: "authenticity_token=" + encodeURIComponent(token) + "&" + $.param({content_ids: ids}),
654
+ complete: function () {
655
+ $(event.originalTarget).css("cursor", "move");
656
+ }
657
+ });
658
+ }
659
+ });
660
+ },
661
+
662
+ Tooltips : function() {
663
+ var xOffset = 10;
664
+ var yOffset = 20;
665
+ $(".tooltip").hover(function(e) {
666
+ this.original_title = this.title;
667
+ if (this.original_title == '') {
668
+ this.tooltip_content = $(this).next('.tooltip_content').html();
669
+ } else {
670
+ this.tooltip_content = this.original_title;
671
+ }
672
+ if (this.tooltip_content != null) {
673
+ this.title = "";
674
+ $("body").append("<div id='tooltip'>"+ this.tooltip_content +"</div>");
675
+ $("#tooltip")
676
+ .css("top",(e.pageY - xOffset) + "px")
677
+ .css("left",(e.pageX + yOffset) + "px")
678
+ .fadeIn(400);
679
+ }
680
+ },
681
+ function() {
682
+ this.title = this.original_title;
683
+ $("#tooltip").remove();
684
+ });
685
+ $(".tooltip").mousemove(function(e) {
686
+ $("#tooltip")
687
+ .css("top",(e.pageY - xOffset) + "px")
688
+ .css("left",(e.pageX + yOffset) + "px");
689
+ });
690
+ },
691
+
692
+ SelectBox : function(selector) {
693
+ $(selector).sb({animDuration: 0, fixedWidth: true});
694
+ },
695
+
696
+ Buttons : function(options) {
697
+ $("button, input:submit, a.button").button(options);
698
+ },
699
+
700
+ ElementDirtyObserver : function(selector) {
701
+ var $elements = $(selector);
702
+ $elements.find('textarea.tinymce').map(function() {
703
+ var $this = $(this);
704
+ var ed = tinymce.get(this.id);
705
+ ed.onChange.add(function(ed, l) {
706
+ Alchemy.setElementDirty($this.parents('.element_editor'));
707
+ });
708
+ });
709
+ $elements.find('input[type="text"]').bind('change', function() {
710
+ $(this).addClass('dirty');
711
+ Alchemy.setElementDirty($(this).parents('.element_editor'));
712
+ });
713
+ $elements.find('.element_foot input[type="checkbox"]').bind('click', function() {
714
+ $(this).addClass('dirty');
715
+ Alchemy.setElementDirty($(this).parents('.element_editor'));
716
+ });
717
+ $elements.find('select').bind('change', function() {
718
+ $(this).addClass('dirty');
719
+ Alchemy.setElementDirty($(this).parents('.element_editor'));
720
+ });
721
+ },
722
+
723
+ setElementDirty : function(element) {
724
+ var $element = $(element);
725
+ $element.addClass('dirty');
726
+ $element.find('.element_head .icon').addClass('element_dirty');
727
+ },
728
+
729
+ setElementClean : function(element) {
730
+ var $element = $(element);
731
+ $element.removeClass('dirty');
732
+ $element.find('.element_foot input[type="checkbox"]').removeClass('dirty');
733
+ $element.find('input[type="text"]').removeClass('dirty');
734
+ $element.find('select').removeClass('dirty');
735
+ $element.find('.element_head .icon').removeClass('element_dirty');
736
+ },
737
+
738
+ isPageDirty : function() {
739
+ return $('#element_area').find('.element_editor.dirty').size() > 0;
740
+ },
741
+
742
+ checkPageDirtyness : function(element, text) {
743
+ var okcallback;
744
+ if ($(element).is('form')) {
745
+ okcallback = function() {
746
+ var $form = $('<form action="'+element.action+'" method="POST" style="display: none"></form>');
747
+ $form.append($(element).find('input'));
748
+ $form.appendTo('body');
749
+ Alchemy.pleaseWaitOverlay();
750
+ $form.submit();
751
+ }
752
+ } else if ($(element).is('a')) {
753
+ okcallback = function() {
754
+ Alchemy.pleaseWaitOverlay();
755
+ document.location = element.pathname;
756
+ }
757
+ }
758
+ if (Alchemy.isPageDirty()) {
759
+ Alchemy.openConfirmWindow({
760
+ title: text.title,
761
+ message: text.message,
762
+ okLabel: text.okLabel,
763
+ cancelLabel: text.cancelLabel,
764
+ okCallback: okcallback
765
+ });
766
+ return false;
767
+ } else {
768
+ return true;
769
+ }
770
+ },
771
+
772
+ PageLeaveObserver : function(texts) {
773
+ $('#main_navi a').click(function(event) {
774
+ if (!Alchemy.checkPageDirtyness(event.currentTarget, texts)) {
775
+ event.preventDefault();
776
+ }
777
+ });
778
+ },
779
+
780
+ handleEssenceCheckbox: function (checkbox) {
781
+ var $checkbox = $(checkbox);
782
+ if (checkbox.checked) {
783
+ $('#' + checkbox.id + '_hidden').remove();
784
+ } else {
785
+ $checkbox.after('<input type="hidden" value="0" name="'+checkbox.name+'" id="'+checkbox.id+'_hidden">');
786
+ }
787
+ },
788
+
789
+ DraggableTrashItems: function (items_n_cells) {
790
+ $("#trash_items div.draggable").each(function () {
791
+ $(this).draggable({
792
+ helper: 'clone',
793
+ iframeFix: 'iframe#alchemyPreviewWindow',
794
+ connectToSortable: '#cell_' + items_n_cells[this.id],
795
+ start: function(event, ui) {
796
+ $(this).hide().addClass('dragged');
797
+ ui.helper.css({width: '300px'});
798
+ },
799
+ stop: function() {
800
+ $(this).show().removeClass('dragged');
801
+ }
802
+ });
803
+ });
804
+ },
805
+
806
+ selectOrCreateCellTab: function (cell_name, label) {
807
+ if ($('#cell_'+cell_name).size() === 0) {
808
+ $('#cells').tabs('add', '#cell_'+cell_name, label);
809
+ $('#cell_'+cell_name).addClass('sortable_cell');
810
+ }
811
+ $('#cells').tabs('select', 'cell_'+cell_name);
812
+ },
813
+
814
+ ButtonObserver: function (selector) {
815
+ $(selector).click(function(event) {
816
+ Alchemy.disableButton(this);
817
+ });
818
+ },
819
+
820
+ disableButton: function (button) {
821
+ var $button = $(button), $clone = $button.clone(), width = $button.outerWidth(), text = $button.text();
822
+ $button.hide();
823
+ $button.parent().append($clone);
824
+ $clone.attr({disabled: true})
825
+ .addClass('disabled cloned-button')
826
+ .css({width: width})
827
+ .html('<img src="/images/alchemy/ajax_loader.gif">')
828
+ .show();
829
+ return true;
830
+ },
831
+
832
+ enableButton: function (button) {
833
+ var $button = $(button);
834
+ $button.show();
835
+ $button.parent().find('.cloned-button').remove();
836
+ return true;
837
+ },
838
+
839
+ debug : function(e) {
840
+ if (window['console']) {
841
+ console.debug(e);
842
+ console.trace();
843
+ }
844
+ }
845
+
846
+ });
847
+
848
+ })(jQuery);
849
+
850
+ (function($) {
851
+
852
+ // Call all Alchemy "onload" scripts
853
+ $(document).ready(function () {
854
+ Alchemy.resizeFrame();
855
+ Alchemy.Tooltips();
856
+ if (typeof(jQuery().sb) === 'function') {
857
+ Alchemy.SelectBox('body#alchemy select');
858
+ }
859
+ if (jQuery('#flash_notices').length > 0) {
860
+ Alchemy.Growler.fade();
861
+ }
862
+ $('#alchemy a.icon_button.please_wait_overlay').click(function() {
863
+ Alchemy.pleaseWaitOverlay();
864
+ });
865
+ });
866
+
867
+ // Alchemy window resize listener
868
+ $(window).resize(function() {
869
+ Alchemy.resizeFrame();
870
+ });
871
+
872
+ })(jQuery);
873
+
874
+ // Javascript extensions
875
+
876
+ String.prototype.beginsWith = function(t, i) {
877
+ if (i==false) {
878
+ return (t == this.substring(0, t.length));
879
+ }
880
+ else {
881
+ return (t.toLowerCase() == this.substring(0, t.length).toLowerCase());
882
+ }
883
+ };
884
+
885
+ String.prototype.endsWith = function(t, i) {
886
+ if (i==false) {
887
+ return (t == this.substring(this.length - t.length));
888
+ }
889
+ else {
890
+ return (t.toLowerCase() == this.substring(this.length - t.length).toLowerCase());
891
+ }
892
+ };