imagine_cms 4.1.4 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +2 -1
  3. data/app/assets/images/interface/form_loading.gif +0 -0
  4. data/app/assets/images/management/btn-top-delete.png +0 -0
  5. data/app/assets/images/management/btn-top-edit.png +0 -0
  6. data/app/assets/images/management/btn-top-exterminate.png +0 -0
  7. data/app/assets/images/management/btn-top-new.png +0 -0
  8. data/app/assets/images/management/btn-top-preview.png +0 -0
  9. data/app/assets/images/management/btn-top-properties.png +0 -0
  10. data/app/assets/javascripts/codemirror/modes-custom/imagine_cms.js +87 -0
  11. data/app/assets/javascripts/imagine_cms/core.js +510 -0
  12. data/app/assets/javascripts/imagine_cms/legacy/misc.js +537 -0
  13. data/app/assets/javascripts/imagine_cms/legacy/rollovers.js +193 -0
  14. data/app/assets/javascripts/imagine_cms/legacy/slideshow.js +116 -0
  15. data/app/assets/javascripts/imagine_cms/legacy/textfieldhints.js +55 -0
  16. data/app/assets/javascripts/imagine_cms.js +14 -1
  17. data/app/assets/javascripts/imagine_cms_compat.js +26 -0
  18. data/app/assets/javascripts/jquery-ui.js +16608 -0
  19. data/app/assets/javascripts/tag-it.js +591 -0
  20. data/app/assets/stylesheets/imagine_cms.css.scss +26 -10
  21. data/app/assets/stylesheets/imagine_controls.css.scss +8 -0
  22. data/app/assets/stylesheets/jquery-ui.css +1225 -0
  23. data/app/assets/stylesheets/jquery-ui.structure.css +833 -0
  24. data/app/assets/stylesheets/jquery-ui.theme.css +410 -0
  25. data/app/assets/stylesheets/jquery.tagit.css +69 -0
  26. data/app/assets/stylesheets/management.css.scss +7 -0
  27. data/app/assets/stylesheets/tagit.ui-imagine.css +100 -0
  28. data/app/controllers/cms/content_controller.rb +28 -45
  29. data/app/controllers/management/cms_controller.rb +116 -94
  30. data/app/helpers/cms_application_helper.rb +76 -39
  31. data/app/models/cms_page.rb +32 -14
  32. data/app/models/cms_page_object.rb +1 -1
  33. data/app/models/cms_page_tag.rb +2 -2
  34. data/app/models/cms_template.rb +1 -1
  35. data/app/models/user.rb +6 -6
  36. data/app/models/user_group.rb +1 -1
  37. data/app/views/cms/content/_photo_gallery.html.erb +12 -12
  38. data/app/views/cms/content/_search.html.erb +2 -2
  39. data/app/views/cms/content/_search_result.html.erb +16 -10
  40. data/app/views/layouts/management.html.erb +18 -17
  41. data/app/views/management/cms/_edit_page.html.erb +47 -33
  42. data/app/views/management/cms/_gallery_index.html.erb +4 -4
  43. data/app/views/management/cms/_image.html.erb +3 -3
  44. data/app/views/management/cms/_image_details.html.erb +9 -8
  45. data/app/views/management/cms/_list_page.html.erb +2 -2
  46. data/app/views/management/cms/_list_page_select.html.erb +1 -1
  47. data/app/views/management/cms/_page_list.html.erb +69 -48
  48. data/app/views/management/cms/_page_list_source_folder.html.erb +2 -2
  49. data/app/views/management/cms/_template_options.html.erb +4 -4
  50. data/app/views/management/cms/_template_reference.html.erb +13 -15
  51. data/app/views/management/cms/edit_page_content.html.erb +3 -3
  52. data/app/views/management/cms/edit_snippet.html.erb +19 -41
  53. data/app/views/management/cms/edit_template.html.erb +15 -38
  54. data/app/views/management/cms/pages.html.erb +17 -29
  55. data/app/views/management/cms/snippets.html.erb +2 -2
  56. data/app/views/management/cms/templates.html.erb +2 -2
  57. data/app/views/management/cms/toolbar_edit.html.erb +2 -0
  58. data/app/views/management/cms/toolbar_preview.html.erb +2 -2
  59. data/config/initializers/config_file.rb +1 -1
  60. data/imagine_cms.gemspec +7 -4
  61. data/lib/extensions/action_controller_extensions.rb +50 -19
  62. data/lib/imagine_cms/engine.rb +12 -8
  63. data/lib/imagine_cms/version.rb +1 -1
  64. data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +2 -2
  65. data/lib/tasks/imagine_cms_tasks.rake +8 -0
  66. metadata +69 -91
  67. data/app/assets/images/management/btn_archive.gif +0 -0
  68. data/app/assets/images/management/btn_delete.gif +0 -0
  69. data/app/assets/images/management/btn_duplicate.gif +0 -0
  70. data/app/assets/images/management/btn_edit.gif +0 -0
  71. data/app/assets/images/management/btn_new_page.gif +0 -0
  72. data/app/assets/images/management/btn_preview.gif +0 -0
  73. data/app/assets/images/management/btn_properties.gif +0 -0
  74. data/app/assets/images/management/btn_restore.gif +0 -0
  75. data/app/assets/images/management/btn_top_delete.gif +0 -0
  76. data/app/assets/images/management/btn_top_duplicate.gif +0 -0
  77. data/app/assets/images/management/btn_top_edit.gif +0 -0
  78. data/app/assets/images/management/btn_top_new.gif +0 -0
  79. data/app/assets/images/management/btn_top_preview.gif +0 -0
  80. data/app/assets/images/management/btn_top_properties.gif +0 -0
  81. data/app/assets/javascripts/codepress/codepress.html +0 -36
  82. data/app/assets/javascripts/codepress/codepress.js +0 -130
  83. data/app/assets/javascripts/codepress/engines/gecko.js +0 -240
  84. data/app/assets/javascripts/codepress/engines/khtml.js +0 -0
  85. data/app/assets/javascripts/codepress/engines/msie.js +0 -263
  86. data/app/assets/javascripts/codepress/engines/older.js +0 -0
  87. data/app/assets/javascripts/codepress/engines/opera.js +0 -259
  88. data/app/assets/javascripts/codepress/languages/css.js +0 -23
  89. data/app/assets/javascripts/codepress/languages/generic.js +0 -25
  90. data/app/assets/javascripts/codepress/languages/html.js +0 -63
  91. data/app/assets/javascripts/codepress/languages/java.js +0 -24
  92. data/app/assets/javascripts/codepress/languages/javascript.js +0 -30
  93. data/app/assets/javascripts/codepress/languages/perl.js +0 -27
  94. data/app/assets/javascripts/codepress/languages/php.js +0 -60
  95. data/app/assets/javascripts/codepress/languages/ruby.js +0 -26
  96. data/app/assets/javascripts/codepress/languages/sql.js +0 -30
  97. data/app/assets/javascripts/codepress/languages/text.js +0 -9
  98. data/app/assets/javascripts/imagine.js +0 -1393
  99. data/app/assets/stylesheets/codepress/codepress.css +0 -7
  100. data/app/assets/stylesheets/codepress/languages/css.css +0 -10
  101. data/app/assets/stylesheets/codepress/languages/generic.css +0 -9
  102. data/app/assets/stylesheets/codepress/languages/html.css +0 -18
  103. data/app/assets/stylesheets/codepress/languages/java.css +0 -7
  104. data/app/assets/stylesheets/codepress/languages/javascript.css +0 -8
  105. data/app/assets/stylesheets/codepress/languages/perl.css +0 -11
  106. data/app/assets/stylesheets/codepress/languages/php.css +0 -12
  107. data/app/assets/stylesheets/codepress/languages/ruby.css +0 -10
  108. data/app/assets/stylesheets/codepress/languages/sql.css +0 -10
  109. data/app/assets/stylesheets/codepress/languages/text.css +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c43e99a900dd747411328b599d5b7df2087c3e72
