comatose-rubyisbeautiful 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/CHANGELOG +198 -0
  2. data/Gemfile +29 -0
  3. data/Gemfile.lock +130 -0
  4. data/INSTALL +14 -0
  5. data/LICENSE +20 -0
  6. data/Manifest +188 -0
  7. data/README +0 -0
  8. data/README.markdown +113 -0
  9. data/Rakefile +5 -0
  10. data/SPECS +61 -0
  11. data/app/controllers/application_controller.rb +3 -0
  12. data/app/controllers/comatose/admin_controller.rb +425 -0
  13. data/app/controllers/comatose/application_controller.rb +30 -0
  14. data/app/controllers/comatose/base_controller.rb +167 -0
  15. data/app/helpers/application_helper.rb +2 -0
  16. data/app/helpers/comatose/admin_helper.rb +78 -0
  17. data/app/helpers/comatose/application_helper.rb +2 -0
  18. data/app/helpers/comatose/base_helper.rb +5 -0
  19. data/app/models/comatose/page.rb +166 -0
  20. data/app/views/comatose/admin/_form.html.erb +108 -0
  21. data/app/views/comatose/admin/_page_list_item.html.erb +62 -0
  22. data/app/views/comatose/admin/delete.html.erb +18 -0
  23. data/app/views/comatose/admin/edit.html.erb +5 -0
  24. data/app/views/comatose/admin/index.html.erb +34 -0
  25. data/app/views/comatose/admin/new.html.erb +5 -0
  26. data/app/views/comatose/admin/reorder.html.erb +30 -0
  27. data/app/views/comatose/admin/versions.html.erb +40 -0
  28. data/app/views/layouts/application.html.erb +14 -0
  29. data/app/views/layouts/comatose/admin.html.erb +44 -0
  30. data/app/views/layouts/comatose/base.html.erb +14 -0
  31. data/comatose-rubyisbeautiful.gemspec +65 -0
  32. data/config/environment.rb +5 -0
  33. data/config/environments/development.rb +26 -0
  34. data/config/environments/production.rb +49 -0
  35. data/config/environments/test.rb +35 -0
  36. data/config/locales/en.yml +5 -0
  37. data/config.ru +4 -0
  38. data/db/seeds.rb +11 -0
  39. data/lib/comatose/configuration.rb +87 -0
  40. data/lib/comatose/drop.rb +45 -0
  41. data/lib/comatose/engine.rb +28 -0
  42. data/lib/comatose/filters/inline_filter.rb +15 -0
  43. data/lib/comatose/filters/timeago_filter.rb +14 -0
  44. data/lib/comatose/filters/translation_filter.rb +11 -0
  45. data/lib/comatose/locale_constraint.rb +15 -0
  46. data/lib/comatose/logger.rb +10 -0
  47. data/lib/comatose/page_wrapper.rb +147 -0
  48. data/lib/comatose/processing_context.rb +103 -0
  49. data/lib/comatose/routes.rb +70 -0
  50. data/lib/comatose/tasks/admin.rb +57 -0
  51. data/lib/comatose/tasks/data.rb +79 -0
  52. data/lib/comatose/tasks/setup.rb +118 -0
  53. data/lib/comatose/text_filters.rb +148 -0
  54. data/lib/comatose/version.rb +9 -0
  55. data/lib/comatose.rb +88 -0
  56. data/lib/generators/comatose/USAGE +7 -0
  57. data/lib/generators/comatose/comatose_generator.rb +37 -0
  58. data/lib/generators/comatose/templates/comatose.rb +33 -0
  59. data/lib/generators/comatose/templates/migration.erb +32 -0
  60. data/lib/generators/comatose/templates/seeds.erb +2 -0
  61. data/lib/support/class_options.rb +36 -0
  62. data/lib/support/inline_rendering.rb +48 -0
  63. data/lib/support/route_mapper.rb +51 -0
  64. data/lib/tasks/comatose.rake +9 -0
  65. data/lib/text_filters/markdown.rb +14 -0
  66. data/lib/text_filters/markdown_smartypants.rb +15 -0
  67. data/lib/text_filters/none.rb +8 -0
  68. data/lib/text_filters/rdoc.rb +13 -0
  69. data/lib/text_filters/simple.rb +8 -0
  70. data/lib/text_filters/textile.rb +15 -0
  71. data/public/404.html +26 -0
  72. data/public/422.html +26 -0
  73. data/public/500.html +26 -0
  74. data/public/favicon.ico +0 -0
  75. data/public/images/comatose/collapsed.gif +0 -0
  76. data/public/images/comatose/expanded.gif +0 -0
  77. data/public/images/comatose/no-children.gif +0 -0
  78. data/public/images/comatose/page.gif +0 -0
  79. data/public/images/comatose/rails.png +0 -0
  80. data/public/images/comatose/spinner.gif +0 -0
  81. data/public/images/comatose/title-hover-bg.gif +0 -0
  82. data/public/javascripts/comatose/admin.js +406 -0
  83. data/public/javascripts/comatose/application.js +2 -0
  84. data/public/javascripts/comatose/dragdrop.js +974 -0
  85. data/public/javascripts/editor.js +452 -0
  86. data/public/javascripts/jquery/GPL-LICENSE.txt +278 -0
  87. data/public/javascripts/jquery/MIT-LICENSE.txt +20 -0
  88. data/public/javascripts/jquery/README +67 -0
  89. data/public/javascripts/jquery/jquery.js +11 -0
  90. data/public/javascripts/jquery/jquery.ui.draggable.js +1 -0
  91. data/public/javascripts/jquery/jquery.ui.js +1 -0
  92. data/public/javascripts/jquery/jquery.ui.resizable.js +1 -0
  93. data/public/javascripts/jquery/jquery.ui.sortable.js +1 -0
  94. data/public/javascripts/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  95. data/public/javascripts/wymeditor/iframe/default/lbl-h1.png +0 -0
  96. data/public/javascripts/wymeditor/iframe/default/lbl-h2.png +0 -0
  97. data/public/javascripts/wymeditor/iframe/default/lbl-h3.png +0 -0
  98. data/public/javascripts/wymeditor/iframe/default/lbl-h4.png +0 -0
  99. data/public/javascripts/wymeditor/iframe/default/lbl-h5.png +0 -0
  100. data/public/javascripts/wymeditor/iframe/default/lbl-h6.png +0 -0
  101. data/public/javascripts/wymeditor/iframe/default/lbl-p.png +0 -0
  102. data/public/javascripts/wymeditor/iframe/default/lbl-pre.png +0 -0
  103. data/public/javascripts/wymeditor/iframe/default/wymiframe.css +90 -0
  104. data/public/javascripts/wymeditor/iframe/default/wymiframe.html +26 -0
  105. data/public/javascripts/wymeditor/jquery.wymeditor.js +4688 -0
  106. data/public/javascripts/wymeditor/jquery.wymeditor.min.js +1 -0
  107. data/public/javascripts/wymeditor/jquery.wymeditor.pack.js +1 -0
  108. data/public/javascripts/wymeditor/lang/bg.js +45 -0
  109. data/public/javascripts/wymeditor/lang/ca.js +45 -0
  110. data/public/javascripts/wymeditor/lang/cs.js +45 -0
  111. data/public/javascripts/wymeditor/lang/cy.js +45 -0
  112. data/public/javascripts/wymeditor/lang/de.js +45 -0
  113. data/public/javascripts/wymeditor/lang/en.js +45 -0
  114. data/public/javascripts/wymeditor/lang/es.js +45 -0
  115. data/public/javascripts/wymeditor/lang/fa.js +46 -0
  116. data/public/javascripts/wymeditor/lang/fi.js +44 -0
  117. data/public/javascripts/wymeditor/lang/fr.js +45 -0
  118. data/public/javascripts/wymeditor/lang/gl.js +45 -0
  119. data/public/javascripts/wymeditor/lang/he.js +45 -0
  120. data/public/javascripts/wymeditor/lang/hr.js +45 -0
  121. data/public/javascripts/wymeditor/lang/hu.js +45 -0
  122. data/public/javascripts/wymeditor/lang/it.js +45 -0
  123. data/public/javascripts/wymeditor/lang/nb.js +45 -0
  124. data/public/javascripts/wymeditor/lang/nl.js +45 -0
  125. data/public/javascripts/wymeditor/lang/nn.js +45 -0
  126. data/public/javascripts/wymeditor/lang/pl.js +45 -0
  127. data/public/javascripts/wymeditor/lang/pt-br.js +45 -0
  128. data/public/javascripts/wymeditor/lang/pt.js +45 -0
  129. data/public/javascripts/wymeditor/lang/ru.js +45 -0
  130. data/public/javascripts/wymeditor/lang/sv.js +45 -0
  131. data/public/javascripts/wymeditor/lang/tr.js +45 -0
  132. data/public/javascripts/wymeditor/lang/zh_cn.js +47 -0
  133. data/public/javascripts/wymeditor/plugins/embed/jquery.wymeditor.embed.js +52 -0
  134. data/public/javascripts/wymeditor/plugins/fullscreen/icon_fullscreen.gif +0 -0
  135. data/public/javascripts/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js +127 -0
  136. data/public/javascripts/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js +57 -0
  137. data/public/javascripts/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +91 -0
  138. data/public/javascripts/wymeditor/plugins/resizable/readme.txt +124 -0
  139. data/public/javascripts/wymeditor/plugins/tidy/README +19 -0
  140. data/public/javascripts/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js +82 -0
  141. data/public/javascripts/wymeditor/plugins/tidy/tidy.php +36 -0
  142. data/public/javascripts/wymeditor/plugins/tidy/wand.png +0 -0
  143. data/public/javascripts/wymeditor/skins/compact/icons.png +0 -0
  144. data/public/javascripts/wymeditor/skins/compact/skin.css +134 -0
  145. data/public/javascripts/wymeditor/skins/compact/skin.js +35 -0
  146. data/public/javascripts/wymeditor/skins/default/icons.png +0 -0
  147. data/public/javascripts/wymeditor/skins/default/skin.css +133 -0
  148. data/public/javascripts/wymeditor/skins/default/skin.js +40 -0
  149. data/public/javascripts/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  150. data/public/javascripts/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  151. data/public/javascripts/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  152. data/public/javascripts/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  153. data/public/javascripts/wymeditor/skins/minimal/skin.css +131 -0
  154. data/public/javascripts/wymeditor/skins/minimal/skin.js +30 -0
  155. data/public/javascripts/wymeditor/skins/silver/COPYING +674 -0
  156. data/public/javascripts/wymeditor/skins/silver/README +27 -0
  157. data/public/javascripts/wymeditor/skins/silver/images/bg.header.gif +0 -0
  158. data/public/javascripts/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  159. data/public/javascripts/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  160. data/public/javascripts/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  161. data/public/javascripts/wymeditor/skins/silver/skin.css +297 -0
  162. data/public/javascripts/wymeditor/skins/silver/skin.js +61 -0
  163. data/public/javascripts/wymeditor/skins/twopanels/icons.png +0 -0
  164. data/public/javascripts/wymeditor/skins/twopanels/skin.css +134 -0
  165. data/public/javascripts/wymeditor/skins/twopanels/skin.js +39 -0
  166. data/public/javascripts/wymeditor/skins/wymeditor_icon.png +0 -0
  167. data/public/javascripts/wymeditor.tar +0 -0
  168. data/public/robots.txt +5 -0
  169. data/public/stylesheets/comatose/admin.css +488 -0
  170. data/public/stylesheets/comatose/base.css +9 -0
  171. data/spec/controllers/comatose/base_controller_spec.rb +14 -0
  172. data/spec/controllers/foos_controller_spec.rb +5 -0
  173. data/spec/helpers/foos_helper_spec.rb +15 -0
  174. data/spec/routing/base_routing_spec.rb +12 -0
  175. data/spec/spec_helper.rb +27 -0
  176. data/test/behaviors.rb +106 -0
  177. data/test/fixtures/comatose_pages.yml +96 -0
  178. data/test/functional/comatose_admin_controller_test.rb +114 -0
  179. data/test/functional/comatose_controller_test.rb +45 -0
  180. data/test/integration/comatose_routing_test.rb +17 -0
  181. data/test/javascripts/test.html +26 -0
  182. data/test/javascripts/test_runner.js +307 -0
  183. data/test/old_test_helper.rb +43 -0
  184. data/test/performance/browsing_test.rb +9 -0
  185. data/test/test_helper.rb +13 -0
  186. data/test/unit/class_options_test.rb +52 -0
  187. data/test/unit/comatose_page_test.rb +128 -0
  188. data/test/unit/processing_context_test.rb +108 -0
  189. data/test/unit/text_filters_test.rb +52 -0
  190. data.tar.gz.sig +1 -0
  191. metadata +379 -0
  192. metadata.gz.sig +0 -0
