var eventListeners = [];

function addEvent(node, type, handler, par){

  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});
}

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 removeEvent(node, event, handler){
  for(I in eventListeners){
    if (eventListeners[I].id == handler.$$guid) removeEventIndex(I);
  }
  return null;
}

function cleanupEventListeners(){
  for (var I = eventListeners.length; I > 0; I--){
    if (eventListeners[I] != undefined) removeEventIndex(I);
  }
}

addEvent(window, 'unload', cleanupEventListeners);

function stopEvent(event){
  if(event.stopPropagation)event.stopPropagation();
  else event.cancelBubble = true;
  if(event.preventDefault)event.preventDefault();
  else event.returnValue = false;
};
