imagine_cms 3.0.0.beta6 → 3.0.0.beta7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (278) hide show
  1. data/README.rdoc +1 -1
  2. data/app/assets/images/codepress/line-numbers.png +0 -0
  3. data/app/assets/images/cropper/marqueeHoriz.gif +0 -0
  4. data/app/assets/images/cropper/marqueeVert.gif +0 -0
  5. data/app/assets/images/management/btn_add.gif +0 -0
  6. data/app/assets/images/management/btn_archive.gif +0 -0
  7. data/app/assets/images/management/btn_delete.gif +0 -0
  8. data/app/assets/images/management/btn_duplicate.gif +0 -0
  9. data/app/assets/images/management/btn_edit.gif +0 -0
  10. data/app/assets/images/management/btn_help.gif +0 -0
  11. data/app/assets/images/management/btn_new_page.gif +0 -0
  12. data/app/assets/images/management/btn_preview.gif +0 -0
  13. data/app/assets/images/management/btn_properties.gif +0 -0
  14. data/app/assets/images/management/btn_restore.gif +0 -0
  15. data/app/assets/images/management/btn_top_delete.gif +0 -0
  16. data/app/assets/images/management/btn_top_duplicate.gif +0 -0
  17. data/app/assets/images/management/btn_top_edit.gif +0 -0
  18. data/app/assets/images/management/btn_top_new.gif +0 -0
  19. data/app/assets/images/management/btn_top_preview.gif +0 -0
  20. data/app/assets/images/management/btn_top_properties.gif +0 -0
  21. data/app/assets/{manage → images/management}/bullet.gif +0 -0
  22. data/app/assets/images/management/cvv2_graphic.gif +0 -0
  23. data/app/assets/images/management/error.gif +0 -0
  24. data/app/assets/images/management/gallery_index.gif +0 -0
  25. data/app/assets/images/management/gallery_preview_overlay.png +0 -0
  26. data/app/assets/images/management/gallery_small_drag_overlay.png +0 -0
  27. data/app/assets/images/management/gallery_small_overlay.png +0 -0
  28. data/app/assets/images/management/gallery_sort.gif +0 -0
  29. data/app/assets/images/management/icon_download.gif +0 -0
  30. data/app/assets/images/management/icon_locked.png +0 -0
  31. data/app/assets/images/management/icon_page.gif +0 -0
  32. data/app/assets/images/management/icon_time.gif +0 -0
  33. data/app/assets/images/management/icon_unlocked.png +0 -0
  34. data/app/assets/images/management/page_loading.gif +0 -0
  35. data/app/assets/{manage → images/management}/start.gif +0 -0
  36. data/app/assets/images/management/vcard.gif +0 -0
  37. data/app/assets/javascripts/builder.js +101 -0
  38. data/app/assets/javascripts/codepress/codepress.html +36 -0
  39. data/app/assets/javascripts/codepress/codepress.js +130 -0
  40. data/app/assets/javascripts/codepress/engines/gecko.js +240 -0
  41. data/{vendor/gems/acts_as_tree/test/abstract_unit.rb → app/assets/javascripts/codepress/engines/khtml.js} +0 -0
  42. data/app/assets/javascripts/codepress/engines/msie.js +263 -0
  43. data/{vendor/gems/acts_as_tree/test/database.yml → app/assets/javascripts/codepress/engines/older.js} +0 -0
  44. data/app/assets/javascripts/codepress/engines/opera.js +259 -0
  45. data/app/assets/javascripts/codepress/languages/css.js +23 -0
  46. data/app/assets/javascripts/codepress/languages/generic.js +25 -0
  47. data/app/assets/javascripts/codepress/languages/html.js +63 -0
  48. data/app/assets/javascripts/codepress/languages/java.js +24 -0
  49. data/app/assets/javascripts/codepress/languages/javascript.js +30 -0
  50. data/app/assets/javascripts/codepress/languages/perl.js +27 -0
  51. data/app/assets/javascripts/codepress/languages/php.js +60 -0
  52. data/app/assets/javascripts/codepress/languages/ruby.js +26 -0
  53. data/app/assets/javascripts/codepress/languages/sql.js +30 -0
  54. data/app/assets/javascripts/codepress/languages/text.js +9 -0
  55. data/app/assets/javascripts/cropper.js +568 -0
  56. data/app/assets/javascripts/dojo/dojo.js +14155 -0
  57. data/app/assets/javascripts/dojo/src/html/images/shadowB.png +0 -0
  58. data/app/assets/javascripts/dojo/src/html/images/shadowBL.png +0 -0
  59. data/app/assets/javascripts/dojo/src/html/images/shadowBR.png +0 -0
  60. data/app/assets/javascripts/dojo/src/html/images/shadowL.png +0 -0
  61. data/app/assets/javascripts/dojo/src/html/images/shadowR.png +0 -0
  62. data/app/assets/javascripts/dojo/src/html/images/shadowT.png +0 -0
  63. data/app/assets/javascripts/dojo/src/html/images/shadowTL.png +0 -0
  64. data/app/assets/javascripts/dojo/src/html/images/shadowTR.png +0 -0
  65. data/app/assets/javascripts/dojo/src/widget/templates/Editor2/showtableborder_gecko.css +19 -0
  66. data/app/assets/javascripts/dojo/src/widget/templates/HslColorPicker.svg +30 -0
  67. data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.gif +0 -0
  68. data/app/assets/javascripts/dojo/src/widget/templates/buttons/aggregate.psd +0 -0
  69. data/app/assets/javascripts/dojo/src/widget/templates/buttons/backcolor.gif +0 -0
  70. data/app/assets/javascripts/dojo/src/widget/templates/buttons/bg-fade.png +0 -0
  71. data/app/assets/javascripts/dojo/src/widget/templates/buttons/bold.gif +0 -0
  72. data/app/assets/javascripts/dojo/src/widget/templates/buttons/cancel.gif +0 -0
  73. data/app/assets/javascripts/dojo/src/widget/templates/buttons/copy.gif +0 -0
  74. data/app/assets/javascripts/dojo/src/widget/templates/buttons/createlink.gif +0 -0
  75. data/app/assets/javascripts/dojo/src/widget/templates/buttons/cut.gif +0 -0
  76. data/app/assets/javascripts/dojo/src/widget/templates/buttons/delete.gif +0 -0
  77. data/app/assets/javascripts/dojo/src/widget/templates/buttons/forecolor.gif +0 -0
  78. data/app/assets/javascripts/dojo/src/widget/templates/buttons/hilitecolor.gif +0 -0
  79. data/app/assets/javascripts/dojo/src/widget/templates/buttons/indent.gif +0 -0
  80. data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserthorizontalrule.gif +0 -0
  81. data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertimage.gif +0 -0
  82. data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertorderedlist.gif +0 -0
  83. data/app/assets/javascripts/dojo/src/widget/templates/buttons/inserttable.gif +0 -0
  84. data/app/assets/javascripts/dojo/src/widget/templates/buttons/insertunorderedlist.gif +0 -0
  85. data/app/assets/javascripts/dojo/src/widget/templates/buttons/italic.gif +0 -0
  86. data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifycenter.gif +0 -0
  87. data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyfull.gif +0 -0
  88. data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyleft.gif +0 -0
  89. data/app/assets/javascripts/dojo/src/widget/templates/buttons/justifyright.gif +0 -0
  90. data/app/assets/javascripts/dojo/src/widget/templates/buttons/left_to_right.gif +0 -0
  91. data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_indent.gif +0 -0
  92. data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_bullet_outdent.gif +0 -0
  93. data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_indent.gif +0 -0
  94. data/app/assets/javascripts/dojo/src/widget/templates/buttons/list_num_outdent.gif +0 -0
  95. data/app/assets/javascripts/dojo/src/widget/templates/buttons/outdent.gif +0 -0
  96. data/app/assets/javascripts/dojo/src/widget/templates/buttons/paste.gif +0 -0
  97. data/app/assets/javascripts/dojo/src/widget/templates/buttons/redo.gif +0 -0
  98. data/app/assets/javascripts/dojo/src/widget/templates/buttons/removeformat.gif +0 -0
  99. data/app/assets/javascripts/dojo/src/widget/templates/buttons/right_to_left.gif +0 -0
  100. data/app/assets/javascripts/dojo/src/widget/templates/buttons/save.gif +0 -0
  101. data/app/assets/javascripts/dojo/src/widget/templates/buttons/sep.gif +0 -0
  102. data/app/assets/javascripts/dojo/src/widget/templates/buttons/space.gif +0 -0
  103. data/app/assets/javascripts/dojo/src/widget/templates/buttons/strikethrough.gif +0 -0
  104. data/app/assets/javascripts/dojo/src/widget/templates/buttons/subscript.gif +0 -0
  105. data/app/assets/javascripts/dojo/src/widget/templates/buttons/superscript.gif +0 -0
  106. data/app/assets/javascripts/dojo/src/widget/templates/buttons/underline.gif +0 -0
  107. data/app/assets/javascripts/dojo/src/widget/templates/buttons/undo.gif +0 -0
  108. data/app/assets/javascripts/dojo/src/widget/templates/buttons/wikiword.gif +0 -0
  109. data/app/assets/javascripts/dojo/src/widget/templates/check.gif +0 -0
  110. data/app/assets/javascripts/dojo/src/widget/templates/decrementMonth.gif +0 -0
  111. data/app/assets/javascripts/dojo/src/widget/templates/decrementWeek.gif +0 -0
  112. data/app/assets/javascripts/dojo/src/widget/templates/grabCorner.gif +0 -0
  113. data/app/assets/javascripts/dojo/src/widget/templates/images/floatingPaneClose.gif +0 -0
  114. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionOff.gif +0 -0
  115. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaAccordionSelected.gif +0 -0
  116. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-c.gif +0 -0
  117. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-l.gif +0 -0
  118. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaActive-r.gif +0 -0
  119. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaBarBg.gif +0 -0
  120. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-c.gif +0 -0
  121. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-l.gif +0 -0
  122. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaButton-r.gif +0 -0
  123. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-c.gif +0 -0
  124. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-l.gif +0 -0
  125. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaDisabled-r.gif +0 -0
  126. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaMenuBg.gif +0 -0
  127. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-c.gif +0 -0
  128. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-l.gif +0 -0
  129. data/app/assets/javascripts/dojo/src/widget/templates/images/soriaPressed-r.gif +0 -0
  130. data/app/assets/javascripts/dojo/src/widget/templates/images/tab_close.gif +0 -0
  131. data/app/assets/javascripts/dojo/src/widget/templates/images/toolbar-bg.gif +0 -0
  132. data/app/assets/javascripts/dojo/src/widget/templates/incrementMonth.gif +0 -0
  133. data/app/assets/javascripts/dojo/src/widget/templates/incrementWeek.gif +0 -0
  134. data/app/assets/javascripts/dojo/src/widget/templates/richtextframe.html +24 -0
  135. data/app/assets/javascripts/imagine.js +1385 -0
  136. data/app/assets/javascripts/jquery_no_conflict.js +9405 -0
  137. data/app/assets/stylesheets/codepress/codepress.css +7 -0
  138. data/app/assets/stylesheets/codepress/languages/css.css +10 -0
  139. data/app/assets/stylesheets/codepress/languages/generic.css +9 -0
  140. data/app/assets/stylesheets/codepress/languages/html.css +18 -0
  141. data/app/assets/stylesheets/codepress/languages/java.css +7 -0
  142. data/app/assets/stylesheets/codepress/languages/javascript.css +8 -0
  143. data/app/assets/stylesheets/codepress/languages/perl.css +11 -0
  144. data/app/assets/stylesheets/codepress/languages/php.css +12 -0
  145. data/app/assets/stylesheets/codepress/languages/ruby.css +10 -0
  146. data/app/assets/stylesheets/codepress/languages/sql.css +10 -0
  147. data/app/assets/stylesheets/codepress/languages/text.css +5 -0
  148. data/app/assets/stylesheets/cropper.css +182 -0
  149. data/app/assets/stylesheets/management.css +96 -0
  150. data/app/assets/stylesheets/reset.css +58 -0
  151. data/app/controllers/cms/content_controller.rb +318 -2
  152. data/app/controllers/management/cms_controller.rb +1669 -0
  153. data/app/controllers/management/user_controller.rb +4 -4
  154. data/app/controllers/management/users_controller.rb +18 -4
  155. data/app/controllers/util_controller.rb +45 -0
  156. data/app/helpers/cms_application_helper.rb +662 -15
  157. data/app/models/cms_content_sweeper.rb +21 -0
  158. data/app/models/cms_page.rb +126 -0
  159. data/app/models/cms_page_object.rb +23 -0
  160. data/app/models/cms_page_tag.rb +5 -0
  161. data/app/models/cms_page_version.rb +3 -0
  162. data/app/models/cms_snippet.rb +16 -0
  163. data/app/models/cms_template.rb +29 -0
  164. data/app/models/user.rb +6 -3
  165. data/app/views/management/cms/_complete_gallery.html.erb +5 -0
  166. data/app/views/management/cms/_create_file_link.html.erb +21 -0
  167. data/app/views/management/cms/_crop_feature_image.html.erb +188 -0
  168. data/app/views/management/cms/_crop_image.html.erb +188 -0
  169. data/app/views/management/cms/_crop_results.html.erb +1 -0
  170. data/app/views/management/cms/_crop_results_feature_image.html.erb +1 -0
  171. data/app/views/management/cms/_crop_results_thumb.html.erb +1 -0
  172. data/app/views/management/cms/_crop_thumb.html.erb +188 -0
  173. data/app/views/management/cms/_dialogs.html.erb +39 -0
  174. data/app/views/management/cms/_edit_page.html.erb +176 -0
  175. data/app/views/management/cms/_gallery_index.html.erb +10 -0
  176. data/app/views/management/cms/_gallery_setup.html.erb +22 -0
  177. data/app/views/management/cms/_image.html.erb +3 -0
  178. data/app/views/management/cms/_image_details.html.erb +26 -0
  179. data/app/views/management/cms/_image_draggable.html.erb +4 -0
  180. data/app/views/management/cms/_list_page.html.erb +8 -0
  181. data/app/views/management/cms/_list_page_select.html.erb +8 -0
  182. data/app/views/management/cms/_list_pages.html.erb +1 -0
  183. data/app/views/management/cms/_list_pages_select.html.erb +1 -0
  184. data/app/views/management/cms/_page_attribute.html.erb +6 -0
  185. data/app/views/management/cms/_page_list.html.erb +171 -0
  186. data/app/views/management/cms/_page_list_source_folder.html.erb +20 -0
  187. data/app/views/management/cms/_page_list_source_tag.html.erb +18 -0
  188. data/app/views/management/cms/_select_gallery.html.erb +117 -0
  189. data/app/views/management/cms/_snippet.html.erb +3 -0
  190. data/app/views/management/cms/_sort_images.html.erb +15 -0
  191. data/app/views/management/cms/_temp.html.erb +3 -0
  192. data/app/views/management/cms/_template_options.html.erb +21 -0
  193. data/app/views/management/cms/_template_reference.html.erb +42 -0
  194. data/app/views/management/cms/_upload_feature_image.html.erb +35 -0
  195. data/app/views/management/cms/_upload_file.html.erb +31 -0
  196. data/app/views/management/cms/_upload_image.html.erb +74 -0
  197. data/app/views/management/cms/_upload_thumb.html.erb +35 -0
  198. data/app/views/management/cms/edit_master.html.erb +48 -0
  199. data/app/views/management/cms/edit_page_content.html.erb +4 -0
  200. data/app/views/management/cms/edit_snippet.html.erb +47 -0
  201. data/app/views/management/cms/edit_template.html.erb +48 -0
  202. data/app/views/management/cms/gallery_management.html.erb +108 -0
  203. data/app/views/management/cms/index.html.erb +20 -0
  204. data/app/views/management/cms/page_tags_for_lookup.html.erb +5 -0
  205. data/app/views/management/cms/pages.html.erb +99 -0
  206. data/app/views/management/cms/permission_denied.html.erb +1 -0
  207. data/app/views/management/cms/select_page.html.erb +57 -0
  208. data/app/views/management/cms/snippets.html.erb +14 -0
  209. data/app/views/management/cms/templates.html.erb +14 -0
  210. data/app/views/management/cms/toolbar_edit.html.erb +269 -0
  211. data/app/views/management/cms/toolbar_preview.html.erb +109 -0
  212. data/app/views/util/_calendar_days.html.erb +72 -0
  213. data/app/views/util/_calendar_month_year.html.erb +1 -0
  214. data/app/views/util/_date_picker.html.erb +56 -0
  215. data/app/views/util/_message.html.erb +1 -0
  216. data/app/views/util/_show_message.js.erb +6 -0
  217. data/app/views/util/_tab.html.erb +4 -0
  218. data/config/routes.rb +4 -1
  219. data/imagine_cms.gemspec +4 -0
  220. data/{vendor/gems → lib}/acts_as_versioned/.document +0 -0
  221. data/{vendor/gems → lib}/acts_as_versioned/.gitignore +2 -0
  222. data/{vendor/gems → lib}/acts_as_versioned/CHANGELOG +0 -0
  223. data/lib/acts_as_versioned/Gemfile +7 -0
  224. data/{vendor/gems → lib}/acts_as_versioned/MIT-LICENSE +0 -0
  225. data/{vendor/gems → lib}/acts_as_versioned/README +0 -0
  226. data/{vendor/gems → lib}/acts_as_versioned/RUNNING_UNIT_TESTS +0 -0
  227. data/{vendor/gems → lib}/acts_as_versioned/Rakefile +1 -1
  228. data/{vendor/gems → lib}/acts_as_versioned/acts_as_versioned.gemspec +4 -4
  229. data/{vendor/gems → lib}/acts_as_versioned/init.rb +0 -0
  230. data/{vendor/gems → lib}/acts_as_versioned/lib/acts_as_versioned.rb +109 -107
  231. data/{vendor/gems → lib}/acts_as_versioned/test/abstract_unit.rb +0 -0
  232. data/{vendor/gems → lib}/acts_as_versioned/test/database.yml +0 -0
  233. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/authors.yml +0 -0
  234. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark.rb +0 -0
  235. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmark_versions.yml +0 -0
  236. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/landmarks.yml +0 -0
  237. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages.yml +0 -0
  238. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/locked_pages_revisions.yml +0 -0
  239. data/{vendor/gems/acts_as_versioned/test/fixtures/migrations/1_add_versioned_tables.rb → lib/acts_as_versioned/test/fixtures/migrations/2_add_versioned_tables.rb} +0 -0
  240. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page.rb +0 -0
  241. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/page_versions.yml +0 -0
  242. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/pages.yml +0 -0
  243. data/{vendor/gems → lib}/acts_as_versioned/test/fixtures/widget.rb +0 -0
  244. data/{vendor/gems → lib}/acts_as_versioned/test/migration_test.rb +0 -1
  245. data/{vendor/gems → lib}/acts_as_versioned/test/schema.rb +0 -0
  246. data/{vendor/gems → lib}/acts_as_versioned/test/versioned_test.rb +0 -0
  247. data/lib/extensions/action_controller.rb +154 -143
  248. data/lib/imagine_cms/engine.rb +33 -12
  249. data/lib/imagine_cms/version.rb +1 -1
  250. data/lib/imagine_cms.rb +30 -6
  251. data/lib/prototype_legacy_helper/README.markdown +13 -0
  252. data/lib/prototype_legacy_helper/init.rb +1 -0
  253. data/lib/prototype_legacy_helper/lib/prototype_legacy_helper.rb +430 -0
  254. data/lib/prototype_legacy_helper/test/test_prototype_helper.rb +297 -0
  255. data/lib/upload_progress/CHANGELOG +5 -0
  256. data/lib/upload_progress/MIT-LICENSE +20 -0
  257. data/lib/upload_progress/README +45 -0
  258. data/{vendor/gems/acts_as_tree → lib/upload_progress}/Rakefile +6 -5
  259. data/lib/upload_progress/init.rb +7 -0
  260. data/lib/upload_progress/lib/multipart_progress.rb +176 -0
  261. data/lib/upload_progress/lib/progress.rb +145 -0
  262. data/lib/upload_progress/lib/upload_progress.rb +303 -0
  263. data/lib/upload_progress/lib/upload_progress_helper.rb +425 -0
  264. data/lib/upload_progress/public/stylesheets/upload_progress.css +21 -0
  265. data/lib/upload_progress/test/multipart_progress_testx.rb +364 -0
  266. data/lib/upload_progress/test/upload_progress_helper_testx.rb +134 -0
  267. data/lib/upload_progress/test/upload_progress_testx.rb +88 -0
  268. metadata +305 -43
  269. data/app/assets/manage/btn_delete.gif +0 -0
  270. data/vendor/gems/.DS_Store +0 -0
  271. data/vendor/gems/acts_as_tree/README +0 -26
  272. data/vendor/gems/acts_as_tree/init.rb +0 -1
  273. data/vendor/gems/acts_as_tree/lib/active_record/acts/tree.rb +0 -96
  274. data/vendor/gems/acts_as_tree/test/acts_as_tree_test.rb +0 -219
  275. data/vendor/gems/acts_as_tree/test/fixtures/mixin.rb +0 -0
  276. data/vendor/gems/acts_as_tree/test/fixtures/mixins.yml +0 -0
  277. data/vendor/gems/acts_as_tree/test/schema.rb +0 -0
  278. data/vendor/gems/acts_as_versioned/Gemfile +0 -7
