/* eventListeners. Copyright by ADenis (adeniss@ukr.net) */

var eventListeners = new Array();

function addListener(object, _event, listener, handler, global, block, checkChilds){	
	if(!object)
		return;
	
	var index = getIndexOfEventListener(object, _event, listener, handler);
	
	if(index == -1){
		//alert("addListener "+object.id+" _event " + _event+" index " + index);
		
		if(object.addEventListener)
			object.addEventListener(_event, onEvent, false);
		
		object[_event] = onEvent;		
			
		var listenObj = new listenerObject(object, _event, listener, handler, global, block, checkChilds);
		eventListeners.push(listenObj);		
	}
}

function removeListener(object, _event, listener, handler){
	var index = getIndexOfEventListener(object, _event, listener, handler);
	if(index > -1){
		if(object.removeEventListener)
			object.removeEventListener(_event, onEvent, false);
			
		object[_event] = null;
		eventListeners.splice(index, 1);
	}
}

function onEvent(evt){
	var _event = (evt)?evt:(window.event)?window.event:"";

	var object = (_event.srcElement)?_event.srcElement:_event.target;
	var type = _event.type;	
	var notblock = true;
	
	for(var i in eventListeners){
		var listenObj = eventListeners[i];
		
		var isChild = false;
				
		if(listenObj._event == ("on"+type) || listenObj._event == type)
		if(listenObj.checkChilds){			
			isChild = isChildOf(listenObj.object, object);
		}

		if(listenObj.object == object || listenObj.global || isChild)
		if(listenObj._event == ("on"+type) || listenObj._event == type){
			
			/*if(type == "click"){
				alert(listenObj.listener);
			}*/

			if(listenObj.handler){
				if(typeof(listenObj.handler) == "string")
					listenObj.handler = new Function(listenObj.handler);
					
				if (listenObj.listener) {
					listenObj.handler.call(listenObj.listener, _event);	
				} else {
					listenObj.handler(_event);
				}
			}
		}
		
		if(listenObj.block) notblock = false;
	}
	
	if(!notblock){		
		if(_event.preventDefault)
			_event.preventDefault();
		else
			_event.returnValue = false;
		return false;
	}	
}

function getIndexOfEventListener(object, _event, listener, handler){
	//alert(eventListeners.length);
	for(var i in eventListeners){
		/*	alert(eventListeners[i].object.id + " " + object.id
				 +"\n" + eventListeners[i].listener + " " + listener
				 +"\n" + eventListeners[i]._event + " " + _event
				 );*/
		if(eventListeners[i].listener == listener && eventListeners[i].object == object && eventListeners[i]._event == _event && eventListeners[i].handler == handler)
			return i;
	}
	return -1;
}

function listenerObject(object, _event, listener, handler, global, block, checkChilds){
	this.object = object;
	this._event = _event;
	this.listener = listener;
	this.handler = handler;
	this.global = global;
	this.block = block;
	this.checkChilds = checkChilds;
}

var updateListeners = new Array();
var GLOBAL_UPDATE_PERIOD = 20;
var updateTimer = null;

function addUpdateListener(listener, handler, interval){
	var index = getIndexOfUpdateListener(listener, handler);
	if(index == -1){
		if(interval){
			interval = interval*1000/GLOBAL_UPDATE_PERIOD;
		}
		var listenObj = new updateListenerObject(listener, handler, interval);
		updateListeners.push(listenObj);
		setTimer();
	}
}

function setTimer(){
	if(!updateTimer){		
		updateTimer = setInterval("onUpdate()", GLOBAL_UPDATE_PERIOD);
	}
}

function removeTimer(){
	if(updateTimer){
		clearInterval(updateTimer);
		updateTimer = null;
	}
}

function removeUpdateListener(listener, handler){
	var index = getIndexOfUpdateListener(listener, handler);
	if(index > -1){
		updateListeners.splice(index, 1);
	}
}

function onUpdate(){
	for(var i in updateListeners){		
		var listenObj = updateListeners[i];
		var listener = listenObj.listener;
		var handler = listenObj.handler;		
		var interval = listenObj.interval;
		var iteration = listenObj.iteration;
		var call = true;
		
		if(interval){
			if(interval > iteration){
				iteration++;
				call = false;
			}else{
				iteration = 0;
			}			
			listenObj.iteration = iteration;
		}
		
		if(handler && call){
			if(typeof(handler) == "string")
				handler = new Function(handler);
				
			if (listener) {
				handler.call(listener, _event);	
			} else {
				handler(_event);
			}
		}			
	}
	
	if(!updateListeners.length){
		removeTimer();
	}
}

function updateListenerObject(listener, handler, interval){
	this.listener = listener;
	this.handler = handler;
	this.interval = interval;
	this.iteration = 0;
}

function getIndexOfUpdateListener(listener, handler){
	for(var i in updateListeners){
		if(updateListeners[i].listener == listener && updateListeners[i].handler == handler)
			return i;
	}
	return -1;
}