community_engine 2.3.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (580) hide show
  1. checksums.yaml +13 -5
  2. data/.travis.yml +5 -4
  3. data/CHANGELOG +43 -5
  4. data/Gemfile +1 -16
  5. data/README.markdown +22 -19
  6. data/UPGRADING.markdown +10 -0
  7. data/about.yml +1 -1
  8. data/app/assets/javascripts/community_engine.js +187 -18
  9. data/app/assets/javascripts/cropper.js +86 -565
  10. data/app/assets/javascripts/forum.js +26 -71
  11. data/app/assets/javascripts/jquery.migrate.js +521 -0
  12. data/app/assets/stylesheets/_colors.css.scss +100 -0
  13. data/app/assets/stylesheets/_font.css.scss +17 -0
  14. data/app/assets/stylesheets/_forms.css.scss +20 -0
  15. data/app/assets/stylesheets/_forum.css.scss +0 -0
  16. data/app/assets/stylesheets/_grid.css.scss +7 -0
  17. data/app/assets/stylesheets/_layers.css.scss +7 -0
  18. data/app/assets/stylesheets/_layout.css.scss +28 -0
  19. data/app/assets/stylesheets/community_engine.css.scss +18 -0
  20. data/app/assets/stylesheets/cropper.css +6 -182
  21. data/app/controllers/activities_controller.rb +10 -10
  22. data/app/controllers/admin_controller.rb +23 -23
  23. data/app/controllers/ads_controller.rb +16 -5
  24. data/app/controllers/albums_controller.rb +11 -5
  25. data/app/controllers/base_controller.rb +5 -8
  26. data/app/controllers/categories_controller.rb +31 -31
  27. data/app/controllers/clippings_controller.rb +18 -12
  28. data/app/controllers/comments_controller.rb +17 -8
  29. data/app/controllers/events_controller.rb +25 -21
  30. data/app/controllers/favorites_controller.rb +12 -12
  31. data/app/controllers/forums_controller.rb +20 -9
  32. data/app/controllers/friendships_controller.rb +41 -48
  33. data/app/controllers/homepage_features_controller.rb +11 -5
  34. data/app/controllers/invitations_controller.rb +15 -9
  35. data/app/controllers/messages_controller.rb +25 -19
  36. data/app/controllers/metro_areas_controller.rb +9 -3
  37. data/app/controllers/moderators_controller.rb +1 -1
  38. data/app/controllers/monitorships_controller.rb +2 -2
  39. data/app/controllers/pages_controller.rb +16 -4
  40. data/app/controllers/password_resets_controller.rb +0 -1
  41. data/app/controllers/photos_controller.rb +32 -30
  42. data/app/controllers/posts_controller.rb +33 -17
  43. data/app/controllers/rsvps_controller.rb +8 -4
  44. data/app/controllers/sb_posts_controller.rb +22 -18
  45. data/app/controllers/sessions_controller.rb +2 -1
  46. data/app/controllers/sitemap_controller.rb +8 -8
  47. data/app/controllers/statistics_controller.rb +9 -8
  48. data/app/controllers/tags_controller.rb +26 -24
  49. data/app/controllers/topics_controller.rb +10 -6
  50. data/app/controllers/users_controller.rb +63 -34
  51. data/app/helpers/base_helper.rb +119 -29
  52. data/app/helpers/friendships_helper.rb +3 -3
  53. data/app/helpers/posts_helper.rb +5 -7
  54. data/app/models/acts_as_taggable_on/tag.rb +12 -13
  55. data/app/models/ad.rb +2 -5
  56. data/app/models/album.rb +0 -2
  57. data/app/models/category.rb +6 -7
  58. data/app/models/clipping.rb +2 -5
  59. data/app/models/clipping_image.rb +5 -5
  60. data/app/models/comment.rb +4 -5
  61. data/app/models/country.rb +2 -4
  62. data/app/models/event.rb +1 -2
  63. data/app/models/favorite.rb +5 -10
  64. data/app/models/forum.rb +0 -2
  65. data/app/models/friendship.rb +3 -5
  66. data/app/models/friendship_status.rb +0 -2
  67. data/app/models/homepage_feature.rb +4 -6
  68. data/app/models/invitation.rb +6 -8
  69. data/app/models/message.rb +25 -26
  70. data/app/models/message_thread.rb +1 -1
  71. data/app/models/metro_area.rb +0 -2
  72. data/app/models/page.rb +0 -2
  73. data/app/models/photo.rb +8 -8
  74. data/app/models/poll.rb +7 -9
  75. data/app/models/post.rb +11 -15
  76. data/app/models/role.rb +1 -2
  77. data/app/models/rsvp.rb +0 -3
  78. data/app/models/sb_post.rb +14 -9
  79. data/app/models/state.rb +0 -2
  80. data/app/models/topic.rb +5 -6
  81. data/app/models/user.rb +50 -63
  82. data/app/models/vote.rb +1 -1
  83. data/app/views/activities/_activity.html.haml +9 -9
  84. data/app/views/activities/destroy.js.erb +1 -0
  85. data/app/views/activities/index.html.haml +13 -13
  86. data/app/views/activities/network.html.haml +10 -13
  87. data/app/views/admin/comments.html.haml +48 -70
  88. data/app/views/admin/events.html.haml +20 -27
  89. data/app/views/admin/messages.html.haml +2 -3
  90. data/app/views/admin/update.js.erb +1 -0
  91. data/app/views/admin/users.html.haml +51 -66
  92. data/app/views/ads/_form.html.haml +21 -0
  93. data/app/views/ads/edit.html.haml +6 -46
  94. data/app/views/ads/index.html.haml +25 -39
  95. data/app/views/ads/new.html.haml +4 -43
  96. data/app/views/ads/show.html.haml +18 -35
  97. data/app/views/albums/_form.html.haml +17 -12
  98. data/app/views/albums/edit.html.haml +12 -14
  99. data/app/views/albums/new.html.haml +8 -13
  100. data/app/views/albums/show.html.haml +25 -32
  101. data/app/views/base/_homepage_banner_message.html.haml +5 -19
  102. data/app/views/base/advertise.html.haml +5 -8
  103. data/app/views/base/site_index.html.haml +25 -27
  104. data/app/views/categories/_form.html.haml +8 -0
  105. data/app/views/categories/_menu_item.html.haml +13 -0
  106. data/app/views/categories/_tips.html.haml +2 -2
  107. data/app/views/categories/edit.html.haml +3 -33
  108. data/app/views/categories/index.html.haml +18 -28
  109. data/app/views/categories/new.html.haml +3 -8
  110. data/app/views/categories/show.html.haml +33 -36
  111. data/app/views/clippings/_clipping.html.haml +10 -17
  112. data/app/views/clippings/_favorite.html.haml +14 -0
  113. data/app/views/clippings/_form.html.haml +15 -0
  114. data/app/views/clippings/_images.html.haml +1 -1
  115. data/app/views/clippings/_menu_item.html.haml +6 -0
  116. data/app/views/clippings/edit.html.haml +12 -23
  117. data/app/views/clippings/index.html.haml +29 -30
  118. data/app/views/clippings/load_images_from_uri.js.erb +1 -0
  119. data/app/views/clippings/new.html.haml +9 -26
  120. data/app/views/clippings/new_clipping.html.haml +30 -77
  121. data/app/views/clippings/show.html.haml +48 -53
  122. data/app/views/clippings/site_index.html.haml +19 -32
  123. data/app/views/comments/_comment.html.haml +40 -40
  124. data/app/views/comments/_comment_form.html.haml +22 -46
  125. data/app/views/comments/_edit_form.html.haml +13 -28
  126. data/app/views/comments/create.js.erb +25 -0
  127. data/app/views/comments/destroy.js.erb +3 -0
  128. data/app/views/comments/edit.js.erb +11 -0
  129. data/app/views/comments/index.html.haml +12 -22
  130. data/app/views/comments/update.js.erb +14 -0
  131. data/app/views/events/_event.html.haml +26 -24
  132. data/app/views/events/_form.html.haml +18 -0
  133. data/app/views/events/_menu_item.html.haml +6 -0
  134. data/app/views/events/_subscribe.html.haml +1 -1
  135. data/app/views/events/edit.html.haml +7 -32
  136. data/app/views/events/index.html.haml +11 -19
  137. data/app/views/events/new.html.haml +2 -31
  138. data/app/views/events/show.html.haml +54 -24
  139. data/app/views/favorites/create.js.erb +10 -0
  140. data/app/views/favorites/destroy.js.erb +6 -0
  141. data/app/views/favorites/index.html.haml +6 -8
  142. data/app/views/forums/_form.html.haml +10 -20
  143. data/app/views/forums/_menu_item.html.haml +6 -0
  144. data/app/views/forums/edit.html.haml +8 -10
  145. data/app/views/forums/index.html.haml +56 -64
  146. data/app/views/forums/new.html.haml +5 -8
  147. data/app/views/forums/show.html.haml +65 -72
  148. data/app/views/friendships/_friendship.html.haml +14 -16
  149. data/app/views/friendships/accepted.html.haml +7 -11
  150. data/app/views/friendships/create.js.haml +1 -0
  151. data/app/views/friendships/denied.html.haml +4 -8
  152. data/app/views/friendships/pending.html.haml +4 -6
  153. data/app/views/friendships/show.html.haml +10 -11
  154. data/app/views/homepage_features/_form.html.haml +6 -0
  155. data/app/views/homepage_features/edit.html.haml +5 -30
  156. data/app/views/homepage_features/index.html.haml +22 -28
  157. data/app/views/homepage_features/new.html.haml +2 -30
  158. data/app/views/homepage_features/show.html.haml +27 -29
  159. data/app/views/invitations/index.html.haml +8 -0
  160. data/app/views/invitations/new.html.haml +21 -30
  161. data/app/views/kaminari/bootstrap/_first_page.html.erb +13 -0
  162. data/app/views/kaminari/bootstrap/_gap.html.erb +8 -0
  163. data/app/views/kaminari/bootstrap/_last_page.html.erb +13 -0
  164. data/app/views/kaminari/bootstrap/_next_page.html.erb +13 -0
  165. data/app/views/kaminari/bootstrap/_page.html.erb +12 -0
  166. data/app/views/kaminari/bootstrap/_paginator.html.erb +25 -0
  167. data/app/views/kaminari/bootstrap/_prev_page.html.erb +13 -0
  168. data/app/views/layouts/application.html.haml +26 -37
  169. data/app/views/messages/_form.html.haml +6 -12
  170. data/app/views/messages/_inbox.html.haml +34 -39
  171. data/app/views/messages/_menu_item.html.haml +11 -0
  172. data/app/views/messages/_sent.html.haml +22 -33
  173. data/app/views/messages/_sidebar_nav.html.haml +12 -9
  174. data/app/views/messages/index.html.haml +2 -2
  175. data/app/views/messages/new.html.haml +2 -9
  176. data/app/views/messages/show.html.haml +28 -36
  177. data/app/views/metro_areas/_form.html.haml +6 -0
  178. data/app/views/metro_areas/edit.html.haml +6 -14
  179. data/app/views/metro_areas/index.html.haml +19 -26
  180. data/app/views/metro_areas/new.html.haml +4 -14
  181. data/app/views/metro_areas/show.html.haml +13 -21
  182. data/app/views/moderators/_toggle.html.haml +6 -0
  183. data/app/views/moderators/create.js.erb +5 -0
  184. data/app/views/moderators/destroy.js.erb +1 -0
  185. data/app/views/monitorships/create.js.erb +1 -0
  186. data/app/views/monitorships/destroy.js.erb +1 -0
  187. data/app/views/pages/_form.html.haml +16 -23
  188. data/app/views/pages/edit.html.haml +2 -14
  189. data/app/views/pages/index.html.haml +32 -32
  190. data/app/views/pages/new.html.haml +5 -12
  191. data/app/views/pages/show.html.haml +4 -8
  192. data/app/views/password_resets/edit.html.haml +6 -14
  193. data/app/views/password_resets/new.html.haml +7 -11
  194. data/app/views/photo_manager/index.html.haml +45 -43
  195. data/app/views/photos/_form.html.haml +24 -0
  196. data/app/views/photos/_manage_photos.html.haml +14 -6
  197. data/app/views/photos/_show_image_list.html.haml +2 -2
  198. data/app/views/photos/create.js.erb +1 -0
  199. data/app/views/photos/edit.html.haml +10 -38
  200. data/app/views/photos/index.html.haml +20 -20
  201. data/app/views/photos/manage_photos.js.erb +5 -0
  202. data/app/views/photos/new.html.haml +11 -49
  203. data/app/views/photos/recent.html.haml +6 -6
  204. data/app/views/photos/show.html.haml +48 -52
  205. data/app/views/polls/_edit.html.haml +6 -10
  206. data/app/views/polls/_excerpt.html.haml +3 -4
  207. data/app/views/polls/_new.html.haml +10 -9
  208. data/app/views/polls/_poll_ui.html.haml +30 -34
  209. data/app/views/posts/_author_profile.html.haml +12 -11
  210. data/app/views/posts/_favorited_post.html.haml +8 -10
  211. data/app/views/posts/_form.html.haml +40 -0
  212. data/app/views/posts/_menu_item.html.haml +6 -0
  213. data/app/views/posts/_post.html.haml +27 -24
  214. data/app/views/posts/_send_to_friend.html.haml +26 -0
  215. data/app/views/posts/edit.html.haml +11 -48
  216. data/app/views/posts/featured.html.haml +7 -12
  217. data/app/views/posts/index.html.haml +14 -18
  218. data/app/views/posts/manage.html.haml +44 -59
  219. data/app/views/posts/new.html.haml +9 -64
  220. data/app/views/posts/popular.html.haml +25 -30
  221. data/app/views/posts/preview.html.haml +27 -26
  222. data/app/views/posts/recent.html.haml +20 -27
  223. data/app/views/posts/send_to_friend.js.erb +3 -0
  224. data/app/views/posts/show.html.haml +67 -76
  225. data/app/views/rsvps/_form.html.haml +3 -0
  226. data/app/views/rsvps/edit.html.haml +3 -9
  227. data/app/views/rsvps/new.html.haml +3 -9
  228. data/app/views/sb_posts/_dummy_forum_post.html.haml +13 -0
  229. data/app/views/sb_posts/_edit.html.haml +6 -0
  230. data/app/views/sb_posts/_edit_script.js.erb +14 -0
  231. data/app/views/sb_posts/_reply_form.html.haml +14 -35
  232. data/app/views/sb_posts/_reply_script.js.erb +13 -0
  233. data/app/views/sb_posts/_sb_post.html.haml +31 -33
  234. data/app/views/sb_posts/create.js.erb +30 -0
  235. data/app/views/sb_posts/destroy.js.erb +2 -0
  236. data/app/views/sb_posts/edit.html.erb +4 -4
  237. data/app/views/sb_posts/edit.js.erb +14 -0
  238. data/app/views/sb_posts/index.html.haml +3 -16
  239. data/app/views/sb_posts/monitored.html.erb +3 -9
  240. data/app/views/sb_posts/update.js.erb +11 -0
  241. data/app/views/sessions/_menu_item.html.haml +28 -0
  242. data/app/views/sessions/new.html.haml +19 -24
  243. data/app/views/shared/_add_friend_link.html.haml +9 -0
  244. data/app/views/shared/_admin_nav.html.haml +6 -8
  245. data/app/views/shared/_contact.html.haml +1 -1
  246. data/app/views/shared/_end_javascript.html.haml +4 -4
  247. data/app/views/shared/_explore.html.haml +7 -6
  248. data/app/views/shared/_footer_content.html.haml +12 -10
  249. data/app/views/shared/_footer_links.html.haml +18 -0
  250. data/app/views/shared/_friend_link.html.haml +25 -0
  251. data/app/views/shared/_header.html.haml +22 -42
  252. data/app/views/shared/_jumbotron.html.haml +3 -0
  253. data/app/views/shared/_load_tinymce.js.erb +15 -0
  254. data/app/views/shared/_location_chooser.html.haml +26 -17
  255. data/app/views/shared/_login_sidebar.html.haml +6 -5
  256. data/app/views/shared/_messages.html.haml +6 -8
  257. data/app/views/shared/_scripts_and_styles.html.haml +1 -2
  258. data/app/views/shared/_sidebar.html.haml +1 -0
  259. data/app/views/shared/_tag_auto_complete.html.haml +19 -0
  260. data/app/views/shared/_widget.html.haml +3 -0
  261. data/app/views/sitemap/index.html.haml +15 -20
  262. data/app/views/statistics/index.html.haml +32 -40
  263. data/app/views/tags/edit.html.haml +12 -19
  264. data/app/views/tags/index.html.haml +16 -25
  265. data/app/views/tags/manage.html.haml +24 -33
  266. data/app/views/tags/show.html.haml +52 -58
  267. data/app/views/topics/_form.html.haml +23 -25
  268. data/app/views/topics/_recent_topics_sidebar.haml +1 -1
  269. data/app/views/topics/edit.html.haml +7 -9
  270. data/app/views/topics/new.html.haml +6 -21
  271. data/app/views/topics/show.html.haml +48 -106
  272. data/app/views/user_notifier/follow_up_comment_notice.text.erb +1 -1
  273. data/app/views/user_notifier/message_notification.text.erb +1 -1
  274. data/app/views/user_notifier/new_forum_post_notice.text.erb +1 -1
  275. data/app/views/users/_dashboard_nav.html.haml +36 -39
  276. data/app/views/users/_menu_item.html.haml +6 -0
  277. data/app/views/users/_omniauth_connect.html.haml +4 -4
  278. data/app/views/users/_profile_completeness.html.haml +3 -3
  279. data/app/views/users/_profile_user_info_sidebar.html.haml +40 -43
  280. data/app/views/users/_search_options.html.haml +9 -7
  281. data/app/views/users/_sidebar_user.html.haml +1 -1
  282. data/app/views/users/_user.html.haml +27 -28
  283. data/app/views/users/crop_profile_photo.html.haml +30 -37
  284. data/app/views/users/dashboard.html.haml +37 -41
  285. data/app/views/users/edit.html.haml +53 -71
  286. data/app/views/users/edit_account.html.haml +44 -64
  287. data/app/views/users/forgot_username.html.haml +6 -12
  288. data/app/views/users/index.html.haml +4 -14
  289. data/app/views/users/invite.html.haml +14 -25
  290. data/app/views/users/new.html.haml +27 -48
  291. data/app/views/users/resend_activation.html.haml +7 -12
  292. data/app/views/users/show.html.haml +88 -90
  293. data/app/views/users/signup_completed.html.haml +7 -7
  294. data/app/views/users/statistics.html.haml +17 -18
  295. data/app/views/users/update.js.erb +1 -0
  296. data/app/views/users/upload_profile_photo.html.haml +10 -15
  297. data/app/views/users/welcome_about.html.haml +54 -61
  298. data/app/views/users/welcome_invite.html.haml +16 -25
  299. data/app/views/users/welcome_photo.html.haml +18 -27
  300. data/app/views/votes/create.js.erb +5 -0
  301. data/community_engine.gemspec +49 -41
  302. data/config/application_config.rb +13 -16
  303. data/config/initializers/mce_options.rb +9 -32
  304. data/config/initializers/recaptcha_constants.rb +2 -2
  305. data/config/locales/de-DE.yml +1 -17
  306. data/config/locales/en.yml +18 -32
  307. data/config/locales/es-AR.yml +2 -14
  308. data/config/locales/es-ES.yml +0 -6
  309. data/config/locales/es-MX.yml +1 -9
  310. data/config/locales/fr-FR.yml +3 -17
  311. data/config/locales/ja-JP.yml +2 -18
  312. data/config/locales/ru-RU.yml +3 -21
  313. data/config/locales/sr-CP.yml +0 -4
  314. data/config/locales/sv-SE.yml +3 -20
  315. data/config/routes.rb +37 -42
  316. data/db/migrate/016_add_metro_areas.rb +2 -2
  317. data/db/migrate/039_create_activities_table.rb +2 -2
  318. data/db/migrate/056_create_roles.rb +8 -6
  319. data/db/migrate/069_create_pages.rb +3 -3
  320. data/db/migrate/081_upgrade_to_friendly_id_5x.rb +25 -0
  321. data/db/migrate/082_upgrade_to_acts_as_commentable_4x.rb +29 -0
  322. data/lib/activity_tracker.rb +3 -0
  323. data/{vendor/plugins/activity_tracker/lib → lib/activity_tracker}/activity.rb +6 -6
  324. data/{vendor/plugins/activity_tracker/lib → lib/activity_tracker}/activity_tracker.rb +0 -0
  325. data/{vendor/plugins/acts_as_publishable/init.rb → lib/acts_as_publishable.rb} +1 -1
  326. data/{vendor/plugins/acts_as_publishable/lib → lib/acts_as_publishable}/acts_as_publishable.rb +3 -3
  327. data/lib/community_engine.rb +31 -9
  328. data/lib/community_engine/engine.rb +17 -1
  329. data/lib/community_engine/engines_extensions.rb +1 -3
  330. data/lib/community_engine/version.rb +3 -3
  331. data/{config/initializers → lib/paperclip_processors}/cropper.rb +3 -3
  332. data/lib/resource_feeder.rb +3 -0
  333. data/{vendor/plugins/resource_feeder/lib → lib}/resource_feeder/atom.rb +0 -0
  334. data/{vendor/plugins/resource_feeder/lib → lib}/resource_feeder/rss.rb +0 -0
  335. data/{vendor/plugins/white_list/init.rb → lib/white_list.rb} +1 -1
  336. data/{vendor/plugins/white_list/lib → lib/white_list}/white_list_helper.rb +0 -0
  337. data/test/fixtures/messages.yml +2 -2
  338. data/test/functional/admin_controller_test.rb +11 -11
  339. data/test/functional/ads_controller_test.rb +11 -11
  340. data/test/functional/albums_controller_test.rb +4 -4
  341. data/test/functional/categories_controller_test.rb +4 -4
  342. data/test/functional/clippings_controller_test.rb +4 -4
  343. data/test/functional/comments_controller_test.rb +20 -16
  344. data/test/functional/events_controller_test.rb +6 -6
  345. data/test/functional/forums_controller_test.rb +8 -8
  346. data/test/functional/friendships_controller_test.rb +13 -18
  347. data/test/functional/homepage_features_controller_test.rb +5 -5
  348. data/test/functional/messages_controller_test.rb +6 -2
  349. data/test/functional/metro_areas_controller_test.rb +7 -7
  350. data/test/functional/moderators_controller_test.rb +1 -1
  351. data/test/functional/pages_controller_test.rb +2 -2
  352. data/test/functional/password_reset_controller_test.rb +2 -2
  353. data/test/functional/photos_controller_test.rb +16 -15
  354. data/test/functional/posts_controller_test.rb +4 -4
  355. data/test/functional/rsvps_controller_test.rb +6 -6
  356. data/test/functional/sb_posts_controller_test.rb +53 -50
  357. data/test/functional/sessions_controller_test.rb +4 -1
  358. data/test/functional/tags_controller_test.rb +1 -1
  359. data/test/functional/topics_controller_test.rb +10 -10
  360. data/test/functional/users_controller_test.rb +32 -19
  361. data/test/functional/votes_controller_test.rb +1 -1
  362. data/test/test_helper.rb +3 -1
  363. data/test/testapp/config/application.rb +1 -9
  364. data/test/testapp/config/environments/development.rb +1 -2
  365. data/test/testapp/config/environments/production.rb +2 -0
  366. data/test/testapp/config/environments/test.rb +1 -2
  367. data/test/testapp/config/initializers/omniauth.rb +3 -3
  368. data/test/testapp/config/initializers/secret_token.rb +1 -0
  369. data/test/testapp/db/schema.rb +143 -152
  370. data/test/unit/category_test.rb +2 -2
  371. data/test/unit/comment_test.rb +64 -53
  372. data/test/unit/event_test.rb +4 -4
  373. data/test/unit/forum_test.rb +1 -1
  374. data/test/unit/message_test.rb +7 -1
  375. data/test/unit/page_test.rb +2 -2
  376. data/test/unit/post_test.rb +47 -47
  377. data/test/unit/sb_post_test.rb +24 -20
  378. data/test/unit/topic_test.rb +7 -6
  379. data/test/unit/user_test.rb +75 -52
  380. data/vendor/assets/javascripts/.gitkeep +0 -0
  381. data/vendor/assets/javascripts/jcrop/jquery.Jcrop.js +1699 -0
  382. data/vendor/assets/javascripts/jcrop/jquery.color.js +661 -0
  383. data/vendor/assets/javascripts/tag-it/tag-it.js +597 -0
  384. data/vendor/assets/stylesheets/.gitkeep +0 -0
  385. data/vendor/assets/stylesheets/jcrop/Jcrop.gif +0 -0
  386. data/vendor/assets/stylesheets/jcrop/jquery.Jcrop.min.css +28 -0
  387. data/vendor/assets/stylesheets/tag-it/tag-it.css +69 -0
  388. data/vendor/assets/stylesheets/tag-it/tagit.ui-zendesk.css +107 -0
  389. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/README +0 -0
  390. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/Rakefile +0 -0
  391. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/generators/publishing/publishing_generator.rb +0 -0
  392. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/generators/publishing/templates/migration.rb +0 -0
  393. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/install.rb +0 -0
  394. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/acts_as_publishable/test/acts_as_publishable_test.rb +0 -0
  395. data/vendor/{plugins/activity_tracker → converted2.3plugins_to_lib_leftovers/acts_as_publishable}/uninstall.rb +0 -0
  396. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/resource_feeder/README +0 -0
  397. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/resource_feeder/Rakefile +0 -0
  398. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/resource_feeder/test/atom_feed_test.rb +0 -0
  399. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/resource_feeder/test/rss_feed_test.rb +0 -0
  400. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/resource_feeder/test/test_helper.rb +0 -0
  401. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/white_list/README +0 -0
  402. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/white_list/Rakefile +0 -0
  403. data/vendor/{plugins → converted2.3plugins_to_lib_leftovers}/white_list/test/white_list_test.rb +0 -0
  404. metadata +348 -302
  405. data/app/assets/images/bg_h6btn.gif +0 -0
  406. data/app/assets/images/bg_navbar.gif +0 -0
  407. data/app/assets/images/clearbits/bg_rounded.gif +0 -0
  408. data/app/assets/images/clearbits/comment.gif +0 -0
  409. data/app/assets/images/clearbits/lock.gif +0 -0
  410. data/app/assets/images/clearbits/smile.gif +0 -0
  411. data/app/assets/images/close.gif +0 -0
  412. data/app/assets/images/cropper/marqueeHoriz.gif +0 -0
  413. data/app/assets/images/cropper/marqueeVert.gif +0 -0
  414. data/app/assets/images/feed.png +0 -0
  415. data/app/assets/images/icons/31.png +0 -0
  416. data/app/assets/images/icons/52.png +0 -0
  417. data/app/assets/images/icons/accept.png +0 -0
  418. data/app/assets/images/icons/activity_default.png +0 -0
  419. data/app/assets/images/icons/add.png +0 -0
  420. data/app/assets/images/icons/book.png +0 -0
  421. data/app/assets/images/icons/bullet_arrow_down.png +0 -0
  422. data/app/assets/images/icons/bullet_arrow_down_50.png +0 -0
  423. data/app/assets/images/icons/clipping.png +0 -0
  424. data/app/assets/images/icons/comment.png +0 -0
  425. data/app/assets/images/icons/comments.png +0 -0
  426. data/app/assets/images/icons/date.png +0 -0
  427. data/app/assets/images/icons/delete.png +0 -0
  428. data/app/assets/images/icons/email.png +0 -0
  429. data/app/assets/images/icons/email_edit.png +0 -0
  430. data/app/assets/images/icons/email_go.png +0 -0
  431. data/app/assets/images/icons/email_open.png +0 -0
  432. data/app/assets/images/icons/group_go.png +0 -0
  433. data/app/assets/images/icons/heart.png +0 -0
  434. data/app/assets/images/icons/heart_add.png +0 -0
  435. data/app/assets/images/icons/heart_off.png +0 -0
  436. data/app/assets/images/icons/page_white.png +0 -0
  437. data/app/assets/images/icons/page_white_magnify.png +0 -0
  438. data/app/assets/images/icons/picture.png +0 -0
  439. data/app/assets/images/icons/poll.png +0 -0
  440. data/app/assets/images/icons/post.png +0 -0
  441. data/app/assets/images/icons/printer.png +0 -0
  442. data/app/assets/images/icons/rss.png +0 -0
  443. data/app/assets/images/icons/slides.png +0 -0
  444. data/app/assets/images/icons/tag_blue.png +0 -0
  445. data/app/assets/images/icons/user.png +0 -0
  446. data/app/assets/images/icons/user_add.png +0 -0
  447. data/app/assets/images/icons/user_edit.png +0 -0
  448. data/app/assets/images/icons/user_go.png +0 -0
  449. data/app/assets/images/icons/vote.png +0 -0
  450. data/app/assets/images/icons/world.png +0 -0
  451. data/app/assets/images/icons/wrench.png +0 -0
  452. data/app/assets/images/logo.gif +0 -0
  453. data/app/assets/images/reply_background.png +0 -0
  454. data/app/assets/images/search.gif +0 -0
  455. data/app/assets/images/thumb.gif +0 -0
  456. data/app/assets/javascripts/builder.js +0 -136
  457. data/app/assets/javascripts/calendarview.js +0 -839
  458. data/app/assets/javascripts/lightbox.js +0 -151
  459. data/app/assets/javascripts/prototip-min.js +0 -27
  460. data/app/assets/javascripts/rails.js +0 -202
  461. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/css/advimage.css +0 -84
  462. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/editor_plugin.js +0 -52
  463. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/editor_plugin_src.js +0 -45
  464. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/image.htm +0 -180
  465. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/img/sample.gif +0 -0
  466. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/js/functions.js +0 -508
  467. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/langs/en.js +0 -3
  468. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/langs/en_dlg.js +0 -43
  469. data/app/assets/javascripts/tinymce/plugins/tinyautosave/editor_plugin.js +0 -8
  470. data/app/assets/javascripts/tinymce/plugins/tinyautosave/editor_plugin_src.js +0 -1001
  471. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress.gif +0 -0
  472. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress10.gif +0 -0
  473. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress11.gif +0 -0
  474. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress12.gif +0 -0
  475. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress2.gif +0 -0
  476. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress3.gif +0 -0
  477. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress4.gif +0 -0
  478. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress5.gif +0 -0
  479. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress6.gif +0 -0
  480. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress7.gif +0 -0
  481. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress8.gif +0 -0
  482. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/progress9.gif +0 -0
  483. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/restore.gif +0 -0
  484. data/app/assets/javascripts/tinymce/plugins/tinyautosave/images/restore.png +0 -0
  485. data/app/assets/javascripts/tinymce/plugins/tinyautosave/langs/da.js +0 -5
  486. data/app/assets/javascripts/tinymce/plugins/tinyautosave/langs/en.js +0 -5
  487. data/app/assets/stylesheets/community_engine.css +0 -6
  488. data/app/assets/stylesheets/forum.css +0 -605
  489. data/app/assets/stylesheets/prototip.css +0 -73
  490. data/app/assets/stylesheets/reset-fonts-grids.css +0 -8
  491. data/app/assets/stylesheets/screen.css +0 -977
  492. data/app/helpers/monitorships_helper.rb +0 -2
  493. data/app/views/activities/_icon.html.haml +0 -14
  494. data/app/views/activities/destroy.js.rjs +0 -1
  495. data/app/views/clippings/_meta.html.haml +0 -26
  496. data/app/views/clippings/load_images_from_uri.js.rjs +0 -1
  497. data/app/views/comments/create.js.rjs +0 -20
  498. data/app/views/comments/edit.js.rjs +0 -7
  499. data/app/views/comments/update.js.rjs +0 -9
  500. data/app/views/favorites/create.js.rjs +0 -17
  501. data/app/views/favorites/destroy.js.rjs +0 -14
  502. data/app/views/favorites/show.html.haml +0 -13
  503. data/app/views/friendships/_friendships.html.erb +0 -14
  504. data/app/views/friendships/index.html.erb +0 -3
  505. data/app/views/friendships/index.xml.builder +0 -29
  506. data/app/views/invitations/index.html.erb +0 -16
  507. data/app/views/moderators/_toggle.html.erb +0 -14
  508. data/app/views/moderators/create.js.rjs +0 -5
  509. data/app/views/moderators/destroy.js.rjs +0 -1
  510. data/app/views/monitorships/create.js.rjs +0 -4
  511. data/app/views/monitorships/destroy.js.rjs +0 -4
  512. data/app/views/photos/manage_photos.js.rjs +0 -5
  513. data/app/views/polls/_polls_sidebar.html.haml +0 -8
  514. data/app/views/posts/_send_to_friend.html.erb +0 -29
  515. data/app/views/sb_posts/_dummy_forum_post.html.erb +0 -13
  516. data/app/views/sb_posts/_edit.html.erb +0 -31
  517. data/app/views/sb_posts/create.js.rjs +0 -16
  518. data/app/views/sb_posts/edit.js.rjs +0 -6
  519. data/app/views/sb_posts/update.js.rjs +0 -5
  520. data/app/views/shared/_user_menu.html.haml +0 -21
  521. data/app/views/votes/create.js.rjs +0 -6
  522. data/db/migrate/090_add_comment_role.rb +0 -15
  523. data/vendor/plugins/activity_tracker/README +0 -4
  524. data/vendor/plugins/activity_tracker/Rakefile +0 -22
  525. data/vendor/plugins/activity_tracker/generators/activity_migration/USAGE +0 -13
  526. data/vendor/plugins/activity_tracker/generators/activity_migration/activity_migration_generator.rb +0 -11
  527. data/vendor/plugins/activity_tracker/generators/activity_migration/templates/migration.rb +0 -17
  528. data/vendor/plugins/activity_tracker/init.rb +0 -1
  529. data/vendor/plugins/activity_tracker/install.rb +0 -1
  530. data/vendor/plugins/activity_tracker/tasks/activity_tracker_tasks.rake +0 -4
  531. data/vendor/plugins/activity_tracker/test/abstract_unit.rb +0 -47
  532. data/vendor/plugins/activity_tracker/test/activity_tracker_test.rb +0 -48
  533. data/vendor/plugins/activity_tracker/test/database.yml +0 -18
  534. data/vendor/plugins/activity_tracker/test/debug.log +0 -3329
  535. data/vendor/plugins/activity_tracker/test/fixtures/test_post.rb +0 -5
  536. data/vendor/plugins/activity_tracker/test/fixtures/test_posts.yml +0 -3
  537. data/vendor/plugins/activity_tracker/test/fixtures/test_user.rb +0 -4
  538. data/vendor/plugins/activity_tracker/test/fixtures/test_users.yml +0 -6
  539. data/vendor/plugins/activity_tracker/test/schema.rb +0 -21
  540. data/vendor/plugins/acts_as_list/README +0 -23
  541. data/vendor/plugins/acts_as_list/init.rb +0 -3
  542. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
  543. data/vendor/plugins/acts_as_list/test/list_test.rb +0 -332
  544. data/vendor/plugins/acts_as_publishable/uninstall.rb +0 -1
  545. data/vendor/plugins/auto_complete/README +0 -23
  546. data/vendor/plugins/auto_complete/Rakefile +0 -22
  547. data/vendor/plugins/auto_complete/init.rb +0 -2
  548. data/vendor/plugins/auto_complete/lib/auto_complete.rb +0 -47
  549. data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +0 -143
  550. data/vendor/plugins/auto_complete/test/auto_complete_test.rb +0 -67
  551. data/vendor/plugins/enumerations_mixin/.gitignore +0 -1
  552. data/vendor/plugins/enumerations_mixin/Gemfile +0 -1
  553. data/vendor/plugins/enumerations_mixin/LICENSE +0 -20
  554. data/vendor/plugins/enumerations_mixin/README.md +0 -120
  555. data/vendor/plugins/enumerations_mixin/README_ENUMERATIONS +0 -163
  556. data/vendor/plugins/enumerations_mixin/Rakefile +0 -14
  557. data/vendor/plugins/enumerations_mixin/VERSION +0 -1
  558. data/vendor/plugins/enumerations_mixin/enumerations_mixin.gemspec +0 -44
  559. data/vendor/plugins/enumerations_mixin/examples/virtual_enumerations_sample.rb +0 -76
  560. data/vendor/plugins/enumerations_mixin/init.rb +0 -21
  561. data/vendor/plugins/enumerations_mixin/lib/active_record/acts/enumerated.rb +0 -180
  562. data/vendor/plugins/enumerations_mixin/lib/active_record/aggregations/has_enumerated.rb +0 -60
  563. data/vendor/plugins/enumerations_mixin/lib/active_record/virtual_enumerations.rb +0 -68
  564. data/vendor/plugins/enumerations_mixin/lib/enumerations_mixin.rb +0 -12
  565. data/vendor/plugins/enumerations_mixin/virtual_enumerations_sample.rb +0 -76
  566. data/vendor/plugins/prototype_legacy_helper/README.markdown +0 -13
  567. data/vendor/plugins/prototype_legacy_helper/init.rb +0 -1
  568. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +0 -432
  569. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +0 -297
  570. data/vendor/plugins/resource_feeder/init.rb +0 -2
  571. data/vendor/plugins/resource_feeder/lib/resource_feeder.rb +0 -2
  572. data/vendor/plugins/respond_to_parent/MIT-LICENSE +0 -20
  573. data/vendor/plugins/respond_to_parent/README +0 -47
  574. data/vendor/plugins/respond_to_parent/Rakefile +0 -22
  575. data/vendor/plugins/respond_to_parent/init.rb +0 -1
  576. data/vendor/plugins/respond_to_parent/install.rb +0 -1
  577. data/vendor/plugins/respond_to_parent/lib/responds_to_parent.rb +0 -70
  578. data/vendor/plugins/respond_to_parent/test/responds_to_parent_test.rb +0 -10
  579. data/vendor/plugins/respond_to_parent/test/test_helper.rb +0 -6
  580. data/vendor/plugins/respond_to_parent/uninstall.rb +0 -1
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,136 +0,0 @@
1
- // script.aculo.us builder.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008
2
-
3
- // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
4
- //
5
- // script.aculo.us is freely distributable under the terms of an MIT-style license.
6
- // For details, see the script.aculo.us web site: http://script.aculo.us/
7
-
8
- var Builder = {
9
- NODEMAP: {
10
- AREA: 'map',
11
- CAPTION: 'table',
12
- COL: 'table',
13
- COLGROUP: 'table',
14
- LEGEND: 'fieldset',
15
- OPTGROUP: 'select',
16
- OPTION: 'select',
17
- PARAM: 'object',
18
- TBODY: 'table',
19
- TD: 'table',
20
- TFOOT: 'table',
21
- TH: 'table',
22
- THEAD: 'table',
23
- TR: 'table'
24
- },
25
- // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
26
- // due to a Firefox bug
27
- node: function(elementName) {
28
- elementName = elementName.toUpperCase();
29
-
30
- // try innerHTML approach
31
- var parentTag = this.NODEMAP[elementName] || 'div';
32
- var parentElement = document.createElement(parentTag);
33
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
34
- parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
35
- } catch(e) {}
36
- var element = parentElement.firstChild || null;
37
-
38
- // see if browser added wrapping tags
39
- if(element && (element.tagName.toUpperCase() != elementName))
40
- element = element.getElementsByTagName(elementName)[0];
41
-
42
- // fallback to createElement approach
43
- if(!element) element = document.createElement(elementName);
44
-
45
- // abort if nothing could be created
46
- if(!element) return;
47
-
48
- // attributes (or text)
49
- if(arguments[1])
50
- if(this._isStringOrNumber(arguments[1]) ||
51
- (arguments[1] instanceof Array) ||
52
- arguments[1].tagName) {
53
- this._children(element, arguments[1]);
54
- } else {
55
- var attrs = this._attributes(arguments[1]);
56
- if(attrs.length) {
57
- try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
58
- parentElement.innerHTML = "<" +elementName + " " +
59
- attrs + "></" + elementName + ">";
60
- } catch(e) {}
61
- element = parentElement.firstChild || null;
62
- // workaround firefox 1.0.X bug
63
- if(!element) {
64
- element = document.createElement(elementName);
65
- for(attr in arguments[1])
66
- element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
67
- }
68
- if(element.tagName.toUpperCase() != elementName)
69
- element = parentElement.getElementsByTagName(elementName)[0];
70
- }
71
- }
72
-
73
- // text, or array of children
74
- if(arguments[2])
75
- this._children(element, arguments[2]);
76
-
77
- return $(element);
78
- },
79
- _text: function(text) {
80
- return document.createTextNode(text);
81
- },
82
-
83
- ATTR_MAP: {
84
- 'className': 'class',
85
- 'htmlFor': 'for'
86
- },
87
-
88
- _attributes: function(attributes) {
89
- var attrs = [];
90
- for(attribute in attributes)
91
- attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
92
- '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
93
- return attrs.join(" ");
94
- },
95
- _children: function(element, children) {
96
- if(children.tagName) {
97
- element.appendChild(children);
98
- return;
99
- }
100
- if(typeof children=='object') { // array can hold nodes and text
101
- children.flatten().each( function(e) {
102
- if(typeof e=='object')
103
- element.appendChild(e);
104
- else
105
- if(Builder._isStringOrNumber(e))
106
- element.appendChild(Builder._text(e));
107
- });
108
- } else
109
- if(Builder._isStringOrNumber(children))
110
- element.appendChild(Builder._text(children));
111
- },
112
- _isStringOrNumber: function(param) {
113
- return(typeof param=='string' || typeof param=='number');
114
- },
115
- build: function(html) {
116
- var element = this.node('div');
117
- $(element).update(html.strip());
118
- return element.down();
119
- },
120
- dump: function(scope) {
121
- if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
122
-
123
- var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
124
- "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
125
- "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
126
- "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
127
- "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
128
- "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
129
-
130
- tags.each( function(tag){
131
- scope[tag] = function() {
132
- return Builder.node.apply(Builder, [tag].concat($A(arguments)));
133
- };
134
- });
135
- }
136
- };
@@ -1,839 +0,0 @@
1
- //
2
- // CalendarView (for Prototype)
3
- // calendarview.org
4
- //
5
- // Maintained by Justin Mecham <justin@aspect.net>
6
- //
7
- // Portions Copyright 2002-2005 Mihai Bazon
8
- //
9
- // This calendar is based very loosely on the Dynarch Calendar in that it was
10
- // used as a base, but completely gutted and more or less rewritten in place
11
- // to use the Prototype JavaScript library.
12
- //
13
- // As such, CalendarView is licensed under the terms of the GNU Lesser General
14
- // Public License (LGPL). More information on the Dynarch Calendar can be
15
- // found at:
16
- //
17
- // www.dynarch.com/projects/calendar
18
- //
19
-
20
- var Calendar = Class.create()
21
-
22
- //------------------------------------------------------------------------------
23
- // Constants
24
- //------------------------------------------------------------------------------
25
-
26
- Calendar.VERSION = '1.2'
27
-
28
- Calendar.DAY_NAMES = new Array(
29
- 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
30
- 'Sunday'
31
- )
32
-
33
- Calendar.SHORT_DAY_NAMES = new Array(
34
- 'S', 'M', 'T', 'W', 'T', 'F', 'S', 'S'
35
- )
36
-
37
- Calendar.MONTH_NAMES = new Array(
38
- 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
39
- 'September', 'October', 'November', 'December'
40
- )
41
-
42
- Calendar.SHORT_MONTH_NAMES = new Array(
43
- 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov',
44
- 'Dec'
45
- )
46
-
47
- Calendar.NAV_PREVIOUS_YEAR = -2
48
- Calendar.NAV_PREVIOUS_MONTH = -1
49
- Calendar.NAV_TODAY = 0
50
- Calendar.NAV_NEXT_MONTH = 1
51
- Calendar.NAV_NEXT_YEAR = 2
52
-
53
- //------------------------------------------------------------------------------
54
- // Static Methods
55
- //------------------------------------------------------------------------------
56
-
57
- // This gets called when the user presses a mouse button anywhere in the
58
- // document, if the calendar is shown. If the click was outside the open
59
- // calendar this function closes it.
60
- Calendar._checkCalendar = function(event) {
61
- if (!window._popupCalendar)
62
- return false
63
- if (Element.descendantOf(Event.element(event), window._popupCalendar.container))
64
- return
65
- window._popupCalendar.callCloseHandler()
66
- return Event.stop(event)
67
- }
68
-
69
- //------------------------------------------------------------------------------
70
- // Event Handlers
71
- //------------------------------------------------------------------------------
72
-
73
- Calendar.handleMouseDownEvent = function(event)
74
- {
75
- Event.observe(document, 'mouseup', Calendar.handleMouseUpEvent)
76
- Event.stop(event)
77
- }
78
-
79
- // XXX I am not happy with how clicks of different actions are handled. Need to
80
- // clean this up!
81
- Calendar.handleMouseUpEvent = function(event)
82
- {
83
- var el = Event.element(event)
84
- var calendar = el.calendar
85
- var isNewDate = false
86
-
87
- // If the element that was clicked on does not have an associated Calendar
88
- // object, return as we have nothing to do.
89
- if (!calendar) return false
90
-
91
- // Clicked on a day
92
- if (typeof el.navAction == 'undefined')
93
- {
94
- if (calendar.currentDateElement) {
95
- Element.removeClassName(calendar.currentDateElement, 'selected')
96
- Element.addClassName(el, 'selected')
97
- calendar.shouldClose = (calendar.currentDateElement == el)
98
- if (!calendar.shouldClose) calendar.currentDateElement = el
99
- }
100
- calendar.date.setDateOnly(el.date)
101
- isNewDate = true
102
- calendar.shouldClose = !el.hasClassName('otherDay')
103
- var isOtherMonth = !calendar.shouldClose
104
- if (isOtherMonth) calendar.update(calendar.date)
105
- }
106
-
107
- // Clicked on an action button
108
- else
109
- {
110
- var date = new Date(calendar.date)
111
-
112
- if (el.navAction == Calendar.NAV_TODAY)
113
- date.setDateOnly(new Date())
114
-
115
- var year = date.getFullYear()
116
- var mon = date.getMonth()
117
- function setMonth(m) {
118
- var day = date.getDate()
119
- var max = date.getMonthDays(m)
120
- if (day > max) date.setDate(max)
121
- date.setMonth(m)
122
- }
123
- switch (el.navAction) {
124
-
125
- // Previous Year
126
- case Calendar.NAV_PREVIOUS_YEAR:
127
- if (year > calendar.minYear)
128
- date.setFullYear(year - 1)
129
- break
130
-
131
- // Previous Month
132
- case Calendar.NAV_PREVIOUS_MONTH:
133
- if (mon > 0) {
134
- setMonth(mon - 1)
135
- }
136
- else if (year-- > calendar.minYear) {
137
- date.setFullYear(year)
138
- setMonth(11)
139
- }
140
- break
141
-
142
- // Today
143
- case Calendar.NAV_TODAY:
144
- break
145
-
146
- // Next Month
147
- case Calendar.NAV_NEXT_MONTH:
148
- if (mon < 11) {
149
- setMonth(mon + 1)
150
- }
151
- else if (year < calendar.maxYear) {
152
- date.setFullYear(year + 1)
153
- setMonth(0)
154
- }
155
- break
156
-
157
- // Next Year
158
- case Calendar.NAV_NEXT_YEAR:
159
- if (year < calendar.maxYear)
160
- date.setFullYear(year + 1)
161
- break
162
-
163
- }
164
-
165
- if (!date.equalsTo(calendar.date)) {
166
- calendar.setDate(date)
167
- isNewDate = true
168
- } else if (el.navAction == 0) {
169
- isNewDate = (calendar.shouldClose = true)
170
- }
171
- }
172
-
173
- if (isNewDate) event && calendar.callSelectHandler()
174
- if (calendar.shouldClose) event && calendar.callCloseHandler()
175
-
176
- Event.stopObserving(document, 'mouseup', Calendar.handleMouseUpEvent)
177
-
178
- return Event.stop(event)
179
- }
180
-
181
- Calendar.defaultSelectHandler = function(calendar)
182
- {
183
- if (!calendar.dateField) return false
184
-
185
- // Update dateField value
186
- if (calendar.dateField.tagName == 'DIV')
187
- Element.update(calendar.dateField, calendar.date.print(calendar.dateFormat))
188
- else if (calendar.dateField.tagName == 'INPUT') {
189
- calendar.dateField.value = calendar.date.print(calendar.dateFormat) }
190
-
191
- // Trigger the onchange callback on the dateField, if one has been defined
192
- if (typeof calendar.dateField.onchange == 'function')
193
- calendar.dateField.onchange()
194
-
195
- // Call the close handler, if necessary
196
- if (calendar.shouldClose) calendar.callCloseHandler()
197
- }
198
-
199
- Calendar.defaultCloseHandler = function(calendar)
200
- {
201
- calendar.hide()
202
- }
203
-
204
-
205
- //------------------------------------------------------------------------------
206
- // Calendar Setup
207
- //------------------------------------------------------------------------------
208
-
209
- Calendar.setup = function(params)
210
- {
211
-
212
- function param_default(name, def) {
213
- if (!params[name]) params[name] = def
214
- }
215
-
216
- param_default('dateField', null)
217
- param_default('triggerElement', null)
218
- param_default('parentElement', null)
219
- param_default('selectHandler', null)
220
- param_default('closeHandler', null)
221
-
222
- // In-Page Calendar
223
- if (params.parentElement)
224
- {
225
- var calendar = new Calendar(params.parentElement)
226
- calendar.setSelectHandler(params.selectHandler || Calendar.defaultSelectHandler)
227
- if (params.dateFormat)
228
- calendar.setDateFormat(params.dateFormat)
229
- if (params.dateField) {
230
- calendar.setDateField(params.dateField)
231
- calendar.parseDate(calendar.dateField.innerHTML || calendar.dateField.value)
232
- }
233
- calendar.show()
234
- return calendar
235
- }
236
-
237
- // Popup Calendars
238
- //
239
- // XXX There is significant optimization to be had here by creating the
240
- // calendar and storing it on the page, but then you will have issues with
241
- // multiple calendars on the same page.
242
- else
243
- {
244
- var triggerElement = $(params.triggerElement || params.dateField)
245
- triggerElement.onclick = function() {
246
- var calendar = new Calendar()
247
- calendar.setSelectHandler(params.selectHandler || Calendar.defaultSelectHandler)
248
- calendar.setCloseHandler(params.closeHandler || Calendar.defaultCloseHandler)
249
- if (params.dateFormat)
250
- calendar.setDateFormat(params.dateFormat)
251
- if (params.dateField) {
252
- calendar.setDateField(params.dateField)
253
- calendar.parseDate(calendar.dateField.innerHTML || calendar.dateField.value)
254
- }
255
- if (params.dateField)
256
- Date.parseDate(calendar.dateField.value || calendar.dateField.innerHTML, calendar.dateFormat)
257
- calendar.showAtElement(triggerElement)
258
- return calendar
259
- }
260
- }
261
-
262
- }
263
-
264
-
265
-
266
- //------------------------------------------------------------------------------
267
- // Calendar Instance
268
- //------------------------------------------------------------------------------
269
-
270
- Calendar.prototype = {
271
-
272
- // The HTML Container Element
273
- container: null,
274
-
275
- // Callbacks
276
- selectHandler: null,
277
- closeHandler: null,
278
-
279
- // Configuration
280
- minYear: 1900,
281
- maxYear: 2100,
282
- dateFormat: '%Y-%m-%d',
283
-
284
- // Dates
285
- date: new Date(),
286
- currentDateElement: null,
287
-
288
- // Status
289
- shouldClose: false,
290
- isPopup: true,
291
-
292
- dateField: null,
293
-
294
-
295
- //----------------------------------------------------------------------------
296
- // Initialize
297
- //----------------------------------------------------------------------------
298
-
299
- initialize: function(parent)
300
- {
301
- if (parent)
302
- this.create($(parent))
303
- else
304
- this.create()
305
- },
306
-
307
-
308
-
309
- //----------------------------------------------------------------------------
310
- // Update / (Re)initialize Calendar
311
- //----------------------------------------------------------------------------
312
-
313
- update: function(date)
314
- {
315
- var calendar = this
316
- var today = new Date()
317
- var thisYear = today.getFullYear()
318
- var thisMonth = today.getMonth()
319
- var thisDay = today.getDate()
320
- var month = date.getMonth();
321
- var dayOfMonth = date.getDate();
322
-
323
- // Ensure date is within the defined range
324
- if (date.getFullYear() < this.minYear)
325
- date.setFullYear(this.minYear)
326
- else if (date.getFullYear() > this.maxYear)
327
- date.setFullYear(this.maxYear)
328
-
329
- this.date = new Date(date)
330
-
331
- // Calculate the first day to display (including the previous month)
332
- date.setDate(1)
333
- date.setDate(-(date.getDay()) + 1)
334
-
335
- // Fill in the days of the month
336
- Element.getElementsBySelector(this.container, 'tbody tr').each(
337
- function(row, i) {
338
- var rowHasDays = false
339
- row.immediateDescendants().each(
340
- function(cell, j) {
341
- var day = date.getDate()
342
- var dayOfWeek = date.getDay()
343
- var isCurrentMonth = (date.getMonth() == month)
344
-
345
- // Reset classes on the cell
346
- cell.className = ''
347
- cell.date = new Date(date)
348
- cell.update(day)
349
-
350
- // Account for days of the month other than the current month
351
- if (!isCurrentMonth)
352
- cell.addClassName('otherDay')
353
- else
354
- rowHasDays = true
355
-
356
- // Ensure the current day is selected
357
- if (isCurrentMonth && day == dayOfMonth) {
358
- cell.addClassName('selected')
359
- calendar.currentDateElement = cell
360
- }
361
-
362
- // Today
363
- if (date.getFullYear() == thisYear && date.getMonth() == thisMonth && day == thisDay)
364
- cell.addClassName('today')
365
-
366
- // Weekend
367
- if ([0, 6].indexOf(dayOfWeek) != -1)
368
- cell.addClassName('weekend')
369
-
370
- // Set the date to tommorrow
371
- date.setDate(day + 1)
372
- }
373
- )
374
- // Hide the extra row if it contains only days from another month
375
- !rowHasDays ? row.hide() : row.show()
376
- }
377
- )
378
-
379
- this.container.getElementsBySelector('td.title')[0].update(
380
- Calendar.MONTH_NAMES[month] + ' ' + this.date.getFullYear()
381
- )
382
- },
383
-
384
-
385
-
386
- //----------------------------------------------------------------------------
387
- // Create/Draw the Calendar HTML Elements
388
- //----------------------------------------------------------------------------
389
-
390
- create: function(parent)
391
- {
392
-
393
- // If no parent was specified, assume that we are creating a popup calendar.
394
- if (!parent) {
395
- parent = document.getElementsByTagName('body')[0]
396
- this.isPopup = true
397
- } else {
398
- this.isPopup = false
399
- }
400
-
401
- // Calendar Table
402
- var table = new Element('table')
403
-
404
- // Calendar Header
405
- var thead = new Element('thead')
406
- table.appendChild(thead)
407
-
408
- // Title Placeholder
409
- var row = new Element('tr')
410
- var cell = new Element('td', { colSpan: 7 } )
411
- cell.addClassName('title')
412
- row.appendChild(cell)
413
- thead.appendChild(row)
414
-
415
- // Calendar Navigation
416
- row = new Element('tr')
417
- this._drawButtonCell(row, '&#x00ab;', 1, Calendar.NAV_PREVIOUS_YEAR)
418
- this._drawButtonCell(row, '&#x2039;', 1, Calendar.NAV_PREVIOUS_MONTH)
419
- this._drawButtonCell(row, 'Today', 3, Calendar.NAV_TODAY)
420
- this._drawButtonCell(row, '&#x203a;', 1, Calendar.NAV_NEXT_MONTH)
421
- this._drawButtonCell(row, '&#x00bb;', 1, Calendar.NAV_NEXT_YEAR)
422
- thead.appendChild(row)
423
-
424
- // Day Names
425
- row = new Element('tr')
426
- for (var i = 0; i < 7; ++i) {
427
- cell = new Element('th').update(Calendar.SHORT_DAY_NAMES[i])
428
- if (i == 0 || i == 6)
429
- cell.addClassName('weekend')
430
- row.appendChild(cell)
431
- }
432
- thead.appendChild(row)
433
-
434
- // Calendar Days
435
- var tbody = table.appendChild(new Element('tbody'))
436
- for (i = 6; i > 0; --i) {
437
- row = tbody.appendChild(new Element('tr'))
438
- row.addClassName('days')
439
- for (var j = 7; j > 0; --j) {
440
- cell = row.appendChild(new Element('td'))
441
- cell.calendar = this
442
- }
443
- }
444
-
445
- // Calendar Container (div)
446
- this.container = new Element('div')
447
- this.container.addClassName('calendar')
448
- if (this.isPopup) {
449
- this.container.setStyle({ position: 'absolute', display: 'none' })
450
- this.container.addClassName('popup')
451
- }
452
- this.container.appendChild(table)
453
-
454
- // Initialize Calendar
455
- this.update(this.date)
456
-
457
- // Observe the container for mousedown events
458
- Event.observe(this.container, 'mousedown', Calendar.handleMouseDownEvent)
459
-
460
- // Append to parent element
461
- parent.appendChild(this.container)
462
-
463
- },
464
-
465
- _drawButtonCell: function(parent, text, colSpan, navAction)
466
- {
467
- var cell = new Element('td')
468
- if (colSpan > 1) cell.colSpan = colSpan
469
- cell.className = 'button'
470
- cell.calendar = this
471
- cell.navAction = navAction
472
- cell.innerHTML = text
473
- cell.unselectable = 'on' // IE
474
- parent.appendChild(cell)
475
- return cell
476
- },
477
-
478
-
479
-
480
- //------------------------------------------------------------------------------
481
- // Callbacks
482
- //------------------------------------------------------------------------------
483
-
484
- // Calls the Select Handler (if defined)
485
- callSelectHandler: function()
486
- {
487
- if (this.selectHandler)
488
- this.selectHandler(this, this.date.print(this.dateFormat))
489
- },
490
-
491
- // Calls the Close Handler (if defined)
492
- callCloseHandler: function()
493
- {
494
- if (this.closeHandler)
495
- this.closeHandler(this)
496
- },
497
-
498
-
499
-
500
- //------------------------------------------------------------------------------
501
- // Calendar Display Functions
502
- //------------------------------------------------------------------------------
503
-
504
- // Shows the Calendar
505
- show: function()
506
- {
507
- this.container.show()
508
- if (this.isPopup) {
509
- window._popupCalendar = this
510
- Event.observe(document, 'mousedown', Calendar._checkCalendar)
511
- }
512
- },
513
-
514
- // Shows the calendar at the given absolute position
515
- showAt: function (x, y)
516
- {
517
- this.container.setStyle({ left: x + 'px', top: y + 'px' })
518
- this.show()
519
- },
520
-
521
- // Shows the Calendar at the coordinates of the provided element
522
- showAtElement: function(element)
523
- {
524
- var pos = Position.cumulativeOffset(element)
525
- this.showAt(pos[0], pos[1])
526
- },
527
-
528
- // Hides the Calendar
529
- hide: function()
530
- {
531
- if (this.isPopup)
532
- Event.stopObserving(document, 'mousedown', Calendar._checkCalendar)
533
- this.container.hide()
534
- },
535
-
536
-
537
-
538
- //------------------------------------------------------------------------------
539
- // Miscellaneous
540
- //------------------------------------------------------------------------------
541
-
542
- // Tries to identify the date represented in a string. If successful it also
543
- // calls this.setDate which moves the calendar to the given date.
544
- parseDate: function(str, format)
545
- {
546
- if (!format)
547
- format = this.dateFormat
548
- this.setDate(Date.parseDate(str, format))
549
- },
550
-
551
-
552
-
553
- //------------------------------------------------------------------------------
554
- // Getters/Setters
555
- //------------------------------------------------------------------------------
556
-
557
- setSelectHandler: function(selectHandler)
558
- {
559
- this.selectHandler = selectHandler
560
- },
561
-
562
- setCloseHandler: function(closeHandler)
563
- {
564
- this.closeHandler = closeHandler
565
- },
566
-
567
- setDate: function(date)
568
- {
569
- if (!date.equalsTo(this.date))
570
- this.update(date)
571
- },
572
-
573
- setDateFormat: function(format)
574
- {
575
- this.dateFormat = format
576
- },
577
-
578
- setDateField: function(field)
579
- {
580
- this.dateField = $(field)
581
- },
582
-
583
- setRange: function(minYear, maxYear)
584
- {
585
- this.minYear = minYear
586
- this.maxYear = maxYear
587
- }
588
-
589
- }
590
-
591
- // global object that remembers the calendar
592
- window._popupCalendar = null
593
-
594
-
595
-
596
-
597
-
598
-
599
-
600
-
601
-
602
-
603
-
604
-
605
-
606
-
607
-
608
-
609
-
610
-
611
-
612
-
613
-
614
-
615
-
616
-
617
-
618
-
619
-
620
-
621
-
622
- //==============================================================================
623
- //
624
- // Date Object Patches
625
- //
626
- // This is pretty much untouched from the original. I really would like to get
627
- // rid of these patches if at all possible and find a cleaner way of
628
- // accomplishing the same things. It's a shame Prototype doesn't extend Date at
629
- // all.
630
- //
631
- //==============================================================================
632
-
633
- Date.DAYS_IN_MONTH = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
634
- Date.SECOND = 1000 /* milliseconds */
635
- Date.MINUTE = 60 * Date.SECOND
636
- Date.HOUR = 60 * Date.MINUTE
637
- Date.DAY = 24 * Date.HOUR
638
- Date.WEEK = 7 * Date.DAY
639
-
640
- // Parses Date
641
- Date.parseDate = function(str, fmt) {
642
- var today = new Date();
643
- var y = 0;
644
- var m = -1;
645
- var d = 0;
646
- var a = str.split(/\W+/);
647
- var b = fmt.match(/%./g);
648
- var i = 0, j = 0;
649
- var hr = 0;
650
- var min = 0;
651
-
652
- for (i = 0; i < a.length; ++i) {
653
- if (!a[i]) continue;
654
- switch (b[i]) {
655
- case "%d":
656
- case "%e":
657
- d = parseInt(a[i], 10);
658
- break;
659
- case "%m":
660
- m = parseInt(a[i], 10) - 1;
661
- break;
662
- case "%Y":
663
- case "%y":
664
- y = parseInt(a[i], 10);
665
- (y < 100) && (y += (y > 29) ? 1900 : 2000);
666
- break;
667
- case "%b":
668
- case "%B":
669
- for (j = 0; j < 12; ++j) {
670
- if (Calendar.MONTH_NAMES[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) {
671
- m = j;
672
- break;
673
- }
674
- }
675
- break;
676
- case "%H":
677
- case "%I":
678
- case "%k":
679
- case "%l":
680
- hr = parseInt(a[i], 10);
681
- break;
682
- case "%P":
683
- case "%p":
684
- if (/pm/i.test(a[i]) && hr < 12)
685
- hr += 12;
686
- else if (/am/i.test(a[i]) && hr >= 12)
687
- hr -= 12;
688
- break;
689
- case "%M":
690
- min = parseInt(a[i], 10);
691
- break;
692
- }
693
- }
694
- if (isNaN(y)) y = today.getFullYear();
695
- if (isNaN(m)) m = today.getMonth();
696
- if (isNaN(d)) d = today.getDate();
697
- if (isNaN(hr)) hr = today.getHours();
698
- if (isNaN(min)) min = today.getMinutes();
699
- if (y != 0 && m != -1 && d != 0)
700
- return new Date(y, m, d, hr, min, 0);
701
- y = 0; m = -1; d = 0;
702
- for (i = 0; i < a.length; ++i) {
703
- if (a[i].search(/[a-zA-Z]+/) != -1) {
704
- var t = -1;
705
- for (j = 0; j < 12; ++j) {
706
- if (Calendar.MONTH_NAMES[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
707
- }
708
- if (t != -1) {
709
- if (m != -1) {
710
- d = m+1;
711
- }
712
- m = t;
713
- }
714
- } else if (parseInt(a[i], 10) <= 12 && m == -1) {
715
- m = a[i]-1;
716
- } else if (parseInt(a[i], 10) > 31 && y == 0) {
717
- y = parseInt(a[i], 10);
718
- (y < 100) && (y += (y > 29) ? 1900 : 2000);
719
- } else if (d == 0) {
720
- d = a[i];
721
- }
722
- }
723
- if (y == 0)
724
- y = today.getFullYear();
725
- if (m != -1 && d != 0)
726
- return new Date(y, m, d, hr, min, 0);
727
- return today;
728
- };
729
-
730
- // Returns the number of days in the current month
731
- Date.prototype.getMonthDays = function(month) {
732
- var year = this.getFullYear()
733
- if (typeof month == "undefined")
734
- month = this.getMonth()
735
- if (((0 == (year % 4)) && ( (0 != (year % 100)) || (0 == (year % 400)))) && month == 1)
736
- return 29
737
- else
738
- return Date.DAYS_IN_MONTH[month]
739
- };
740
-
741
- // Returns the number of day in the year
742
- Date.prototype.getDayOfYear = function() {
743
- var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
744
- var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
745
- var time = now - then;
746
- return Math.floor(time / Date.DAY);
747
- };
748
-
749
- /** Returns the number of the week in year, as defined in ISO 8601. */
750
- Date.prototype.getWeekNumber = function() {
751
- var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
752
- var DoW = d.getDay();
753
- d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
754
- var ms = d.valueOf(); // GMT
755
- d.setMonth(0);
756
- d.setDate(4); // Thu in Week 1
757
- return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
758
- };
759
-
760
- /** Checks date and time equality */
761
- Date.prototype.equalsTo = function(date) {
762
- return ((this.getFullYear() == date.getFullYear()) &&
763
- (this.getMonth() == date.getMonth()) &&
764
- (this.getDate() == date.getDate()) &&
765
- (this.getHours() == date.getHours()) &&
766
- (this.getMinutes() == date.getMinutes()));
767
- };
768
-
769
- /** Set only the year, month, date parts (keep existing time) */
770
- Date.prototype.setDateOnly = function(date) {
771
- var tmp = new Date(date);
772
- this.setDate(1);
773
- this.setFullYear(tmp.getFullYear());
774
- this.setMonth(tmp.getMonth());
775
- this.setDate(tmp.getDate());
776
- };
777
-
778
- /** Prints the date in a string according to the given format. */
779
- Date.prototype.print = function (str) {
780
- var m = this.getMonth();
781
- var d = this.getDate();
782
- var y = this.getFullYear();
783
- var wn = this.getWeekNumber();
784
- var w = this.getDay();
785
- var s = {};
786
- var hr = this.getHours();
787
- var pm = (hr >= 12);
788
- var ir = (pm) ? (hr - 12) : hr;
789
- var dy = this.getDayOfYear();
790
- if (ir == 0)
791
- ir = 12;
792
- var min = this.getMinutes();
793
- var sec = this.getSeconds();
794
- s["%a"] = Calendar.SHORT_DAY_NAMES[w]; // abbreviated weekday name [FIXME: I18N]
795
- s["%A"] = Calendar.DAY_NAMES[w]; // full weekday name
796
- s["%b"] = Calendar.SHORT_MONTH_NAMES[m]; // abbreviated month name [FIXME: I18N]
797
- s["%B"] = Calendar.MONTH_NAMES[m]; // full month name
798
- // FIXME: %c : preferred date and time representation for the current locale
799
- s["%C"] = 1 + Math.floor(y / 100); // the century number
800
- s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
801
- s["%e"] = d; // the day of the month (range 1 to 31)
802
- // FIXME: %D : american date style: %m/%d/%y
803
- // FIXME: %E, %F, %G, %g, %h (man strftime)
804
- s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
805
- s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
806
- s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
807
- s["%k"] = hr; // hour, range 0 to 23 (24h format)
808
- s["%l"] = ir; // hour, range 1 to 12 (12h format)
809
- s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
810
- s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
811
- s["%n"] = "\n"; // a newline character
812
- s["%p"] = pm ? "PM" : "AM";
813
- s["%P"] = pm ? "pm" : "am";
814
- // FIXME: %r : the time in am/pm notation %I:%M:%S %p
815
- // FIXME: %R : the time in 24-hour notation %H:%M
816
- s["%s"] = Math.floor(this.getTime() / 1000);
817
- s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
818
- s["%t"] = "\t"; // a tab character
819
- // FIXME: %T : the time in 24-hour notation (%H:%M:%S)
820
- s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
821
- s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
822
- s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
823
- // FIXME: %x : preferred date representation for the current locale without the time
824
- // FIXME: %X : preferred time representation for the current locale without the date
825
- s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
826
- s["%Y"] = y; // year with the century
827
- s["%%"] = "%"; // a literal '%' character
828
-
829
- return str.gsub(/%./, function(match) { return s[match] || match });
830
- };
831
-
832
- Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
833
- Date.prototype.setFullYear = function(y) {
834
- var d = new Date(this);
835
- d.__msh_oldSetFullYear(y);
836
- if (d.getMonth() != this.getMonth())
837
- this.setDate(28);
838
- this.__msh_oldSetFullYear(y);
839
- }