0b8f9b6f2c9ce2f83edac98fc0dab44b1ab18714
2 * jQuery UI Selectable 1.8.16
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
8 * http://docs.jquery.com/UI/Selectables
15 (function( $, undefined ) {
17 $.widget("ui.selectable", $.ui
.mouse
, {
28 this.element
.addClass("ui-selectable");
32 // cache selectee children based on filter
34 this.refresh = function() {
35 selectees
= $(self
.options
.filter
, self
.element
[0]);
36 selectees
.each(function() {
38 var pos
= $this.offset();
39 $.data(this, "selectable-item", {
44 right
: pos
.left
+ $this.outerWidth(),
45 bottom
: pos
.top
+ $this.outerHeight(),
47 selected
: $this.hasClass('ui-selected'),
48 selecting
: $this.hasClass('ui-selecting'),
49 unselecting
: $this.hasClass('ui-unselecting')
55 this.selectees
= selectees
.addClass("ui-selectee");
59 this.helper
= $("<div class='ui-selectable-helper'></div>");
64 .removeClass("ui-selectee")
65 .removeData("selectable-item");
67 .removeClass("ui-selectable ui-selectable-disabled")
68 .removeData("selectable")
69 .unbind(".selectable");
75 _mouseStart: function(event
) {
78 this.opos
= [event
.pageX
, event
.pageY
];
80 if (this.options
.disabled
)
83 var options
= this.options
;
85 this.selectees
= $(options
.filter
, this.element
[0]);
87 this._trigger("start", event
);
89 $(options
.appendTo
).append(this.helper
);
90 // position helper (lasso)
92 "left": event
.clientX
,
98 if (options
.autoRefresh
) {
102 this.selectees
.filter('.ui-selected').each(function() {
103 var selectee
= $.data(this, "selectable-item");
104 selectee
.startselected
= true;
105 if (!event
.metaKey
) {
106 selectee
.$element
.removeClass('ui-selected');
107 selectee
.selected
= false;
108 selectee
.$element
.addClass('ui-unselecting');
109 selectee
.unselecting
= true;
110 // selectable UNSELECTING callback
111 self
._trigger("unselecting", event
, {
112 unselecting
: selectee
.element
117 $(event
.target
).parents().andSelf().each(function() {
118 var selectee
= $.data(this, "selectable-item");
120 var doSelect
= !event
.metaKey
|| !selectee
.$element
.hasClass('ui-selected');
122 .removeClass(doSelect
? "ui-unselecting" : "ui-selected")
123 .addClass(doSelect
? "ui-selecting" : "ui-unselecting");
124 selectee
.unselecting
= !doSelect
;
125 selectee
.selecting
= doSelect
;
126 selectee
.selected
= doSelect
;
127 // selectable (UN)SELECTING callback
129 self
._trigger("selecting", event
, {
130 selecting
: selectee
.element
133 self
._trigger("unselecting", event
, {
134 unselecting
: selectee
.element
143 _mouseDrag: function(event
) {
147 if (this.options
.disabled
)
150 var options
= this.options
;
152 var x1
= this.opos
[0], y1
= this.opos
[1], x2
= event
.pageX
, y2
= event
.pageY
;
153 if (x1
> x2
) { var tmp
= x2
; x2
= x1
; x1
= tmp
; }
154 if (y1
> y2
) { var tmp
= y2
; y2
= y1
; y1
= tmp
; }
155 this.helper
.css({left
: x1
, top
: y1
, width
: x2
-x1
, height
: y2
-y1
});
157 this.selectees
.each(function() {
158 var selectee
= $.data(this, "selectable-item");
159 //prevent helper from being selected if appendTo: selectable
160 if (!selectee
|| selectee
.element
== self
.element
[0])
163 if (options
.tolerance
== 'touch') {
164 hit
= ( !(selectee
.left
> x2
|| selectee
.right
< x1
|| selectee
.top
> y2
|| selectee
.bottom
< y1
) );
165 } else if (options
.tolerance
== 'fit') {
166 hit
= (selectee
.left
> x1
&& selectee
.right
< x2
&& selectee
.top
> y1
&& selectee
.bottom
< y2
);
171 if (selectee
.selected
) {
172 selectee
.$element
.removeClass('ui-selected');
173 selectee
.selected
= false;
175 if (selectee
.unselecting
) {
176 selectee
.$element
.removeClass('ui-unselecting');
177 selectee
.unselecting
= false;
179 if (!selectee
.selecting
) {
180 selectee
.$element
.addClass('ui-selecting');
181 selectee
.selecting
= true;
182 // selectable SELECTING callback
183 self
._trigger("selecting", event
, {
184 selecting
: selectee
.element
189 if (selectee
.selecting
) {
190 if (event
.metaKey
&& selectee
.startselected
) {
191 selectee
.$element
.removeClass('ui-selecting');
192 selectee
.selecting
= false;
193 selectee
.$element
.addClass('ui-selected');
194 selectee
.selected
= true;
196 selectee
.$element
.removeClass('ui-selecting');
197 selectee
.selecting
= false;
198 if (selectee
.startselected
) {
199 selectee
.$element
.addClass('ui-unselecting');
200 selectee
.unselecting
= true;
202 // selectable UNSELECTING callback
203 self
._trigger("unselecting", event
, {
204 unselecting
: selectee
.element
208 if (selectee
.selected
) {
209 if (!event
.metaKey
&& !selectee
.startselected
) {
210 selectee
.$element
.removeClass('ui-selected');
211 selectee
.selected
= false;
213 selectee
.$element
.addClass('ui-unselecting');
214 selectee
.unselecting
= true;
215 // selectable UNSELECTING callback
216 self
._trigger("unselecting", event
, {
217 unselecting
: selectee
.element
227 _mouseStop: function(event
) {
230 this.dragged
= false;
232 var options
= this.options
;
234 $('.ui-unselecting', this.element
[0]).each(function() {
235 var selectee
= $.data(this, "selectable-item");
236 selectee
.$element
.removeClass('ui-unselecting');
237 selectee
.unselecting
= false;
238 selectee
.startselected
= false;
239 self
._trigger("unselected", event
, {
240 unselected
: selectee
.element
243 $('.ui-selecting', this.element
[0]).each(function() {
244 var selectee
= $.data(this, "selectable-item");
245 selectee
.$element
.removeClass('ui-selecting').addClass('ui-selected');
246 selectee
.selecting
= false;
247 selectee
.selected
= true;
248 selectee
.startselected
= true;
249 self
._trigger("selected", event
, {
250 selected
: selectee
.element
253 this._trigger("stop", event
);
255 this.helper
.remove();
262 $.extend($.ui
.selectable
, {