//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
/// version: 0.0.0.1
/// Verified in: IE6, IE7, IE8, FF3, Chrome
/////////////////////
/*
	EVENTS
*/

var EVENTS = {}

///////////////////////////////////////
/**************************************
ENUMS
**************************************/
///////////////////////////////////////




///////////////////////////////////////
/**************************************
EVENT CLASS
**************************************/
///////////////////////////////////////
EVENTS.Event = function(name)
{
	name = name || null;
	if (name === null)
		return null;
		
	this.name = name;
	this.num = EVENTS.array.length;
	EVENTS.array[name] = this;
	this.handlers = new Array();
	
	return this;
}

///////// VARIABLES
EVENTS.Event.prototype.name = '';
EVENTS.Event.prototype.num = -1;
EVENTS.Event.prototype.handlers = null;
EVENTS.Event.prototype.isDisposed = false;

///////// METHODS
EVENTS.Event.prototype.dispatch = function(object)
{
	if (this.isDisposed)
		return;
	
	//// applying all handlers ////
	var l = this.handlers.length;
	for (var i=0;i<l;++i)
	{
		this.handlers[i].apply(null, new Array(object));
	}
}

EVENTS.Event.prototype.dispose = function()
{
	if (this.isDisposed)
		return;
	
	//// removing handlers ////
	var l = this.handlers.length;
	for (var i=0;i<l;++i)
	{
		this.handlers.pop();
	}
	this.handlers = null;
	
	//// removing from array ////
	EVENTS.array[name] = null;
	
	//// event is disposed ////
	this.isDisposed = true;
	
}

///////////////////////////////////////
/**************************************
STATIC
**************************************/
///////////////////////////////////////
EVENTS.array = new Array();
EVENTS.addEventListener = function(eventIdentifyer, handler)
{
	var _event = null;
	
	//// finding the event ////
	if (eventIdentifyer instanceof EVENTS.Event)
		_event = eventIdentifyer;
	else if (typeof(eventIdentifyer) === 'string')
		_event = EVENTS.array[eventIdentifyer] || null;

	//// no such event ////
	if (_event === null || _event.isDisposed)
		return false;
		
	//// Ilegal handler ////	
	if (typeof(handler) !== 'function')
		return false;
		
	//// adding the handler ////	
	_event.handlers.push(handler); 	
	return true;
}

EVENTS.removeEventListener = function(eventIdentifyer, handler)
{
	var _event = null;
	
	//// finding the event ////
	if (eventIdentifyer instanceof EVENTS.Event)
		_event = eventIdentifyer;
	else if (typeof(eventIdentifyer) === 'string')
		_event = EVENTS.array[eventIdentifyer] || null;

	//// no such event ////
	if (_event === null || _event.isDisposed)
		return false;
		
	//// Ilegal handler ////	
	if (typeof(handler) !== 'function')
		return false;
		
	
	var l = _event.handlers.length;
	var popedEvents = new Array();
	var found = false;
	var handlerFunction = null;
	for (var i=0;(i<l && !found);++i)
	{
		handlerFunction = _event.handlers.pop();
		if (handlerFunction === handler)
			found = true;
		else
			popedEvents.push(handlerFunction);
	}
	
	var l2 = popedEvents.length;
	for (var i=0;i<l2;++i)
	{
		_event.handlers.push(popedEvents.pop());
	}
	
	return true;
}