[SPIP] +spip v3.0.17
[lhc/web/clavette_www.git] / www / plugins-dist / jquery_ui / prive / javascript / ui / jquery.ui.selectable.js
1 /*!
2 * jQuery UI Selectable 1.8.21
3 *
4 * Copyright 2012, 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/Selectables
9 *
10 * Depends:
11 * jquery.ui.core.js
12 * jquery.ui.mouse.js
13 * jquery.ui.widget.js
14 */
15 (function( $, undefined ) {
16
17 $.widget("ui.selectable", $.ui.mouse, {
18 options: {
19 appendTo: 'body',
20 autoRefresh: true,
21 distance: 0,
22 filter: '*',
23 tolerance: 'touch'
24 },
25 _create: function() {
26 var self = this;
27
28 this.element.addClass("ui-selectable");
29
30 this.dragged = false;
31
32 // cache selectee children based on filter
33 var selectees;
34 this.refresh = function() {
35 selectees = $(self.options.filter, self.element[0]);
36 selectees.addClass("ui-selectee");
37 selectees.each(function() {
38 var $this = $(this);
39 var pos = $this.offset();
40 $.data(this, "selectable-item", {
41 element: this,
42 $element: $this,
43 left: pos.left,
44 top: pos.top,
45 right: pos.left + $this.outerWidth(),
46 bottom: pos.top + $this.outerHeight(),
47 startselected: false,
48 selected: $this.hasClass('ui-selected'),
49 selecting: $this.hasClass('ui-selecting'),
50 unselecting: $this.hasClass('ui-unselecting')
51 });
52 });
53 };
54 this.refresh();
55
56 this.selectees = selectees.addClass("ui-selectee");
57
58 this._mouseInit();
59
60 this.helper = $("<div class='ui-selectable-helper'></div>");
61 },
62
63 destroy: function() {
64 this.selectees
65 .removeClass("ui-selectee")
66 .removeData("selectable-item");
67 this.element
68 .removeClass("ui-selectable ui-selectable-disabled")
69 .removeData("selectable")
70 .unbind(".selectable");
71 this._mouseDestroy();
72
73 return this;
74 },
75
76 _mouseStart: function(event) {
77 var self = this;
78
79 this.opos = [event.pageX, event.pageY];
80
81 if (this.options.disabled)
82 return;
83
84 var options = this.options;
85
86 this.selectees = $(options.filter, this.element[0]);
87
88 this._trigger("start", event);
89
90 $(options.appendTo).append(this.helper);
91 // position helper (lasso)
92 this.helper.css({
93 "left": event.clientX,
94 "top": event.clientY,
95 "width": 0,
96 "height": 0
97 });
98
99 if (options.autoRefresh) {
100 this.refresh();
101 }
102
103 this.selectees.filter('.ui-selected').each(function() {
104 var selectee = $.data(this, "selectable-item");
105 selectee.startselected = true;
106 if (!event.metaKey && !event.ctrlKey) {
107 selectee.$element.removeClass('ui-selected');
108 selectee.selected = false;
109 selectee.$element.addClass('ui-unselecting');
110 selectee.unselecting = true;
111 // selectable UNSELECTING callback
112 self._trigger("unselecting", event, {
113 unselecting: selectee.element
114 });
115 }
116 });
117
118 $(event.target).parents().andSelf().each(function() {
119 var selectee = $.data(this, "selectable-item");
120 if (selectee) {
121 var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
122 selectee.$element
123 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
124 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
125 selectee.unselecting = !doSelect;
126 selectee.selecting = doSelect;
127 selectee.selected = doSelect;
128 // selectable (UN)SELECTING callback
129 if (doSelect) {
130 self._trigger("selecting", event, {
131 selecting: selectee.element
132 });
133 } else {
134 self._trigger("unselecting", event, {
135 unselecting: selectee.element
136 });
137 }
138 return false;
139 }
140 });
141
142 },
143
144 _mouseDrag: function(event) {
145 var self = this;
146 this.dragged = true;
147
148 if (this.options.disabled)
149 return;
150
151 var options = this.options;
152
153 var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
154 if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
155 if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
156 this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
157
158 this.selectees.each(function() {
159 var selectee = $.data(this, "selectable-item");
160 //prevent helper from being selected if appendTo: selectable
161 if (!selectee || selectee.element == self.element[0])
162 return;
163 var hit = false;
164 if (options.tolerance == 'touch') {
165 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
166 } else if (options.tolerance == 'fit') {
167 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
168 }
169
170 if (hit) {
171 // SELECT
172 if (selectee.selected) {
173 selectee.$element.removeClass('ui-selected');
174 selectee.selected = false;
175 }
176 if (selectee.unselecting) {
177 selectee.$element.removeClass('ui-unselecting');
178 selectee.unselecting = false;
179 }
180 if (!selectee.selecting) {
181 selectee.$element.addClass('ui-selecting');
182 selectee.selecting = true;
183 // selectable SELECTING callback
184 self._trigger("selecting", event, {
185 selecting: selectee.element
186 });
187 }
188 } else {
189 // UNSELECT
190 if (selectee.selecting) {
191 if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
192 selectee.$element.removeClass('ui-selecting');
193 selectee.selecting = false;
194 selectee.$element.addClass('ui-selected');
195 selectee.selected = true;
196 } else {
197 selectee.$element.removeClass('ui-selecting');
198 selectee.selecting = false;
199 if (selectee.startselected) {
200 selectee.$element.addClass('ui-unselecting');
201 selectee.unselecting = true;
202 }
203 // selectable UNSELECTING callback
204 self._trigger("unselecting", event, {
205 unselecting: selectee.element
206 });
207 }
208 }
209 if (selectee.selected) {
210 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
211 selectee.$element.removeClass('ui-selected');
212 selectee.selected = false;
213
214 selectee.$element.addClass('ui-unselecting');
215 selectee.unselecting = true;
216 // selectable UNSELECTING callback
217 self._trigger("unselecting", event, {
218 unselecting: selectee.element
219 });
220 }
221 }
222 }
223 });
224
225 return false;
226 },
227
228 _mouseStop: function(event) {
229 var self = this;
230
231 this.dragged = false;
232
233 var options = this.options;
234
235 $('.ui-unselecting', this.element[0]).each(function() {
236 var selectee = $.data(this, "selectable-item");
237 selectee.$element.removeClass('ui-unselecting');
238 selectee.unselecting = false;
239 selectee.startselected = false;
240 self._trigger("unselected", event, {
241 unselected: selectee.element
242 });
243 });
244 $('.ui-selecting', this.element[0]).each(function() {
245 var selectee = $.data(this, "selectable-item");
246 selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
247 selectee.selecting = false;
248 selectee.selected = true;
249 selectee.startselected = true;
250 self._trigger("selected", event, {
251 selected: selectee.element
252 });
253 });
254 this._trigger("stop", event);
255
256 this.helper.remove();
257
258 return false;
259 }
260
261 });
262
263 $.extend($.ui.selectable, {
264 version: "1.8.21"
265 });
266
267 })(jQuery);