nate-browsercms 3.0.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (914) hide show
  1. data/LICENSE.txt +165 -0
  2. data/README.markdown +79 -0
  3. data/app/controllers/application_controller.rb +14 -0
  4. data/app/controllers/cms/application_controller.rb +78 -0
  5. data/app/controllers/cms/attachments_controller.rb +11 -0
  6. data/app/controllers/cms/base_controller.rb +13 -0
  7. data/app/controllers/cms/cache_controller.rb +22 -0
  8. data/app/controllers/cms/categories_controller.rb +2 -0
  9. data/app/controllers/cms/category_types_controller.rb +5 -0
  10. data/app/controllers/cms/connectors_controller.rb +63 -0
  11. data/app/controllers/cms/content_block_controller.rb +256 -0
  12. data/app/controllers/cms/content_controller.rb +211 -0
  13. data/app/controllers/cms/content_types_controller.rb +7 -0
  14. data/app/controllers/cms/dashboard_controller.rb +9 -0
  15. data/app/controllers/cms/dynamic_views_controller.rb +65 -0
  16. data/app/controllers/cms/email_messages_controller.rb +14 -0
  17. data/app/controllers/cms/email_page_portlet_controller.rb +14 -0
  18. data/app/controllers/cms/error_handling.rb +18 -0
  19. data/app/controllers/cms/file_blocks_controller.rb +2 -0
  20. data/app/controllers/cms/groups_controller.rb +26 -0
  21. data/app/controllers/cms/home_controller.rb +5 -0
  22. data/app/controllers/cms/html_blocks_controller.rb +2 -0
  23. data/app/controllers/cms/image_blocks_controller.rb +2 -0
  24. data/app/controllers/cms/links_controller.rb +59 -0
  25. data/app/controllers/cms/missing_asset_controller.rb +6 -0
  26. data/app/controllers/cms/page_route_conditions_controller.rb +2 -0
  27. data/app/controllers/cms/page_route_options_controller.rb +56 -0
  28. data/app/controllers/cms/page_route_requirements_controller.rb +2 -0
  29. data/app/controllers/cms/page_routes_controller.rb +45 -0
  30. data/app/controllers/cms/pages_controller.rb +124 -0
  31. data/app/controllers/cms/portlet_controller.rb +62 -0
  32. data/app/controllers/cms/portlets_controller.rb +32 -0
  33. data/app/controllers/cms/redirects_controller.rb +19 -0
  34. data/app/controllers/cms/resource_controller.rb +108 -0
  35. data/app/controllers/cms/routes_controller.rb +23 -0
  36. data/app/controllers/cms/section_nodes_controller.rb +40 -0
  37. data/app/controllers/cms/sections_controller.rb +125 -0
  38. data/app/controllers/cms/sessions_controller.rb +64 -0
  39. data/app/controllers/cms/tags_controller.rb +9 -0
  40. data/app/controllers/cms/tasks_controller.rb +52 -0
  41. data/app/controllers/cms/toolbar_controller.rb +12 -0
  42. data/app/controllers/cms/users_controller.rb +98 -0
  43. data/app/helpers/application_helper.rb +3 -0
  44. data/app/helpers/cms/application_helper.rb +187 -0
  45. data/app/helpers/cms/form_builder.rb +98 -0
  46. data/app/helpers/cms/form_tag_helper.rb +32 -0
  47. data/app/helpers/cms/menu_helper.rb +172 -0
  48. data/app/helpers/cms/page_helper.rb +60 -0
  49. data/app/helpers/cms/path_helper.rb +48 -0
  50. data/app/helpers/cms/section_nodes_helper.rb +13 -0
  51. data/app/models/abstract_file_block.rb +13 -0
  52. data/app/models/attachment.rb +203 -0
  53. data/app/models/category.rb +40 -0
  54. data/app/models/category_type.rb +34 -0
  55. data/app/models/connector.rb +72 -0
  56. data/app/models/content_type.rb +95 -0
  57. data/app/models/content_type_group.rb +3 -0
  58. data/app/models/dynamic_view.rb +73 -0
  59. data/app/models/email_message.rb +31 -0
  60. data/app/models/email_message_mailer.rb +11 -0
  61. data/app/models/file_block.rb +21 -0
  62. data/app/models/group.rb +30 -0
  63. data/app/models/group_permission.rb +7 -0
  64. data/app/models/group_section.rb +4 -0
  65. data/app/models/group_type.rb +12 -0
  66. data/app/models/group_type_permission.rb +4 -0
  67. data/app/models/guest_user.rb +39 -0
  68. data/app/models/html_block.rb +40 -0
  69. data/app/models/image_block.rb +22 -0
  70. data/app/models/link.rb +35 -0
  71. data/app/models/page.rb +293 -0
  72. data/app/models/page_partial.rb +22 -0
  73. data/app/models/page_route.rb +58 -0
  74. data/app/models/page_route_condition.rb +2 -0
  75. data/app/models/page_route_option.rb +3 -0
  76. data/app/models/page_route_requirement.rb +2 -0
  77. data/app/models/page_template.rb +48 -0
  78. data/app/models/permission.rb +10 -0
  79. data/app/models/portlet.rb +108 -0
  80. data/app/models/redirect.rb +4 -0
  81. data/app/models/section.rb +140 -0
  82. data/app/models/section_node.rb +101 -0
  83. data/app/models/site.rb +41 -0
  84. data/app/models/tag.rb +62 -0
  85. data/app/models/tagging.rb +9 -0
  86. data/app/models/task.rb +67 -0
  87. data/app/models/user.rb +125 -0
  88. data/app/models/user_group_membership.rb +4 -0
  89. data/app/portlets/dynamic_portlet.rb +7 -0
  90. data/app/portlets/email_page_portlet.rb +10 -0
  91. data/app/portlets/login_portlet.rb +10 -0
  92. data/app/portlets/tag_cloud_portlet.rb +13 -0
  93. data/app/views/cms/blocks/_hidden_fields.html.erb +10 -0
  94. data/app/views/cms/blocks/_toolbar.html.erb +9 -0
  95. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +26 -0
  96. data/app/views/cms/blocks/_toolbar_for_member.html.erb +38 -0
  97. data/app/views/cms/blocks/edit.html.erb +25 -0
  98. data/app/views/cms/blocks/index.html.erb +122 -0
  99. data/app/views/cms/blocks/new.html.erb +21 -0
  100. data/app/views/cms/blocks/show.html.erb +30 -0
  101. data/app/views/cms/blocks/usages.html.erb +34 -0
  102. data/app/views/cms/blocks/versions.html.erb +102 -0
  103. data/app/views/cms/cache/show.html.erb +12 -0
  104. data/app/views/cms/categories/_form.html.erb +36 -0
  105. data/app/views/cms/category_types/_form.html.erb +1 -0
  106. data/app/views/cms/connectors/new.html.erb +71 -0
  107. data/app/views/cms/content/show.html.erb +21 -0
  108. data/app/views/cms/content_types/index.html.erb +14 -0
  109. data/app/views/cms/dashboard/_page_drafts.html.erb +49 -0
  110. data/app/views/cms/dashboard/_tasks.html.erb +54 -0
  111. data/app/views/cms/dashboard/index.html.erb +15 -0
  112. data/app/views/cms/dynamic_views/_form.html.erb +11 -0
  113. data/app/views/cms/dynamic_views/edit.html.erb +3 -0
  114. data/app/views/cms/dynamic_views/index.html.erb +48 -0
  115. data/app/views/cms/dynamic_views/new.html.erb +3 -0
  116. data/app/views/cms/email_messages/index.html.erb +41 -0
  117. data/app/views/cms/email_messages/show.html.erb +57 -0
  118. data/app/views/cms/file_blocks/_form.html.erb +30 -0
  119. data/app/views/cms/file_blocks/render.html.erb +5 -0
  120. data/app/views/cms/form_builder/_cms_date_picker.html.erb +12 -0
  121. data/app/views/cms/form_builder/_cms_drop_down.html.erb +19 -0
  122. data/app/views/cms/form_builder/_cms_file_field.html.erb +30 -0
  123. data/app/views/cms/form_builder/_cms_tag_list.html.erb +15 -0
  124. data/app/views/cms/form_builder/_cms_text_area.html.erb +13 -0
  125. data/app/views/cms/form_builder/_cms_text_editor.html.erb +18 -0
  126. data/app/views/cms/form_builder/_cms_text_field.html.erb +12 -0
  127. data/app/views/cms/groups/_form.html.erb +45 -0
  128. data/app/views/cms/groups/_permissions.html.erb +36 -0
  129. data/app/views/cms/groups/_sections.html.erb +18 -0
  130. data/app/views/cms/groups/edit.html.erb +4 -0
  131. data/app/views/cms/groups/index.html.erb +60 -0
  132. data/app/views/cms/groups/new.html.erb +4 -0
  133. data/app/views/cms/html_blocks/_form.html.erb +3 -0
  134. data/app/views/cms/html_blocks/render.html.erb +1 -0
  135. data/app/views/cms/image_blocks/_form.html.erb +30 -0
  136. data/app/views/cms/image_blocks/render.html.erb +1 -0
  137. data/app/views/cms/links/_form.html.erb +15 -0
  138. data/app/views/cms/links/destroy.js.rjs +2 -0
  139. data/app/views/cms/links/edit.html.erb +14 -0
  140. data/app/views/cms/links/new.html.erb +15 -0
  141. data/app/views/cms/page_routes/_form.html.erb +11 -0
  142. data/app/views/cms/page_routes/edit.html.erb +3 -0
  143. data/app/views/cms/page_routes/index.html.erb +50 -0
  144. data/app/views/cms/page_routes/new.html.erb +3 -0
  145. data/app/views/cms/page_routes/show.html.erb +14 -0
  146. data/app/views/cms/pages/_edit_connector.html.erb +16 -0
  147. data/app/views/cms/pages/_edit_container.html.erb +8 -0
  148. data/app/views/cms/pages/_form.html.erb +53 -0
  149. data/app/views/cms/pages/edit.html.erb +23 -0
  150. data/app/views/cms/pages/new.html.erb +36 -0
  151. data/app/views/cms/pages/versions.html.erb +82 -0
  152. data/app/views/cms/redirects/_form.html.erb +15 -0
  153. data/app/views/cms/redirects/edit.html.erb +3 -0
  154. data/app/views/cms/redirects/index.html.erb +45 -0
  155. data/app/views/cms/redirects/new.html.erb +3 -0
  156. data/app/views/cms/routes/index.html.erb +36 -0
  157. data/app/views/cms/section_nodes/_link.html.erb +11 -0
  158. data/app/views/cms/section_nodes/_node.html.erb +34 -0
  159. data/app/views/cms/section_nodes/_page.html.erb +14 -0
  160. data/app/views/cms/section_nodes/_section.html.erb +12 -0
  161. data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
  162. data/app/views/cms/section_nodes/index.html.erb +31 -0
  163. data/app/views/cms/sections/_form.html.erb +58 -0
  164. data/app/views/cms/sections/_page.html.erb +4 -0
  165. data/app/views/cms/sections/_section.html.erb +8 -0
  166. data/app/views/cms/sections/destroy.js.rjs +2 -0
  167. data/app/views/cms/sections/edit.html.erb +10 -0
  168. data/app/views/cms/sections/file_browser.xml.builder +14 -0
  169. data/app/views/cms/sections/index.html.erb +23 -0
  170. data/app/views/cms/sections/new.html.erb +22 -0
  171. data/app/views/cms/sessions/new.html.erb +32 -0
  172. data/app/views/cms/shared/_admin_sidebar.html.erb +30 -0
  173. data/app/views/cms/shared/_exception.html.erb +6 -0
  174. data/app/views/cms/shared/_pagination.html.erb +31 -0
  175. data/app/views/cms/shared/_version_conflict_diff.html.erb +11 -0
  176. data/app/views/cms/shared/_version_conflict_error.html.erb +6 -0
  177. data/app/views/cms/shared/error.html.erb +40 -0
  178. data/app/views/cms/tags/_form.html.erb +1 -0
  179. data/app/views/cms/tags/render.html.erb +53 -0
  180. data/app/views/cms/tasks/new.html.erb +36 -0
  181. data/app/views/cms/toolbar/index.html.erb +12 -0
  182. data/app/views/cms/users/_form.html.erb +12 -0
  183. data/app/views/cms/users/_groups.html.erb +11 -0
  184. data/app/views/cms/users/_password.html.erb +8 -0
  185. data/app/views/cms/users/_toolbar.html.erb +20 -0
  186. data/app/views/cms/users/_user_fields.html.erb +20 -0
  187. data/app/views/cms/users/change_password.html.erb +19 -0
  188. data/app/views/cms/users/edit.html.erb +16 -0
  189. data/app/views/cms/users/index.html.erb +62 -0
  190. data/app/views/cms/users/new.html.erb +13 -0
  191. data/app/views/layouts/_cms_toolbar.html.erb +21 -0
  192. data/app/views/layouts/_page_toolbar.html.erb +86 -0
  193. data/app/views/layouts/application.html.erb +11 -0
  194. data/app/views/layouts/cms/_footer.erb +4 -0
  195. data/app/views/layouts/cms/_head.html.erb +21 -0
  196. data/app/views/layouts/cms/administration.html.erb +34 -0
  197. data/app/views/layouts/cms/application.html.erb +25 -0
  198. data/app/views/layouts/cms/content_library.html.erb +94 -0
  199. data/app/views/layouts/cms/dashboard.html.erb +16 -0
  200. data/app/views/layouts/cms/login.html.erb +30 -0
  201. data/app/views/layouts/cms/section_nodes.html.erb +20 -0
  202. data/app/views/layouts/cms/thickbox.html.erb +24 -0
  203. data/app/views/layouts/cms/toolbar.html.erb +23 -0
  204. data/app/views/portlets/dynamic/_form.html.erb +3 -0
  205. data/app/views/portlets/email_page/_form.html.erb +7 -0
  206. data/app/views/portlets/email_page/render.html.erb +17 -0
  207. data/app/views/portlets/login/_form.html.erb +6 -0
  208. data/app/views/portlets/login/render.html.erb +27 -0
  209. data/app/views/portlets/portlets/_form.html.erb +19 -0
  210. data/app/views/portlets/tag_cloud/_form.html.erb +4 -0
  211. data/app/views/portlets/tag_cloud/render.html.erb +5 -0
  212. data/db/demo/data.rb +96 -0
  213. data/db/demo/page_partials/_footer.html.erb +6 -0
  214. data/db/demo/page_partials/_header.html.erb +24 -0
  215. data/db/demo/page_templates/home_page.html.erb +49 -0
  216. data/db/demo/page_templates/sub_page.html.erb +37 -0
  217. data/db/migrate/20080815014337_create_users.rb +24 -0
  218. data/db/migrate/20080815014733_create_dynamic_views.rb +17 -0
  219. data/db/migrate/20080815014735_create_pages.rb +21 -0
  220. data/db/migrate/20080815014736_create_content_type_groups.rb +14 -0
  221. data/db/migrate/20080815014737_create_content_types.rb +14 -0
  222. data/db/migrate/20080815014738_create_category_types.rb +14 -0
  223. data/db/migrate/20080815014739_create_categories.rb +16 -0
  224. data/db/migrate/20080815214539_create_connectors.rb +19 -0
  225. data/db/migrate/20080815220350_create_html_blocks.rb +13 -0
  226. data/db/migrate/20080819193254_create_sections.rb +15 -0
  227. data/db/migrate/20080819213733_create_portlets.rb +25 -0
  228. data/db/migrate/20080917222336_create_redirects.rb +14 -0
  229. data/db/migrate/20080922203815_create_attachments.rb +16 -0
  230. data/db/migrate/20080922215729_create_file_blocks.rb +16 -0
  231. data/db/migrate/20081007190155_create_group_types.rb +15 -0
  232. data/db/migrate/20081007190156_create_groups.rb +20 -0
  233. data/db/migrate/20081008182341_create_permissions.rb +28 -0
  234. data/db/migrate/20081009202349_create_group_sections.rb +12 -0
  235. data/db/migrate/20081013181547_create_sites.rb +15 -0
  236. data/db/migrate/20081020152051_create_section_nodes.rb +16 -0
  237. data/db/migrate/20081031140510_create_links.rb +15 -0
  238. data/db/migrate/20081031140511_create_tags.rb +14 -0
  239. data/db/migrate/20081031140512_create_taggings.rb +16 -0
  240. data/db/migrate/20081114172307_load_seed_data.rb +92 -0
  241. data/db/migrate/20090130171546_create_email_messages.rb +20 -0
  242. data/db/migrate/20090212164201_create_tasks.rb +18 -0
  243. data/db/migrate/20090410193133_create_page_routes.rb +16 -0
  244. data/db/migrate/20090410193312_create_page_route_options.rb +16 -0
  245. data/lib/acts_as_list.rb +252 -0
  246. data/lib/browser_cms.rb +12 -0
  247. data/lib/cms/acts/content_block.rb +31 -0
  248. data/lib/cms/authentication/controller.rb +194 -0
  249. data/lib/cms/authentication/model.rb +116 -0
  250. data/lib/cms/behaviors/archiving.rb +43 -0
  251. data/lib/cms/behaviors/attaching.rb +179 -0
  252. data/lib/cms/behaviors/categorizing.rb +31 -0
  253. data/lib/cms/behaviors/connecting.rb +94 -0
  254. data/lib/cms/behaviors/dynamic_attributes.rb +362 -0
  255. data/lib/cms/behaviors/flush_cache_on_change.rb +33 -0
  256. data/lib/cms/behaviors/hiding.rb +46 -0
  257. data/lib/cms/behaviors/pagination.rb +209 -0
  258. data/lib/cms/behaviors/publishing.rb +84 -0
  259. data/lib/cms/behaviors/rendering.rb +133 -0
  260. data/lib/cms/behaviors/searching.rb +49 -0
  261. data/lib/cms/behaviors/soft_deleting.rb +73 -0
  262. data/lib/cms/behaviors/taggable.rb +56 -0
  263. data/lib/cms/behaviors/userstamping.rb +37 -0
  264. data/lib/cms/behaviors/versioning.rb +172 -0
  265. data/lib/cms/behaviors.rb +33 -0
  266. data/lib/cms/caching.rb +20 -0
  267. data/lib/cms/data_loader.rb +28 -0
  268. data/lib/cms/extensions/action_view/base.rb +13 -0
  269. data/lib/cms/extensions/active_record/base.rb +16 -0
  270. data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +63 -0
  271. data/lib/cms/extensions/active_record/errors.rb +12 -0
  272. data/lib/cms/extensions/active_support/cache/file_store.rb +9 -0
  273. data/lib/cms/extensions/hash.rb +21 -0
  274. data/lib/cms/extensions/integer.rb +16 -0
  275. data/lib/cms/extensions/nil.rb +19 -0
  276. data/lib/cms/extensions/string.rb +19 -0
  277. data/lib/cms/extensions.rb +4 -0
  278. data/lib/cms/init.rb +85 -0
  279. data/lib/cms/routes.rb +131 -0
  280. data/lib/initial_data.rb +30 -0
  281. data/lib/sequence.rb +6 -0
  282. data/lib/tasks/cms.rake +94 -0
  283. data/lib/tasks/db.rake +67 -0
  284. data/lib/tasks/dev.rake +20 -0
  285. data/public/fckeditor/editor/css/behaviors/disablehandles.htc +15 -0
  286. data/public/fckeditor/editor/css/behaviors/showtableborders.htc +36 -0
  287. data/public/fckeditor/editor/css/fck_editorarea.css +110 -0
  288. data/public/fckeditor/editor/css/fck_internal.css +199 -0
  289. data/public/fckeditor/editor/css/fck_showtableborders_gecko.css +49 -0
  290. data/public/fckeditor/editor/css/images/block_address.png +0 -0
  291. data/public/fckeditor/editor/css/images/block_blockquote.png +0 -0
  292. data/public/fckeditor/editor/css/images/block_div.png +0 -0
  293. data/public/fckeditor/editor/css/images/block_h1.png +0 -0
  294. data/public/fckeditor/editor/css/images/block_h2.png +0 -0
  295. data/public/fckeditor/editor/css/images/block_h3.png +0 -0
  296. data/public/fckeditor/editor/css/images/block_h4.png +0 -0
  297. data/public/fckeditor/editor/css/images/block_h5.png +0 -0
  298. data/public/fckeditor/editor/css/images/block_h6.png +0 -0
  299. data/public/fckeditor/editor/css/images/block_p.png +0 -0
  300. data/public/fckeditor/editor/css/images/block_pre.png +0 -0
  301. data/public/fckeditor/editor/css/images/fck_anchor.gif +0 -0
  302. data/public/fckeditor/editor/css/images/fck_flashlogo.gif +0 -0
  303. data/public/fckeditor/editor/css/images/fck_hiddenfield.gif +0 -0
  304. data/public/fckeditor/editor/css/images/fck_pagebreak.gif +0 -0
  305. data/public/fckeditor/editor/css/images/fck_plugin.gif +0 -0
  306. data/public/fckeditor/editor/dialog/common/fck_dialog_common.css +85 -0
  307. data/public/fckeditor/editor/dialog/common/fck_dialog_common.js +311 -0
  308. data/public/fckeditor/editor/dialog/common/images/locked.gif +0 -0
  309. data/public/fckeditor/editor/dialog/common/images/reset.gif +0 -0
  310. data/public/fckeditor/editor/dialog/common/images/unlocked.gif +0 -0
  311. data/public/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif +0 -0
  312. data/public/fckeditor/editor/dialog/fck_about/logo_fredck.gif +0 -0
  313. data/public/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif +0 -0
  314. data/public/fckeditor/editor/dialog/fck_about.html +161 -0
  315. data/public/fckeditor/editor/dialog/fck_anchor.html +220 -0
  316. data/public/fckeditor/editor/dialog/fck_button.html +104 -0
  317. data/public/fckeditor/editor/dialog/fck_checkbox.html +104 -0
  318. data/public/fckeditor/editor/dialog/fck_colorselector.html +172 -0
  319. data/public/fckeditor/editor/dialog/fck_div.html +364 -0
  320. data/public/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html +113 -0
  321. data/public/fckeditor/editor/dialog/fck_docprops.html +600 -0
  322. data/public/fckeditor/editor/dialog/fck_flash/fck_flash.js +300 -0
  323. data/public/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html +50 -0
  324. data/public/fckeditor/editor/dialog/fck_flash.html +152 -0
  325. data/public/fckeditor/editor/dialog/fck_form.html +109 -0
  326. data/public/fckeditor/editor/dialog/fck_hiddenfield.html +115 -0
  327. data/public/fckeditor/editor/dialog/fck_image/fck_image.js +512 -0
  328. data/public/fckeditor/editor/dialog/fck_image/fck_image_preview.html +72 -0
  329. data/public/fckeditor/editor/dialog/fck_image.html +258 -0
  330. data/public/fckeditor/editor/dialog/fck_link/fck_link.js +893 -0
  331. data/public/fckeditor/editor/dialog/fck_link.html +295 -0
  332. data/public/fckeditor/editor/dialog/fck_listprop.html +120 -0
  333. data/public/fckeditor/editor/dialog/fck_paste.html +346 -0
  334. data/public/fckeditor/editor/dialog/fck_radiobutton.html +104 -0
  335. data/public/fckeditor/editor/dialog/fck_replace.html +648 -0
  336. data/public/fckeditor/editor/dialog/fck_select/fck_select.js +194 -0
  337. data/public/fckeditor/editor/dialog/fck_select.html +180 -0
  338. data/public/fckeditor/editor/dialog/fck_smiley.html +111 -0
  339. data/public/fckeditor/editor/dialog/fck_source.html +68 -0
  340. data/public/fckeditor/editor/dialog/fck_specialchar.html +121 -0
  341. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html +0 -0
  342. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js +87 -0
  343. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html +153 -0
  344. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm +148 -0
  345. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php +199 -0
  346. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl +181 -0
  347. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js +461 -0
  348. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html +71 -0
  349. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css +49 -0
  350. data/public/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js +272 -0
  351. data/public/fckeditor/editor/dialog/fck_spellerpages.html +70 -0
  352. data/public/fckeditor/editor/dialog/fck_table.html +298 -0
  353. data/public/fckeditor/editor/dialog/fck_tablecell.html +257 -0
  354. data/public/fckeditor/editor/dialog/fck_template/images/template1.gif +0 -0
  355. data/public/fckeditor/editor/dialog/fck_template/images/template2.gif +0 -0
  356. data/public/fckeditor/editor/dialog/fck_template/images/template3.gif +0 -0
  357. data/public/fckeditor/editor/dialog/fck_template.html +242 -0
  358. data/public/fckeditor/editor/dialog/fck_textarea.html +94 -0
  359. data/public/fckeditor/editor/dialog/fck_textfield.html +136 -0
  360. data/public/fckeditor/editor/dtd/fck_dtd_test.html +41 -0
  361. data/public/fckeditor/editor/dtd/fck_xhtml10strict.js +116 -0
  362. data/public/fckeditor/editor/dtd/fck_xhtml10transitional.js +140 -0
  363. data/public/fckeditor/editor/fckdebug.html +153 -0
  364. data/public/fckeditor/editor/fckdialog.html +812 -0
  365. data/public/fckeditor/editor/fckeditor.html +317 -0
  366. data/public/fckeditor/editor/fckeditor.original.html +424 -0
  367. data/public/fckeditor/editor/filemanager/browser/default/browser.css +87 -0
  368. data/public/fckeditor/editor/filemanager/browser/default/browser.html +200 -0
  369. data/public/fckeditor/editor/filemanager/browser/default/frmactualfolder.html +95 -0
  370. data/public/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html +114 -0
  371. data/public/fckeditor/editor/filemanager/browser/default/frmfolders.html +198 -0
  372. data/public/fckeditor/editor/filemanager/browser/default/frmresourceslist.html +169 -0
  373. data/public/fckeditor/editor/filemanager/browser/default/frmresourcetype.html +68 -0
  374. data/public/fckeditor/editor/filemanager/browser/default/frmupload.html +115 -0
  375. data/public/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif +0 -0
  376. data/public/fckeditor/editor/filemanager/browser/default/images/Folder.gif +0 -0
  377. data/public/fckeditor/editor/filemanager/browser/default/images/Folder32.gif +0 -0
  378. data/public/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif +0 -0
  379. data/public/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif +0 -0
  380. data/public/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif +0 -0
  381. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif +0 -0
  382. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif +0 -0
  383. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif +0 -0
  384. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif +0 -0
  385. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif +0 -0
  386. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif +0 -0
  387. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif +0 -0
  388. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif +0 -0
  389. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif +0 -0
  390. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif +0 -0
  391. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif +0 -0
  392. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif +0 -0
  393. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif +0 -0
  394. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif +0 -0
  395. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif +0 -0
  396. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif +0 -0
  397. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif +0 -0
  398. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif +0 -0
  399. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif +0 -0
  400. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif +0 -0
  401. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif +0 -0
  402. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif +0 -0
  403. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif +0 -0
  404. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif +0 -0
  405. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif +0 -0
  406. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif +0 -0
  407. data/public/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif +0 -0
  408. data/public/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif +0 -0
  409. data/public/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif +0 -0
  410. data/public/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif +0 -0
  411. data/public/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif +0 -0
  412. data/public/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif +0 -0
  413. data/public/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif +0 -0
  414. data/public/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif +0 -0
  415. data/public/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif +0 -0
  416. data/public/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif +0 -0
  417. data/public/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif +0 -0
  418. data/public/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif +0 -0
  419. data/public/fckeditor/editor/filemanager/browser/default/images/icons/html.gif +0 -0
  420. data/public/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif +0 -0
  421. data/public/fckeditor/editor/filemanager/browser/default/images/icons/js.gif +0 -0
  422. data/public/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif +0 -0
  423. data/public/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif +0 -0
  424. data/public/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif +0 -0
  425. data/public/fckeditor/editor/filemanager/browser/default/images/icons/png.gif +0 -0
  426. data/public/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif +0 -0
  427. data/public/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif +0 -0
  428. data/public/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif +0 -0
  429. data/public/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif +0 -0
  430. data/public/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif +0 -0
  431. data/public/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif +0 -0
  432. data/public/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif +0 -0
  433. data/public/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif +0 -0
  434. data/public/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif +0 -0
  435. data/public/fckeditor/editor/filemanager/browser/default/images/spacer.gif +0 -0
  436. data/public/fckeditor/editor/filemanager/browser/default/js/common.js +88 -0
  437. data/public/fckeditor/editor/filemanager/browser/default/js/fckxml.js +147 -0
  438. data/public/fckeditor/editor/images/anchor.gif +0 -0
  439. data/public/fckeditor/editor/images/arrow_ltr.gif +0 -0
  440. data/public/fckeditor/editor/images/arrow_rtl.gif +0 -0
  441. data/public/fckeditor/editor/images/smiley/msn/angel_smile.gif +0 -0
  442. data/public/fckeditor/editor/images/smiley/msn/angry_smile.gif +0 -0
  443. data/public/fckeditor/editor/images/smiley/msn/broken_heart.gif +0 -0
  444. data/public/fckeditor/editor/images/smiley/msn/cake.gif +0 -0
  445. data/public/fckeditor/editor/images/smiley/msn/confused_smile.gif +0 -0
  446. data/public/fckeditor/editor/images/smiley/msn/cry_smile.gif +0 -0
  447. data/public/fckeditor/editor/images/smiley/msn/devil_smile.gif +0 -0
  448. data/public/fckeditor/editor/images/smiley/msn/embaressed_smile.gif +0 -0
  449. data/public/fckeditor/editor/images/smiley/msn/envelope.gif +0 -0
  450. data/public/fckeditor/editor/images/smiley/msn/heart.gif +0 -0
  451. data/public/fckeditor/editor/images/smiley/msn/kiss.gif +0 -0
  452. data/public/fckeditor/editor/images/smiley/msn/lightbulb.gif +0 -0
  453. data/public/fckeditor/editor/images/smiley/msn/omg_smile.gif +0 -0
  454. data/public/fckeditor/editor/images/smiley/msn/regular_smile.gif +0 -0
  455. data/public/fckeditor/editor/images/smiley/msn/sad_smile.gif +0 -0
  456. data/public/fckeditor/editor/images/smiley/msn/shades_smile.gif +0 -0
  457. data/public/fckeditor/editor/images/smiley/msn/teeth_smile.gif +0 -0
  458. data/public/fckeditor/editor/images/smiley/msn/thumbs_down.gif +0 -0
  459. data/public/fckeditor/editor/images/smiley/msn/thumbs_up.gif +0 -0
  460. data/public/fckeditor/editor/images/smiley/msn/tounge_smile.gif +0 -0
  461. data/public/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif +0 -0
  462. data/public/fckeditor/editor/images/smiley/msn/wink_smile.gif +0 -0
  463. data/public/fckeditor/editor/images/spacer.gif +0 -0
  464. data/public/fckeditor/editor/js/fckadobeair.js +176 -0
  465. data/public/fckeditor/editor/js/fckeditorcode_gecko.js +108 -0
  466. data/public/fckeditor/editor/js/fckeditorcode_ie.js +109 -0
  467. data/public/fckeditor/editor/lang/_translationstatus.txt +78 -0
  468. data/public/fckeditor/editor/lang/af.js +526 -0
  469. data/public/fckeditor/editor/lang/ar.js +526 -0
  470. data/public/fckeditor/editor/lang/bg.js +526 -0
  471. data/public/fckeditor/editor/lang/bn.js +526 -0
  472. data/public/fckeditor/editor/lang/bs.js +526 -0
  473. data/public/fckeditor/editor/lang/ca.js +526 -0
  474. data/public/fckeditor/editor/lang/cs.js +526 -0
  475. data/public/fckeditor/editor/lang/da.js +526 -0
  476. data/public/fckeditor/editor/lang/de.js +526 -0
  477. data/public/fckeditor/editor/lang/el.js +526 -0
  478. data/public/fckeditor/editor/lang/en-au.js +526 -0
  479. data/public/fckeditor/editor/lang/en-ca.js +526 -0
  480. data/public/fckeditor/editor/lang/en-uk.js +526 -0
  481. data/public/fckeditor/editor/lang/en.js +526 -0
  482. data/public/fckeditor/editor/lang/eo.js +526 -0
  483. data/public/fckeditor/editor/lang/es.js +526 -0
  484. data/public/fckeditor/editor/lang/et.js +526 -0
  485. data/public/fckeditor/editor/lang/eu.js +527 -0
  486. data/public/fckeditor/editor/lang/fa.js +526 -0
  487. data/public/fckeditor/editor/lang/fi.js +526 -0
  488. data/public/fckeditor/editor/lang/fo.js +526 -0
  489. data/public/fckeditor/editor/lang/fr-ca.js +526 -0
  490. data/public/fckeditor/editor/lang/fr.js +526 -0
  491. data/public/fckeditor/editor/lang/gl.js +526 -0
  492. data/public/fckeditor/editor/lang/gu.js +526 -0
  493. data/public/fckeditor/editor/lang/he.js +526 -0
  494. data/public/fckeditor/editor/lang/hi.js +526 -0
  495. data/public/fckeditor/editor/lang/hr.js +526 -0
  496. data/public/fckeditor/editor/lang/hu.js +526 -0
  497. data/public/fckeditor/editor/lang/it.js +526 -0
  498. data/public/fckeditor/editor/lang/ja.js +526 -0
  499. data/public/fckeditor/editor/lang/km.js +526 -0
  500. data/public/fckeditor/editor/lang/ko.js +526 -0
  501. data/public/fckeditor/editor/lang/lt.js +526 -0
  502. data/public/fckeditor/editor/lang/lv.js +526 -0
  503. data/public/fckeditor/editor/lang/mn.js +526 -0
  504. data/public/fckeditor/editor/lang/ms.js +526 -0
  505. data/public/fckeditor/editor/lang/nb.js +526 -0
  506. data/public/fckeditor/editor/lang/nl.js +526 -0
  507. data/public/fckeditor/editor/lang/no.js +526 -0
  508. data/public/fckeditor/editor/lang/pl.js +526 -0
  509. data/public/fckeditor/editor/lang/pt-br.js +526 -0
  510. data/public/fckeditor/editor/lang/pt.js +526 -0
  511. data/public/fckeditor/editor/lang/ro.js +526 -0
  512. data/public/fckeditor/editor/lang/ru.js +526 -0
  513. data/public/fckeditor/editor/lang/sk.js +526 -0
  514. data/public/fckeditor/editor/lang/sl.js +526 -0
  515. data/public/fckeditor/editor/lang/sr-latn.js +526 -0
  516. data/public/fckeditor/editor/lang/sr.js +526 -0
  517. data/public/fckeditor/editor/lang/sv.js +526 -0
  518. data/public/fckeditor/editor/lang/th.js +526 -0
  519. data/public/fckeditor/editor/lang/tr.js +526 -0
  520. data/public/fckeditor/editor/lang/uk.js +526 -0
  521. data/public/fckeditor/editor/lang/vi.js +526 -0
  522. data/public/fckeditor/editor/lang/zh-cn.js +526 -0
  523. data/public/fckeditor/editor/lang/zh.js +526 -0
  524. data/public/fckeditor/editor/plugins/autogrow/fckplugin.js +99 -0
  525. data/public/fckeditor/editor/plugins/bbcode/_sample/sample.config.js +26 -0
  526. data/public/fckeditor/editor/plugins/bbcode/_sample/sample.html +67 -0
  527. data/public/fckeditor/editor/plugins/bbcode/fckplugin.js +123 -0
  528. data/public/fckeditor/editor/plugins/dragresizetable/fckplugin.js +524 -0
  529. data/public/fckeditor/editor/plugins/placeholder/fck_placeholder.html +105 -0
  530. data/public/fckeditor/editor/plugins/placeholder/fckplugin.js +187 -0
  531. data/public/fckeditor/editor/plugins/placeholder/lang/de.js +27 -0
  532. data/public/fckeditor/editor/plugins/placeholder/lang/en.js +27 -0
  533. data/public/fckeditor/editor/plugins/placeholder/lang/es.js +27 -0
  534. data/public/fckeditor/editor/plugins/placeholder/lang/fr.js +27 -0
  535. data/public/fckeditor/editor/plugins/placeholder/lang/it.js +27 -0
  536. data/public/fckeditor/editor/plugins/placeholder/lang/pl.js +27 -0
  537. data/public/fckeditor/editor/plugins/placeholder/placeholder.gif +0 -0
  538. data/public/fckeditor/editor/plugins/simplecommands/fckplugin.js +29 -0
  539. data/public/fckeditor/editor/plugins/tablecommands/fckplugin.js +33 -0
  540. data/public/fckeditor/editor/skins/_fckviewstrips.html +121 -0
  541. data/public/fckeditor/editor/skins/default/fck_dialog.css +402 -0
  542. data/public/fckeditor/editor/skins/default/fck_dialog_ie6.js +110 -0
  543. data/public/fckeditor/editor/skins/default/fck_editor.css +464 -0
  544. data/public/fckeditor/editor/skins/default/fck_strip.gif +0 -0
  545. data/public/fckeditor/editor/skins/default/images/dialog.sides.gif +0 -0
  546. data/public/fckeditor/editor/skins/default/images/dialog.sides.png +0 -0
  547. data/public/fckeditor/editor/skins/default/images/dialog.sides.rtl.png +0 -0
  548. data/public/fckeditor/editor/skins/default/images/sprites.gif +0 -0
  549. data/public/fckeditor/editor/skins/default/images/sprites.png +0 -0
  550. data/public/fckeditor/editor/skins/default/images/toolbar.arrowright.gif +0 -0
  551. data/public/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif +0 -0
  552. data/public/fckeditor/editor/skins/default/images/toolbar.collapse.gif +0 -0
  553. data/public/fckeditor/editor/skins/default/images/toolbar.end.gif +0 -0
  554. data/public/fckeditor/editor/skins/default/images/toolbar.expand.gif +0 -0
  555. data/public/fckeditor/editor/skins/default/images/toolbar.separator.gif +0 -0
  556. data/public/fckeditor/editor/skins/default/images/toolbar.start.gif +0 -0
  557. data/public/fckeditor/editor/skins/office2003/fck_dialog.css +402 -0
  558. data/public/fckeditor/editor/skins/office2003/fck_dialog_ie6.js +110 -0
  559. data/public/fckeditor/editor/skins/office2003/fck_editor.css +476 -0
  560. data/public/fckeditor/editor/skins/office2003/fck_strip.gif +0 -0
  561. data/public/fckeditor/editor/skins/office2003/images/dialog.sides.gif +0 -0
  562. data/public/fckeditor/editor/skins/office2003/images/dialog.sides.png +0 -0
  563. data/public/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png +0 -0
  564. data/public/fckeditor/editor/skins/office2003/images/sprites.gif +0 -0
  565. data/public/fckeditor/editor/skins/office2003/images/sprites.png +0 -0
  566. data/public/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif +0 -0
  567. data/public/fckeditor/editor/skins/office2003/images/toolbar.bg.gif +0 -0
  568. data/public/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif +0 -0
  569. data/public/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif +0 -0
  570. data/public/fckeditor/editor/skins/office2003/images/toolbar.end.gif +0 -0
  571. data/public/fckeditor/editor/skins/office2003/images/toolbar.expand.gif +0 -0
  572. data/public/fckeditor/editor/skins/office2003/images/toolbar.separator.gif +0 -0
  573. data/public/fckeditor/editor/skins/office2003/images/toolbar.start.gif +0 -0
  574. data/public/fckeditor/editor/skins/silver/fck_dialog.css +402 -0
  575. data/public/fckeditor/editor/skins/silver/fck_dialog_ie6.js +110 -0
  576. data/public/fckeditor/editor/skins/silver/fck_editor.css +473 -0
  577. data/public/fckeditor/editor/skins/silver/fck_strip.gif +0 -0
  578. data/public/fckeditor/editor/skins/silver/images/dialog.sides.gif +0 -0
  579. data/public/fckeditor/editor/skins/silver/images/dialog.sides.png +0 -0
  580. data/public/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png +0 -0
  581. data/public/fckeditor/editor/skins/silver/images/sprites.gif +0 -0
  582. data/public/fckeditor/editor/skins/silver/images/sprites.png +0 -0
  583. data/public/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif +0 -0
  584. data/public/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif +0 -0
  585. data/public/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif +0 -0
  586. data/public/fckeditor/editor/skins/silver/images/toolbar.collapse.gif +0 -0
  587. data/public/fckeditor/editor/skins/silver/images/toolbar.end.gif +0 -0
  588. data/public/fckeditor/editor/skins/silver/images/toolbar.expand.gif +0 -0
  589. data/public/fckeditor/editor/skins/silver/images/toolbar.separator.gif +0 -0
  590. data/public/fckeditor/editor/skins/silver/images/toolbar.start.gif +0 -0
  591. data/public/fckeditor/fckconfig.js +364 -0
  592. data/public/fckeditor/fckdebug.html +153 -0
  593. data/public/fckeditor/fckdialog.html +812 -0
  594. data/public/fckeditor/fckeditor.html +317 -0
  595. data/public/fckeditor/fckeditor.js +328 -0
  596. data/public/fckeditor/fckeditor.original.html +424 -0
  597. data/public/fckeditor/fckpackager.xml +262 -0
  598. data/public/fckeditor/fckstyles.xml +111 -0
  599. data/public/fckeditor/fcktemplates.xml +103 -0
  600. data/public/images/cms/administration/user_browser_bg.gif +0 -0
  601. data/public/images/cms/bg.png +0 -0
  602. data/public/images/cms/bl_curve.png +0 -0
  603. data/public/images/cms/bottom_cap.png +0 -0
  604. data/public/images/cms/bottom_cap_content.png +0 -0
  605. data/public/images/cms/browse.gif +0 -0
  606. data/public/images/cms/browser_media_logo.png +0 -0
  607. data/public/images/cms/browsercms_logo.png +0 -0
  608. data/public/images/cms/buttons/button.png +0 -0
  609. data/public/images/cms/buttons/button_bg.png +0 -0
  610. data/public/images/cms/buttons/button_cap.png +0 -0
  611. data/public/images/cms/buttons/button_cap_h.png +0 -0
  612. data/public/images/cms/buttons/button_cap_off.gif +0 -0
  613. data/public/images/cms/buttons/button_h.png +0 -0
  614. data/public/images/cms/buttons/button_off.png +0 -0
  615. data/public/images/cms/buttons/delete_x.png +0 -0
  616. data/public/images/cms/buttons/delete_x_disabled.png +0 -0
  617. data/public/images/cms/buttons/delete_x_h.png +0 -0
  618. data/public/images/cms/buttons/sm_button.gif +0 -0
  619. data/public/images/cms/buttons/sm_button_2.gif +0 -0
  620. data/public/images/cms/buttons/sm_button_2_h.gif +0 -0
  621. data/public/images/cms/buttons/sm_button_h.gif +0 -0
  622. data/public/images/cms/containers/add.gif +0 -0
  623. data/public/images/cms/containers/alpha.png +0 -0
  624. data/public/images/cms/containers/beta.png +0 -0
  625. data/public/images/cms/containers/delete.gif +0 -0
  626. data/public/images/cms/containers/down.gif +0 -0
  627. data/public/images/cms/containers/edit.gif +0 -0
  628. data/public/images/cms/containers/up.gif +0 -0
  629. data/public/images/cms/containers/view.gif +0 -0
  630. data/public/images/cms/content_bg.gif +0 -0
  631. data/public/images/cms/dashboard/bottom_cap.png +0 -0
  632. data/public/images/cms/dashboard/bottom_cap_content.png +0 -0
  633. data/public/images/cms/dashboard/header_bg.gif +0 -0
  634. data/public/images/cms/dashboard/header_left_bg.gif +0 -0
  635. data/public/images/cms/dashboard/table_header_bg.gif +0 -0
  636. data/public/images/cms/dashboard/top_cap.png +0 -0
  637. data/public/images/cms/dashed.gif +0 -0
  638. data/public/images/cms/datepicker/clear.gif +0 -0
  639. data/public/images/cms/datepicker/close.gif +0 -0
  640. data/public/images/cms/dk_button_l.gif +0 -0
  641. data/public/images/cms/dk_button_r.gif +0 -0
  642. data/public/images/cms/dot.png +0 -0
  643. data/public/images/cms/draft_status.gif +0 -0
  644. data/public/images/cms/gray_long_bg.gif +0 -0
  645. data/public/images/cms/icons/actions/add.png +0 -0
  646. data/public/images/cms/icons/actions/config.png +0 -0
  647. data/public/images/cms/icons/actions/connect.png +0 -0
  648. data/public/images/cms/icons/actions/delete.png +0 -0
  649. data/public/images/cms/icons/actions/down.png +0 -0
  650. data/public/images/cms/icons/actions/edit.png +0 -0
  651. data/public/images/cms/icons/actions/folder.png +0 -0
  652. data/public/images/cms/icons/actions/folder_add.png +0 -0
  653. data/public/images/cms/icons/actions/folder_delete.png +0 -0
  654. data/public/images/cms/icons/actions/folder_edit.png +0 -0
  655. data/public/images/cms/icons/actions/folder_move.png +0 -0
  656. data/public/images/cms/icons/actions/folder_open.png +0 -0
  657. data/public/images/cms/icons/actions/history.png +0 -0
  658. data/public/images/cms/icons/actions/home.png +0 -0
  659. data/public/images/cms/icons/actions/left.png +0 -0
  660. data/public/images/cms/icons/actions/link.png +0 -0
  661. data/public/images/cms/icons/actions/page.png +0 -0
  662. data/public/images/cms/icons/actions/page_add.png +0 -0
  663. data/public/images/cms/icons/actions/page_edit.png +0 -0
  664. data/public/images/cms/icons/actions/page_move.png +0 -0
  665. data/public/images/cms/icons/actions/redo.png +0 -0
  666. data/public/images/cms/icons/actions/refresh.png +0 -0
  667. data/public/images/cms/icons/actions/right.png +0 -0
  668. data/public/images/cms/icons/actions/root_folder.png +0 -0
  669. data/public/images/cms/icons/actions/root_link.png +0 -0
  670. data/public/images/cms/icons/actions/root_page.png +0 -0
  671. data/public/images/cms/icons/actions/undo.png +0 -0
  672. data/public/images/cms/icons/actions/up.png +0 -0
  673. data/public/images/cms/icons/actions/view.png +0 -0
  674. data/public/images/cms/icons/file_types/doc.png +0 -0
  675. data/public/images/cms/icons/file_types/file.png +0 -0
  676. data/public/images/cms/icons/file_types/gif.png +0 -0
  677. data/public/images/cms/icons/file_types/htm.png +0 -0
  678. data/public/images/cms/icons/file_types/pdf.png +0 -0
  679. data/public/images/cms/icons/file_types/ppt.png +0 -0
  680. data/public/images/cms/icons/file_types/swf.png +0 -0
  681. data/public/images/cms/icons/file_types/txt.png +0 -0
  682. data/public/images/cms/icons/file_types/xls.png +0 -0
  683. data/public/images/cms/icons/file_types/xml.png +0 -0
  684. data/public/images/cms/icons/file_types/zip.png +0 -0
  685. data/public/images/cms/icons/status/archived.gif +0 -0
  686. data/public/images/cms/icons/status/draft.gif +0 -0
  687. data/public/images/cms/icons/status/hidden.gif +0 -0
  688. data/public/images/cms/icons/status/locked.gif +0 -0
  689. data/public/images/cms/icons/status/published.gif +0 -0
  690. data/public/images/cms/icons/status/unlocked.gif +0 -0
  691. data/public/images/cms/icons/user.png +0 -0
  692. data/public/images/cms/login_bg.jpg +0 -0
  693. data/public/images/cms/login_bottom.jpg +0 -0
  694. data/public/images/cms/login_top.gif +0 -0
  695. data/public/images/cms/lt_button_bg.gif +0 -0
  696. data/public/images/cms/lt_button_l.gif +0 -0
  697. data/public/images/cms/lt_button_r.gif +0 -0
  698. data/public/images/cms/menu/block_cap_h.gif +0 -0
  699. data/public/images/cms/menu/bottom_cap.png +0 -0
  700. data/public/images/cms/menu/bottom_cap_menu.png +0 -0
  701. data/public/images/cms/menu/bottom_cap_menu_first.png +0 -0
  702. data/public/images/cms/menu/menu_header_first_bg.gif +0 -0
  703. data/public/images/cms/menu/selected_block_cap.gif +0 -0
  704. data/public/images/cms/menu/top_cap.png +0 -0
  705. data/public/images/cms/menu/top_cap_menu_header.png +0 -0
  706. data/public/images/cms/menu.png +0 -0
  707. data/public/images/cms/menu_h.gif +0 -0
  708. data/public/images/cms/menu_header.png +0 -0
  709. data/public/images/cms/menu_open.png +0 -0
  710. data/public/images/cms/menu_open_bg.gif +0 -0
  711. data/public/images/cms/nav/on_bg.gif +0 -0
  712. data/public/images/cms/nav.png +0 -0
  713. data/public/images/cms/nav_cap.png +0 -0
  714. data/public/images/cms/nav_cap_h.gif +0 -0
  715. data/public/images/cms/nav_h.gif +0 -0
  716. data/public/images/cms/page_toolbar/page_toolbar_bg.gif +0 -0
  717. data/public/images/cms/page_toolbar/page_toolbar_inset_bg.gif +0 -0
  718. data/public/images/cms/page_toolbar/page_toolbar_inset_draft_bg.gif +0 -0
  719. data/public/images/cms/page_toolbar/page_toolbar_inset_draft_l.gif +0 -0
  720. data/public/images/cms/page_toolbar/page_toolbar_inset_draft_r.gif +0 -0
  721. data/public/images/cms/page_toolbar/page_toolbar_inset_l.gif +0 -0
  722. data/public/images/cms/page_toolbar/page_toolbar_inset_published_bg.gif +0 -0
  723. data/public/images/cms/page_toolbar/page_toolbar_inset_published_l.gif +0 -0
  724. data/public/images/cms/page_toolbar/page_toolbar_inset_published_r.gif +0 -0
  725. data/public/images/cms/page_toolbar/page_toolbar_inset_r.gif +0 -0
  726. data/public/images/cms/page_toolbar/page_toolbar_l.gif +0 -0
  727. data/public/images/cms/page_toolbar/page_toolbar_r.gif +0 -0
  728. data/public/images/cms/page_toolbar/status_draft_bg.gif +0 -0
  729. data/public/images/cms/page_toolbar/status_draft_l.gif +0 -0
  730. data/public/images/cms/page_toolbar/status_l.gif +0 -0
  731. data/public/images/cms/page_toolbar/status_published_bg.gif +0 -0
  732. data/public/images/cms/page_toolbar/status_published_l.gif +0 -0
  733. data/public/images/cms/page_toolbar/visual_editor_bg.gif +0 -0
  734. data/public/images/cms/page_toolbar/visual_editor_end.gif +0 -0
  735. data/public/images/cms/page_toolbar/visual_editor_r.gif +0 -0
  736. data/public/images/cms/page_toolbar/visual_editor_state_bg.gif +0 -0
  737. data/public/images/cms/pages/add_connectable.gif +0 -0
  738. data/public/images/cms/pages/connect_connectable.gif +0 -0
  739. data/public/images/cms/pages/container_border.gif +0 -0
  740. data/public/images/cms/pages/container_border_l.gif +0 -0
  741. data/public/images/cms/pages/container_border_r.gif +0 -0
  742. data/public/images/cms/pages/delete_connectable.gif +0 -0
  743. data/public/images/cms/pages/down_connectable.gif +0 -0
  744. data/public/images/cms/pages/down_connectable_disabled.gif +0 -0
  745. data/public/images/cms/pages/edit_connectable.gif +0 -0
  746. data/public/images/cms/pages/edit_connectable_2.gif +0 -0
  747. data/public/images/cms/pages/show_connectable.gif +0 -0
  748. data/public/images/cms/pages/up_connectable.gif +0 -0
  749. data/public/images/cms/pages/up_connectable_disabled.gif +0 -0
  750. data/public/images/cms/pagination/first.gif +0 -0
  751. data/public/images/cms/pagination/first_h.gif +0 -0
  752. data/public/images/cms/pagination/input.gif +0 -0
  753. data/public/images/cms/pagination/last.gif +0 -0
  754. data/public/images/cms/pagination/last_h.gif +0 -0
  755. data/public/images/cms/pagination/next.gif +0 -0
  756. data/public/images/cms/pagination/next_h.gif +0 -0
  757. data/public/images/cms/pagination/previous.gif +0 -0
  758. data/public/images/cms/pagination/previous_h.gif +0 -0
  759. data/public/images/cms/published_status.gif +0 -0
  760. data/public/images/cms/search.png +0 -0
  761. data/public/images/cms/search_submit.gif +0 -0
  762. data/public/images/cms/search_submit_h.gif +0 -0
  763. data/public/images/cms/searchbox_gradient.gif +0 -0
  764. data/public/images/cms/select_bg.gif +0 -0
  765. data/public/images/cms/select_bg_2.gif +0 -0
  766. data/public/images/cms/sitemap/bottom_cap.png +0 -0
  767. data/public/images/cms/sitemap/buffer_caps.png +0 -0
  768. data/public/images/cms/sitemap/contract.png +0 -0
  769. data/public/images/cms/sitemap/corners.gif +0 -0
  770. data/public/images/cms/sitemap/corners_hover.gif +0 -0
  771. data/public/images/cms/sitemap/divider.gif +0 -0
  772. data/public/images/cms/sitemap/expand.png +0 -0
  773. data/public/images/cms/sitemap/gradient.gif +0 -0
  774. data/public/images/cms/sitemap/gray_contract.png +0 -0
  775. data/public/images/cms/sitemap/gray_expand.png +0 -0
  776. data/public/images/cms/sitemap/no_contents.png +0 -0
  777. data/public/images/cms/sitemap/site_root_cap.png +0 -0
  778. data/public/images/cms/sitemap/tooltip.gif +0 -0
  779. data/public/images/cms/sitemap/top_cap_content.png +0 -0
  780. data/public/images/cms/solid.gif +0 -0
  781. data/public/images/cms/table/bl.gif +0 -0
  782. data/public/images/cms/table/br.gif +0 -0
  783. data/public/images/cms/table/divider.gif +0 -0
  784. data/public/images/cms/table/td_cap_first_h.gif +0 -0
  785. data/public/images/cms/table/td_cap_first_s.gif +0 -0
  786. data/public/images/cms/table/td_cap_last_h.gif +0 -0
  787. data/public/images/cms/table/td_cap_last_s.gif +0 -0
  788. data/public/images/cms/table/td_last_bg.gif +0 -0
  789. data/public/images/cms/table/th_bg.gif +0 -0
  790. data/public/images/cms/table/th_divider.gif +0 -0
  791. data/public/images/cms/table/th_last_bg.gif +0 -0
  792. data/public/images/cms/table/tl.gif +0 -0
  793. data/public/images/cms/table/tr.gif +0 -0
  794. data/public/images/cms/table/tr_bg.gif +0 -0
  795. data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
  796. data/public/images/cms/thickbox/macFFBgHack.png +0 -0
  797. data/public/images/cms/toolbar_bg.png +0 -0
  798. data/public/images/cms/top_cap.png +0 -0
  799. data/public/images/cms/top_cap_content.png +0 -0
  800. data/public/images/cms/top_cap_menu_header.png +0 -0
  801. data/public/images/cms/user_search_submit.gif +0 -0
  802. data/public/images/cms/usercontrols_bg.png +0 -0
  803. data/public/images/cms/usercontrols_bg_cap.png +0 -0
  804. data/public/javascripts/cms/application.js +145 -0
  805. data/public/javascripts/cms/editor.js +56 -0
  806. data/public/javascripts/cms/sitemap.js +426 -0
  807. data/public/javascripts/jquery-ui.js +591 -0
  808. data/public/javascripts/jquery.contextMenu.js +211 -0
  809. data/public/javascripts/jquery.cookie.js +96 -0
  810. data/public/javascripts/jquery.dimensions.js +119 -0
  811. data/public/javascripts/jquery.js +11 -0
  812. data/public/javascripts/jquery.selectbox-0.5.js +209 -0
  813. data/public/javascripts/jquery.taglist.js +136 -0
  814. data/public/javascripts/jquery.thickbox.js +10 -0
  815. data/public/site/customconfig.js +1 -0
  816. data/public/stylesheets/cms/administration.css +91 -0
  817. data/public/stylesheets/cms/application.css +166 -0
  818. data/public/stylesheets/cms/block.css +26 -0
  819. data/public/stylesheets/cms/buttons.css +111 -0
  820. data/public/stylesheets/cms/content_library.css +138 -0
  821. data/public/stylesheets/cms/content_types.css +4 -0
  822. data/public/stylesheets/cms/dashboard.css +118 -0
  823. data/public/stylesheets/cms/data_table.css +156 -0
  824. data/public/stylesheets/cms/date_picker.css +73 -0
  825. data/public/stylesheets/cms/form_layout.css +255 -0
  826. data/public/stylesheets/cms/jquery.contextMenu.css +61 -0
  827. data/public/stylesheets/cms/login.css +78 -0
  828. data/public/stylesheets/cms/menu.css +116 -0
  829. data/public/stylesheets/cms/nav.css +111 -0
  830. data/public/stylesheets/cms/page_toolbar.css +135 -0
  831. data/public/stylesheets/cms/reset.css +46 -0
  832. data/public/stylesheets/cms/selectbox.css +56 -0
  833. data/public/stylesheets/cms/sitemap.css +374 -0
  834. data/public/stylesheets/cms/taglist.css +18 -0
  835. data/public/stylesheets/cms/thickbox.css +163 -0
  836. data/public/themes/blue_steel/images/logo.jpg +0 -0
  837. data/public/themes/blue_steel/images/splash.jpg +0 -0
  838. data/public/themes/blue_steel/stylesheets/style.css +257 -0
  839. data/rails/init.rb +3 -0
  840. data/rails_generators/browser_cms/USAGE +2 -0
  841. data/rails_generators/browser_cms/browser_cms_generator.rb +35 -0
  842. data/rails_generators/browser_cms/templates/README +1 -0
  843. data/rails_generators/browser_cms_demo_site/USAGE +1 -0
  844. data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +62 -0
  845. data/rails_generators/browser_cms_demo_site/templates/migration.rb +21 -0
  846. data/rails_generators/content_block/USAGE +19 -0
  847. data/rails_generators/content_block/content_block_generator.rb +62 -0
  848. data/rails_generators/content_block/templates/_form.html.erb +16 -0
  849. data/rails_generators/content_block/templates/content_block.rb +27 -0
  850. data/rails_generators/content_block/templates/controller.rb +2 -0
  851. data/rails_generators/content_block/templates/migration.rb +37 -0
  852. data/rails_generators/content_block/templates/render.html.erb +10 -0
  853. data/rails_generators/portlet/USAGE +14 -0
  854. data/rails_generators/portlet/portlet_generator.rb +27 -0
  855. data/rails_generators/portlet/templates/_form.html.erb +1 -0
  856. data/rails_generators/portlet/templates/portlet.rb +7 -0
  857. data/rails_generators/portlet/templates/render.html.erb +1 -0
  858. data/test/custom_assertions.rb +68 -0
  859. data/test/factories.rb +109 -0
  860. data/test/functional/cms/cache_controller_test.rb +14 -0
  861. data/test/functional/cms/categories_controller_test.rb +25 -0
  862. data/test/functional/cms/connectors_controller_test.rb +49 -0
  863. data/test/functional/cms/content_controller_test.rb +327 -0
  864. data/test/functional/cms/content_types_controller_test.rb +18 -0
  865. data/test/functional/cms/dashboard_controller_test.rb +17 -0
  866. data/test/functional/cms/file_blocks_controller_test.rb +32 -0
  867. data/test/functional/cms/groups_controller_test.rb +50 -0
  868. data/test/functional/cms/home_controller_test.rb +156 -0
  869. data/test/functional/cms/html_blocks_controller_test.rb +146 -0
  870. data/test/functional/cms/image_blocks_controller_test.rb +62 -0
  871. data/test/functional/cms/links_controller_test.rb +49 -0
  872. data/test/functional/cms/pages_controller_test.rb +61 -0
  873. data/test/functional/cms/portlets_controller_test.rb +36 -0
  874. data/test/functional/cms/section_nodes_controller_test.rb +44 -0
  875. data/test/functional/cms/sections_controller_test.rb +78 -0
  876. data/test/functional/cms/sessions_controller_test.rb +52 -0
  877. data/test/functional/cms/users_controller_test.rb +184 -0
  878. data/test/integration/login_test.rb +14 -0
  879. data/test/test_helper.rb +159 -0
  880. data/test/test_logging.rb +64 -0
  881. data/test/unit/behaviors/attaching_test.rb +355 -0
  882. data/test/unit/behaviors/dynamic_attributes_test.rb +38 -0
  883. data/test/unit/behaviors/publishable_test.rb +64 -0
  884. data/test/unit/behaviors/searching_test.rb +57 -0
  885. data/test/unit/behaviors/taggable_test.rb +90 -0
  886. data/test/unit/extensions/active_record/base_test.rb +10 -0
  887. data/test/unit/extensions/hash_test.rb +17 -0
  888. data/test/unit/extensions/integer_test.rb +10 -0
  889. data/test/unit/helpers/application_helper_test.rb +29 -0
  890. data/test/unit/helpers/menu_helper_test.rb +305 -0
  891. data/test/unit/helpers/page_helper_test.rb +57 -0
  892. data/test/unit/lib/content_block_test.rb +170 -0
  893. data/test/unit/models/attachment_test.rb +94 -0
  894. data/test/unit/models/category_test.rb +40 -0
  895. data/test/unit/models/category_type_test.rb +8 -0
  896. data/test/unit/models/connector_test.rb +92 -0
  897. data/test/unit/models/content_type_test.rb +23 -0
  898. data/test/unit/models/email_page_portlet_test.rb +14 -0
  899. data/test/unit/models/file_block_test.rb +177 -0
  900. data/test/unit/models/group_test.rb +7 -0
  901. data/test/unit/models/html_block_test.rb +104 -0
  902. data/test/unit/models/link_test.rb +8 -0
  903. data/test/unit/models/page_partial_test.rb +29 -0
  904. data/test/unit/models/page_route_test.rb +29 -0
  905. data/test/unit/models/page_template_test.rb +35 -0
  906. data/test/unit/models/page_test.rb +679 -0
  907. data/test/unit/models/permission_test.rb +10 -0
  908. data/test/unit/models/portlet_test.rb +11 -0
  909. data/test/unit/models/section_node_test.rb +92 -0
  910. data/test/unit/models/sections_test.rb +121 -0
  911. data/test/unit/models/site_test.rb +50 -0
  912. data/test/unit/models/task_test.rb +126 -0
  913. data/test/unit/models/user_test.rb +130 -0
  914. metadata +965 -0