@@ -0,0 +1,21 @@
1
+ class CmsContentSweeper < ActionController::Caching::Sweeper
2
+ observe CmsPage, CmsTemplate, CmsSnippet
3
+
4
+ def after_save(record)
5
+ delete_all_cached_pages
6
+ end
7
+
8
+ def after_destroy(record)
9
+ delete_all_cached_pages
10
+ end
11
+
12
+ def delete_all_cached_pages
13
+ CmsPage.find(:all).each do |page|
14
+ expire_page :controller => 'cms/content', :action => 'show', :content_path => page.path.split('/')
15
+ end
16
+
17
+ # also delete RSS feed caches
18
+ expire_fragment %r{rss/\d+/}
19
+ end
20
+
21
+ end
@@ -0,0 +1,126 @@
1
+ class CmsPage < ActiveRecord::Base
2
+ include ActsAsTree
3
+
4
+ attr_accessible :cms_template_id, :cms_template_version, :parent_id, :name, :title, :path, :article_date, :article_end_date, :summary, :thumbnail_path, :position, :comment_count, :version, :published_version, :published_date, :expiration_date, :expires, :search_index, :updated_by, :updated_by_username
5
+
6
+ acts_as_versioned
7
+ acts_as_tree :order => 'path'
8
+
9
+ belongs_to :template, :class_name => 'CmsTemplate', :foreign_key => 'cms_template_id'
10
+ has_many :objects, :class_name => 'CmsPageObject', :dependent => :destroy
11
+ has_many :tags, :class_name => 'CmsPageTag', :dependent => :destroy
12
+ has_many :versions, :class_name => 'CmsPageVersion', :dependent => :destroy
13
+
14
+ validates_format_of :name, :with => /\A[-\w\d%]+\Z/
15
+ validates_uniqueness_of :path, :message => 'conflicts with an existing page'
16
+
17
+ before_validation :compute_and_store_path, :set_versions
18
+
19
+ def compute_and_store_path
20
+ if self.parent
21
+ if self.parent.path != ''
22
+ self.path = "#{self.parent.path}/#{self.name}"
23
+ else
24
+ self.path = self.name
25
+ end
26
+ else
27
+ self.path = ''
28
+ end
29
+ end
30
+
31
+ def set_versions
32
+ if self.template
33
+ self.cms_template_version ||= self.template.version
34
+ end
35
+
36
+ self.published_version ||= -1
37
+ self.published_date ||= self.created_on || Time.now
38
+ end
39
+
40
+ def sub_pages(options = {})
41
+ # not using options just yet, but you can override if you like
42
+ conditions = [ 'published_version >= 0' ]
43
+ self.children.find(:all, :conditions => conditions, :order => 'position')
44
+ end
45
+
46
+ def tags_as_css_classes
47
+ self.tags.map { |t| t.name.downcase.gsub(/[^\w]+/, '-') }.join(' ')
48
+ end
49
+
50
+ def self.index_all
51
+ CmsPage.find(:all, :conditions => [ 'search_index is null' ]).each { |pg| pg.update_index ; pg.save_without_revision }
52
+ true
53
+ end
54
+
55
+ def self.reindex_all
56
+ CmsPage.find(:all).each { |pg| pg.update_index ; pg.save_without_revision }
57
+ true
58
+ end
59
+
60
+ def name=(value)
61
+ if value && value.is_a?(String)
62
+ # filter suspicious content... go overboard for now, fine-tune later perhaps
63
+ value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '&lt;\1&gt;')
64
+ value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '&lt;\1&gt;')
65
+ value.gsub!(/<(%.*?`.*?\s*%)>/, '&lt;\1&gt;')
66
+ end
67
+ super(value)
68
+ end
69
+
70
+ def html_head=(value)
71
+ if value && value.is_a?(String)
72
+ # filter suspicious content... go overboard for now, fine-tune later perhaps
73
+ value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '&lt;\1&gt;')
74
+ value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '&lt;\1&gt;')
75
+ value.gsub!(/<(%.*?`.*?\s*%)>/, '&lt;\1&gt;')
76
+ end
77
+ super(value)
78
+ end
79
+
80
+ def update_index
81
+ content = ''
82
+
83
+ if self.published_version.to_i >= 0
84
+ idx_version = self.published_version.to_i == 0 ? self.version : self.published_version
85
+ self.objects.find(:all, :conditions => [ "cms_page_version = ? and (obj_type = 'text' or obj_type = 'string')", idx_version ]).each do |obj|
86
+ content << obj.content << "\n"
87
+ end
88
+ end
89
+
90
+ self.search_index = sanitize_index(content)
91
+ end
92
+
93
+ def set_parent_id!(new_id)
94
+ self.parent_id = new_id
95
+ self.save_without_revision
96
+ end
97
+
98
+
99
+ def article_date_month ; article_date.strftime("%B") ; end
100
+ def article_date_mon ; article_date.strftime("%b") ; end
101
+ def article_date_day ; article_date.strftime("%d").to_i ; end
102
+ def article_date_year ; article_date.strftime("%Y").to_i ; end
103
+ def article_date_yr ; article_date.strftime("%y").to_i ; end
104
+
105
+
106
+ private
107
+
108
+ def sanitize_index(html)
109
+ return html if html.blank?
110
+ if html.index("<")
111
+ text = ""
112
+ tokenizer = HTML::Tokenizer.new(html)
113
+
114
+ while token = tokenizer.next
115
+ node = HTML::Node.parse(nil, 0, 0, token, false)
116
+ # result is only the content of any Text nodes
117
+ text << node.to_s if node.class == HTML::Text
118
+ end
119
+ # strip any comments, and if they have a newline at the end (ie. line with
120
+ # only a comment) strip that too, as well as any erb stuff
121
+ text.gsub(/<!--(.*?)-->[\n]?/m, "").gsub(/\<%.*?%\>/m, '').gsub(/&\w+;/, '')
122
+ else
123
+ html # already plain text
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,23 @@
1
+ class CmsPageObject < ActiveRecord::Base
2
+ attr_accessible :name, :obj_type
3
+
4
+ belongs_to :page, :class_name => 'CmsPage', :foreign_key => 'cms_page_id'
5
+
6
+ before_create :set_page_version
7
+
8
+
9
+ def set_page_version
10
+ self.cms_page_version ||= page.version
11
+ end
12
+
13
+ def content=(value)
14
+ if value && value.is_a?(String)
15
+ # filter suspicious content... go overboard for now, fine-tune later perhaps
16
+ value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '&lt;\1&gt;')
17
+ value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '&lt;\1&gt;')
18
+ value.gsub!(/<(%.*?`.*?\s*%)>/, '&lt;\1&gt;')
19
+ end
20
+ super(value)
21
+ end
22
+
23
+ end
@@ -0,0 +1,5 @@
1
+ class CmsPageTag < ActiveRecord::Base
2
+ belongs_to :page, :class_name => 'CmsPage', :foreign_key => 'cms_page_id'
3
+
4
+ validates_uniqueness_of :name, :scope => 'cms_page_id'
5
+ end
@@ -0,0 +1,3 @@
1
+ class CmsPageVersion < ActiveRecord::Base
2
+ belongs_to :cms_page
3
+ end
@@ -0,0 +1,16 @@
1
+ class CmsSnippet < ActiveRecord::Base
2
+ acts_as_versioned
3
+
4
+ attr_accessible :name, :content
5
+
6
+ def content=(value)
7
+ if value && value.is_a?(String)
8
+ # filter suspicious content... go overboard for now, fine-tune later perhaps
9
+ value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '&lt;\1&gt;')
10
+ value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '&lt;\1&gt;')
11
+ value.gsub!(/<(%.*?`.*?\s*%)>/, '&lt;\1&gt;')
12
+ end
13
+ super(value)
14
+ end
15
+
16
+ end
@@ -0,0 +1,29 @@
1
+ class CmsTemplate < ActiveRecord::Base
2
+ acts_as_versioned
3
+
4
+ attr_accessible :name, :content
5
+ attr_accessor :options
6
+
7
+ has_many :pages, :class_name => 'CmsPage'
8
+
9
+ def after_find
10
+ require 'yaml'
11
+ @options = YAML.load(self.options_yaml) if self.options_yaml
12
+ end
13
+
14
+ def content=(value)
15
+ if value && value.is_a?(String)
16
+ # filter suspicious content... go overboard for now, fine-tune later perhaps
17
+ value.gsub!(/<(%.*?(exec|system)\s?\(.*?\s*%)>/, '&lt;\1&gt;')
18
+ value.gsub!(/<(%.*?\%x\s?\[.*?\s*%)>/, '&lt;\1&gt;')
19
+ value.gsub!(/<(%.*?`.*?\s*%)>/, '&lt;\1&gt;')
20
+ end
21
+ super(value)
22
+ end
23
+
24
+ def before_save
25
+ require 'yaml'
26
+ self.options_yaml = YAML.dump(@options)
27
+ end
28
+
29
+ end
data/app/models/user.rb CHANGED
@@ -2,6 +2,7 @@ class User < ActiveRecord::Base # :nodoc:
2
2
  require 'dynamic_methods'
3
3
  include DynamicMethods
4
4
 
5
+ attr_accessible :first_name, :last_name
5
6
  attr_reader :password # :nodoc:
6
7
 
7
8
  has_and_belongs_to_many :groups, :class_name => 'UserGroup', :join_table => 'user_group_memberships'
@@ -11,9 +12,11 @@ class User < ActiveRecord::Base # :nodoc:
11
12
  validates_uniqueness_of :username, :message => 'already in use'
12
13
  validates_confirmation_of :password
13
14
 
14
- def name ; [self.first_name, self.last_name].compact.join(" ") ; end
15
+ before_validation :fake_password_confirmation, :on => :update
15
16
 
16
- SaltLength = 16 # :nodoc:
17
+ def name ; [ first_name, last_name ].compact.join(' ') ; end
18
+
19
+ SaltLength = 16 unless defined?(SaltLength) # :nodoc:
17
20
 
18
21
  def password=(val) # :nodoc:
19
22
  @password = val
@@ -38,7 +41,7 @@ class User < ActiveRecord::Base # :nodoc:
38
41
  salt << digest.hexdigest
39
42
  end
40
43
 
41
- def before_validation_on_update # :nodoc:
44
+ def fake_password_confirmation # :nodoc:
42
45
  # if password is blank, user is not trying to change it.
43
46
  # just appease the validator by setting something valid
44
47
  if ((@password ||= "") == "")
@@ -0,0 +1,5 @@
1
+ <script type="text/javascript">
2
+ var editor = dojo.widget.Editor2Manager.getCurrentInstance();
3
+ editor.execCommand('inserthtml', '<' + '%= insert_object(\'<%= params[:dirname] %>\', :photo_gallery) %' + '>');
4
+ cancelInsertImage();
5
+ </script>
@@ -0,0 +1,21 @@
1
+ <%-
2
+ ext = File.extname(@filename)
3
+ ext = (ext.blank? ? 'generic' : ext.gsub(/\./, ''))
4
+ -%>
5
+ <%= javascript_tag <<-EOF
6
+ var curInst = dojo.widget.Editor2Manager.getCurrentInstance();
7
+ linkNode = dojo.withGlobal(curInst.window, "getAncestorElement", dojo.html.selection, ['a']);
8
+
9
+ curInst.restoreSelection();
10
+
11
+ if (!linkNode) {
12
+ var html = dojo.withGlobal(curInst.window, 'getSelectedHtml', dojo.html.selection);
13
+ } else {
14
+ var html = linkNode.innerHTML;
15
+ dojo.withGlobal(curInst.window, 'selectElement', dojo.html.selection, [linkNode]);
16
+ }
17
+
18
+ curInst.execCommand('inserthtml', '<a href=\"/#{@filename}\" class=\"file-#{ext}\" target=\"_blank\">'+html+'</a>');
19
+ cancelInsertFile();
20
+ EOF
21
+ %>
@@ -0,0 +1,188 @@
1
+ <script type="text/javascript">
2
+ var resize_ratio = 1.0;
3
+ var aspect_ratio = <%= @width %>.0 / <%= @height %>;
4
+ var imageSizeLocked = false;
5
+
6
+ try {
7
+ if (cropper) cropper.remove();
8
+ } catch (e) {}
9
+
10
+ onEndCrop = function (coords, dimensions) {
11
+ if (dimensions.width > 0 && dimensions.height > 0) {
12
+ var size_changed = false;
13
+
14
+ $('image_x1').value = coords.x1;
15
+ $('image_y1').value = coords.y1;
16
+ $('image_x2').value = coords.x2;
17
+ $('image_y2').value = coords.y2;
18
+
19
+ if (dimensions.width != $('image_width').value) {
20
+ $('image_width').value = dimensions.width;
21
+ size_changed = true;
22
+ }
23
+ if (dimensions.height != $('image_height').value) {
24
+ $('image_height').value = dimensions.height;
25
+ size_changed = true;
26
+ }
27
+
28
+ if (size_changed) {
29
+ setResizeRatio();
30
+ aspect_ratio = 1.0 * dimensions.width / dimensions.height;
31
+
32
+ $('selection_x2').value = dimensions.width;
33
+ $('selection_y2').value = dimensions.height;
34
+
35
+ if (!imageSizeLocked) {
36
+ if (resize_ratio) {
37
+ $('image_max_width').value = Math.round(dimensions.width * resize_ratio);
38
+ $('image_max_height').value = Math.round(dimensions.height * resize_ratio);
39
+ } else {
40
+ $('image_max_width').value = dimensions.width;
41
+ $('image_max_height').value = dimensions.height;
42
+ }
43
+ }
44
+
45
+ $('aspect_ratio').innerHTML = setPrecision(dimensions.width/dimensions.height, 3);
46
+ }
47
+ }
48
+ }
49
+
50
+ resizeCropper = function () {
51
+ width = $('selection_x2').value;
52
+ height = $('selection_y2').value;
53
+ end_x = parseInt(width) + parseInt(cropper.areaCoords.x1);
54
+ end_y = parseInt(height) + parseInt(cropper.areaCoords.y1);
55
+ cropper.setAreaCoords(cropper.cloneCoords({ x1:parseInt(cropper.areaCoords.x1),
56
+ y1:parseInt(cropper.areaCoords.y1),
57
+ x2:end_x,
58
+ y2:end_y }), false, false, 1);
59
+ cropper.selArea.show();
60
+ cropper.drawArea();
61
+ cropper.endCrop();
62
+
63
+ setResizeRatio();
64
+ }
65
+
66
+ resizeCropperScaled = function () {
67
+ if (imageSizeLocked) {
68
+ width = parseInt($('image_max_width').value);
69
+ height = parseInt($('image_max_height').value);
70
+ if (width > 10 && height > 10) {
71
+ cropper.options.ratioDim = { x: width, y: height };
72
+ reloadCropper();
73
+ }
74
+ } else {
75
+ $('selection_x2').value = Math.round($('image_max_width').value / resize_ratio);
76
+ $('selection_y2').value = Math.round($('image_max_height').value / resize_ratio);
77
+ resizeCropper();
78
+ }
79
+ }
80
+
81
+ setResizeRatio = function () {
82
+ crop_width = parseInt($('image_max_width').value);
83
+ selection_width = parseInt($('selection_x2').value); // this is correct... x2 is the sel width
84
+
85
+ if (crop_width > 10 && selection_width > 10) {
86
+ resize_ratio = 1.0 * $('image_max_width').value / $('selection_x2').value;
87
+ } else {
88
+ resize_ratio = 1.0;
89
+ }
90
+ }
91
+
92
+ lockImageSize = function () {
93
+ imageSizeLocked = true;
94
+ cropper.options.ratioDim = { x: parseInt($('image_max_width').value),
95
+ y: parseInt($('image_max_height').value) };
96
+ reloadCropper();
97
+
98
+ $('icon_unlocked').hide();
99
+ $('icon_locked').show();
100
+ }
101
+
102
+ unlockImageSize = function () {
103
+ imageSizeLocked = false;
104
+ cropper.options.ratioDim = { x: 0, y: 0 };
105
+ reloadCropper();
106
+
107
+ $('icon_locked').hide();
108
+ $('icon_unlocked').show();
109
+ }
110
+
111
+ reloadCropper = function () {
112
+ oldOptions = cropper.options;
113
+ oldOptions.displayOnInit = 1;
114
+ if (($('image_x1').value == $('image_x2').value) && ($('image_y1').value == $('image_y2').value)) {
115
+ $('image_x1').value = '0';
116
+ $('image_x2').value = $('image_max_width').value;
117
+ $('image_y1').value = '0';
118
+ $('image_y2').value = $('image_max_height').value;
119
+ }
120
+ oldOptions.onloadCoords = { x1: $('image_x1').value, y1: $('image_y1').value,
121
+ x2: $('image_x2').value, y2: $('image_y2').value };
122
+ cropper.remove();
123
+ cropper = new Cropper.Img('testImage', oldOptions);
124
+ }
125
+
126
+ recalculateWidth = function () {
127
+ if (imageSizeLocked) {
128
+ $('image_max_width').value = Math.round(parseInt($('image_max_height').value) / aspect_ratio);
129
+ }
130
+ }
131
+
132
+ recalculateHeight = function () {
133
+ if (imageSizeLocked) {
134
+ $('image_max_height').value = Math.round(parseInt($('image_max_width').value) / aspect_ratio);
135
+ }
136
+ }
137
+ </script>
138
+
139
+ <h3>Crop Feature Image</h3>
140
+
141
+ Crop the image by clicking and dragging the mouse over the image.<br/>
142
+ Pressing "Save Feature Image" will crop the image and set it as the new feature image for this page.
143
+ <br/>
144
+
145
+ <center>
146
+ <%= cropper_image_tag({ :url => File.join('content', @pg.path, @image_file) }) %><br/>
147
+ </center>
148
+ <br/>
149
+
150
+ <center>
151
+ <%= form_remote_tag :update => 'select_thumbnail_dialog_content',
152
+ :url => { :action => "save_crop_feature_image", :id => @pg, :filename => @image_file } do -%>
153
+ <table cellpadding="10">
154
+ <tr>
155
+ <td>
156
+ <fieldset style="padding: 10px 15px; text-align: center; display: none;">
157
+ <legend>Adjust Crop:</legend>
158
+ <%= text_field :selection, :x2, :size => 3, :onkeyup => "resizeCropper();" %> x <%= text_field :selection, :y2, :size => 3, :onkeyup => "resizeCropper();" %>
159
+ </fieldset>
160
+
161
+ <fieldset style="padding: 10px 15px; text-align: center;">
162
+ <legend>Final Image Dimensions:</legend>
163
+ <%= text_field :image, :max_width, :size => 3, :value => @width, :onchange => "recalculateHeight();" %>
164
+ x <%= text_field :image, :max_height, :size => 3, :value => @height, :onchange => "recalculateWidth();" %>
165
+ <%= javascript_tag "$('image_max_width').onkeydown = disableEnterKey; $('image_max_height').onkeydown = disableEnterKey;" %>
166
+
167
+ <%= image_tag('/assets/management/icon_unlocked.png', :id => 'icon_unlocked', :onclick => "lockImageSize();") %>
168
+ <%= image_tag('/assets/management/icon_locked.png', :id => 'icon_locked', :onclick => "unlockImageSize();", :style => 'display: none;') %>
169
+
170
+ <%= link_to_function "Apply", "resizeCropperScaled();" %> |
171
+ <%= link_to_function "Reset", "cropper.reset(); resize_ratio = 1.0;" %>
172
+
173
+ <span id="aspect_ratio" style="display: none;"><%= sprintf("%.3f", @aspect_ratio) %></span><br/>
174
+ <%= text_field :image, :x1, :style => "display: none" %>
175
+ <%= text_field :image, :y1, :style => "display: none" %>
176
+ <%= text_field :image, :x2, :style => "display: none" %>
177
+ <%= text_field :image, :y2, :style => "display: none" %>
178
+ <%= text_field :image, :width, :style => "display: none" %>
179
+ <%= text_field :image, :height, :style => "display: none" %>
180
+ </fieldset>
181
+ </td>
182
+ </tr>
183
+ </table>
184
+
185
+ <%= submit_tag 'Save Feature Image', :class => 'form_button', :style => 'width: 90px;', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
186
+ <%= link_to_function "Cancel", "cancelSelectThumbnail()" %>
187
+ <%- end -%>
188
+ </center>
@@ -0,0 +1,188 @@
1
+ <script type="text/javascript">
2
+ var resize_ratio = 1.0;
3
+ var aspect_ratio = <%= @width %>.0 / <%= @height %>;
4
+ var imageSizeLocked = false;
5
+
6
+ try {
7
+ if (cropper) cropper.remove();
8
+ } catch (e) {}
9
+
10
+ onEndCrop = function (coords, dimensions) {
11
+ if (dimensions.width > 0 && dimensions.height > 0) {
12
+ var size_changed = false;
13
+
14
+ $('image_x1').value = coords.x1;
15
+ $('image_y1').value = coords.y1;
16
+ $('image_x2').value = coords.x2;
17
+ $('image_y2').value = coords.y2;
18
+
19
+ if (dimensions.width != $('image_width').value) {
20
+ $('image_width').value = dimensions.width;
21
+ size_changed = true;
22
+ }
23
+ if (dimensions.height != $('image_height').value) {
24
+ $('image_height').value = dimensions.height;
25
+ size_changed = true;
26
+ }
27
+
28
+ if (size_changed) {
29
+ setResizeRatio();
30
+ aspect_ratio = 1.0 * dimensions.width / dimensions.height;
31
+
32
+ $('selection_x2').value = dimensions.width;
33
+ $('selection_y2').value = dimensions.height;
34
+
35
+ if (!imageSizeLocked) {
36
+ if (resize_ratio) {
37
+ $('image_max_width').value = Math.round(dimensions.width * resize_ratio);
38
+ $('image_max_height').value = Math.round(dimensions.height * resize_ratio);
39
+ } else {
40
+ $('image_max_width').value = dimensions.width;
41
+ $('image_max_height').value = dimensions.height;
42
+ }
43
+ }
44
+
45
+ $('aspect_ratio').innerHTML = setPrecision(dimensions.width/dimensions.height, 3);
46
+ }
47
+ }
48
+ }
49
+
50
+ resizeCropper = function () {
51
+ width = $('selection_x2').value;
52
+ height = $('selection_y2').value;
53
+ end_x = parseInt(width) + parseInt(cropper.areaCoords.x1);
54
+ end_y = parseInt(height) + parseInt(cropper.areaCoords.y1);
55
+ cropper.setAreaCoords(cropper.cloneCoords({ x1:parseInt(cropper.areaCoords.x1),
56
+ y1:parseInt(cropper.areaCoords.y1),
57
+ x2:end_x,
58
+ y2:end_y }), false, false, 1);
59
+ cropper.selArea.show();
60
+ cropper.drawArea();
61
+ cropper.endCrop();
62
+
63
+ setResizeRatio();
64
+ }
65
+
66
+ resizeCropperScaled = function () {
67
+ if (imageSizeLocked) {
68
+ width = parseInt($('image_max_width').value);
69
+ height = parseInt($('image_max_height').value);
70
+ if (width > 10 && height > 10) {
71
+ cropper.options.ratioDim = { x: width, y: height };
72
+ reloadCropper();
73
+ }
74
+ } else {
75
+ $('selection_x2').value = Math.round($('image_max_width').value / resize_ratio);
76
+ $('selection_y2').value = Math.round($('image_max_height').value / resize_ratio);
77
+ resizeCropper();
78
+ }
79
+ }
80
+
81
+ setResizeRatio = function () {
82
+ crop_width = parseInt($('image_max_width').value);
83
+ selection_width = parseInt($('selection_x2').value); // this is correct... x2 is the sel width
84
+
85
+ if (crop_width > 10 && selection_width > 10) {
86
+ resize_ratio = 1.0 * $('image_max_width').value / $('selection_x2').value;
87
+ } else {
88
+ resize_ratio = 1.0;
89
+ }
90
+ }
91
+
92
+ lockImageSize = function () {
93
+ imageSizeLocked = true;
94
+ cropper.options.ratioDim = { x: parseInt($('image_max_width').value),
95
+ y: parseInt($('image_max_height').value) };
96
+ reloadCropper();
97
+
98
+ $('icon_unlocked').hide();
99
+ $('icon_locked').show();
100
+ }
101
+
102
+ unlockImageSize = function () {
103
+ imageSizeLocked = false;
104
+ cropper.options.ratioDim = { x: 0, y: 0 };
105
+ reloadCropper();
106
+
107
+ $('icon_locked').hide();
108
+ $('icon_unlocked').show();
109
+ }
110
+
111
+ reloadCropper = function () {
112
+ oldOptions = cropper.options;
113
+ oldOptions.displayOnInit = 1;
114
+ if (($('image_x1').value == $('image_x2').value) && ($('image_y1').value == $('image_y2').value)) {
115
+ $('image_x1').value = '0';
116
+ $('image_x2').value = $('image_max_width').value;
117
+ $('image_y1').value = '0';
118
+ $('image_y2').value = $('image_max_height').value;
119
+ }
120
+ oldOptions.onloadCoords = { x1: $('image_x1').value, y1: $('image_y1').value,
121
+ x2: $('image_x2').value, y2: $('image_y2').value };
122
+ cropper.remove();
123
+ cropper = new Cropper.Img('testImage', oldOptions);
124
+ }
125
+
126
+ recalculateWidth = function () {
127
+ if (imageSizeLocked) {
128
+ $('image_max_width').value = Math.round(parseInt($('image_max_height').value) / aspect_ratio);
129
+ }
130
+ }
131
+
132
+ recalculateHeight = function () {
133
+ if (imageSizeLocked) {
134
+ $('image_max_height').value = Math.round(parseInt($('image_max_width').value) / aspect_ratio);
135
+ }
136
+ }
137
+ </script>
138
+
139
+ <h3>Crop Image</h3>
140
+
141
+ Crop the image by clicking and dragging the mouse over the image.<br/>
142
+ Pressing "Save Image" will crop the image and insert it into the page.
143
+ <br/>
144
+
145
+ <center>
146
+ <%= cropper_image_tag({ :url => File.join('content', @pg.path, @image_file) }) %><br/>
147
+ </center>
148
+ <br/>
149
+
150
+ <center>
151
+ <%= form_remote_tag :update => 'insert_image_dialog_content',
152
+ :url => { :action => "save_crop", :id => @pg, :filename => @image_file } do -%>
153
+ <table cellpadding="10">
154
+ <tr>
155
+ <td>
156
+ <fieldset style="padding: 10px 15px; text-align: center; display: none;">
157
+ <legend>Adjust Crop:</legend>
158
+ <%= text_field :selection, :x2, :size => 3, :onkeyup => "resizeCropper();" %> x <%= text_field :selection, :y2, :size => 3, :onkeyup => "resizeCropper();" %>
159
+ </fieldset>
160
+
161
+ <fieldset style="padding: 10px 15px; text-align: center;">
162
+ <legend>Final Image Dimensions:</legend>
163
+ <%= text_field :image, :max_width, :size => 3, :value => @width, :onchange => "recalculateHeight();" %>
164
+ x <%= text_field :image, :max_height, :size => 3, :value => @height, :onchange => "recalculateWidth();" %>
165
+ <%= javascript_tag "$('image_max_width').onkeydown = disableEnterKey; $('image_max_height').onkeydown = disableEnterKey;" %>
166
+
167
+ <%= image_tag('/assets/management/icon_unlocked.png', :id => 'icon_unlocked', :onclick => "lockImageSize();") %>
168
+ <%= image_tag('/assets/management/icon_locked.png', :id => 'icon_locked', :onclick => "unlockImageSize();", :style => 'display: none;') %>
169
+
170
+ <%= link_to_function "Apply", "resizeCropperScaled();" %> |
171
+ <%= link_to_function "Reset", "cropper.reset(); resize_ratio = 1.0;" %>
172
+
173
+ <span id="aspect_ratio" style="display: none;"><%= sprintf("%.3f", @aspect_ratio) %></span><br/>
174
+ <%= text_field :image, :x1, :style => "display: none" %>
175
+ <%= text_field :image, :y1, :style => "display: none" %>
176
+ <%= text_field :image, :x2, :style => "display: none" %>
177
+ <%= text_field :image, :y2, :style => "display: none" %>
178
+ <%= text_field :image, :width, :style => "display: none" %>
179
+ <%= text_field :image, :height, :style => "display: none" %>
180
+ </fieldset>
181
+ </td>
182
+ </tr>
183
+ </table>
184
+
185
+ <%= submit_tag 'Save Image', :class => 'form_button', :style => 'width: 90px;', :onclick => 'cropper.remove(); this.disabled = true; this.value = "Saving...";' %>
186
+ <%= link_to_function "Cancel", "cancelInsertImage();" %>
187
+ <%- end -%>
188
+ </center>
@@ -0,0 +1 @@
1
+ <%= javascript_tag "var editor = dojo.widget.Editor2Manager.getCurrentInstance(); editor.execCommand('inserthtml', '#{page_image_tag(@pg, @image_file)}'); cancelInsertImage();" %>
@@ -0,0 +1 @@
1
+ <%= javascript_tag "$('pg_feature_image_path').value = '/#{File.join('images', 'content', @pg.path, File.basename(@image_file))}'; $('feature_image_preview').innerHTML = '#{page_image_tag(@pg, @image_file)}'; cancelSelectThumbnail();" %>