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",