@@ -0,0 +1,46 @@
1
+ module Cms
2
+ module Behaviors
3
+ module Hiding
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ end
7
+ module MacroMethods
8
+ def hideable?
9
+ !!@is_hideable
10
+ end
11
+ def is_hideable(options={})
12
+ @is_hideable = true
13
+ extend ClassMethods
14
+ include InstanceMethods
15
+
16
+ named_scope :hidden, :conditions => {:hidden => true}
17
+ named_scope :not_hidden, :conditions => {:hidden => false}
18
+ end
19
+ end
20
+ module ClassMethods
21
+ end
22
+ module InstanceMethods
23
+ def hide
24
+ self.hidden = true
25
+ self.version_comment = "Hidden"
26
+ self.save
27
+ end
28
+ def hide!
29
+ self.hidden = true
30
+ self.version_comment = "Hidden"
31
+ self.save!
32
+ end
33
+ def unhide
34
+ self.hidden = false
35
+ self.version_comment = "Unhidden"
36
+ self.save
37
+ end
38
+ def unhide!
39
+ self.hidden = false
40
+ self.version_comment = "Unhidden"
41
+ self.save!
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,209 @@
1
+ # This is just a repackaged version of Will Paginate 2.2.2
2
+ module Cms
3
+ module Behaviors
4
+ module Pagination
5
+ def self.included(model_class)
6
+ model_class.extend(ClassMethods)
7
+ class << model_class
8
+ define_method(:default_per_page) { 15 }
9
+ end
10
+ end
11
+ class InvalidPage < ArgumentError
12
+ def initialize(page, page_num)
13
+ super "#{page.inspect} given as value, which translates to '#{page_num}' as page number"
14
+ end
15
+ end
16
+ class Collection < Array
17
+ attr_reader :current_page, :per_page, :total_entries, :total_pages
18
+
19
+ # Arguments to the constructor are the current page number, per-page limit
20
+ # and the total number of entries. The last argument is optional because it
21
+ # is best to do lazy counting; in other words, count *conditionally* after
22
+ # populating the collection using the +replace+ method.
23
+ def initialize(page, per_page, total = nil)
24
+ @current_page = page.to_i
25
+ raise InvalidPage.new(page, @current_page) if @current_page < 1
26
+ @per_page = per_page.to_i
27
+ raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1
28
+
29
+ self.total_entries = total if total
30
+ end
31
+
32
+ # Just like +new+, but yields the object after instantiation and returns it
33
+ # afterwards. This is very useful for manual pagination:
34
+ #
35
+ # @entries = WillPaginate::Collection.create(1, 10) do |pager|
36
+ # result = Post.find(:all, :limit => pager.per_page, :offset => pager.offset)
37
+ # # inject the result array into the paginated collection:
38
+ # pager.replace(result)
39
+ #
40
+ # unless pager.total_entries
41
+ # # the pager didn't manage to guess the total count, do it manually
42
+ # pager.total_entries = Post.count
43
+ # end
44
+ # end
45
+ #
46
+ # The possibilities with this are endless. For another example, here is how
47
+ # WillPaginate used to define pagination for Array instances:
48
+ #
49
+ # Array.class_eval do
50
+ # def paginate(page = 1, per_page = 15)
51
+ # WillPaginate::Collection.create(page, per_page, size) do |pager|
52
+ # pager.replace self[pager.offset, pager.per_page].to_a
53
+ # end
54
+ # end
55
+ # end
56
+ #
57
+ # The Array#paginate API has since then changed, but this still serves as a
58
+ # fine example of WillPaginate::Collection usage.
59
+ def self.create(page, per_page, total = nil, &block)
60
+ pager = new(page, per_page, total)
61
+ yield pager
62
+ pager
63
+ end
64
+
65
+ # Helper method that is true when someone tries to fetch a page with a
66
+ # larger number than the last page. Can be used in combination with flashes
67
+ # and redirecting.
68
+ def out_of_bounds?
69
+ current_page > total_pages
70
+ end
71
+
72
+ # Current offset of the paginated collection. If we're on the first page,
73
+ # it is always 0. If we're on the 2nd page and there are 30 entries per page,
74
+ # the offset is 30. This property is useful if you want to render ordinals
75
+ # besides your records: simply start with offset + 1.
76
+ def offset
77
+ (current_page - 1) * per_page
78
+ end
79
+
80
+ # current_page - 1 or nil if there is no previous page
81
+ def previous_page
82
+ current_page > 1 ? (current_page - 1) : nil
83
+ end
84
+
85
+ # current_page + 1 or nil if there is no next page
86
+ def next_page
87
+ current_page < total_pages ? (current_page + 1) : nil
88
+ end
89
+
90
+ def total_entries=(number)
91
+ @total_entries = number.to_i
92
+ @total_pages = (@total_entries / per_page.to_f).ceil
93
+ end
94
+
95
+ # This is a magic wrapper for the original Array#replace method. It serves
96
+ # for populating the paginated collection after initialization.
97
+ #
98
+ # Why magic? Because it tries to guess the total number of entries judging
99
+ # by the size of given array. If it is shorter than +per_page+ limit, then we
100
+ # know we're on the last page. This trick is very useful for avoiding
101
+ # unnecessary hits to the database to do the counting after we fetched the
102
+ # data for the current page.
103
+ #
104
+ # However, after using +replace+ you should always test the value of
105
+ # +total_entries+ and set it to a proper value if it's +nil+. See the example
106
+ # in +create+.
107
+ def replace(array)
108
+ result = super
109
+
110
+ # The collection is shorter then page limit? Rejoice, because
111
+ # then we know that we are on the last page!
112
+ if total_entries.nil? and length < per_page and (current_page == 1 or length > 0)
113
+ self.total_entries = offset + length
114
+ end
115
+
116
+ result
117
+ end
118
+ end
119
+ module ClassMethods
120
+ # This is the main paginating finder.
121
+ #
122
+ # == Special parameters for paginating finders
123
+ # * <tt>:page</tt> -- REQUIRED, but defaults to 1 if false or nil
124
+ # * <tt>:per_page</tt> -- defaults to <tt>CurrentModel.per_page</tt> (which is 30 if not overridden)
125
+ # * <tt>:total_entries</tt> -- use only if you manually count total entries
126
+ # * <tt>:count</tt> -- additional options that are passed on to +count+
127
+ # * <tt>:finder</tt> -- name of the ActiveRecord finder used (default: "find")
128
+ #
129
+ # All other options (+conditions+, +order+, ...) are forwarded to +find+
130
+ # and +count+ calls.
131
+ def paginate(*args, &block)
132
+ options = args.pop
133
+ page, per_page, total_entries = parse_pagination_options(options)
134
+
135
+ finder = (options[:finder] || 'find').to_s
136
+ if finder == 'find'
137
+ # an array of IDs may have been given:
138
+ total_entries ||= (Array === args.first and args.first.size)
139
+ # :all is implicit
140
+ args.unshift(:all) if args.empty?
141
+ end
142
+
143
+ Collection.create(page, per_page, total_entries) do |pager|
144
+ count_options = options.except :page, :per_page, :total_entries, :finder
145
+ find_options = count_options.except(:count).update(:offset => pager.offset, :limit => pager.per_page)
146
+
147
+ args << find_options
148
+ # @options_from_last_find = nil
149
+ pager.replace send(finder, *args, &block)
150
+
151
+ # magic counting for user convenience:
152
+ pager.total_entries = count_for_pagination(count_options, args, finder) unless pager.total_entries
153
+ end
154
+ end
155
+ protected
156
+ # Does the not-so-trivial job of finding out the total number of entries
157
+ # in the database. It relies on the ActiveRecord +count+ method.
158
+ def count_for_pagination(options, args, finder)
159
+ excludees = [:count, :order, :limit, :offset, :readonly]
160
+ unless options[:select] and options[:select] =~ /^\s*DISTINCT\b/i
161
+ excludees << :select # only exclude the select param if it doesn't begin with DISTINCT
162
+ end
163
+ # count expects (almost) the same options as find
164
+ count_options = options.except *excludees
165
+
166
+ # merge the hash found in :count
167
+ # this allows you to specify :select, :order, or anything else just for the count query
168
+ count_options.update options[:count] if options[:count]
169
+
170
+ # we may have to scope ...
171
+ counter = Proc.new { count(count_options) }
172
+
173
+ # we may be in a model or an association proxy!
174
+ klass = (@owner and @reflection) ? @reflection.klass : self
175
+
176
+ count = if finder.index('find_') == 0 and klass.respond_to?(scoper = finder.sub('find', 'with'))
177
+ # scope_out adds a 'with_finder' method which acts like with_scope, if it's present
178
+ # then execute the count with the scoping provided by the with_finder
179
+ send(scoper, &counter)
180
+ elsif match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(finder)
181
+ # extract conditions from calls like "paginate_by_foo_and_bar"
182
+ attribute_names = extract_attribute_names_from_match(match)
183
+ conditions = construct_attributes_from_arguments(attribute_names, args)
184
+ with_scope(:find => { :conditions => conditions }, &counter)
185
+ else
186
+ counter.call
187
+ end
188
+
189
+ count.respond_to?(:length) ? count.length : count
190
+ end
191
+
192
+ def parse_pagination_options(options) #:nodoc:
193
+ raise ArgumentError, 'parameter hash expected' unless options.respond_to? :symbolize_keys
194
+ options = options.symbolize_keys
195
+ raise ArgumentError, ':page parameter required' unless options.key? :page
196
+
197
+ if options[:count] and options[:total_entries]
198
+ raise ArgumentError, ':count and :total_entries are mutually exclusive'
199
+ end
200
+
201
+ page = options[:page] || 1
202
+ per_page = options[:per_page] || self.default_per_page
203
+ total = options[:total_entries]
204
+ [page, per_page, total]
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,84 @@
1
+ module Cms
2
+ module Behaviors
3
+ module Publishing
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ model_class.class_eval do
7
+ def publishable?
8
+ false
9
+ end
10
+ end
11
+ end
12
+ module MacroMethods
13
+ def publishable?
14
+ !!@is_publishable
15
+ end
16
+ def is_publishable(options={})
17
+ @is_publishable = true
18
+ extend ClassMethods
19
+ include InstanceMethods
20
+
21
+ attr_accessor :publish_on_save
22
+ attr_accessor :published_by_page
23
+
24
+ before_save :set_published
25
+
26
+ named_scope :published, :conditions => {:published => true}
27
+ named_scope :unpublished, :conditions => {:published => false}
28
+ end
29
+ end
30
+ module ClassMethods
31
+ end
32
+ module InstanceMethods
33
+ def publishable?
34
+ if self.class.connectable?
35
+ new_record? ? connect_to_page_id.blank? : connected_page_count < 1
36
+ else
37
+ true
38
+ end
39
+ end
40
+ def publish
41
+ self.publish_on_save = true
42
+ self.version_comment = "Published" if self.class.versioned?
43
+ save
44
+ end
45
+ def publish!
46
+ self.publish_on_save = true
47
+ self.version_comment = "Published" if self.class.versioned?
48
+ save!
49
+ end
50
+ def publish_by_page(page)
51
+ self.published_by_page = page
52
+ if publish
53
+ self.published_by_page = nil
54
+ true
55
+ else
56
+ false
57
+ end
58
+ end
59
+ def publish_by_page!(page)
60
+ self.published_by_page = page
61
+ publish!
62
+ self.published_by_page = nil
63
+ end
64
+ def set_published
65
+ self.published = !!@publish_on_save
66
+ if self.published && self.respond_to?(:published_at) && !self.published_at
67
+ self.published_at = Time.now
68
+ end
69
+ @publish_on_save = nil
70
+ true
71
+ end
72
+ def status
73
+ published? ? :published : :draft
74
+ end
75
+ def status_name
76
+ status.to_s.titleize
77
+ end
78
+ def live?
79
+ self.class.versioned? ? versions.count(:conditions => ['version > ? AND published = ?', version, true]) == 0 && published? : true
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,133 @@
1
+ module Cms
2
+ module Behaviors
3
+ # The Rendering Behavior allows a model to be rendered within a view.
4
+ # The key methods are the instance methods perform_render, render and
5
+ # inline_options. From within a view or a helper, you can render a
6
+ # renderable object by calling the perform_render and passing the controller
7
+ # object to it.
8
+ #
9
+ # When perform_render is called, it will first call the render instance method
10
+ # of the renderable object. This is very similar to a controller action.
11
+ # The purpose of this method is to setup instance varaibles to be used by the
12
+ # renderable's view.
13
+ #
14
+ # After the render method is called, it checks to see if there is a inline_options
15
+ # instance method on the renderable object. If so, it calls this and it expects
16
+ # this to return a Hash that will be passed to render. This expects there to be
17
+ # an inline option, so this is the way to do inline rendering.
18
+ #
19
+ # Assuming there is no inline_options method, it will look for a template in the
20
+ # view path at cms/pluralized_class_name/render. So if the Renderable class is
21
+ # Article, the template should be at cms/articles/render. It uses the same
22
+ # format and template engine options as regular views, to the file name should
23
+ # be render.html.erb.
24
+ #
25
+ # One gotcha to be aware of with this behavior
26
+ module Rendering
27
+ def self.included(model)
28
+ model.extend(MacroMethods)
29
+ end
30
+ module MacroMethods
31
+ def renderable?
32
+ false
33
+ end
34
+ def is_renderable(options={})
35
+
36
+ @instance_variable_name_for_view = options[:instance_variable_name_for_view]
37
+
38
+ extend ClassMethods
39
+ include InstanceMethods
40
+
41
+ include ActionController::Helpers
42
+ include ActionController::RequestForgeryProtection
43
+
44
+ helper ApplicationHelper
45
+
46
+ attr_accessor :controller
47
+ delegate :params, :session, :request, :flash, :to => :controller
48
+
49
+ end
50
+ end
51
+ end
52
+ module ClassMethods
53
+ def renderable?
54
+ true
55
+ end
56
+
57
+ # This will be the used as the name of instance variable
58
+ # that will be available in the view. The default value is "@renderable"
59
+ def instance_variable_name_for_view
60
+ @instance_variable_name_for_view ||= "@renderable"
61
+ end
62
+
63
+ def helper_path
64
+ "app/helpers/cms/#{name.underscore}_helper.rb"
65
+ end
66
+
67
+ def helper_class
68
+ "Cms::#{name}Helper".constantize
69
+ end
70
+
71
+ # This is where the path to the template. The default is based on the class
72
+ # of the renderable, so if you have an Article that is renderable,
73
+ # the template will be "articles/render"
74
+ def template_path
75
+ "cms/#{name.underscore.pluralize}/render"
76
+ end
77
+
78
+ # Instance variables that will not be copied from the renderable to the view
79
+ def ivars_to_ignore
80
+ ['@controller', '@_already_rendered']
81
+ end
82
+
83
+ end
84
+ module InstanceMethods
85
+ def perform_render(controller)
86
+ # Give this renderable a reference to the controller
87
+ @controller = controller
88
+
89
+ # This gives the view a reference to this object
90
+ instance_variable_set(self.class.instance_variable_name_for_view, self)
91
+
92
+ # This is like a controller action
93
+ # We will call it if you have defined a render method
94
+ # but if you haven't we won't
95
+ render if respond_to?(:render)
96
+
97
+ # Create, Instantiate and Initialize the view
98
+ view_class = Class.new(ActionView::Base)
99
+ action_view = view_class.new(@controller.view_paths, {}, @controller)
100
+
101
+ # Make helpers and instance vars available
102
+ view_class.send(:include, @controller.class.master_helper_module)
103
+ if $:.detect{|d| File.exists?(File.join(d, self.class.helper_path))}
104
+ view_class.send(:include, self.class.helper_class)
105
+ end
106
+
107
+ # We want content_for to be called on the controller's view, not this inner view
108
+ def action_view.content_for(name, content=nil, &block)
109
+ controller.instance_variable_get("@template").content_for(name, content, &block)
110
+ end
111
+
112
+ # Copy instance variables from this renderable object to it's view
113
+ action_view.assigns = assigns_for_view
114
+
115
+ if respond_to?(:inline_options)
116
+ options = {:locals => {}}.merge(self.inline_options)
117
+ ActionView::InlineTemplate.new(options[:inline], options[:type]).render(action_view, options[:locals])
118
+ else
119
+ action_view.render(:file => self.class.template_path)
120
+ end
121
+ end
122
+
123
+ protected
124
+ def assigns_for_view
125
+ (instance_variables - self.class.ivars_to_ignore).inject({}) do |h,k|
126
+ h[k[1..-1]] = instance_variable_get(k)
127
+ h
128
+ end
129
+ end
130
+
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,49 @@
1
+ module Cms
2
+ module Behaviors
3
+ module Searching
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ end
7
+ module MacroMethods
8
+ def searchable?
9
+ !!@is_searchable
10
+ end
11
+ def is_searchable(options={})
12
+ @is_searchable = true
13
+ @searchable_columns = options[:searchable_columns] ? options[:searchable_columns].map(&:to_sym) : [:name]
14
+ extend ClassMethods
15
+
16
+ #This is in a method to allow classes to override it
17
+ named_scope :search, lambda{|search_params|
18
+ term = search_params.is_a?(Hash) ? search_params[:term] : search_params
19
+ order = search_params.is_a?(Hash) && search_params[:order] ? search_params[:order] : default_order_for_search
20
+ conditions = []
21
+ unless term.blank?
22
+ searchable_columns.each do |c|
23
+ if conditions.empty?
24
+ conditions = ["#{table_name}.#{c} like ?"]
25
+ else
26
+ conditions.first << "or #{table_name}.#{c} like ?"
27
+ end
28
+ conditions << "%#{term}%"
29
+ end
30
+ conditions[0] = "(#{conditions[0]})"
31
+ end
32
+ scope = {}
33
+ scope[:conditions] = conditions if conditions
34
+ scope[:order] = order if order
35
+ scope
36
+ }
37
+ end
38
+ end
39
+ module ClassMethods
40
+ def searchable_columns
41
+ @searchable_columns
42
+ end
43
+ def default_order_for_search
44
+ "#{table_name}.#{searchable_columns.first}"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,73 @@
1
+ module Cms
2
+ module Behaviors
3
+ module SoftDeleting
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ end
7
+ module MacroMethods
8
+ def uses_soft_delete?
9
+ !!@uses_soft_delete
10
+ end
11
+ def uses_soft_delete(options={})
12
+ @uses_soft_delete = true
13
+
14
+ named_scope :not_deleted, :conditions => ["#{table_name}.deleted = ?", false]
15
+ class << self
16
+ alias_method :find_with_deleted, :find
17
+ alias_method :count_with_deleted, :count
18
+ alias_method :delete_all!, :delete_all
19
+ end
20
+ alias_method :destroy_without_callbacks!, :destroy_without_callbacks
21
+
22
+ extend ClassMethods
23
+ include InstanceMethods
24
+ end
25
+ end
26
+ module ClassMethods
27
+ def find(*args)
28
+ not_deleted.find_with_deleted(*args)
29
+ end
30
+ def count(*args)
31
+ not_deleted.count_with_deleted(*args)
32
+ end
33
+ def delete_all(conditions=nil)
34
+ update_all(["deleted = ?", true], conditions)
35
+ end
36
+ def exists?(id_or_conditions)
37
+ if id_or_conditions.is_a?(Hash) || id_or_conditions.is_a?(Array)
38
+ conditions = {:conditions => id_or_conditions}
39
+ else
40
+ conditions = {:conditions => {:id => id_or_conditions}}
41
+ end
42
+ count(conditions) > 0
43
+ end
44
+ end
45
+ module InstanceMethods
46
+ #Overrides original destroy method
47
+ def destroy_without_callbacks
48
+ update_attribute(:deleted, true)
49
+ end
50
+
51
+ def mark_as_deleted!
52
+ destroy_without_callbacks
53
+ end
54
+
55
+ def destroy_with_callbacks!
56
+ return false if callback(:before_destroy) == false
57
+ result = destroy_without_callbacks!
58
+ @destroyed = true
59
+ callback(:after_destroy)
60
+ result
61
+ end
62
+
63
+ def destroy!
64
+ transaction { destroy_with_callbacks! }
65
+ end
66
+
67
+ def destroyed?
68
+ @destroyed
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,56 @@
1
+ module Cms
2
+ module Behaviors
3
+ module Taggable
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ end
7
+ module MacroMethods
8
+ def taggable?
9
+ !!@is_taggable
10
+ end
11
+ def is_taggable(options={})
12
+ @is_taggable = true
13
+ @tag_separator = options[:separator] || " "
14
+
15
+ has_many :taggings, :as => :taggable
16
+ has_many :tags, :through => :taggings, :order => "tags.name"
17
+
18
+ named_scope :tagged_with, lambda{|t| {:include => {:taggings => :tag}, :conditions => ["tags.name = ?", t]} }
19
+
20
+ after_save :save_tags
21
+
22
+ extend ClassMethods
23
+ include InstanceMethods
24
+ end
25
+ end
26
+ module ClassMethods
27
+ def tag_cloud
28
+ Tagging.cloud(base_class.name)
29
+ end
30
+ def tag_separator
31
+ @tag_separator
32
+ end
33
+ end
34
+ module InstanceMethods
35
+ def tag_list
36
+ @tag_list ||= tags.reload.map(&:name).join(self.class.tag_separator)
37
+ end
38
+ def tag_list=(tag_names)
39
+ @tag_list = tag_names
40
+ end
41
+ def save_tags
42
+ tag_list_tags = tag_list.to_s.split(self.class.tag_separator).map{|t| Tag.find_or_create_by_name(t) }
43
+ taggings.each do |tg|
44
+ if tag_list_tags.include?(tg.tag)
45
+ tag_list_tags.delete(tg.tag)
46
+ else
47
+ tg.destroy
48
+ end
49
+ end
50
+ tag_list_tags.each{|t| taggings.create(:tag => t, :taggable => self) }
51
+ self.tag_list = nil
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,37 @@
1
+ module Cms
2
+ module Behaviors
3
+ module Userstamping
4
+ def self.included(model_class)
5
+ model_class.extend(MacroMethods)
6
+ end
7
+ module MacroMethods
8
+ def userstamped?
9
+ !!@is_userstamped
10
+ end
11
+ def is_userstamped(options={})
12
+ @is_userstamped = true
13
+ extend ClassMethods
14
+ include InstanceMethods
15
+
16
+ belongs_to :created_by, :class_name => "User"
17
+ belongs_to :updated_by, :class_name => "User"
18
+
19
+ before_save :set_userstamps
20
+
21
+ named_scope :created_by, lambda{|user| {:conditions => {:created_by => user}}}
22
+ named_scope :updated_by, lambda{|user| {:conditions => {:updated_by => user}}}
23
+ end
24
+ end
25
+ module ClassMethods
26
+ end
27
+ module InstanceMethods
28
+ def set_userstamps
29
+ if new_record?
30
+ self.created_by = User.current
31
+ end
32
+ self.updated_by = User.current
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end