Subversion Repositories Sites.obs-saisons.fr

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
40 aurelien 1
/*
2
 * jQuery UI Selectable 1.8.5
3
 *
4
 * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
5
 * Dual licensed under the MIT or GPL Version 2 licenses.
6
 * http://jquery.org/license
7
 *
8
 * http://docs.jquery.com/UI/Selectables
9
 *
10
 * Depends:
11
 *	jquery.ui.core.js
12
 *	jquery.ui.mouse.js
13
 *	jquery.ui.widget.js
14
 */
15
(function( $, undefined ) {
16
 
17
$.widget("ui.selectable", $.ui.mouse, {
18
	options: {
19
		appendTo: 'body',
20
		autoRefresh: true,
21
		distance: 0,
22
		filter: '*',
23
		tolerance: 'touch'
24
	},
25
	_create: function() {
26
		var self = this;
27
 
28
		this.element.addClass("ui-selectable");
29
 
30
		this.dragged = false;
31
 
32
		// cache selectee children based on filter
33
		var selectees;
34
		this.refresh = function() {
35
			selectees = $(self.options.filter, self.element[0]);
36
			selectees.each(function() {
37
				var $this = $(this);
38
				var pos = $this.offset();
39
				$.data(this, "selectable-item", {
40
					element: this,
41
					$element: $this,
42
					left: pos.left,
43
					top: pos.top,
44
					right: pos.left + $this.outerWidth(),
45
					bottom: pos.top + $this.outerHeight(),
46
					startselected: false,
47
					selected: $this.hasClass('ui-selected'),
48
					selecting: $this.hasClass('ui-selecting'),
49
					unselecting: $this.hasClass('ui-unselecting')
50
				});
51
			});
52
		};
53
		this.refresh();
54
 
55
		this.selectees = selectees.addClass("ui-selectee");
56
 
57
		this._mouseInit();
58
 
59
		this.helper = $("<div class='ui-selectable-helper'></div>");
60
	},
61
 
62
	destroy: function() {
63
		this.selectees
64
			.removeClass("ui-selectee")
65
			.removeData("selectable-item");
66
		this.element
67
			.removeClass("ui-selectable ui-selectable-disabled")
68
			.removeData("selectable")
69
			.unbind(".selectable");
70
		this._mouseDestroy();
71
 
72
		return this;
73
	},
74
 
75
	_mouseStart: function(event) {
76
		var self = this;
77
 
78
		this.opos = [event.pageX, event.pageY];
79
 
80
		if (this.options.disabled)
81
			return;
82
 
83
		var options = this.options;
84
 
85
		this.selectees = $(options.filter, this.element[0]);
86
 
87
		this._trigger("start", event);
88
 
89
		$(options.appendTo).append(this.helper);
90
		// position helper (lasso)
91
		this.helper.css({
92
			"left": event.clientX,
93
			"top": event.clientY,
94
			"width": 0,
95
			"height": 0
96
		});
97
 
98
		if (options.autoRefresh) {
99
			this.refresh();
100
		}
101
 
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
113
				});
114
			}
115
		});
116
 
117
		$(event.target).parents().andSelf().each(function() {
118
			var selectee = $.data(this, "selectable-item");
119
			if (selectee) {
120
				var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
121
				selectee.$element
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
128
				if (doSelect) {
129
					self._trigger("selecting", event, {
130
						selecting: selectee.element
131
					});
132
				} else {
133
					self._trigger("unselecting", event, {
134
						unselecting: selectee.element
135
					});
136
				}
137
				return false;
138
			}
139
		});
140
 
141
	},
142
 
143
	_mouseDrag: function(event) {
144
		var self = this;
145
		this.dragged = true;
146
 
147
		if (this.options.disabled)
148
			return;
149
 
150
		var options = this.options;
151
 
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});
156
 
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])
161
				return;
162
			var hit = false;
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);
167
			}
168
 
169
			if (hit) {
170
				// SELECT
171
				if (selectee.selected) {
172
					selectee.$element.removeClass('ui-selected');
173
					selectee.selected = false;
174
				}
175
				if (selectee.unselecting) {
176
					selectee.$element.removeClass('ui-unselecting');
177
					selectee.unselecting = false;
178
				}
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
185
					});
186
				}
187
			} else {
188
				// UNSELECT
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;
195
					} else {
196
						selectee.$element.removeClass('ui-selecting');
197
						selectee.selecting = false;
198
						if (selectee.startselected) {
199
							selectee.$element.addClass('ui-unselecting');
200
							selectee.unselecting = true;
201
						}
202
						// selectable UNSELECTING callback
203
						self._trigger("unselecting", event, {
204
							unselecting: selectee.element
205
						});
206
					}
207
				}
208
				if (selectee.selected) {
209
					if (!event.metaKey && !selectee.startselected) {
210
						selectee.$element.removeClass('ui-selected');
211
						selectee.selected = false;
212
 
213
						selectee.$element.addClass('ui-unselecting');
214
						selectee.unselecting = true;
215
						// selectable UNSELECTING callback
216
						self._trigger("unselecting", event, {
217
							unselecting: selectee.element
218
						});
219
					}
220
				}
221
			}
222
		});
223
 
224
		return false;
225
	},
226
 
227
	_mouseStop: function(event) {
228
		var self = this;
229
 
230
		this.dragged = false;
231
 
232
		var options = this.options;
233
 
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
241
			});
242
		});
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
251
			});
252
		});
253
		this._trigger("stop", event);
254
 
255
		this.helper.remove();
256
 
257
		return false;
258
	}
259
 
260
});
261
 
262
$.extend($.ui.selectable, {
263
	version: "1.8.5"
264
});
265
 
266
})(jQuery);