267 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			267 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
 * jQuery UI Selectable 1.8.10
 | 
						|
 *
 | 
						|
 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
 | 
						|
 * Dual licensed under the MIT or GPL Version 2 licenses.
 | 
						|
 * http://jquery.org/license
 | 
						|
 *
 | 
						|
 * http://docs.jquery.com/UI/Selectables
 | 
						|
 *
 | 
						|
 * Depends:
 | 
						|
 *	jquery.ui.core.js
 | 
						|
 *	jquery.ui.mouse.js
 | 
						|
 *	jquery.ui.widget.js
 | 
						|
 */
 | 
						|
(function( $, undefined ) {
 | 
						|
 | 
						|
$.widget("ui.selectable", $.ui.mouse, {
 | 
						|
	options: {
 | 
						|
		appendTo: 'body',
 | 
						|
		autoRefresh: true,
 | 
						|
		distance: 0,
 | 
						|
		filter: '*',
 | 
						|
		tolerance: 'touch'
 | 
						|
	},
 | 
						|
	_create: function() {
 | 
						|
		var self = this;
 | 
						|
 | 
						|
		this.element.addClass("ui-selectable");
 | 
						|
 | 
						|
		this.dragged = false;
 | 
						|
 | 
						|
		// cache selectee children based on filter
 | 
						|
		var selectees;
 | 
						|
		this.refresh = function() {
 | 
						|
			selectees = $(self.options.filter, self.element[0]);
 | 
						|
			selectees.each(function() {
 | 
						|
				var $this = $(this);
 | 
						|
				var pos = $this.offset();
 | 
						|
				$.data(this, "selectable-item", {
 | 
						|
					element: this,
 | 
						|
					$element: $this,
 | 
						|
					left: pos.left,
 | 
						|
					top: pos.top,
 | 
						|
					right: pos.left + $this.outerWidth(),
 | 
						|
					bottom: pos.top + $this.outerHeight(),
 | 
						|
					startselected: false,
 | 
						|
					selected: $this.hasClass('ui-selected'),
 | 
						|
					selecting: $this.hasClass('ui-selecting'),
 | 
						|
					unselecting: $this.hasClass('ui-unselecting')
 | 
						|
				});
 | 
						|
			});
 | 
						|
		};
 | 
						|
		this.refresh();
 | 
						|
 | 
						|
		this.selectees = selectees.addClass("ui-selectee");
 | 
						|
 | 
						|
		this._mouseInit();
 | 
						|
 | 
						|
		this.helper = $("<div class='ui-selectable-helper'></div>");
 | 
						|
	},
 | 
						|
 | 
						|
	destroy: function() {
 | 
						|
		this.selectees
 | 
						|
			.removeClass("ui-selectee")
 | 
						|
			.removeData("selectable-item");
 | 
						|
		this.element
 | 
						|
			.removeClass("ui-selectable ui-selectable-disabled")
 | 
						|
			.removeData("selectable")
 | 
						|
			.unbind(".selectable");
 | 
						|
		this._mouseDestroy();
 | 
						|
 | 
						|
		return this;
 | 
						|
	},
 | 
						|
 | 
						|
	_mouseStart: function(event) {
 | 
						|
		var self = this;
 | 
						|
 | 
						|
		this.opos = [event.pageX, event.pageY];
 | 
						|
 | 
						|
		if (this.options.disabled)
 | 
						|
			return;
 | 
						|
 | 
						|
		var options = this.options;
 | 
						|
 | 
						|
		this.selectees = $(options.filter, this.element[0]);
 | 
						|
 | 
						|
		this._trigger("start", event);
 | 
						|
 | 
						|
		$(options.appendTo).append(this.helper);
 | 
						|
		// position helper (lasso)
 | 
						|
		this.helper.css({
 | 
						|
			"left": event.clientX,
 | 
						|
			"top": event.clientY,
 | 
						|
			"width": 0,
 | 
						|
			"height": 0
 | 
						|
		});
 | 
						|
 | 
						|
		if (options.autoRefresh) {
 | 
						|
			this.refresh();
 | 
						|
		}
 | 
						|
 | 
						|
		this.selectees.filter('.ui-selected').each(function() {
 | 
						|
			var selectee = $.data(this, "selectable-item");
 | 
						|
			selectee.startselected = true;
 | 
						|
			if (!event.metaKey) {
 | 
						|
				selectee.$element.removeClass('ui-selected');
 | 
						|
				selectee.selected = false;
 | 
						|
				selectee.$element.addClass('ui-unselecting');
 | 
						|
				selectee.unselecting = true;
 | 
						|
				// selectable UNSELECTING callback
 | 
						|
				self._trigger("unselecting", event, {
 | 
						|
					unselecting: selectee.element
 | 
						|
				});
 | 
						|
			}
 | 
						|
		});
 | 
						|
 | 
						|
		$(event.target).parents().andSelf().each(function() {
 | 
						|
			var selectee = $.data(this, "selectable-item");
 | 
						|
			if (selectee) {
 | 
						|
				var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
 | 
						|
				selectee.$element
 | 
						|
					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
 | 
						|
					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
 | 
						|
				selectee.unselecting = !doSelect;
 | 
						|
				selectee.selecting = doSelect;
 | 
						|
				selectee.selected = doSelect;
 | 
						|
				// selectable (UN)SELECTING callback
 | 
						|
				if (doSelect) {
 | 
						|
					self._trigger("selecting", event, {
 | 
						|
						selecting: selectee.element
 | 
						|
					});
 | 
						|
				} else {
 | 
						|
					self._trigger("unselecting", event, {
 | 
						|
						unselecting: selectee.element
 | 
						|
					});
 | 
						|
				}
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
		});
 | 
						|
 | 
						|
	},
 | 
						|
 | 
						|
	_mouseDrag: function(event) {
 | 
						|
		var self = this;
 | 
						|
		this.dragged = true;
 | 
						|
 | 
						|
		if (this.options.disabled)
 | 
						|
			return;
 | 
						|
 | 
						|
		var options = this.options;
 | 
						|
 | 
						|
		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
 | 
						|
		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
 | 
						|
		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
 | 
						|
		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
 | 
						|
 | 
						|
		this.selectees.each(function() {
 | 
						|
			var selectee = $.data(this, "selectable-item");
 | 
						|
			//prevent helper from being selected if appendTo: selectable
 | 
						|
			if (!selectee || selectee.element == self.element[0])
 | 
						|
				return;
 | 
						|
			var hit = false;
 | 
						|
			if (options.tolerance == 'touch') {
 | 
						|
				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
 | 
						|
			} else if (options.tolerance == 'fit') {
 | 
						|
				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
 | 
						|
			}
 | 
						|
 | 
						|
			if (hit) {
 | 
						|
				// SELECT
 | 
						|
				if (selectee.selected) {
 | 
						|
					selectee.$element.removeClass('ui-selected');
 | 
						|
					selectee.selected = false;
 | 
						|
				}
 | 
						|
				if (selectee.unselecting) {
 | 
						|
					selectee.$element.removeClass('ui-unselecting');
 | 
						|
					selectee.unselecting = false;
 | 
						|
				}
 | 
						|
				if (!selectee.selecting) {
 | 
						|
					selectee.$element.addClass('ui-selecting');
 | 
						|
					selectee.selecting = true;
 | 
						|
					// selectable SELECTING callback
 | 
						|
					self._trigger("selecting", event, {
 | 
						|
						selecting: selectee.element
 | 
						|
					});
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				// UNSELECT
 | 
						|
				if (selectee.selecting) {
 | 
						|
					if (event.metaKey && selectee.startselected) {
 | 
						|
						selectee.$element.removeClass('ui-selecting');
 | 
						|
						selectee.selecting = false;
 | 
						|
						selectee.$element.addClass('ui-selected');
 | 
						|
						selectee.selected = true;
 | 
						|
					} else {
 | 
						|
						selectee.$element.removeClass('ui-selecting');
 | 
						|
						selectee.selecting = false;
 | 
						|
						if (selectee.startselected) {
 | 
						|
							selectee.$element.addClass('ui-unselecting');
 | 
						|
							selectee.unselecting = true;
 | 
						|
						}
 | 
						|
						// selectable UNSELECTING callback
 | 
						|
						self._trigger("unselecting", event, {
 | 
						|
							unselecting: selectee.element
 | 
						|
						});
 | 
						|
					}
 | 
						|
				}
 | 
						|
				if (selectee.selected) {
 | 
						|
					if (!event.metaKey && !selectee.startselected) {
 | 
						|
						selectee.$element.removeClass('ui-selected');
 | 
						|
						selectee.selected = false;
 | 
						|
 | 
						|
						selectee.$element.addClass('ui-unselecting');
 | 
						|
						selectee.unselecting = true;
 | 
						|
						// selectable UNSELECTING callback
 | 
						|
						self._trigger("unselecting", event, {
 | 
						|
							unselecting: selectee.element
 | 
						|
						});
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		});
 | 
						|
 | 
						|
		return false;
 | 
						|
	},
 | 
						|
 | 
						|
	_mouseStop: function(event) {
 | 
						|
		var self = this;
 | 
						|
 | 
						|
		this.dragged = false;
 | 
						|
 | 
						|
		var options = this.options;
 | 
						|
 | 
						|
		$('.ui-unselecting', this.element[0]).each(function() {
 | 
						|
			var selectee = $.data(this, "selectable-item");
 | 
						|
			selectee.$element.removeClass('ui-unselecting');
 | 
						|
			selectee.unselecting = false;
 | 
						|
			selectee.startselected = false;
 | 
						|
			self._trigger("unselected", event, {
 | 
						|
				unselected: selectee.element
 | 
						|
			});
 | 
						|
		});
 | 
						|
		$('.ui-selecting', this.element[0]).each(function() {
 | 
						|
			var selectee = $.data(this, "selectable-item");
 | 
						|
			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
 | 
						|
			selectee.selecting = false;
 | 
						|
			selectee.selected = true;
 | 
						|
			selectee.startselected = true;
 | 
						|
			self._trigger("selected", event, {
 | 
						|
				selected: selectee.element
 | 
						|
			});
 | 
						|
		});
 | 
						|
		this._trigger("stop", event);
 | 
						|
 | 
						|
		this.helper.remove();
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
});
 | 
						|
 | 
						|
$.extend($.ui.selectable, {
 | 
						|
	version: "1.8.10"
 | 
						|
});
 | 
						|
 | 
						|
})(jQuery);
 |