Subversion Repositories qbpwcf-lib(archive)

Rev

Rev 915 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 liveuser 1
/**
2
 * Expose the _EventTarget class.
3
 */
4
module.exports = _EventTarget;
5
 
6
 
7
function _EventTarget() {
8
	// Do nothing if called for a native EventTarget object..
9
	if (typeof this.addEventListener === 'function') {
10
		return;
11
	}
12
 
13
	this._listeners = {};
14
 
15
	this.addEventListener = _addEventListener;
16
	this.removeEventListener = _removeEventListener;
17
	this.dispatchEvent = _dispatchEvent;
18
}
19
 
20
 
21
Object.defineProperties(_EventTarget.prototype, {
22
	listeners: {
23
		get: function () {
24
			return this._listeners;
25
		}
26
	}
27
});
28
 
29
 
30
function _addEventListener(type, newListener) {
31
	var listenersType,
32
		i, listener;
33
 
34
	if (!type || !newListener) {
35
		return;
36
	}
37
 
38
	listenersType = this._listeners[type];
39
	if (listenersType === undefined) {
40
		this._listeners[type] = listenersType = [];
41
	}
42
 
43
	for (i = 0; !!(listener = listenersType[i]); i++) {
44
		if (listener === newListener) {
45
			return;
46
		}
47
	}
48
 
49
	listenersType.push(newListener);
50
}
51
 
52
 
53
function _removeEventListener(type, oldListener) {
54
	var listenersType,
55
		i, listener;
56
 
57
	if (!type || !oldListener) {
58
		return;
59
	}
60
 
61
	listenersType = this._listeners[type];
62
	if (listenersType === undefined) {
63
		return;
64
	}
65
 
66
	for (i = 0; !!(listener = listenersType[i]); i++) {
67
		if (listener === oldListener) {
68
			listenersType.splice(i, 1);
69
			break;
70
		}
71
	}
72
 
73
	if (listenersType.length === 0) {
74
		delete this._listeners[type];
75
	}
76
}
77
 
78
 
79
function _dispatchEvent(event) {
80
	var type,
81
		listenersType,
82
		dummyListener,
83
		stopImmediatePropagation = false,
84
		i, listener;
85
 
86
	if (!event || typeof event.type !== 'string') {
87
		throw new Error('`event` must have a valid `type` property');
88
	}
89
 
90
	if (event._dispatched) {
91
		throw new Error('event already dispatched');
92
	}
93
	event._dispatched = true;
94
 
95
	// Force the event to be cancelable.
96
	event.cancelable = true;
97
	event.target = this;
98
 
99
	// Override stopImmediatePropagation() function.
100
	event.stopImmediatePropagation = function () {
101
		stopImmediatePropagation = true;
102
	};
103
 
104
	type = event.type;
105
	listenersType = (this._listeners[type] || []);
106
 
107
	dummyListener = this['on' + type];
108
	if (typeof dummyListener === 'function') {
109
		listenersType.push(dummyListener);
110
	}
111
 
112
	for (i = 0; !!(listener = listenersType[i]); i++) {
113
		if (stopImmediatePropagation) {
114
			break;
115
		}
116
 
117
		listener.call(this, event);
118
	}
119
 
120
	return !event.defaultPrevented;
121
}