typo 4.0.3 → 4.1

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 (652) hide show
  1. data/CHANGES-4.1 +83 -0
  2. data/MAINTAINERS +3 -7
  3. data/README +1 -1
  4. data/{components/sidebars/README → README.SIDEBARS} +3 -0
  5. data/Rakefile +1 -1
  6. data/TODO-4.1 +16 -0
  7. data/app/apis/blogger_service.rb +3 -3
  8. data/app/apis/meta_weblog_service.rb +4 -21
  9. data/app/apis/movable_type_service.rb +5 -5
  10. data/app/controllers/accounts_controller.rb +6 -3
  11. data/app/controllers/admin/blacklist_controller.rb +1 -1
  12. data/app/controllers/admin/cache_controller.rb +3 -7
  13. data/app/controllers/admin/content_controller.rb +46 -24
  14. data/app/controllers/admin/feedback_controller.rb +3 -3
  15. data/app/controllers/admin/general_controller.rb +3 -3
  16. data/app/controllers/admin/pages_controller.rb +7 -3
  17. data/app/controllers/admin/sidebar_controller.rb +19 -26
  18. data/app/controllers/admin/textfilters_controller.rb +3 -1
  19. data/app/controllers/admin/themes_controller.rb +1 -1
  20. data/app/controllers/admin/users_controller.rb +1 -1
  21. data/app/controllers/application.rb +25 -27
  22. data/app/controllers/articles_controller.rb +14 -18
  23. data/app/controllers/content_controller.rb +7 -7
  24. data/app/controllers/live_controller.rb +1 -1
  25. data/app/controllers/redirect_controller.rb +2 -0
  26. data/app/controllers/textfilter_controller.rb +0 -3
  27. data/app/controllers/theme_controller.rb +10 -5
  28. data/app/controllers/xml_controller.rb +7 -9
  29. data/app/helpers/admin/base_helper.rb +10 -5
  30. data/app/helpers/admin/content_helper.rb +6 -0
  31. data/app/helpers/admin/feedback_helper.rb +1 -1
  32. data/app/helpers/admin/pages_helper.rb +5 -0
  33. data/app/helpers/application_helper.rb +84 -51
  34. data/app/helpers/articles_helper.rb +29 -29
  35. data/app/helpers/mail_helper.rb +3 -2
  36. data/app/helpers/sidebar_helper.rb +25 -16
  37. data/app/helpers/xml_helper.rb +0 -16
  38. data/app/models/article.rb +90 -32
  39. data/app/models/blog.rb +82 -74
  40. data/app/models/blog_sweeper.rb +33 -8
  41. data/app/models/categorization.rb +4 -0
  42. data/app/models/category.rb +21 -4
  43. data/app/models/comment.rb +23 -21
  44. data/app/models/content.rb +106 -64
  45. data/app/models/content_state/base.rb +12 -3
  46. data/app/models/content_state/draft.rb +2 -3
  47. data/app/models/content_state/factory.rb +1 -1
  48. data/app/models/content_state/ham.rb +0 -1
  49. data/app/models/content_state/just_marked_as_ham.rb +8 -1
  50. data/app/models/content_state/just_marked_as_spam.rb +4 -1
  51. data/app/models/content_state/just_presumed_ham.rb +14 -14
  52. data/app/models/content_state/just_published.rb +11 -18
  53. data/app/models/content_state/just_withdrawn.rb +11 -0
  54. data/app/models/content_state/new.rb +0 -1
  55. data/app/models/content_state/presumed_ham.rb +9 -3
  56. data/app/models/content_state/presumed_spam.rb +4 -1
  57. data/app/models/content_state/publication_pending.rb +4 -4
  58. data/app/models/content_state/published.rb +7 -8
  59. data/app/models/content_state/spam.rb +0 -1
  60. data/app/models/content_state/unclassified.rb +12 -3
  61. data/app/models/content_state/withdrawn.rb +5 -6
  62. data/app/models/email_notifier.rb +1 -1
  63. data/app/models/feedback.rb +31 -11
  64. data/app/models/notification.rb +4 -0
  65. data/app/models/notification_mailer.rb +8 -8
  66. data/app/models/page.rb +19 -5
  67. data/app/models/ping.rb +27 -40
  68. data/app/models/sidebar.rb +241 -11
  69. data/app/models/tag.rb +12 -1
  70. data/app/models/text_filter.rb +33 -39
  71. data/app/models/theme.rb +9 -0
  72. data/app/models/trackback.rb +1 -5
  73. data/app/models/user.rb +7 -5
  74. data/app/views/accounts/login.rhtml +19 -15
  75. data/app/views/accounts/logout.rhtml +4 -4
  76. data/app/views/accounts/signup.rhtml +9 -9
  77. data/app/views/admin/base/_recent_comments.rhtml +2 -2
  78. data/app/views/admin/base/_recent_trackbacks.rhtml +2 -2
  79. data/app/views/admin/blacklist/_blacklist_patterns.rhtml +4 -4
  80. data/app/views/admin/blacklist/_form.rhtml +3 -3
  81. data/app/views/admin/blacklist/_quick_post.rhtml +7 -6
  82. data/app/views/admin/blacklist/destroy.rhtml +5 -5
  83. data/app/views/admin/blacklist/edit.rhtml +7 -7
  84. data/app/views/admin/blacklist/list.rhtml +2 -2
  85. data/app/views/admin/cache/list.rhtml +2 -2
  86. data/app/views/admin/categories/_categories.rhtml +3 -3
  87. data/app/views/admin/categories/_form.rhtml +1 -1
  88. data/app/views/admin/categories/_quick_post.rhtml +5 -5
  89. data/app/views/admin/categories/destroy.rhtml +7 -7
  90. data/app/views/admin/categories/edit.rhtml +6 -6
  91. data/app/views/admin/categories/list.rhtml +7 -4
  92. data/app/views/admin/categories/reorder.rhtml +1 -1
  93. data/app/views/admin/categories/show.rhtml +6 -6
  94. data/app/views/admin/comments/_form.rhtml +4 -4
  95. data/app/views/admin/comments/comments.rhtml +1 -1
  96. data/app/views/admin/comments/destroy.rhtml +6 -6
  97. data/app/views/admin/comments/edit.rhtml +8 -8
  98. data/app/views/admin/comments/list.rhtml +11 -11
  99. data/app/views/admin/comments/new.rhtml +7 -7
  100. data/app/views/admin/comments/show.rhtml +7 -7
  101. data/app/views/admin/content/_articles.rhtml +12 -10
  102. data/app/views/admin/content/_attachment.rhtml +15 -17
  103. data/app/views/admin/content/_form.rhtml +68 -45
  104. data/app/views/admin/content/_pages.rhtml +2 -2
  105. data/app/views/admin/content/_quick_post.rhtml +6 -6
  106. data/app/views/admin/content/_show_categories.rhtml +2 -2
  107. data/app/views/admin/content/_show_resources.rhtml +2 -2
  108. data/app/views/admin/content/destroy.rhtml +8 -8
  109. data/app/views/admin/content/edit.rhtml +8 -26
  110. data/app/views/admin/content/list.rhtml +4 -4
  111. data/app/views/admin/content/new.rhtml +5 -25
  112. data/app/views/admin/content/preview.rhtml +9 -2
  113. data/app/views/admin/content/show.rhtml +10 -9
  114. data/app/views/admin/feedback/_item.rhtml +2 -2
  115. data/app/views/admin/feedback/list.rhtml +21 -20
  116. data/app/views/admin/general/index.rhtml +261 -239
  117. data/app/views/admin/general/update_database.rhtml +15 -15
  118. data/app/views/admin/pages/_form.rhtml +32 -15
  119. data/app/views/admin/pages/_pages.rhtml +9 -8
  120. data/app/views/admin/pages/_quick_post.rhtml +2 -2
  121. data/app/views/admin/pages/destroy.rhtml +7 -7
  122. data/app/views/admin/pages/edit.rhtml +7 -26
  123. data/app/views/admin/pages/list.rhtml +4 -3
  124. data/app/views/admin/pages/new.rhtml +5 -22
  125. data/app/views/admin/pages/preview.rhtml +1 -1
  126. data/app/views/admin/pages/show.rhtml +5 -5
  127. data/app/views/admin/resources/_itunes_category_edit.rhtml +2 -2
  128. data/app/views/admin/resources/_metadata_add.rhtml +13 -13
  129. data/app/views/admin/resources/_metadata_edit.rhtml +14 -14
  130. data/app/views/admin/resources/_mime_edit.rhtml +5 -5
  131. data/app/views/admin/resources/_pages.rhtml +2 -2
  132. data/app/views/admin/resources/_resources.rhtml +8 -8
  133. data/app/views/admin/resources/destroy.rhtml +7 -7
  134. data/app/views/admin/resources/list.rhtml +6 -3
  135. data/app/views/admin/resources/new.rhtml +7 -3
  136. data/app/views/admin/shared/_edit.rhtml +17 -0
  137. data/app/views/admin/sidebar/_active.rhtml +5 -5
  138. data/app/views/admin/sidebar/_availables.rhtml +1 -1
  139. data/app/views/admin/sidebar/_publish.rhtml +1 -1
  140. data/app/views/admin/sidebar/_target.rhtml +1 -1
  141. data/app/views/admin/sidebar/index.rhtml +9 -5
  142. data/app/views/admin/textfilters/_form.rhtml +13 -5
  143. data/app/views/admin/textfilters/_macros.rhtml +4 -4
  144. data/app/views/admin/textfilters/_textfilters.rhtml +6 -6
  145. data/app/views/admin/textfilters/destroy.rhtml +5 -8
  146. data/app/views/admin/textfilters/edit.rhtml +2 -5
  147. data/app/views/admin/textfilters/list.rhtml +4 -2
  148. data/app/views/admin/textfilters/macro_help.rhtml +1 -1
  149. data/app/views/admin/textfilters/new.rhtml +9 -7
  150. data/app/views/admin/textfilters/show.rhtml +5 -5
  151. data/app/views/admin/textfilters/show_help.rhtml +3 -3
  152. data/app/views/admin/themes/index.rhtml +8 -2
  153. data/app/views/admin/trackbacks/_form.rhtml +4 -4
  154. data/app/views/admin/trackbacks/destroy.rhtml +4 -4
  155. data/app/views/admin/trackbacks/edit.rhtml +6 -6
  156. data/app/views/admin/trackbacks/list.rhtml +10 -10
  157. data/app/views/admin/trackbacks/new.rhtml +6 -6
  158. data/app/views/admin/trackbacks/show.rhtml +8 -8
  159. data/app/views/admin/users/_form.rhtml +10 -10
  160. data/app/views/admin/users/_user.rhtml +6 -6
  161. data/app/views/admin/users/destroy.rhtml +7 -7
  162. data/app/views/admin/users/edit.rhtml +9 -5
  163. data/app/views/admin/users/list.rhtml +2 -2
  164. data/app/views/admin/users/new.rhtml +9 -7
  165. data/app/views/admin/users/show.rhtml +10 -10
  166. data/app/views/articles/_article.rhtml +3 -3
  167. data/app/views/articles/_comment.rhtml +3 -3
  168. data/app/views/articles/_comment_box.rhtml +6 -6
  169. data/app/views/articles/_trackback.rhtml +1 -1
  170. data/app/views/articles/archives.rhtml +3 -3
  171. data/app/views/articles/comment_preview.rhtml +2 -2
  172. data/app/views/articles/groupings.rhtml +1 -1
  173. data/app/views/articles/index.rhtml +2 -2
  174. data/app/views/articles/read.rhtml +15 -15
  175. data/app/views/articles/view_page.rhtml +1 -1
  176. data/app/views/layouts/administration.rhtml +11 -17
  177. data/app/views/layouts/minimal.rhtml +13 -0
  178. data/app/views/live/search.rhtml +1 -1
  179. data/app/views/notification_mailer/_mail_footer.rhtml +2 -2
  180. data/app/views/notification_mailer/article.rhtml +1 -1
  181. data/app/views/notification_mailer/comment.rhtml +4 -4
  182. data/app/views/settings/done.rhtml +1 -1
  183. data/app/views/settings/install.rhtml +3 -3
  184. data/app/views/shared/_search.rhtml +4 -4
  185. data/app/views/xml/_atom10_item_article.rxml +9 -7
  186. data/app/views/xml/_atom10_item_comment.rxml +2 -3
  187. data/app/views/xml/_atom10_item_trackback.rxml +1 -1
  188. data/app/views/xml/_googlesitemap_item_article.rxml +2 -2
  189. data/app/views/xml/_googlesitemap_item_category.rxml +1 -1
  190. data/app/views/xml/_googlesitemap_item_page.rxml +2 -2
  191. data/app/views/xml/_googlesitemap_item_tag.rxml +2 -2
  192. data/app/views/xml/_itunes_item_resource.rxml +2 -4
  193. data/app/views/xml/_rss20_item_article.rxml +4 -10
  194. data/app/views/xml/_rss20_item_comment.rxml +2 -2
  195. data/app/views/xml/rsd.rxml +4 -4
  196. data/bin/typo +0 -1
  197. data/config/boot.rb +4 -3
  198. data/config/environment.rb +37 -28
  199. data/config/environments/test.rb +1 -1
  200. data/config/routes.rb +6 -5
  201. data/db/migrate/051_fix_canonical_server_url.rb +17 -0
  202. data/db/migrate/052_remove_cached_html.rb +11 -0
  203. data/db/migrate/053_promote_canonical_server_url.rb +22 -0
  204. data/db/migrate/054_upgrade_sidebar_objects.rb +26 -0
  205. data/db/migrate/055_link_sidebars_to_blog.rb +17 -0
  206. data/db/migrate/056_create_notifications.rb +32 -0
  207. data/db/migrate/057_add_categorization_model.rb +45 -0
  208. data/db/migrate/058_separate_entries_and_feedback.rb +68 -0
  209. data/db/migrate/059_cleanup_feedback_table.rb +25 -0
  210. data/db/migrate/060_cleanup_contents_table.rb +29 -0
  211. data/db/migrate/061_convert_title_prefix_setting.rb +25 -0
  212. data/db/schema.mysql.sql +139 -108
  213. data/db/schema.postgresql.sql +140 -108
  214. data/db/schema.rb +97 -75
  215. data/db/schema.sqlite.sql +140 -108
  216. data/db/schema.sqlserver.sql +144 -109
  217. data/db/schema_version +1 -1
  218. data/lang/fr_FR.rb +469 -0
  219. data/lib/email_notify.rb +4 -4
  220. data/lib/generators/sidebar/sidebar_generator.rb +15 -6
  221. data/lib/generators/sidebar/templates/Rakefile +22 -0
  222. data/lib/generators/sidebar/templates/content.rhtml +10 -0
  223. data/lib/generators/sidebar/templates/init.rb +4 -0
  224. data/lib/generators/sidebar/templates/sidebar.rb +16 -0
  225. data/lib/generators/sidebar/templates/unit_test.rb +8 -0
  226. data/lib/jabber_notify.rb +8 -7
  227. data/lib/memory_profiler.rb +60 -0
  228. data/lib/rails_patch/active_record.rb +0 -27
  229. data/lib/route_cache.rb +15 -0
  230. data/lib/sidebars/component_plugin.rb +3 -0
  231. data/lib/sidebars/consolidated_plugin.rb +26 -0
  232. data/lib/sidebars/plugin.rb +8 -13
  233. data/lib/spam_protection.rb +35 -23
  234. data/lib/tasks/release.rake +7 -7
  235. data/lib/text_filter_plugin.rb +55 -15
  236. data/lib/typo_deprecated.rb +19 -0
  237. data/lib/typo_version.rb +1 -1
  238. data/public/images/bracket.gif +0 -0
  239. data/public/images/cancel.png +0 -0
  240. data/public/images/checked.png +0 -0
  241. data/public/images/delete.png +0 -0
  242. data/public/images/edit.png +0 -0
  243. data/public/images/help.png +0 -0
  244. data/public/images/show.png +0 -0
  245. data/public/javascripts/codecollapse.js +8 -0
  246. data/public/javascripts/controls.js +41 -23
  247. data/public/javascripts/dragdrop.js +105 -76
  248. data/public/javascripts/effects.js +293 -163
  249. data/public/javascripts/prototype.js +900 -391
  250. data/public/stylesheets/administration.css +390 -318
  251. data/public/stylesheets/codecollapse.css +3 -0
  252. data/public/stylesheets/minimal.css +142 -0
  253. data/public/stylesheets/textmate/dawn.css +209 -0
  254. data/public/stylesheets/textmate/iplastic.css +142 -0
  255. data/public/stylesheets/textmate/space_cadet.css +99 -0
  256. data/public/stylesheets/textmate/textmate.css +48 -0
  257. data/public/stylesheets/textmate/twilight.css +227 -0
  258. data/script/process/inspector +3 -0
  259. data/spec/controllers/accounts_controller_spec.rb +184 -0
  260. data/spec/controllers/articles_controller_spec.rb +47 -0
  261. data/spec/fixtures/articles_tags.yml +19 -0
  262. data/spec/fixtures/blacklist_patterns.yml +10 -0
  263. data/spec/fixtures/blogs.yml +77 -0
  264. data/spec/fixtures/categories.yml +35 -0
  265. data/{test/fixtures/articles_categories.yml → spec/fixtures/categorizations.yml} +0 -0
  266. data/spec/fixtures/contents.yml +215 -0
  267. data/spec/fixtures/feedback.yml +159 -0
  268. data/spec/fixtures/notifications.yml +0 -0
  269. data/spec/fixtures/page_caches.yml +7 -0
  270. data/spec/fixtures/redirects.yml +13 -0
  271. data/spec/fixtures/resources.yml +24 -0
  272. data/spec/fixtures/sidebars.yml +12 -0
  273. data/spec/fixtures/tags.yml +13 -0
  274. data/spec/fixtures/text_filters.yml +42 -0
  275. data/spec/fixtures/triggers.yml +1 -0
  276. data/spec/fixtures/users.yml +56 -0
  277. data/spec/fixtures/whiteboards.yml +13 -0
  278. data/spec/helpers/admin_base_helper_spec.rb +13 -0
  279. data/spec/models/amazon_sidebar_spec.rb +40 -0
  280. data/spec/models/audioscrobbler_spec.rb +134 -0
  281. data/spec/models/blog_spec.rb +28 -0
  282. data/spec/models/cache_support_spec.rb +55 -0
  283. data/spec/models/category_spec.rb +48 -0
  284. data/spec/models/configuration_spec.rb +108 -0
  285. data/spec/models/content_state_spec.rb +1010 -0
  286. data/spec/models/delegate_to_content_state_spec.rb +126 -0
  287. data/spec/models/delicious_spec.rb +101 -0
  288. data/spec/models/flickr_spec.rb +128 -0
  289. data/spec/models/metafragment_spec.rb +65 -0
  290. data/spec/models/page_cache_spec.rb +35 -0
  291. data/spec/models/page_spec.rb +88 -0
  292. data/spec/models/ping_spec.rb +133 -0
  293. data/spec/models/redirect_spec.rb +17 -0
  294. data/spec/models/resource_spec.rb +43 -0
  295. data/spec/models/static_sidebar_spec.rb +17 -0
  296. data/spec/models/tag_spec.rb +54 -0
  297. data/spec/models/text_filter_spec.rb +38 -0
  298. data/spec/models/theme_spec.rb +45 -0
  299. data/spec/models/trackback_spec.rb +60 -0
  300. data/spec/models/trigger_spec.rb +41 -0
  301. data/spec/models/user_spec.rb +105 -0
  302. data/test/fixtures/blogs.yml +5 -4
  303. data/test/fixtures/categorizations.yml +31 -0
  304. data/test/fixtures/contents.yml +2 -160
  305. data/test/fixtures/feedback.yml +159 -0
  306. data/test/fixtures/sidebars.yml +11 -4
  307. data/test/functional/accounts_controller_test.rb +6 -10
  308. data/test/functional/admin/article_preview_test.rb +21 -6
  309. data/test/functional/admin/blacklist_controller_test.rb +11 -11
  310. data/test/functional/admin/categories_controller_test.rb +13 -13
  311. data/test/functional/admin/comments_controller_test.rb +21 -21
  312. data/test/functional/admin/content_controller_test.rb +30 -38
  313. data/test/functional/admin/feedback_controller_test.rb +12 -12
  314. data/test/functional/admin/general_controller_test.rb +2 -2
  315. data/test/functional/admin/pages_controller_test.rb +3 -18
  316. data/test/functional/admin/resources_controller_test.rb +7 -7
  317. data/test/functional/admin/textfilters_controller_test.rb +2 -2
  318. data/test/functional/admin/themes_controller_test.rb +1 -1
  319. data/test/functional/admin/trackbacks_controller_test.rb +21 -21
  320. data/test/functional/admin/users_controller_test.rb +21 -18
  321. data/test/functional/articles_controller_test.rb +62 -46
  322. data/test/functional/backend_controller_test.rb +6 -6
  323. data/test/functional/redirect_controller_test.rb +3 -3
  324. data/test/functional/textfilter_controller_test.rb +10 -12
  325. data/test/functional/theme_controller_test.rb +1 -1
  326. data/test/functional/xml_controller_test.rb +7 -5
  327. data/test/mocks/themes/azure/layouts/default.rhtml +2 -2
  328. data/test/test_helper.rb +75 -0
  329. data/test/unit/amazon_sidebar_test.rb +36 -0
  330. data/test/unit/article_test.rb +36 -4
  331. data/test/unit/blog_test.rb +5 -36
  332. data/test/unit/cache_support_test.rb +62 -0
  333. data/test/unit/category_test.rb +6 -1
  334. data/test/unit/comment_test.rb +34 -9
  335. data/test/unit/content_state/factory_test.rb +8 -0
  336. data/test/unit/content_state/feedback_states_test.rb +71 -0
  337. data/test/unit/magnolia_test.rb +1 -1
  338. data/test/unit/notification_test.rb +10 -0
  339. data/test/unit/page_test.rb +20 -0
  340. data/test/unit/ping_test.rb +1 -1
  341. data/test/unit/sidebar_test.rb +2 -7
  342. data/test/unit/static_sidebar_test.rb +19 -0
  343. data/test/unit/tag_test.rb +6 -1
  344. data/test/unit/text_filter_test.rb +21 -21
  345. data/test/unit/theme_test.rb +1 -1
  346. data/test/unit/trackback_test.rb +16 -1
  347. data/themes/azure/layouts/default.rhtml +2 -2
  348. data/themes/scribbish/layouts/default.rhtml +2 -2
  349. data/themes/scribbish/stylesheets/content.css +6 -8
  350. data/themes/scribbish/views/articles/_article.rhtml +10 -10
  351. data/themes/scribbish/views/articles/_comment.rhtml +16 -12
  352. data/themes/scribbish/views/articles/_comment_form.rhtml +25 -22
  353. data/themes/scribbish/views/articles/_search.rhtml +14 -13
  354. data/themes/scribbish/views/articles/comment_preview.rhtml +3 -3
  355. data/themes/scribbish/views/articles/index.rhtml +1 -1
  356. data/themes/scribbish/views/articles/read.rhtml +8 -8
  357. data/vendor/cached_model/History.txt +30 -0
  358. data/vendor/cached_model/LICENSE.txt +30 -0
  359. data/vendor/cached_model/Manifest.txt +7 -0
  360. data/vendor/cached_model/README.txt +96 -0
  361. data/vendor/cached_model/Rakefile +25 -0
  362. data/vendor/cached_model/lib/cached_model.rb +287 -0
  363. data/vendor/cached_model/test/test_cached_model.rb +593 -0
  364. data/vendor/flickr/flickr.rb +1 -1
  365. data/vendor/memcache-client/History.txt +25 -0
  366. data/vendor/memcache-client/LICENSE.txt +30 -0
  367. data/vendor/memcache-client/Manifest.txt +8 -0
  368. data/vendor/memcache-client/README.txt +46 -0
  369. data/vendor/memcache-client/Rakefile +23 -0
  370. data/vendor/memcache-client/lib/memcache.rb +491 -0
  371. data/vendor/memcache-client/lib/memcache_util.rb +71 -0
  372. data/vendor/memcache-client/test/test_mem_cache.rb +284 -0
  373. data/vendor/plugins/action_view_patch/Rakefile +22 -0
  374. data/vendor/plugins/action_view_patch/init.rb +1 -0
  375. data/vendor/plugins/action_view_patch/lib/action_view_patch.rb +18 -0
  376. data/vendor/plugins/action_view_patch/test/action_view_patch_test.rb +56 -0
  377. data/vendor/plugins/aimpresence_sidebar/Rakefile +22 -0
  378. data/vendor/plugins/aimpresence_sidebar/init.rb +4 -0
  379. data/vendor/plugins/aimpresence_sidebar/lib/aimpresence_sidebar.rb +21 -0
  380. data/vendor/plugins/aimpresence_sidebar/test/aimpresence_sidebar_test.rb +33 -0
  381. data/vendor/plugins/aimpresence_sidebar/views/content.rhtml +4 -0
  382. data/vendor/plugins/amazon_sidebar/init.rb +5 -0
  383. data/vendor/plugins/amazon_sidebar/lib/amazon_sidebar.rb +16 -0
  384. data/vendor/plugins/amazon_sidebar/views/content.rhtml +4 -0
  385. data/vendor/plugins/archives_sidebar/Rakefile +22 -0
  386. data/vendor/plugins/archives_sidebar/init.rb +5 -0
  387. data/{components/plugins/sidebars/archives_controller.rb → vendor/plugins/archives_sidebar/lib/archives_sidebar.rb} +7 -6
  388. data/vendor/plugins/archives_sidebar/test/archives_sidebar_test.rb +8 -0
  389. data/{components/plugins/sidebars/archives → vendor/plugins/archives_sidebar/views}/content.rhtml +2 -2
  390. data/vendor/plugins/audioscrobbler_sidebar/Rakefile +22 -0
  391. data/vendor/plugins/audioscrobbler_sidebar/init.rb +5 -0
  392. data/{app/models/aggregations → vendor/plugins/audioscrobbler_sidebar/lib}/audioscrobbler.rb +0 -0
  393. data/{components/plugins/sidebars/audioscrobbler_controller.rb → vendor/plugins/audioscrobbler_sidebar/lib/audioscrobbler_sidebar.rb} +7 -4
  394. data/vendor/plugins/audioscrobbler_sidebar/test/audioscrobbler_sidebar_test.rb +8 -0
  395. data/{components/plugins/sidebars/audioscrobbler → vendor/plugins/audioscrobbler_sidebar/views}/content.rhtml +4 -4
  396. data/vendor/plugins/backpack_sidebar/Rakefile +22 -0
  397. data/vendor/plugins/backpack_sidebar/init.rb +5 -0
  398. data/{app/models/aggregations → vendor/plugins/backpack_sidebar/lib}/backpack.rb +0 -0
  399. data/{components/plugins/sidebars/backpack_controller.rb → vendor/plugins/backpack_sidebar/lib/backpack_sidebar.rb} +6 -3
  400. data/vendor/plugins/backpack_sidebar/test/backpack_sidebar_test.rb +8 -0
  401. data/{components/plugins/sidebars/backpack → vendor/plugins/backpack_sidebar/views}/content.rhtml +4 -4
  402. data/vendor/plugins/category_sidebar/Rakefile +22 -0
  403. data/vendor/plugins/category_sidebar/init.rb +5 -0
  404. data/{components/plugins/sidebars/category_controller.rb → vendor/plugins/category_sidebar/lib/category_sidebar.rb} +3 -5
  405. data/vendor/plugins/category_sidebar/test/category_sidebar_test.rb +8 -0
  406. data/vendor/plugins/category_sidebar/views/content.rhtml +10 -0
  407. data/vendor/plugins/delicious_sidebar/Rakefile +22 -0
  408. data/vendor/plugins/delicious_sidebar/init.rb +5 -0
  409. data/{app/models/aggregations → vendor/plugins/delicious_sidebar/lib}/delicious.rb +0 -0
  410. data/{components/plugins/sidebars/delicious_controller.rb → vendor/plugins/delicious_sidebar/lib/delicious_sidebar.rb} +16 -10
  411. data/vendor/plugins/delicious_sidebar/test/delicious_sidebar_test.rb +8 -0
  412. data/vendor/plugins/delicious_sidebar/views/content.rhtml +20 -0
  413. data/vendor/plugins/flickr_sidebar/Rakefile +22 -0
  414. data/vendor/plugins/flickr_sidebar/init.rb +5 -0
  415. data/{app/models/aggregations → vendor/plugins/flickr_sidebar/lib}/flickr.rb +1 -1
  416. data/vendor/plugins/flickr_sidebar/lib/flickr_sidebar.rb +15 -0
  417. data/vendor/plugins/flickr_sidebar/test/flickr_sidebar_test.rb +8 -0
  418. data/{components/plugins/sidebars/flickr → vendor/plugins/flickr_sidebar/views}/content.rhtml +5 -5
  419. data/vendor/plugins/fortythree_sidebar/Rakefile +22 -0
  420. data/vendor/plugins/fortythree_sidebar/init.rb +5 -0
  421. data/{app/models/aggregations → vendor/plugins/fortythree_sidebar/lib}/fortythree.rb +0 -0
  422. data/{components/plugins/sidebars/fortythree_controller.rb → vendor/plugins/fortythree_sidebar/lib/fortythree_sidebar.rb} +5 -4
  423. data/vendor/plugins/fortythree_sidebar/test/fortythree_sidebar_test.rb +8 -0
  424. data/vendor/plugins/fortythree_sidebar/views/content.rhtml +8 -0
  425. data/vendor/plugins/fortythreeplaces_sidebar/Rakefile +22 -0
  426. data/vendor/plugins/fortythreeplaces_sidebar/init.rb +5 -0
  427. data/vendor/plugins/fortythreeplaces_sidebar/lib/fortythree.rb +62 -0
  428. data/{components/plugins/sidebars/fortythreeplaces_controller.rb → vendor/plugins/fortythreeplaces_sidebar/lib/fortythreeplaces_sidebar.rb} +5 -4
  429. data/vendor/plugins/fortythreeplaces_sidebar/test/fortythreeplaces_sidebar_test.rb +8 -0
  430. data/vendor/plugins/fortythreeplaces_sidebar/views/content.rhtml +8 -0
  431. data/vendor/plugins/haml/MIT-LICENSE +20 -0
  432. data/vendor/plugins/haml/REFERENCE +662 -0
  433. data/vendor/plugins/haml/Rakefile +171 -0
  434. data/vendor/plugins/haml/VERSION +1 -0
  435. data/vendor/plugins/haml/bin/haml +18 -0
  436. data/vendor/plugins/haml/init.rb +3 -0
  437. data/vendor/plugins/haml/lib/haml/buffer.rb +224 -0
  438. data/vendor/plugins/haml/lib/haml/engine.rb +557 -0
  439. data/vendor/plugins/haml/lib/haml/helpers.rb +220 -0
  440. data/vendor/plugins/haml/lib/haml/helpers/action_view_mods.rb +54 -0
  441. data/vendor/plugins/haml/lib/haml/template.rb +138 -0
  442. data/vendor/plugins/haml/test/benchmark.rb +62 -0
  443. data/vendor/plugins/haml/test/engine_test.rb +93 -0
  444. data/vendor/plugins/haml/test/helper_test.rb +105 -0
  445. data/vendor/plugins/haml/test/mocks/article.rb +6 -0
  446. data/vendor/plugins/haml/test/profile.rb +45 -0
  447. data/vendor/plugins/haml/test/results/content_for_layout.xhtml +16 -0
  448. data/vendor/plugins/haml/test/results/eval_suppressed.xhtml +2 -0
  449. data/vendor/plugins/haml/test/results/helpers.xhtml +50 -0
  450. data/vendor/plugins/haml/test/results/helpful.xhtml +5 -0
  451. data/vendor/plugins/haml/test/results/just_stuff.xhtml +38 -0
  452. data/vendor/plugins/haml/test/results/list.xhtml +12 -0
  453. data/vendor/plugins/haml/test/results/original_engine.xhtml +24 -0
  454. data/vendor/plugins/haml/test/results/partials.xhtml +20 -0
  455. data/vendor/plugins/haml/test/results/silent_script.xhtml +74 -0
  456. data/vendor/plugins/haml/test/results/standard.xhtml +42 -0
  457. data/vendor/plugins/haml/test/results/tag_parsing.xhtml +28 -0
  458. data/vendor/plugins/haml/test/results/very_basic.xhtml +7 -0
  459. data/vendor/plugins/haml/test/results/whitespace_handling.xhtml +51 -0
  460. data/vendor/plugins/haml/test/rhtml/standard.rhtml +51 -0
  461. data/vendor/plugins/haml/test/runner.rb +15 -0
  462. data/vendor/plugins/haml/test/template_test.rb +137 -0
  463. data/vendor/plugins/haml/test/templates/_partial.haml +7 -0
  464. data/vendor/plugins/haml/test/templates/_text_area.haml +3 -0
  465. data/vendor/plugins/haml/test/templates/content_for_layout.haml +10 -0
  466. data/vendor/plugins/haml/test/templates/eval_suppressed.haml +5 -0
  467. data/vendor/plugins/haml/test/templates/helpers.haml +39 -0
  468. data/vendor/plugins/haml/test/templates/helpful.haml +6 -0
  469. data/vendor/plugins/haml/test/templates/just_stuff.haml +34 -0
  470. data/vendor/plugins/haml/test/templates/list.haml +12 -0
  471. data/vendor/plugins/haml/test/templates/original_engine.haml +17 -0
  472. data/vendor/plugins/haml/test/templates/partialize.haml +1 -0
  473. data/vendor/plugins/haml/test/templates/partials.haml +12 -0
  474. data/vendor/plugins/haml/test/templates/silent_script.haml +40 -0
  475. data/vendor/plugins/haml/test/templates/standard.haml +40 -0
  476. data/vendor/plugins/haml/test/templates/tag_parsing.haml +24 -0
  477. data/vendor/plugins/haml/test/templates/very_basic.haml +4 -0
  478. data/vendor/plugins/haml/test/templates/whitespace_handling.haml +66 -0
  479. data/vendor/plugins/localization/CHANGELOG +1 -0
  480. data/vendor/plugins/localization/README +85 -0
  481. data/vendor/plugins/localization/init.rb +3 -0
  482. data/vendor/plugins/localization/lib/localization.rb +46 -0
  483. data/vendor/plugins/magnolia_sidebar/Rakefile +22 -0
  484. data/vendor/plugins/magnolia_sidebar/init.rb +5 -0
  485. data/{app/models/aggregations/magnolia.rb → vendor/plugins/magnolia_sidebar/lib/magnolia_aggregation.rb} +0 -0
  486. data/vendor/plugins/magnolia_sidebar/lib/magnolia_sidebar.rb +16 -0
  487. data/vendor/plugins/magnolia_sidebar/test/magnolia_sidebar_test.rb +8 -0
  488. data/vendor/plugins/magnolia_sidebar/views/content.rhtml +12 -0
  489. data/vendor/plugins/recent_comments_sidebar/Rakefile +22 -0
  490. data/vendor/plugins/recent_comments_sidebar/init.rb +5 -0
  491. data/vendor/plugins/recent_comments_sidebar/lib/recent_comments_sidebar.rb +16 -0
  492. data/vendor/plugins/recent_comments_sidebar/test/recent_comments_sidebar_test.rb +8 -0
  493. data/{components/plugins/sidebars/recent_comments → vendor/plugins/recent_comments_sidebar/views}/content.rhtml +2 -2
  494. data/vendor/plugins/static_sidebar/init.rb +4 -0
  495. data/{components/plugins/sidebars/static_controller.rb → vendor/plugins/static_sidebar/lib/static_sidebar.rb} +4 -7
  496. data/vendor/plugins/static_sidebar/views/content.rhtml +2 -0
  497. data/vendor/plugins/tada_sidebar/Rakefile +22 -0
  498. data/vendor/plugins/tada_sidebar/init.rb +5 -0
  499. data/{app/models/aggregations → vendor/plugins/tada_sidebar/lib}/tada.rb +0 -0
  500. data/{components/plugins/sidebars/tada_controller.rb → vendor/plugins/tada_sidebar/lib/tada_sidebar.rb} +8 -4
  501. data/vendor/plugins/tada_sidebar/test/tada_sidebar_test.rb +8 -0
  502. data/{components/plugins/sidebars/tada → vendor/plugins/tada_sidebar/views}/content.rhtml +4 -4
  503. data/vendor/plugins/tag_sidebar/Rakefile +22 -0
  504. data/vendor/plugins/tag_sidebar/init.rb +5 -0
  505. data/vendor/plugins/tag_sidebar/lib/tag_sidebar.rb +24 -0
  506. data/vendor/plugins/tag_sidebar/test/tag_sidebar_test.rb +8 -0
  507. data/vendor/plugins/tag_sidebar/views/content.rhtml +8 -0
  508. data/vendor/plugins/technorati_sidebar/Rakefile +22 -0
  509. data/vendor/plugins/technorati_sidebar/init.rb +5 -0
  510. data/{app/models/aggregations → vendor/plugins/technorati_sidebar/lib}/technorati.rb +0 -0
  511. data/{components/plugins/sidebars/technorati_controller.rb → vendor/plugins/technorati_sidebar/lib/technorati_sidebar.rb} +8 -4
  512. data/vendor/plugins/technorati_sidebar/test/technorati_sidebar_test.rb +8 -0
  513. data/vendor/plugins/technorati_sidebar/views/content.rhtml +8 -0
  514. data/vendor/plugins/typo_textfilter_amazon/README +5 -0
  515. data/vendor/plugins/typo_textfilter_amazon/Rakefile +22 -0
  516. data/vendor/plugins/typo_textfilter_amazon/init.rb +4 -0
  517. data/vendor/plugins/typo_textfilter_amazon/install.rb +1 -0
  518. data/vendor/plugins/typo_textfilter_amazon/lib/typo_textfilter_amazon.rb +45 -0
  519. data/vendor/plugins/typo_textfilter_amazon/tasks/typo_textfilter_amazon_tasks.rake +4 -0
  520. data/vendor/plugins/typo_textfilter_amazon/test/typo_textfilter_amazon_test.rb +8 -0
  521. data/vendor/plugins/typo_textfilter_code/README +4 -0
  522. data/vendor/plugins/typo_textfilter_code/Rakefile +22 -0
  523. data/vendor/plugins/typo_textfilter_code/init.rb +4 -0
  524. data/vendor/plugins/typo_textfilter_code/install.rb +1 -0
  525. data/vendor/plugins/typo_textfilter_code/lib/typo_textfilter_code.rb +62 -0
  526. data/vendor/plugins/typo_textfilter_code/tasks/typo_textfilter_code_tasks.rake +4 -0
  527. data/vendor/plugins/typo_textfilter_code/test/typo_textfilter_code_test.rb +8 -0
  528. data/vendor/plugins/typo_textfilter_flickr/README +4 -0
  529. data/vendor/plugins/typo_textfilter_flickr/Rakefile +22 -0
  530. data/vendor/plugins/typo_textfilter_flickr/init.rb +4 -0
  531. data/vendor/plugins/typo_textfilter_flickr/install.rb +1 -0
  532. data/vendor/plugins/typo_textfilter_flickr/lib/typo_textfilter_flickr.rb +79 -0
  533. data/vendor/plugins/typo_textfilter_flickr/tasks/typo_textfilter_flickr_tasks.rake +4 -0
  534. data/vendor/plugins/typo_textfilter_flickr/test/typo_textfilter_flickr_test.rb +8 -0
  535. data/vendor/plugins/typo_textfilter_htmlfilter/README +4 -0
  536. data/vendor/plugins/typo_textfilter_htmlfilter/Rakefile +22 -0
  537. data/vendor/plugins/typo_textfilter_htmlfilter/init.rb +2 -0
  538. data/vendor/plugins/typo_textfilter_htmlfilter/install.rb +1 -0
  539. data/vendor/plugins/typo_textfilter_htmlfilter/lib/typo_textfilter_htmlfilter.rb +12 -0
  540. data/vendor/plugins/typo_textfilter_htmlfilter/tasks/typo_textfilter_htmlfilter_tasks.rake +4 -0
  541. data/vendor/plugins/typo_textfilter_htmlfilter/test/typo_textfilter_htmlfilter_test.rb +8 -0
  542. data/vendor/plugins/typo_textfilter_lightbox/README +4 -0
  543. data/vendor/plugins/typo_textfilter_lightbox/Rakefile +22 -0
  544. data/vendor/plugins/typo_textfilter_lightbox/init.rb +2 -0
  545. data/vendor/plugins/typo_textfilter_lightbox/install.rb +1 -0
  546. data/{components/plugins/textfilters/lightbox_controller.rb → vendor/plugins/typo_textfilter_lightbox/lib/typo_textfilter_lightbox.rb} +64 -61
  547. data/vendor/plugins/typo_textfilter_lightbox/tasks/typo_textfilter_lightbox_tasks.rake +4 -0
  548. data/vendor/plugins/typo_textfilter_lightbox/test/typo_textfilter_lightbox_test.rb +8 -0
  549. data/vendor/plugins/typo_textfilter_markdown/README +4 -0
  550. data/vendor/plugins/typo_textfilter_markdown/Rakefile +22 -0
  551. data/vendor/plugins/typo_textfilter_markdown/init.rb +2 -0
  552. data/vendor/plugins/typo_textfilter_markdown/install.rb +1 -0
  553. data/{components/plugins/textfilters/markdown_controller.rb → vendor/plugins/typo_textfilter_markdown/lib/typo_textfilter_markdown.rb} +13 -9
  554. data/vendor/plugins/typo_textfilter_markdown/tasks/typo_textfilter_markdown_tasks.rake +4 -0
  555. data/vendor/plugins/typo_textfilter_markdown/test/typo_textfilter_markdown_test.rb +8 -0
  556. data/vendor/plugins/typo_textfilter_none/README +4 -0
  557. data/vendor/plugins/typo_textfilter_none/Rakefile +22 -0
  558. data/vendor/plugins/typo_textfilter_none/init.rb +2 -0
  559. data/vendor/plugins/typo_textfilter_none/install.rb +1 -0
  560. data/vendor/plugins/typo_textfilter_none/lib/typo_textfilter_none.rb +12 -0
  561. data/vendor/plugins/typo_textfilter_none/tasks/typo_textfilter_none_tasks.rake +4 -0
  562. data/vendor/plugins/typo_textfilter_none/test/typo_textfilter_none_test.rb +8 -0
  563. data/vendor/plugins/typo_textfilter_smartypants/README +4 -0
  564. data/vendor/plugins/typo_textfilter_smartypants/Rakefile +22 -0
  565. data/vendor/plugins/typo_textfilter_smartypants/init.rb +2 -0
  566. data/vendor/plugins/typo_textfilter_smartypants/install.rb +1 -0
  567. data/vendor/plugins/typo_textfilter_smartypants/lib/typo_textfilter_smartypants.rb +12 -0
  568. data/vendor/plugins/typo_textfilter_smartypants/tasks/typo_textfilter_smartypants_tasks.rake +4 -0
  569. data/vendor/plugins/typo_textfilter_smartypants/test/typo_textfilter_smartypants_test.rb +8 -0
  570. data/vendor/plugins/typo_textfilter_sparkline/README +4 -0
  571. data/vendor/plugins/typo_textfilter_sparkline/Rakefile +22 -0
  572. data/vendor/plugins/typo_textfilter_sparkline/init.rb +2 -0
  573. data/vendor/plugins/typo_textfilter_sparkline/install.rb +1 -0
  574. data/vendor/plugins/typo_textfilter_sparkline/lib/typo_textfilter_sparkline.rb +92 -0
  575. data/vendor/plugins/typo_textfilter_sparkline/tasks/typo_textfilter_sparkline_tasks.rake +4 -0
  576. data/vendor/plugins/typo_textfilter_sparkline/test/typo_textfilter_sparkline_test.rb +8 -0
  577. data/vendor/plugins/typo_textfilter_textile/README +4 -0
  578. data/vendor/plugins/typo_textfilter_textile/Rakefile +22 -0
  579. data/vendor/plugins/typo_textfilter_textile/init.rb +2 -0
  580. data/vendor/plugins/typo_textfilter_textile/install.rb +1 -0
  581. data/vendor/plugins/typo_textfilter_textile/lib/typo_textfilter_textile.rb +18 -0
  582. data/vendor/plugins/typo_textfilter_textile/tasks/typo_textfilter_textile_tasks.rake +4 -0
  583. data/vendor/plugins/typo_textfilter_textile/test/typo_textfilter_textile_test.rb +8 -0
  584. data/vendor/plugins/typo_textfilter_textile_and_markdown/README +4 -0
  585. data/vendor/plugins/typo_textfilter_textile_and_markdown/Rakefile +22 -0
  586. data/vendor/plugins/typo_textfilter_textile_and_markdown/init.rb +2 -0
  587. data/vendor/plugins/typo_textfilter_textile_and_markdown/install.rb +1 -0
  588. data/vendor/plugins/typo_textfilter_textile_and_markdown/lib/typo_textfilter_textile_and_markdown.rb +12 -0
  589. data/vendor/plugins/typo_textfilter_textile_and_markdown/tasks/typo_textfilter_textile_and_markdown_tasks.rake +4 -0
  590. data/vendor/plugins/typo_textfilter_textile_and_markdown/test/typo_textfilter_textile_and_markdown_test.rb +8 -0
  591. data/vendor/plugins/typo_textfilter_tmcode/README +4 -0
  592. data/vendor/plugins/typo_textfilter_tmcode/Rakefile +22 -0
  593. data/vendor/plugins/typo_textfilter_tmcode/init.rb +3 -0
  594. data/vendor/plugins/typo_textfilter_tmcode/install.rb +1 -0
  595. data/vendor/plugins/typo_textfilter_tmcode/lib/typo_textfilter_tmcode.rb +86 -0
  596. data/vendor/plugins/typo_textfilter_tmcode/tasks/typo_textfilter_tmcode_tasks.rake +4 -0
  597. data/vendor/plugins/typo_textfilter_tmcode/test/typo_textfilter_tmcode_test.rb +8 -0
  598. data/vendor/plugins/upcoming_sidebar/Rakefile +22 -0
  599. data/vendor/plugins/upcoming_sidebar/init.rb +5 -0
  600. data/{app/models/aggregations → vendor/plugins/upcoming_sidebar/lib}/upcoming.rb +0 -0
  601. data/vendor/plugins/upcoming_sidebar/lib/upcoming_sidebar.rb +15 -0
  602. data/vendor/plugins/upcoming_sidebar/test/upcoming_sidebar_test.rb +8 -0
  603. data/{components/plugins/sidebars/upcoming → vendor/plugins/upcoming_sidebar/views}/content.rhtml +3 -3
  604. data/vendor/plugins/xbox_sidebar/Rakefile +22 -0
  605. data/vendor/plugins/xbox_sidebar/init.rb +5 -0
  606. data/{components/plugins/sidebars/xbox_controller.rb → vendor/plugins/xbox_sidebar/lib/xbox_sidebar.rb} +1 -1
  607. data/vendor/plugins/xbox_sidebar/test/xbox_sidebar_test.rb +8 -0
  608. data/vendor/plugins/xbox_sidebar/views/content.rhtml +2 -0
  609. data/vendor/plugins/xml_sidebar/Rakefile +22 -0
  610. data/vendor/plugins/xml_sidebar/init.rb +5 -0
  611. data/{components/plugins/sidebars/xml_controller.rb → vendor/plugins/xml_sidebar/lib/xml_sidebar.rb} +1 -1
  612. data/vendor/plugins/xml_sidebar/test/xml_sidebar_test.rb +8 -0
  613. data/vendor/plugins/xml_sidebar/views/content.rhtml +12 -0
  614. metadata +505 -101
  615. data/app/controllers/sidebar_controller.rb +0 -50
  616. data/app/models/content_observer.rb +0 -5
  617. data/components/plugins/sidebars/aimpresence/content.rhtml +0 -4
  618. data/components/plugins/sidebars/aimpresence_controller.rb +0 -10
  619. data/components/plugins/sidebars/amazon/content.rhtml +0 -4
  620. data/components/plugins/sidebars/amazon_controller.rb +0 -17
  621. data/components/plugins/sidebars/category/content.rhtml +0 -10
  622. data/components/plugins/sidebars/delicious/content.rhtml +0 -20
  623. data/components/plugins/sidebars/flickr_controller.rb +0 -16
  624. data/components/plugins/sidebars/fortythree/content.rhtml +0 -8
  625. data/components/plugins/sidebars/fortythreeplaces/content.rhtml +0 -8
  626. data/components/plugins/sidebars/magnolia/content.rhtml +0 -12
  627. data/components/plugins/sidebars/magnolia_controller.rb +0 -17
  628. data/components/plugins/sidebars/recent_comments_controller.rb +0 -23
  629. data/components/plugins/sidebars/static/content.rhtml +0 -2
  630. data/components/plugins/sidebars/tag/content.rhtml +0 -8
  631. data/components/plugins/sidebars/tag_controller.rb +0 -18
  632. data/components/plugins/sidebars/technorati/content.rhtml +0 -8
  633. data/components/plugins/sidebars/upcoming_controller.rb +0 -11
  634. data/components/plugins/sidebars/xbox/content.rhtml +0 -2
  635. data/components/plugins/sidebars/xml/content.rhtml +0 -12
  636. data/components/plugins/textfilters/amazon_controller.rb +0 -39
  637. data/components/plugins/textfilters/code_controller.rb +0 -59
  638. data/components/plugins/textfilters/flickr_controller.rb +0 -75
  639. data/components/plugins/textfilters/htmlfilter_controller.rb +0 -8
  640. data/components/plugins/textfilters/macropost_controller.rb +0 -14
  641. data/components/plugins/textfilters/macropre_controller.rb +0 -14
  642. data/components/plugins/textfilters/none_controller.rb +0 -8
  643. data/components/plugins/textfilters/smartypants_controller.rb +0 -8
  644. data/components/plugins/textfilters/sparkline_controller.rb +0 -88
  645. data/components/plugins/textfilters/textile_and_markdown_controller.rb +0 -8
  646. data/components/plugins/textfilters/textile_controller.rb +0 -14
  647. data/db/schema.mysql-v3.sql +0 -218
  648. data/lib/generators/sidebar/templates/components/plugins/sidebars/controller_template.rb +0 -20
  649. data/lib/generators/sidebar/templates/components/plugins/sidebars/views/content_template.rhtml +0 -4
  650. data/lib/rails_patch/components.rb +0 -14
  651. data/public/images/checked.gif +0 -0
  652. data/test/unit/observer_test.rb +0 -40
