# Source: event-dispatcher.js

    /**

     * @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);