
var eventListeners = [];


function removeEvent(node, event, handler){
  for(I in eventListeners){
    if (eventListeners[I].id == handler.$$guid) removeEventIndex(I);
  }
  return null;
}

function removeEventIndex(index){
  var ev = eventListeners[index];
  delete eventListeners[index];
  if(ev.node.removeEventListener) {
  	ev.node.removeEventListener(ev.event,ev.handler, false);
  }else{
  	ev.node.detachEvent('on' + ev.event,ev.handler);
  }
}

function cleanupEventListeners(){
  for (var I = eventListeners.length; I > 0; I--){
    if (eventListeners[I] != undefined) removeEventIndex(I);
  }
}

function stopEvent(event){
  if(event.stopPropagation){
  	event.stopPropagation();
  }else{
  	event.cancelBubble = true;
  }
  if(event.preventDefault){
  	event.preventDefault();
  }else{
  	event.returnValue = false;
  }
}

function addEvent(node, type, handler, par){
    if (handler == null)
        return;
  if (!handler.$$guid){
  	handler.$$guid = eventListeners.length+1;
  }
  var handlerEvent = function(event){
    if (!event){
    	var event = window.event;
    }
    return handler.call(node, event, par);
  };
  
  if(node.addEventListener){
    if(type == 'mouseenter' || type == 'mouseleave'){     
      handlerEvent = function(e){  
        if(this == e.relatedTarget){
        	return;
        }else{
          var t = this.getElementsByTagName('*');var l = t.length;     
          for(var I = 0;I < l; I++){
            if(e.relatedTarget == t[I])return;
          }
        }
        handler.call(this, e, par);
      };
      if(type == 'mouseenter')type='mouseover';
      if(type == 'mouseleave')type='mouseout';
    }
	node.addEventListener(type, handlerEvent, false);
  }else{
    node.attachEvent('on' + type, handlerEvent);
  }
  eventListeners.push({node: node, event: type, id: handler.$$guid, handler: handlerEvent});
}

