alchemy_cms 2.0.pre2 → 2.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/.gitignore +5 -1
  2. data/Gemfile +3 -0
  3. data/Rakefile +16 -14
  4. data/{alchemy.gemspec → alchemy_cms.gemspec} +1 -1
  5. data/app/models/message.rb +1 -1
  6. data/app/views/elements/_searchresult_view.html.erb +1 -1
  7. data/config/initializers/fast_gettext.rb +1 -1
  8. data/config/routes.rb +3 -0
  9. data/lib/alchemy/version.rb +1 -1
  10. data/lib/{alchemy.rb → alchemy_cms.rb} +0 -0
  11. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +2 -2
  12. data/lib/rails/templates/alchemy.rb +1 -1
  13. data/spec/alchemy_spec.rb +7 -0
  14. data/spec/config_spec.rb +7 -0
  15. data/spec/dummy/Rakefile +7 -0
  16. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  17. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  18. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  19. data/spec/dummy/config.ru +4 -0
  20. data/spec/dummy/config/alchemy/config.yml +199 -0
  21. data/spec/dummy/config/alchemy/elements.yml +91 -0
  22. data/spec/dummy/config/alchemy/page_layouts.yml +29 -0
  23. data/spec/dummy/config/application.rb +45 -0
  24. data/spec/dummy/config/boot.rb +10 -0
  25. data/spec/dummy/config/database.yml +22 -0
  26. data/spec/dummy/config/environment.rb +5 -0
  27. data/spec/dummy/config/environments/development.rb +26 -0
  28. data/spec/dummy/config/environments/production.rb +49 -0
  29. data/spec/dummy/config/environments/test.rb +35 -0
  30. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  31. data/spec/dummy/config/initializers/inflections.rb +10 -0
  32. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  33. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  34. data/spec/dummy/config/initializers/session_store.rb +8 -0
  35. data/spec/dummy/config/locales/en.yml +5 -0
  36. data/spec/dummy/config/routes.rb +58 -0
  37. data/spec/dummy/db/schema.rb +267 -0
  38. data/spec/dummy/log/production.log +0 -0
  39. data/spec/dummy/log/server.log +0 -0
  40. data/spec/dummy/public/404.html +26 -0
  41. data/spec/dummy/public/422.html +26 -0
  42. data/spec/dummy/public/500.html +26 -0
  43. data/spec/dummy/public/favicon.ico +0 -0
  44. data/spec/dummy/public/images/alchemy/ajax_loader.gif +0 -0
  45. data/spec/dummy/public/images/alchemy/alchemy-logo.png +0 -0
  46. data/spec/dummy/public/images/alchemy/flags.png +0 -0
  47. data/spec/dummy/public/images/alchemy/gui/navi-tab.png +0 -0
  48. data/spec/dummy/public/images/alchemy/gui/shading.png +0 -0
  49. data/spec/dummy/public/images/alchemy/gui/shading_90.png +0 -0
  50. data/spec/dummy/public/images/alchemy/gui/toggle.png +0 -0
  51. data/spec/dummy/public/images/alchemy/icons.png +0 -0
  52. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow.gif +0 -0
  53. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg.gif +0 -0
  54. data/spec/dummy/public/images/alchemy/jquery-sb/select_arrow_bg_hover.gif +0 -0
  55. data/spec/dummy/public/images/alchemy/jquery-ui/ui-icons_666666_256x240.png +0 -0
  56. data/spec/dummy/public/images/alchemy/placeholder.png +0 -0
  57. data/spec/dummy/public/images/alchemy/swfupload/browse_button.png +0 -0
  58. data/spec/dummy/public/javascripts/alchemy/alchemy.element_editor_selector.js +88 -0
  59. data/spec/dummy/public/javascripts/alchemy/alchemy.growler.js +44 -0
  60. data/spec/dummy/public/javascripts/alchemy/alchemy.image_cropper.js +56 -0
  61. data/spec/dummy/public/javascripts/alchemy/alchemy.js +892 -0
  62. data/spec/dummy/public/javascripts/alchemy/alchemy.link_overlay.js +221 -0
  63. data/spec/dummy/public/javascripts/alchemy/alchemy.page_sorter.js +42 -0
  64. data/spec/dummy/public/javascripts/alchemy/alchemy.preview.js +145 -0
  65. data/spec/dummy/public/javascripts/alchemy/jquery-ui.js +428 -0
  66. data/spec/dummy/public/javascripts/alchemy/jquery.Jcrop.min.js +246 -0
  67. data/spec/dummy/public/javascripts/alchemy/jquery.dialogextend.min.js +8 -0
  68. data/spec/dummy/public/javascripts/alchemy/jquery.in-place-edit.js +171 -0
  69. data/spec/dummy/public/javascripts/alchemy/jquery.js +18 -0
  70. data/spec/dummy/public/javascripts/alchemy/jquery.rails.js +315 -0
  71. data/spec/dummy/public/javascripts/alchemy/jquery.sb.min.js +14 -0
  72. data/spec/dummy/public/javascripts/alchemy/jquery.scrollTo-1.4.2-min.js +11 -0
  73. data/spec/dummy/public/javascripts/alchemy/jquery.ui.nestedSortable.js +291 -0
  74. data/spec/dummy/public/javascripts/alchemy/jquery.ui.tabspaging.js +281 -0
  75. data/spec/dummy/public/javascripts/alchemy/swfupload/fileprogress.js +203 -0
  76. data/spec/dummy/public/javascripts/alchemy/swfupload/handlers.js +171 -0
  77. data/spec/dummy/public/javascripts/alchemy/swfupload/queue.js +98 -0
  78. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.js +980 -0
  79. data/spec/dummy/public/javascripts/alchemy/swfupload/swfupload.swf +0 -0
  80. data/spec/dummy/public/javascripts/alchemy/tiny_mce/jquery.tinymce.js +1 -0
  81. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/de.js +1 -0
  82. data/spec/dummy/public/javascripts/alchemy/tiny_mce/langs/en.js +223 -0
  83. data/spec/dummy/public/javascripts/alchemy/tiny_mce/license.txt +504 -0
  84. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/editor_plugin.js +43 -0
  85. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/de.js +4 -0
  86. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/alchemy_link/langs/en.js +4 -0
  87. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  88. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/fullscreen/fullscreen.htm +109 -0
  89. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  90. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css +402 -0
  91. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  92. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  93. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  94. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  95. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  96. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/de_dlg.js +1 -0
  97. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/langs/en_dlg.js +5 -0
  98. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pastetext.htm +27 -0
  99. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/paste/pasteword.htm +21 -0
  100. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/cell.htm +180 -0
  101. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/cell.css +17 -0
  102. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/row.css +25 -0
  103. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/css/table.css +13 -0
  104. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/editor_plugin.js +1 -0
  105. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/cell.js +319 -0
  106. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  107. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/row.js +237 -0
  108. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/js/table.js +450 -0
  109. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/de_dlg.js +1 -0
  110. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/langs/en_dlg.js +75 -0
  111. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/merge_cells.htm +32 -0
  112. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/row.htm +158 -0
  113. data/spec/dummy/public/javascripts/alchemy/tiny_mce/plugins/table/table.htm +188 -0
  114. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/about.htm +52 -0
  115. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/anchor.htm +26 -0
  116. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/charmap.htm +51 -0
  117. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/color_picker.htm +74 -0
  118. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/editor_template.js +1 -0
  119. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/image.htm +80 -0
  120. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  121. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/flash.gif +0 -0
  122. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/icons.gif +0 -0
  123. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  124. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  125. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  126. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  127. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  128. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/trans.gif +0 -0
  129. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/video.gif +0 -0
  130. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  131. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/about.js +73 -0
  132. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/anchor.js +42 -0
  133. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/charmap.js +355 -0
  134. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/color_picker.js +329 -0
  135. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/image.js +247 -0
  136. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/link.js +153 -0
  137. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/js/source_editor.js +56 -0
  138. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de.js +1 -0
  139. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/de_dlg.js +1 -0
  140. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en.js +68 -0
  141. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/langs/en_dlg.js +54 -0
  142. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/link.htm +57 -0
  143. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  144. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/content.css +47 -0
  145. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  146. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  147. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  148. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  149. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  150. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  151. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  152. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/default/ui.css +214 -0
  153. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/content.css +23 -0
  154. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  155. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  156. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/content.css +46 -0
  157. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -0
  158. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  159. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  160. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  161. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui.css +217 -0
  162. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  163. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  164. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/advanced/source_editor.htm +25 -0
  165. data/spec/dummy/public/javascripts/alchemy/tiny_mce/themes/simple/langs/de.js +1 -0
  166. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce.js +1 -0
  167. data/spec/dummy/public/javascripts/alchemy/tiny_mce/tiny_mce_popup.js +5 -0
  168. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/editable_selects.js +70 -0
  169. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/form_utils.js +210 -0
  170. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/mctabs.js +162 -0
  171. data/spec/dummy/public/javascripts/alchemy/tiny_mce/utils/validate.js +252 -0
  172. data/spec/dummy/public/javascripts/application.js +2 -0
  173. data/spec/dummy/public/javascripts/controls.js +965 -0
  174. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  175. data/spec/dummy/public/javascripts/effects.js +1123 -0
  176. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  177. data/spec/dummy/public/javascripts/rails.js +191 -0
  178. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  179. data/spec/dummy/public/stylesheets/alchemy/Jcrop.gif +0 -0
  180. data/spec/dummy/public/stylesheets/alchemy/alchemy.css +3629 -0
  181. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_content.css +94 -0
  182. data/spec/dummy/public/stylesheets/alchemy/alchemy_tinymce_dialog.css +415 -0
  183. data/spec/dummy/public/stylesheets/alchemy/default/img/tabs.gif +0 -0
  184. data/spec/dummy/public/stylesheets/alchemy/elements.css +900 -0
  185. data/spec/dummy/public/stylesheets/alchemy/flags.css +1 -0
  186. data/spec/dummy/public/stylesheets/alchemy/ie6.css +18 -0
  187. data/spec/dummy/public/stylesheets/alchemy/jquery-ui-1.8.7.alchemy.css +2023 -0
  188. data/spec/dummy/public/stylesheets/alchemy/jquery.Jcrop.css +35 -0
  189. data/spec/dummy/public/stylesheets/alchemy/jquery.sb.css +244 -0
  190. data/spec/dummy/public/stylesheets/alchemy/standard_set.css +374 -0
  191. data/spec/dummy/script/rails +6 -0
  192. data/spec/integration/navigation_spec.rb +9 -0
  193. data/spec/integration/security_spec.rb +25 -0
  194. data/spec/spec_helper.rb +40 -0
  195. metadata +371 -8
