--- /dev/null
+/**
+ * Expose the _EventTarget class.
+ */
+module.exports = _EventTarget;
+
+function _EventTarget() {
+ // Do nothing if called for a native EventTarget object..
+ if (typeof this.addEventListener === 'function') {
+ return;
+ }
+
+ this._listeners = {};
+
+ this.addEventListener = _addEventListener;
+ this.removeEventListener = _removeEventListener;
+ this.dispatchEvent = _dispatchEvent;
+}
+
+Object.defineProperties(_EventTarget.prototype, {
+ listeners: {
+ get: function () {
+ return this._listeners;
+ }
+ }
+});
+
+function _addEventListener(type, newListener) {
+ var
+ listenersType,
+ i, listener;
+
+ if (!type || !newListener) {
+ return;
+ }
+
+ listenersType = this._listeners[type];
+ if (listenersType === undefined) {
+ this._listeners[type] = listenersType = [];
+ }
+
+ for (i = 0; !!(listener = listenersType[i]); i++) {
+ if (listener === newListener) {
+ return;
+ }
+ }
+
+ listenersType.push(newListener);
+}
+
+function _removeEventListener(type, oldListener) {
+ var
+ listenersType,
+ i, listener;
+
+ if (!type || !oldListener) {
+ return;
+ }
+
+ listenersType = this._listeners[type];
+ if (listenersType === undefined) {
+ return;
+ }
+
+ for (i = 0; !!(listener = listenersType[i]); i++) {
+ if (listener === oldListener) {
+ listenersType.splice(i, 1);
+ break;
+ }
+ }
+
+ if (listenersType.length === 0) {
+ delete this._listeners[type];
+ }
+}
+
+function _dispatchEvent(event) {
+ var
+ type,
+ listenersType,
+ dummyListener,
+ stopImmediatePropagation = false,
+ i, listener;
+
+ if (!event || typeof event.type !== 'string') {
+ throw new Error('`event` must have a valid `type` property');
+ }
+
+ // Do some stuff to emulate DOM Event behavior (just if this is not a
+ // DOM Event object)
+ if (event._yaeti) {
+ event.target = this;
+ event.cancelable = true;
+ }
+
+ // Attempt to override the stopImmediatePropagation() method
+ try {
+ event.stopImmediatePropagation = function () {
+ stopImmediatePropagation = true;
+ };
+ } catch (error) {}
+
+ type = event.type;
+ listenersType = (this._listeners[type] || []);
+
+ dummyListener = this['on' + type];
+ if (typeof dummyListener === 'function') {
+ dummyListener.call(this, event);
+ }
+
+ for (i = 0; !!(listener = listenersType[i]); i++) {
+ if (stopImmediatePropagation) {
+ break;
+ }
+
+ listener.call(this, event);
+ }
+
+ return !event.defaultPrevented;
+}