vkhater-social_stream-base 0.11.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (629) hide show
  1. data/.gitignore +16 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +2 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +68 -0
  7. data/Rakefile +35 -0
  8. data/app/assets/images/HTML5.png +0 -0
  9. data/app/assets/images/HTML5_Semantics.png +0 -0
  10. data/app/assets/images/HTML5_Styling.png +0 -0
  11. data/app/assets/images/Jcrop.gif +0 -0
  12. data/app/assets/images/arrow-end.png +0 -0
  13. data/app/assets/images/arrow-start.png +0 -0
  14. data/app/assets/images/arrow.png +0 -0
  15. data/app/assets/images/big-logo.png +0 -0
  16. data/app/assets/images/btn/1-facebook.png +0 -0
  17. data/app/assets/images/btn/_notes/btn_certificates.png.mno +4 -0
  18. data/app/assets/images/btn/activity.png +0 -0
  19. data/app/assets/images/btn/arrowBlue.png +0 -0
  20. data/app/assets/images/btn/arrow_session_change.png +0 -0
  21. data/app/assets/images/btn/arrows-ffffff.png +0 -0
  22. data/app/assets/images/btn/bold.png +0 -0
  23. data/app/assets/images/btn/btn_account.png +0 -0
  24. data/app/assets/images/btn/btn_activities.png +0 -0
  25. data/app/assets/images/btn/btn_bookmark.png +0 -0
  26. data/app/assets/images/btn/btn_browse.png +0 -0
  27. data/app/assets/images/btn/btn_check.png +0 -0
  28. data/app/assets/images/btn/btn_close.png +0 -0
  29. data/app/assets/images/btn/btn_comment.png +0 -0
  30. data/app/assets/images/btn/btn_comment_add.png +0 -0
  31. data/app/assets/images/btn/btn_config.png +0 -0
  32. data/app/assets/images/btn/btn_date.png +0 -0
  33. data/app/assets/images/btn/btn_delete.png +0 -0
  34. data/app/assets/images/btn/btn_down.png +0 -0
  35. data/app/assets/images/btn/btn_edit.png +0 -0
  36. data/app/assets/images/btn/btn_exit.png +0 -0
  37. data/app/assets/images/btn/btn_find.png +0 -0
  38. data/app/assets/images/btn/btn_follow.png +0 -0
  39. data/app/assets/images/btn/btn_foward.png +0 -0
  40. data/app/assets/images/btn/btn_friend.png +0 -0
  41. data/app/assets/images/btn/btn_gallery.png +0 -0
  42. data/app/assets/images/btn/btn_group.png +0 -0
  43. data/app/assets/images/btn/btn_help.png +0 -0
  44. data/app/assets/images/btn/btn_home.png +0 -0
  45. data/app/assets/images/btn/btn_inbox.png +0 -0
  46. data/app/assets/images/btn/btn_info.png +0 -0
  47. data/app/assets/images/btn/btn_invitation.png +0 -0
  48. data/app/assets/images/btn/btn_like.png +0 -0
  49. data/app/assets/images/btn/btn_next.png +0 -0
  50. data/app/assets/images/btn/btn_notification.png +0 -0
  51. data/app/assets/images/btn/btn_notification_delete.png +0 -0
  52. data/app/assets/images/btn/btn_notification_read.png +0 -0
  53. data/app/assets/images/btn/btn_notifications.png +0 -0
  54. data/app/assets/images/btn/btn_page_link.png +0 -0
  55. data/app/assets/images/btn/btn_partner.png +0 -0
  56. data/app/assets/images/btn/btn_photo.png +0 -0
  57. data/app/assets/images/btn/btn_play.png +0 -0
  58. data/app/assets/images/btn/btn_printer.png +0 -0
  59. data/app/assets/images/btn/btn_profile.png +0 -0
  60. data/app/assets/images/btn/btn_rank.png +0 -0
  61. data/app/assets/images/btn/btn_read.png +0 -0
  62. data/app/assets/images/btn/btn_security.png +0 -0
  63. data/app/assets/images/btn/btn_send.png +0 -0
  64. data/app/assets/images/btn/btn_spam.png +0 -0
  65. data/app/assets/images/btn/btn_star.png +0 -0
  66. data/app/assets/images/btn/btn_tag.png +0 -0
  67. data/app/assets/images/btn/btn_write.png +0 -0
  68. data/app/assets/images/btn/close.png +0 -0
  69. data/app/assets/images/btn/date.png +0 -0
  70. data/app/assets/images/btn/delete.png +0 -0
  71. data/app/assets/images/btn/download.png +0 -0
  72. data/app/assets/images/btn/edit.png +0 -0
  73. data/app/assets/images/btn/error.png +0 -0
  74. data/app/assets/images/btn/facebook.png +0 -0
  75. data/app/assets/images/btn/flag.png +0 -0
  76. data/app/assets/images/btn/group_left.png +0 -0
  77. data/app/assets/images/btn/group_right.png +0 -0
  78. data/app/assets/images/btn/header_notifications.png +0 -0
  79. data/app/assets/images/btn/index_71.png +0 -0
  80. data/app/assets/images/btn/info.png +0 -0
  81. data/app/assets/images/btn/italic.png +0 -0
  82. data/app/assets/images/btn/like.png +0 -0
  83. data/app/assets/images/btn/linkedin.png +0 -0
  84. data/app/assets/images/btn/message_conversation.png +0 -0
  85. data/app/assets/images/btn/message_inbox.png +0 -0
  86. data/app/assets/images/btn/message_new.png +0 -0
  87. data/app/assets/images/btn/message_sentbox.png +0 -0
  88. data/app/assets/images/btn/message_trash.png +0 -0
  89. data/app/assets/images/btn/new.png +0 -0
  90. data/app/assets/images/btn/next_conference.png +0 -0
  91. data/app/assets/images/btn/next_space.png +0 -0
  92. data/app/assets/images/btn/nolike.png +0 -0
  93. data/app/assets/images/btn/notifications.png +0 -0
  94. data/app/assets/images/btn/pixel.png +0 -0
  95. data/app/assets/images/btn/point_blue.png +0 -0
  96. data/app/assets/images/btn/point_gray.png +0 -0
  97. data/app/assets/images/btn/post.png +0 -0
  98. data/app/assets/images/btn/search.png +0 -0
  99. data/app/assets/images/btn/search_icon.png +0 -0
  100. data/app/assets/images/btn/shadow.png +0 -0
  101. data/app/assets/images/btn/share.png +0 -0
  102. data/app/assets/images/btn/subtime.png +0 -0
  103. data/app/assets/images/btn/success.png +0 -0
  104. data/app/assets/images/btn/tag_cloud.png +0 -0
  105. data/app/assets/images/btn/twitter-follow-icon.png +0 -0
  106. data/app/assets/images/btn/twitter.png +0 -0
  107. data/app/assets/images/btn/uno.png +0 -0
  108. data/app/assets/images/btn/viewer.png +0 -0
  109. data/app/assets/images/btn/warning.png +0 -0
  110. data/app/assets/images/cancel.png +0 -0
  111. data/app/assets/images/cleditor/buttons.gif +0 -0
  112. data/app/assets/images/cleditor/toolbar.gif +0 -0
  113. data/app/assets/images/frontpage/collaborate.png +0 -0
  114. data/app/assets/images/frontpage/comments.png +0 -0
  115. data/app/assets/images/frontpage/green_sq.png +0 -0
  116. data/app/assets/images/frontpage/meet.png +0 -0
  117. data/app/assets/images/frontpage/people.png +0 -0
  118. data/app/assets/images/frontpage/purple_sq.png +0 -0
  119. data/app/assets/images/frontpage/right_comments.gif +0 -0
  120. data/app/assets/images/frontpage/right_conference.png +0 -0
  121. data/app/assets/images/frontpage/right_organizers.gif +0 -0
  122. data/app/assets/images/frontpage/right_people.gif +0 -0
  123. data/app/assets/images/frontpage/right_social.gif +0 -0
  124. data/app/assets/images/frontpage/right_tags.gif +0 -0
  125. data/app/assets/images/frontpage/right_webcam.gif +0 -0
  126. data/app/assets/images/frontpage/share.png +0 -0
  127. data/app/assets/images/frontpage/tags.png +0 -0
  128. data/app/assets/images/frontpage/yellow_sq.png +0 -0
  129. data/app/assets/images/header-logo.png +0 -0
  130. data/app/assets/images/html5-badge-h-css3-semantics.png +0 -0
  131. data/app/assets/images/icon_checkbox.png +0 -0
  132. data/app/assets/images/icons/favicon.ico +0 -0
  133. data/app/assets/images/left.png +0 -0
  134. data/app/assets/images/lightbox-blank.gif +0 -0
  135. data/app/assets/images/lightbox-btn-close.gif +0 -0
  136. data/app/assets/images/lightbox-btn-next.gif +0 -0
  137. data/app/assets/images/lightbox-btn-prev.gif +0 -0
  138. data/app/assets/images/lightbox-ico-loading.gif +0 -0
  139. data/app/assets/images/loader.gif +0 -0
  140. data/app/assets/images/loading.gif +0 -0
  141. data/app/assets/images/logo.png +0 -0
  142. data/app/assets/images/logos/actor/group.png +0 -0
  143. data/app/assets/images/logos/actor/remote_subject.png +0 -0
  144. data/app/assets/images/logos/actor/remote_user.png +0 -0
  145. data/app/assets/images/logos/actor/user.png +0 -0
  146. data/app/assets/images/logos/contact/group.png +0 -0
  147. data/app/assets/images/logos/contact/user.png +0 -0
  148. data/app/assets/images/logos/original/group.png +0 -0
  149. data/app/assets/images/logos/original/user.png +0 -0
  150. data/app/assets/images/logos/profile/group.png +0 -0
  151. data/app/assets/images/logos/profile/user.png +0 -0
  152. data/app/assets/images/logos/representation/group.png +0 -0
  153. data/app/assets/images/logos/representation/user.png +0 -0
  154. data/app/assets/images/mini-loading.gif +0 -0
  155. data/app/assets/images/right.png +0 -0
  156. data/app/assets/images/tipsy.gif +0 -0
  157. data/app/assets/javascripts/activities.js.erb +250 -0
  158. data/app/assets/javascripts/activities_security_chosen-modified.jquery.js +767 -0
  159. data/app/assets/javascripts/cheesecake.js +6 -0
  160. data/app/assets/javascripts/contacts.js +4 -0
  161. data/app/assets/javascripts/conversations.js +3 -0
  162. data/app/assets/javascripts/groups.js +5 -0
  163. data/app/assets/javascripts/invitations.js +8 -0
  164. data/app/assets/javascripts/jquery.ad-gallery.js +850 -0
  165. data/app/assets/javascripts/jquery.ad-gallery.pack.js +10 -0
  166. data/app/assets/javascripts/layouts.js +21 -0
  167. data/app/assets/javascripts/messages.js +4 -0
  168. data/app/assets/javascripts/posts.js +1 -0
  169. data/app/assets/javascripts/preloader.js +6 -0
  170. data/app/assets/javascripts/profiles.js +9 -0
  171. data/app/assets/javascripts/relation_customs.js +32 -0
  172. data/app/assets/javascripts/search.js.erb +3 -0
  173. data/app/assets/javascripts/settings.js +14 -0
  174. data/app/assets/javascripts/social_stream-base.js +11 -0
  175. data/app/assets/javascripts/ties.js +67 -0
  176. data/app/assets/javascripts/toolbar.js +1 -0
  177. data/app/assets/javascripts/users.js +2 -0
  178. data/app/assets/stylesheets/0_devise_sign.css +28 -0
  179. data/app/assets/stylesheets/_colors.scss +25 -0
  180. data/app/assets/stylesheets/activities.css.scss +88 -0
  181. data/app/assets/stylesheets/base.css.scss +257 -0
  182. data/app/assets/stylesheets/cheesecake.css.scss +55 -0
  183. data/app/assets/stylesheets/contacts.css.scss +100 -0
  184. data/app/assets/stylesheets/conversations.css +4 -0
  185. data/app/assets/stylesheets/footer.css.scss +22 -0
  186. data/app/assets/stylesheets/frontpage.css.scss +70 -0
  187. data/app/assets/stylesheets/groups.css +4 -0
  188. data/app/assets/stylesheets/header.css.scss +203 -0
  189. data/app/assets/stylesheets/home.css.scss +53 -0
  190. data/app/assets/stylesheets/images/add-policy.png +0 -0
  191. data/app/assets/stylesheets/images/fcbkcomplete/close.gif +0 -0
  192. data/app/assets/stylesheets/images/loading.gif +0 -0
  193. data/app/assets/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  194. data/app/assets/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  195. data/app/assets/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  196. data/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  197. data/app/assets/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  198. data/app/assets/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  199. data/app/assets/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  200. data/app/assets/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  201. data/app/assets/stylesheets/images/ui-icons_222222_256x240.png +0 -0
  202. data/app/assets/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
  203. data/app/assets/stylesheets/images/ui-icons_454545_256x240.png +0 -0
  204. data/app/assets/stylesheets/images/ui-icons_888888_256x240.png +0 -0
  205. data/app/assets/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
  206. data/app/assets/stylesheets/invitations.css +3 -0
  207. data/app/assets/stylesheets/location.css.scss +38 -0
  208. data/app/assets/stylesheets/menu.css.scss +19 -0
  209. data/app/assets/stylesheets/messages.css.scss +141 -0
  210. data/app/assets/stylesheets/opa75.png +0 -0
  211. data/app/assets/stylesheets/profiles.css +4 -0
  212. data/app/assets/stylesheets/relation_customs.css.scss +233 -0
  213. data/app/assets/stylesheets/search.css.scss +165 -0
  214. data/app/assets/stylesheets/settings.css +9 -0
  215. data/app/assets/stylesheets/social_stream-base.css +5 -0
  216. data/app/assets/stylesheets/ties.css.scss +12 -0
  217. data/app/assets/stylesheets/toolbar.css +10 -0
  218. data/app/assets/stylesheets/users.css +4 -0
  219. data/app/controllers/activities_controller.rb +19 -0
  220. data/app/controllers/api_controller.rb +38 -0
  221. data/app/controllers/authentications_controller.rb +17 -0
  222. data/app/controllers/cheesecake_controller.rb +9 -0
  223. data/app/controllers/comments_controller.rb +8 -0
  224. data/app/controllers/contacts_controller.rb +95 -0
  225. data/app/controllers/conversations_controller.rb +102 -0
  226. data/app/controllers/frontpage_controller.rb +23 -0
  227. data/app/controllers/groups_controller.rb +58 -0
  228. data/app/controllers/home_controller.rb +3 -0
  229. data/app/controllers/invitations_controller.rb +36 -0
  230. data/app/controllers/likes_controller.rb +41 -0
  231. data/app/controllers/messages_controller.rb +87 -0
  232. data/app/controllers/notifications_controller.rb +73 -0
  233. data/app/controllers/omniauth_callbacks_controller.rb +17 -0
  234. data/app/controllers/permissions_controller.rb +15 -0
  235. data/app/controllers/posts_controller.rb +3 -0
  236. data/app/controllers/profiles_controller.rb +9 -0
  237. data/app/controllers/relation/customs_controller.rb +6 -0
  238. data/app/controllers/search_controller.rb +79 -0
  239. data/app/controllers/settings_controller.rb +43 -0
  240. data/app/controllers/subjects_controller.rb +7 -0
  241. data/app/controllers/tags_controller.rb +15 -0
  242. data/app/controllers/ties_controller.rb +11 -0
  243. data/app/controllers/users_controller.rb +31 -0
  244. data/app/helpers/activities_helper.rb +37 -0
  245. data/app/helpers/contacts_helper.rb +24 -0
  246. data/app/helpers/groups_helper.rb +3 -0
  247. data/app/helpers/location_helper.rb +46 -0
  248. data/app/helpers/permissions_helper.rb +16 -0
  249. data/app/helpers/profiles_helper.rb +37 -0
  250. data/app/helpers/search_helper.rb +38 -0
  251. data/app/helpers/settings_helper.rb +9 -0
  252. data/app/helpers/sidebar_helper.rb +10 -0
  253. data/app/helpers/subjects_helper.rb +15 -0
  254. data/app/helpers/toolbar_helper.rb +109 -0
  255. data/app/helpers/users_helper.rb +4 -0
  256. data/app/mailers/invitation_mailer.rb +11 -0
  257. data/app/models/ability.rb +2 -0
  258. data/app/models/activity.rb +390 -0
  259. data/app/models/activity_object.rb +64 -0
  260. data/app/models/activity_object_activity.rb +14 -0
  261. data/app/models/activity_verb.rb +22 -0
  262. data/app/models/actor.rb +553 -0
  263. data/app/models/audience.rb +9 -0
  264. data/app/models/authentication.rb +3 -0
  265. data/app/models/comment.rb +10 -0
  266. data/app/models/contact.rb +209 -0
  267. data/app/models/group.rb +51 -0
  268. data/app/models/like.rb +49 -0
  269. data/app/models/permission.rb +52 -0
  270. data/app/models/post.rb +12 -0
  271. data/app/models/profile.rb +58 -0
  272. data/app/models/relation.rb +169 -0
  273. data/app/models/relation/custom.rb +112 -0
  274. data/app/models/relation/public.rb +11 -0
  275. data/app/models/relation/reject.rb +3 -0
  276. data/app/models/relation/single.rb +22 -0
  277. data/app/models/relation_permission.rb +4 -0
  278. data/app/models/tie.rb +147 -0
  279. data/app/models/user.rb +148 -0
  280. data/app/views/activities/_activity.html.erb +5 -0
  281. data/app/views/activities/_child.html.erb +18 -0
  282. data/app/views/activities/_comments.html.erb +3 -0
  283. data/app/views/activities/_filter.html.erb +83 -0
  284. data/app/views/activities/_index.html.erb +14 -0
  285. data/app/views/activities/_new.html.erb +56 -0
  286. data/app/views/activities/_options.html.erb +27 -0
  287. data/app/views/activities/_root.html.erb +37 -0
  288. data/app/views/activities/_wall.html.erb +5 -0
  289. data/app/views/activities/index.html.erb +0 -0
  290. data/app/views/activities/index.js.erb +3 -0
  291. data/app/views/activity_objects/_activity_object.html.erb +7 -0
  292. data/app/views/actors/_actor.html.erb +0 -0
  293. data/app/views/actors/_actor_cheesecake.html.erb +4 -0
  294. data/app/views/api/activity_atom_feed.atom.builder +40 -0
  295. data/app/views/avatars/index.html.erb +15 -0
  296. data/app/views/avatars/update.js.erb +15 -0
  297. data/app/views/cheesecake/_index.html.erb +38 -0
  298. data/app/views/cheesecake/index.html.erb +10 -0
  299. data/app/views/comments/_comment.html.erb +1 -0
  300. data/app/views/comments/_new.html.erb +47 -0
  301. data/app/views/comments/create.js.erb +10 -0
  302. data/app/views/comments/destroy.js.erb +1 -0
  303. data/app/views/contacts/_contact.html.erb +20 -0
  304. data/app/views/contacts/_form.html.erb +38 -0
  305. data/app/views/contacts/_index.html.erb +40 -0
  306. data/app/views/contacts/_link.html.erb +9 -0
  307. data/app/views/contacts/_pendings.html.erb +18 -0
  308. data/app/views/contacts/_suggestions.html.erb +15 -0
  309. data/app/views/contacts/_suggestions_and_pendings.html.erb +6 -0
  310. data/app/views/contacts/destroy.js.erb +6 -0
  311. data/app/views/contacts/edit.html.erb +6 -0
  312. data/app/views/contacts/index.html.erb +37 -0
  313. data/app/views/contacts/index.js.erb +3 -0
  314. data/app/views/contacts/new.html.erb +5 -0
  315. data/app/views/contacts/suggestion.html.erb +1 -0
  316. data/app/views/contacts/suggestion.js.erb +1 -0
  317. data/app/views/conversations/_conversation.html.erb +38 -0
  318. data/app/views/conversations/_conversation_full.html.erb +71 -0
  319. data/app/views/conversations/_conversations.html.erb +5 -0
  320. data/app/views/conversations/_index.html.erb +11 -0
  321. data/app/views/conversations/_show.html.erb +13 -0
  322. data/app/views/conversations/edit.html.erb +10 -0
  323. data/app/views/conversations/index.html.erb +15 -0
  324. data/app/views/conversations/index.js.erb +6 -0
  325. data/app/views/conversations/show.html.erb +33 -0
  326. data/app/views/conversations/show.js.erb +26 -0
  327. data/app/views/devise/passwords/edit.html.erb +21 -0
  328. data/app/views/devise/passwords/new.html.erb +27 -0
  329. data/app/views/devise/registrations/_delete_account.html.erb +20 -0
  330. data/app/views/devise/registrations/_edit_user.html.erb +113 -0
  331. data/app/views/devise/registrations/edit.html.erb +20 -0
  332. data/app/views/devise/registrations/new.html.erb +44 -0
  333. data/app/views/devise/sessions/new.html.erb +35 -0
  334. data/app/views/devise/shared/_links.erb +25 -0
  335. data/app/views/frontpage/_caracteristics.html.erb +23 -0
  336. data/app/views/frontpage/_social_networks.html.erb +3 -0
  337. data/app/views/frontpage/_sponsor.html.erb +12 -0
  338. data/app/views/frontpage/host_meta.xml.builder +11 -0
  339. data/app/views/frontpage/index.html.erb +69 -0
  340. data/app/views/groups/_group.html.erb +4 -0
  341. data/app/views/groups/_group_focus_search.html.erb +2 -0
  342. data/app/views/groups/_group_global_search.html.erb +2 -0
  343. data/app/views/groups/_group_with_details.html.erb +2 -0
  344. data/app/views/groups/_index.html.erb +19 -0
  345. data/app/views/groups/_new.html.erb +81 -0
  346. data/app/views/groups/_show.html.erb +33 -0
  347. data/app/views/groups/_tag_cloud.html.erb +25 -0
  348. data/app/views/groups/index.html.erb +57 -0
  349. data/app/views/groups/index.js.erb +1 -0
  350. data/app/views/groups/new.html.erb +9 -0
  351. data/app/views/groups/show.html.erb +1 -0
  352. data/app/views/groups/show.js.erb +2 -0
  353. data/app/views/home/_groups.html.erb +24 -0
  354. data/app/views/home/index.html.erb +19 -0
  355. data/app/views/home/index.js.erb +5 -0
  356. data/app/views/invitation_mailer/send_invitation.html.erb +79 -0
  357. data/app/views/invitation_mailer/send_invitation.text.erb +21 -0
  358. data/app/views/invitations/_new.html.erb +28 -0
  359. data/app/views/invitations/new.html.erb +9 -0
  360. data/app/views/invitations/new.js.erb +4 -0
  361. data/app/views/layouts/_account.html.erb +18 -0
  362. data/app/views/layouts/_flash.html.erb +5 -0
  363. data/app/views/layouts/_footer.html.erb +16 -0
  364. data/app/views/layouts/_header.erb +5 -0
  365. data/app/views/layouts/_header_dropdown_menu.html.erb +19 -0
  366. data/app/views/layouts/_header_dropdown_menu_sessions.html.erb +14 -0
  367. data/app/views/layouts/_header_signed_in.erb +45 -0
  368. data/app/views/layouts/_header_signed_out.erb +34 -0
  369. data/app/views/layouts/_representation.html.erb +28 -0
  370. data/app/views/layouts/_search.html.erb +62 -0
  371. data/app/views/layouts/_settings.html.erb +18 -0
  372. data/app/views/layouts/application.html.erb +60 -0
  373. data/app/views/layouts/frontpage.html.erb +43 -0
  374. data/app/views/likes/create.js.erb +2 -0
  375. data/app/views/likes/destroy.js.erb +1 -0
  376. data/app/views/location/_location.html.erb +3 -0
  377. data/app/views/location/_location_body.html.erb +18 -0
  378. data/app/views/message_mailer/new_message_email.html.erb +35 -0
  379. data/app/views/message_mailer/new_message_email.text.erb +8 -0
  380. data/app/views/message_mailer/reply_message_email.html.erb +35 -0
  381. data/app/views/message_mailer/reply_message_email.text.erb +8 -0
  382. data/app/views/messages/_form.html.erb +39 -0
  383. data/app/views/messages/_message.html.erb +31 -0
  384. data/app/views/messages/_new.html.erb +10 -0
  385. data/app/views/messages/new.html.erb +37 -0
  386. data/app/views/messages/new.js.erb +28 -0
  387. data/app/views/notification_mailer/new_notification_email.html.erb +35 -0
  388. data/app/views/notification_mailer/new_notification_email.text.erb +9 -0
  389. data/app/views/notifications/_index.html.erb +21 -0
  390. data/app/views/notifications/_notification.html.erb +41 -0
  391. data/app/views/notifications/activities/_follow.html.erb +10 -0
  392. data/app/views/notifications/activities/_follow.text.erb +8 -0
  393. data/app/views/notifications/activities/_like.html.erb +30 -0
  394. data/app/views/notifications/activities/_like.text.erb +23 -0
  395. data/app/views/notifications/activities/_make-friend.html.erb +10 -0
  396. data/app/views/notifications/activities/_make-friend.text.erb +7 -0
  397. data/app/views/notifications/activities/_post.html.erb +22 -0
  398. data/app/views/notifications/activities/_post.text.erb +17 -0
  399. data/app/views/notifications/activities/_update.html.erb +18 -0
  400. data/app/views/notifications/activities/_update.text.erb +15 -0
  401. data/app/views/notifications/index.html.erb +13 -0
  402. data/app/views/notifications/index.js.erb +6 -0
  403. data/app/views/objects/_destroy.js.erb +2 -0
  404. data/app/views/objects/_new_activity.html.erb +8 -0
  405. data/app/views/objects/_show.html.erb +3 -0
  406. data/app/views/permissions/_index.html.erb +35 -0
  407. data/app/views/permissions/index.js.erb +15 -0
  408. data/app/views/posts/_new_activity.html.erb +1 -0
  409. data/app/views/posts/_new_activity_fields.erb +7 -0
  410. data/app/views/posts/_post.html.erb +3 -0
  411. data/app/views/posts/_post_focus_search.html.erb +37 -0
  412. data/app/views/posts/_post_global_search.html.erb +18 -0
  413. data/app/views/posts/_post_with_details.html.erb +3 -0
  414. data/app/views/posts/create.js.erb +7 -0
  415. data/app/views/posts/destroy.js.erb +1 -0
  416. data/app/views/posts/show.html.erb +10 -0
  417. data/app/views/profiles/_contact.html.erb +81 -0
  418. data/app/views/profiles/_experience.html.erb +22 -0
  419. data/app/views/profiles/_personal.html.erb +74 -0
  420. data/app/views/profiles/_profile.html.erb +40 -0
  421. data/app/views/profiles/_tags.html.erb +22 -0
  422. data/app/views/profiles/edit.html.erb +205 -0
  423. data/app/views/profiles/show.html.erb +22 -0
  424. data/app/views/profiles/update.js.erb +20 -0
  425. data/app/views/relation/customs/_form.html.erb +29 -0
  426. data/app/views/relation/customs/_list.html.erb +63 -0
  427. data/app/views/relation/customs/_update_rules.js.erb +5 -0
  428. data/app/views/relation/customs/create.js.erb +21 -0
  429. data/app/views/relation/customs/index.html.erb +43 -0
  430. data/app/views/relation/customs/update.js.erb +11 -0
  431. data/app/views/search/_extended_search.html.erb +19 -0
  432. data/app/views/search/_form.html.erb +54 -0
  433. data/app/views/search/_header_search.html.erb +16 -0
  434. data/app/views/search/_index.html.erb +12 -0
  435. data/app/views/search/index.html.erb +9 -0
  436. data/app/views/search/index.js.erb +22 -0
  437. data/app/views/settings/_api_key.html.erb +26 -0
  438. data/app/views/settings/_destroy.html.erb +17 -0
  439. data/app/views/settings/_index.html.erb +8 -0
  440. data/app/views/settings/_notifications.html.erb +34 -0
  441. data/app/views/settings/index.html.erb +16 -0
  442. data/app/views/settings/index.js.erb +7 -0
  443. data/app/views/subjects/_contacts.html.erb +18 -0
  444. data/app/views/subjects/_show.js.erb +5 -0
  445. data/app/views/subjects/_subject.html.erb +8 -0
  446. data/app/views/subjects/_subject_with_details.html.erb +17 -0
  447. data/app/views/ties/index.html.erb +8 -0
  448. data/app/views/toolbar/_home.html.erb +15 -0
  449. data/app/views/toolbar/_logo.html.erb +23 -0
  450. data/app/views/toolbar/_messages.html.erb +11 -0
  451. data/app/views/toolbar/_profile.html.erb +24 -0
  452. data/app/views/toolbar/_subject.html.erb +10 -0
  453. data/app/views/users/_groups.html.erb +22 -0
  454. data/app/views/users/_index.html.erb +19 -0
  455. data/app/views/users/_show.html.erb +34 -0
  456. data/app/views/users/_user.html.erb +2 -0
  457. data/app/views/users/_user_focus_search.html.erb +2 -0
  458. data/app/views/users/_user_global_search.html.erb +2 -0
  459. data/app/views/users/_user_with_details.html.erb +2 -0
  460. data/app/views/users/index.html.erb +41 -0
  461. data/app/views/users/index.js.erb +1 -0
  462. data/app/views/users/info.html.erb +0 -0
  463. data/app/views/users/show.html.erb +1 -0
  464. data/app/views/users/show.js.erb +2 -0
  465. data/app/views/users/show.xml.builder +15 -0
  466. data/config/locales/en.yml +472 -0
  467. data/config/locales/es.yml +470 -0
  468. data/config/routes.rb +102 -0
  469. data/db/migrate/20110610112023_create_social_stream.rb +319 -0
  470. data/db/migrate/20110705103202_empty_ties_count.rb +17 -0
  471. data/db/migrate/20110712090343_remove_spheres.rb +30 -0
  472. data/db/migrate/20110712142140_remove_permission_function.rb +26 -0
  473. data/db/migrate/20110912074426_add_reject_relation.rb +29 -0
  474. data/db/migrate/20111124100618_object_actors.rb +52 -0
  475. data/db/migrate/20111221103509_add_language_field.rb +13 -0
  476. data/lib/acts_as_taggable_on/acts_as_taggable_on/dirty.rb +37 -0
  477. data/lib/acts_as_taggable_on/social_stream.rb +58 -0
  478. data/lib/generators/social_stream/base/install_generator.rb +66 -0
  479. data/lib/generators/social_stream/base/templates/initializer.rb +32 -0
  480. data/lib/generators/social_stream/base/templates/navigation.rb +4 -0
  481. data/lib/generators/social_stream/base/templates/relations.yml +39 -0
  482. data/lib/generators/social_stream/base/templates/sphinx.yml +9 -0
  483. data/lib/paperclip/social_stream.rb +6 -0
  484. data/lib/social_stream-base.rb +104 -0
  485. data/lib/social_stream/ability.rb +7 -0
  486. data/lib/social_stream/ability/base.rb +101 -0
  487. data/lib/social_stream/base/dependencies.rb +47 -0
  488. data/lib/social_stream/base/engine.rb +69 -0
  489. data/lib/social_stream/base/version.rb +5 -0
  490. data/lib/social_stream/controllers/cancan_devise_integration.rb +33 -0
  491. data/lib/social_stream/controllers/helpers.rb +135 -0
  492. data/lib/social_stream/controllers/objects.rb +39 -0
  493. data/lib/social_stream/d3.rb +53 -0
  494. data/lib/social_stream/migrations/base.rb +58 -0
  495. data/lib/social_stream/migrations/components.rb +19 -0
  496. data/lib/social_stream/models/object.rb +133 -0
  497. data/lib/social_stream/models/subject.rb +118 -0
  498. data/lib/social_stream/models/supertype.rb +37 -0
  499. data/lib/social_stream/populate.rb +26 -0
  500. data/lib/social_stream/test_helpers.rb +11 -0
  501. data/lib/social_stream/test_helpers/controllers.rb +122 -0
  502. data/lib/social_stream/toolbar_config/base.rb +94 -0
  503. data/lib/social_stream/views/list.rb +17 -0
  504. data/lib/social_stream/views/settings/base.rb +43 -0
  505. data/lib/social_stream/views/sidebar/base.rb +27 -0
  506. data/lib/tasks/db/populate.rake +241 -0
  507. data/lib/tasks/workers.rake +163 -0
  508. data/social_stream-base.gemspec +83 -0
  509. data/spec/controllers/comments_controller_spec.rb +66 -0
  510. data/spec/controllers/contacts_controller_spec.rb +111 -0
  511. data/spec/controllers/frontpage_controller_spec.rb +16 -0
  512. data/spec/controllers/groups_controller_spec.rb +178 -0
  513. data/spec/controllers/home_controller_spec.rb +56 -0
  514. data/spec/controllers/invitations_controller_spec.rb +34 -0
  515. data/spec/controllers/likes_controller_spec.rb +48 -0
  516. data/spec/controllers/notifications_controller_spec.rb +46 -0
  517. data/spec/controllers/permissions_controller_spec.rb +45 -0
  518. data/spec/controllers/posts_controller_spec.rb +233 -0
  519. data/spec/controllers/profiles_controller_spec.rb +102 -0
  520. data/spec/controllers/relation_customs_controller_spec.rb +139 -0
  521. data/spec/controllers/representations_spec.rb +74 -0
  522. data/spec/controllers/settings_controller_spec.rb +41 -0
  523. data/spec/controllers/subjects_controller.rb +14 -0
  524. data/spec/controllers/users_controller_spec.rb +98 -0
  525. data/spec/dummy/.gitignore +5 -0
  526. data/spec/dummy/Rakefile +7 -0
  527. data/spec/dummy/app/assets/javascripts/application.js +8 -0
  528. data/spec/dummy/app/assets/stylesheets/application.css +8 -0
  529. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  530. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  531. data/spec/dummy/config.ru +4 -0
  532. data/spec/dummy/config/application.rb +44 -0
  533. data/spec/dummy/config/boot.rb +10 -0
  534. data/spec/dummy/config/database.yml +40 -0
  535. data/spec/dummy/config/environment.rb +5 -0
  536. data/spec/dummy/config/environments/development.rb +30 -0
  537. data/spec/dummy/config/environments/production.rb +54 -0
  538. data/spec/dummy/config/environments/test.rb +40 -0
  539. data/spec/dummy/config/environments/test_pg.rb +35 -0
  540. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  541. data/spec/dummy/config/initializers/devise.rb +220 -0
  542. data/spec/dummy/config/initializers/inflections.rb +10 -0
  543. data/spec/dummy/config/initializers/mailboxer.rb +8 -0
  544. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  545. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  546. data/spec/dummy/config/initializers/session_store.rb +8 -0
  547. data/spec/dummy/config/initializers/social_stream.rb +32 -0
  548. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  549. data/spec/dummy/config/locales/en.yml +5 -0
  550. data/spec/dummy/config/navigation.rb +4 -0
  551. data/spec/dummy/config/relations.yml +39 -0
  552. data/spec/dummy/config/routes.rb +60 -0
  553. data/spec/dummy/db/schema.rb +5 -0
  554. data/spec/dummy/db/seeds.rb +8 -0
  555. data/spec/dummy/public/404.html +26 -0
  556. data/spec/dummy/public/422.html +26 -0
  557. data/spec/dummy/public/500.html +26 -0
  558. data/spec/dummy/public/favicon.ico +0 -0
  559. data/spec/dummy/script/rails +6 -0
  560. data/spec/factories/activity.rb +52 -0
  561. data/spec/factories/comment.rb +6 -0
  562. data/spec/factories/contact.rb +16 -0
  563. data/spec/factories/group.rb +5 -0
  564. data/spec/factories/post.rb +11 -0
  565. data/spec/factories/relation_custom.rb +4 -0
  566. data/spec/factories/tie.rb +43 -0
  567. data/spec/factories/user.rb +6 -0
  568. data/spec/integration/navigation_spec.rb +33 -0
  569. data/spec/models/activity_authorization_spec.rb +350 -0
  570. data/spec/models/activity_spec.rb +131 -0
  571. data/spec/models/actor_spec.rb +80 -0
  572. data/spec/models/contact_spec.rb +53 -0
  573. data/spec/models/group_spec.rb +28 -0
  574. data/spec/models/like_spec.rb +68 -0
  575. data/spec/models/post_spec.rb +63 -0
  576. data/spec/models/profile_spec.rb +39 -0
  577. data/spec/models/relation_spec.rb +78 -0
  578. data/spec/models/tie_spec.rb +169 -0
  579. data/spec/models/user_spec.rb +109 -0
  580. data/spec/social_stream_spec.rb +7 -0
  581. data/spec/spec_helper.rb +26 -0
  582. data/spec/support/cancan.rb +1 -0
  583. data/spec/support/db.rb +7 -0
  584. data/spec/support/devise.rb +4 -0
  585. data/spec/support/mock.rb +4 -0
  586. data/vendor/assets/javascripts/ajax.paginate.js +46 -0
  587. data/vendor/assets/javascripts/d3.geom.js +825 -0
  588. data/vendor/assets/javascripts/d3.js +4013 -0
  589. data/vendor/assets/javascripts/d3.layout.js +1865 -0
  590. data/vendor/assets/javascripts/hoverIntent.js +84 -0
  591. data/vendor/assets/javascripts/jqcloud-0.1.3.js +87 -0
  592. data/vendor/assets/javascripts/jquery.ae.image.resize.js +69 -0
  593. data/vendor/assets/javascripts/jquery.ba-url.js +1091 -0
  594. data/vendor/assets/javascripts/jquery.cleditor.min.js +31 -0
  595. data/vendor/assets/javascripts/jquery.fcbkcomplete.js +553 -0
  596. data/vendor/assets/javascripts/jquery.lightbox-with-resize-plugin.js +533 -0
  597. data/vendor/assets/javascripts/jquery.livequery.js +250 -0
  598. data/vendor/assets/javascripts/jquery.screw.js +186 -0
  599. data/vendor/assets/javascripts/jquery.scrollTo.min.js +11 -0
  600. data/vendor/assets/javascripts/jquery.tipsy.js +263 -0
  601. data/vendor/assets/javascripts/jquery.validate.js +1166 -0
  602. data/vendor/assets/javascripts/jquery.validate.old.js +1132 -0
  603. data/vendor/assets/javascripts/jquery.watermarkinput.js +81 -0
  604. data/vendor/assets/javascripts/menu.js +25 -0
  605. data/vendor/assets/javascripts/superfish.js +121 -0
  606. data/vendor/assets/stylesheets/carousel.css +23 -0
  607. data/vendor/assets/stylesheets/chosen-sprite.png +0 -0
  608. data/vendor/assets/stylesheets/chosen.css +317 -0
  609. data/vendor/assets/stylesheets/fcbkComplete.css +44 -0
  610. data/vendor/assets/stylesheets/jqcloud.css +15 -0
  611. data/vendor/assets/stylesheets/jquery-ui.css +620 -0
  612. data/vendor/assets/stylesheets/jquery.cleditor.css +24 -0
  613. data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  614. data/vendor/assets/stylesheets/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  615. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  616. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  617. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  618. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  619. data/vendor/assets/stylesheets/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  620. data/vendor/assets/stylesheets/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  621. data/vendor/assets/stylesheets/smoothness/images/ui-icons_222222_256x240.png +0 -0
  622. data/vendor/assets/stylesheets/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  623. data/vendor/assets/stylesheets/smoothness/images/ui-icons_454545_256x240.png +0 -0
  624. data/vendor/assets/stylesheets/smoothness/images/ui-icons_888888_256x240.png +0 -0
  625. data/vendor/assets/stylesheets/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  626. data/vendor/assets/stylesheets/smoothness/jquery-ui-1.7.3.custom.css +405 -0
  627. data/vendor/assets/stylesheets/smoothness/jquery-ui-1.8.4.custom.css +572 -0
  628. data/vendor/assets/stylesheets/tipsy.css +25 -0
  629. metadata +997 -0