4
- data.tar.gz: 05eac6da6721ae32ad0ac5c0dc7443144f741857
3
+ metadata.gz: 65e500475b1ddfb528dc258d4f907a31e18d9bd7
4
+ data.tar.gz: 8099e1954f829ec6db3c812f72f30f6de6723a1c
5
5
  SHA512:
6
- metadata.gz: 0f6108c86f50bd4bf0de2685a727de4e47c11036a77f75475a4e273a9f3b110b865729714a74eab8f58df5c0bfa6e1b8cf080ff5560f183048f11c3999270312
7
- data.tar.gz: d0c8a38d7bc05cac89deaae7a5ec832db23da21ee84af08d93c9c75d376cfda426b4491fe62f7764d85ffe33b094193bbca94a46836775b098ef8efbc8416255
6
+ metadata.gz: 85375bc7487b034d1efdc17ee520b5ff84a5187c5f7f16048c31f52bb15782d969d5a79d02013fd4b82d95922b7af4ec9fe20838cdd998554205e69e6b4b8359
7
+ data.tar.gz: 2c364e718150c9cfc680e82454aed93fbb3deca7d1761d8ce18e93c96055382a7d98ed3ff93b07b665ba2c89931374424d61420a2271955872fbf241f29be00d
data/README.rdoc CHANGED
@@ -15,7 +15,8 @@ All that is now firmly in the past. By extracting Imagine functionality into a g
15
15
  * Imagine 3.0 (Rails 3.2, Ruby 1.9): [DONE] 90% restored functionality, no database changes.
