/**
* @namespace WPGMZA
* @module EventDispatcher
* @requires WPGMZA
*/
(function($) {
WPGMZA.EventDispatcher = function()
{
WPGMZA.assertInstanceOf(this, "EventDispatcher");
this._listenersByType = [];
}
WPGMZA.EventDispatcher.prototype.addEventListener = function(type, listener, thisObject, useCapture)
{
var arr;
var types = type.split(/\s+/);
if(types.length > 1)
{
for(var i = 0; i < types.length; i++)
this.addEventListener(types[i], listener, thisObject, useCapture);
return;
}
if(!(listener instanceof Function))
throw new Error("Listener must be a function");
if(!(arr = this._listenersByType[type]))
arr = this._listenersByType[type] = [];
var obj = {
listener: listener,
thisObject: (thisObject ? thisObject : this),
useCapture: (useCapture ? true : false)
};
arr.push(obj);
}
WPGMZA.EventDispatcher.prototype.on = WPGMZA.EventDispatcher.prototype.addEventListener;
WPGMZA.EventDispatcher.prototype.removeEventListener = function(type, listener, thisObject, useCapture)
{
var arr, index, obj;
if(!(arr = this._listenersByType[type]))
return;
if(!thisObject)
thisObject = this;
useCapture = (useCapture ? true : false);
for(var i = 0; i < arr.length; i++)
{
obj = arr[i];
if(obj.listener == listener && obj.thisObject == thisObject && obj.useCapture == useCapture)
{
arr.splice(i, 1);
return;
}
}
}
WPGMZA.EventDispatcher.prototype.off = WPGMZA.EventDispatcher.prototype.removeEventListener;
WPGMZA.EventDispatcher.prototype.hasEventListener = function(type)
{
return (_listenersByType[type] ? true : false);
}
WPGMZA.EventDispatcher.prototype.dispatchEvent = function(event)
{
if(!(event instanceof WPGMZA.Event))
{
if(typeof event == "string")
event = new WPGMZA.Event(event);
else
{
var src = event;
event = new WPGMZA.Event();
for(var name in src)
event[name] = src[name];
}
}
event.target = this;
var path = [];
for(var obj = this.parent; obj != null; obj = obj.parent)
path.unshift(obj);
event.phase = WPGMZA.Event.CAPTURING_PHASE;
for(var i = 0; i < path.length && !event._cancelled; i++)
path[i]._triggerListeners(event);
if(event._cancelled)
return;
event.phase = WPGMZA.Event.AT_TARGET;
this._triggerListeners(event);
event.phase = WPGMZA.Event.BUBBLING_PHASE;
for(i = path.length - 1; i >= 0 && !event._cancelled; i--)
path[i]._triggerListeners(event);
}
WPGMZA.EventDispatcher.prototype.trigger = WPGMZA.EventDispatcher.prototype.dispatchEvent;
WPGMZA.EventDispatcher.prototype._triggerListeners = function(event)
{
var arr, obj;
if(!(arr = this._listenersByType[event.type]))
return;
for(var i = 0; i < arr.length; i++)
{
obj = arr[i];
if(event.phase == WPGMZA.Event.CAPTURING_PHASE && !obj.useCapture)
continue;
obj.listener.call(arr[i].thisObject, event);
}
}
WPGMZA.events = new WPGMZA.EventDispatcher();
})(jQuery);