2
* jQuery UI Selectable 1.7.1
4
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
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, {
20
this.element.addClass("ui-selectable");
24
// cache selectee children based on filter
26
this.refresh = function() {
27
selectees = $(self.options.filter, self.element[0]);
28
selectees.each(function() {
30
var pos = $this.offset();
31
$.data(this, "selectable-item", {
36
right: pos.left + $this.outerWidth(),
37
bottom: pos.top + $this.outerHeight(),
39
selected: $this.hasClass('ui-selected'),
40
selecting: $this.hasClass('ui-selecting'),
41
unselecting: $this.hasClass('ui-unselecting')
47
this.selectees = selectees.addClass("ui-selectee");
51
this.helper = $(document.createElement('div'))
52
.css({border:'1px dotted black'})
53
.addClass("ui-selectable-helper");
58
.removeClass("ui-selectable ui-selectable-disabled")
59
.removeData("selectable")
60
.unbind(".selectable");
64
_mouseStart: function(event) {
67
this.opos = [event.pageX, event.pageY];
69
if (this.options.disabled)
72
var options = this.options;
74
this.selectees = $(options.filter, this.element[0]);
76
this._trigger("start", event);
78
$(options.appendTo).append(this.helper);
79
// position helper (lasso)
82
"position": "absolute",
83
"left": event.clientX,
89
if (options.autoRefresh) {
93
this.selectees.filter('.ui-selected').each(function() {
94
var selectee = $.data(this, "selectable-item");
95
selectee.startselected = true;
97
selectee.$element.removeClass('ui-selected');
98
selectee.selected = false;
99
selectee.$element.addClass('ui-unselecting');
100
selectee.unselecting = true;
101
// selectable UNSELECTING callback
102
self._trigger("unselecting", event, {
103
unselecting: selectee.element
108
$(event.target).parents().andSelf().each(function() {
109
var selectee = $.data(this, "selectable-item");
111
selectee.$element.removeClass("ui-unselecting").addClass('ui-selecting');
112
selectee.unselecting = false;
113
selectee.selecting = true;
114
selectee.selected = true;
115
// selectable SELECTING callback
116
self._trigger("selecting", event, {
117
selecting: selectee.element
125
_mouseDrag: function(event) {
129
if (this.options.disabled)
132
var options = this.options;
134
var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
135
if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
136
if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
137
this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
139
this.selectees.each(function() {
140
var selectee = $.data(this, "selectable-item");
141
//prevent helper from being selected if appendTo: selectable
142
if (!selectee || selectee.element == self.element[0])
145
if (options.tolerance == 'touch') {
146
hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
147
} else if (options.tolerance == 'fit') {
148
hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
153
if (selectee.selected) {
154
selectee.$element.removeClass('ui-selected');
155
selectee.selected = false;
157
if (selectee.unselecting) {
158
selectee.$element.removeClass('ui-unselecting');
159
selectee.unselecting = false;
161
if (!selectee.selecting) {
162
selectee.$element.addClass('ui-selecting');
163
selectee.selecting = true;
164
// selectable SELECTING callback
165
self._trigger("selecting", event, {
166
selecting: selectee.element
171
if (selectee.selecting) {
172
if (event.metaKey && selectee.startselected) {
173
selectee.$element.removeClass('ui-selecting');
174
selectee.selecting = false;
175
selectee.$element.addClass('ui-selected');
176
selectee.selected = true;
178
selectee.$element.removeClass('ui-selecting');
179
selectee.selecting = false;
180
if (selectee.startselected) {
181
selectee.$element.addClass('ui-unselecting');
182
selectee.unselecting = true;
184
// selectable UNSELECTING callback
185
self._trigger("unselecting", event, {
186
unselecting: selectee.element
190
if (selectee.selected) {
191
if (!event.metaKey && !selectee.startselected) {
192
selectee.$element.removeClass('ui-selected');
193
selectee.selected = false;
195
selectee.$element.addClass('ui-unselecting');
196
selectee.unselecting = true;
197
// selectable UNSELECTING callback
198
self._trigger("unselecting", event, {
199
unselecting: selectee.element
209
_mouseStop: function(event) {
212
this.dragged = false;
214
var options = this.options;
216
$('.ui-unselecting', this.element[0]).each(function() {
217
var selectee = $.data(this, "selectable-item");
218
selectee.$element.removeClass('ui-unselecting');
219
selectee.unselecting = false;
220
selectee.startselected = false;
221
self._trigger("unselected", event, {
222
unselected: selectee.element
225
$('.ui-selecting', this.element[0]).each(function() {
226
var selectee = $.data(this, "selectable-item");
227
selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
228
selectee.selecting = false;
229
selectee.selected = true;
230
selectee.startselected = true;
231
self._trigger("selected", event, {
232
selected: selectee.element
235
this._trigger("stop", event);
237
this.helper.remove();
244
$.extend($.ui.selectable, {
249
cancel: ":input,option",