
API.eventHandlers=new Object();

API.eventHandlers.length=0;

API.eventHandlers.New=function(id) {
	handler=this.Get(id);
	if(handler)
		return handler;
	API.eventHandlers[this.length]=new eventHandler(id);
	this.length++;
	return API.eventHandlers[this.length-1];

}
API.eventHandlers.Get=function(id) {
	for(i=0;i<API.eventHandlers.length;i++) {
		if(API.eventHandlers[i].id==id) {
			return API.eventHandlers[i];
		}
	}
	return false;
}


function eventHandler(id)  {
	this.id=id;
	this.events=Array();
	this.element=null;
	this.eventIterator=0;
	// If the id matches an html element, try to attach to it.
	try {
		if(id instanceof Object) {
			this.element=id;
			this.id=this.element.id;
		}
		else
			this.element=document.getElementById(id);
		this.element.eventHandler=this;
		this.element.onmouseover=function() { return this.eventHandler.triggerEvent('onmouseover',this); }
		this.element.onmousemove=function() { return this.eventHandler.triggerEvent('onmousemove',this); }
		this.element.onclick=function() { return this.eventHandler.triggerEvent('onclick',this); }
		this.element.onmouseout=function() { return this.eventHandler.triggerEvent('onmouseout',this); }
	}
	catch(e) {

	}
	this.attachEvent=function (eventName,eventProcedure,eventTimeout) {
		this.events.push(new eventHandlerEvent(eventName,eventProcedure,eventTimeout));
		return this.events[this.events.length-1];
	}
	this.triggerEvent=function(eventName,object) {
		for(this.eventIterator=0;this.eventIterator<this.events.length;this.eventIterator++) {
			if(this.events[this.eventIterator].eventName==eventName) {
				if(this.events[this.eventIterator].trigger(object)===false)
					return false;
			}
		}
	}

}

function eventHandlerEvent(eventName,eventProcedure,eventTimeout) {
	 this.eventName=eventName;
	 this.eventProcedure=eventProcedure;
	 this.eventTimeout=eventTimeout;
	 this.trigger=function(object) {

	 	if(this.eventTimeout) {
	 		window.setTimeout(this.eventTimeout,this.eventProcedure);
	 		return true;
	 	}
	 	else {
		 	//try {
		 		return this.eventProcedure(object);

		 	//}
		 	//catch(e) {

		 	//}
	 	}
	 }
}