social_stream 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. data/.gitignore +1 -0
  2. data/Gemfile +5 -1
  3. data/README.rdoc +2 -2
  4. data/app/controllers/api_controller.rb +2 -1
  5. data/app/controllers/contacts_controller.rb +25 -2
  6. data/app/controllers/groups_controller.rb +12 -2
  7. data/app/controllers/notifications_controller.rb +72 -0
  8. data/app/controllers/permissions_controller.rb +10 -0
  9. data/app/controllers/relation/customs_controller.rb +8 -0
  10. data/app/controllers/spheres_controller.rb +12 -0
  11. data/app/helpers/contacts_helper.rb +24 -0
  12. data/app/helpers/location_helper.rb +26 -12
  13. data/app/helpers/notifications_helper.rb +23 -0
  14. data/app/helpers/permissions_helper.rb +16 -0
  15. data/app/helpers/profiles_helper.rb +31 -0
  16. data/app/helpers/subjects_helper.rb +0 -83
  17. data/app/helpers/toolbar_helper.rb +83 -0
  18. data/app/models/activity.rb +43 -36
  19. data/app/models/actor.rb +71 -14
  20. data/app/models/contact.rb +121 -0
  21. data/app/models/group.rb +3 -3
  22. data/app/models/permission.rb +33 -2
  23. data/app/models/relation.rb +1 -1
  24. data/app/models/relation/custom.rb +12 -1
  25. data/app/models/relation/public.rb +1 -1
  26. data/app/models/sphere.rb +3 -1
  27. data/app/models/tie.rb +35 -18
  28. data/app/views/activities/_walls.html.erb +2 -2
  29. data/app/views/api/activity_atom_feed.atom.builder +38 -38
  30. data/app/views/avatars/index.html.erb +12 -40
  31. data/app/views/comments/_new.html.erb +9 -8
  32. data/app/views/contacts/_contact.html.erb +20 -0
  33. data/app/views/contacts/_edit.html.erb +76 -0
  34. data/app/views/contacts/_form.html.erb +72 -0
  35. data/app/views/contacts/_index.html.erb +1 -1
  36. data/app/views/{ties → contacts}/_pendings.html.erb +3 -3
  37. data/app/views/{ties → contacts}/_suggestions.html.erb +5 -5
  38. data/app/views/contacts/_suggestions_and_pendings.html.erb +6 -0
  39. data/app/views/contacts/edit.html.erb +5 -0
  40. data/app/views/contacts/index.html.erb +1 -1
  41. data/app/views/contacts/new.html.erb +5 -0
  42. data/app/views/conversations/_conversation.html.erb +1 -1
  43. data/app/views/conversations/_index.html.erb +0 -5
  44. data/app/views/conversations/_show.html.erb +1 -2
  45. data/app/views/conversations/index.html.erb +4 -0
  46. data/app/views/conversations/index.js.erb +1 -0
  47. data/app/views/frontpage/index.html.erb +2 -3
  48. data/app/views/groups/_index.html.erb +5 -1
  49. data/app/views/groups/_new.html.erb +4 -3
  50. data/app/views/groups/_sidebar_index.html.erb +3 -10
  51. data/app/views/groups/_sidebar_show.html.erb +1 -9
  52. data/app/views/groups/index.html.erb +6 -8
  53. data/app/views/groups/show.html.erb +11 -4
  54. data/app/views/home/_sidebar.html.erb +1 -15
  55. data/app/views/home/index.html.erb +3 -2
  56. data/app/views/layouts/_account.html.erb +1 -1
  57. data/app/views/layouts/_flash.html.erb +5 -0
  58. data/app/views/layouts/_footer.html.erb +5 -4
  59. data/app/views/layouts/_representation.html.erb +5 -12
  60. data/app/views/layouts/application.html.erb +23 -20
  61. data/app/views/layouts/frontpage.html.erb +22 -10
  62. data/app/views/location/_location.html.erb +1 -1
  63. data/app/views/messages/_new.html.erb +0 -2
  64. data/app/views/notification_mailer/new_notification_email.html.erb +21 -0
  65. data/app/views/notification_mailer/new_notification_email.text.erb +11 -0
  66. data/app/views/notifications/_index.html.erb +21 -0
  67. data/app/views/notifications/_notification.html.erb +47 -0
  68. data/app/views/notifications/_show.html.erb +3 -0
  69. data/app/views/notifications/activities/_follow_body.html.erb +2 -0
  70. data/app/views/notifications/activities/_follow_subject.html.erb +2 -0
  71. data/app/views/notifications/activities/_like_body.html.erb +5 -0
  72. data/app/views/notifications/activities/_like_object_body.html.erb +2 -0
  73. data/app/views/notifications/activities/_like_object_subject.html.erb +2 -0
  74. data/app/views/notifications/activities/_like_subject.html.erb +5 -0
  75. data/app/views/notifications/activities/_like_subject_body.html.erb +1 -0
  76. data/app/views/notifications/activities/_like_subject_subject.html.erb +2 -0
  77. data/app/views/notifications/activities/_make-friend_body.html.erb +3 -0
  78. data/app/views/notifications/activities/_make-friend_subject.html.erb +2 -0
  79. data/app/views/notifications/activities/_post_body.html.erb +2 -0
  80. data/app/views/notifications/activities/_post_subject.html.erb +1 -0
  81. data/app/views/notifications/activities/_update_body.html.erb +1 -0
  82. data/app/views/notifications/activities/_update_subject.html.erb +1 -0
  83. data/app/views/notifications/index.html.erb +19 -0
  84. data/app/views/notifications/index.js.erb +8 -0
  85. data/app/views/notifications/show.html.erb +5 -0
  86. data/app/views/permissions/_index.html.erb +39 -0
  87. data/app/views/permissions/index.js.erb +10 -0
  88. data/app/views/profiles/_contact.html.erb +81 -0
  89. data/app/views/profiles/_experience.html.erb +22 -0
  90. data/app/views/profiles/_personal.html.erb +74 -0
  91. data/app/views/profiles/_profile.html.erb +12 -181
  92. data/app/views/profiles/_tags.html.erb +22 -0
  93. data/app/views/profiles/edit.html.erb +0 -14
  94. data/app/views/profiles/show.html.erb +14 -0
  95. data/app/views/profiles/update.js.erb +2 -28
  96. data/app/views/relation/customs/_form.html.erb +29 -0
  97. data/app/views/relation/customs/_index.html.erb +30 -0
  98. data/app/views/relation/customs/_list.html.erb +36 -0
  99. data/app/views/relation/customs/create.js.erb +20 -0
  100. data/app/views/relation/customs/index.js.erb +2 -0
  101. data/app/views/relation/customs/update.js.erb +6 -0
  102. data/app/views/spheres/_form.html.erb +28 -0
  103. data/app/views/spheres/_jquery.erb +130 -0
  104. data/app/views/spheres/_list.html.erb +19 -0
  105. data/app/views/spheres/create.js.erb +20 -0
  106. data/app/views/spheres/index.html.erb +74 -0
  107. data/app/views/ties/_edit.html.erb +1 -33
  108. data/app/views/toolbar/_home.html.erb +9 -0
  109. data/app/views/{subjects/_toolbar_home_menu.html.erb → toolbar/_home_menu.html.erb} +1 -1
  110. data/app/views/{subjects/_toolbar_home_menu_options.html.erb → toolbar/_home_menu_options.html.erb} +7 -3
  111. data/app/views/{subjects/_toolbar_home_menu_options_subjects.html.erb → toolbar/_home_menu_options_subjects.html.erb} +0 -0
  112. data/app/views/{subjects/_toolbar_logo.html.erb → toolbar/_logo.html.erb} +1 -1
  113. data/app/views/{subjects/_toolbar_message_menu.html.erb → toolbar/_message_menu.html.erb} +0 -0
  114. data/app/views/toolbar/_notifications_menu.html.erb +3 -0
  115. data/app/views/{subjects/_toolbar_profile.html.erb → toolbar/_profile.html.erb} +2 -2
  116. data/app/views/toolbar/_profile_menu.html.erb +15 -0
  117. data/app/views/toolbar/_profile_menu_basic_options.html.erb +5 -0
  118. data/app/views/toolbar/_profile_menu_tie_options.html.erb +35 -0
  119. data/app/views/users/_index.html.erb +1 -1
  120. data/app/views/users/_sidebar_index.html.erb +1 -6
  121. data/app/views/users/index.html.erb +3 -3
  122. data/app/views/users/show.html.erb +12 -2
  123. data/config/locales/en.yml +106 -79
  124. data/config/routes.rb +19 -5
  125. data/lib/generators/social_stream/templates/initializer.rb +2 -2
  126. data/lib/generators/social_stream/templates/migration.rb +3 -1
  127. data/lib/generators/social_stream/templates/public/images/HTML5.png +0 -0
  128. data/lib/generators/social_stream/templates/public/images/HTML5_Semantics.png +0 -0
  129. data/lib/generators/social_stream/templates/public/images/HTML5_Styling.png +0 -0
  130. data/lib/generators/social_stream/templates/public/images/Jcrop.gif +0 -0
  131. data/lib/generators/social_stream/templates/public/images/btn/btn_notification.png +0 -0
  132. data/lib/generators/social_stream/templates/public/images/btn/btn_notification_delete.png +0 -0
  133. data/lib/generators/social_stream/templates/public/images/btn/error.png +0 -0
  134. data/lib/generators/social_stream/templates/public/images/btn/info.png +0 -0
  135. data/lib/generators/social_stream/templates/public/images/btn/success.png +0 -0
  136. data/lib/generators/social_stream/templates/public/images/btn/warning.png +0 -0
  137. data/lib/generators/social_stream/templates/public/images/cancel.png +0 -0
  138. data/lib/generators/social_stream/templates/public/images/html5-badge-h-css3-semantics.png +0 -0
  139. data/lib/generators/social_stream/templates/public/images/icon_checkbox.png +0 -0
  140. data/lib/generators/social_stream/templates/public/images/logos/actor/remote_subject.png +0 -0
  141. data/lib/generators/social_stream/templates/public/images/logos/actor/remote_user.png +0 -0
  142. data/lib/generators/social_stream/templates/public/images/logos/representation/group.png +0 -0
  143. data/lib/generators/social_stream/templates/public/images/logos/representation/user.png +0 -0
  144. data/lib/generators/social_stream/templates/public/images/pbar-ani.gif +0 -0
  145. data/lib/generators/social_stream/templates/public/javascripts/jquery.fileupload-ui.js +259 -0
  146. data/lib/generators/social_stream/templates/public/javascripts/jquery.fileupload.js +475 -0
  147. data/lib/generators/social_stream/templates/public/javascripts/jquery.form.js +815 -0
  148. data/lib/generators/social_stream/templates/public/javascripts/jquery.ui.mouse.js +156 -0
  149. data/lib/generators/social_stream/templates/public/javascripts/jquery.ui.slider.js +684 -0
  150. data/lib/generators/social_stream/templates/public/javascripts/jquery.ui.widget.js +236 -0
  151. data/lib/generators/social_stream/templates/public/javascripts/ui.checkbox.js +309 -0
  152. data/lib/generators/social_stream/templates/public/stylesheets/default/base.css +13 -12
  153. data/lib/generators/social_stream/templates/public/stylesheets/default/contacts.css +88 -0
  154. data/lib/generators/social_stream/templates/public/stylesheets/default/footer.css +1 -0
  155. data/lib/generators/social_stream/templates/public/stylesheets/default/header.css +5 -3
  156. data/lib/generators/social_stream/templates/public/stylesheets/default/home.css +1 -1
  157. data/lib/generators/social_stream/templates/public/stylesheets/default/images/loading.gif +0 -0
  158. data/lib/generators/social_stream/templates/public/stylesheets/default/jquery.fileupload-ui.css +73 -0
  159. data/lib/generators/social_stream/templates/public/stylesheets/default/jquery.ui.slider.css +24 -0
  160. data/lib/generators/social_stream/templates/public/stylesheets/default/jquery.ui.slidertheme.css +32 -0
  161. data/lib/generators/social_stream/templates/public/stylesheets/default/messages.css +4 -0
  162. data/lib/generators/social_stream/templates/public/stylesheets/default/spheres.css +226 -0
  163. data/lib/generators/social_stream/templates/relations.yml +12 -12
  164. data/lib/social_stream.rb +2 -1
  165. data/lib/social_stream/ability.rb +5 -4
  166. data/lib/social_stream/controllers/helpers.rb +19 -0
  167. data/lib/social_stream/models/object.rb +3 -1
  168. data/lib/social_stream/models/subject.rb +19 -6
  169. data/lib/social_stream/rails.rb +23 -1
  170. data/lib/social_stream/test_helpers/controllers.rb +1 -1
  171. data/lib/social_stream/version.rb +1 -1
  172. data/lib/tasks/db/populate.rake +6 -9
  173. data/social_stream.gemspec +7 -4
  174. data/spec/controllers/comments_controller_spec.rb +1 -1
  175. data/spec/controllers/contacts_controller_spec.rb +23 -0
  176. data/spec/controllers/groups_controller_spec.rb +12 -1
  177. data/spec/controllers/permissions_controller_spec.rb +48 -0
  178. data/spec/controllers/posts_controller_spec.rb +4 -4
  179. data/spec/controllers/relation_customs_controller_spec.rb +130 -0
  180. data/spec/controllers/representations_spec.rb +74 -0
  181. data/spec/controllers/spheres_controller_spec.rb +108 -0
  182. data/spec/dummy/config/initializers/mailboxer.rb +8 -0
  183. data/spec/dummy/config/initializers/social_stream.rb +2 -2
  184. data/spec/dummy/config/relations.yml +12 -12
  185. data/spec/factories/relation_custom.rb +4 -0
  186. data/spec/factories/sphere.rb +5 -0
  187. data/spec/factories/tie.rb +4 -4
  188. data/spec/models/activity_spec.rb +58 -38
  189. data/spec/models/actor_spec.rb +1 -1
  190. data/spec/models/group_spec.rb +12 -0
  191. data/spec/models/like_spec.rb +68 -0
  192. data/spec/models/profile_spec.rb +2 -1
  193. data/spec/models/relation_custom_spec.rb +14 -0
  194. data/spec/models/tie_spec.rb +26 -2
  195. metadata +195 -94
  196. data/app/controllers/avatars_controller.rb +0 -51
  197. data/app/controllers/representations_controller.rb +0 -19
  198. data/app/controllers/ties_controller.rb +0 -22
  199. data/app/helpers/ties_helper.rb +0 -37
  200. data/app/models/avatar.rb +0 -91
  201. data/app/models/representation.rb +0 -35
  202. data/app/views/avatars/_form.html.erb +0 -12
  203. data/app/views/avatars/_precrop.html.erb +0 -66
  204. data/app/views/avatars/edit.html.erb +0 -6
  205. data/app/views/avatars/new.html.erb +0 -32
  206. data/app/views/avatars/show.html.erb +0 -5
  207. data/app/views/groups/_location.html.erb +0 -3
  208. data/app/views/groups/_logo.html.erb +0 -5
  209. data/app/views/home/_location.html.erb +0 -3
  210. data/app/views/subjects/_toolbar_home.html.erb +0 -9
  211. data/app/views/subjects/_toolbar_profile_menu.html.erb +0 -12
  212. data/app/views/subjects/_toolbar_profile_menu_basic_options.html.erb +0 -13
  213. data/app/views/subjects/_toolbar_profile_menu_tie_options.html.erb +0 -41
  214. data/app/views/ties/_new.html.erb +0 -64
  215. data/app/views/ties/_tie.html.erb +0 -23
  216. data/app/views/ties/new.html.erb +0 -1
  217. data/app/views/users/_location.html.erb +0 -3
  218. data/lib/generators/social_stream/templates/public/images/w3c_css.png +0 -0
  219. data/lib/generators/social_stream/templates/public/images/w3c_xhtml.png +0 -0
  220. data/lib/generators/social_stream/templates/public/javascripts/addContact.js +0 -100
  221. data/lib/generators/social_stream/templates/public/stylesheets/default/addContact.css +0 -29
  222. data/spec/controllers/representations_controller_spec.rb +0 -51
  223. data/spec/controllers/ties_controller_spec.rb +0 -19
  224. data/spec/models/representation_spec.rb +0 -16