Binary file
Binary file
@@ -0,0 +1,406 @@
1
+ // CSS Browser Selector v0.2.3b (M@: added noscript support)
2
+ // Documentation: http://rafael.adm.br/css_browser_selector
3
+ // License: http://creativecommons.org/licenses/by/2.5/
4
+ // Author: Rafael Lima (http://rafael.adm.br)
5
+ // Contributors: http://rafael.adm.br/css_browser_selector#contributors
6
+
7
+ function initializeEditor() {
8
+ $('textarea').editor();
9
+ }
10
+
11
+ var css_browser_selector = function() {
12
+ var
13
+ ua = navigator.userAgent.toLowerCase(),
14
+ is = function(t){ return ua.indexOf(t) != -1; },
15
+ h = document.getElementsByTagName('html')[0],
16
+ b = (!(/opera|webtv/i.test(ua)) && /msie (\d)/.test(ua)) ? ((is('mac') ? 'ieMac ' : '') + 'ie ie' + RegExp.$1)
17
+ : is('gecko/') ? 'gecko' : is('opera') ? 'opera' : is('konqueror') ? 'konqueror' : is('applewebkit/') ? 'webkit safari' : is('mozilla/') ? 'gecko' : '',
18
+ os = (is('x11') || is('linux')) ? ' linux' : is('mac') ? ' mac' : is('win') ? ' win' : '';
19
+ var c = b+os+' js';
20
+ h.className = h.className.replace('noscript', '') + h.className?' '+c:c;
21
+ }();
22
+
23
+ // List View Functions
24
+ var ComatoseList = {
25
+ save_node_state: true,
26
+ state_store: 'cookie', // Only 'cookie' for now
27
+ state_key: 'ComatoseTreeState',
28
+
29
+ init: function() {
30
+ var items = ComatoseList._read_state();
31
+ items.each(function(node){
32
+ ComatoseList.expand_node(node.replace('page_controller_', ''))
33
+ });
34
+ },
35
+
36
+ toggle_tree_nodes : function(img, id) {
37
+ if(/expanded/.test(img.src)) {
38
+ $('page_list_'+ id).addClassName('collapsed');
39
+ img.src = img.src.replace(/expanded/, 'collapsed')
40
+ if(ComatoseList.save_node_state) {
41
+ var items = ComatoseList._read_state();
42
+ items = items.select(function(id){ return id != img.id; })
43
+ ComatoseList._write_state(items);
44
+ }
45
+ } else {
46
+ $('page_list_'+ id).removeClassName('collapsed');
47
+ img.src = img.src.replace(/collapsed/, 'expanded')
48
+ if(ComatoseList.save_node_state) {
49
+ var items = ComatoseList._read_state();
50
+ items.push(img.id);
51
+ ComatoseList._write_state(items);
52
+ }
53
+ }
54
+ },
55
+
56
+ expand_node: function(id) {
57
+ $('page_list_'+ id).removeClassName('collapsed');
58
+ $('page_controller_'+ id).src = $('page_controller_'+ id).src.replace(/collapsed/, 'expanded')
59
+ },
60
+
61
+ collapse_node: function(id) {
62
+ $('page_list_'+ id).addClassName('collapsed');
63
+ $('page_controller_'+ id).src = $('page_controller_'+ id).src.replace(/expanded/, 'collapsed')
64
+ },
65
+
66
+ item_hover : function(node, state, is_delete) {
67
+ if( state == 'over') {
68
+ $(node).addClassName( (is_delete) ? 'hover-delete' : 'hover' );
69
+ } else {
70
+ $(node).removeClassName( (is_delete) ? 'hover-delete' : 'hover' );
71
+ }
72
+ },
73
+
74
+ toggle_reorder: function(node, anc, id) {
75
+ if( $(node).hasClassName('do-reorder') ) {
76
+ $(node).removeClassName( 'do-reorder' );
77
+ $(anc).removeClassName('reordering');
78
+ $(anc).innerHTML = "reorder children";
79
+ } else {
80
+ $(node).addClassName( 'do-reorder' );
81
+ $(anc).addClassName('reordering');
82
+ $(anc).innerHTML = "finished reordering";
83
+ // Make sure the children are visible...
84
+ ComatoseList.expand_node(id);
85
+ }
86
+ },
87
+
88
+ _write_state: function(items) {
89
+ var cookie = {}; var options = {}; var expiration = new Date();
90
+ cookie[ ComatoseList.state_key ] = items.join(',');
91
+ expiration.setDate(expiration.getDate()+30)
92
+ options['expires'] = expiration;
93
+ Cookie.write( cookie, options );
94
+ },
95
+
96
+ _read_state: function() {
97
+ var state = Cookie.read( ComatoseList.state_key );
98
+ return (state != "" && state != null) ? state.split(',') : [];
99
+ }
100
+ }
101
+
102
+ // Edit Form Functions
103
+ var ComatoseEditForm = {
104
+
105
+ default_data: {},
106
+ last_preview: {},
107
+ last_title_slug: '',
108
+ mode : null,
109
+ liquid_horiz: true,
110
+ width_offset: 325,
111
+
112
+ // Initialize the page...
113
+ init : function(mode) {
114
+ this.mode = mode;
115
+ this.default_data = Form.serialize(document.forms[0]);
116
+ if(mode == 'new') {
117
+ this.last_title_slug = $('page_title').value.toSlug();
118
+ Event.observe('page_title', 'blur', ComatoseEditForm.title_updated_aggressive);
119
+ } else {
120
+ Event.observe('page_title', 'blur', ComatoseEditForm.title_updated);
121
+ }
122
+ $('page_title').focus();
123
+ Hide.these(
124
+ 'preview-area',
125
+ 'slug_row',
126
+ 'parent_row',
127
+ 'keywords_row',
128
+ 'filter_row',
129
+ 'created_row'
130
+ );
131
+ $('page_title').select();
132
+ // Create the horizontal liquidity of the fields
133
+ if(this.liquid_horiz) {
134
+ xOffset = this.width_offset;
135
+ new Layout.LiquidHoriz((xOffset + 50), 'page_title');
136
+ new Layout.LiquidHoriz(xOffset, 'page_slug','page_keywords','page_parent','page_body');
137
+ }
138
+ },
139
+ // For use when updating an existing page...
140
+ title_updated : function() {
141
+ slug = $('page_slug');
142
+ if(slug.value == "") {
143
+ title = $('page_title');
144
+ slug.value = title.value.toSlug();
145
+ }
146
+ },
147
+ // For use when creating a new page...
148
+ title_updated_aggressive : function() {
149
+ slug = $('page_slug');
150
+ title = $('page_title');
151
+ if(slug.value == "" || slug.value == this.last_title ) {
152
+ slug.value = title.value.toSlug();
153
+ }
154
+ this.last_title = slug.value;
155
+ },
156
+ // Todo: Make the meta fields remember their visibility?
157
+ toggle_extra_fields : function(anchor) {
158
+ if(anchor.innerHTML == "More...") {
159
+ Show.these(
160
+ 'slug_row',
161
+ 'keywords_row',
162
+ 'parent_row',
163
+ 'filter_row',
164
+ 'created_row'
165
+ );
166
+ anchor.innerHTML = 'Less...';
167
+ } else {
168
+ Hide.these(
169
+ 'slug_row',
170
+ 'keywords_row',
171
+ 'parent_row',
172
+ 'filter_row',
173
+ 'created_row'
174
+ );
175
+ anchor.innerHTML = 'More...';
176
+ }
177
+ },
178
+ // Uses server to create preview of content...
179
+ preview_content : function(preview_url) {
180
+ $('preview-area').show();
181
+ var params = Form.serialize(document.forms[0]);
182
+ if( params != this.last_preview ) {
183
+ $('preview-panel').innerHTML = "<span style='color:blue;'>Loading Preview...</span>";
184
+ new Ajax.Updater(
185
+ 'preview-panel',
186
+ preview_url,
187
+ { parameters: params }
188
+ );
189
+ }
190
+ this.last_preview = params;
191
+ },
192
+ cancel : function(url) {
193
+ var current_data = Form.serialize(document.forms[0]);
194
+ var data_changed = (this.default_data != current_data)
195
+ if(data_changed) {
196
+ if( confirm('Changes detected. You will lose all the updates you have made if you proceed...') ) {
197
+ location.href = url;
198
+ }
199
+ } else {
200
+ location.href = url;
201
+ }
202
+
203
+ }
204
+ }
205
+
206
+ var Hide = {
207
+ these : function() {
208
+ for (var i = 0; i < arguments.length; i++) {
209
+ try {
210
+ $(arguments[i]).hide();
211
+ } catch (e) {}
212
+ }
213
+ }
214
+ }
215
+
216
+ var Show = {
217
+ these : function() {
218
+ for (var i = 0; i < arguments.length; i++) {
219
+ try {
220
+ $(arguments[i]).show();
221
+ } catch (e) {}
222
+ }
223
+ }
224
+ }
225
+
226
+ // Layout namespace
227
+ var Layout = {};
228
+
229
+ // This class allows dom objects to stretch with the browser
230
+ // (for when a good, cross-browser, CSS approach can't be found)
231
+ Layout.LiquidBase = Class.create();
232
+ // Base class for all Liquid* layouts...
233
+ Object.extend(Layout.LiquidBase.prototype, {
234
+ enabled: true,
235
+ elems: [],
236
+ offset: null,
237
+ // Constructor is (offset, **array_of_elements)
238
+ initialize: function() {
239
+ args = $A(arguments)
240
+ this.offset = args.shift();
241
+ this.elems = args.select( function(elem){ return ($(elem) != null) } );
242
+ if( this.elems.length > 0 ) {
243
+ this.on_resize(); // Initial size
244
+ Event.observe(window, 'resize', this.on_resize.bind(this) );
245
+ Event.observe(window, 'load', this.on_resize.bind(this) );
246
+ }
247
+ },
248
+ resize_in: function(timeout) {
249
+ setTimeout( this.on_resize.bind(this), timeout );
250
+ },
251
+ on_resize: function() {
252
+ // Need to override!
253
+ alert('Override on_resize, please!');
254
+ }
255
+ });
256
+
257
+
258
+ // Liquid vertical layout
259
+ Layout.LiquidVert = Class.create();
260
+ Object.extend(Layout.LiquidVert.prototype, Object.extend(Layout.LiquidBase.prototype, {
261
+ on_resize: function() {
262
+ if( this.offset != null && this.enabled ) {
263
+ var new_height = ((window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) - this.offset) +"px";
264
+ this.elems.each(function(e){ $(e).style.height = new_height; })
265
+ }
266
+ }
267
+ }) );
268
+
269
+
270
+ // Liquid horizontal layout
271
+ Layout.LiquidHoriz = Class.create();
272
+ Object.extend(Layout.LiquidHoriz.prototype, Object.extend(Layout.LiquidBase.prototype, {
273
+ on_resize: function() {
274
+ if( this.offset != null && this.enabled ) {
275
+ var new_width = ((window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) - this.offset) +"px";
276
+ this.elems.each( function(e){ $(e).style.width = new_width; })
277
+ }
278
+ }
279
+ }) );
280
+
281
+ // String Extensions... Yes, these are from Radiant! ;-)
282
+ Object.extend(String.prototype, {
283
+ upcase: function() {
284
+ return this.toUpperCase();
285
+ },
286
+ downcase: function() {
287
+ return this.toLowerCase();
288
+ },
289
+ strip: function() {
290
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');
291
+ },
292
+ toInteger: function() {
293
+ return parseInt(this);
294
+ },
295
+ toSlug: function() {
296
+ // M@: Modified from Radiant's version, removes multple --'s next to each other
297
+ // This is the same RegExp as the one on the page model...
298
+ return this.strip().downcase().replace(/[^-a-z0-9~\s\.:;+=_]/g, '').replace(/[\s\.:;=_+]+/g, '-').replace(/[\-]{2,}/g, '-');
299
+ }
300
+ });
301
+
302
+ // Run a spinner when an AJAX request in running...
303
+ var ComatoseAJAXSpinner = {
304
+ busy : function () {
305
+ if($('spinner') && Ajax.activeRequestCount > 0) {
306
+ Effect.Appear('spinner',{duration:0.5,queue:'end'});
307
+ }
308
+ },
309
+
310
+ notBusy: function() {
311
+ if($('spinner') && Ajax.activeRequestCount == 0) {
312
+ Effect.Fade('spinner',{duration:0.5,queue:'end'});
313
+ }
314
+ }
315
+ }
316
+ // Register it with Prototype...
317
+ Ajax.Responders.register({
318
+ onCreate: ComatoseAJAXSpinner.busy,
319
+ onComplete: ComatoseAJAXSpinner.notBusy
320
+ });
321
+
322
+
323
+ if(!window.Cookie)
324
+ (function (){
325
+ // From Mephisto!
326
+ window.Cookie = {
327
+ version: '0.7',
328
+ cookies: {},
329
+ _each: function(iterator) {
330
+ $H(this.cookies).each(iterator);
331
+ },
332
+
333
+ getAll: function() {
334
+ this.cookies = {};
335
+ $A(document.cookie.split('; ')).each(function(cookie) {
336
+ var seperator = cookie.indexOf('=');
337
+ this.cookies[cookie.substring(0, seperator)] =
338
+ unescape(cookie.substring(seperator + 1, cookie.length));
339
+ }.bind(this));
340
+ return this.cookies;
341
+ },
342
+
343
+ read: function() {
344
+ var cookies = $A(arguments), results = [];
345
+ this.getAll();
346
+ cookies.each(function(name) {
347
+ if (this.cookies[name]) results.push(this.cookies[name]);
348
+ else results.push(null);
349
+ }.bind(this));
350
+ return results.length > 1 ? results : results[0];
351
+ },
352
+
353
+ write: function(cookies, options) {
354
+ if (cookies.constructor == Object && cookies.name) cookies = [cookies];
355
+ if (cookies.constructor == Array) {
356
+ $A(cookies).each(function(cookie) {
357
+ this._write(cookie.name, cookie.value, cookie.expires,
358
+ cookie.path, cookie.domain);
359
+ }.bind(this));
360
+ } else {
361
+ options = options || {expires: false, path: '', domain: ''};
362
+ for (name in cookies){
363
+ this._write(name, cookies[name],
364
+ options.expires, options.path, options.domain);
365
+ }
366
+ }
367
+ },
368
+
369
+ _write: function(name, value, expires, path, domain) {
370
+ if (name.indexOf('=') != -1) return;
371
+ var cookieString = name + '=' + escape(value);
372
+ if (expires) cookieString += '; expires=' + expires.toGMTString();
373
+ if (path) cookieString += '; path=' + path;
374
+ if (domain) cookieString += '; domain=' + domain;
375
+ document.cookie = cookieString;
376
+ },
377
+
378
+ erase: function(cookies) {
379
+ var cookiesToErase = {};
380
+ $A(arguments).each(function(cookie) {
381
+ cookiesToErase[cookie] = '';
382
+ });
383
+
384
+ this.write(cookiesToErase, {expires: (new Date((new Date()).getTime() - 1e11))});
385
+ this.getAll();
386
+ },
387
+
388
+ eraseAll: function() {
389
+ this.erase.apply(this, $H(this.getAll()).keys());
390
+ }
391
+ };
392
+
393
+ Object.extend(Cookie, {
394
+ get: Cookie.read,
395
+ set: Cookie.write,
396
+
397
+ add: Cookie.read,
398
+ remove: Cookie.erase,
399
+ removeAll: Cookie.eraseAll,
400
+
401
+ wipe: Cookie.erase,
402
+ wipeAll: Cookie.eraseAll,
403
+ destroy: Cookie.erase,
404
+ destroyAll: Cookie.eraseAll
405
+ });
406
+ })();
@@ -0,0 +1,2 @@
1
+ // Place your application-specific JavaScript functions and classes here
2
+ // This file is automatically included by javascript_include_tag :defaults