File without changes
File without changes
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ <p>We've been notified about this issue and we'll take a look at it shortly.</p>
24
+ </div>
25
+ </body>
26
+ </html>
File without changes
@@ -0,0 +1,88 @@
1
+ if (typeof(Alchemy) === 'undefined') {
2
+ var Alchemy = {};
3
+ }
4
+
5
+ (function($) {
6
+
7
+ var ElementEditorSelector = {};
8
+ $.extend(Alchemy, ElementEditorSelector);
9
+
10
+ Alchemy.ElementEditorSelector = {
11
+
12
+ init : function() {
13
+ var $elements = $('#element_area .element_editor');
14
+ var self = Alchemy.ElementEditorSelector;
15
+ self.reinit($elements);
16
+ },
17
+
18
+ reinit : function(elements) {
19
+ var self = Alchemy.ElementEditorSelector;
20
+ var $elements = $(elements);
21
+ $elements.each(function () {
22
+ self.bindEvent(this, $elements);
23
+ });
24
+ $elements.find('.element_head').click(self.onClickElement);
25
+ $elements.find('.element_head').dblclick(function() {
26
+ var id = $(this).parent().attr('id').replace(/\D/g,'');
27
+ self.foldElement(id);
28
+ });
29
+ },
30
+
31
+ onClickElement : function(e) {
32
+ var self = Alchemy.ElementEditorSelector;
33
+ var $element = $(this).parent('.element_editor');
34
+ var id = $element.attr('id').replace(/\D/g,'');
35
+ var $frame_elements, $selected_element;
36
+ e.preventDefault();
37
+ $('#element_area .element_editor').removeClass('selected');
38
+ $element.addClass('selected');
39
+ self.scrollToElement(this);
40
+ $frame_elements = document.getElementById('alchemyPreviewWindow').contentWindow.jQuery('[data-alchemy-element]');
41
+ $selected_element = $frame_elements.closest('[data-alchemy-element="'+id+'"]');
42
+ $selected_element.trigger('Alchemy.SelectElement');
43
+ },
44
+
45
+ bindEvent : function (element) {
46
+ var self = Alchemy.ElementEditorSelector;
47
+ $(element).bind('Alchemy.SelectElementEditor', self.selectElement);
48
+ },
49
+
50
+ selectElement : function (e) {
51
+ var self = Alchemy.ElementEditorSelector;
52
+ var id = this.id.replace(/\D/g,'');
53
+ var $element = $(this);
54
+ var $elements = $('#element_area .element_editor');
55
+ var $cells = $('#cells .sortable_cell');
56
+ var $cell;
57
+ e.preventDefault();
58
+ $elements.removeClass('selected');
59
+ $element.addClass('selected');
60
+ if ($cells.size() > 0) {
61
+ $cell = $element.parent('.sortable_cell');
62
+ $('#cells').tabs('select', $cell.attr('id'));
63
+ }
64
+ if ($element.hasClass('folded')) {
65
+ self.foldElement(id);
66
+ } else {
67
+ self.scrollToElement(this);
68
+ }
69
+ },
70
+
71
+ scrollToElement : function(el) {
72
+ $('#alchemyElementWindow').scrollTo(el, {duration: 400, offset: -10});
73
+ },
74
+
75
+ foldElement : function(id) {
76
+ var self = Alchemy.ElementEditorSelector;
77
+ $('#element_'+id+'_folder').hide();
78
+ $('#element_'+id+'_folder_spinner').show();
79
+ $.post('/admin/elements/'+id+'/fold', function() {
80
+ $('#element_'+id+'_folder').show();
81
+ $('#element_'+id+'_folder_spinner').hide();
82
+ self.scrollToElement('#element_'+id);
83
+ });
84
+ }
85
+
86
+ }
87
+
88
+ })(jQuery);
@@ -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
+ };