16
16
  * Imagine 3.1 (Rails 3.2, Ruby 1.9/2.0): [DONE, but released as 3.0.x] 100% restored functionality, plus a few extras and fixes.
17
17
  * Imagine 4.0 (Rails 4.0, Ruby 2.1): [DONE] Compatibility with Rails 4.0
18
- * Imagine 4.1 (Rails 4.1, Ruby 2.1): [IN PROGRESS]
18
+ * Imagine 4.1 (Rails 4.1, Ruby 2.1): [DONE]
19
+ * Imagine 4.2 (Rails 4.2, Ruby 2.1): [in progress on master]
19
20
  * Imagine 5.0 (Rails 5.0, Ruby 2.2): [PLANNED, Mid 2015] Compatibility with Rails 5.0, switch to a cross-browser editor
20
21
 
21
22
  In the future, there are plans to:
@@ -0,0 +1,87 @@
1
+ // CodeMirror, copyright (c) by Marijn Haverbeke and others
2
+ // Distributed under an MIT license: http://codemirror.net/LICENSE
3
+
4
+ (function(mod) {
5
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
6
+ mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"));
7
+ else if (typeof define == "function" && define.amd) // AMD
8
+ define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod);
9
+ else // Plain browser env
10
+ mod(CodeMirror);
11
+ })(function(CodeMirror) {
12
+ "use strict";
13
+
14
+ CodeMirror.defineMode("imagine_cms", function(config, parserConfig) {
15
+
16
+ //config settings
17
+ var scriptStartRegex = parserConfig.scriptStartRegex || /^<%/,
18
+ scriptEndRegex = parserConfig.scriptEndRegex || /^%>/;
19
+ var attributeRegex = /^<#.*?#>/;
20
+
21
+ //inner modes
22
+ var scriptingMode, htmlMixedMode;
23
+
24
+ //tokenizer when in html mode
25
+ function htmlDispatch(stream, state) {
26
+ if (stream.match(attributeRegex, true)) {
27
+ return 'comment';
28
+ }
29
+ else if (stream.match(scriptStartRegex, false)) {
30
+ state.token=scriptingDispatch;
31
+ return scriptingMode.token(stream, state.scriptState);
32
+ }
33
+ else
34
+ return htmlMixedMode.token(stream, state.htmlState);
35
+ }
36
+
37
+ //tokenizer when in scripting mode
38
+ function scriptingDispatch(stream, state) {
39
+ if (stream.match(scriptEndRegex, false)) {
40
+ state.token=htmlDispatch;
41
+ return htmlMixedMode.token(stream, state.htmlState);
42
+ }
43
+ else
44
+ return scriptingMode.token(stream, state.scriptState);
45
+ }
46
+
47
+
48
+ return {
49
+ startState: function() {
50
+ scriptingMode = scriptingMode || CodeMirror.getMode(config, parserConfig.scriptingModeSpec);
51
+ htmlMixedMode = htmlMixedMode || CodeMirror.getMode(config, "htmlmixed");
52
+ return {
53
+ token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
54
+ htmlState : CodeMirror.startState(htmlMixedMode),
55
+ scriptState : CodeMirror.startState(scriptingMode)
56
+ };
57
+ },
58
+
59
+ token: function(stream, state) {
60
+ return state.token(stream, state);
61
+ },
62
+
63
+ indent: function(state, textAfter) {
64
+ if (state.token == htmlDispatch)
65
+ return htmlMixedMode.indent(state.htmlState, textAfter);
66
+ else if (scriptingMode.indent)
67
+ return scriptingMode.indent(state.scriptState, textAfter);
68
+ },
69
+
70
+ copyState: function(state) {
71
+ return {
72
+ token : state.token,
73
+ htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
74
+ scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
75
+ };
76
+ },
77
+
78
+ innerMode: function(state) {
79
+ if (state.token == scriptingDispatch) return {state: state.scriptState, mode: scriptingMode};
80
+ else return {state: state.htmlState, mode: htmlMixedMode};
81
+ }
82
+ };
83
+ }, "htmlmixed");
84
+
85
+ CodeMirror.defineMIME("application/x-erb-imagine", { name: "imagine_cms", scriptingModeSpec:"ruby"});
86
+
87
+ });
@@ -0,0 +1,510 @@
1
+ jQuery(document).ready(function () {
2
+ jQuery('textarea.codemirror-html').each(function () {
3
+ var cm = CodeMirror.fromTextArea(this, {
4
+ mode: 'application/x-erb-imagine',
5
+ lineNumbers: true
6
+ });
7
+ })
8
+ });
9
+
10
+
11
+
12
+
13
+ /*
14
+ * legacy prototype stuff only beyond this point
15
+ */
16
+
17
+ // Fixes gallery reordering (Scriptaculous Sortable)
18
+ Position.includeScrollOffsets = true;
19
+
20
+
21
+ /********************************
22
+ * date picker functions *
23
+ ********************************/
24
+
25
+ function getElementPosition(sourceObj) {
26
+ if (sourceObj.style.left && sourceObj.style.top) {
27
+ // for the W3C-compliant crowd
28
+ return [parseInt(sourceObj.style.left), parseInt(sourceObj.style.top)];
29
+ } else {
30
+ // for the other awful browsers...
31
+ x = sourceObj.offsetLeft;
32
+ y = sourceObj.offsetTop;
33
+ temp = sourceObj;
34
+ while (temp = temp.offsetParent) {
35
+ x += temp.offsetLeft;
36
+ y += temp.offsetTop;
37
+ }
38
+
39
+ return [x, y];
40
+ }
41
+ }
42
+
43
+ function showDatePicker(object, method_prefix) {
44
+ // anchor picker to the icon
45
+ var coords = getElementPosition($('date_picker_' + object + '_' + method_prefix + 'icon'));
46
+ var el = $('date_picker_' + object + '_' + method_prefix + 'main');
47
+ el.hide();
48
+ el.style.position = 'absolute';
49
+ el.show();
50
+ }
51
+
52
+ function hideDatePicker(object, method_prefix) {
53
+ $('date_picker_' + object + '_' + method_prefix + 'main').hide();
54
+ }
55
+
56
+ function dpPrevMonth(object, method_prefix, min_year) {
57
+ try {
58
+ if ($(object + '_' + method_prefix + '_month_sel').value > 1) {
59
+ $(object + '_' + method_prefix + '_month_sel').value--;
60
+ } else if ($(object + '_' + method_prefix + '_year_sel').value > min_year) {
61
+ $(object + '_' + method_prefix + '_month_sel').value = 12;
62
+ $(object + '_' + method_prefix + '_year_sel').value--;
63
+ }
64
+ } catch (e) {}
65
+ }
66
+
67
+ function dpNextMonth(object, method_prefix, max_year) {
68
+ try {
69
+ if ($(object + '_' + method_prefix + '_month_sel').value < 12) {
70
+ $(object + '_' + method_prefix + '_month_sel').value++;
71
+ } else if ($(object + '_' + method_prefix + '_year_sel').value < max_year) {
72
+ $(object + '_' + method_prefix + '_month_sel').value = 1;
73
+ $(object + '_' + method_prefix + '_year_sel').value++;
74
+ }
75
+ } catch (e) {}
76
+ }
77
+
78
+
79
+ /********************************
80
+ * column browser interface *
81
+ ********************************/
82
+
83
+ var cbNumColumns = 0;
84
+ var cbColWidth = '200px';
85
+ var cbColHeight = '240px';
86
+ var cbBorderWidth = '1px';
87
+ var cbColWidthFull = 202;
88
+
89
+ function cbAddColumn() {
90
+ var currentWidth = parseInt($('columnBrowser').style.width, 10);
91
+ // if (currentWidth < ((cbNumColumns+1) * cbColWidthFull)) {
92
+ $('columnBrowser').style.width = '' + ((cbNumColumns+1) * cbColWidthFull) + 'px';
93
+ $('columnBrowserContainer').scrollLeft = $('columnBrowserContainer').scrollWidth;
94
+ // }
95
+ $('columnBrowser').innerHTML += "<div id=\"columnBrowserLevel" + cbNumColumns + "\" style=\"width: " + cbColWidth + "; height: " + cbColHeight + "; overflow: auto; float: left; border-width: " + cbBorderWidth + " " + cbBorderWidth + " " + cbBorderWidth + " " + (cbNumColumns == 0 ? cbBorderWidth : '0') + "; border-style: solid; border-color: gray;\">Loading...</div>";
96
+ cbNumColumns++;
97
+ }
98
+
99
+ function getScrollbarPosition(el) {
100
+ el = $(el);
101
+ return { x: el.scrollLeft, y: el.scrollTop };
102
+ }
103
+
104
+ function setScrollbarPosition(el, coords) {
105
+ el = $(el);
106
+ el.scrollLeft = coords.x;
107
+ el.scrollTop = coords.y;
108
+ }
109
+
110
+ function cbSelectItem(el, currentLevel, urlForNextLevel) {
111
+ var el = $(el);
112
+ coords = getScrollbarPosition(el.parentNode);
113
+
114
+ // remove all higher levels and unselect all other same-level divs
115
+ for (var i = currentLevel + 1; i <= cbNumColumns; i++) {
116
+ d = $('columnBrowserLevel' + i);
117
+ if (d) d.parentNode.removeChild(d);
118
+ }
119
+ cbNumColumns = currentLevel + 1;
120
+
121
+ prefix = 'cb_item_';
122
+ $A(el.parentNode.childNodes).each(function (d) {
123
+ if (d.id && d.id.substring(0, prefix.length) == prefix) {
124
+ d.className = 'cb_item';
125
+ }
126
+ })
127
+
128
+ // select and expand current dept div
129
+ el.className = 'cb_item cb_item_selected';
130
+
131
+ cbAddColumn();
132
+ el = $(el.id);
133
+ new Ajax.Updater('columnBrowserLevel' + (currentLevel+1), urlForNextLevel, {method: 'GET', asynchronous:true, evalScripts:true});
134
+
135
+ setScrollbarPosition(el.parentNode, coords);
136
+ }
137
+
138
+
139
+ /********************************
140
+ * cms support *
141
+ ********************************/
142
+
143
+ function disableEnterKey(e) {
144
+ // get event if not passed
145
+ if (!e) var e = window.event;
146
+
147
+ var numCharCode;
148
+
149
+ // get character code of key pressed
150
+ if (e.keyCode) {
151
+ numCharCode = e.keyCode;
152
+ } else if (e.which) {
153
+ numCharCode = e.which;
154
+ }
155
+
156
+ if (numCharCode == 13) {
157
+ e.cancelBubble = true;
158
+ if (e.stopPropagation) e.stopPropagation();
159
+ return false;
160
+ }
161
+ }
162
+
163
+ // support for autocompletes
164
+ var attrlist = [];
165
+ var taglist = [];
166
+
167
+ var dialogStack = [];
168
+ function showDojoDialog(id, titleText) {
169
+ // if (!is.ie) changeOverflowAutoToHidden();
170
+
171
+ dlg = dojo.widget.byId(id);
172
+ if (!dlg) dlg = dojo.widget.createWidget(id);
173
+ if (!dlg) return false;
174
+
175
+ dlg.closeWindow = function () { hideDojoDialog(id); };
176
+ dlg.show();
177
+
178
+ if (typeof(titleText) != 'undefined') {
179
+ try {
180
+ document.getElementById('propertiesDialog').getElementsByTagName('div')[0].getElementsByTagName('div')[4].innerHTML = titleText;
181
+ } catch (e) {}
182
+ }
183
+
184
+ if (dialogStack.length > 0) dojo.widget.byId(dialogStack[dialogStack.length-1]).hide();
185
+ dialogStack.push(id);
186
+ }
187
+
188
+ function hideDojoDialog(id) {
189
+ dialogStack.pop();
190
+
191
+ dojo.widget.byId(id).hide();
192
+ // if (!is.ie) changeOverflowHiddenToAuto();
193
+
194
+ if (dialogStack.length > 0) {
195
+ dojo.widget.byId(dialogStack[dialogStack.length-1]).show();
196
+ }
197
+ }
198
+
199
+ function editProperties(url, titleText) {
200
+ $('properties_dialog_content').innerHTML = 'Loading...';
201
+ new Ajax.Updater('properties_dialog_content', url, {method:'get', asynchronous:true, evalScripts:true});
202
+
203
+ showDojoDialog('properties_dialog', titleText);
204
+ }
205
+
206
+ function cancelEditProperties() {
207
+ hideDojoDialog('properties_dialog');
208
+ }
209
+
210
+ function insertImage(url) {
211
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
212
+ imageNode = dojo.withGlobal(curInst.window, "getSelectedElement", dojo.html.selection);
213
+ if (!imageNode) {
214
+ imageNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['img']);
215
+ }
216
+ if (imageNode) {
217
+ dojo.require("dojo.widget.Editor2Plugin.InsertImageDialog");
218
+ w = dojo.widget.createWidget("Editor2InsertImageDialog");
219
+ w.show();
220
+ } else {
221
+ $('insert_image_dialog_content').innerHTML = 'Loading...';
222
+ new Ajax.Updater('insert_image_dialog_content', url, {method:'get', asynchronous:true, evalScripts:true});
223
+ showDojoDialog('insert_image_dialog');
224
+ }
225
+ try { if (cropper) cropper.remove(); } catch (e) {}
226
+ }
227
+
228
+ function cancelInsertImage() {
229
+ hideDojoDialog('insert_image_dialog');
230
+ try { if (cropper) cropper.remove(); } catch (e) {}
231
+ }
232
+
233
+ function insertFile(url) {
234
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
235
+ curInst.saveSelection(); //save selection (none-activeX IE)
236
+ var html = dojo.withGlobal(curInst.window, "getSelectedText", dojo.html.selection);
237
+ if (html == null || html.length == 0) {
238
+ alert("Please select some text to create a file link.");
239
+ return false; //do not show the dialog
240
+ }
241
+
242
+ $('insert_file_dialog_content').innerHTML = 'Loading...';
243
+ new Ajax.Updater('insert_file_dialog_content', url, {method:'get', asynchronous:true, evalScripts:true});
244
+ showDojoDialog('insert_file_dialog');
245
+ }
246
+
247
+ function cancelInsertFile() {
248
+ hideDojoDialog('insert_file_dialog');
249
+ }
250
+
251
+ function selectThumbnail(url) {
252
+ $('select_thumbnail_dialog_content').innerHTML = 'Loading...';
253
+ new Ajax.Updater('select_thumbnail_dialog_content', url, {asynchronous:true, evalScripts:true});
254
+ showDojoDialog('select_thumbnail_dialog');
255
+ }
256
+
257
+ function cancelSelectThumbnail() {
258
+ hideDojoDialog('select_thumbnail_dialog');
259
+ }
260
+
261
+ var gallerySize = [];
262
+ function changeGalleryImage(galleryName, index) {
263
+ var target = galleryName + '_image_' + index;
264
+ var caption = galleryName + '_caption_' + index;
265
+ if (!$(target)) return false;
266
+
267
+ var queue = Effect.Queues.get('global');
268
+ queue.each(function(e) { e.cancel() });
269
+
270
+ for (var i = 0; i < gallerySize[galleryName]; i++) {
271
+ el = $(galleryName + '_image_' + i);
272
+ if (el.id != target && el.style.display != 'none') Effect.Fade(el, { duration: 0.6 });
273
+
274
+ el = $(galleryName + '_thumb_' + i);
275
+ if (el) {
276
+ if (i == index) {
277
+ el.oldOnmouseover = el.onmouseover;
278
+ el.oldOnmouseout = el.onmouseout;
279
+ el.onmouseover = null;
280
+ el.onmouseout = null;
281
+ el.addClassName('current');
282
+ } else {
283
+ el.removeClassName('current');
284
+ if (!el.onmouseover) el.onmouseover = el.oldOnmouseover;
285
+ if (!el.onmouseout) el.onmouseout = el.oldOnmouseout;
286
+ }
287
+ }
288
+ }
289
+
290
+ Effect.Appear(target, { duration: 0.6 });
291
+
292
+ if($(caption).innerHTML != '') {
293
+ $(galleryName + '_caption').style.display = 'block';
294
+ $(galleryName + '_caption').innerHTML = $(caption).innerHTML;
295
+ } else {
296
+ $(galleryName + '_caption').style.display = 'none';
297
+ }
298
+
299
+ prevIndex = index == 0 ? gallerySize[galleryName] - 1 : index-1;
300
+ nextIndex = index == gallerySize[galleryName] - 1 ? 0 : index+1;
301
+ $(galleryName + '_prev_button').onclick = function () { changeGalleryImage(galleryName, prevIndex) };
302
+ $(galleryName + '_next_button').onclick = function () { changeGalleryImage(galleryName, nextIndex) };
303
+ }
304
+
305
+ var galleryTimeouts = [];
306
+ function advanceGallerySlideshow(galleryName, delay) {
307
+ $(galleryName + '_next_button').onclick();
308
+ galleryTimeouts[galleryName] = setTimeout(function() { advanceGallerySlideshow(galleryName, delay); }, delay);
309
+ }
310
+
311
+
312
+ var overflowAutoDivs = [];
313
+ function changeOverflowAutoToHidden() {
314
+ var divs = [];
315
+ $$('div').each(function (div) {
316
+ if (div.style.overflow == 'auto') {
317
+ divs.push(div);
318
+ div.style.overflow = 'hidden';
319
+ }
320
+ });
321
+ overflowAutoDivs.push(divs);
322
+ }
323
+
324
+ function changeOverflowHiddenToAuto() {
325
+ $A(overflowAutoDivs.pop).each(function (div) {
326
+ div.style.overflow = 'auto';
327
+ });
328
+ }
329
+
330
+
331
+ var pageBrowserFieldID = null;
332
+ function showPageBrowser(field_id) {
333
+ pageBrowserFieldID = field_id;
334
+ path = $(field_id).value;
335
+
336
+ $('page_browser').innerHTML = 'Loading...'
337
+ new Ajax.Updater('page_browser', '/manage/cms/select_page?path=' + path, {asynchronous:true, evalScripts:true});
338
+ $('page_browser_selection').value = path;
339
+ showDojoDialog('page_browser_dialog');
340
+ }
341
+
342
+ function closePageBrowser() {
343
+ hideDojoDialog('page_browser_dialog');
344
+ $(pageBrowserFieldID).value = $('page_browser_selection').value;
345
+ }
346
+
347
+
348
+ var cmsPageObjects = {};
349
+ function scanForPageObjects(page_id, parent_key, version) {
350
+ if (jQuery('#page_objects_' + parent_key).val().length == 0) return;
351
+
352
+ var found = {};
353
+
354
+ var regex = /<%=\s*insert_object\(?\s*['"]([-\w\s\d]+)['"],\s*:(\w+)\s*(.*?)\)?\s*%>/gm;
355
+ var matches = jQuery('#page_objects_' + parent_key).val().match(regex);
356
+ if (matches) {
357
+ jQuery.each(matches, function (index) {
358
+ var match = this;
359
+ // regex2 should be exactly the same as regex. Global regexes have a lastIndex which is not reset.
360
+ var regex2 = /<%=\s*insert_object\(?\s*['"]([-\w\s\d]+)['"],\s*:(\w+)\s*(.*?)\)?\s*%>/gm;
361
+ if (regex2.test(match)) {
362
+ key = match.replace(regex2, "$1");
363
+ val = match.replace(regex2, "$2");
364
+ if (val == 'page_list') found[key] = val;
365
+ }
366
+ });
367
+ }
368
+
369
+ var regex = /<%=\s*(?:page_list|pagelist)\(?\s*['"]([-\w\s\d]+)['"](.*?)\)?\s*%>/gm;
370
+ var matches = jQuery('#page_objects_' + parent_key).val().match(regex);
371
+ if (matches) {
372
+ jQuery.each(matches, function (index) {
373
+ var match = this;
374
+ // regex2 should be exactly the same as regex. Global regexes have a lastIndex which is not reset.
375
+ var regex2 = /<%=\s*(?:page_list|pagelist)\(?\s*['"]([-\w\s\d]+)['"](.*?)\)?\s*%>/gm;
376
+ if (regex2.test(match)) {
377
+ key = match.replace(regex2, "$1");
378
+ val = 'page_list'
379
+ found[key] = val;
380
+ }
381
+ });
382
+ }
383
+
384
+ // remove the cruft
385
+ jQuery.each(cmsPageObjects, function(key, val) {
386
+ if (cmsPageObjects[key] != found[key]) {
387
+ obj_key = val + '_container_obj-' + val + '-' + key.replace(/[^\w]/g, '_');
388
+ while (jQuery('#' + obj_key).length > 0) {
389
+ jQuery('#' + obj_key).remove();
390
+ }
391
+ cmsPageObjects[key] = null;
392
+ }
393
+ });
394
+
395
+ // bring in the new
396
+ jQuery.each(found, function (key, val) {
397
+ if (!cmsPageObjects[key]) {
398
+ cmsPageObjects[key] = val;
399
+ jQuery.get('/manage/cms/insert_page_object_config/' + page_id + '?version= ' + version +
400
+ '&name=' + key + '&type=' + val + '&parent_key=' + parent_key);
401
+ }
402
+ });
403
+ }
404
+
405
+
406
+ function blockUserInput() {
407
+ var dims = { width: document.body.scrollWidth, height: document.body.scrollHeight };
408
+ $('preview_cover').show();
409
+ $('preview_cover').style.position = 'absolute';
410
+ $('preview_cover').style.left = '0px';
411
+ $('preview_cover').style.top = '0px';
412
+ $('preview_cover').style.width = dims.width + 'px';
413
+ $('preview_cover').style.height = dims.height + 'px';
414
+ }
415
+
416
+
417
+ function insertAtCaret(obj, text) {
418
+ if(document.selection) {
419
+ obj.focus();
420
+ var orig = obj.value.replace(/\r\n/g, "\n");
421
+ var range = document.selection.createRange();
422
+
423
+ if(range.parentElement() != obj) {
424
+ return false;
425
+ }
426
+
427
+ range.text = text;
428
+
429
+ var actual = tmp = obj.value.replace(/\r\n/g, "\n");
430
+
431
+ for(var diff = 0; diff < orig.length; diff++) {
432
+ if(orig.charAt(diff) != actual.charAt(diff)) break;
433
+ }
434
+
435
+ for(var index = 0, start = 0;
436
+ tmp.match(text)
437
+ && (tmp = tmp.replace(text, ""))
438
+ && index <= diff;
439
+ index = start + text.length
440
+ ) {
441
+ start = actual.indexOf(text, index);
442
+ }
443
+ } else if(obj.selectionStart) {
444
+ var start = obj.selectionStart;
445
+ var end = obj.selectionEnd;
446
+
447
+ obj.value = obj.value.substr(0, start)
448
+ + text
449
+ + obj.value.substr(end, obj.value.length);
450
+ }
451
+
452
+ if(start != null) {
453
+ setCaretTo(obj, start + text.length);
454
+ } else {
455
+ obj.value += text;
456
+ }
457
+ }
458
+
459
+ function setCaretTo(obj, pos) {
460
+ if(obj.createTextRange) {
461
+ var range = obj.createTextRange();
462
+ range.move('character', pos);
463
+ range.select();
464
+ } else if(obj.selectionStart) {
465
+ obj.focus();
466
+ obj.setSelectionRange(pos, pos);
467
+ }
468
+ }
469
+
470
+
471
+ // utility function to fix # of decimal places
472
+ function setPrecision(val, p, dontPad, addCommas) {
473
+ if (typeof(p) == 'undefined') p = 2;
474
+ if (typeof(dontPad) == 'undefined') dontPad = false;
475
+ if (typeof(addCommas) == 'undefined') addCommas = true;
476
+
477
+ if (val.toString() == 'NaN') return '';
478
+ var m = Math.pow(10, p);
479
+ var ret = parseInt(Math.round(val * m), 10) / m;
480
+ var idx = (''+ret).indexOf('.');
481
+ if (idx < 0) {
482
+ ret += '.';
483
+ idx = (''+ret).indexOf('.');
484
+ }
485
+
486
+ if (!dontPad && (''+ret).substring(idx).length <= p) {
487
+ for (var i = (''+ret).substring(idx).length; i <= p; i++) {
488
+ ret += '0';
489
+ }
490
+ }
491
+
492
+ if (addCommas) {
493
+ var pieces = (''+ret).split('.');
494
+ if (p > 0) {
495
+ ret = '.' + pieces[1];
496
+ } else {
497
+ ret = pieces[1];
498
+ }
499
+ for (var i = 0; i < pieces[0].length; i++) {
500
+ if (i % 3 == 2) {
501
+ ret = ',' + pieces[0].charAt(pieces[0].length - i - 1) + ret;
502
+ } else {
503
+ ret = pieces[0].charAt(pieces[0].length - i - 1) + ret;
504
+ }
505
+ }
506
+ ret = ret.replace(/^,/, '');
507
+ }
508
+
509
+ return ret;
510
+ }