aboutsummaryrefslogtreecommitdiffstats
path: root/ui/tests/ui.testmouse.js
blob: 57a9b85ebdad67fe0b4268c383a590912dd8e310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*
 * jQuery UI testMouse
 *
 * Copyright (c) 2008 Richard D. Worth (rdworth.org)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * Revision: $Id:$
 */
;(function($) {

	$.widget("ui.testMouse", {
		mouseX: 0,
		mouseY: 0,
		trackMouse: function() {},
		init: function() {
			var self = this;
			this.trackMouse = function(e) {
				if (e.isTrusted !== false) {
					self.mouseX = e.pageX;
					self.mouseY = e.pageY;
				}
			}
			$(document).bind("mousemove", this.trackMouse);
		},
		destroy: function() {
			$(document).unbind("mousemove", this.trackMouse);
		},
		center: function(offset) {
			var o = this.element.offset();
			return {
				x: (o.left + (offset || [0, 0])[0] || 0) + this.element.width() / 2,
				y: (o.top + (offset || [0, 0])[1] || 0) + this.element.height() / 2
			};
		},
		dispatch: function(type, x, y, button, relatedTarget) {
			var evt, e = {bubbles: true, cancelable: (type != "mousemove"), view: window, detail: 0,
				screenX: 0, screenY: 0, clientX: x, clientY: y,
				ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,
				button: button || 0, relatedTarget: relatedTarget, isTrusted: false};
			if ($.isFunction(document.createEvent)) {
				evt = document.createEvent("MouseEvents");
				if ($.isFunction(evt.initMouseEvent)) {
					evt.initMouseEvent(type, e.bubbles, e.cancelable, e.view, e.detail,
						e.screenX, e.screenY, e.clientX, e.clientY,
						e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
						e.button, e.relatedTarget);
				} else {
					evt = document.createEvent("UIEvents");
					evt.initEvent(type, bubbles, cancelable);
					$.extend(evt, e);
				}
				this.element[0].dispatchEvent(evt);
			} else if (document.createEventObject) {
				evt = document.createEventObject();
				$.extend(evt, e);
				evt.button = 1;
				this.element[0].fireEvent('on' + type, evt)  
			}
		},
		down: function(x, y) {
			this.dispatch("mousedown", x, y);
		},
		move: function(x, y) {
			this.dispatch("mousemove", x, y);
		},
		up: function(x, y) {
			this.dispatch("mouseup", x, y);
		},
		drag: function(dx, dy, complete) {
			var self = this;			

			var center = this.center();
			this.left = center.x;
			this.top = center.y;
		
			var OS = (/(win|mac|linux)/i.exec(navigator.platform) || ['other'])[0].toLowerCase();
		
			var defaultUrl = ['cursors', OS == 'other' ? 'win' : OS, 'default.png'].join('/');
			var cursorUrl = function() {
				return ['cursors', OS == 'other' ? 'win' : OS, self.element.css('cursor') + '.png'].join('/');
			}
			var noneUrl = ['cursors', OS == 'other' ? 'win' : OS, 'none' + ($.browser.safari ? '.png' : '.cur')].join('/');
		
			this.fakemouse = $('<img src="' + defaultUrl + '" />');
			this.realmouse = $('<img src="' + defaultUrl + '" />');
			if ($.browser.msie && $.browser.version == 6) {
				this.fakemouse = $('<div style="height:32;width:32;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + defaultUrl + '\', sizingMethod=\'scale\');" ></div>');
				this.realmouse = $('<div><div style="height:32;width:32;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + defaultUrl + '\', sizingMethod=\'scale\');" ></div></div>');
			}
			this.mousescreen = $('<div/>');
		
			this.updateCursor = function() {
				if ($.browser.msie && $.browser.version == 6) {
					self.fakemouse.css('filter', 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + cursorUrl() + '\', sizingMethod=\'scale\'');
				} else {
					self.fakemouse.attr('src', cursorUrl());
				}
			}
			this.resetCursor = function() {
				if ($.browser.msie && $.browser.version == 6) {
					self.fakemouse.css('filter', 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + defaultUrl + '\', sizingMethod=\'scale\'');
				} else {
					self.fakemouse.attr('src', defaultUrl);
				}
			}
			
			var testStart = function() {
				self.element.bind("mouseover", self.updateCursor).bind("mouseout", self.resetCursor);
				self.fakemouse.appendTo('body').css({ position: 'absolute', left: self.mouseX, top: self.mouseY, zIndex: 5000 });
				self.realmouse.appendTo('body').css({ position: 'absolute', left: self.mouseX, top: self.mouseY, zIndex: 5000, opacity: 0.1 });
				self.mousescreen.appendTo('body').css({ width: '100%', height: '100%', position: 'absolute', top: 0, left: 0, zIndex: 5000 })
					.mousemove(function(e) { self.realmouse.css({ left: e.pageX, top: e.pageY }); return false; })
					.mousedown(function() { return false; })
					.mouseup(function() { return false; });
				self.mousescreen.css('cursor', 'url(' + noneUrl + '), crosshair');
				($.browser.opera && mousescreen.css('cursor', 'crosshair'));
			}
			var testStop = function() {
				self.element.unbind("mouseover", self.updateCursor).unbind("mouseout", self.resetCursor);
				self.mousescreen.remove();
				self.mouseX = self.realmouse.css("left");
				self.mouseY = self.realmouse.css("top");
				self.realmouse.remove();
				self.fakemouse.remove();
				($.isFunction(complete) && complete.apply());
			}
			
			testStart();
		
			this.lastX = null;
		
			this.fakemouse
				.animate({ left: this.left, top: this.top }, this.options.speed, function() {
					self.element.triggerHandler('mouseover');
					self.down(self.left, self.top);
					self.move(self.left, self.top);
				})
				.animate({ left: this.left + dx, top: this.top + dy }, {
					speed: self.options.speed,
					easing: "swing",
					step: function (xory) {
						if (!self.lastX) {
							self.lastX = xory;
						} else {
							var x = self.lastX, y = xory;
							self.move(x, y);
							self.lastX = null;
						}
					},
					complete: function() {
						self.element.triggerHandler('mouseout');
						self.up(0, 0);
						$(this).animate({ left: self.realmouse.css("left"), top: self.realmouse.css("top") }, {
							speed: self.options.speed,
							complete: function() {
								testStop();
							}
						})
					}
				});
		
		}
	});

	$.ui.testMouse.defaults = {
		speed: "slow"
	}

})(jQuery);