File Manager
/**
* @namespace WPGMZA
* @module EventDispatcher
* @requires WPGMZA
*/
jQuery(function($) {
/**
* Base class for any (non HTMLElement) object which dispatches or listens for events
* @class WPGMZA.EventDispatcher
* @constructor WPGMZA.EventDispatcher
* @memberof WPGMZA
*/
WPGMZA.EventDispatcher = function()
{
WPGMZA.assertInstanceOf(this, "EventDispatcher");
this._listenersByType = {};
}
/**
* Adds an event listener on this object
* @method
* @memberof WPGMZA.EventDispatcher
* @param {string} type The event type, or multiple types separated by spaces
* @param {function} callback The callback to call when the event fires
* @param {object} [thisObject] The object to use as "this" when firing the callback
* @param {bool} [useCapture] If true, fires the callback on the capture phase, as opposed to bubble phase
*/
WPGMZA.EventDispatcher.prototype.addEventListener = function(type, listener, thisObject, useCapture)
{
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");
var target;
if(!this._listenersByType.hasOwnProperty(type))
target = this._listenersByType[type] = [];
else
target = this._listenersByType[type];
var obj = {
listener: listener,
thisObject: (thisObject ? thisObject : this),
useCapture: (useCapture ? true : false)
};
target.push(obj);
}
/**
* Alias for addEventListener
* @method
* @memberof WPGMZA.EventDispatcher
* @see WPGMZA.EventDispatcher#addEventListener
*/
WPGMZA.EventDispatcher.prototype.on = WPGMZA.EventDispatcher.prototype.addEventListener;
/**
* Removes event listeners from this object
* @method
* @memberof WPGMZA.EventDispatcher
* @param {string} type The event type to remove listeners from
* @param {function} [listener] The function to remove. If omitted, all listeners will be removed
* @param {object} [thisObject] Use the parameter to remove listeners bound with the same thisObject
* @param {bool} [useCapture] Remove the capture phase event listener. Otherwise, the bubble phase event listener will be removed.
*/
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((arguments.length == 1 || obj.listener == listener) && obj.thisObject == thisObject && obj.useCapture == useCapture)
{
arr.splice(i, 1);
return;
}
}
}
/**
* Alias for removeEventListener
* @method
* @memberof WPGMZA.EventDispatcher
* @see WPGMZA.EventDispatcher#removeEventListener
*/
WPGMZA.EventDispatcher.prototype.off = WPGMZA.EventDispatcher.prototype.removeEventListener;
/**
* Test for listeners of type on this object
* @method
* @memberof WPGMZA.EventDispatcher
* @param {string} type The event type to test for
* @return {bool} True if this object has listeners bound for the specified type
*/
WPGMZA.EventDispatcher.prototype.hasEventListener = function(type)
{
return (_listenersByType[type] ? true : false);
}
/**
* Fires an event on this object
* @method
* @memberof WPGMZA.EventDispatcher
* @param {string|WPGMZA.Event} event Either the event type as a string, or an instance of WPGMZA.Event
*/
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);
// Native DOM event
var topMostElement = this.element;
for(var obj = this.parent; obj != null; obj = obj.parent)
{
if(obj.element)
topMostElement = obj.element;
}
if(topMostElement)
{
var customEvent = {};
for(var key in event)
{
var value = event[key];
if(key == "type")
value += ".wpgmza";
customEvent[key] = value;
}
$(topMostElement).trigger(customEvent);
}
}
/**
* Alias for removeEventListener
* @method
* @memberof WPGMZA.EventDispatcher
* @see WPGMZA.EventDispatcher#removeEventListener
*/
WPGMZA.EventDispatcher.prototype.trigger = WPGMZA.EventDispatcher.prototype.dispatchEvent;
/**
* Handles the logic of triggering listeners
* @method
* @memberof WPGMZA.EventDispatcher
* @inner
*/
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();
});
File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com