2 * jQuery UI Selectable 1.11.4
5 * Copyright jQuery Foundation and other contributors
6 * Released under the MIT license.
7 * http://jquery.org/license
9 * http://api.jqueryui.com/selectable/
11 (function( factory
) {
12 if ( typeof define
=== "function" && define
.amd
) {
14 // AMD. Register as an anonymous module.
28 return $.widget("ui.selectable", $.ui
.mouse
, {
49 this.element
.addClass("ui-selectable");
53 // cache selectee children based on filter
54 this.refresh = function() {
55 selectees
= $(that
.options
.filter
, that
.element
[0]);
56 selectees
.addClass("ui-selectee");
57 selectees
.each(function() {
60 $.data(this, "selectable-item", {
65 right
: pos
.left
+ $this.outerWidth(),
66 bottom
: pos
.top
+ $this.outerHeight(),
68 selected
: $this.hasClass("ui-selected"),
69 selecting
: $this.hasClass("ui-selecting"),
70 unselecting
: $this.hasClass("ui-unselecting")
76 this.selectees
= selectees
.addClass("ui-selectee");
80 this.helper
= $("<div class='ui-selectable-helper'></div>");
83 _destroy: function() {
85 .removeClass("ui-selectee")
86 .removeData("selectable-item");
88 .removeClass("ui-selectable ui-selectable-disabled");
92 _mouseStart: function(event
) {
94 options
= this.options
;
96 this.opos
= [ event
.pageX
, event
.pageY
];
98 if (this.options
.disabled
) {
102 this.selectees
= $(options
.filter
, this.element
[0]);
104 this._trigger("start", event
);
106 $(options
.appendTo
).append(this.helper
);
107 // position helper (lasso)
115 if (options
.autoRefresh
) {
119 this.selectees
.filter(".ui-selected").each(function() {
120 var selectee
= $.data(this, "selectable-item");
121 selectee
.startselected
= true;
122 if (!event
.metaKey
&& !event
.ctrlKey
) {
123 selectee
.$element
.removeClass("ui-selected");
124 selectee
.selected
= false;
125 selectee
.$element
.addClass("ui-unselecting");
126 selectee
.unselecting
= true;
127 // selectable UNSELECTING callback
128 that
._trigger("unselecting", event
, {
129 unselecting
: selectee
.element
134 $(event
.target
).parents().addBack().each(function() {
136 selectee
= $.data(this, "selectable-item");
138 doSelect
= (!event
.metaKey
&& !event
.ctrlKey
) || !selectee
.$element
.hasClass("ui-selected");
140 .removeClass(doSelect
? "ui-unselecting" : "ui-selected")
141 .addClass(doSelect
? "ui-selecting" : "ui-unselecting");
142 selectee
.unselecting
= !doSelect
;
143 selectee
.selecting
= doSelect
;
144 selectee
.selected
= doSelect
;
145 // selectable (UN)SELECTING callback
147 that
._trigger("selecting", event
, {
148 selecting
: selectee
.element
151 that
._trigger("unselecting", event
, {
152 unselecting
: selectee
.element
161 _mouseDrag: function(event
) {
165 if (this.options
.disabled
) {
171 options
= this.options
,
177 if (x1
> x2
) { tmp
= x2
; x2
= x1
; x1
= tmp
; }
178 if (y1
> y2
) { tmp
= y2
; y2
= y1
; y1
= tmp
; }
179 this.helper
.css({ left
: x1
, top
: y1
, width
: x2
- x1
, height
: y2
- y1
});
181 this.selectees
.each(function() {
182 var selectee
= $.data(this, "selectable-item"),
185 //prevent helper from being selected if appendTo: selectable
186 if (!selectee
|| selectee
.element
=== that
.element
[0]) {
190 if (options
.tolerance
=== "touch") {
191 hit
= ( !(selectee
.left
> x2
|| selectee
.right
< x1
|| selectee
.top
> y2
|| selectee
.bottom
< y1
) );
192 } else if (options
.tolerance
=== "fit") {
193 hit
= (selectee
.left
> x1
&& selectee
.right
< x2
&& selectee
.top
> y1
&& selectee
.bottom
< y2
);
198 if (selectee
.selected
) {
199 selectee
.$element
.removeClass("ui-selected");
200 selectee
.selected
= false;
202 if (selectee
.unselecting
) {
203 selectee
.$element
.removeClass("ui-unselecting");
204 selectee
.unselecting
= false;
206 if (!selectee
.selecting
) {
207 selectee
.$element
.addClass("ui-selecting");
208 selectee
.selecting
= true;
209 // selectable SELECTING callback
210 that
._trigger("selecting", event
, {
211 selecting
: selectee
.element
216 if (selectee
.selecting
) {
217 if ((event
.metaKey
|| event
.ctrlKey
) && selectee
.startselected
) {
218 selectee
.$element
.removeClass("ui-selecting");
219 selectee
.selecting
= false;
220 selectee
.$element
.addClass("ui-selected");
221 selectee
.selected
= true;
223 selectee
.$element
.removeClass("ui-selecting");
224 selectee
.selecting
= false;
225 if (selectee
.startselected
) {
226 selectee
.$element
.addClass("ui-unselecting");
227 selectee
.unselecting
= true;
229 // selectable UNSELECTING callback
230 that
._trigger("unselecting", event
, {
231 unselecting
: selectee
.element
235 if (selectee
.selected
) {
236 if (!event
.metaKey
&& !event
.ctrlKey
&& !selectee
.startselected
) {
237 selectee
.$element
.removeClass("ui-selected");
238 selectee
.selected
= false;
240 selectee
.$element
.addClass("ui-unselecting");
241 selectee
.unselecting
= true;
242 // selectable UNSELECTING callback
243 that
._trigger("unselecting", event
, {
244 unselecting
: selectee
.element
254 _mouseStop: function(event
) {
257 this.dragged
= false;
259 $(".ui-unselecting", this.element
[0]).each(function() {
260 var selectee
= $.data(this, "selectable-item");
261 selectee
.$element
.removeClass("ui-unselecting");
262 selectee
.unselecting
= false;
263 selectee
.startselected
= false;
264 that
._trigger("unselected", event
, {
265 unselected
: selectee
.element
268 $(".ui-selecting", this.element
[0]).each(function() {
269 var selectee
= $.data(this, "selectable-item");
270 selectee
.$element
.removeClass("ui-selecting").addClass("ui-selected");
271 selectee
.selecting
= false;
272 selectee
.selected
= true;
273 selectee
.startselected
= true;
274 that
._trigger("selected", event
, {
275 selected
: selectee
.element
278 this._trigger("stop", event
);
280 this.helper
.remove();