active_scaffold-sequel 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. data/CHANGELOG +179 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +36 -0
  4. data/app/assets/images/active_scaffold/add.gif +0 -0
  5. data/app/assets/images/active_scaffold/arrow_down.gif +0 -0
  6. data/app/assets/images/active_scaffold/arrow_up.gif +0 -0
  7. data/app/assets/images/active_scaffold/close.gif +0 -0
  8. data/app/assets/images/active_scaffold/close_touch.png +0 -0
  9. data/app/assets/images/active_scaffold/config.png +0 -0
  10. data/app/assets/images/active_scaffold/cross.png +0 -0
  11. data/app/assets/images/active_scaffold/gears.png +0 -0
  12. data/app/assets/images/active_scaffold/indicator-small.gif +0 -0
  13. data/app/assets/images/active_scaffold/indicator.gif +0 -0
  14. data/app/assets/images/active_scaffold/magnifier.png +0 -0
  15. data/app/assets/javascripts/active_scaffold.js.erb +19 -0
  16. data/app/assets/javascripts/jquery/active_scaffold.js +1057 -0
  17. data/app/assets/javascripts/jquery/date_picker_bridge.js.erb +24 -0
  18. data/app/assets/javascripts/jquery/draggable_lists.js +27 -0
  19. data/app/assets/javascripts/jquery/jquery.editinplace.js +743 -0
  20. data/app/assets/javascripts/jquery/tiny_mce_bridge.js +7 -0
  21. data/app/assets/javascripts/prototype/active_scaffold.js +1052 -0
  22. data/app/assets/javascripts/prototype/dhtml_history.js +870 -0
  23. data/app/assets/javascripts/prototype/form_enhancements.js +117 -0
  24. data/app/assets/javascripts/prototype/rico_corner.js +370 -0
  25. data/app/assets/javascripts/prototype/tiny_mce_bridge.js +7 -0
  26. data/app/assets/stylesheets/active_scaffold-ie.css +35 -0
  27. data/app/assets/stylesheets/active_scaffold.css.scss +14 -0
  28. data/app/assets/stylesheets/active_scaffold_colors.css.scss +395 -0
  29. data/app/assets/stylesheets/active_scaffold_extensions.css.erb +2 -0
  30. data/app/assets/stylesheets/active_scaffold_images.css.scss +43 -0
  31. data/app/assets/stylesheets/active_scaffold_layout.css +912 -0
  32. data/app/assets/stylesheets/blue-theme.css +74 -0
  33. data/config/locales/de.yml +114 -0
  34. data/config/locales/en.yml +118 -0
  35. data/config/locales/es.yml +120 -0
  36. data/config/locales/fr.yml +121 -0
  37. data/config/locales/hu.yml +74 -0
  38. data/config/locales/ja.yml +73 -0
  39. data/config/locales/ru.yml +123 -0
  40. data/frontends/default/views/_action_group.html.erb +24 -0
  41. data/frontends/default/views/_add_existing_form.html.erb +30 -0
  42. data/frontends/default/views/_base_form.html.erb +51 -0
  43. data/frontends/default/views/_create_form.html.erb +8 -0
  44. data/frontends/default/views/_create_form_on_list.html.erb +6 -0
  45. data/frontends/default/views/_field_search.html.erb +32 -0
  46. data/frontends/default/views/_form.html.erb +24 -0
  47. data/frontends/default/views/_form_association.html.erb +15 -0
  48. data/frontends/default/views/_form_association_footer.html.erb +47 -0
  49. data/frontends/default/views/_form_attribute.html.erb +20 -0
  50. data/frontends/default/views/_form_hidden_attribute.html.erb +2 -0
  51. data/frontends/default/views/_form_messages.html.erb +5 -0
  52. data/frontends/default/views/_horizontal_subform.html.erb +28 -0
  53. data/frontends/default/views/_horizontal_subform_footer.html.erb +0 -0
  54. data/frontends/default/views/_horizontal_subform_header.html.erb +11 -0
  55. data/frontends/default/views/_horizontal_subform_record.html.erb +38 -0
  56. data/frontends/default/views/_human_conditions.html.erb +1 -0
  57. data/frontends/default/views/_list.html.erb +18 -0
  58. data/frontends/default/views/_list_actions.html.erb +15 -0
  59. data/frontends/default/views/_list_calculations.html.erb +16 -0
  60. data/frontends/default/views/_list_column_headings.html.erb +12 -0
  61. data/frontends/default/views/_list_header.html.erb +10 -0
  62. data/frontends/default/views/_list_inline_adapter.html.erb +10 -0
  63. data/frontends/default/views/_list_messages.html.erb +30 -0
  64. data/frontends/default/views/_list_pagination.html.erb +11 -0
  65. data/frontends/default/views/_list_pagination_links.html.erb +9 -0
  66. data/frontends/default/views/_list_record.html.erb +14 -0
  67. data/frontends/default/views/_list_record_columns.html.erb +8 -0
  68. data/frontends/default/views/_list_with_header.html.erb +36 -0
  69. data/frontends/default/views/_messages.html.erb +10 -0
  70. data/frontends/default/views/_render_field.js.erb +20 -0
  71. data/frontends/default/views/_row.html.erb +6 -0
  72. data/frontends/default/views/_search.html.erb +34 -0
  73. data/frontends/default/views/_search_attribute.html.erb +10 -0
  74. data/frontends/default/views/_show.html.erb +8 -0
  75. data/frontends/default/views/_show_columns.html.erb +15 -0
  76. data/frontends/default/views/_update_actions.html.erb +9 -0
  77. data/frontends/default/views/_update_form.html.erb +6 -0
  78. data/frontends/default/views/_vertical_subform.html.erb +12 -0
  79. data/frontends/default/views/_vertical_subform_record.html.erb +38 -0
  80. data/frontends/default/views/action_confirmation.html.erb +13 -0
  81. data/frontends/default/views/add_existing.js.erb +18 -0
  82. data/frontends/default/views/add_existing_form.html.erb +5 -0
  83. data/frontends/default/views/create.html.erb +5 -0
  84. data/frontends/default/views/delete.html.erb +13 -0
  85. data/frontends/default/views/destroy.js.erb +24 -0
  86. data/frontends/default/views/edit_associated.js.erb +12 -0
  87. data/frontends/default/views/field_search.html.erb +5 -0
  88. data/frontends/default/views/form_messages.js.erb +1 -0
  89. data/frontends/default/views/list.html.erb +1 -0
  90. data/frontends/default/views/on_action_update.js.erb +13 -0
  91. data/frontends/default/views/on_create.js.erb +47 -0
  92. data/frontends/default/views/on_mark_all.js.erb +12 -0
  93. data/frontends/default/views/on_update.js.erb +31 -0
  94. data/frontends/default/views/refresh_list.js.erb +1 -0
  95. data/frontends/default/views/render_field.js.erb +1 -0
  96. data/frontends/default/views/search.html.erb +5 -0
  97. data/frontends/default/views/show.html.erb +5 -0
  98. data/frontends/default/views/update.html.erb +8 -0
  99. data/frontends/default/views/update_column.js.erb +16 -0
  100. data/frontends/default/views/update_row.js.erb +1 -0
  101. data/lib/active_scaffold/actions/common_search.rb +25 -0
  102. data/lib/active_scaffold/actions/core.rb +197 -0
  103. data/lib/active_scaffold/actions/create.rb +148 -0
  104. data/lib/active_scaffold/actions/delete.rb +76 -0
  105. data/lib/active_scaffold/actions/field_search.rb +82 -0
  106. data/lib/active_scaffold/actions/list.rb +196 -0
  107. data/lib/active_scaffold/actions/mark.rb +75 -0
  108. data/lib/active_scaffold/actions/nested.rb +245 -0
  109. data/lib/active_scaffold/actions/search.rb +48 -0
  110. data/lib/active_scaffold/actions/show.rb +61 -0
  111. data/lib/active_scaffold/actions/subform.rb +23 -0
  112. data/lib/active_scaffold/actions/update.rb +150 -0
  113. data/lib/active_scaffold/active_record_permissions.rb +136 -0
  114. data/lib/active_scaffold/attribute_params.rb +208 -0
  115. data/lib/active_scaffold/bridges/ancestry/ancestry_bridge.rb +39 -0
  116. data/lib/active_scaffold/bridges/ancestry.rb +5 -0
  117. data/lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb +67 -0
  118. data/lib/active_scaffold/bridges/calendar_date_select.rb +24 -0
  119. data/lib/active_scaffold/bridges/cancan/cancan_bridge.rb +107 -0
  120. data/lib/active_scaffold/bridges/cancan.rb +15 -0
  121. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge.rb +31 -0
  122. data/lib/active_scaffold/bridges/carrierwave/carrierwave_bridge_helpers.rb +10 -0
  123. data/lib/active_scaffold/bridges/carrierwave/form_ui.rb +45 -0
  124. data/lib/active_scaffold/bridges/carrierwave/list_ui.rb +17 -0
  125. data/lib/active_scaffold/bridges/carrierwave.rb +12 -0
  126. data/lib/active_scaffold/bridges/country_helper/country_helper_bridge.rb +358 -0
  127. data/lib/active_scaffold/bridges/country_helper.rb +9 -0
  128. data/lib/active_scaffold/bridges/date_picker/ext.rb +45 -0
  129. data/lib/active_scaffold/bridges/date_picker/helper.rb +180 -0
  130. data/lib/active_scaffold/bridges/date_picker.rb +23 -0
  131. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge.rb +34 -0
  132. data/lib/active_scaffold/bridges/dragonfly/dragonfly_bridge_helpers.rb +10 -0
  133. data/lib/active_scaffold/bridges/dragonfly/form_ui.rb +27 -0
  134. data/lib/active_scaffold/bridges/dragonfly/list_ui.rb +16 -0
  135. data/lib/active_scaffold/bridges/dragonfly.rb +9 -0
  136. data/lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb +48 -0
  137. data/lib/active_scaffold/bridges/file_column/file_column_helpers.rb +57 -0
  138. data/lib/active_scaffold/bridges/file_column/form_ui.rb +34 -0
  139. data/lib/active_scaffold/bridges/file_column/list_ui.rb +26 -0
  140. data/lib/active_scaffold/bridges/file_column/test/functional/file_column_keep_test.rb +43 -0
  141. data/lib/active_scaffold/bridges/file_column/test/mock_model.rb +9 -0
  142. data/lib/active_scaffold/bridges/file_column/test/test_helper.rb +15 -0
  143. data/lib/active_scaffold/bridges/file_column.rb +11 -0
  144. data/lib/active_scaffold/bridges/paperclip/form_ui.rb +27 -0
  145. data/lib/active_scaffold/bridges/paperclip/list_ui.rb +16 -0
  146. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge.rb +36 -0
  147. data/lib/active_scaffold/bridges/paperclip/paperclip_bridge_helpers.rb +24 -0
  148. data/lib/active_scaffold/bridges/paperclip.rb +12 -0
  149. data/lib/active_scaffold/bridges/record_select/helpers.rb +86 -0
  150. data/lib/active_scaffold/bridges/record_select.rb +11 -0
  151. data/lib/active_scaffold/bridges/semantic_attributes/column.rb +20 -0
  152. data/lib/active_scaffold/bridges/semantic_attributes.rb +5 -0
  153. data/lib/active_scaffold/bridges/shared/date_bridge.rb +209 -0
  154. data/lib/active_scaffold/bridges/tiny_mce/helpers.rb +46 -0
  155. data/lib/active_scaffold/bridges/tiny_mce.rb +17 -0
  156. data/lib/active_scaffold/bridges.rb +61 -0
  157. data/lib/active_scaffold/config/base.rb +71 -0
  158. data/lib/active_scaffold/config/core.rb +219 -0
  159. data/lib/active_scaffold/config/create.rb +44 -0
  160. data/lib/active_scaffold/config/delete.rb +33 -0
  161. data/lib/active_scaffold/config/field_search.rb +76 -0
  162. data/lib/active_scaffold/config/form.rb +48 -0
  163. data/lib/active_scaffold/config/list.rb +196 -0
  164. data/lib/active_scaffold/config/mark.rb +35 -0
  165. data/lib/active_scaffold/config/nested.rb +42 -0
  166. data/lib/active_scaffold/config/search.rb +73 -0
  167. data/lib/active_scaffold/config/show.rb +32 -0
  168. data/lib/active_scaffold/config/subform.rb +35 -0
  169. data/lib/active_scaffold/config/update.rb +41 -0
  170. data/lib/active_scaffold/configurable.rb +29 -0
  171. data/lib/active_scaffold/constraints.rb +170 -0
  172. data/lib/active_scaffold/data_structures/action_columns.rb +140 -0
  173. data/lib/active_scaffold/data_structures/action_link.rb +179 -0
  174. data/lib/active_scaffold/data_structures/action_links.rb +185 -0
  175. data/lib/active_scaffold/data_structures/actions.rb +45 -0
  176. data/lib/active_scaffold/data_structures/bridge.rb +22 -0
  177. data/lib/active_scaffold/data_structures/column.rb +389 -0
  178. data/lib/active_scaffold/data_structures/columns.rb +75 -0
  179. data/lib/active_scaffold/data_structures/error_message.rb +24 -0
  180. data/lib/active_scaffold/data_structures/nested_info.rb +130 -0
  181. data/lib/active_scaffold/data_structures/set.rb +57 -0
  182. data/lib/active_scaffold/data_structures/sorting.rb +172 -0
  183. data/lib/active_scaffold/engine.rb +4 -0
  184. data/lib/active_scaffold/extensions/action_controller_rendering.rb +22 -0
  185. data/lib/active_scaffold/extensions/action_view_rendering.rb +115 -0
  186. data/lib/active_scaffold/extensions/active_record_offset.rb +12 -0
  187. data/lib/active_scaffold/extensions/array.rb +7 -0
  188. data/lib/active_scaffold/extensions/cache_association.rb +16 -0
  189. data/lib/active_scaffold/extensions/localize.rb +10 -0
  190. data/lib/active_scaffold/extensions/name_option_for_datetime.rb +12 -0
  191. data/lib/active_scaffold/extensions/nil_id_in_url_params.rb +7 -0
  192. data/lib/active_scaffold/extensions/paginator_extensions.rb +26 -0
  193. data/lib/active_scaffold/extensions/routing_mapper.rb +48 -0
  194. data/lib/active_scaffold/extensions/to_label.rb +8 -0
  195. data/lib/active_scaffold/extensions/unsaved_associated.rb +60 -0
  196. data/lib/active_scaffold/extensions/unsaved_record.rb +20 -0
  197. data/lib/active_scaffold/extensions/usa_state.rb +46 -0
  198. data/lib/active_scaffold/finder.rb +372 -0
  199. data/lib/active_scaffold/helpers/association_helpers.rb +48 -0
  200. data/lib/active_scaffold/helpers/controller_helpers.rb +88 -0
  201. data/lib/active_scaffold/helpers/form_column_helpers.rb +321 -0
  202. data/lib/active_scaffold/helpers/human_condition_helpers.rb +62 -0
  203. data/lib/active_scaffold/helpers/id_helpers.rb +127 -0
  204. data/lib/active_scaffold/helpers/list_column_helpers.rb +340 -0
  205. data/lib/active_scaffold/helpers/pagination_helpers.rb +55 -0
  206. data/lib/active_scaffold/helpers/search_column_helpers.rb +267 -0
  207. data/lib/active_scaffold/helpers/show_column_helpers.rb +50 -0
  208. data/lib/active_scaffold/helpers/view_helpers.rb +342 -0
  209. data/lib/active_scaffold/marked_model.rb +38 -0
  210. data/lib/active_scaffold/paginator.rb +136 -0
  211. data/lib/active_scaffold/responds_to_parent.rb +70 -0
  212. data/lib/active_scaffold/version.rb +9 -0
  213. data/lib/active_scaffold.rb +368 -0
  214. data/lib/active_scaffold_env.rb +11 -0
  215. data/lib/generators/active_scaffold/USAGE +29 -0
  216. data/lib/generators/active_scaffold/active_scaffold_generator.rb +20 -0
  217. data/lib/generators/active_scaffold_controller/USAGE +19 -0
  218. data/lib/generators/active_scaffold_controller/active_scaffold_controller_generator.rb +29 -0
  219. data/lib/generators/active_scaffold_controller/templates/controller.rb +4 -0
  220. data/lib/generators/active_scaffold_controller/templates/helper.rb +2 -0
  221. data/public/blank.html +33 -0
  222. data/shoulda_macros/macros.rb +136 -0
  223. data/test/bridges/active_scaffold_dependent_protect_test.rb +34 -0
  224. data/test/bridges/bridge_test.rb +90 -0
  225. data/test/bridges/company.rb +81 -0
  226. data/test/bridges/paperclip_test.rb +68 -0
  227. data/test/bridges/tiny_mce_test.rb +27 -0
  228. data/test/bridges/unobtrusive_date_picker_test.rb +49 -0
  229. data/test/bridges/validation_reflection_test.rb +57 -0
  230. data/test/config/base_test.rb +15 -0
  231. data/test/config/core_test.rb +58 -0
  232. data/test/config/create_test.rb +58 -0
  233. data/test/config/delete_test.rb +33 -0
  234. data/test/config/field_search_test.rb +47 -0
  235. data/test/config/list_test.rb +129 -0
  236. data/test/config/nested_test.rb +62 -0
  237. data/test/config/search_test.rb +60 -0
  238. data/test/config/show_test.rb +43 -0
  239. data/test/config/subform_test.rb +17 -0
  240. data/test/config/update_test.rb +40 -0
  241. data/test/const_mocker.rb +36 -0
  242. data/test/data_structures/action_columns_test.rb +113 -0
  243. data/test/data_structures/action_link_test.rb +78 -0
  244. data/test/data_structures/action_links_test.rb +78 -0
  245. data/test/data_structures/actions_test.rb +25 -0
  246. data/test/data_structures/association_column_test.rb +42 -0
  247. data/test/data_structures/column_test.rb +185 -0
  248. data/test/data_structures/columns_test.rb +69 -0
  249. data/test/data_structures/error_message_test.rb +28 -0
  250. data/test/data_structures/set_test.rb +86 -0
  251. data/test/data_structures/sorting_test.rb +126 -0
  252. data/test/data_structures/standard_column_test.rb +24 -0
  253. data/test/data_structures/virtual_column_test.rb +23 -0
  254. data/test/extensions/active_record_test.rb +45 -0
  255. data/test/extensions/array_test.rb +12 -0
  256. data/test/helpers/form_column_helpers_test.rb +31 -0
  257. data/test/helpers/list_column_helpers_test.rb +42 -0
  258. data/test/helpers/pagination_helpers_test.rb +59 -0
  259. data/test/misc/active_record_permissions_test.rb +154 -0
  260. data/test/misc/attribute_params_test.rb +146 -0
  261. data/test/misc/configurable_test.rb +96 -0
  262. data/test/misc/constraints_test.rb +193 -0
  263. data/test/misc/finder_test.rb +92 -0
  264. data/test/misc/lang_test.rb +11 -0
  265. data/test/mock_app/app/controllers/application_controller.rb +10 -0
  266. data/test/mock_app/app/helpers/application_helper.rb +3 -0
  267. data/test/mock_app/config/boot.rb +110 -0
  268. data/test/mock_app/config/database.yml +16 -0
  269. data/test/mock_app/config/environment.rb +43 -0
  270. data/test/mock_app/config/environments/development.rb +17 -0
  271. data/test/mock_app/config/environments/production.rb +28 -0
  272. data/test/mock_app/config/environments/test.rb +28 -0
  273. data/test/mock_app/config/initializers/backtrace_silencers.rb +7 -0
  274. data/test/mock_app/config/initializers/inflections.rb +10 -0
  275. data/test/mock_app/config/initializers/mime_types.rb +5 -0
  276. data/test/mock_app/config/initializers/new_rails_defaults.rb +19 -0
  277. data/test/mock_app/config/initializers/session_store.rb +15 -0
  278. data/test/mock_app/config/locales/en.yml +5 -0
  279. data/test/mock_app/config/routes.rb +43 -0
  280. data/test/mock_app/db/test.sqlite3 +1 -0
  281. data/test/mock_app/public/blank.html +33 -0
  282. data/test/mock_app/public/images/active_scaffold/DO_NOT_EDIT +2 -0
  283. data/test/mock_app/public/images/active_scaffold/default/add.gif +0 -0
  284. data/test/mock_app/public/images/active_scaffold/default/arrow_down.gif +0 -0
  285. data/test/mock_app/public/images/active_scaffold/default/arrow_up.gif +0 -0
  286. data/test/mock_app/public/images/active_scaffold/default/close.gif +0 -0
  287. data/test/mock_app/public/images/active_scaffold/default/cross.png +0 -0
  288. data/test/mock_app/public/images/active_scaffold/default/indicator-small.gif +0 -0
  289. data/test/mock_app/public/images/active_scaffold/default/indicator.gif +0 -0
  290. data/test/mock_app/public/images/active_scaffold/default/magnifier.png +0 -0
  291. data/test/mock_app/public/javascripts/active_scaffold/DO_NOT_EDIT +2 -0
  292. data/test/mock_app/public/javascripts/active_scaffold/default/active_scaffold.js +532 -0
  293. data/test/mock_app/public/javascripts/active_scaffold/default/dhtml_history.js +867 -0
  294. data/test/mock_app/public/javascripts/active_scaffold/default/form_enhancements.js +117 -0
  295. data/test/mock_app/public/javascripts/active_scaffold/default/rico_corner.js +370 -0
  296. data/test/mock_app/public/stylesheets/active_scaffold/DO_NOT_EDIT +2 -0
  297. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet-ie.css +35 -0
  298. data/test/mock_app/public/stylesheets/active_scaffold/default/stylesheet.css +848 -0
  299. data/test/model_stub.rb +55 -0
  300. data/test/run_all.rb +8 -0
  301. data/test/test_helper.rb +39 -0
  302. data/vendor/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  303. data/vendor/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  304. data/vendor/assets/images/ui-bg_flat_10_000000_40x100.png +0 -0
  305. data/vendor/assets/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  306. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  307. data/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  308. data/vendor/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  309. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  310. data/vendor/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  311. data/vendor/assets/images/ui-icons_222222_256x240.png +0 -0
  312. data/vendor/assets/images/ui-icons_228ef1_256x240.png +0 -0
  313. data/vendor/assets/images/ui-icons_ef8c08_256x240.png +0 -0
  314. data/vendor/assets/images/ui-icons_ffd27a_256x240.png +0 -0
  315. data/vendor/assets/images/ui-icons_ffffff_256x240.png +0 -0
  316. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +1276 -0
  317. data/vendor/assets/stylesheets/jquery-ui.css +568 -0
  318. metadata +502 -0