@@ -1,5 +1,5 @@
1
- /* Prototype JavaScript framework, version 1.5.0_rc0
2
- * (c) 2005 Sam Stephenson <sam@conio.net>
1
+ /* Prototype JavaScript framework, version 1.5.0
2
+ * (c) 2005-2007 Sam Stephenson
3
3
  *
4
4
  * Prototype is freely distributable under the terms of an MIT-style license.
5
5
  * For details, see the Prototype web site: http://prototype.conio.net/
@@ -7,11 +7,14 @@
7
7
  /*--------------------------------------------------------------------------*/
8
8
 
9
9
  var Prototype = {
10
- Version: '1.5.0_rc0',
11
- ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
10
+ Version: '1.5.0',
11
+ BrowserFeatures: {
12
+ XPath: !!document.evaluate
13
+ },
12
14
 
15
+ ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
13
16
  emptyFunction: function() {},
14
- K: function(x) {return x}
17
+ K: function(x) { return x }
15
18
  }
16
19
 
17
20
  var Class = {
@@ -31,16 +34,36 @@ Object.extend = function(destination, source) {
31
34
  return destination;
32
35
  }
33
36
 
34
- Object.inspect = function(object) {
35
- try {
36
- if (object == undefined) return 'undefined';
37
- if (object == null) return 'null';
38
- return object.inspect ? object.inspect() : object.toString();
39
- } catch (e) {
40
- if (e instanceof RangeError) return '...';
41
- throw e;
37
+ Object.extend(Object, {
38
+ inspect: function(object) {
39
+ try {
40
+ if (object === undefined) return 'undefined';
41
+ if (object === null) return 'null';
42
+ return object.inspect ? object.inspect() : object.toString();
43
+ } catch (e) {
44
+ if (e instanceof RangeError) return '...';
45
+ throw e;
46
+ }
47
+ },
48
+
49
+ keys: function(object) {
50
+ var keys = [];
51
+ for (var property in object)
52
+ keys.push(property);
53
+ return keys;
54
+ },
55
+
56
+ values: function(object) {
57
+ var values = [];
58
+ for (var property in object)
59
+ values.push(object[property]);
60
+ return values;
61
+ },
62
+
63
+ clone: function(object) {
64
+ return Object.extend({}, object);
42
65
  }
43
- }
66
+ });
44
67
 
45
68
  Function.prototype.bind = function() {
46
69
  var __method = this, args = $A(arguments), object = args.shift();
@@ -50,9 +73,9 @@ Function.prototype.bind = function() {
50
73
  }
51
74
 
52
75
  Function.prototype.bindAsEventListener = function(object) {
53
- var __method = this;
76
+ var __method = this, args = $A(arguments), object = args.shift();
54
77
  return function(event) {
55
- return __method.call(object, event || window.event);
78
+ return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
56
79
  }
57
80
  }
58
81
 
@@ -77,7 +100,7 @@ var Try = {
77
100
  these: function() {
78
101
  var returnValue;
79
102
 
80
- for (var i = 0; i < arguments.length; i++) {
103
+ for (var i = 0, length = arguments.length; i < length; i++) {
81
104
  var lambda = arguments[i];
82
105
  try {
83
106
  returnValue = lambda();
@@ -102,20 +125,30 @@ PeriodicalExecuter.prototype = {
102
125
  },
103
126
 
104
127
  registerCallback: function() {
105
- setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
128
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
129
+ },
130
+
131
+ stop: function() {
132
+ if (!this.timer) return;
133
+ clearInterval(this.timer);
134
+ this.timer = null;
106
135
  },
107
136
 
108
137
  onTimerEvent: function() {
109
138
  if (!this.currentlyExecuting) {
110
139
  try {
111
140
  this.currentlyExecuting = true;
112
- this.callback();
141
+ this.callback(this);
113
142
  } finally {
114
143
  this.currentlyExecuting = false;
115
144
  }
116
145
  }
117
146
  }
118
147
  }
148
+ String.interpret = function(value){
149
+ return value == null ? '' : String(value);
150
+ }
151
+
119
152
  Object.extend(String.prototype, {
120
153
  gsub: function(pattern, replacement) {
121
154
  var result = '', source = this, match;
@@ -124,7 +157,7 @@ Object.extend(String.prototype, {
124
157
  while (source.length > 0) {
125
158
  if (match = source.match(pattern)) {
126
159
  result += source.slice(0, match.index);
127
- result += (replacement(match) || '').toString();
160
+ result += String.interpret(replacement(match));
128
161
  source = source.slice(match.index + match[0].length);
129
162
  } else {
130
163
  result += source, source = '';
@@ -189,15 +222,28 @@ Object.extend(String.prototype, {
189
222
  unescapeHTML: function() {
190
223
  var div = document.createElement('div');
191
224
  div.innerHTML = this.stripTags();
192
- return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
225
+ return div.childNodes[0] ? (div.childNodes.length > 1 ?
226
+ $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
227
+ div.childNodes[0].nodeValue) : '';
193
228
  },
194
229
 
195
- toQueryParams: function() {
196
- var pairs = this.match(/^\??(.*)$/)[1].split('&');
197
- return pairs.inject({}, function(params, pairString) {
198
- var pair = pairString.split('=');
199
- params[pair[0]] = pair[1];
200
- return params;
230
+ toQueryParams: function(separator) {
231
+ var match = this.strip().match(/([^?#]*)(#.*)?$/);
232
+ if (!match) return {};
233
+
234
+ return match[1].split(separator || '&').inject({}, function(hash, pair) {
235
+ if ((pair = pair.split('='))[0]) {
236
+ var name = decodeURIComponent(pair[0]);
237
+ var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
238
+
239
+ if (hash[name] !== undefined) {
240
+ if (hash[name].constructor != Array)
241
+ hash[name] = [hash[name]];
242
+ if (value) hash[name].push(value);
243
+ }
244
+ else hash[name] = value;
245
+ }
246
+ return hash;
201
247
  });
202
248
  },
203
249
 
@@ -205,24 +251,43 @@ Object.extend(String.prototype, {
205
251
  return this.split('');
206
252
  },
207
253
 
254
+ succ: function() {
255
+ return this.slice(0, this.length - 1) +
256
+ String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
257
+ },
258
+
208
259
  camelize: function() {
209
- var oStringList = this.split('-');
210
- if (oStringList.length == 1) return oStringList[0];
260
+ var parts = this.split('-'), len = parts.length;
261
+ if (len == 1) return parts[0];
211
262
 
212
- var camelizedString = this.indexOf('-') == 0
213
- ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
214
- : oStringList[0];
263
+ var camelized = this.charAt(0) == '-'
264
+ ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
265
+ : parts[0];
215
266
 
216
- for (var i = 1, len = oStringList.length; i < len; i++) {
217
- var s = oStringList[i];
218
- camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
219
- }
267
+ for (var i = 1; i < len; i++)
268
+ camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
220
269
 
221
- return camelizedString;
270
+ return camelized;
222
271
  },
223
272
 
224
- inspect: function() {
225
- return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'";
273
+ capitalize: function(){
274
+ return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
275
+ },
276
+
277
+ underscore: function() {
278
+ return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
279
+ },
280
+
281
+ dasherize: function() {
282
+ return this.gsub(/_/,'-');
283
+ },
284
+
285
+ inspect: function(useDoubleQuotes) {
286
+ var escapedString = this.replace(/\\/g, '\\\\');
287
+ if (useDoubleQuotes)
288
+ return '"' + escapedString.replace(/"/g, '\\"') + '"';
289
+ else
290
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";
226
291
  }
227
292
  });
228
293
 
@@ -246,7 +311,7 @@ Template.prototype = {
246
311
  return this.template.gsub(this.pattern, function(match) {
247
312
  var before = match[1];
248
313
  if (before == '\\') return match[2];
249
- return before + (object[match[3]] || '').toString();
314
+ return before + String.interpret(object[match[3]]);
250
315
  });
251
316
  }
252
317
  }
@@ -268,6 +333,14 @@ var Enumerable = {
268
333
  } catch (e) {
269
334
  if (e != $break) throw e;
270
335
  }
336
+ return this;
337
+ },
338
+
339
+ eachSlice: function(number, iterator) {
340
+ var index = -number, slices = [], array = this.toArray();
341
+ while ((index += number) < array.length)
342
+ slices.push(array.slice(index, index+number));
343
+ return slices.map(iterator);
271
344
  },
272
345
 
273
346
  all: function(iterator) {
@@ -280,7 +353,7 @@ var Enumerable = {
280
353
  },
281
354
 
282
355
  any: function(iterator) {
283
- var result = true;
356
+ var result = false;
284
357
  this.each(function(value, index) {
285
358
  if (result = !!(iterator || Prototype.K)(value, index))
286
359
  throw $break;
@@ -291,12 +364,12 @@ var Enumerable = {
291
364
  collect: function(iterator) {
292
365
  var results = [];
293
366
  this.each(function(value, index) {
294
- results.push(iterator(value, index));
367
+ results.push((iterator || Prototype.K)(value, index));
295
368
  });
296
369
  return results;
297
370
  },
298
371
 
299
- detect: function (iterator) {
372
+ detect: function(iterator) {
300
373
  var result;
301
374
  this.each(function(value, index) {
302
375
  if (iterator(value, index)) {
@@ -337,6 +410,14 @@ var Enumerable = {
337
410
  return found;
338
411
  },
339
412
 
413
+ inGroupsOf: function(number, fillWith) {
414
+ fillWith = fillWith === undefined ? null : fillWith;
415
+ return this.eachSlice(number, function(slice) {
416
+ while(slice.length < number) slice.push(fillWith);
417
+ return slice;
418
+ });
419
+ },
420
+
340
421
  inject: function(memo, iterator) {
341
422
  this.each(function(value, index) {
342
423
  memo = iterator(memo, value, index);
@@ -346,7 +427,7 @@ var Enumerable = {
346
427
 
347
428
  invoke: function(method) {
348
429
  var args = $A(arguments).slice(1);
349
- return this.collect(function(value) {
430
+ return this.map(function(value) {
350
431
  return value[method].apply(value, args);
351
432
  });
352
433
  },
@@ -398,7 +479,7 @@ var Enumerable = {
398
479
  },
399
480
 
400
481
  sortBy: function(iterator) {
401
- return this.collect(function(value, index) {
482
+ return this.map(function(value, index) {
402
483
  return {value: value, criteria: iterator(value, index)};
403
484
  }).sort(function(left, right) {
404
485
  var a = left.criteria, b = right.criteria;
@@ -407,7 +488,7 @@ var Enumerable = {
407
488
  },
408
489
 
409
490
  toArray: function() {
410
- return this.collect(Prototype.K);
491
+ return this.map();
411
492
  },
412
493
 
413
494
  zip: function() {
@@ -421,6 +502,10 @@ var Enumerable = {
421
502
  });
422
503
  },
423
504
 
505
+ size: function() {
506
+ return this.toArray().length;
507
+ },
508
+
424
509
  inspect: function() {
425
510
  return '#<Enumerable:' + this.toArray().inspect() + '>';
426
511
  }
@@ -439,7 +524,7 @@ var $A = Array.from = function(iterable) {
439
524
  return iterable.toArray();
440
525
  } else {
441
526
  var results = [];
442
- for (var i = 0; i < iterable.length; i++)
527
+ for (var i = 0, length = iterable.length; i < length; i++)
443
528
  results.push(iterable[i]);
444
529
  return results;
445
530
  }
@@ -452,7 +537,7 @@ if (!Array.prototype._reverse)
452
537
 
453
538
  Object.extend(Array.prototype, {
454
539
  _each: function(iterator) {
455
- for (var i = 0; i < this.length; i++)
540
+ for (var i = 0, length = this.length; i < length; i++)
456
541
  iterator(this[i]);
457
542
  },
458
543
 
@@ -471,7 +556,7 @@ Object.extend(Array.prototype, {
471
556
 
472
557
  compact: function() {
473
558
  return this.select(function(value) {
474
- return value != undefined || value != null;
559
+ return value != null;
475
560
  });
476
561
  },
477
562
 
@@ -490,7 +575,7 @@ Object.extend(Array.prototype, {
490
575
  },
491
576
 
492
577
  indexOf: function(object) {
493
- for (var i = 0; i < this.length; i++)
578
+ for (var i = 0, length = this.length; i < length; i++)
494
579
  if (this[i] == object) return i;
495
580
  return -1;
496
581
  },
@@ -499,15 +584,88 @@ Object.extend(Array.prototype, {
499
584
  return (inline !== false ? this : this.toArray())._reverse();
500
585
  },
501
586
 
587
+ reduce: function() {
588
+ return this.length > 1 ? this : this[0];
589
+ },
590
+
591
+ uniq: function() {
592
+ return this.inject([], function(array, value) {
593
+ return array.include(value) ? array : array.concat([value]);
594
+ });
595
+ },
596
+
597
+ clone: function() {
598
+ return [].concat(this);
599
+ },
600
+
601
+ size: function() {
602
+ return this.length;
603
+ },
604
+
502
605
  inspect: function() {
503
606
  return '[' + this.map(Object.inspect).join(', ') + ']';
504
607
  }
505
608
  });
506
- var Hash = {
609
+
610
+ Array.prototype.toArray = Array.prototype.clone;
611
+
612
+ function $w(string){
613
+ string = string.strip();
614
+ return string ? string.split(/\s+/) : [];
615
+ }
616
+
617
+ if(window.opera){
618
+ Array.prototype.concat = function(){
619
+ var array = [];
620
+ for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
621
+ for(var i = 0, length = arguments.length; i < length; i++) {
622
+ if(arguments[i].constructor == Array) {
623
+ for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
624
+ array.push(arguments[i][j]);
625
+ } else {
626
+ array.push(arguments[i]);
627
+ }
628
+ }
629
+ return array;
630
+ }
631
+ }
632
+ var Hash = function(obj) {
633
+ Object.extend(this, obj || {});
634
+ };
635
+
636
+ Object.extend(Hash, {
637
+ toQueryString: function(obj) {
638
+ var parts = [];
639
+
640
+ this.prototype._each.call(obj, function(pair) {
641
+ if (!pair.key) return;
642
+
643
+ if (pair.value && pair.value.constructor == Array) {
644
+ var values = pair.value.compact();
645
+ if (values.length < 2) pair.value = values.reduce();
646
+ else {
647
+ key = encodeURIComponent(pair.key);
648
+ values.each(function(value) {
649
+ value = value != undefined ? encodeURIComponent(value) : '';
650
+ parts.push(key + '=' + encodeURIComponent(value));
651
+ });
652
+ return;
653
+ }
654
+ }
655
+ if (pair.value == undefined) pair[1] = '';
656
+ parts.push(pair.map(encodeURIComponent).join('='));
657
+ });
658
+
659
+ return parts.join('&');
660
+ }
661
+ });
662
+
663
+ Object.extend(Hash.prototype, Enumerable);
664
+ Object.extend(Hash.prototype, {
507
665
  _each: function(iterator) {
508
666
  for (var key in this) {
509
667
  var value = this[key];
510
- if (typeof value == 'function') continue;
668
+ if (value && value == Hash.prototype[key]) continue;
511
669
 
512
670
  var pair = [key, value];
513
671
  pair.key = key;
@@ -525,16 +683,30 @@ var Hash = {
525
683
  },
526
684
 
527
685
  merge: function(hash) {
528
- return $H(hash).inject($H(this), function(mergedHash, pair) {
686
+ return $H(hash).inject(this, function(mergedHash, pair) {
529
687
  mergedHash[pair.key] = pair.value;
530
688
  return mergedHash;
531
689
  });
532
690
  },
533
691
 
692
+ remove: function() {
693
+ var result;
694
+ for(var i = 0, length = arguments.length; i < length; i++) {
695
+ var value = this[arguments[i]];
696
+ if (value !== undefined){
697
+ if (result === undefined) result = value;
698
+ else {
699
+ if (result.constructor != Array) result = [result];
700
+ result.push(value)
701
+ }
702
+ }
703
+ delete this[arguments[i]];
704
+ }
705
+ return result;
706
+ },
707
+
534
708
  toQueryString: function() {
535
- return this.map(function(pair) {
536
- return pair.map(encodeURIComponent).join('=');
537
- }).join('&');
709
+ return Hash.toQueryString(this);
538
710
  },
539
711
 
540
712
  inspect: function() {
@@ -542,14 +714,12 @@ var Hash = {
542
714
  return pair.map(Object.inspect).join(': ');
543
715
  }).join(', ') + '}>';
544
716
  }
545
- }
717
+ });
546
718
 
547
719
  function $H(object) {
548
- var hash = Object.extend({}, object || {});
549
- Object.extend(hash, Enumerable);
550
- Object.extend(hash, Hash);
551
- return hash;
552
- }
720
+ if (object && object.constructor == Hash) return object;
721
+ return new Hash(object);
722
+ };
553
723
  ObjectRange = Class.create();
554
724
  Object.extend(ObjectRange.prototype, Enumerable);
555
725
  Object.extend(ObjectRange.prototype, {
@@ -561,10 +731,10 @@ Object.extend(ObjectRange.prototype, {
561
731
 
562
732
  _each: function(iterator) {
563
733
  var value = this.start;
564
- do {
734
+ while (this.include(value)) {
565
735
  iterator(value);
566
736
  value = value.succ();
567
- } while (this.include(value));
737
+ }
568
738
  },
569
739
 
570
740
  include: function(value) {
@@ -599,18 +769,18 @@ Ajax.Responders = {
599
769
  this.responders._each(iterator);
600
770
  },
601
771
 
602
- register: function(responderToAdd) {
603
- if (!this.include(responderToAdd))
604
- this.responders.push(responderToAdd);
772
+ register: function(responder) {
773
+ if (!this.include(responder))
774
+ this.responders.push(responder);
605
775
  },
606
776
 
607
- unregister: function(responderToRemove) {
608
- this.responders = this.responders.without(responderToRemove);
777
+ unregister: function(responder) {
778
+ this.responders = this.responders.without(responder);
609
779
  },
610
780
 
611
781
  dispatch: function(callback, request, transport, json) {
612
782
  this.each(function(responder) {
613
- if (responder[callback] && typeof responder[callback] == 'function') {
783
+ if (typeof responder[callback] == 'function') {
614
784
  try {
615
785
  responder[callback].apply(responder, [request, transport, json]);
616
786
  } catch (e) {}
@@ -625,7 +795,6 @@ Ajax.Responders.register({
625
795
  onCreate: function() {
626
796
  Ajax.activeRequestCount++;
627
797
  },
628
-
629
798
  onComplete: function() {
630
799
  Ajax.activeRequestCount--;
631
800
  }
@@ -638,19 +807,14 @@ Ajax.Base.prototype = {
638
807
  method: 'post',
639
808
  asynchronous: true,
640
809
  contentType: 'application/x-www-form-urlencoded',
810
+ encoding: 'UTF-8',
641
811
  parameters: ''
642
812
  }
643
813
  Object.extend(this.options, options || {});
644
- },
645
-
646
- responseIsSuccess: function() {
647
- return this.transport.status == undefined
648
- || this.transport.status == 0
649
- || (this.transport.status >= 200 && this.transport.status < 300);
650
- },
651
814
 
652
- responseIsFailure: function() {
653
- return !this.responseIsSuccess();
815
+ this.options.method = this.options.method.toLowerCase();
816
+ if (typeof this.options.parameters == 'string')
817
+ this.options.parameters = this.options.parameters.toQueryParams();
654
818
  }
655
819
  }
656
820
 
@@ -659,6 +823,8 @@ Ajax.Request.Events =
659
823
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
660
824
 
661
825
  Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
826
+ _complete: false,
827
+
662
828
  initialize: function(url, options) {
663
829
  this.transport = Ajax.getTransport();
664
830
  this.setOptions(options);
@@ -666,111 +832,146 @@ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
666
832
  },
667
833
 
668
834
  request: function(url) {
669
- var parameters = this.options.parameters || '';
670
- if (parameters.length > 0) parameters += '&_=';
835
+ this.url = url;
836
+ this.method = this.options.method;
837
+ var params = this.options.parameters;
671
838
 
672
- try {
673
- this.url = url;
674
- if (this.options.method == 'get' && parameters.length > 0)
675
- this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
839
+ if (!['get', 'post'].include(this.method)) {
840
+ // simulate other verbs over post
841
+ params['_method'] = this.method;
842
+ this.method = 'post';
843
+ }
676
844
 
845
+ params = Hash.toQueryString(params);
846
+ if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='
847
+
848
+ // when GET, append parameters to URL
849
+ if (this.method == 'get' && params)
850
+ this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;
851
+
852
+ try {
677
853
  Ajax.Responders.dispatch('onCreate', this, this.transport);
678
854
 
679
- this.transport.open(this.options.method, this.url,
855
+ this.transport.open(this.method.toUpperCase(), this.url,
680
856
  this.options.asynchronous);
681
857
 
682
- if (this.options.asynchronous) {
683
- this.transport.onreadystatechange = this.onStateChange.bind(this);
684
- setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
685
- }
858
+ if (this.options.asynchronous)
859
+ setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
686
860
 
861
+ this.transport.onreadystatechange = this.onStateChange.bind(this);
687
862
  this.setRequestHeaders();
688
863
 
689
- var body = this.options.postBody ? this.options.postBody : parameters;
690
- this.transport.send(this.options.method == 'post' ? body : null);
864
+ var body = this.method == 'post' ? (this.options.postBody || params) : null;
691
865
 
692
- } catch (e) {
693
- this.dispatchException(e);
694
- }
695
- },
696
-
697
- setRequestHeaders: function() {
698
- var requestHeaders =
699
- ['X-Requested-With', 'XMLHttpRequest',
700
- 'X-Prototype-Version', Prototype.Version,
701
- 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
866
+ this.transport.send(body);
702
867
 
703
- if (this.options.method == 'post') {
704
- requestHeaders.push('Content-type', this.options.contentType);
868
+ /* Force Firefox to handle ready state 4 for synchronous requests */
869
+ if (!this.options.asynchronous && this.transport.overrideMimeType)
870
+ this.onStateChange();
705
871
 
706
- /* Force "Connection: close" for Mozilla browsers to work around
707
- * a bug where XMLHttpReqeuest sends an incorrect Content-length
708
- * header. See Mozilla Bugzilla #246651.
709
- */
710
- if (this.transport.overrideMimeType)
711
- requestHeaders.push('Connection', 'close');
712
872
  }
713
-
714
- if (this.options.requestHeaders)
715
- requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
716
-
717
- for (var i = 0; i < requestHeaders.length; i += 2)
718
- this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
873
+ catch (e) {
874
+ this.dispatchException(e);
875
+ }
719
876
  },
720
877
 
721
878
  onStateChange: function() {
722
879
  var readyState = this.transport.readyState;
723
- if (readyState != 1)
880
+ if (readyState > 1 && !((readyState == 4) && this._complete))
724
881
  this.respondToReadyState(this.transport.readyState);
725
882
  },
726
883
 
727
- header: function(name) {
728
- try {
729
- return this.transport.getResponseHeader(name);
730
- } catch (e) {}
731
- },
884
+ setRequestHeaders: function() {
885
+ var headers = {
886
+ 'X-Requested-With': 'XMLHttpRequest',
887
+ 'X-Prototype-Version': Prototype.Version,
888
+ 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
889
+ };
890
+
891
+ if (this.method == 'post') {
892
+ headers['Content-type'] = this.options.contentType +
893
+ (this.options.encoding ? '; charset=' + this.options.encoding : '');
894
+
895
+ /* Force "Connection: close" for older Mozilla browsers to work
896
+ * around a bug where XMLHttpRequest sends an incorrect
897
+ * Content-length header. See Mozilla Bugzilla #246651.
898
+ */
899
+ if (this.transport.overrideMimeType &&
900
+ (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
901
+ headers['Connection'] = 'close';
902
+ }
732
903
 
733
- evalJSON: function() {
734
- try {
735
- return eval('(' + this.header('X-JSON') + ')');
736
- } catch (e) {}
737
- },
904
+ // user-defined headers
905
+ if (typeof this.options.requestHeaders == 'object') {
906
+ var extras = this.options.requestHeaders;
738
907
 
739
- evalResponse: function() {
740
- try {
741
- return eval(this.transport.responseText);
742
- } catch (e) {
743
- this.dispatchException(e);
908
+ if (typeof extras.push == 'function')
909
+ for (var i = 0, length = extras.length; i < length; i += 2)
910
+ headers[extras[i]] = extras[i+1];
911
+ else
912
+ $H(extras).each(function(pair) { headers[pair.key] = pair.value });
744
913
  }
914
+
915
+ for (var name in headers)
916
+ this.transport.setRequestHeader(name, headers[name]);
917
+ },
918
+
919
+ success: function() {
920
+ return !this.transport.status
921
+ || (this.transport.status >= 200 && this.transport.status < 300);
745
922
  },
746
923
 
747
924
  respondToReadyState: function(readyState) {
748
- var event = Ajax.Request.Events[readyState];
925
+ var state = Ajax.Request.Events[readyState];
749
926
  var transport = this.transport, json = this.evalJSON();
750
927
 
751
- if (event == 'Complete') {
928
+ if (state == 'Complete') {
752
929
  try {
930
+ this._complete = true;
753
931
  (this.options['on' + this.transport.status]
754
- || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
932
+ || this.options['on' + (this.success() ? 'Success' : 'Failure')]
755
933
  || Prototype.emptyFunction)(transport, json);
756
934
  } catch (e) {
757
935
  this.dispatchException(e);
758
936
  }
759
937
 
760
- if ((this.header('Content-type') || '').match(/^text\/javascript/i))
761
- this.evalResponse();
938
+ if ((this.getHeader('Content-type') || 'text/javascript').strip().
939
+ match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
940
+ this.evalResponse();
762
941
  }
763
942
 
764
943
  try {
765
- (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
766
- Ajax.Responders.dispatch('on' + event, this, transport, json);
944
+ (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
945
+ Ajax.Responders.dispatch('on' + state, this, transport, json);
767
946
  } catch (e) {
768
947
  this.dispatchException(e);
769
948
  }
770
949
 
771
- /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
772
- if (event == 'Complete')
950
+ if (state == 'Complete') {
951
+ // avoid memory leak in MSIE: clean up
773
952
  this.transport.onreadystatechange = Prototype.emptyFunction;
953
+ }
954
+ },
955
+
956
+ getHeader: function(name) {
957
+ try {
958
+ return this.transport.getResponseHeader(name);
959
+ } catch (e) { return null }
960
+ },
961
+
962
+ evalJSON: function() {
963
+ try {
964
+ var json = this.getHeader('X-JSON');
965
+ return json ? eval('(' + json + ')') : null;
966
+ } catch (e) { return null }
967
+ },
968
+
969
+ evalResponse: function() {
970
+ try {
971
+ return eval(this.transport.responseText);
972
+ } catch (e) {
973
+ this.dispatchException(e);
974
+ }
774
975
  },
775
976
 
776
977
  dispatchException: function(exception) {
@@ -783,41 +984,37 @@ Ajax.Updater = Class.create();
783
984
 
784
985
  Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
785
986
  initialize: function(container, url, options) {
786
- this.containers = {
787
- success: container.success ? $(container.success) : $(container),
788
- failure: container.failure ? $(container.failure) :
789
- (container.success ? null : $(container))
987
+ this.container = {
988
+ success: (container.success || container),
989
+ failure: (container.failure || (container.success ? null : container))
790
990
  }
791
991
 
792
992
  this.transport = Ajax.getTransport();
793
993
  this.setOptions(options);
794
994
 
795
995
  var onComplete = this.options.onComplete || Prototype.emptyFunction;
796
- this.options.onComplete = (function(transport, object) {
996
+ this.options.onComplete = (function(transport, param) {
797
997
  this.updateContent();
798
- onComplete(transport, object);
998
+ onComplete(transport, param);
799
999
  }).bind(this);
800
1000
 
801
1001
  this.request(url);
802
1002
  },
803
1003
 
804
1004
  updateContent: function() {
805
- var receiver = this.responseIsSuccess() ?
806
- this.containers.success : this.containers.failure;
1005
+ var receiver = this.container[this.success() ? 'success' : 'failure'];
807
1006
  var response = this.transport.responseText;
808
1007
 
809
- if (!this.options.evalScripts)
810
- response = response.stripScripts();
1008
+ if (!this.options.evalScripts) response = response.stripScripts();
811
1009
 
812
- if (receiver) {
813
- if (this.options.insertion) {
1010
+ if (receiver = $(receiver)) {
1011
+ if (this.options.insertion)
814
1012
  new this.options.insertion(receiver, response);
815
- } else {
816
- Element.update(receiver, response);
817
- }
1013
+ else
1014
+ receiver.update(response);
818
1015
  }
819
1016
 
820
- if (this.responseIsSuccess()) {
1017
+ if (this.success()) {
821
1018
  if (this.onComplete)
822
1019
  setTimeout(this.onComplete.bind(this), 10);
823
1020
  }
@@ -846,7 +1043,7 @@ Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
846
1043
  },
847
1044
 
848
1045
  stop: function() {
849
- this.updater.onComplete = undefined;
1046
+ this.updater.options.onComplete = undefined;
850
1047
  clearTimeout(this.timer);
851
1048
  (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
852
1049
  },
@@ -866,25 +1063,43 @@ Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
866
1063
  this.updater = new Ajax.Updater(this.container, this.url, this.options);
867
1064
  }
868
1065
  });
869
- function $() {
870
- var results = [], element;
871
- for (var i = 0; i < arguments.length; i++) {
872
- element = arguments[i];
873
- if (typeof element == 'string')
874
- element = document.getElementById(element);
875
- results.push(Element.extend(element));
1066
+ function $(element) {
1067
+ if (arguments.length > 1) {
1068
+ for (var i = 0, elements = [], length = arguments.length; i < length; i++)
1069
+ elements.push($(arguments[i]));
1070
+ return elements;
876
1071
  }
877
- return results.length < 2 ? results[0] : results;
1072
+ if (typeof element == 'string')
1073
+ element = document.getElementById(element);
1074
+ return Element.extend(element);
1075
+ }
1076
+
1077
+ if (Prototype.BrowserFeatures.XPath) {
1078
+ document._getElementsByXPath = function(expression, parentElement) {
1079
+ var results = [];
1080
+ var query = document.evaluate(expression, $(parentElement) || document,
1081
+ null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
1082
+ for (var i = 0, length = query.snapshotLength; i < length; i++)
1083
+ results.push(query.snapshotItem(i));
1084
+ return results;
1085
+ };
878
1086
  }
879
1087
 
880
1088
  document.getElementsByClassName = function(className, parentElement) {
881
- var children = ($(parentElement) || document.body).getElementsByTagName('*');
882
- return $A(children).inject([], function(elements, child) {
883
- if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
884
- elements.push(Element.extend(child));
1089
+ if (Prototype.BrowserFeatures.XPath) {
1090
+ var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
1091
+ return document._getElementsByXPath(q, parentElement);
1092
+ } else {
1093
+ var children = ($(parentElement) || document.body).getElementsByTagName('*');
1094
+ var elements = [], child;
1095
+ for (var i = 0, length = children.length; i < length; i++) {
1096
+ child = children[i];
1097
+ if (Element.hasClassName(child, className))
1098
+ elements.push(Element.extend(child));
1099
+ }
885
1100
  return elements;
886
- });
887
- }
1101
+ }
1102
+ };
888
1103
 
889
1104
  /*--------------------------------------------------------------------------*/
890
1105
 
@@ -892,21 +1107,28 @@ if (!window.Element)
892
1107
  var Element = new Object();
893
1108
 
894
1109
  Element.extend = function(element) {
895
- if (!element) return;
896
- if (_nativeExtensions) return element;
1110
+ if (!element || _nativeExtensions || element.nodeType == 3) return element;
897
1111
 
898
1112
  if (!element._extended && element.tagName && element != window) {
899
- var methods = Element.Methods, cache = Element.extend.cache;
900
- for (property in methods) {
1113
+ var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
1114
+
1115
+ if (element.tagName == 'FORM')
1116
+ Object.extend(methods, Form.Methods);
1117
+ if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
1118
+ Object.extend(methods, Form.Element.Methods);
1119
+
1120
+ Object.extend(methods, Element.Methods.Simulated);
1121
+
1122
+ for (var property in methods) {
901
1123
  var value = methods[property];
902
- if (typeof value == 'function')
1124
+ if (typeof value == 'function' && !(property in element))
903
1125
  element[property] = cache.findOrStore(value);
904
1126
  }
905
1127
  }
906
1128
 
907
1129
  element._extended = true;
908
1130
  return element;
909
- }
1131
+ };
910
1132
 
911
1133
  Element.extend.cache = {
912
1134
  findOrStore: function(value) {
@@ -914,46 +1136,45 @@ Element.extend.cache = {
914
1136
  return value.apply(null, [this].concat($A(arguments)));
915
1137
  }
916
1138
  }
917
- }
1139
+ };
918
1140
 
919
1141
  Element.Methods = {
920
1142
  visible: function(element) {
921
1143
  return $(element).style.display != 'none';
922
1144
  },
923
1145
 
924
- toggle: function() {
925
- for (var i = 0; i < arguments.length; i++) {
926
- var element = $(arguments[i]);
927
- Element[Element.visible(element) ? 'hide' : 'show'](element);
928
- }
1146
+ toggle: function(element) {
1147
+ element = $(element);
1148
+ Element[Element.visible(element) ? 'hide' : 'show'](element);
1149
+ return element;
929
1150
  },
930
1151
 
931
- hide: function() {
932
- for (var i = 0; i < arguments.length; i++) {
933
- var element = $(arguments[i]);
934
- element.style.display = 'none';
935
- }
1152
+ hide: function(element) {
1153
+ $(element).style.display = 'none';
1154
+ return element;
936
1155
  },
937
1156
 
938
- show: function() {
939
- for (var i = 0; i < arguments.length; i++) {
940
- var element = $(arguments[i]);
941
- element.style.display = '';
942
- }
1157
+ show: function(element) {
1158
+ $(element).style.display = '';
1159
+ return element;
943
1160
  },
944
1161
 
945
1162
  remove: function(element) {
946
1163
  element = $(element);
947
1164
  element.parentNode.removeChild(element);
1165
+ return element;
948
1166
  },
949
1167
 
950
1168
  update: function(element, html) {
1169
+ html = typeof html == 'undefined' ? '' : html.toString();
951
1170
  $(element).innerHTML = html.stripScripts();
952
1171
  setTimeout(function() {html.evalScripts()}, 10);
1172
+ return element;
953
1173
  },
954
1174
 
955
1175
  replace: function(element, html) {
956
1176
  element = $(element);
1177
+ html = typeof html == 'undefined' ? '' : html.toString();
957
1178
  if (element.outerHTML) {
958
1179
  element.outerHTML = html.stripScripts();
959
1180
  } else {
@@ -963,11 +1184,106 @@ Element.Methods = {
963
1184
  range.createContextualFragment(html.stripScripts()), element);
964
1185
  }
965
1186
  setTimeout(function() {html.evalScripts()}, 10);
1187
+ return element;
966
1188
  },
967
1189
 
968
- getHeight: function(element) {
1190
+ inspect: function(element) {
1191
+ element = $(element);
1192
+ var result = '<' + element.tagName.toLowerCase();
1193
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {
1194
+ var property = pair.first(), attribute = pair.last();
1195
+ var value = (element[property] || '').toString();
1196
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);
1197
+ });
1198
+ return result + '>';
1199
+ },
1200
+
1201
+ recursivelyCollect: function(element, property) {
1202
+ element = $(element);
1203
+ var elements = [];
1204
+ while (element = element[property])
1205
+ if (element.nodeType == 1)
1206
+ elements.push(Element.extend(element));
1207
+ return elements;
1208
+ },
1209
+
1210
+ ancestors: function(element) {
1211
+ return $(element).recursivelyCollect('parentNode');
1212
+ },
1213
+
1214
+ descendants: function(element) {
1215
+ return $A($(element).getElementsByTagName('*'));
1216
+ },
1217
+
1218
+ immediateDescendants: function(element) {
1219
+ if (!(element = $(element).firstChild)) return [];
1220
+ while (element && element.nodeType != 1) element = element.nextSibling;
1221
+ if (element) return [element].concat($(element).nextSiblings());
1222
+ return [];
1223
+ },
1224
+
1225
+ previousSiblings: function(element) {
1226
+ return $(element).recursivelyCollect('previousSibling');
1227
+ },
1228
+
1229
+ nextSiblings: function(element) {
1230
+ return $(element).recursivelyCollect('nextSibling');
1231
+ },
1232
+
1233
+ siblings: function(element) {
969
1234
  element = $(element);
970
- return element.offsetHeight;
1235
+ return element.previousSiblings().reverse().concat(element.nextSiblings());
1236
+ },
1237
+
1238
+ match: function(element, selector) {
1239
+ if (typeof selector == 'string')
1240
+ selector = new Selector(selector);
1241
+ return selector.match($(element));
1242
+ },
1243
+
1244
+ up: function(element, expression, index) {
1245
+ return Selector.findElement($(element).ancestors(), expression, index);
1246
+ },
1247
+
1248
+ down: function(element, expression, index) {
1249
+ return Selector.findElement($(element).descendants(), expression, index);
1250
+ },
1251
+
1252
+ previous: function(element, expression, index) {
1253
+ return Selector.findElement($(element).previousSiblings(), expression, index);
1254
+ },
1255
+
1256
+ next: function(element, expression, index) {
1257
+ return Selector.findElement($(element).nextSiblings(), expression, index);
1258
+ },
1259
+
1260
+ getElementsBySelector: function() {
1261
+ var args = $A(arguments), element = $(args.shift());
1262
+ return Selector.findChildElements(element, args);
1263
+ },
1264
+
1265
+ getElementsByClassName: function(element, className) {
1266
+ return document.getElementsByClassName(className, element);
1267
+ },
1268
+
1269
+ readAttribute: function(element, name) {
1270
+ element = $(element);
1271
+ if (document.all && !window.opera) {
1272
+ var t = Element._attributeTranslations;
1273
+ if (t.values[name]) return t.values[name](element, name);
1274
+ if (t.names[name]) name = t.names[name];
1275
+ var attribute = element.attributes[name];
1276
+ if(attribute) return attribute.nodeValue;
1277
+ }
1278
+ return element.getAttribute(name);
1279
+ },
1280
+
1281
+ getHeight: function(element) {
1282
+ return $(element).getDimensions().height;
1283
+ },
1284
+
1285
+ getWidth: function(element) {
1286
+ return $(element).getDimensions().width;
971
1287
  },
972
1288
 
973
1289
  classNames: function(element) {
@@ -976,34 +1292,60 @@ Element.Methods = {
976
1292
 
977
1293
  hasClassName: function(element, className) {
978
1294
  if (!(element = $(element))) return;
979
- return Element.classNames(element).include(className);
1295
+ var elementClassName = element.className;
1296
+ if (elementClassName.length == 0) return false;
1297
+ if (elementClassName == className ||
1298
+ elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
1299
+ return true;
1300
+ return false;
980
1301
  },
981
1302
 
982
1303
  addClassName: function(element, className) {
983
1304
  if (!(element = $(element))) return;
984
- return Element.classNames(element).add(className);
1305
+ Element.classNames(element).add(className);
1306
+ return element;
985
1307
  },
986
1308
 
987
1309
  removeClassName: function(element, className) {
988
1310
  if (!(element = $(element))) return;
989
- return Element.classNames(element).remove(className);
1311
+ Element.classNames(element).remove(className);
1312
+ return element;
1313
+ },
1314
+
1315
+ toggleClassName: function(element, className) {
1316
+ if (!(element = $(element))) return;
1317
+ Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
1318
+ return element;
1319
+ },
1320
+
1321
+ observe: function() {
1322
+ Event.observe.apply(Event, arguments);
1323
+ return $A(arguments).first();
1324
+ },
1325
+
1326
+ stopObserving: function() {
1327
+ Event.stopObserving.apply(Event, arguments);
1328
+ return $A(arguments).first();
990
1329
  },
991
1330
 
992
1331
  // removes whitespace-only text node children
993
1332
  cleanWhitespace: function(element) {
994
1333
  element = $(element);
995
- for (var i = 0; i < element.childNodes.length; i++) {
996
- var node = element.childNodes[i];
1334
+ var node = element.firstChild;
1335
+ while (node) {
1336
+ var nextNode = node.nextSibling;
997
1337
  if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
998
- Element.remove(node);
1338
+ element.removeChild(node);
1339
+ node = nextNode;
999
1340
  }
1341
+ return element;
1000
1342
  },
1001
1343
 
1002
1344
  empty: function(element) {
1003
1345
  return $(element).innerHTML.match(/^\s*$/);
1004
1346
  },
1005
1347
 
1006
- childOf: function(element, ancestor) {
1348
+ descendantOf: function(element, ancestor) {
1007
1349
  element = $(element), ancestor = $(ancestor);
1008
1350
  while (element = element.parentNode)
1009
1351
  if (element == ancestor) return true;
@@ -1012,38 +1354,69 @@ Element.Methods = {
1012
1354
 
1013
1355
  scrollTo: function(element) {
1014
1356
  element = $(element);
1015
- var x = element.x ? element.x : element.offsetLeft,
1016
- y = element.y ? element.y : element.offsetTop;
1017
- window.scrollTo(x, y);
1357
+ var pos = Position.cumulativeOffset(element);
1358
+ window.scrollTo(pos[0], pos[1]);
1359
+ return element;
1018
1360
  },
1019
1361
 
1020
1362
  getStyle: function(element, style) {
1021
1363
  element = $(element);
1022
- var value = element.style[style.camelize()];
1364
+ if (['float','cssFloat'].include(style))
1365
+ style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
1366
+ style = style.camelize();
1367
+ var value = element.style[style];
1023
1368
  if (!value) {
1024
1369
  if (document.defaultView && document.defaultView.getComputedStyle) {
1025
1370
  var css = document.defaultView.getComputedStyle(element, null);
1026
- value = css ? css.getPropertyValue(style) : null;
1371
+ value = css ? css[style] : null;
1027
1372
  } else if (element.currentStyle) {
1028
- value = element.currentStyle[style.camelize()];
1373
+ value = element.currentStyle[style];
1029
1374
  }
1030
1375
  }
1031
1376
 
1377
+ if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
1378
+ value = element['offset'+style.capitalize()] + 'px';
1379
+
1032
1380
  if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
1033
1381
  if (Element.getStyle(element, 'position') == 'static') value = 'auto';
1034
-
1382
+ if(style == 'opacity') {
1383
+ if(value) return parseFloat(value);
1384
+ if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
1385
+ if(value[1]) return parseFloat(value[1]) / 100;
1386
+ return 1.0;
1387
+ }
1035
1388
  return value == 'auto' ? null : value;
1036
1389
  },
1037
1390
 
1038
1391
  setStyle: function(element, style) {
1039
1392
  element = $(element);
1040
- for (var name in style)
1041
- element.style[name.camelize()] = style[name];
1393
+ for (var name in style) {
1394
+ var value = style[name];
1395
+ if(name == 'opacity') {
1396
+ if (value == 1) {
1397
+ value = (/Gecko/.test(navigator.userAgent) &&
1398
+ !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
1399
+ if(/MSIE/.test(navigator.userAgent) && !window.opera)
1400
+ element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
1401
+ } else if(value == '') {
1402
+ if(/MSIE/.test(navigator.userAgent) && !window.opera)
1403
+ element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
1404
+ } else {
1405
+ if(value < 0.00001) value = 0;
1406
+ if(/MSIE/.test(navigator.userAgent) && !window.opera)
1407
+ element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
1408
+ 'alpha(opacity='+value*100+')';
1409
+ }
1410
+ } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
1411
+ element.style[name.camelize()] = value;
1412
+ }
1413
+ return element;
1042
1414
  },
1043
1415
 
1044
1416
  getDimensions: function(element) {
1045
1417
  element = $(element);
1046
- if (Element.getStyle(element, 'display') != 'none')
1418
+ var display = $(element).getStyle('display');
1419
+ if (display != 'none' && display != null) // Safari bug
1047
1420
  return {width: element.offsetWidth, height: element.offsetHeight};
1048
1421
 
1049
1422
  // All *Width and *Height properties give 0 on elements with display none,
@@ -1051,12 +1424,13 @@ Element.Methods = {
1051
1424
  var els = element.style;
1052
1425
  var originalVisibility = els.visibility;
1053
1426
  var originalPosition = els.position;
1427
+ var originalDisplay = els.display;
1054
1428
  els.visibility = 'hidden';
1055
1429
  els.position = 'absolute';
1056
- els.display = '';
1430
+ els.display = 'block';
1057
1431
  var originalWidth = element.clientWidth;
1058
1432
  var originalHeight = element.clientHeight;
1059
- els.display = 'none';
1433
+ els.display = originalDisplay;
1060
1434
  els.position = originalPosition;
1061
1435
  els.visibility = originalVisibility;
1062
1436
  return {width: originalWidth, height: originalHeight};
@@ -1075,6 +1449,7 @@ Element.Methods = {
1075
1449
  element.style.left = 0;
1076
1450
  }
1077
1451
  }
1452
+ return element;
1078
1453
  },
1079
1454
 
1080
1455
  undoPositioned: function(element) {
@@ -1087,49 +1462,153 @@ Element.Methods = {
1087
1462
  element.style.bottom =
1088
1463
  element.style.right = '';
1089
1464
  }
1465
+ return element;
1090
1466
  },
1091
1467
 
1092
1468
  makeClipping: function(element) {
1093
1469
  element = $(element);
1094
- if (element._overflow) return;
1095
- element._overflow = element.style.overflow;
1470
+ if (element._overflow) return element;
1471
+ element._overflow = element.style.overflow || 'auto';
1096
1472
  if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
1097
1473
  element.style.overflow = 'hidden';
1474
+ return element;
1098
1475
  },
1099
1476
 
1100
1477
  undoClipping: function(element) {
1101
1478
  element = $(element);
1102
- if (element._overflow) return;
1103
- element.style.overflow = element._overflow;
1104
- element._overflow = undefined;
1479
+ if (!element._overflow) return element;
1480
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
1481
+ element._overflow = null;
1482
+ return element;
1105
1483
  }
1106
- }
1484
+ };
1485
+
1486
+ Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});
1487
+
1488
+ Element._attributeTranslations = {};
1489
+
1490
+ Element._attributeTranslations.names = {
1491
+ colspan: "colSpan",
1492
+ rowspan: "rowSpan",
1493
+ valign: "vAlign",
1494
+ datetime: "dateTime",
1495
+ accesskey: "accessKey",
1496
+ tabindex: "tabIndex",
1497
+ enctype: "encType",
1498
+ maxlength: "maxLength",
1499
+ readonly: "readOnly",
1500
+ longdesc: "longDesc"
1501
+ };
1502
+
1503
+ Element._attributeTranslations.values = {
1504
+ _getAttr: function(element, attribute) {
1505
+ return element.getAttribute(attribute, 2);
1506
+ },
1507
+
1508
+ _flag: function(element, attribute) {
1509
+ return $(element).hasAttribute(attribute) ? attribute : null;
1510
+ },
1511
+
1512
+ style: function(element) {
1513
+ return element.style.cssText.toLowerCase();
1514
+ },
1515
+
1516
+ title: function(element) {
1517
+ var node = element.getAttributeNode('title');
1518
+ return node.specified ? node.nodeValue : null;
1519
+ }
1520
+ };
1521
+
1522
+ Object.extend(Element._attributeTranslations.values, {
1523
+ href: Element._attributeTranslations.values._getAttr,
1524
+ src: Element._attributeTranslations.values._getAttr,
1525
+ disabled: Element._attributeTranslations.values._flag,
1526
+ checked: Element._attributeTranslations.values._flag,
1527
+ readonly: Element._attributeTranslations.values._flag,
1528
+ multiple: Element._attributeTranslations.values._flag
1529
+ });
1530
+
1531
+ Element.Methods.Simulated = {
1532
+ hasAttribute: function(element, attribute) {
1533
+ var t = Element._attributeTranslations;
1534
+ attribute = t.names[attribute] || attribute;
1535
+ return $(element).getAttributeNode(attribute).specified;
1536
+ }
1537
+ };
1538
+
1539
+ // IE is missing .innerHTML support for TABLE-related elements
1540
+ if (document.all && !window.opera){
1541
+ Element.Methods.update = function(element, html) {
1542
+ element = $(element);
1543
+ html = typeof html == 'undefined' ? '' : html.toString();
1544
+ var tagName = element.tagName.toUpperCase();
1545
+ if (['THEAD','TBODY','TR','TD'].include(tagName)) {
1546
+ var div = document.createElement('div');
1547
+ switch (tagName) {
1548
+ case 'THEAD':
1549
+ case 'TBODY':
1550
+ div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';
1551
+ depth = 2;
1552
+ break;
1553
+ case 'TR':
1554
+ div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';
1555
+ depth = 3;
1556
+ break;
1557
+ case 'TD':
1558
+ div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';
1559
+ depth = 4;
1560
+ }
1561
+ $A(element.childNodes).each(function(node){
1562
+ element.removeChild(node)
1563
+ });
1564
+ depth.times(function(){ div = div.firstChild });
1565
+
1566
+ $A(div.childNodes).each(
1567
+ function(node){ element.appendChild(node) });
1568
+ } else {
1569
+ element.innerHTML = html.stripScripts();
1570
+ }
1571
+ setTimeout(function() {html.evalScripts()}, 10);
1572
+ return element;
1573
+ }
1574
+ };
1107
1575
 
1108
1576
  Object.extend(Element, Element.Methods);
1109
1577
 
1110
1578
  var _nativeExtensions = false;
1111
1579
 
1112
- if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
1113
- var HTMLElement = {}
1114
- HTMLElement.prototype = document.createElement('div').__proto__;
1115
- }
1580
+ if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
1581
+ ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
1582
+ var className = 'HTML' + tag + 'Element';
1583
+ if(window[className]) return;
1584
+ var klass = window[className] = {};
1585
+ klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
1586
+ });
1116
1587
 
1117
1588
  Element.addMethods = function(methods) {
1118
1589
  Object.extend(Element.Methods, methods || {});
1119
1590
 
1120
- if(typeof HTMLElement != 'undefined') {
1121
- var methods = Element.Methods, cache = Element.extend.cache;
1122
- for (property in methods) {
1591
+ function copy(methods, destination, onlyIfAbsent) {
1592
+ onlyIfAbsent = onlyIfAbsent || false;
1593
+ var cache = Element.extend.cache;
1594
+ for (var property in methods) {
1123
1595
  var value = methods[property];
1124
- if (typeof value == 'function')
1125
- HTMLElement.prototype[property] = cache.findOrStore(value);
1596
+ if (!onlyIfAbsent || !(property in destination))
1597
+ destination[property] = cache.findOrStore(value);
1126
1598
  }
1599
+ }
1600
+
1601
+ if (typeof HTMLElement != 'undefined') {
1602
+ copy(Element.Methods, HTMLElement.prototype);
1603
+ copy(Element.Methods.Simulated, HTMLElement.prototype, true);
1604
+ copy(Form.Methods, HTMLFormElement.prototype);
1605
+ [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
1606
+ copy(Form.Element.Methods, klass.prototype);
1607
+ });
1127
1608
  _nativeExtensions = true;
1128
1609
  }
1129
1610
  }
1130
1611
 
1131
- Element.addMethods();
1132
-
1133
1612
  var Toggle = new Object();
1134
1613
  Toggle.display = Element.toggle;
1135
1614
 
@@ -1148,8 +1627,8 @@ Abstract.Insertion.prototype = {
1148
1627
  try {
1149
1628
  this.element.insertAdjacentHTML(this.adjacency, this.content);
1150
1629
  } catch (e) {
1151
- var tagName = this.element.tagName.toLowerCase();
1152
- if (tagName == 'tbody' || tagName == 'tr') {
1630
+ var tagName = this.element.tagName.toUpperCase();
1631
+ if (['TBODY', 'TR'].include(tagName)) {
1153
1632
  this.insertContent(this.contentFromAnonymousTable());
1154
1633
  } else {
1155
1634
  throw e;
@@ -1248,20 +1727,18 @@ Element.ClassNames.prototype = {
1248
1727
 
1249
1728
  add: function(classNameToAdd) {
1250
1729
  if (this.include(classNameToAdd)) return;
1251
- this.set(this.toArray().concat(classNameToAdd).join(' '));
1730
+ this.set($A(this).concat(classNameToAdd).join(' '));
1252
1731
  },
1253
1732
 
1254
1733
  remove: function(classNameToRemove) {
1255
1734
  if (!this.include(classNameToRemove)) return;
1256
- this.set(this.select(function(className) {
1257
- return className != classNameToRemove;
1258
- }).join(' '));
1735
+ this.set($A(this).without(classNameToRemove).join(' '));
1259
1736
  },
1260
1737
 
1261
1738
  toString: function() {
1262
- return this.toArray().join(' ');
1739
+ return $A(this).join(' ');
1263
1740
  }
1264
- }
1741
+ };
1265
1742
 
1266
1743
  Object.extend(Element.ClassNames.prototype, Enumerable);
1267
1744
  var Selector = Class.create();
@@ -1308,15 +1785,15 @@ Selector.prototype = {
1308
1785
  if (params.wildcard)
1309
1786
  conditions.push('true');
1310
1787
  if (clause = params.id)
1311
- conditions.push('element.id == ' + clause.inspect());
1788
+ conditions.push('element.readAttribute("id") == ' + clause.inspect());
1312
1789
  if (clause = params.tagName)
1313
1790
  conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
1314
1791
  if ((clause = params.classNames).length > 0)
1315
- for (var i = 0; i < clause.length; i++)
1316
- conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
1792
+ for (var i = 0, length = clause.length; i < length; i++)
1793
+ conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
1317
1794
  if (clause = params.attributes) {
1318
1795
  clause.each(function(attribute) {
1319
- var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
1796
+ var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
1320
1797
  var splitValueBy = function(delimiter) {
1321
1798
  return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
1322
1799
  }
@@ -1329,7 +1806,7 @@ Selector.prototype = {
1329
1806
  ); break;
1330
1807
  case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
1331
1808
  case '':
1332
- case undefined: conditions.push(value + ' != null'); break;
1809
+ case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
1333
1810
  default: throw 'Unknown operator ' + attribute.operator + ' in selector';
1334
1811
  }
1335
1812
  });
@@ -1340,6 +1817,7 @@ Selector.prototype = {
1340
1817
 
1341
1818
  compileMatcher: function() {
1342
1819
  this.match = new Function('element', 'if (!element.tagName) return false; \
1820
+ element = $(element); \
1343
1821
  return ' + this.buildMatchExpression());
1344
1822
  },
1345
1823
 
@@ -1354,7 +1832,7 @@ Selector.prototype = {
1354
1832
  scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
1355
1833
 
1356
1834
  var results = [];
1357
- for (var i = 0; i < scope.length; i++)
1835
+ for (var i = 0, length = scope.length; i < length; i++)
1358
1836
  if (this.match(element = scope[i]))
1359
1837
  results.push(Element.extend(element));
1360
1838
 
@@ -1366,206 +1844,241 @@ Selector.prototype = {
1366
1844
  }
1367
1845
  }
1368
1846
 
1369
- function $$() {
1370
- return $A(arguments).map(function(expression) {
1371
- return expression.strip().split(/\s+/).inject([null], function(results, expr) {
1372
- var selector = new Selector(expr);
1373
- return results.map(selector.findElements.bind(selector)).flatten();
1374
- });
1375
- }).flatten();
1376
- }
1377
- var Field = {
1378
- clear: function() {
1379
- for (var i = 0; i < arguments.length; i++)
1380
- $(arguments[i]).value = '';
1381
- },
1382
-
1383
- focus: function(element) {
1384
- $(element).focus();
1385
- },
1386
-
1387
- present: function() {
1388
- for (var i = 0; i < arguments.length; i++)
1389
- if ($(arguments[i]).value == '') return false;
1390
- return true;
1847
+ Object.extend(Selector, {
1848
+ matchElements: function(elements, expression) {
1849
+ var selector = new Selector(expression);
1850
+ return elements.select(selector.match.bind(selector)).map(Element.extend);
1391
1851
  },
1392
1852
 
1393
- select: function(element) {
1394
- $(element).select();
1853
+ findElement: function(elements, expression, index) {
1854
+ if (typeof expression == 'number') index = expression, expression = false;
1855
+ return Selector.matchElements(elements, expression || '*')[index || 0];
1395
1856
  },
1396
1857
 
1397
- activate: function(element) {
1398
- element = $(element);
1399
- element.focus();
1400
- if (element.select)
1401
- element.select();
1858
+ findChildElements: function(element, expressions) {
1859
+ return expressions.map(function(expression) {
1860
+ return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
1861
+ var selector = new Selector(expr);
1862
+ return results.inject([], function(elements, result) {
1863
+ return elements.concat(selector.findElements(result || element));
1864
+ });
1865
+ });
1866
+ }).flatten();
1402
1867
  }
1403
- }
1404
-
1405
- /*--------------------------------------------------------------------------*/
1868
+ });
1406
1869
 
1870
+ function $$() {
1871
+ return Selector.findChildElements(document, $A(arguments));
1872
+ }
1407
1873
  var Form = {
1408
- serialize: function(form) {
1409
- var elements = Form.getElements($(form));
1410
- var queryComponents = new Array();
1411
-
1412
- for (var i = 0; i < elements.length; i++) {
1413
- var queryComponent = Form.Element.serialize(elements[i]);
1414
- if (queryComponent)
1415
- queryComponents.push(queryComponent);
1416
- }
1874
+ reset: function(form) {
1875
+ $(form).reset();
1876
+ return form;
1877
+ },
1878
+
1879
+ serializeElements: function(elements, getHash) {
1880
+ var data = elements.inject({}, function(result, element) {
1881
+ if (!element.disabled && element.name) {
1882
+ var key = element.name, value = $(element).getValue();
1883
+ if (value != undefined) {
1884
+ if (result[key]) {
1885
+ if (result[key].constructor != Array) result[key] = [result[key]];
1886
+ result[key].push(value);
1887
+ }
1888
+ else result[key] = value;
1889
+ }
1890
+ }
1891
+ return result;
1892
+ });
1893
+
1894
+ return getHash ? data : Hash.toQueryString(data);
1895
+ }
1896
+ };
1417
1897
 
1418
- return queryComponents.join('&');
1898
+ Form.Methods = {
1899
+ serialize: function(form, getHash) {
1900
+ return Form.serializeElements(Form.getElements(form), getHash);
1419
1901
  },
1420
1902
 
1421
1903
  getElements: function(form) {
1422
- form = $(form);
1423
- var elements = new Array();
1424
-
1425
- for (var tagName in Form.Element.Serializers) {
1426
- var tagElements = form.getElementsByTagName(tagName);
1427
- for (var j = 0; j < tagElements.length; j++)
1428
- elements.push(tagElements[j]);
1429
- }
1430
- return elements;
1904
+ return $A($(form).getElementsByTagName('*')).inject([],
1905
+ function(elements, child) {
1906
+ if (Form.Element.Serializers[child.tagName.toLowerCase()])
1907
+ elements.push(Element.extend(child));
1908
+ return elements;
1909
+ }
1910
+ );
1431
1911
  },
1432
1912
 
1433
1913
  getInputs: function(form, typeName, name) {
1434
1914
  form = $(form);
1435
1915
  var inputs = form.getElementsByTagName('input');
1436
1916
 
1437
- if (!typeName && !name)
1438
- return inputs;
1917
+ if (!typeName && !name) return $A(inputs).map(Element.extend);
1439
1918
 
1440
- var matchingInputs = new Array();
1441
- for (var i = 0; i < inputs.length; i++) {
1919
+ for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
1442
1920
  var input = inputs[i];
1443
- if ((typeName && input.type != typeName) ||
1444
- (name && input.name != name))
1921
+ if ((typeName && input.type != typeName) || (name && input.name != name))
1445
1922
  continue;
1446
- matchingInputs.push(input);
1923
+ matchingInputs.push(Element.extend(input));
1447
1924
  }
1448
1925
 
1449
1926
  return matchingInputs;
1450
1927
  },
1451
1928
 
1452
1929
  disable: function(form) {
1453
- var elements = Form.getElements(form);
1454
- for (var i = 0; i < elements.length; i++) {
1455
- var element = elements[i];
1930
+ form = $(form);
1931
+ form.getElements().each(function(element) {
1456
1932
  element.blur();
1457
1933
  element.disabled = 'true';
1458
- }
1934
+ });
1935
+ return form;
1459
1936
  },
1460
1937
 
1461
1938
  enable: function(form) {
1462
- var elements = Form.getElements(form);
1463
- for (var i = 0; i < elements.length; i++) {
1464
- var element = elements[i];
1939
+ form = $(form);
1940
+ form.getElements().each(function(element) {
1465
1941
  element.disabled = '';
1466
- }
1942
+ });
1943
+ return form;
1467
1944
  },
1468
1945
 
1469
1946
  findFirstElement: function(form) {
1470
- return Form.getElements(form).find(function(element) {
1947
+ return $(form).getElements().find(function(element) {
1471
1948
  return element.type != 'hidden' && !element.disabled &&
1472
1949
  ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
1473
1950
  });
1474
1951
  },
1475
1952
 
1476
1953
  focusFirstElement: function(form) {
1477
- Field.activate(Form.findFirstElement(form));
1954
+ form = $(form);
1955
+ form.findFirstElement().activate();
1956
+ return form;
1957
+ }
1958
+ }
1959
+
1960
+ Object.extend(Form, Form.Methods);
1961
+
1962
+ /*--------------------------------------------------------------------------*/
1963
+
1964
+ Form.Element = {
1965
+ focus: function(element) {
1966
+ $(element).focus();
1967
+ return element;
1478
1968
  },
1479
1969
 
1480
- reset: function(form) {
1481
- $(form).reset();
1970
+ select: function(element) {
1971
+ $(element).select();
1972
+ return element;
1482
1973
  }
1483
1974
  }
1484
1975
 
1485
- Form.Element = {
1976
+ Form.Element.Methods = {
1486
1977
  serialize: function(element) {
1978
+ element = $(element);
1979
+ if (!element.disabled && element.name) {
1980
+ var value = element.getValue();
1981
+ if (value != undefined) {
1982
+ var pair = {};
1983
+ pair[element.name] = value;
1984
+ return Hash.toQueryString(pair);
1985
+ }
1986
+ }
1987
+ return '';
1988
+ },
1989
+
1990
+ getValue: function(element) {
1487
1991
  element = $(element);
1488
1992
  var method = element.tagName.toLowerCase();
1489
- var parameter = Form.Element.Serializers[method](element);
1993
+ return Form.Element.Serializers[method](element);
1994
+ },
1490
1995
 
1491
- if (parameter) {
1492
- var key = encodeURIComponent(parameter[0]);
1493
- if (key.length == 0) return;
1996
+ clear: function(element) {
1997
+ $(element).value = '';
1998
+ return element;
1999
+ },
1494
2000
 
1495
- if (parameter[1].constructor != Array)
1496
- parameter[1] = [parameter[1]];
2001
+ present: function(element) {
2002
+ return $(element).value != '';
2003
+ },
1497
2004
 
1498
- return parameter[1].map(function(value) {
1499
- return key + '=' + encodeURIComponent(value);
1500
- }).join('&');
1501
- }
2005
+ activate: function(element) {
2006
+ element = $(element);
2007
+ element.focus();
2008
+ if (element.select && ( element.tagName.toLowerCase() != 'input' ||
2009
+ !['button', 'reset', 'submit'].include(element.type) ) )
2010
+ element.select();
2011
+ return element;
1502
2012
  },
1503
2013
 
1504
- getValue: function(element) {
2014
+ disable: function(element) {
1505
2015
  element = $(element);
1506
- var method = element.tagName.toLowerCase();
1507
- var parameter = Form.Element.Serializers[method](element);
2016
+ element.disabled = true;
2017
+ return element;
2018
+ },
1508
2019
 
1509
- if (parameter)
1510
- return parameter[1];
2020
+ enable: function(element) {
2021
+ element = $(element);
2022
+ element.blur();
2023
+ element.disabled = false;
2024
+ return element;
1511
2025
  }
1512
2026
  }
1513
2027
 
2028
+ Object.extend(Form.Element, Form.Element.Methods);
2029
+ var Field = Form.Element;
2030
+ var $F = Form.Element.getValue;
2031
+
2032
+ /*--------------------------------------------------------------------------*/
2033
+
1514
2034
  Form.Element.Serializers = {
1515
2035
  input: function(element) {
1516
2036
  switch (element.type.toLowerCase()) {
1517
- case 'submit':
1518
- case 'hidden':
1519
- case 'password':
1520
- case 'text':
1521
- return Form.Element.Serializers.textarea(element);
1522
2037
  case 'checkbox':
1523
2038
  case 'radio':
1524
2039
  return Form.Element.Serializers.inputSelector(element);
2040
+ default:
2041
+ return Form.Element.Serializers.textarea(element);
1525
2042
  }
1526
- return false;
1527
2043
  },
1528
2044
 
1529
2045
  inputSelector: function(element) {
1530
- if (element.checked)
1531
- return [element.name, element.value];
2046
+ return element.checked ? element.value : null;
1532
2047
  },
1533
2048
 
1534
2049
  textarea: function(element) {
1535
- return [element.name, element.value];
2050
+ return element.value;
1536
2051
  },
1537
2052
 
1538
2053
  select: function(element) {
1539
- return Form.Element.Serializers[element.type == 'select-one' ?
2054
+ return this[element.type == 'select-one' ?
1540
2055
  'selectOne' : 'selectMany'](element);
1541
2056
  },
1542
2057
 
1543
2058
  selectOne: function(element) {
1544
- var value = '', opt, index = element.selectedIndex;
1545
- if (index >= 0) {
1546
- opt = element.options[index];
1547
- value = opt.value || opt.text;
1548
- }
1549
- return [element.name, value];
2059
+ var index = element.selectedIndex;
2060
+ return index >= 0 ? this.optionValue(element.options[index]) : null;
1550
2061
  },
1551
2062
 
1552
2063
  selectMany: function(element) {
1553
- var value = [];
1554
- for (var i = 0; i < element.length; i++) {
2064
+ var values, length = element.length;
2065
+ if (!length) return null;
2066
+
2067
+ for (var i = 0, values = []; i < length; i++) {
1555
2068
  var opt = element.options[i];
1556
- if (opt.selected)
1557
- value.push(opt.value || opt.text);
2069
+ if (opt.selected) values.push(this.optionValue(opt));
1558
2070
  }
1559
- return [element.name, value];
2071
+ return values;
2072
+ },
2073
+
2074
+ optionValue: function(opt) {
2075
+ // extend element because hasAttribute may not be native
2076
+ return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
1560
2077
  }
1561
2078
  }
1562
2079
 
1563
2080
  /*--------------------------------------------------------------------------*/
1564
2081
 
1565
- var $F = Form.Element.getValue;
1566
-
1567
- /*--------------------------------------------------------------------------*/
1568
-
1569
2082
  Abstract.TimedObserver = function() {}
1570
2083
  Abstract.TimedObserver.prototype = {
1571
2084
  initialize: function(element, frequency, callback) {
@@ -1583,7 +2096,9 @@ Abstract.TimedObserver.prototype = {
1583
2096
 
1584
2097
  onTimerEvent: function() {
1585
2098
  var value = this.getValue();
1586
- if (this.lastValue != value) {
2099
+ var changed = ('string' == typeof this.lastValue && 'string' == typeof value
2100
+ ? this.lastValue != value : String(this.lastValue) != String(value));
2101
+ if (changed) {
1587
2102
  this.callback(this.element, value);
1588
2103
  this.lastValue = value;
1589
2104
  }
@@ -1628,9 +2143,7 @@ Abstract.EventObserver.prototype = {
1628
2143
  },
1629
2144
 
1630
2145
  registerFormCallbacks: function() {
1631
- var elements = Form.getElements(this.element);
1632
- for (var i = 0; i < elements.length; i++)
1633
- this.registerCallback(elements[i]);
2146
+ Form.getElements(this.element).each(this.registerCallback.bind(this));
1634
2147
  },
1635
2148
 
1636
2149
  registerCallback: function(element) {
@@ -1640,11 +2153,7 @@ Abstract.EventObserver.prototype = {
1640
2153
  case 'radio':
1641
2154
  Event.observe(element, 'click', this.onElementEvent.bind(this));
1642
2155
  break;
1643
- case 'password':
1644
- case 'text':
1645
- case 'textarea':
1646
- case 'select-one':
1647
- case 'select-multiple':
2156
+ default:
1648
2157
  Event.observe(element, 'change', this.onElementEvent.bind(this));
1649
2158
  break;
1650
2159
  }
@@ -1679,6 +2188,10 @@ Object.extend(Event, {
1679
2188
  KEY_RIGHT: 39,
1680
2189
  KEY_DOWN: 40,
1681
2190
  KEY_DELETE: 46,
2191
+ KEY_HOME: 36,
2192
+ KEY_END: 35,
2193
+ KEY_PAGEUP: 33,
2194
+ KEY_PAGEDOWN: 34,
1682
2195
 
1683
2196
  element: function(event) {
1684
2197
  return event.target || event.srcElement;
@@ -1734,7 +2247,7 @@ Object.extend(Event, {
1734
2247
 
1735
2248
  unloadCache: function() {
1736
2249
  if (!Event.observers) return;
1737
- for (var i = 0; i < Event.observers.length; i++) {
2250
+ for (var i = 0, length = Event.observers.length; i < length; i++) {
1738
2251
  Event.stopObserving.apply(this, Event.observers[i]);
1739
2252
  Event.observers[i][0] = null;
1740
2253
  }
@@ -1742,7 +2255,7 @@ Object.extend(Event, {
1742
2255
  },
1743
2256
 
1744
2257
  observe: function(element, name, observer, useCapture) {
1745
- var element = $(element);
2258
+ element = $(element);
1746
2259
  useCapture = useCapture || false;
1747
2260
 
1748
2261
  if (name == 'keypress' &&
@@ -1750,11 +2263,11 @@ Object.extend(Event, {
1750
2263
  || element.attachEvent))
1751
2264
  name = 'keydown';
1752
2265
 
1753
- this._observeAndCache(element, name, observer, useCapture);
2266
+ Event._observeAndCache(element, name, observer, useCapture);
1754
2267
  },
1755
2268
 
1756
2269
  stopObserving: function(element, name, observer, useCapture) {
1757
- var element = $(element);
2270
+ element = $(element);
1758
2271
  useCapture = useCapture || false;
1759
2272
 
1760
2273
  if (name == 'keypress' &&
@@ -1765,7 +2278,9 @@ Object.extend(Event, {
1765
2278
  if (element.removeEventListener) {
1766
2279
  element.removeEventListener(name, observer, useCapture);
1767
2280
  } else if (element.detachEvent) {
1768
- element.detachEvent('on' + name, observer);
2281
+ try {
2282
+ element.detachEvent('on' + name, observer);
2283
+ } catch (e) {}
1769
2284
  }
1770
2285
  }
1771
2286
  });
@@ -1819,7 +2334,8 @@ var Position = {
1819
2334
  valueL += element.offsetLeft || 0;
1820
2335
  element = element.offsetParent;
1821
2336
  if (element) {
1822
- p = Element.getStyle(element, 'position');
2337
+ if(element.tagName=='BODY') break;
2338
+ var p = Element.getStyle(element, 'position');
1823
2339
  if (p == 'relative' || p == 'absolute') break;
1824
2340
  }
1825
2341
  } while (element);
@@ -1875,17 +2391,6 @@ var Position = {
1875
2391
  element.offsetWidth;
1876
2392
  },
1877
2393
 
1878
- clone: function(source, target) {
1879
- source = $(source);
1880
- target = $(target);
1881
- target.style.position = 'absolute';
1882
- var offsets = this.cumulativeOffset(source);
1883
- target.style.top = offsets[1] + 'px';
1884
- target.style.left = offsets[0] + 'px';
1885
- target.style.width = source.offsetWidth + 'px';
1886
- target.style.height = source.offsetHeight + 'px';
1887
- },
1888
-
1889
2394
  page: function(forElement) {
1890
2395
  var valueT = 0, valueL = 0;
1891
2396
 
@@ -1902,8 +2407,10 @@ var Position = {
1902
2407
 
1903
2408
  element = forElement;
1904
2409
  do {
1905
- valueT -= element.scrollTop || 0;
1906
- valueL -= element.scrollLeft || 0;
2410
+ if (!window.opera || element.tagName=='BODY') {
2411
+ valueT -= element.scrollTop || 0;
2412
+ valueL -= element.scrollLeft || 0;
2413
+ }
1907
2414
  } while (element = element.parentNode);
1908
2415
 
1909
2416
  return [valueL, valueT];
@@ -1964,10 +2471,10 @@ var Position = {
1964
2471
  element._originalHeight = element.style.height;
1965
2472
 
1966
2473
  element.style.position = 'absolute';
1967
- element.style.top = top + 'px';;
1968
- element.style.left = left + 'px';;
1969
- element.style.width = width + 'px';;
1970
- element.style.height = height + 'px';;
2474
+ element.style.top = top + 'px';
2475
+ element.style.left = left + 'px';
2476
+ element.style.width = width + 'px';
2477
+ element.style.height = height + 'px';
1971
2478
  },
1972
2479
 
1973
2480
  relativize: function(element) {
@@ -2003,4 +2510,6 @@ if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
2003
2510
 
2004
2511
  return [valueL, valueT];
2005
2512
  }
2006
- }
2513
+ }
2514
+
2515
+ Element.addMethods();