registered_events = new Object();

	/**
	 * add a event to an object
	 *
    * obj the event is added to
    * type the event type
    * fn the callback function
    * the namespace/id for the registration
    * the scope object (optional)
    */
    
function addEvent( obj, type, fn, name_space, scope )
{
   if (obj.addEventListener)
   {
      if(type == 'mousewheel')
         obj.addEventListener('DOMMouseScroll', fn, false); /// FF

      obj.addEventListener( type, fn, false );
   }
   else if (obj.attachEvent) /// IE
   {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
      obj.attachEvent( "on"+type, obj[type+fn] );
   }

   registered_events[name_space+'_'+type] = (scope) ? scope : true;
}

function removeEvent( obj, type, fn, name_space )
{
   if ( hasEvent(type, name_space) )
   {
   	if (obj.removeEventListener)
   	{
         if(type == 'mousewheel')
            obj.removeEventListener('DOMMouseScroll', fn, false); /// FF

   		obj.removeEventListener( type, fn, false );
   	}
   	else if (obj.detachEvent) /// IE
   	{
   		obj.detachEvent( "on"+type, obj[type+fn] );
   		obj[type+fn] = null;
   		obj["e"+type+fn] = null;
   	}
   }

   registered_events[name_space+'_'+type] = false;
}

function hasEvent(type, name_space)
{
   if ( registered_events[name_space+'_'+type] )
   {
      return true;
   }

   return false;
}

function eventTarget(e)
{
   var target;

   if (!e) var e = window.event;
	if (e.target) target = e.target;
	else if (e.srcElement) target = e.srcElement; // IE
	if (target.nodeType == 3 || target.nodeType == 4) // defeat Safari bug
		target = target.parentNode;

   return target;
}

function cancelEvent(e)
{
   e = e ? e : window.event;

   if(e.stopPropagation)
      e.stopPropagation();

   if(e.preventDefault)
      e.preventDefault();

   e.cancelBubble = true;
   e.cancel = true;
   e.returnValue = false;

   return false;
}