@@ -0,0 +1,156 @@
1
+ /*!
2
+ * jQuery UI Mouse @VERSION
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Mouse
9
+ *
10
+ * Depends:
11
+ * jquery.ui.widget.js
12
+ */
13
+ (function( $, undefined ) {
14
+
15
+ $.widget("ui.mouse", {
16
+ options: {
17
+ cancel: ':input,option',
18
+ distance: 1,
19
+ delay: 0
20
+ },
21
+ _mouseInit: function() {
22
+ var self = this;
23
+
24
+ this.element
25
+ .bind('mousedown.'+this.widgetName, function(event) {
26
+ return self._mouseDown(event);
27
+ })
28
+ .bind('click.'+this.widgetName, function(event) {
29
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
30
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
31
+ event.stopImmediatePropagation();
32
+ return false;
33
+ }
34
+ });
35
+
36
+ this.started = false;
37
+ },
38
+
39
+ // TODO: make sure destroying one instance of mouse doesn't mess with
40
+ // other instances of mouse
41
+ _mouseDestroy: function() {
42
+ this.element.unbind('.'+this.widgetName);
43
+ },
44
+
45
+ _mouseDown: function(event) {
46
+ // don't let more than one widget handle mouseStart
47
+ // TODO: figure out why we have to use originalEvent
48
+ event.originalEvent = event.originalEvent || {};
49
+ if (event.originalEvent.mouseHandled) { return; }
50
+
51
+ // we may have missed mouseup (out of window)
52
+ (this._mouseStarted && this._mouseUp(event));
53
+
54
+ this._mouseDownEvent = event;
55
+
56
+ var self = this,
57
+ btnIsLeft = (event.which == 1),
58
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
59
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
60
+ return true;
61
+ }
62
+
63
+ this.mouseDelayMet = !this.options.delay;
64
+ if (!this.mouseDelayMet) {
65
+ this._mouseDelayTimer = setTimeout(function() {
66
+ self.mouseDelayMet = true;
67
+ }, this.options.delay);
68
+ }
69
+
70
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
71
+ this._mouseStarted = (this._mouseStart(event) !== false);
72
+ if (!this._mouseStarted) {
73
+ event.preventDefault();
74
+ return true;
75
+ }
76
+ }
77
+
78
+ // Click event may never have fired (Gecko & Opera)
79
+ if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
80
+ $.removeData(event.target, this.widgetName + '.preventClickEvent');
81
+ }
82
+
83
+ // these delegates are required to keep context
84
+ this._mouseMoveDelegate = function(event) {
85
+ return self._mouseMove(event);
86
+ };
87
+ this._mouseUpDelegate = function(event) {
88
+ return self._mouseUp(event);
89
+ };
90
+ $(document)
91
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
92
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
93
+
94
+ event.preventDefault();
95
+ event.originalEvent.mouseHandled = true;
96
+ return true;
97
+ },
98
+
99
+ _mouseMove: function(event) {
100
+ // IE mouseup check - mouseup happened when mouse was out of window
101
+ if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
102
+ return this._mouseUp(event);
103
+ }
104
+
105
+ if (this._mouseStarted) {
106
+ this._mouseDrag(event);
107
+ return event.preventDefault();
108
+ }
109
+
110
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
111
+ this._mouseStarted =
112
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
113
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
114
+ }
115
+
116
+ return !this._mouseStarted;
117
+ },
118
+
119
+ _mouseUp: function(event) {
120
+ $(document)
121
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
122
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
123
+
124
+ if (this._mouseStarted) {
125
+ this._mouseStarted = false;
126
+
127
+ if (event.target == this._mouseDownEvent.target) {
128
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
129
+ }
130
+
131
+ this._mouseStop(event);
132
+ }
133
+
134
+ return false;
135
+ },
136
+
137
+ _mouseDistanceMet: function(event) {
138
+ return (Math.max(
139
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
140
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
141
+ ) >= this.options.distance
142
+ );
143
+ },
144
+
145
+ _mouseDelayMet: function(event) {
146
+ return this.mouseDelayMet;
147
+ },
148
+
149
+ // These are placeholder methods, to be overriden by extending plugin
150
+ _mouseStart: function(event) {},
151
+ _mouseDrag: function(event) {},
152
+ _mouseStop: function(event) {},
153
+ _mouseCapture: function(event) { return true; }
154
+ });
155
+
156
+ })(jQuery);
@@ -0,0 +1,684 @@
1
+ /*
2
+ * jQuery UI Slider @VERSION
3
+ *
4
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
5
+ * Dual licensed under the MIT or GPL Version 2 licenses.
6
+ * http://jquery.org/license
7
+ *
8
+ * http://docs.jquery.com/UI/Slider
9
+ *
10
+ * Depends:
11
+ * jquery.ui.core.js
12
+ * jquery.ui.mouse.js
13
+ * jquery.ui.widget.js
14
+ */
15
+ (function( $, undefined ) {
16
+
17
+ // number of pages in a slider
18
+ // (how many times can you page up/down to go through the whole range)
19
+ var numPages = 5;
20
+
21
+ $.widget( "ui.slider", $.ui.mouse, {
22
+
23
+ widgetEventPrefix: "slide",
24
+
25
+ options: {
26
+ animate: false,
27
+ distance: 0,
28
+ max: 100,
29
+ min: 0,
30
+ orientation: "horizontal",
31
+ range: false,
32
+ step: 1,
33
+ value: 0,
34
+ values: null
35
+ },
36
+
37
+ _create: function() {
38
+ var self = this,
39
+ o = this.options;
40
+
41
+ this._keySliding = false;
42
+ this._mouseSliding = false;
43
+ this._animateOff = true;
44
+ this._handleIndex = null;
45
+ this._detectOrientation();
46
+ this._mouseInit();
47
+
48
+ this.element
49
+ .addClass( "ui-slider" +
50
+ " ui-slider-" + this.orientation +
51
+ " ui-widget" +
52
+ " ui-widget-content" +
53
+ " ui-corner-all" );
54
+
55
+ if ( o.disabled ) {
56
+ this.element.addClass( "ui-slider-disabled ui-disabled" );
57
+ }
58
+
59
+ this.range = $([]);
60
+
61
+ if ( o.range ) {
62
+ if ( o.range === true ) {
63
+ this.range = $( "<div></div>" );
64
+ if ( !o.values ) {
65
+ o.values = [ this._valueMin(), this._valueMin() ];
66
+ }
67
+ if ( o.values.length && o.values.length !== 2 ) {
68
+ o.values = [ o.values[0], o.values[0] ];
69
+ }
70
+ } else {
71
+ this.range = $( "<div></div>" );
72
+ }
73
+
74
+ this.range
75
+ .appendTo( this.element )
76
+ .addClass( "ui-slider-range" );
77
+
78
+ if ( o.range === "min" || o.range === "max" ) {
79
+ this.range.addClass( "ui-slider-range-" + o.range );
80
+ }
81
+
82
+ // note: this isn't the most fittingly semantic framework class for this element,
83
+ // but worked best visually with a variety of themes
84
+ this.range.addClass( "ui-widget-header" );
85
+ }
86
+
87
+ if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
88
+ $( "<a href='#'></a>" )
89
+ .appendTo( this.element )
90
+ .addClass( "ui-slider-handle" );
91
+ }
92
+
93
+ if ( o.values && o.values.length ) {
94
+ while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
95
+ $( "<a href='#'></a>" )
96
+ .appendTo( this.element )
97
+ .addClass( "ui-slider-handle" );
98
+ }
99
+ }
100
+
101
+ this.handles = $( ".ui-slider-handle", this.element )
102
+ .addClass( "ui-state-default" +
103
+ " ui-corner-all" );
104
+
105
+ this.handle = this.handles.eq( 0 );
106
+
107
+ this.handles.add( this.range ).filter( "a" )
108
+ .click(function( event ) {
109
+ event.preventDefault();
110
+ })
111
+ .hover(function() {
112
+ if ( !o.disabled ) {
113
+ $( this ).addClass( "ui-state-hover" );
114
+ }
115
+ }, function() {
116
+ $( this ).removeClass( "ui-state-hover" );
117
+ })
118
+ .focus(function() {
119
+ if ( !o.disabled ) {
120
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
121
+ $( this ).addClass( "ui-state-focus" );
122
+ } else {
123
+ $( this ).blur();
124
+ }
125
+ })
126
+ .blur(function() {
127
+ $( this ).removeClass( "ui-state-focus" );
128
+ });
129
+
130
+ this.handles.each(function( i ) {
131
+ $( this ).data( "index.ui-slider-handle", i );
132
+ });
133
+
134
+ this.handles
135
+ .keydown(function( event ) {
136
+ var ret = true,
137
+ index = $( this ).data( "index.ui-slider-handle" ),
138
+ allowed,
139
+ curVal,
140
+ newVal,
141
+ step;
142
+
143
+ if ( self.options.disabled ) {
144
+ return;
145
+ }
146
+
147
+ switch ( event.keyCode ) {
148
+ case $.ui.keyCode.HOME:
149
+ case $.ui.keyCode.END:
150
+ case $.ui.keyCode.PAGE_UP:
151
+ case $.ui.keyCode.PAGE_DOWN:
152
+ case $.ui.keyCode.UP:
153
+ case $.ui.keyCode.RIGHT:
154
+ case $.ui.keyCode.DOWN:
155
+ case $.ui.keyCode.LEFT:
156
+ ret = false;
157
+ if ( !self._keySliding ) {
158
+ self._keySliding = true;
159
+ $( this ).addClass( "ui-state-active" );
160
+ allowed = self._start( event, index );
161
+ if ( allowed === false ) {
162
+ return;
163
+ }
164
+ }
165
+ break;
166
+ }
167
+
168
+ step = self.options.step;
169
+ if ( self.options.values && self.options.values.length ) {
170
+ curVal = newVal = self.values( index );
171
+ } else {
172
+ curVal = newVal = self.value();
173
+ }
174
+
175
+ switch ( event.keyCode ) {
176
+ case $.ui.keyCode.HOME:
177
+ newVal = self._valueMin();
178
+ break;
179
+ case $.ui.keyCode.END:
180
+ newVal = self._valueMax();
181
+ break;
182
+ case $.ui.keyCode.PAGE_UP:
183
+ newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
184
+ break;
185
+ case $.ui.keyCode.PAGE_DOWN:
186
+ newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
187
+ break;
188
+ case $.ui.keyCode.UP:
189
+ case $.ui.keyCode.RIGHT:
190
+ if ( curVal === self._valueMax() ) {
191
+ return;
192
+ }
193
+ newVal = self._trimAlignValue( curVal + step );
194
+ break;
195
+ case $.ui.keyCode.DOWN:
196
+ case $.ui.keyCode.LEFT:
197
+ if ( curVal === self._valueMin() ) {
198
+ return;
199
+ }
200
+ newVal = self._trimAlignValue( curVal - step );
201
+ break;
202
+ }
203
+
204
+ self._slide( event, index, newVal );
205
+
206
+ return ret;
207
+
208
+ })
209
+ .keyup(function( event ) {
210
+ var index = $( this ).data( "index.ui-slider-handle" );
211
+
212
+ if ( self._keySliding ) {
213
+ self._keySliding = false;
214
+ self._stop( event, index );
215
+ self._change( event, index );
216
+ $( this ).removeClass( "ui-state-active" );
217
+ }
218
+
219
+ });
220
+
221
+ this._refreshValue();
222
+
223
+ this._animateOff = false;
224
+ },
225
+
226
+ destroy: function() {
227
+ this.handles.remove();
228
+ this.range.remove();
229
+
230
+ this.element
231
+ .removeClass( "ui-slider" +
232
+ " ui-slider-horizontal" +
233
+ " ui-slider-vertical" +
234
+ " ui-slider-disabled" +
235
+ " ui-widget" +
236
+ " ui-widget-content" +
237
+ " ui-corner-all" )
238
+ .removeData( "slider" )
239
+ .unbind( ".slider" );
240
+
241
+ this._mouseDestroy();
242
+
243
+ return this;
244
+ },
245
+
246
+ _mouseCapture: function( event ) {
247
+ var o = this.options,
248
+ position,
249
+ normValue,
250
+ distance,
251
+ closestHandle,
252
+ self,
253
+ index,
254
+ allowed,
255
+ offset,
256
+ mouseOverHandle;
257
+
258
+ if ( o.disabled ) {
259
+ return false;
260
+ }
261
+
262
+ this.elementSize = {
263
+ width: this.element.outerWidth(),
264
+ height: this.element.outerHeight()
265
+ };
266
+ this.elementOffset = this.element.offset();
267
+
268
+ position = { x: event.pageX, y: event.pageY };
269
+ normValue = this._normValueFromMouse( position );
270
+ distance = this._valueMax() - this._valueMin() + 1;
271
+ self = this;
272
+ this.handles.each(function( i ) {
273
+ var thisDistance = Math.abs( normValue - self.values(i) );
274
+ if ( distance > thisDistance ) {
275
+ distance = thisDistance;
276
+ closestHandle = $( this );
277
+ index = i;
278
+ }
279
+ });
280
+
281
+ // workaround for bug #3736 (if both handles of a range are at 0,
282
+ // the first is always used as the one with least distance,
283
+ // and moving it is obviously prevented by preventing negative ranges)
284
+ if( o.range === true && this.values(1) === o.min ) {
285
+ index += 1;
286
+ closestHandle = $( this.handles[index] );
287
+ }
288
+
289
+ allowed = this._start( event, index );
290
+ if ( allowed === false ) {
291
+ return false;
292
+ }
293
+ this._mouseSliding = true;
294
+
295
+ self._handleIndex = index;
296
+
297
+ closestHandle
298
+ .addClass( "ui-state-active" )
299
+ .focus();
300
+
301
+ offset = closestHandle.offset();
302
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
303
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
304
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
305
+ top: event.pageY - offset.top -
306
+ ( closestHandle.height() / 2 ) -
307
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
308
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
309
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
310
+ };
311
+
312
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
313
+ this._slide( event, index, normValue );
314
+ }
315
+ this._animateOff = true;
316
+ return true;
317
+ },
318
+
319
+ _mouseStart: function( event ) {
320
+ return true;
321
+ },
322
+
323
+ _mouseDrag: function( event ) {
324
+ var position = { x: event.pageX, y: event.pageY },
325
+ normValue = this._normValueFromMouse( position );
326
+
327
+ this._slide( event, this._handleIndex, normValue );
328
+
329
+ return false;
330
+ },
331
+
332
+ _mouseStop: function( event ) {
333
+ this.handles.removeClass( "ui-state-active" );
334
+ this._mouseSliding = false;
335
+
336
+ this._stop( event, this._handleIndex );
337
+ this._change( event, this._handleIndex );
338
+
339
+ this._handleIndex = null;
340
+ this._clickOffset = null;
341
+ this._animateOff = false;
342
+
343
+ return false;
344
+ },
345
+
346
+ _detectOrientation: function() {
347
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
348
+ },
349
+
350
+ _normValueFromMouse: function( position ) {
351
+ var pixelTotal,
352
+ pixelMouse,
353
+ percentMouse,
354
+ valueTotal,
355
+ valueMouse;
356
+
357
+ if ( this.orientation === "horizontal" ) {
358
+ pixelTotal = this.elementSize.width;
359
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
360
+ } else {
361
+ pixelTotal = this.elementSize.height;
362
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
363
+ }
364
+
365
+ percentMouse = ( pixelMouse / pixelTotal );
366
+ if ( percentMouse > 1 ) {
367
+ percentMouse = 1;
368
+ }
369
+ if ( percentMouse < 0 ) {
370
+ percentMouse = 0;
371
+ }
372
+ if ( this.orientation === "vertical" ) {
373
+ percentMouse = 1 - percentMouse;
374
+ }
375
+
376
+ valueTotal = this._valueMax() - this._valueMin();
377
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
378
+
379
+ return this._trimAlignValue( valueMouse );
380
+ },
381
+
382
+ _start: function( event, index ) {
383
+ var uiHash = {
384
+ handle: this.handles[ index ],
385
+ value: this.value()
386
+ };
387
+ if ( this.options.values && this.options.values.length ) {
388
+ uiHash.value = this.values( index );
389
+ uiHash.values = this.values();
390
+ }
391
+ return this._trigger( "start", event, uiHash );
392
+ },
393
+
394
+ _slide: function( event, index, newVal ) {
395
+ var otherVal,
396
+ newValues,
397
+ allowed;
398
+
399
+ if ( this.options.values && this.options.values.length ) {
400
+ otherVal = this.values( index ? 0 : 1 );
401
+
402
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
403
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
404
+ ) {
405
+ newVal = otherVal;
406
+ }
407
+
408
+ if ( newVal !== this.values( index ) ) {
409
+ newValues = this.values();
410
+ newValues[ index ] = newVal;
411
+ // A slide can be canceled by returning false from the slide callback
412
+ allowed = this._trigger( "slide", event, {
413
+ handle: this.handles[ index ],
414
+ value: newVal,
415
+ values: newValues
416
+ } );
417
+ otherVal = this.values( index ? 0 : 1 );
418
+ if ( allowed !== false ) {
419
+ this.values( index, newVal, true );
420
+ }
421
+ }
422
+ } else {
423
+ if ( newVal !== this.value() ) {
424
+ // A slide can be canceled by returning false from the slide callback
425
+ allowed = this._trigger( "slide", event, {
426
+ handle: this.handles[ index ],
427
+ value: newVal
428
+ } );
429
+ if ( allowed !== false ) {
430
+ this.value( newVal );
431
+ }
432
+ }
433
+ }
434
+ },
435
+
436
+ _stop: function( event, index ) {
437
+ var uiHash = {
438
+ handle: this.handles[ index ],
439
+ value: this.value()
440
+ };
441
+ if ( this.options.values && this.options.values.length ) {
442
+ uiHash.value = this.values( index );
443
+ uiHash.values = this.values();
444
+ }
445
+
446
+ this._trigger( "stop", event, uiHash );
447
+ },
448
+
449
+ _change: function( event, index ) {
450
+ if ( !this._keySliding && !this._mouseSliding ) {
451
+ var uiHash = {
452
+ handle: this.handles[ index ],
453
+ value: this.value()
454
+ };
455
+ if ( this.options.values && this.options.values.length ) {
456
+ uiHash.value = this.values( index );
457
+ uiHash.values = this.values();
458
+ }
459
+
460
+ this._trigger( "change", event, uiHash );
461
+ }
462
+ },
463
+
464
+ value: function( newValue ) {
465
+ if ( arguments.length ) {
466
+ this.options.value = this._trimAlignValue( newValue );
467
+ this._refreshValue();
468
+ this._change( null, 0 );
469
+ return;
470
+ }
471
+
472
+ return this._value();
473
+ },
474
+
475
+ values: function( index, newValue ) {
476
+ var vals,
477
+ newValues,
478
+ i;
479
+
480
+ if ( arguments.length > 1 ) {
481
+ this.options.values[ index ] = this._trimAlignValue( newValue );
482
+ this._refreshValue();
483
+ this._change( null, index );
484
+ return;
485
+ }
486
+
487
+ if ( arguments.length ) {
488
+ if ( $.isArray( arguments[ 0 ] ) ) {
489
+ vals = this.options.values;
490
+ newValues = arguments[ 0 ];
491
+ for ( i = 0; i < vals.length; i += 1 ) {
492
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
493
+ this._change( null, i );
494
+ }
495
+ this._refreshValue();
496
+ } else {
497
+ if ( this.options.values && this.options.values.length ) {
498
+ return this._values( index );
499
+ } else {
500
+ return this.value();
501
+ }
502
+ }
503
+ } else {
504
+ return this._values();
505
+ }
506
+ },
507
+
508
+ _setOption: function( key, value ) {
509
+ var i,
510
+ valsLength = 0;
511
+
512
+ if ( $.isArray( this.options.values ) ) {
513
+ valsLength = this.options.values.length;
514
+ }
515
+
516
+ $.Widget.prototype._setOption.apply( this, arguments );
517
+
518
+ switch ( key ) {
519
+ case "disabled":
520
+ if ( value ) {
521
+ this.handles.filter( ".ui-state-focus" ).blur();
522
+ this.handles.removeClass( "ui-state-hover" );
523
+ this.handles.attr( "disabled", "disabled" );
524
+ this.element.addClass( "ui-disabled" );
525
+ } else {
526
+ this.handles.removeAttr( "disabled" );
527
+ this.element.removeClass( "ui-disabled" );
528
+ }
529
+ break;
530
+ case "orientation":
531
+ this._detectOrientation();
532
+ this.element
533
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
534
+ .addClass( "ui-slider-" + this.orientation );
535
+ this._refreshValue();
536
+ break;
537
+ case "value":
538
+ this._animateOff = true;
539
+ this._refreshValue();
540
+ this._change( null, 0 );
541
+ this._animateOff = false;
542
+ break;
543
+ case "values":
544
+ this._animateOff = true;
545
+ this._refreshValue();
546
+ for ( i = 0; i < valsLength; i += 1 ) {
547
+ this._change( null, i );
548
+ }
549
+ this._animateOff = false;
550
+ break;
551
+ }
552
+ },
553
+
554
+ //internal value getter
555
+ // _value() returns value trimmed by min and max, aligned by step
556
+ _value: function() {
557
+ var val = this.options.value;
558
+ val = this._trimAlignValue( val );
559
+
560
+ return val;
561
+ },
562
+
563
+ //internal values getter
564
+ // _values() returns array of values trimmed by min and max, aligned by step
565
+ // _values( index ) returns single value trimmed by min and max, aligned by step
566
+ _values: function( index ) {
567
+ var val,
568
+ vals,
569
+ i;
570
+
571
+ if ( arguments.length ) {
572
+ val = this.options.values[ index ];
573
+ val = this._trimAlignValue( val );
574
+
575
+ return val;
576
+ } else {
577
+ // .slice() creates a copy of the array
578
+ // this copy gets trimmed by min and max and then returned
579
+ vals = this.options.values.slice();
580
+ for ( i = 0; i < vals.length; i+= 1) {
581
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
582
+ }
583
+
584
+ return vals;
585
+ }
586
+ },
587
+
588
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
589
+ _trimAlignValue: function( val ) {
590
+ if ( val <= this._valueMin() ) {
591
+ return this._valueMin();
592
+ }
593
+ if ( val >= this._valueMax() ) {
594
+ return this._valueMax();
595
+ }
596
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
597
+ valModStep = (val - this._valueMin()) % step;
598
+ alignValue = val - valModStep;
599
+
600
+ if ( Math.abs(valModStep) * 2 >= step ) {
601
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
602
+ }
603
+
604
+ // Since JavaScript has problems with large floats, round
605
+ // the final value to 5 digits after the decimal point (see #4124)
606
+ return parseFloat( alignValue.toFixed(5) );
607
+ },
608
+
609
+ _valueMin: function() {
610
+ return this.options.min;
611
+ },
612
+
613
+ _valueMax: function() {
614
+ return this.options.max;
615
+ },
616
+
617
+ _refreshValue: function() {
618
+ var oRange = this.options.range,
619
+ o = this.options,
620
+ self = this,
621
+ animate = ( !this._animateOff ) ? o.animate : false,
622
+ valPercent,
623
+ _set = {},
624
+ lastValPercent,
625
+ value,
626
+ valueMin,
627
+ valueMax;
628
+
629
+ if ( this.options.values && this.options.values.length ) {
630
+ this.handles.each(function( i, j ) {
631
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
632
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
633
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
634
+ if ( self.options.range === true ) {
635
+ if ( self.orientation === "horizontal" ) {
636
+ if ( i === 0 ) {
637
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
638
+ }
639
+ if ( i === 1 ) {
640
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
641
+ }
642
+ } else {
643
+ if ( i === 0 ) {
644
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
645
+ }
646
+ if ( i === 1 ) {
647
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
648
+ }
649
+ }
650
+ }
651
+ lastValPercent = valPercent;
652
+ });
653
+ } else {
654
+ value = this.value();
655
+ valueMin = this._valueMin();
656
+ valueMax = this._valueMax();
657
+ valPercent = ( valueMax !== valueMin ) ?
658
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
659
+ 0;
660
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
661
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
662
+
663
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
664
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
665
+ }
666
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
667
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
668
+ }
669
+ if ( oRange === "min" && this.orientation === "vertical" ) {
670
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
671
+ }
672
+ if ( oRange === "max" && this.orientation === "vertical" ) {
673
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
674
+ }
675
+ }
676
+ }
677
+
678
+ });
679
+
680
+ $.extend( $.ui.slider, {
681
+ version: "@VERSION"
682
+ });
683
+
684
+ }(jQuery));