/******************************************************************************
 * Common global functions.
 ******************************************************************************/

// Short for getElementById
function element(id)
{
	return document.getElementById(id);
}

// Cross-browser event handling.
function addEvent(element, eventType, lamdaFunction, useCapture)
{
	if (element.addEventListener)
	{
		element.addEventListener(eventType, lamdaFunction, useCapture);
	}
	else if (element.attachEvent)
	{
		element.attachEvent('on' + eventType, lamdaFunction);
	}
}

// Get event target.
function eventTarget(e)
{
	if (!e) var e = window.event;
	return e.target ? e.target : e.srcElement;
}

// Kills an event's propagation and default action
function cancelEvent(eventObject)
{
	if (eventObject && eventObject.stopPropagation) eventObject.stopPropagation();
	if (eventObject && eventObject.preventDefault) eventObject.preventDefault();
	if (window.event && window.event.cancelBubble) window.event.cancelBubble = true;
	if (window.event) window.event.returnValue = false;
}

function replaceLinks()
{
	var links = document.getElementsByTagName('a');

	for (var i = 0; i < links.length; i++)
	{
		if (links[i].className.match(/\bexternal\b/i))
		{
			addEvent(links[i], 'click', launchLink, false);
		}
	}
}

function launchLink(e)
{
	var target = eventTarget(e);
	var href   = target.href ? target.href : target.parentNode.href;
	if (!href) return;
	window.open(href);
	cancelEvent(e);
}

addEvent(window, 'load', replaceLinks, false);