2
* jQuery UI Selectable @VERSION
4
* Copyright (c) 2008 Richard D. Worth (rdworth.org)
5
* Dual licensed under the MIT (MIT-LICENSE.txt)
6
* and GPL (GPL-LICENSE.txt) licenses.
8
* http://docs.jquery.com/UI/Selectables
15
$.widget("ui.selectable", $.extend({}, $.ui.mouse, {
19
this.element.addClass("ui-selectable");
23
// cache selectee children based on filter
25
this.refresh = function() {
26
selectees = $(self.options.filter, self.element[0]);
27
selectees.each(function() {
29
var pos = $this.offset();
30
$.data(this, "selectable-item", {
35
right: pos.left + $this.width(),
36
bottom: pos.top + $this.height(),
38
selected: $this.hasClass('ui-selected'),
39
selecting: $this.hasClass('ui-selecting'),
40
unselecting: $this.hasClass('ui-unselecting')
46
this.selectees = selectees.addClass("ui-selectee");
50
this.helper = $(document.createElement('div'))
51
.css({border:'1px dotted black'})
52
.addClass("ui-selectable-helper");
55
if(this.options.disabled){
63
.removeClass("ui-selectable ui-selectable-disabled")
64
.removeData("selectable")
65
.unbind(".selectable");
68
_mouseStart: function(e) {
71
this.opos = [e.pageX, e.pageY];
73
if (this.options.disabled)
76
var options = this.options;
78
this.selectees = $(options.filter, this.element[0]);
80
// selectable START callback
81
this.element.triggerHandler("selectablestart", [e, {
82
"selectable": this.element[0],
86
$('body').append(this.helper);
87
// position helper (lasso)
90
"position": "absolute",
97
if (options.autoRefresh) {
101
this.selectees.filter('.ui-selected').each(function() {
102
var selectee = $.data(this, "selectable-item");
103
selectee.startselected = true;
105
selectee.$element.removeClass('ui-selected');
106
selectee.selected = false;
107
selectee.$element.addClass('ui-unselecting');
108
selectee.unselecting = true;
109
// selectable UNSELECTING callback
110
self.element.triggerHandler("selectableunselecting", [e, {
111
selectable: self.element[0],
112
unselecting: selectee.element,
114
}], options.unselecting);
118
var isSelectee = false;
119
$(e.target).parents().andSelf().each(function() {
120
if($.data(this, "selectable-item")) isSelectee = true;
122
return this.options.keyboard ? !isSelectee : true;
124
_mouseDrag: function(e) {
128
if (this.options.disabled)
131
var options = this.options;
133
var x1 = this.opos[0], y1 = this.opos[1], x2 = e.pageX, y2 = e.pageY;
134
if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
135
if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
136
this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
138
this.selectees.each(function() {
139
var selectee = $.data(this, "selectable-item");
140
//prevent helper from being selected if appendTo: selectable
141
if (!selectee || selectee.element == self.element[0])
144
if (options.tolerance == 'touch') {
145
hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
146
} else if (options.tolerance == 'fit') {
147
hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
152
if (selectee.selected) {
153
selectee.$element.removeClass('ui-selected');
154
selectee.selected = false;
156
if (selectee.unselecting) {
157
selectee.$element.removeClass('ui-unselecting');
158
selectee.unselecting = false;
160
if (!selectee.selecting) {
161
selectee.$element.addClass('ui-selecting');
162
selectee.selecting = true;
163
// selectable SELECTING callback
164
self.element.triggerHandler("selectableselecting", [e, {
165
selectable: self.element[0],
166
selecting: selectee.element,
168
}], options.selecting);
172
if (selectee.selecting) {
173
if (e.metaKey && selectee.startselected) {
174
selectee.$element.removeClass('ui-selecting');
175
selectee.selecting = false;
176
selectee.$element.addClass('ui-selected');
177
selectee.selected = true;
179
selectee.$element.removeClass('ui-selecting');
180
selectee.selecting = false;
181
if (selectee.startselected) {
182
selectee.$element.addClass('ui-unselecting');
183
selectee.unselecting = true;
185
// selectable UNSELECTING callback
186
self.element.triggerHandler("selectableunselecting", [e, {
187
selectable: self.element[0],
188
unselecting: selectee.element,
190
}], options.unselecting);
193
if (selectee.selected) {
194
if (!e.metaKey && !selectee.startselected) {
195
selectee.$element.removeClass('ui-selected');
196
selectee.selected = false;
198
selectee.$element.addClass('ui-unselecting');
199
selectee.unselecting = true;
200
// selectable UNSELECTING callback
201
self.element.triggerHandler("selectableunselecting", [e, {
202
selectable: self.element[0],
203
unselecting: selectee.element,
205
}], options.unselecting);
213
_mouseStop: function(e) {
216
this.dragged = false;
218
var options = this.options;
220
$('.ui-unselecting', this.element[0]).each(function() {
221
var selectee = $.data(this, "selectable-item");
222
selectee.$element.removeClass('ui-unselecting');
223
selectee.unselecting = false;
224
selectee.startselected = false;
225
self.element.triggerHandler("selectableunselected", [e, {
226
selectable: self.element[0],
227
unselected: selectee.element,
229
}], options.unselected);
231
$('.ui-selecting', this.element[0]).each(function() {
232
var selectee = $.data(this, "selectable-item");
233
selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
234
selectee.selecting = false;
235
selectee.selected = true;
236
selectee.startselected = true;
237
self.element.triggerHandler("selectableselected", [e, {
238
selectable: self.element[0],
239
selected: selectee.element,
241
}], options.selected);
243
this.element.triggerHandler("selectablestop", [e, {
244
selectable: self.element[0],
245
options: this.options
246
}], this.options.stop);
248
this.helper.remove();
254
$.extend($.ui.selectable, {