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

function getClickedLink(event)
{
	var srcElement = getEventSource(event);
	
	while((srcElement.parentNode) && (document != srcElement) && ('a' != srcElement.tagName.toLowerCase()))
	{
	    srcElement = srcElement.parentNode;
	}
	
	if (document == srcElement)
	{
	    srcElement = null;
	}
	
	return srcElement;
}