function addEvent(obj, evType, fn)
{
    if (obj.addEventListener)
    {
         obj.addEventListener(evType, fn, true);
         return true;
    }
    else if (obj.attachEvent)
    {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } 
    else 
    {
        return false;
    }
}

/**
 * get the source node of an event
 *
 * workaround for microsofts event model and safari returning the textnode 
 * contained in a link instead of the link
 */
function getEventSource(e)
{
    e = this.getEvent(e);
    var source;
    if (typeof e.target != 'undefined') 
    {
        source = e.target;
    } 
    else if (typeof e.srcElement != 'undefined') 
    {
        source = e.srcElement;
    }
    
    /**
     * safari workaround, safari returns the textnode contained in a link element
     * a event source instead of the linkelement 
     */           
    if (source.nodeType == 3) 
    {
        source = source.parentNode;
 	}
 
    return source;
} 

/**
 * get the event itself
 * 
 * workaround for microsofts event model
 */
function getEvent(e)
{
    if (typeof e == 'undefined') 
    {
	    var e = window.event;
	}
		   
	return e;
}


