typo 4.0.3 → 4.1

Sign up to get free protection for your applications and to get access to all the features.
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();