@@ -0,0 +1,84 @@
1
+ (function($){
2
+ /* hoverIntent by Brian Cherne */
3
+ $.fn.hoverIntent = function(f,g) {
4
+ // default configuration options
5
+ var cfg = {
6
+ sensitivity: 7,
7
+ interval: 100,
8
+ timeout: 0
9
+ };
10
+ // override configuration options with user supplied object
11
+ cfg = $.extend(cfg, g ? { over: f, out: g } : f );
12
+
13
+ // instantiate variables
14
+ // cX, cY = current X and Y position of mouse, updated by mousemove event
15
+ // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
16
+ var cX, cY, pX, pY;
17
+
18
+ // A private function for getting mouse position
19
+ var track = function(ev) {
20
+ cX = ev.pageX;
21
+ cY = ev.pageY;
22
+ };
23
+
24
+ // A private function for comparing current and previous mouse position
25
+ var compare = function(ev,ob) {
26
+ ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
27
+ // compare mouse positions to see if they've crossed the threshold
28
+ if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
29
+ $(ob).unbind("mousemove",track);
30
+ // set hoverIntent state to true (so mouseOut can be called)
31
+ ob.hoverIntent_s = 1;
32
+ return cfg.over.apply(ob,[ev]);
33
+ } else {
34
+ // set previous coordinates for next time
35
+ pX = cX; pY = cY;
36
+ // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
37
+ ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
38
+ }
39
+ };
40
+
41
+ // A private function for delaying the mouseOut function
42
+ var delay = function(ev,ob) {
43
+ ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
44
+ ob.hoverIntent_s = 0;
45
+ return cfg.out.apply(ob,[ev]);
46
+ };
47
+
48
+ // A private function for handling mouse 'hovering'
49
+ var handleHover = function(e) {
50
+ // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
51
+ var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
52
+ while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
53
+ if ( p == this ) { return false; }
54
+
55
+ // copy objects to be passed into t (required for event object to be passed in IE)
56
+ var ev = jQuery.extend({},e);
57
+ var ob = this;
58
+
59
+ // cancel hoverIntent timer if it exists
60
+ if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
61
+
62
+ // else e.type == "onmouseover"
63
+ if (e.type == "mouseover") {
64
+ // set "previous" X and Y position based on initial entry point
65
+ pX = ev.pageX; pY = ev.pageY;
66
+ // update "current" X and Y position based on mousemove
67
+ $(ob).bind("mousemove",track);
68
+ // start polling interval (self-calling timeout) to compare mouse coordinates over time
69
+ if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
70
+
71
+ // else e.type == "onmouseout"
72
+ } else {
73
+ // unbind expensive mousemove event
74
+ $(ob).unbind("mousemove",track);
75
+ // if hoverIntent state is true, then call the mouseOut function after the specified delay
76
+ if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
77
+ }
78
+ };
79
+
80
+ // bind the function to the two event listeners
81
+ return this.mouseover(handleHover).mouseout(handleHover);
82
+ };
83
+
84
+ })(jQuery);
@@ -0,0 +1,87 @@
1
+ /*!
2
+ * jQCloud Plugin for jQuery
3
+ *
4
+ * Version 0.1.3
5
+ *
6
+ * Copyright 2011, Luca Ongaro
7
+ * Licensed under the MIT license.
8
+ *
9
+ * Date: Wed Feb 16 11:41:32 2011 +0100
10
+ */
11
+ (function( $ ){
12
+ $.fn.jQCloud = function(word_array, callback_function) {
13
+ // Reference to the container element
14
+ var $this = this;
15
+
16
+ var drawWordCloud = function() {
17
+ // Helper function to test if an element overlaps others
18
+ var hitTest = function(elem, other_elems){
19
+ // Pairwise overlap detection
20
+ var overlapping = function(a, b){
21
+ if (Math.abs(2.0*a.offsetLeft + a.offsetWidth - 2.0*b.offsetLeft - b.offsetWidth) < a.offsetWidth + b.offsetWidth) {
22
+ if (Math.abs(2.0*a.offsetTop + a.offsetHeight - 2.0*b.offsetTop - b.offsetHeight) < a.offsetHeight + b.offsetHeight) {
23
+ return true;
24
+ }
25
+ }
26
+ return false;
27
+ };
28
+ var i = 0;
29
+ // Check elements for overlap one by one, stop and return false as soon as an overlap is found
30
+ for(i = 0; i < other_elems.length; i++) {
31
+ if (overlapping(elem, other_elems[i])) {
32
+ return true;
33
+ }
34
+ }
35
+ return false;
36
+ };
37
+
38
+ // Sort word_array from the word with the highest weight to the one with the lowest
39
+ word_array.sort(function(a, b) { if (a.weight < b.weight) {return 1;} else if (a.weight > b.weight) {return -1;} else {return 0;} });
40
+
41
+ var step = 2.0;
42
+ var already_placed_words = [];
43
+ var aspect_ratio = $this.width() / $this.height();
44
+ var origin_x = $this.width() / 2.0;
45
+ var origin_y = $this.height() / 2.0;
46
+
47
+ // Move each word in spiral until it finds a suitable empty place
48
+ $.each(word_array, function(index, word) {
49
+ var angle = 6.28 * Math.random();
50
+ var radius = 0.0;
51
+ // Linearly map the original weight to a discrete scale from 1 to 10
52
+ var weight = Math.round((word.weight - word_array[word_array.length - 1].weight)/(word_array[0].weight - word_array[word_array.length - 1].weight) * 9.0) + 1;
53
+
54
+ var inner_html = word.url !== undefined ? "<a href='" + word.url + "'>" + word.text + "</a></span>" : word.text;
55
+ $this.append("<span id='word_" + index + "' class='w" + weight + "' title='" + (word.title || "") + "'>" + inner_html + "</span>");
56
+
57
+ var width = $("#word_" + index).width();
58
+ var height = $("#word_" + index).height();
59
+ var left = origin_x - width / 2.0;
60
+ var top = origin_y - height / 2.0;
61
+ $('#word_'+index).css("position", "absolute");
62
+ $('#word_'+index).css("left", left + "px");
63
+ $('#word_'+index).css("top", top + "px");
64
+
65
+ while(hitTest(document.getElementById("word_"+index), already_placed_words)) {
66
+ radius += step;
67
+ angle += (index % 2 === 0 ? 1 : -1)*step;
68
+
69
+ left = origin_x + (radius*Math.cos(angle) - (width / 2.0)) * aspect_ratio;
70
+ top = origin_y + radius*Math.sin(angle) - (height / 2.0);
71
+
72
+ $('#word_' + index).css('left', left + "px");
73
+ $('#word_' + index).css('top', top + "px");
74
+ }
75
+ already_placed_words.push(document.getElementById("word_"+index));
76
+ });
77
+
78
+ if (typeof callback_function === 'function') {
79
+ callback_function.call(this);
80
+ }
81
+ };
82
+
83
+ // Delay execution so that the browser can render the page before the computatively intensive word cloud drawing
84
+ setTimeout(function(){drawWordCloud();}, 100);
85
+ return this;
86
+ };
87
+ })(jQuery);
@@ -0,0 +1,69 @@
1
+ (function( $ ) {
2
+
3
+ $.fn.aeImageResize = function( params ) {
4
+
5
+ var aspectRatio = 0
6
+ // Nasty I know but it's done only once, so not too bad I guess
7
+ // Alternate suggestions welcome :)
8
+ , isIE6 = $.browser.msie && (6 == ~~ $.browser.version)
9
+ ;
10
+
11
+ // We cannot do much unless we have one of these
12
+ if ( !params.height && !params.width ) {
13
+ return this;
14
+ }
15
+
16
+ // Calculate aspect ratio now, if possible
17
+ if ( params.height && params.width ) {
18
+ aspectRatio = params.width / params.height;
19
+ }
20
+
21
+ // Attach handler to load
22
+ // Handler is executed just once per element
23
+ // Load event required for Webkit browsers
24
+ return this.one( "load", function() {
25
+
26
+ // Remove all attributes and CSS rules
27
+ this.removeAttribute( "height" );
28
+ this.removeAttribute( "width" );
29
+ this.style.height = this.style.width = "";
30
+
31
+ var imgHeight = this.height
32
+ , imgWidth = this.width
33
+ , imgAspectRatio = imgWidth / imgHeight
34
+ , bxHeight = params.height
35
+ , bxWidth = params.width
36
+ , bxAspectRatio = aspectRatio;
37
+
38
+ // Work the magic!
39
+ // If one parameter is missing, we just force calculate it
40
+ if ( !bxAspectRatio ) {
41
+ if ( bxHeight ) {
42
+ bxAspectRatio = imgAspectRatio + 1;
43
+ } else {
44
+ bxAspectRatio = imgAspectRatio - 1;
45
+ }
46
+ }
47
+
48
+ // Only resize the images that need resizing
49
+ if ( (bxHeight && imgHeight > bxHeight) || (bxWidth && imgWidth > bxWidth) ) {
50
+
51
+ if ( imgAspectRatio > bxAspectRatio ) {
52
+ bxHeight = ~~ ( imgHeight / imgWidth * bxWidth );
53
+ } else {
54
+ bxWidth = ~~ ( imgWidth / imgHeight * bxHeight );
55
+ }
56
+
57
+ this.height = bxHeight;
58
+ this.width = bxWidth;
59
+ }
60
+ })
61
+ .each(function() {
62
+
63
+ // Trigger load event (for Gecko and MSIE)
64
+ if ( this.complete || isIE6 ) {
65
+ $( this ).trigger( "load" );
66
+ }
67
+ });
68
+ };
69
+ })( jQuery );
@@ -0,0 +1,1091 @@
1
+ /*!
2
+ * URL Utils - v1.11 - 9/10/2009
3
+ * http://benalman.com/
4
+ *
5
+ * Copyright (c) 2009 "Cowboy" Ben Alman
6
+ * Licensed under the MIT license
7
+ * http://benalman.com/about/license/
8
+ */
9
+
10
+ // Script: URL Utils
11
+ //
12
+ // Version: 1.11, Date: 9/10/2009
13
+ //
14
+ // Tested with jQuery 1.3.2 in Internet Explorer 6-8, Firefox 3-3.6a,
15
+ // Safari 3-4, Chrome, Opera 9.6.
16
+ //
17
+ // Home - http://benalman.com/projects/jquery-url-utils-plugin/
18
+ // Source - http://benalman.com/code/javascript/jquery/jquery.ba-url.js
19
+ // (Minified) - http://benalman.com/code/javascript/jquery/jquery.ba-url.min.js (3.9kb)
20
+ // Unit Tests - http://benalman.com/code/unittest/url.html
21
+ //
22
+ // About: License
23
+ //
24
+ // Copyright (c) 2009 "Cowboy" Ben Alman
25
+ //
26
+ // Licensed under the MIT license
27
+ //
28
+ // http://benalman.com/about/license/
29
+ //
30
+ // About: Revision History
31
+ //
32
+ // 1.11 - Minor bugfix for Firefox 3.0+
33
+ // 1.1 - Added support for onhashchange event
34
+ // 1.0 - Initial release
35
+
36
+ (function($) {
37
+ '$:nomunge'; // Used by YUI compressor.
38
+
39
+ var url_regexp,
40
+ tag_attributes = {},
41
+
42
+ // A few constants.
43
+ undefined,
44
+ window = this,
45
+ TRUE = true,
46
+ FALSE = false,
47
+ has_onhashchange = 'onhashchange' in window,
48
+
49
+ // Some convenient shortcuts.
50
+ aps = Array.prototype.slice,
51
+ loc = document.location,
52
+
53
+ // Internal plugin method references.
54
+ p_urlTagAttrList,
55
+ p_urlInternalHost,
56
+ p_urlInternalRegExp,
57
+ p_isUrlInternal,
58
+ p_isUrlExternal,
59
+ p_urlFilter,
60
+ p_urlFilterSelector,
61
+ p_setFragment,
62
+
63
+ // Reused internal strings.
64
+ str_urlInternal = 'urlInternal',
65
+ str_urlExternal = 'urlExternal',
66
+ str_queryString = 'queryString',
67
+ str_fragment = 'fragment',
68
+ str_update = 'update',
69
+ str_passQueryString = 'passQueryString',
70
+ str_passFragment = 'passFragment',
71
+ str_fragmentChange = 'fragmentChange',
72
+ str_hashchange = 'hashchange.' + str_fragmentChange,
73
+
74
+ // fragmentChange event handler
75
+ timeout_id,
76
+ last_fragment;
77
+
78
+
79
+ // A few commonly used bits, broken out to help reduce minified file size.
80
+
81
+ function is_string( arg ) {
82
+ return typeof arg === 'string';
83
+ };
84
+
85
+ function is_object( arg ) {
86
+ return typeof arg === 'object';
87
+ };
88
+
89
+ function curry() {
90
+ var args = aps.call( arguments ),
91
+ func = args.shift();
92
+
93
+ return function() {
94
+ return func.apply( this, args.concat( aps.call( arguments ) ) );
95
+ };
96
+ };
97
+
98
+ // Work-around for an annoying Firefox bug where document.location.hash gets
99
+ // urldecoded by default.
100
+
101
+ function get_fragment() {
102
+ return loc.href.replace( /^[^#]*#?/, '' );
103
+ };
104
+
105
+
106
+ // Method: jQuery.urlTagAttrList
107
+ //
108
+ // Get the internal "Default URL attribute per tag" list, or augment the list
109
+ // with additional tag-attribute pairs, in case the defaults are insufficient.
110
+ //
111
+ // This list contains the default attributes for the <jQuery.fn.urlInternal>
112
+ // and <jQuery.fn.urlExternal> methods, as well as the <:urlInternal> and
113
+ // <:urlExternal> selector filters, to determine which URL will be tested for
114
+ // internal- or external-ness. In the <jQuery.fn.queryString>,
115
+ // <jQuery.fn.fragment>, <jQuery.fn.passQueryString> and
116
+ // <jQuery.fn.passFragment> methods, this list is used to determine which URL
117
+ // will be modified.
118
+ //
119
+ // Default List:
120
+ //
121
+ // TAG - URL ATTRIBUTE
122
+ // a - href
123
+ // img - src
124
+ // form - action
125
+ // base - href
126
+ // script - src
127
+ // iframe - src
128
+ // link - href
129
+ //
130
+ // Usage:
131
+ //
132
+ // jQuery.urlTagAttrList( [ tag_attr_obj ] ); - -
133
+ //
134
+ // Arguments:
135
+ //
136
+ // tag_attr_obj - (Object) An list of tag names and associated default
137
+ // attribute names in the format { tag: 'attr', tag: 'attr', ... }.
138
+ //
139
+ // Returns:
140
+ //
141
+ // (Object) The current internal "Default URL attribute per tag" list.
142
+
143
+ $.urlTagAttrList = p_urlTagAttrList = function( attr_obj ) {
144
+ return $.extend( tag_attributes, attr_obj );
145
+ };
146
+
147
+ // Initialize the tag_attributes object with some reasonable defaults.
148
+
149
+ p_urlTagAttrList({
150
+ a: 'href',
151
+ img: 'src',
152
+ form: 'action',
153
+ base: 'href',
154
+ script: 'src',
155
+ iframe: 'src',
156
+ link: 'href'
157
+ });
158
+
159
+ // Get the default attribute for the specified DOM element, if it exists.
160
+
161
+ function get_attr( elem ) {
162
+ var n = elem.nodeName;
163
+ return n ? tag_attributes[ n.toLowerCase() ] : '';
164
+ };
165
+
166
+
167
+ // Section: URL Internal / External
168
+ //
169
+ // Method: jQuery.urlInternalHost
170
+ //
171
+ // Constructs the regular expression that matches an absolute-but-internal
172
+ // URL from the current page's protocol, hostname and port, allowing for
173
+ // an optional hostname (if specified). For example, if the current page is
174
+ // http://benalman.com/anything, specifying an alt_hostname of 'www' would
175
+ // yield this pattern:
176
+ //
177
+ // > /^http:\/\/(?:www\.)?benalman.com\//i
178
+ //
179
+ // This pattern will match URLs beginning with both http://benalman.com/ and
180
+ // http://www.benalman.com/. Specifying an empty alt_hostname will disable any
181
+ // alt-hostname matching.
182
+ //
183
+ // Note that the plugin is initialized by default to an alt_hostname of 'www'.
184
+ // Should you need more control, <jQuery.urlInternalRegExp> may be used to
185
+ // completely override this absolute-but-internal matching pattern.
186
+ //
187
+ // Usage:
188
+ //
189
+ // jQuery.urlInternalHost( [ alt_hostname ] ); - -
190
+ //
191
+ // Arguments:
192
+ //
193
+ // alt_hostname - (String) An optional alternate hostname to use when testing
194
+ // URL absolute-but-internal-ness.
195
+ //
196
+ // Returns:
197
+ //
198
+ // (RegExp) The absolute-but-internal pattern, as a RegExp.
199
+
200
+ $.urlInternalHost = p_urlInternalHost = function( alt_hostname ) {
201
+ alt_hostname = alt_hostname
202
+ ? '(?:' + alt_hostname + '\\.)?'
203
+ : '';
204
+
205
+ var re = new RegExp( '^' + alt_hostname + '(.*)', 'i' ),
206
+ pattern = '^' + loc.protocol + '//'
207
+ + loc.hostname.replace(re, alt_hostname + '$1')
208
+ //+ 'benalman.com'.replace(re, alt_hostname + '$1') // For testing on stage.benalman.com
209
+ + (loc.port ? ':' + loc.port : '') + '/';
210
+
211
+ return p_urlInternalRegExp( pattern );
212
+ };
213
+
214
+
215
+ // Method: jQuery.urlInternalRegExp
216
+ //
217
+ // Set or get the regular expression that matches an absolute-but-internal
218
+ // URL.
219
+ //
220
+ // Usage:
221
+ //
222
+ // jQuery.urlInternalRegExp( [ re ] ); - -
223
+ //
224
+ // Arguments:
225
+ //
226
+ // re - (String or RegExp) The regular expression pattern. If not passed,
227
+ // nothing is changed.
228
+ //
229
+ // Returns:
230
+ //
231
+ // (RegExp) The absolute-but-internal pattern, as a RegExp.
232
+
233
+ $.urlInternalRegExp = p_urlInternalRegExp = function( re ) {
234
+ if ( re ) {
235
+ url_regexp = is_string( re )
236
+ ? new RegExp( re, 'i' )
237
+ : re;
238
+ }
239
+
240
+ return url_regexp;
241
+ };
242
+
243
+
244
+ // Initialize url_regexp with a reasonable default.
245
+
246
+ p_urlInternalHost( 'www' );
247
+
248
+
249
+ // Method: jQuery.isUrlInternal
250
+ //
251
+ // Test whether or not a URL is internal. Non-navigating URLs (ie. #anchor,
252
+ // javascript:, mailto:, news:, tel:, im: or non-http/-https protocol://
253
+ // links) are not considered internal.
254
+ //
255
+ // Usage:
256
+ //
257
+ // jQuery.isUrlInternal( url ); - -
258
+ //
259
+ // Arguments:
260
+ //
261
+ // url - (String) a URL to test the internal-ness of.
262
+ //
263
+ // Returns:
264
+ //
265
+ // (Boolean) true if the URL is internal, false if external, or undefined if
266
+ // the URL is non-navigating.
267
+
268
+ $.isUrlInternal = p_isUrlInternal = function( url ) {
269
+
270
+ // non-navigating: url is nonexistent
271
+ if ( !url ) { return undefined; }
272
+
273
+ // internal: url is absolute-but-internal (see $.urlInternalRegExp)
274
+ if ( url_regexp.test(url) ) { return TRUE; }
275
+
276
+ // external: url is absolute (begins with http:// or https://)
277
+ if ( /^https?:\/\//i.test(url) ) { return FALSE; }
278
+
279
+ // non-navigating: url begins with # or scheme:
280
+ if ( /^(?:#|[a-z\d.-]+:)/i.test(url) ) { return undefined; }
281
+
282
+ return TRUE;
283
+ };
284
+
285
+
286
+ // Method: jQuery.isUrlExternal
287
+ //
288
+ // Test whether or not a URL is external. Non-navigating URLs (ie. #anchor,
289
+ // mailto:, javascript:, or non-http/-https protocol:// links) are not
290
+ // considered external.
291
+ //
292
+ // Usage:
293
+ //
294
+ // jQuery.isUrlExternal( url ); - -
295
+ //
296
+ // Arguments:
297
+ //
298
+ // url - (String) a URL to test the external-ness of.
299
+ //
300
+ // Returns:
301
+ //
302
+ // (Boolean) true if the URL is external, false if internal, or undefined if
303
+ // the URL is non-navigating.
304
+
305
+ $.isUrlExternal = p_isUrlExternal = function( url ) {
306
+ var result = p_isUrlInternal( url );
307
+
308
+ return typeof result === 'boolean'
309
+ ? !result
310
+ : result;
311
+ };
312
+
313
+
314
+ // Method: jQuery.fn.urlInternal
315
+ //
316
+ // Filter a jQuery collection of elements, returning only elements that have
317
+ // an internal URL (as determined by <jQuery.isUrlInternal>). If URL cannot
318
+ // be determined, remove the element from the collection.
319
+ //
320
+ // Usage:
321
+ //
322
+ // jQuery('selector').urlInternal( [ attr ] ); - -
323
+ //
324
+ // Arguments:
325
+ //
326
+ // attr - (String) Optional name of an attribute that will contain a URL to
327
+ // test internal-ness against. See <jQuery.urlTagAttrList> for a list of
328
+ // default attributes.
329
+ //
330
+ // Returns:
331
+ //
332
+ // (jQuery) A filtered jQuery collection of elements.
333
+
334
+ // Method: jQuery.fn.urlExternal
335
+ //
336
+ // Filter a jQuery collection of elements, returning only elements that have
337
+ // an external URL (as determined by <jQuery.isUrlExternal>). If URL cannot
338
+ // be determined, remove the element from the collection.
339
+ //
340
+ // Usage:
341
+ //
342
+ // jQuery('selector').urlExternal( [ attr ] ); - -
343
+ //
344
+ // Arguments:
345
+ //
346
+ // attr - (String) Optional name of an attribute that will contain a URL to
347
+ // test external-ness against. See <jQuery.urlTagAttrList> for a list of
348
+ // default attributes.
349
+ //
350
+ // Returns:
351
+ //
352
+ // (jQuery) A filtered jQuery collection of elements.
353
+
354
+ p_urlFilter = function( selector, attr ) {
355
+ return this.filter( ':' + selector + (attr ? '(' + attr + ')' : '') );
356
+ };
357
+
358
+ $.fn[str_urlInternal] = curry( p_urlFilter, str_urlInternal );
359
+ $.fn[str_urlExternal] = curry( p_urlFilter, str_urlExternal );
360
+
361
+
362
+ // Method: :urlInternal
363
+ //
364
+ // Filter a jQuery collection of elements, returning only elements that have
365
+ // an internal URL (as determined by <jQuery.isUrlInternal>). If URL cannot
366
+ // be determined, remove the element from the collection.
367
+ //
368
+ // Usage:
369
+ //
370
+ // jQuery('selector').filter(':urlInternal'); - -
371
+ // jQuery('selector').filter(':urlInternal(attr)'); - -
372
+ //
373
+ // Arguments:
374
+ //
375
+ // attr - (String) Optional name of an attribute that will contain a URL to
376
+ // test internal-ness against. See <jQuery.urlTagAttrList> for a list of
377
+ // default attributes.
378
+ //
379
+ // Returns:
380
+ //
381
+ // (jQuery) A filtered jQuery collection of elements.
382
+
383
+ // Method: :urlExternal
384
+ //
385
+ // Filter a jQuery collection of elements, returning only elements that have
386
+ // an external URL (as determined by <jQuery.isUrlExternal>). If URL cannot
387
+ // be determined, remove the element from the collection.
388
+ //
389
+ // Usage:
390
+ //
391
+ // jQuery('selector').filter(':urlExternal'); - -
392
+ // jQuery('selector').filter(':urlExternal(attr)'); - -
393
+ //
394
+ // Arguments:
395
+ //
396
+ // attr - (String) Optional name of an attribute that will contain a URL to
397
+ // test external-ness against. See <jQuery.urlTagAttrList> for a list of
398
+ // default attributes.
399
+ //
400
+ // Returns:
401
+ //
402
+ // (jQuery) A filtered jQuery collection of elements.
403
+
404
+ p_urlFilterSelector = function( func, elem, i, match ) {
405
+ var a = match[3] || get_attr( elem );
406
+
407
+ return a ? !!func( $(elem).attr(a) ) : FALSE;
408
+ };
409
+
410
+ $.expr[':'][str_urlInternal] = curry( p_urlFilterSelector, p_isUrlInternal );
411
+ $.expr[':'][str_urlExternal] = curry( p_urlFilterSelector, p_isUrlExternal );
412
+
413
+
414
+ // Section: URL Query String / Fragment
415
+ //
416
+ // Method: jQuery.queryString (deserialize)
417
+ //
418
+ // Deserialize any params string or the current document's query string into
419
+ // an object. Multiple sequential values will be converted into an array, ie.
420
+ // 'n=a&n=b&n=c' -> { n: ['a', 'b', 'c'] }.
421
+ //
422
+ // Usage:
423
+ //
424
+ // jQuery.queryString( [ params_str ] [ , cast_values ] ); - -
425
+ //
426
+ // Arguments:
427
+ //
428
+ // params_str - (String) A stand-alone params string or a URL containing
429
+ // params to be deserialized. If omitted, defaults to the current page
430
+ // query string (document.location.search).
431
+ // cast_values - (Boolean) If true, converts any numbers or true, false,
432
+ // null, and undefined to their appropriate literal. Defaults to false.
433
+ //
434
+ // Returns:
435
+ //
436
+ // (Object) The deserialized params string.
437
+
438
+ // Method: jQuery.queryString (serialize)
439
+ //
440
+ // Serialize an object into a params string. Arrays will be converted to
441
+ // multiple sequential values, ie. { n: ['a', 'b', 'c'] } -> 'n=a&n=b&n=c'
442
+ // (this method is just a wrapper for jQuery.param).
443
+ //
444
+ // Usage:
445
+ //
446
+ // jQuery.queryString( params_obj ); - -
447
+ //
448
+ // Arguments:
449
+ //
450
+ // params_obj - (Object) An object to be serialized. Note: A JSON string (or
451
+ // some analog) should be used for deep structures, since nested data
452
+ // structures other than shallow arrays can't be serialized into a query
453
+ // string in a meaningful way.
454
+ //
455
+ // Returns:
456
+ //
457
+ // (String) A params string with urlencoded data in the format 'a=b&c=d&e=f'.
458
+
459
+ // Method: jQuery.queryString (build url)
460
+ //
461
+ // Merge a URL (with or without a pre-existing params) plus any object or
462
+ // params string into a new URL.
463
+ //
464
+ // Usage:
465
+ //
466
+ // jQuery.queryString( url, params [ , merge_mode ] ); - -
467
+ //
468
+ // Arguments:
469
+ //
470
+ // url - (String) A valid URL, optionally containing a query string and/or
471
+ // #anchor, or fragment.
472
+ // params - (String or Object) Either a serialized params string or a data
473
+ // object to be merged into the URL.
474
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
475
+ // specified, and is as-follows:
476
+ //
477
+ // * 0: params argument will override any params in url.
478
+ // * 1: any params in url will override params argument.
479
+ // * 2: params argument will completely replace any params in url.
480
+ //
481
+ // Returns:
482
+ //
483
+ // (String) A URL with urlencoded params in the format 'url?a=b&c=d&e=f'.
484
+
485
+ // Method: jQuery.fragment (deserialize)
486
+ //
487
+ // Deserialize any params string or the current document's fragment into an
488
+ // object. Multiple sequential values will be converted into an array, ie.
489
+ // 'n=a&n=b&n=c' -> { n: ['a', 'b', 'c'] }.
490
+ //
491
+ // Usage:
492
+ //
493
+ // jQuery.fragment( [ params_str ] [ , cast_values ] ); - -
494
+ //
495
+ // Arguments:
496
+ //
497
+ // params_str - (String) A stand-alone params string or a URL containing
498
+ // params to be deserialized. If omitted, defaults to the current page
499
+ // fragment (document.location.hash).
500
+ // cast_values - (Boolean) If true, converts any numbers or true, false,
501
+ // null, and undefined to their appropriate literal. Defaults to false.
502
+ //
503
+ // Returns:
504
+ //
505
+ // (Object) The deserialized params string.
506
+
507
+ // Method: jQuery.fragment (serialize)
508
+ //
509
+ // Serialize an object into a params string. Arrays will be converted to
510
+ // multiple sequential values, ie. { n: ['a', 'b', 'c'] } -> 'n=a&n=b&n=c'
511
+ // (this method is just a wrapper for jQuery.param).
512
+ //
513
+ // Usage:
514
+ //
515
+ // jQuery.fragment( params_obj ); - -
516
+ //
517
+ // Arguments:
518
+ //
519
+ // params_obj - (Object) An object to be serialized. Note: A JSON string (or
520
+ // some analog) should be used for deep structures, since nested data
521
+ // structures other than shallow arrays can't be serialized into a query
522
+ // string in a meaningful way.
523
+ //
524
+ // Returns:
525
+ //
526
+ // (String) A params string with urlencoded data in the format 'a=b&c=d&e=f'.
527
+
528
+ // Method: jQuery.fragment (build url)
529
+ //
530
+ // Merge a URL (with or without a pre-existing params) plus any object or
531
+ // params string into a new URL.
532
+ //
533
+ // Usage:
534
+ //
535
+ // jQuery.fragment( url, params [ , merge_mode ] ); - -
536
+ //
537
+ // Arguments:
538
+ //
539
+ // url - (String) A valid URL, optionally containing a query string and/or
540
+ // #anchor, or fragment.
541
+ // params - (String or Object) Either a serialized params string or a data
542
+ // object to be merged into the URL.
543
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
544
+ // specified, and is as-follows:
545
+ //
546
+ // * 0: params argument will override any params in url.
547
+ // * 1: any params in url will override params argument.
548
+ // * 2: params argument will completely replace any params in url.
549
+ //
550
+ // Returns:
551
+ //
552
+ // (String) A URL with urlencoded params in the format 'url#a=b&c=d&e=f'.
553
+
554
+ function p_params( fragment_mode, arg0, arg1, arg2 ) {
555
+ var params;
556
+
557
+ if ( is_string(arg1) || is_object(arg1) ) {
558
+ // Build URL.
559
+ return build_url( arg0, arg1, arg2, fragment_mode );
560
+
561
+ } else if ( is_object(arg0) ) {
562
+ // Serialize.
563
+ return $.param( arg0 );
564
+
565
+ } else if ( is_string(arg0) ) {
566
+ // Deserialize.
567
+ return deserialize( arg0, arg1, fragment_mode );
568
+
569
+ } else {
570
+ // Deserialize document query string / fragment.
571
+ params = fragment_mode
572
+ ? get_fragment()
573
+ : loc.search;
574
+
575
+ return deserialize( params, arg0, fragment_mode );
576
+ }
577
+ };
578
+
579
+ $[str_queryString] = curry( p_params, 0 );
580
+ $[str_fragment] = curry( p_params, 1 );
581
+
582
+ // Method: jQuery.fn.queryString
583
+ //
584
+ // Update URL attribute in one or more elements, merging the current URL (with
585
+ // or without pre-existing params) plus any object or params string into a new
586
+ // URL, which is then set into that attribute. Like <jQuery.queryString (build
587
+ // url)>, but for all elements in a jQuery collection.
588
+ //
589
+ // Usage:
590
+ //
591
+ // jQuery('selector').queryString( [ attr, ] params [ , merge_mode ] ); - -
592
+ //
593
+ // Arguments:
594
+ //
595
+ // attr - (String) Optional name of an attribute that will contain a URL to
596
+ // merge params into. See <jQuery.urlTagAttrList> for a list of default
597
+ // attributes.
598
+ // params - (String or Object) Either a serialized params string or a data
599
+ // object to be merged into the URL.
600
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
601
+ // specified, and is as-follows:
602
+ //
603
+ // * 0: params argument will override any params in attr URL.
604
+ // * 1: any params in attr URL will override params argument.
605
+ // * 2: params argument will completely replace any params in attr URL.
606
+ //
607
+ // Returns:
608
+ //
609
+ // (jQuery) The initial jQuery collection of elements, but with modified URL
610
+ // attribute values.
611
+
612
+ // Method: jQuery.fn.fragment
613
+ //
614
+ // Update URL attribute in one or more elements, merging the current URL (with
615
+ // or without pre-existing params) plus any object or params string into a new
616
+ // URL, which is then set into that attribute. Like <jQuery.fragment (build
617
+ // url)>, but for all elements in a jQuery collection.
618
+ //
619
+ // Usage:
620
+ //
621
+ // jQuery('selector').fragment( [ attr, ] params [ , merge_mode ] ); - -
622
+ //
623
+ // Arguments:
624
+ //
625
+ // attr - (String) Optional name of an attribute that will contain a URL to
626
+ // merge params into. See <jQuery.urlTagAttrList> for a list of default
627
+ // attributes.
628
+ // params - (String or Object) Either a serialized params string or a data
629
+ // object to be merged into the URL.
630
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
631
+ // specified, and is as-follows:
632
+ //
633
+ // * 0: params argument will override any params in attr URL.
634
+ // * 1: any params in attr URL will override params argument.
635
+ // * 2: params argument will completely replace any params in attr URL.
636
+ //
637
+ // Returns:
638
+ //
639
+ // (jQuery) The initial jQuery collection of elements, but with modified URL
640
+ // attribute values.
641
+
642
+ function p_fn_params() {
643
+ var attr,
644
+ params,
645
+ merge_mode,
646
+ args = aps.call( arguments ),
647
+ fragment_mode = args.shift();
648
+
649
+ if ( is_string(args[1]) || is_object(args[1]) ) {
650
+ attr = args.shift();
651
+ }
652
+ params = args.shift();
653
+ merge_mode = args.shift();
654
+
655
+ return this.each(function(){
656
+
657
+ var that = $(this),
658
+ a = attr || get_attr( this ),
659
+ url = a && that.attr( a ) || '';
660
+
661
+ url = p_params( fragment_mode, url, params, merge_mode );
662
+ that.attr( a, url );
663
+
664
+ });
665
+ };
666
+
667
+ $.fn[str_queryString] = curry( p_fn_params, 0 );
668
+ $.fn[str_fragment] = curry( p_fn_params, 1 );
669
+
670
+ // Method: jQuery.passQueryString
671
+ //
672
+ // Merge a URL (with or without pre-existing params) plus the document query
673
+ // string into a new URL, optionally omitting specified params or parsing the
674
+ // document params with a callback function pre-merge.
675
+ //
676
+ // Usage:
677
+ //
678
+ // jQuery.passQueryString( url [ , parse ] [ , merge_mode ] ); - -
679
+ //
680
+ // Arguments:
681
+ //
682
+ // url - (String) A valid URL, optionally containing a query string and/or
683
+ // #anchor, or fragment.
684
+ // parse - (Array or Function) An optional array of key names to -not- merge
685
+ // into the URL, or a function that returns the object that will be merged
686
+ // into url (the document params are deserialized and passed to this
687
+ // function as its only argument).
688
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
689
+ // specified, and is as-follows:
690
+ //
691
+ // * 0: document params will override any params in url.
692
+ // * 1: any params in url will override document params.
693
+ // * 2: document params will completely replace any params in url.
694
+ //
695
+ // Returns:
696
+ //
697
+ // (String) A URL with urlencoded params in the format 'url?a=b&c=d&e=f'.
698
+
699
+ // Method: jQuery.passFragment
700
+ //
701
+ // Merge a URL (with or without pre-existing params) plus the document
702
+ // fragment into a new URL, optionally omitting specified params or parsing
703
+ // the document params with a callback function pre-merge.
704
+ //
705
+ // Usage:
706
+ //
707
+ // jQuery.passFragment( url [ , parse ] [ , merge_mode ] ); - -
708
+ //
709
+ // Arguments:
710
+ //
711
+ // url - (String) A valid URL, optionally containing a query string and/or
712
+ // #anchor, or fragment.
713
+ // parse - (Array or Function) An optional array of key names to -not- merge
714
+ // into the URL, or a function that returns the object that will be merged
715
+ // into url (the document params are deserialized and passed to this
716
+ // function as its only argument).
717
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
718
+ // specified, and is as-follows:
719
+ //
720
+ // * 0: document params will override any params in url.
721
+ // * 1: any params in url will override document params.
722
+ // * 2: document params will completely replace any params in url.
723
+ //
724
+ // Returns:
725
+ //
726
+ // (String) A URL with urlencoded params in the format 'url#a=b&c=d&e=f'.
727
+
728
+ function p_passParams() {
729
+ var args = aps.call( arguments ),
730
+ fragment_mode = args.shift(),
731
+ url = args.shift(),
732
+ params = p_params( fragment_mode );
733
+
734
+ if ( $.isFunction(args[0]) ) {
735
+ params = args.shift()( params );
736
+ } else if ( $.isArray(args[0]) ) {
737
+ $.each(args.shift(), function(i,v){
738
+ delete params[v];
739
+ });
740
+ }
741
+
742
+ return p_params( fragment_mode, url, params, args.shift() );
743
+ };
744
+
745
+ $[str_passQueryString] = curry( p_passParams, 0 );
746
+ $[str_passFragment] = curry( p_passParams, 1 );
747
+
748
+
749
+ // Method: jQuery.fn.passQueryString
750
+ //
751
+ // Update URL attribute in one or more elements, merging the current URL (with
752
+ // or without pre-existing params) plus the document query string into a new
753
+ // URL (optionally parsing the document params with a callback function
754
+ // pre-merge), which is then set into that attribute. Like
755
+ // <jQuery.passQueryString>, but for all elements in a jQuery collection.
756
+ //
757
+ // Usage:
758
+ //
759
+ // jQuery('selector').passQueryString( [ attr ] [ , parse ] [ , merge_mode ] ); - -
760
+ //
761
+ // Arguments:
762
+ //
763
+ // attr - (String) Optional name of an attribute that will contain a URL to
764
+ // merge params into. See <jQuery.urlTagAttrList> for a list of default
765
+ // attributes.
766
+ // parse - (Array or Function) An optional array of key names to -not- merge
767
+ // into the URL, or a function that returns the object that will be merged
768
+ // into url (the document params are deserialized and passed to this
769
+ // function as its only argument).
770
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
771
+ // specified, and is as-follows:
772
+ //
773
+ // * 0: document params will override any params in attr URL.
774
+ // * 1: any params in attr URL will override document params.
775
+ // * 2: document params will completely replace any params in attr URL.
776
+ //
777
+ // Returns:
778
+ //
779
+ // (jQuery) The initial jQuery collection of elements, but with modified URL
780
+ // attribute values.
781
+
782
+ // Method: jQuery.fn.passFragment
783
+ //
784
+ // Update URL attribute in one or more elements, merging the current URL (with
785
+ // or without pre-existing params) plus the document fragment into a new URL
786
+ // (optionally parsing the document params with a callback function
787
+ // pre-merge), which is then set into that attribute. Like
788
+ // <jQuery.passFragment>, but for all elements in a jQuery collection.
789
+ //
790
+ // Usage:
791
+ //
792
+ // jQuery('selector').passFragment( [ attr ] [ , parse ] [ , merge_mode ] ); - -
793
+ //
794
+ // Arguments:
795
+ //
796
+ // attr - (String) Optional name of an attribute that will contain a URL to
797
+ // merge params into. See <jQuery.urlTagAttrList> for a list of default
798
+ // attributes.
799
+ // parse - (Array or Function) An optional array of key names to -not- merge
800
+ // into the URL, or a function that returns the object that will be merged
801
+ // into url (the document params are deserialized and passed to this
802
+ // function as its only argument).
803
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
804
+ // specified, and is as-follows:
805
+ //
806
+ // * 0: document params will override any params in attr URL.
807
+ // * 1: any params in attr URL will override document params.
808
+ // * 2: document params will completely replace any params in attr URL.
809
+ //
810
+ // Returns:
811
+ //
812
+ // (jQuery) The initial jQuery collection of elements, but with modified URL
813
+ // attribute values.
814
+
815
+ function p_fn_passParams() {
816
+ var attr,
817
+ args = aps.call(arguments),
818
+ fragment_mode = args.shift();
819
+
820
+ if ( is_string(args[0]) ) {
821
+ attr = args.shift();
822
+ }
823
+
824
+ return this.each(function(){
825
+
826
+ var that = $(this),
827
+ a = attr || get_attr( this ),
828
+ url = a && that.attr( a ) || '';
829
+
830
+ url = p_passParams.apply( this, [fragment_mode, url].concat(args) );
831
+ that.attr( a, url );
832
+
833
+ });
834
+ };
835
+
836
+ $.fn[str_passQueryString] = curry( p_fn_passParams, 0 );
837
+ $.fn[str_passFragment] = curry( p_fn_passParams, 1 );
838
+
839
+
840
+ // Deserialize a params string, optionally preceded by a url? or ?, or
841
+ // followed by an #anchor (or if fragment_mode, optionally preceded by a url#
842
+ // or #) into an object, optionally casting numbers, null, true, false, and
843
+ // undefined values appropriately.
844
+
845
+ function deserialize( params, cast_values, fragment_mode ) {
846
+ var p,
847
+ key,
848
+ val,
849
+ obj = {},
850
+ cast_types = { 'null': null, 'true': TRUE, 'false': FALSE },
851
+ decode_uri_component = decodeURIComponent,
852
+ re = fragment_mode
853
+ ? /^.*[#]/
854
+ : /^.*[?]|#.*$/g;
855
+
856
+ params = params.replace( re, '' ).replace( /\+/g, ' ' ).split('&');
857
+
858
+ while ( params.length ) {
859
+
860
+ p = params.shift().split('=');
861
+ key = decode_uri_component( p[0] );
862
+
863
+ if ( p.length === 2 ) {
864
+ val = decode_uri_component( p[1] );
865
+
866
+ if ( cast_values ) {
867
+ if ( val && !isNaN(val) ) {
868
+ val = Number( val );
869
+ } else if ( val === 'undefined' ) {
870
+ val = undefined;
871
+ } else if ( cast_types[val] !== undefined ) {
872
+ val = cast_types[val];
873
+ }
874
+ }
875
+
876
+ if ( $.isArray(obj[key]) ) {
877
+ obj[key].push( val );
878
+ } else if ( obj[key] !== undefined ) {
879
+ obj[key] = [obj[key], val];
880
+ } else {
881
+ obj[key] = val;
882
+ }
883
+
884
+ } else if ( key ) {
885
+ obj[key] = cast_values
886
+ ? undefined
887
+ : '';
888
+ }
889
+ }
890
+
891
+ return obj;
892
+ };
893
+
894
+ // Merge a URL (with or without a pre-existing params string and/or #anchor,
895
+ // or fragment) plus any object or params string into a new URL.
896
+
897
+ function build_url( url, params, merge_mode, fragment_mode ) {
898
+ var qs,
899
+ re = fragment_mode
900
+ ? /^([^#]*)[#]?(.*)$/
901
+ : /^([^#?]*)[?]?([^#]*)(#?.*)/,
902
+ matches = url.match( re ),
903
+ url_params = deserialize( matches[2], 0, fragment_mode ),
904
+ hash = matches[3] || '';
905
+
906
+ if ( is_string(params) ) {
907
+ params = deserialize( params, 0, fragment_mode );
908
+ }
909
+
910
+ if ( merge_mode === 2 ) {
911
+ qs = params;
912
+ } else if ( merge_mode === 1 ) {
913
+ qs = $.extend( {}, params, url_params );
914
+ } else {
915
+ qs = $.extend( {}, url_params, params );
916
+ }
917
+
918
+ qs = $.param( qs );
919
+ return matches[1] + ( fragment_mode ? '#' : qs || !matches[1] ? '?' : '' ) + qs + hash;
920
+ };
921
+
922
+
923
+ // Method: jQuery.setFragment
924
+ //
925
+ // Set the document fragment. Will trigger the <fragmentChange> event if
926
+ // <jQuery.fragmentChange> has been enabled, and the new fragment is actually
927
+ // different than the previous fragment.
928
+ //
929
+ // Usage:
930
+ //
931
+ // jQuery.setFragment( [ params [ , merge_mode ] ] ); - -
932
+ //
933
+ // Arguments:
934
+ //
935
+ // params - (String or Object) Either a serialized params string or a data
936
+ // object to set as the current document's fragment. If omitted, sets the
937
+ // document fragment to # (this may cause your browser to scroll).
938
+ // merge_mode - (Number) Merge behavior defaults to 0 if merge_mode is not
939
+ // specified, and is as-follows:
940
+ //
941
+ // * 0: params argument will override any params in document fragment.
942
+ // * 1: any params in document fragment will override params argument.
943
+ // * 2: params argument will completely replace any params in document
944
+ // fragment.
945
+ //
946
+ // Returns:
947
+ //
948
+ // Nothing.
949
+
950
+ $.setFragment = p_setFragment = function( params, merge_mode ) {
951
+ var frag = is_object( params )
952
+ ? p_params( TRUE, params )
953
+ : (params || '').replace( /^#/, '' );
954
+
955
+ frag = params
956
+ ? build_url( '#' + get_fragment(), '#' + frag, merge_mode, 1 )
957
+ : '#';
958
+
959
+ //loc.hash = frag; // Safari 3 & Chrome barf if frag === '#'.
960
+ loc.href = loc.href.replace( /#.*$/, '' ) + frag;
961
+ };
962
+
963
+
964
+ // Method: jQuery.fragmentChange
965
+ //
966
+ // Enable or disable the polling loop that watches the document fragment for
967
+ // changes and triggers the <fragmentChange> event. The event object passed to
968
+ // a bound event callback has the property "fragment" which contains the
969
+ // fragment params string. Disabled by default.
970
+ //
971
+ // In browsers that support it, the onhashchange event is used (IE8, FF3.6)
972
+ //
973
+ // Note: When this is enabled for the first time, a hidden IFRAME is written
974
+ // into the body for Internet Explorer 6 and 7 to enable fragment-based
975
+ // browser history.
976
+ //
977
+ // Usage:
978
+ //
979
+ // jQuery.fragmentChange( [ state ] ); - -
980
+ //
981
+ // Arguments:
982
+ //
983
+ // state - (Boolean or Number) If true, a polling loop is started with the
984
+ // default delay of 100 and the fragmentChange event is enabled. If omitted
985
+ // or false, the polling loop is stopped and the fragmentChange event is
986
+ // disabled. A zero-or-greater numeric polling loop delay in milliseconds
987
+ // may also be specified.
988
+ //
989
+ // Returns:
990
+ //
991
+ // Nothing.
992
+
993
+ // Event: fragmentChange
994
+ //
995
+ // Fired when the document fragment changes, provided <jQuery.fragmentChange>
996
+ // has been enabled.
997
+ //
998
+ // The event object that is passed as the sole argument to the callback has a
999
+ // .fragment property, which is a URI encoded string reflecting the current
1000
+ // location.hash, with any leading # removed. Using e.fragment should be more
1001
+ // reliable than accessing location.hash directly, as only Firefox URI decodes
1002
+ // the location.hash property automatically.
1003
+ //
1004
+ // Usage:
1005
+ //
1006
+ // > $(document).bind('fragmentChange', function(e) {
1007
+ // > var fragment_str = e.fragment,
1008
+ // > fragment_obj = $.fragment();
1009
+ // > ...
1010
+ // > });
1011
+
1012
+ $[str_fragmentChange] = function( delay ) {
1013
+ if ( delay === TRUE ) { delay = 100; }
1014
+
1015
+ function trigger() {
1016
+ var event = $.Event( str_fragmentChange );
1017
+ event[str_fragment] = get_fragment();
1018
+
1019
+ $(document).trigger( event );
1020
+ };
1021
+
1022
+ has_onhashchange && $(window).unbind( str_hashchange );
1023
+
1024
+ timeout_id && clearTimeout( timeout_id );
1025
+ timeout_id = null;
1026
+
1027
+ if ( typeof delay === 'number' ) {
1028
+ if ( has_onhashchange ) {
1029
+ $(window).bind( str_hashchange, trigger );
1030
+
1031
+ } else {
1032
+ last_fragment = get_fragment();
1033
+
1034
+ if ( $.isFunction(ie_history) ) {
1035
+ ie_history = ie_history();
1036
+ }
1037
+
1038
+ (function loopy(){
1039
+ var frag = get_fragment(),
1040
+ ie_frag = ie_history[str_fragment]( last_fragment );
1041
+
1042
+ if ( frag !== last_fragment ) {
1043
+ ie_history[str_update]( frag, ie_frag );
1044
+
1045
+ last_fragment = frag;
1046
+ trigger();
1047
+
1048
+ } else if ( ie_frag !== last_fragment ) {
1049
+ p_setFragment( ie_frag, 2 );
1050
+ }
1051
+
1052
+ timeout_id = setTimeout( loopy, delay < 0 ? 0 : delay );
1053
+ })();
1054
+ }
1055
+ }
1056
+ };
1057
+
1058
+ // Handle fragment-based browser history in IE 6-7.
1059
+
1060
+ function ie_history() {
1061
+ var iframe,
1062
+ browser = $.browser,
1063
+ that = {};
1064
+
1065
+ that[str_update] = that[str_fragment] = function( val ){ return val; };
1066
+
1067
+ if ( browser.msie && browser.version < 8 ) {
1068
+
1069
+ that[str_update] = function( frag, ie_frag ) {
1070
+ var doc = iframe.document;
1071
+ if ( frag !== ie_frag ) {
1072
+ doc.open();
1073
+ doc.close();
1074
+ doc.location.hash = '#' + frag;
1075
+ }
1076
+ };
1077
+
1078
+ that[str_fragment] = function() {
1079
+ return iframe.document.location.hash.replace( /^#/, '' );
1080
+ };
1081
+
1082
+ iframe = $('<iframe/>').hide().appendTo( 'body' )
1083
+ .get(0).contentWindow;
1084
+
1085
+ that[str_update]( get_fragment() );
1086
+ }
1087
+
1088
+ return that;
1089
+ };
1090
+
1091
+ })(jQuery);