@@ -0,0 +1,1057 @@
1
+ jQuery(document).ready(function() {
2
+ jQuery('form.as_form').live('ajax:beforeSend', function(event) {
3
+ var as_form = jQuery(this).closest("form");
4
+ if (as_form && as_form.attr('data-loading') == 'true') {
5
+ ActiveScaffold.disable_form(as_form);
6
+ }
7
+ return true;
8
+ });
9
+
10
+ jQuery('form.as_form').live('ajax:complete', function(event) {
11
+ var as_form = jQuery(this).closest("form");
12
+ if (as_form && as_form.attr('data-loading') == 'true') {
13
+ ActiveScaffold.enable_form(as_form);
14
+ }
15
+ });
16
+ jQuery('form.as_form').live('ajax:error', function(event, xhr, status, error) {
17
+ var as_div = jQuery(this).closest("div.active-scaffold");
18
+ if (as_div) {
19
+ ActiveScaffold.report_500_response(as_div)
20
+ }
21
+ });
22
+ jQuery('form.as_form.as_remote_upload').live('submit', function(event) {
23
+ var as_form = jQuery(this).closest("form");
24
+ if (as_form && as_form.attr('data-loading') == 'true') {
25
+ setTimeout("ActiveScaffold.disable_form('" + as_form.attr('id') + "')", 10);
26
+ }
27
+ return true;
28
+ });
29
+ jQuery('a.as_action').live('ajax:before', function(event) {
30
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
31
+ if (action_link) {
32
+ if (action_link.is_disabled()) {
33
+ return false;
34
+ } else {
35
+ if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','visible');
36
+ action_link.disable();
37
+ }
38
+ }
39
+ return true;
40
+ });
41
+ jQuery('a.as_action').live('ajax:success', function(event, response) {
42
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
43
+ if (action_link) {
44
+ if (action_link.position) {
45
+ action_link.insert(response);
46
+ if (action_link.hide_target) action_link.target.hide();
47
+ } else {
48
+ action_link.enable();
49
+ }
50
+ jQuery(this).trigger('as:action_success', action_link);
51
+ }
52
+ return true;
53
+ });
54
+ jQuery('a.as_action').live('ajax:complete', function(event) {
55
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
56
+ if (action_link) {
57
+ if (action_link.loading_indicator) action_link.loading_indicator.css('visibility','hidden');
58
+ }
59
+ return true;
60
+ });
61
+ jQuery('a.as_action').live('ajax:error', function(event, xhr, status, error) {
62
+ var action_link = ActiveScaffold.ActionLink.get(jQuery(this));
63
+ if (action_link) {
64
+ ActiveScaffold.report_500_response(action_link.scaffold_id());
65
+ action_link.enable();
66
+ }
67
+ return true;
68
+ });
69
+ jQuery('a.as_cancel').live('ajax:before', function(event) {
70
+ var as_cancel = jQuery(this);
71
+ var action_link = ActiveScaffold.find_action_link(as_cancel);
72
+
73
+ if (action_link) {
74
+ var cancel_url = as_cancel.attr('href');
75
+ var refresh_data = as_cancel.attr('data-refresh');
76
+ if (refresh_data !== 'true' || !cancel_url) {
77
+ action_link.close();
78
+ return false;
79
+ }
80
+ }
81
+ return true;
82
+ });
83
+ jQuery('a.as_cancel').live('ajax:success', function(event, response) {
84
+ var action_link = ActiveScaffold.find_action_link(jQuery(this));
85
+
86
+ if (action_link) {
87
+ if (action_link.position) {
88
+ action_link.close(response);
89
+ } else {
90
+ response.evalResponse();
91
+ }
92
+ }
93
+ return true;
94
+ });
95
+ jQuery('a.as_cancel').live('ajax:error', function(event, xhr, status, error) {
96
+ var action_link = ActiveScaffold.find_action_link(jQuery(this));
97
+ if (action_link) {
98
+ ActiveScaffold.report_500_response(action_link.scaffold_id());
99
+ }
100
+ return true;
101
+ });
102
+ jQuery('a.as_sort').live('ajax:before', function(event) {
103
+ var as_sort = jQuery(this);
104
+ var history_controller_id = as_sort.attr('data-page-history');
105
+ if (history_controller_id) addActiveScaffoldPageToHistory(as_sort.attr('href'), history_controller_id);
106
+ as_sort.closest('th').addClass('loading');
107
+ return true;
108
+ });
109
+ jQuery('a.as_sort').live('ajax:error', function(event, xhr, status, error) {
110
+ var as_scaffold = jQuery(this).closest('.active-scaffold');
111
+ ActiveScaffold.report_500_response(as_scaffold);
112
+ return true;
113
+ });
114
+ jQuery('span.in_place_editor_field').live('hover', function(event) {
115
+ jQuery(this).data(); // $ 1.4.2 workaround
116
+ if (event.type == 'mouseenter') {
117
+ if (typeof(jQuery(this).data('editInPlace')) === 'undefined') jQuery(this).addClass("hover");
118
+ }
119
+ if (event.type == 'mouseleave') {
120
+ if (typeof(jQuery(this).data('editInPlace')) === 'undefined') jQuery(this).removeClass("hover");
121
+ }
122
+ return true;
123
+ });
124
+ jQuery('span.in_place_editor_field').live('click', function(event) {
125
+ ActiveScaffold.in_place_editor_field_clicked(jQuery(this));
126
+ });
127
+ jQuery('a.as_paginate').live('ajax:before',function(event) {
128
+ var as_paginate = jQuery(this);
129
+ var history_controller_id = as_paginate.attr('data-page-history');
130
+ if (history_controller_id) addActiveScaffoldPageToHistory(as_paginate.attr('href'), history_controller_id);
131
+ as_paginate.prevAll('img.loading-indicator').css('visibility','visible');
132
+ return true;
133
+ });
134
+ jQuery('a.as_paginate').live('ajax:error', function(event, xhr, status, error) {
135
+ var as_scaffold = jQuery(this).closest('.active-scaffold');
136
+ ActiveScaffold.report_500_response(as_scaffold);
137
+ return true;
138
+ });
139
+ jQuery('a.as_paginate').live('ajax:complete', function(event) {
140
+ jQuery(this).prevAll('img.loading-indicator').css('visibility','hidden');
141
+ return true;
142
+ });
143
+ jQuery('a.as_add_existing, a.as_replace_existing').live('ajax:before', function(event) {
144
+ var id = jQuery(this).prev().val();
145
+ if (id) {
146
+ if (!jQuery(this).data('href')) jQuery(this).data('href', jQuery(this).attr('href'));
147
+ jQuery(this).attr('href', jQuery(this).data('href').replace('--ID--', id));
148
+ return true;
149
+ } else return false;
150
+ });
151
+ jQuery('input.update_form:not(.recordselect), textarea.update_form, select.update_form').live('change', function(event) {
152
+ var element = jQuery(this);
153
+ var value = element.is("input:checkbox:not(:checked)") ? null : element.val();
154
+ ActiveScaffold.update_column(element, element.attr('data-update_url'), element.attr('data-update_send_form'), element.attr('id'), value);
155
+ return true;
156
+ });
157
+ jQuery('input.recordselect.update_form').live('recordselect:change', function(event, id, label) {
158
+ var element = jQuery(this);
159
+ ActiveScaffold.update_column(element, element.attr('data-update_url'), element.attr('data-update_send_form'), element.attr('id'), id);
160
+ return true;
161
+ });
162
+
163
+ jQuery('select.as_search_range_option').live('change', function(event) {
164
+ ActiveScaffold[jQuery(this).val() == 'BETWEEN' ? 'show' : 'hide'](jQuery(this).parent().find('.as_search_range_between'));
165
+ return true;
166
+ });
167
+
168
+ jQuery('select.as_search_range_option').live('change', function(event) {
169
+ var element = jQuery(this);
170
+ ActiveScaffold[!(element.val() == 'PAST' || element.val() == 'FUTURE' || element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_numeric'));
171
+ ActiveScaffold[(element.val() == 'PAST' || element.val() == 'FUTURE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_trend'));
172
+ ActiveScaffold[(element.val() == 'RANGE') ? 'show' : 'hide'](element.attr('id').replace(/_opt/, '_range'));
173
+ return true;
174
+ });
175
+
176
+ jQuery('select.as_update_date_operator').live('change', function(event) {
177
+ ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'show' : 'hide'](jQuery(this).next());
178
+ ActiveScaffold[jQuery(this).val() == 'REPLACE' ? 'hide' : 'show'](jQuery(this).next().next());
179
+ return true;
180
+ });
181
+
182
+ jQuery('a[data-popup]').live('click', function(e) {
183
+ window.open(jQuery(this).attr('href'));
184
+ e.preventDefault();
185
+ });
186
+
187
+ jQuery('.hover_click').live("click", function(event) {
188
+ var element = jQuery(this);
189
+ var ul_element = element.children('ul').first();
190
+ if (ul_element.is(':visible')) {
191
+ element.find('ul').hide();
192
+ } else {
193
+ ul_element.show();
194
+ }
195
+ return false;
196
+ });
197
+ jQuery('.hover_click a.as_action').live('click', function(event) {
198
+ var element = jQuery(this).closest('.hover_click');
199
+ if (element) {
200
+ element.find('ul').hide();
201
+ }
202
+ return true;
203
+ });
204
+ });
205
+
206
+ /* Simple Inheritance
207
+ http://ejohn.org/blog/simple-javascript-inheritance/
208
+ */
209
+ (function(){
210
+ var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
211
+
212
+ // The base Class implementation (does nothing)
213
+ this.Class = function(){};
214
+
215
+ // Create a new Class that inherits from this class
216
+ Class.extend = function(prop) {
217
+ var _super = this.prototype;
218
+
219
+ // Instantiate a base class (but only create the instance,
220
+ // don't run the init constructor)
221
+ initializing = true;
222
+ var prototype = new this();
223
+ initializing = false;
224
+
225
+ // Copy the properties over onto the new prototype
226
+ for (var name in prop) {
227
+ // Check if we're overwriting an existing function
228
+ prototype[name] = typeof prop[name] == "function" &&
229
+ typeof _super[name] == "function" && fnTest.test(prop[name]) ?
230
+ (function(name, fn){
231
+ return function() {
232
+ var tmp = this._super;
233
+
234
+ // Add a new ._super() method that is the same method
235
+ // but on the super-class
236
+ this._super = _super[name];
237
+
238
+ // The method only need to be bound temporarily, so we
239
+ // remove it when we're done executing
240
+ var ret = fn.apply(this, arguments);
241
+ this._super = tmp;
242
+
243
+ return ret;
244
+ };
245
+ })(name, prop[name]) :
246
+ prop[name];
247
+ }
248
+
249
+ // The dummy class constructor
250
+ function Class() {
251
+ // All construction is actually done in the init method
252
+ if ( !initializing && this.init )
253
+ this.init.apply(this, arguments);
254
+ }
255
+
256
+ // Populate our constructed prototype object
257
+ Class.prototype = prototype;
258
+
259
+ // Enforce the constructor to be what we expect
260
+ Class.constructor = Class;
261
+
262
+ // And make this class extendable
263
+ Class.extend = arguments.callee;
264
+
265
+ return Class;
266
+ };
267
+ })();
268
+
269
+ /*
270
+ $ delayed observer
271
+ (c) 2007 - Maxime Haineault (max@centdessin.com)
272
+
273
+ Special thanks to Stephen Goguen & Tane Piper.
274
+
275
+ Slight modifications by Elliot Winkler
276
+ */
277
+
278
+ if (typeof(jQuery.fn.delayedObserver) === 'undefined') {
279
+ (function() {
280
+ var delayedObserverStack = [];
281
+ var observed;
282
+
283
+ function delayedObserverCallback(stackPos) {
284
+ observed = delayedObserverStack[stackPos];
285
+ if (observed.timer) return;
286
+
287
+ observed.timer = setTimeout(function(){
288
+ observed.timer = null;
289
+ observed.callback(observed.obj.val(), observed.obj);
290
+ }, observed.delay * 1000);
291
+
292
+ observed.oldVal = observed.obj.val();
293
+ }
294
+
295
+ // going by
296
+ // <http://www.cambiaresearch.com/c4/702b8cd1-e5b0-42e6-83ac-25f0306e3e25/Javascript-Char-Codes-Key-Codes.aspx>
297
+ // I think these codes only work when using keyup or keydown
298
+ function isNonPrintableKey(event) {
299
+ var code = event.keyCode;
300
+ return (
301
+ event.metaKey ||
302
+ (code >= 9 && code <= 16) || (code >= 27 && code <= 40) || (code >= 91 && code <= 93) || (code >= 112 && code <= 145)
303
+ );
304
+ }
305
+
306
+ jQuery.fn.extend({
307
+ delayedObserver:function(delay, callback){
308
+ $this = jQuery(this);
309
+
310
+ delayedObserverStack.push({
311
+ obj: $this, timer: null, delay: delay,
312
+ oldVal: $this.val(), callback: callback
313
+ });
314
+
315
+ stackPos = delayedObserverStack.length-1;
316
+
317
+ $this.keyup(function(event) {
318
+ if (isNonPrintableKey(event)) return;
319
+ observed = delayedObserverStack[stackPos];
320
+ if (observed.obj.val() == observed.obj.oldVal) return;
321
+ else delayedObserverCallback(stackPos);
322
+ });
323
+ }
324
+ });
325
+ })();
326
+ };
327
+
328
+
329
+ /*
330
+ * Simple utility methods
331
+ */
332
+
333
+ var ActiveScaffold = {
334
+ records_for: function(tbody_id) {
335
+ if (typeof(tbody_id) == 'string') tbody_id = '#' + tbody_id;
336
+ return jQuery(tbody_id).children('.record');
337
+ },
338
+ stripe: function(tbody_id) {
339
+ var even = false;
340
+ var rows = this.records_for(tbody_id);
341
+
342
+ rows.each(function (index, row_node) {
343
+ row = jQuery(row_node);
344
+ if (row_node.tagName != 'SCRIPT'
345
+ && !row.hasClass("create")
346
+ && !row.hasClass("update")
347
+ && !row.hasClass("inline-adapter")
348
+ && !row.hasClass("active-scaffold-calculations")) {
349
+
350
+ if (even) row.addClass("even-record");
351
+ else row.removeClass("even-record");
352
+
353
+ even = !even;
354
+ }
355
+ });
356
+ },
357
+ hide_empty_message: function(tbody) {
358
+ if (this.records_for(tbody).length != 0) {
359
+ var empty_message_node = jQuery(tbody).parent().find('tbody.messages p.empty-message')
360
+ if (empty_message_node) empty_message_node.hide();
361
+ }
362
+ },
363
+ reload_if_empty: function(tbody, url) {
364
+ if (this.records_for(tbody).length == 0) {
365
+ jQuery.getScript(url);
366
+ }
367
+ },
368
+ removeSortClasses: function(scaffold) {
369
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
370
+ scaffold = jQuery(scaffold)
371
+ scaffold.find('td.sorted').each(function(element) {
372
+ element.removeClass("sorted");
373
+ });
374
+ scaffold.find('th.sorted').each(function(element) {
375
+ element.removeClass("sorted");
376
+ element.removeClass("asc");
377
+ element.removeClass("desc");
378
+ });
379
+ },
380
+ decrement_record_count: function(scaffold) {
381
+ // decrement the last record count, firsts record count are in nested lists
382
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
383
+ scaffold = jQuery(scaffold)
384
+ count = scaffold.find('span.active-scaffold-records').last();
385
+ if (count) count.html(parseInt(count.html(), 10) - 1);
386
+ },
387
+ increment_record_count: function(scaffold) {
388
+ // increment the last record count, firsts record count are in nested lists
389
+ if (typeof(scaffold) == 'string') scaffold = '#' + scaffold;
390
+ scaffold = jQuery(scaffold)
391
+ count = scaffold.find('span.active-scaffold-records').last();
392
+ if (count) count.html(parseInt(count.html(), 10) + 1);
393
+ },
394
+ update_row: function(row, html) {
395
+ var even_row = false;
396
+ var replaced = null;
397
+ if (typeof(row) == 'string') row = '#' + row;
398
+ row = jQuery(row);
399
+ if (row.hasClass('even-record')) even_row = true;
400
+
401
+ replaced = this.replace(row, html);
402
+ if (even_row === true) replaced.addClass('even-record');
403
+ ActiveScaffold.highlight(replaced);
404
+ },
405
+
406
+ replace: function(element, html) {
407
+ if (typeof(element) == 'string') element = '#' + element;
408
+ element = jQuery(element);
409
+ element.replaceWith(html);
410
+ if (element.attr('id')) {
411
+ element = jQuery('#' + element.attr('id'));
412
+ }
413
+ return element;
414
+ },
415
+
416
+ replace_html: function(element, html) {
417
+ if (typeof(element) == 'string') element = '#' + element;
418
+ element = jQuery(element);
419
+ element.html(html);
420
+ return element;
421
+ },
422
+
423
+ remove: function(element) {
424
+ if (typeof(element) == 'string') element = '#' + element;
425
+ jQuery(element).remove();
426
+ },
427
+
428
+ hide: function(element) {
429
+ if (typeof(element) == 'string') element = '#' + element;
430
+ jQuery(element).hide();
431
+ },
432
+
433
+ show: function(element) {
434
+ if (typeof(element) == 'string') element = '#' + element;
435
+ jQuery(element).show();
436
+ },
437
+
438
+ reset_form: function(element) {
439
+ if (typeof(element) == 'string') element = '#' + element;
440
+ jQuery(element).get(0).reset();
441
+ },
442
+
443
+ disable_form: function(as_form) {
444
+ if (typeof(as_form) == 'string') as_form = '#' + as_form;
445
+ as_form = jQuery(as_form)
446
+ var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
447
+ if (loading_indicator) loading_indicator.css('visibility','visible');
448
+ jQuery('input[type=submit]', as_form).attr('disabled', 'disabled');
449
+ as_form[0].disabled_fields = jQuery("input:enabled,select:enabled,textarea:enabled", as_form).attr('disabled', 'disabled');
450
+ },
451
+
452
+ enable_form: function(as_form) {
453
+ if (typeof(as_form) == 'string') as_form = '#' + as_form;
454
+ as_form = jQuery(as_form)
455
+ var loading_indicator = jQuery('#' + as_form.attr('id').replace(/-form$/, '-loading-indicator'));
456
+ if (loading_indicator) loading_indicator.css('visibility','hidden');
457
+ jQuery('input[type=submit]', as_form).removeAttr('disabled');
458
+ as_form[0].disabled_fields.removeAttr('disabled');
459
+ },
460
+
461
+ focus_first_element_of_form: function(form_element) {
462
+ if (typeof(form_element) == 'string') form_element = '#' + form_element;
463
+ jQuery(form_element + ":first *:input[type!=hidden]:first").focus();
464
+ },
465
+
466
+ create_record_row: function(active_scaffold_id, html, options) {
467
+ if (typeof(active_scaffold_id) == 'string') active_scaffold_id = '#' + active_scaffold_id;
468
+ tbody = jQuery(active_scaffold_id).find('tbody.records');
469
+
470
+ if (options.insert_at == 'top') {
471
+ tbody.prepend(html);
472
+ var new_row = tbody.children('tr.record:first-child');
473
+ } else if (options.insert_at == 'bottom') {
474
+ var rows = tbody.children('tr.record, tr.inline-adapter');
475
+ var new_row = null;
476
+ if (rows.length > 0) {
477
+ new_row = rows.last().after(html).next();
478
+ } else {
479
+ new_row = tbody.append(html).children().last();
480
+ }
481
+ }
482
+ this.stripe(tbody);
483
+ this.hide_empty_message(tbody);
484
+ this.increment_record_count(tbody.closest('div.active-scaffold'));
485
+ ActiveScaffold.highlight(new_row);
486
+ },
487
+
488
+ delete_record_row: function(row, page_reload_url) {
489
+ if (typeof(row) == 'string') row = '#' + row;
490
+ row = jQuery(row);
491
+ var tbody = row.closest('tbody.records');
492
+
493
+ var current_action_node = row.find('td.actions a.disabled').first();
494
+ if (current_action_node) {
495
+ var action_link = ActiveScaffold.ActionLink.get(current_action_node);
496
+ if (action_link) {
497
+ action_link.close_previous_adapter();
498
+ }
499
+ }
500
+
501
+ row.remove();
502
+ this.stripe(tbody);
503
+ this.decrement_record_count(tbody.closest('div.active-scaffold'));
504
+ this.reload_if_empty(tbody, page_reload_url);
505
+ },
506
+
507
+ delete_subform_record: function(record) {
508
+ if (typeof(record) == 'string') record = '#' + record;
509
+ record = jQuery(record);
510
+ var errors = record.prev();
511
+ if (errors.hasClass('association-record-errors')) {
512
+ this.remove(errors);
513
+ }
514
+ var associated = jQuery(record).next();
515
+ this.remove(record);
516
+ while (associated.hasClass('associated-record')) {
517
+ record = associated;
518
+ associated = jQuery(record).next();
519
+ this.remove(record);
520
+ }
521
+ },
522
+
523
+ report_500_response: function(active_scaffold_id) {
524
+ server_error = jQuery(active_scaffold_id).find('td.messages-container p.server-error');
525
+ if (!jQuery(server_error).is(':visible')) {
526
+ server_error.show();
527
+ }
528
+ },
529
+
530
+ find_action_link: function(element) {
531
+ if (typeof(element) == 'string') element = '#' + element;
532
+ var as_adapter = jQuery(element).closest('.as_adapter');
533
+ return ActiveScaffold.ActionLink.get(as_adapter);
534
+ },
535
+
536
+ scroll_to: function(element) {
537
+ if (typeof(element) == 'string') element = '#' + element;
538
+ var form_offset = jQuery(element).offset(),
539
+ destination = form_offset.top;
540
+ jQuery(document).scrollTop(destination);
541
+ },
542
+
543
+ process_checkbox_inplace_edit: function(checkbox, options) {
544
+ var checked = checkbox.is(':checked');
545
+ if (checked === true) options['params'] += '&value=1';
546
+ jQuery.ajax({
547
+ url: options.url,
548
+ type: "POST",
549
+ data: options['params'],
550
+ dataType: options.ajax_data_type,
551
+ after: function(request){
552
+ checkbox.attr('disabled', 'disabled');
553
+ },
554
+ complete: function(request){
555
+ checkbox.removeAttr('disabled');
556
+ }
557
+ });
558
+ },
559
+
560
+ read_inplace_edit_heading_attributes: function(column_heading, options) {
561
+ if (column_heading.attr('data-ie_cancel_text')) options.cancel_button = '<button class="inplace_cancel">' + column_heading.attr('data-ie_cancel_text') + "</button>";
562
+ if (column_heading.attr('data-ie_loading_text')) options.loading_text = column_heading.attr('data-ie_loading_text');
563
+ if (column_heading.attr('data-ie_saving_text')) options.saving_text = column_heading.attr('data-ie_saving_text');
564
+ if (column_heading.attr('data-ie_save_text')) options.save_button = '<button class="inplace_save">' + column_heading.attr('data-ie_save_text') + "</button>";
565
+ if (column_heading.attr('data-ie_rows')) options.textarea_rows = column_heading.attr('data-ie_rows');
566
+ if (column_heading.attr('data-ie_cols')) options.textarea_cols = column_heading.attr('data-ie_cols');
567
+ if (column_heading.attr('data-ie_size')) options.text_size = column_heading.attr('data-ie_size');
568
+ },
569
+
570
+ create_inplace_editor: function(span, options) {
571
+ span.removeClass('hover');
572
+ span.editInPlace(options);
573
+ span.trigger('click.editInPlace');
574
+ },
575
+
576
+ highlight: function(element) {
577
+ if (typeof(element) == 'string') element = jQuery('#' + element);
578
+ if (typeof(element.effect) == 'function') {
579
+ element.effect("highlight", {}, 3000);
580
+ }
581
+ },
582
+
583
+ create_visibility_toggle: function(element, options) {
584
+ if (typeof(element) == 'string') element = '#' + element;
585
+ var toggable = jQuery(element);
586
+ var toggler = toggable.prev();
587
+ var initial_label = (options.default_visible === true) ? options.hide_label : options.show_label;
588
+
589
+ toggler.append(' (<a class="visibility-toggle" href="#">' + initial_label + '</a>)');
590
+ toggler.children('a').click(function() {
591
+ toggable.toggle();
592
+ jQuery(this).html((toggable.is(':hidden')) ? options.show_label : options.hide_label);
593
+ return false;
594
+ });
595
+ },
596
+
597
+ create_associated_record_form: function(element, content, options) {
598
+ if (typeof(element) == 'string') element = '#' + element;
599
+ var element = jQuery(element);
600
+ if (options.singular == false) {
601
+ if (!(options.id && jQuery('#' + options.id).size() > 0)) {
602
+ element.append(content);
603
+ }
604
+ } else {
605
+ var current = jQuery('#' + element.attr('id') + ' .association-record')
606
+ if (current[0]) {
607
+ this.replace(current[0], content);
608
+ } else {
609
+ element.prepend(content);
610
+ }
611
+ }
612
+ },
613
+
614
+ render_form_field: function(source, content, options) {
615
+ if (typeof(source) == 'string') source = '#' + source;
616
+ var source = jQuery(source);
617
+ var element = source.closest('.association-record');
618
+ if (element.length == 0) {
619
+ element = source.closest('form > ol.form');
620
+ }
621
+ element = element.find('.' + options.field_class + ":first");
622
+
623
+ if (element) {
624
+ if (options.is_subform == false) {
625
+ this.replace(element.closest('dl'), content);
626
+ } else {
627
+ this.replace_html(element, content);
628
+ }
629
+ }
630
+ },
631
+
632
+ sortable: function(element, controller, options, url_params) {
633
+ if (typeof(element) == 'string') element = '#' + element;
634
+ var element = jQuery(element);
635
+ var sortable_options = {};
636
+ if (options.update === true) {
637
+ url_params.authenticity_token = jQuery('meta[name=csrf-param]').attr('content');
638
+ sortable_options.update = function(event, ui) {
639
+ var url = controller + '/' + options.action + '?'
640
+ url += jQuery(this).sortable('serialize',{key: encodeURIComponent(jQuery(this).attr('id') + '[]'), expression:/^[^_-](?:[A-Za-z0-9_-]*)-(.*)-row$/});
641
+ jQuery.post(url.append_params(url_params));
642
+ }
643
+ }
644
+ element.sortable(sortable_options);
645
+ },
646
+
647
+ record_select_onselect: function(edit_associated_url, active_scaffold_id, id){
648
+ jQuery.ajax({
649
+ url: edit_associated_url.split('--ID--').join(id),
650
+ error: function(xhr, textStatus, errorThrown){
651
+ ActiveScaffold.report_500_response(active_scaffold_id)
652
+ }
653
+ });
654
+ },
655
+
656
+ // element is tbody id
657
+ mark_records: function(element, options) {
658
+ if (typeof(element) == 'string') element = '#' + element;
659
+ var element = jQuery(element);
660
+ var mark_checkboxes = jQuery('#' + element.attr('id') + ' > tr.record td.marked-column input[type="checkbox"]');
661
+ mark_checkboxes.each(function (index) {
662
+ var item = jQuery(this);
663
+ if(options.checked === true) {
664
+ item.attr('checked', 'checked');
665
+ } else {
666
+ item.removeAttr('checked');
667
+ }
668
+ item.attr('value', ('' + !options.checked));
669
+ });
670
+ if(options.include_mark_all === true) {
671
+ var mark_all_checkbox = element.prev('thead').find('th.marked-column_heading span input[type="checkbox"]');
672
+ if(options.checked === true) {
673
+ mark_all_checkbox.attr('checked', 'checked');
674
+ } else {
675
+ mark_all_checkbox.removeAttr('checked');
676
+ }
677
+ mark_all_checkbox.attr('value', ('' + !options.checked));
678
+ }
679
+ },
680
+
681
+ in_place_editor_field_clicked: function(span) {
682
+ span.data(); // $ 1.4.2 workaround
683
+ if (typeof(span.data('editInPlace')) === 'undefined') {
684
+ var options = {show_buttons: true,
685
+ hover_class: 'hover',
686
+ element_id: 'editor_id',
687
+ ajax_data_type: "script",
688
+ update_value: 'value'},
689
+ csrf_param = jQuery('meta[name=csrf-param]').first(),
690
+ csrf_token = jQuery('meta[name=csrf-token]').first(),
691
+ my_parent = span.parent(),
692
+ column_heading = null;
693
+
694
+ if(!(my_parent.is('td') || my_parent.is('th'))){
695
+ my_parent = span.parents('td').eq(0);
696
+ }
697
+
698
+ if (my_parent.is('td')) {
699
+ var column_no = my_parent.prevAll('td').length;
700
+ column_heading = my_parent.closest('.active-scaffold').find('th:eq(' + column_no + ')');
701
+ } else if (my_parent.is('th')) {
702
+ column_heading = my_parent;
703
+ }
704
+
705
+ var render_url = column_heading.attr('data-ie_render_url'),
706
+ mode = column_heading.attr('data-ie_mode'),
707
+ record_id = span.attr('data-ie_id');
708
+
709
+ ActiveScaffold.read_inplace_edit_heading_attributes(column_heading, options);
710
+
711
+ if (span.attr('data-ie_url')) {
712
+ options.url = span.attr('data-ie_url').replace(/__id__/, record_id);
713
+ } else {
714
+ options.url = column_heading.attr('data-ie_url').replace(/__id__/, record_id);
715
+ }
716
+
717
+ if (csrf_param) options['params'] = csrf_param.attr('content') + '=' + csrf_token.attr('content');
718
+
719
+ if (span.closest('div.active-scaffold').attr('data-eid')) {
720
+ if (options['params'].length > 0) {
721
+ options['params'] += "&";
722
+ }
723
+ options['params'] += ("eid=" + span.closest('div.active-scaffold').attr('data-eid'));
724
+ }
725
+
726
+ if (mode === 'clone') {
727
+ options.clone_id_suffix = record_id;
728
+ options.clone_selector = '#' + column_heading.attr('id') + ' .as_inplace_pattern';
729
+ options.field_type = 'clone';
730
+ }
731
+
732
+ if (render_url) {
733
+ var plural = false;
734
+ if (column_heading.attr('data-ie_plural')) plural = true;
735
+ options.field_type = 'remote';
736
+ options.editor_url = render_url.replace(/__id__/, record_id)
737
+ }
738
+ if (mode === 'inline_checkbox') {
739
+ ActiveScaffold.process_checkbox_inplace_edit(span.find('input:checkbox'), options);
740
+ } else {
741
+ ActiveScaffold.create_inplace_editor(span, options);
742
+ }
743
+ }
744
+ },
745
+
746
+ update_column: function(element, url, send_form, source_id, val) {
747
+ if (!element) element = jQuery('#' + source_id);
748
+ var as_form = element.closest('form.as_form');
749
+ var params = null;
750
+
751
+ if (send_form) {
752
+ var selector;
753
+ if (selector = element.data('update_send_form_selector'))
754
+ params = as_form.find(selector).serialize();
755
+ else params = as_form.serialize();
756
+ params += '&' + jQuery.param({"source_id": source_id});
757
+ } else {
758
+ params = {value: val};
759
+ params.source_id = source_id;
760
+ }
761
+
762
+ jQuery.ajax({
763
+ url: url,
764
+ data: params,
765
+ beforeSend: function(event) {
766
+ element.nextAll('img.loading-indicator').css('visibility','visible');
767
+ ActiveScaffold.disable_form(as_form);
768
+ },
769
+ complete: function(event) {
770
+ element.nextAll('img.loading-indicator').css('visibility','hidden');
771
+ ActiveScaffold.enable_form(as_form);
772
+ },
773
+ error: function (xhr, status, error) {
774
+ var as_div = element.closest("div.active-scaffold");
775
+ if (as_div) {
776
+ ActiveScaffold.report_500_response(as_div);
777
+ }
778
+ }
779
+ });
780
+ },
781
+
782
+ draggable_lists: function(element) {
783
+ jQuery('#' + element).draggable_lists();
784
+ }
785
+ }
786
+
787
+ /*
788
+ * DHTML history tie-in
789
+ */
790
+ function addActiveScaffoldPageToHistory(url, active_scaffold_id) {
791
+ if (typeof dhtmlHistory == 'undefined') return; // it may not be loaded
792
+
793
+ var array = url.split('?');
794
+ var qs = new Querystring(array[1]);
795
+ var sort = qs.get('sort')
796
+ var dir = qs.get('sort_direction')
797
+ var page = qs.get('page')
798
+ if (sort || dir || page) dhtmlHistory.add(active_scaffold_id+":"+page+":"+sort+":"+dir, url);
799
+ }
800
+
801
+ /*
802
+ * URL modification support. Incomplete functionality.
803
+ */
804
+ String.prototype.append_params = function(params) {
805
+ var url = this;
806
+ if (url.indexOf('?') == -1) url += '?';
807
+ else if (url.lastIndexOf('&') != url.length) url += '&';
808
+
809
+ for(var key in params) {
810
+ if (key) url += (key + '=' + params[key] + '&');
811
+ }
812
+
813
+ // the loop leaves a comma dangling at the end of string, chop it off
814
+ url = url.substring(0, url.length-1);
815
+ return url;
816
+ };
817
+
818
+
819
+ /**
820
+ * A set of links. As a set, they can be controlled such that only one is "open" at a time, etc.
821
+ */
822
+ ActiveScaffold.Actions = new Object();
823
+ ActiveScaffold.Actions.Abstract = Class.extend({
824
+ init: function(links, target, loading_indicator, options) {
825
+ this.target = jQuery(target);
826
+ this.loading_indicator = jQuery(loading_indicator);
827
+ this.options = options;
828
+ var _this = this;
829
+ this.links = jQuery.map(links, function(link) {
830
+ var my_link = _this.instantiate_link(link);
831
+ return my_link;
832
+ });
833
+ },
834
+
835
+ instantiate_link: function(link) {
836
+ throw 'unimplemented'
837
+ }
838
+ });
839
+
840
+ /**
841
+ * A DataStructures::ActionLink, represented in JavaScript.
842
+ * Concerned with AJAX-enabling a link and adapting the result for insertion into the table.
843
+ */
844
+ ActiveScaffold.ActionLink = {
845
+ get: function(element) {
846
+ if (typeof(element) == 'string') element = '#' + element;
847
+ var element = jQuery(element);
848
+ if (element.length > 0) {
849
+ element.data(); // $ 1.4.2 workaround
850
+ if (typeof(element.data('action_link')) === 'undefined' && !element.hasClass('as_adapter')) {
851
+ var parent = element.closest('.actions');
852
+ if (parent.length === 0) {
853
+ // maybe an column action_link
854
+ parent = element.parent();
855
+ }
856
+ if (parent && parent.is('td')) {
857
+ // record action
858
+ parent = parent.closest('tr.record');
859
+ var target = parent.find('a.as_action');
860
+ var loading_indicator = parent.find('td.actions .loading-indicator');
861
+ new ActiveScaffold.Actions.Record(target, parent, loading_indicator);
862
+ } else if (parent && parent.is('div')) {
863
+ //table action
864
+ new ActiveScaffold.Actions.Table(parent.find('a.as_action'), parent.closest('div.active-scaffold').find('tbody.before-header'), parent.find('.loading-indicator'));
865
+ }
866
+ element = jQuery(element);
867
+ }
868
+ return element.data('action_link');
869
+ } else {
870
+ return null;
871
+ }
872
+ }
873
+ };
874
+ ActiveScaffold.ActionLink.Abstract = Class.extend({
875
+ init: function(a, target, loading_indicator) {
876
+ this.tag = jQuery(a);
877
+ this.url = this.tag.attr('href');
878
+ this.method = this.tag.attr('data-method') || 'get';
879
+ this.target = target;
880
+ this.loading_indicator = loading_indicator;
881
+ this.hide_target = false;
882
+ this.position = this.tag.attr('data-position');
883
+ this.action = this.tag.attr('data-action');
884
+
885
+ this.tag.data('action_link', this);
886
+ return this;
887
+ },
888
+
889
+ open: function(event) {
890
+ },
891
+
892
+ insert: function(content) {
893
+ throw 'unimplemented'
894
+ },
895
+
896
+ close: function() {
897
+ this.enable();
898
+ this.adapter.remove();
899
+ if (this.hide_target) this.target.show();
900
+ if (ActiveScaffold.config.scroll_on_close) ActiveScaffold.scroll_to(this.target);
901
+ },
902
+
903
+ reload: function() {
904
+ this.close();
905
+ this.open();
906
+ },
907
+
908
+ get_new_adapter_id: function() {
909
+ var id = 'adapter_';
910
+ var i = 0;
911
+ while (jQuery(id + i)) i++;
912
+ return id + i;
913
+ },
914
+
915
+ enable: function() {
916
+ return this.tag.removeClass('disabled');
917
+ },
918
+
919
+ disable: function() {
920
+ return this.tag.addClass('disabled');
921
+ },
922
+
923
+ is_disabled: function() {
924
+ return this.tag.hasClass('disabled');
925
+ },
926
+
927
+ scaffold_id: function() {
928
+ return '#' + this.tag.closest('div.active-scaffold').attr('id');
929
+ },
930
+
931
+ scaffold: function() {
932
+ return this.tag.closest('div.active-scaffold');
933
+ },
934
+
935
+ update_flash_messages: function(messages) {
936
+ message_node = jQuery(this.scaffold_id().replace(/-active-scaffold/, '-messages'));
937
+ if (message_node) message_node.html(messages);
938
+ },
939
+ set_adapter: function(element) {
940
+ this.adapter = element;
941
+ this.adapter.addClass('as_adapter');
942
+ this.adapter.data('action_link', this);
943
+ if (this.refresh_url) jQuery('.as_cancel[data-refresh=true]', this.adapter).attr('href', this.refresh_url);
944
+ }
945
+ });
946
+
947
+ /**
948
+ * Concrete classes for record actions
949
+ */
950
+ ActiveScaffold.Actions.Record = ActiveScaffold.Actions.Abstract.extend({
951
+ instantiate_link: function(link) {
952
+ var l = new ActiveScaffold.ActionLink.Record(link, this.target, this.loading_indicator);
953
+ var refresh = this.target.attr('data-refresh');
954
+ if (refresh) l.refresh_url = refresh;
955
+
956
+ if (l.position) {
957
+ l.url = l.url.append_params({adapter: '_list_inline_adapter'});
958
+ l.tag.attr('href', l.url);
959
+ }
960
+ l.set = this;
961
+ return l;
962
+ }
963
+ });
964
+
965
+ ActiveScaffold.ActionLink.Record = ActiveScaffold.ActionLink.Abstract.extend({
966
+ close_previous_adapter: function() {
967
+ var _this = this;
968
+ jQuery.each(this.set.links, function(index, item) {
969
+ if (item.url != _this.url && item.is_disabled() && item.adapter) {
970
+ item.enable();
971
+ item.adapter.remove();
972
+ }
973
+ });
974
+ },
975
+
976
+ insert: function(content) {
977
+ this.close_previous_adapter();
978
+
979
+ if (this.position == 'replace') {
980
+ this.position = 'after';
981
+ this.hide_target = true;
982
+ }
983
+
984
+ if (this.position == 'after') {
985
+ this.target.after(content);
986
+ this.set_adapter(this.target.next());
987
+ }
988
+ else if (this.position == 'before') {
989
+ this.target.before(content);
990
+ this.set_adapter(this.target.prev());
991
+ }
992
+ else {
993
+ return false;
994
+ }
995
+ ActiveScaffold.highlight(this.adapter.find('td'));
996
+ },
997
+
998
+ close: function(refreshed_content) {
999
+ if (refreshed_content) {
1000
+ ActiveScaffold.update_row(this.target, refreshed_content);
1001
+ }
1002
+ this._super();
1003
+ },
1004
+
1005
+ enable: function() {
1006
+ var _this = this;
1007
+ jQuery.each(this.set.links, function(index, item) {
1008
+ if (item.url != _this.url) return;
1009
+ item.tag.removeClass('disabled');
1010
+ });
1011
+ },
1012
+
1013
+ disable: function() {
1014
+ var _this = this;
1015
+ jQuery.each(this.set.links, function(index, item) {
1016
+ if (item.url != _this.url) return;
1017
+ item.tag.addClass('disabled');
1018
+ });
1019
+ },
1020
+
1021
+ set_opened: function() {
1022
+ if (this.position == 'after') {
1023
+ this.set_adapter(this.target.next());
1024
+ }
1025
+ else if (this.position == 'before') {
1026
+ this.set_adapter(this.target.prev());
1027
+ }
1028
+ this.disable();
1029
+ }
1030
+ });
1031
+
1032
+ /**
1033
+ * Concrete classes for table actions
1034
+ */
1035
+ ActiveScaffold.Actions.Table = ActiveScaffold.Actions.Abstract.extend({
1036
+ instantiate_link: function(link) {
1037
+ var l = new ActiveScaffold.ActionLink.Table(link, this.target, this.loading_indicator);
1038
+ if (l.position) {
1039
+ l.url = l.url.append_params({adapter: '_list_inline_adapter'});
1040
+ l.tag.attr('href', l.url);
1041
+ }
1042
+ return l;
1043
+ }
1044
+ });
1045
+
1046
+ ActiveScaffold.ActionLink.Table = ActiveScaffold.ActionLink.Abstract.extend({
1047
+ insert: function(content) {
1048
+ if (this.position == 'top') {
1049
+ this.target.prepend(content);
1050
+ this.set_adapter(this.target.children().first());
1051
+ }
1052
+ else {
1053
+ throw 'Unknown position "' + this.position + '"'
1054
+ }
1055
+ ActiveScaffold.highlight(this.adapter.find('td').first().children());
1056
+ }
1057
+ });