Project

General

Profile

1
/*!
2
 * jQuery UI Mouse 1.8.6
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/Mouse
9
 *
10
 * Depends:
11
 *	jquery.ui.widget.js
12
 */
13
(function( $, undefined ) {
14

    
15
$.widget("ui.mouse", {
16
	options: {
17
		cancel: ':input,option',
18
		distance: 1,
19
		delay: 0
20
	},
21
	_mouseInit: function() {
22
		var self = this;
23

    
24
		this.element
25
			.bind('mousedown.'+this.widgetName, function(event) {
26
				return self._mouseDown(event);
27
			})
28
			.bind('click.'+this.widgetName, function(event) {
29
				if(self._preventClickEvent) {
30
					self._preventClickEvent = false;
31
					event.stopImmediatePropagation();
32
					return false;
33
				}
34
			});
35

    
36
		this.started = false;
37
	},
38

    
39
	// TODO: make sure destroying one instance of mouse doesn't mess with
40
	// other instances of mouse
41
	_mouseDestroy: function() {
42
		this.element.unbind('.'+this.widgetName);
43
	},
44

    
45
	_mouseDown: function(event) {
46
		// don't let more than one widget handle mouseStart
47
		// TODO: figure out why we have to use originalEvent
48
		event.originalEvent = event.originalEvent || {};
49
		if (event.originalEvent.mouseHandled) { return; }
50

    
51
		// we may have missed mouseup (out of window)
52
		(this._mouseStarted && this._mouseUp(event));
53

    
54
		this._mouseDownEvent = event;
55

    
56
		var self = this,
57
			btnIsLeft = (event.which == 1),
58
			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
59
		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
60
			return true;
61
		}
62

    
63
		this.mouseDelayMet = !this.options.delay;
64
		if (!this.mouseDelayMet) {
65
			this._mouseDelayTimer = setTimeout(function() {
66
				self.mouseDelayMet = true;
67
			}, this.options.delay);
68
		}
69

    
70
		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
71
			this._mouseStarted = (this._mouseStart(event) !== false);
72
			if (!this._mouseStarted) {
73
				event.preventDefault();
74
				return true;
75
			}
76
		}
77

    
78
		// these delegates are required to keep context
79
		this._mouseMoveDelegate = function(event) {
80
			return self._mouseMove(event);
81
		};
82
		this._mouseUpDelegate = function(event) {
83
			return self._mouseUp(event);
84
		};
85
		$(document)
86
			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
87
			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
88

    
89
		event.preventDefault();
90
		event.originalEvent.mouseHandled = true;
91
		return true;
92
	},
93

    
94
	_mouseMove: function(event) {
95
		// IE mouseup check - mouseup happened when mouse was out of window
96
		if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
97
			return this._mouseUp(event);
98
		}
99

    
100
		if (this._mouseStarted) {
101
			this._mouseDrag(event);
102
			return event.preventDefault();
103
		}
104

    
105
		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
106
			this._mouseStarted =
107
				(this._mouseStart(this._mouseDownEvent, event) !== false);
108
			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
109
		}
110

    
111
		return !this._mouseStarted;
112
	},
113

    
114
	_mouseUp: function(event) {
115
		$(document)
116
			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
117
			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
118

    
119
		if (this._mouseStarted) {
120
			this._mouseStarted = false;
121
			this._preventClickEvent = (event.target == this._mouseDownEvent.target);
122
			this._mouseStop(event);
123
		}
124

    
125
		return false;
126
	},
127

    
128
	_mouseDistanceMet: function(event) {
129
		return (Math.max(
130
				Math.abs(this._mouseDownEvent.pageX - event.pageX),
131
				Math.abs(this._mouseDownEvent.pageY - event.pageY)
132
			) >= this.options.distance
133
		);
134
	},
135

    
136
	_mouseDelayMet: function(event) {
137
		return this.mouseDelayMet;
138
	},
139

    
140
	// These are placeholder methods, to be overriden by extending plugin
141
	_mouseStart: function(event) {},
142
	_mouseDrag: function(event) {},
143
	_mouseStop: function(event) {},
144
	_mouseCapture: function(event) { return true; }
145
});
146

    
147
})(jQuery);
(24-24/32)