2 * jQuery UI Selectable 1.11.2
5 * Copyright 2014 jQuery Foundation and other contributors
6 * Released under the MIT license.
7 * http://jquery.org/license
9 * http://api.jqueryui.com/selectable/
11 (function( factory ) {
12 if ( typeof define === "function" && define.amd ) {
14 // AMD. Register as an anonymous module.
28 return $.widget("ui.selectable", $.ui.mouse, {
49 this.element.addClass("ui-selectable");
53 // cache selectee children based on filter
54 this.refresh = function() {
55 selectees = $(that.options.filter, that.element[0]);
56 selectees.addClass("ui-selectee");
57 selectees.each(function() {
60 $.data(this, "selectable-item", {
65 right: pos.left + $this.outerWidth(),
66 bottom: pos.top + $this.outerHeight(),
68 selected: $this.hasClass("ui-selected"),
69 selecting: $this.hasClass("ui-selecting"),
70 unselecting: $this.hasClass("ui-unselecting")
76 this.selectees = selectees.addClass("ui-selectee");
80 this.helper = $("<div class='ui-selectable-helper'></div>");
83 _destroy: function() {
85 .removeClass("ui-selectee")
86 .removeData("selectable-item");
88 .removeClass("ui-selectable ui-selectable-disabled");
92 _mouseStart: function(event) {
94 options = this.options;
96 this.opos = [ event.pageX, event.pageY ];
98 if (this.options.disabled) {
102 this.selectees = $(options.filter, this.element[0]);
104 this._trigger("start", event);
106 $(options.appendTo).append(this.helper);
107 // position helper (lasso)
115 if (options.autoRefresh) {
119 this.selectees.filter(".ui-selected").each(function() {
120 var selectee = $.data(this, "selectable-item");
121 selectee.startselected = true;
122 if (!event.metaKey && !event.ctrlKey) {
123 selectee.$element.removeClass("ui-selected");
124 selectee.selected = false;
125 selectee.$element.addClass("ui-unselecting");
126 selectee.unselecting = true;
127 // selectable UNSELECTING callback
128 that._trigger("unselecting", event, {
129 unselecting: selectee.element
134 $(event.target).parents().addBack().each(function() {
136 selectee = $.data(this, "selectable-item");
138 doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
140 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
141 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
142 selectee.unselecting = !doSelect;
143 selectee.selecting = doSelect;
144 selectee.selected = doSelect;
145 // selectable (UN)SELECTING callback
147 that._trigger("selecting", event, {
148 selecting: selectee.element
151 that._trigger("unselecting", event, {
152 unselecting: selectee.element
161 _mouseDrag: function(event) {
165 if (this.options.disabled) {
171 options = this.options,
177 if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
178 if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
179 this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
181 this.selectees.each(function() {
182 var selectee = $.data(this, "selectable-item"),
185 //prevent helper from being selected if appendTo: selectable
186 if (!selectee || selectee.element === that.element[0]) {
190 if (options.tolerance === "touch") {
191 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
192 } else if (options.tolerance === "fit") {
193 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
198 if (selectee.selected) {
199 selectee.$element.removeClass("ui-selected");
200 selectee.selected = false;
202 if (selectee.unselecting) {
203 selectee.$element.removeClass("ui-unselecting");
204 selectee.unselecting = false;
206 if (!selectee.selecting) {
207 selectee.$element.addClass("ui-selecting");
208 selectee.selecting = true;
209 // selectable SELECTING callback
210 that._trigger("selecting", event, {
211 selecting: selectee.element
216 if (selectee.selecting) {
217 if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
218 selectee.$element.removeClass("ui-selecting");
219 selectee.selecting = false;
220 selectee.$element.addClass("ui-selected");
221 selectee.selected = true;
223 selectee.$element.removeClass("ui-selecting");
224 selectee.selecting = false;
225 if (selectee.startselected) {
226 selectee.$element.addClass("ui-unselecting");
227 selectee.unselecting = true;
229 // selectable UNSELECTING callback
230 that._trigger("unselecting", event, {
231 unselecting: selectee.element
235 if (selectee.selected) {
236 if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
237 selectee.$element.removeClass("ui-selected");
238 selectee.selected = false;
240 selectee.$element.addClass("ui-unselecting");
241 selectee.unselecting = true;
242 // selectable UNSELECTING callback
243 that._trigger("unselecting", event, {
244 unselecting: selectee.element
254 _mouseStop: function(event) {
257 this.dragged = false;
259 $(".ui-unselecting", this.element[0]).each(function() {
260 var selectee = $.data(this, "selectable-item");
261 selectee.$element.removeClass("ui-unselecting");
262 selectee.unselecting = false;
263 selectee.startselected = false;
264 that._trigger("unselected", event, {
265 unselected: selectee.element
268 $(".ui-selecting", this.element[0]).each(function() {
269 var selectee = $.data(this, "selectable-item");
270 selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
271 selectee.selecting = false;
272 selectee.selected = true;
273 selectee.startselected = true;
274 that._trigger("selected", event, {
275 selected: selectee.element
278 this._trigger("stop", event);
280 this.helper.remove();