forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			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); |