Bug 20489 Configure illegal file characters https://bugzilla.wikimedia.org/show_bug...
[mediawiki.git] / js2 / mwEmbed / jquery / jquery.ui / ui / ui.selectable.js
blob32bc3d3a8a0dbd0c7b33d9a32464f3a2b8f7a491
1 /*
2  * jQuery UI Selectable 1.7.1
3  *
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.
7  *
8  * http://docs.jquery.com/UI/Selectables
9  *
10  * Depends:
11  *      ui.core.js
12  */
13 (function($) {
15 $.widget("ui.selectable", $.extend({}, $.ui.mouse, {
17         _init: function() {
18                 var self = this;
20                 this.element.addClass("ui-selectable");
22                 this.dragged = false;
24                 // cache selectee children based on filter
25                 var selectees;
26                 this.refresh = function() {
27                         selectees = $(self.options.filter, self.element[0]);
28                         selectees.each(function() {
29                                 var $this = $(this);
30                                 var pos = $this.offset();
31                                 $.data(this, "selectable-item", {
32                                         element: this,
33                                         $element: $this,
34                                         left: pos.left,
35                                         top: pos.top,
36                                         right: pos.left + $this.outerWidth(),
37                                         bottom: pos.top + $this.outerHeight(),
38                                         startselected: false,
39                                         selected: $this.hasClass('ui-selected'),
40                                         selecting: $this.hasClass('ui-selecting'),
41                                         unselecting: $this.hasClass('ui-unselecting')
42                                 });
43                         });
44                 };
45                 this.refresh();
47                 this.selectees = selectees.addClass("ui-selectee");
49                 this._mouseInit();
51                 this.helper = $(document.createElement('div'))
52                         .css({border:'1px dotted black'})
53                         .addClass("ui-selectable-helper");
54         },
56         destroy: function() {
57                 this.element
58                         .removeClass("ui-selectable ui-selectable-disabled")
59                         .removeData("selectable")
60                         .unbind(".selectable");
61                 this._mouseDestroy();
62         },
64         _mouseStart: function(event) {
65                 var self = this;
67                 this.opos = [event.pageX, event.pageY];
69                 if (this.options.disabled)
70                         return;
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)
80                 this.helper.css({
81                         "z-index": 100,
82                         "position": "absolute",
83                         "left": event.clientX,
84                         "top": event.clientY,
85                         "width": 0,
86                         "height": 0
87                 });
89                 if (options.autoRefresh) {
90                         this.refresh();
91                 }
93                 this.selectees.filter('.ui-selected').each(function() {
94                         var selectee = $.data(this, "selectable-item");
95                         selectee.startselected = true;
96                         if (!event.metaKey) {
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
104                                 });
105                         }
106                 });
108                 $(event.target).parents().andSelf().each(function() {
109                         var selectee = $.data(this, "selectable-item");
110                         if (selectee) {
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
118                                 });
119                                 return false;
120                         }
121                 });
123         },
125         _mouseDrag: function(event) {
126                 var self = this;
127                 this.dragged = true;
129                 if (this.options.disabled)
130                         return;
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])
143                                 return;
144                         var hit = false;
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);
149                         }
151                         if (hit) {
152                                 // SELECT
153                                 if (selectee.selected) {
154                                         selectee.$element.removeClass('ui-selected');
155                                         selectee.selected = false;
156                                 }
157                                 if (selectee.unselecting) {
158                                         selectee.$element.removeClass('ui-unselecting');
159                                         selectee.unselecting = false;
160                                 }
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
167                                         });
168                                 }
169                         } else {
170                                 // UNSELECT
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;
177                                         } else {
178                                                 selectee.$element.removeClass('ui-selecting');
179                                                 selectee.selecting = false;
180                                                 if (selectee.startselected) {
181                                                         selectee.$element.addClass('ui-unselecting');
182                                                         selectee.unselecting = true;
183                                                 }
184                                                 // selectable UNSELECTING callback
185                                                 self._trigger("unselecting", event, {
186                                                         unselecting: selectee.element
187                                                 });
188                                         }
189                                 }
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
200                                                 });
201                                         }
202                                 }
203                         }
204                 });
206                 return false;
207         },
209         _mouseStop: function(event) {
210                 var self = this;
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
223                         });
224                 });
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
233                         });
234                 });
235                 this._trigger("stop", event);
237                 this.helper.remove();
239                 return false;
240         }
242 }));
244 $.extend($.ui.selectable, {
245         version: "1.7.1",
246         defaults: {
247                 appendTo: 'body',
248                 autoRefresh: true,
249                 cancel: ":input,option",
250                 delay: 0,
251                 distance: 0,
252                 filter: '*',
253                 tolerance: 'touch'
254         }
257 })(jQuery);