imagine_cms 4.1.4 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }