function findAndLinkEmailAddresses()
{
	var spans = document.getElementsByTagName( 'span' );
	for( var i=0; i < spans.length; i++ )
	{
		var classname = ' ' + spans[i].className + ' ';
		if( classname.indexOf( ' email ' ) != -1 )
			linkEmailAddressFromElement( spans[i] );
	}
}

function linkEmailAddressFromElement( e )
{
	var addr = getEmailAddressFromSpan( e );
	if( addr )
	{
		var p = e.parentNode;
		var a = document.createElement('a');
		while( e.childNodes.length )
		{
			var n = e.removeChild( e.firstChild );
			if( n )
				a.appendChild( n );
		}
		var a_id = e.id;
		a.setAttribute( 'href', 'mailto:' + addr );
		a.className = e.className;
		p.replaceChild( a, e );
		if( a_id )
			a.id = a_id;
	}
}

function getEmailAddressFromSpan( span )
{
	var spans = span.getElementsByTagName( 'span' );
	var localpart = false;
	var domain = false;
	for( var s=0; s < spans.length; s++ )
	{
		var classname = ' ' + spans[s].className + ' ';
		if( classname.indexOf( ' localpart ' ) != -1 )
			localpart = scoopTextFromElementTree( spans[s] );
		else if( classname.indexOf( ' domain ' ) != -1 )
			domain = scoopTextFromElementTree( spans[s] );
		if( localpart && domain )
			return localpart + '@' + domain;
	}
	return false;
}

function scoopTextFromElementTree( e )
{
	var txt = '';
	for( var i=0; i < e.childNodes.length; i++ )
	{
		switch( e.childNodes[i].nodeType )
		{
			case 1: // Element
				txt += scoopTextFromElementTree( e.childNodes[i] );
				break;
			case 3: // Text
				txt += e.childNodes[i].nodeValue;
		}
	}
	return txt.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); // trim
}

function linkEmailAddresses_init()
{
	var oldinit = null;
	if( typeof(window.onload) != 'undefined' )
		oldinit = window.onload;
	if( oldinit )
		window.onload = function() { oldinit(); findAndLinkEmailAddresses(); };
	else
		window.onload = findAndLinkEmailAddresses;
}

linkEmailAddresses_init();

