var Dennis = window.Dennis || {};

Dennis.addListenEvent = function(listenEventObj)
{
	var _listeners = new Array();
	
	var _registry = {};
	
	var _handlers = new Array();
	
	var getListeners = function()
	{
		return _listeners;
	};

	var setListeners = function (listeners, reset)
	{
		if (reset !== false) {
			this.clearListeners();
		}
	
		if ( (listeners.constructor !== Array) || (listeners.constructor !== Object) )
		{
			return false;
		}
		for (listener in listeners) {
			this.addListener(listeners[listener]);
		}
	};

	var addListener = function (listener)
	{
		_listeners.push(listener);
	};
	
	var clearListeners = function ()
	{
		_listeners = new Array();
	};
	
	var fire = function(event)
	{
		var	array, 
			func, 
			handler, 
			i, 
			type = typeof event === 'string' ? event : event.type;
		if (_registry.hasOwnProperty(type)) {
			array = _registry[type];
			for (i = 0; i < array.length; i+=1) {
				handler = array[i];
				func = handler.method;
				if (typeof func === 'string') {
					func = this[func];
				}
				func.apply(this, handler.parameters || [event]);
			}
		}
		return this;

	};
	
	var on = function(type, method, parameters)
	{
		var handler = {
				method 		: method,
				parameters	: parameters
		};
		if (_registry.hasOwnProperty(type)) {
			_registry[type].push(handler);
		} else {
			_registry[type] = [handler];
		}
		return this;
	};
	
	listenEventObj.on 				= on;
	listenEventObj.fire 			= fire;
	listenEventObj.getListeners		= getListeners;
	listenEventObj.setListeners		= setListeners;
	listenEventObj.addListener		= addListener;
	listenEventObj.clearListeners	= clearListeners;
	
	return listenEventObj;
};