2 * jQuery UI Selectable 1.8.10
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, {