var IS_MOZILLA= document.getElementById && !document.all;
var IS_IE = document.all;
var IS_CHROME =  navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

var eh_events = [];

function isInDom(element)
{
      if(!element.parentNode)
      {
            return false;
      }
      else if(element.parentNode.tagName)
      {
            return true;
      }
      else
      {
            return false;
      }
}

function eh_attachEvent(eventType, element, eventFx, eventGroupName, stopEvent, ownerWindow, doReturn, returnValue, allowBubbling)
{
      element[eventType] = function(event)
      {
            ownerWindow = (!ownerWindow) ? window : ownerWindow;
            event = (!event) ? ownerWindow.event : event;
            if(eventFx)
            {
                  eventFx(event);
            }
            if(stopEvent)
            {
                  crossbrowser_stopEvent(event);
            }
            else if(!allowBubbling)
            {
                  crossbrowser_cancelBubble(event);
            }

            if(doReturn)
            {
                  return returnValue;
            }
      };

      eh_registerEvent(element, eventType, eventGroupName);
}

function eh_attachEventNoRegister(eventType, element, eventFx, eventGroupName, stopEvent, ownerWindow, doReturn, returnValue, allowBubbling)
{
      element[eventType] = function(event)
      {
            ownerWindow = (!ownerWindow) ? window : ownerWindow;
            event = (!event) ? ownerWindow.event : event;
            if(eventFx)
            {
                  eventFx(event);
            }
            if(stopEvent)
            {
                  crossbrowser_stopEvent(event);
            }
            else if(!allowBubbling)
            {
                  crossbrowser_cancelBubble(event);
            }

            if(doReturn)
            {
                  return returnValue;
            }
      };
}

function eh_registerEvent(element, eventType, eventGroupName)
{
      if(!eventGroupName)
      {
            eventGroupName = "default";
      }

      var eventGroup = eh_events[eventGroupName];
      if(!eventGroup)
      {
            eventGroup = [];
            eh_events[eventGroupName] = eventGroup;
      }

      var eventsByType = eventGroup[eventType];
      if(!eventsByType)
      {
            eventsByType = [];
            eventGroup[eventType] = eventsByType;
      }

      eventsByType.push(element);
}

function eh_clearEventGroup(eventGroupName, omitGC)
{
      eh_clearEventsNotInDom();
}

function eh_clearEventsNotInDom()
{
      for(var groupName in eh_events)
      {
            eh_clearUnusedEvents(eh_events[groupName]);
      }

      if(IS_IE)
      {
            CollectGarbage();
      }
}

function eh_clearUnusedEvents(eventGroup)
{
      for(var eventType in eventGroup)
      {
            var eventsByType = eventGroup[eventType];
            var count = eventsByType.length;
            for(var i=0; i<count; i++)
            {
                  if(!isInDom( eventsByType[i] ))
                  {
                        eventsByType[i][eventType] = null;
                  }
            }
      }
}

function eh_clearAllEvents()
{
      for(var groupName in eh_events)
      {
            eh_clearEventGroup(groupName, true);
      }

      document.body.onunload = null;

      if(IS_IE)
      {
            CollectGarbage();
      }
}

function eh_initalizeGC()
{
	document.body.onunload = eh_clearAllEvents;
}

var crossbrowser_browserName;

function crossbrowser_stopEvent(event)
{
	if(IS_MOZILLA)
	{
		event.stopPropagation();
		event.preventDefault() ;
	}
	else if(IS_IE)
	{
		if(!event)
		{
			  event = window.event;
		}
	
		event.returnValue = false;
		event.cancelBubble = true;
	}
}

function crossbrowser_handleEvent(event)
{
      if(IS_MOZILLA)
      {
            event.stopPropagation();
             event.preventDefault() ;
      }
      else if(IS_IE)
      {
             window.event.returnValue = false;
             window.event.cancelBubble = true;
       }
}

function crossbrowser_cancelBubble(event)
{
	if(IS_MOZILLA)
	{
		event.stopPropagation();
	}
	else if (IS_IE && event)
	{
		event.cancelBubble = true;
	}
	else if(IS_IE && window.event)
	{
		window.event.cancelBubble = true;
	}
};

