// (c)GPL, apv
String.noLC = new Object
	({the:1, a:1, an:1, and:1, or:1, but:1, aboard:1,
	about:1, above:1, across:1, after:1, against:1,
	along:1, amid:1, among:1, around:1, as:1, at:1,
	before:1, behind:1, below:1, beneath:1, beside:1,
	besides:1, between:1, beyond:1, but:1, by:1, 'for':1,
	from:1, 'in':1, inside:1, into:1, like:1, minus:1,
	near:1, of:1, off:1, on:1, onto:1, opposite:1,
	outside:1, over:1, past:1, per:1, plus:1,
	regarding:1, since:1, than:1, through:1, to:1,
	toward:1, towards:1, under:1, underneath:1, unlike:1,
	until:1, up:1, upon:1, versus:1, via:1, 'with':1,
	within:1, without:1});

String.prototype.toTitleCase = function ()
{
	var parts = this.split(' ');
	if ( parts.length == 0 )
	{
		return '';
	}
	var fixed = new Array();
	for ( var i in parts )
	{
		var fix = '';
		if ( String.noLC[parts[i]] )
		{
			fix = parts[i].toLowerCase();
		}
		else if ( parts[i].match(/^([A-Z]\.)+$/i) )
		{ // will mess up "i.e." and like
			fix = parts[i].toUpperCase();
		}
		else if ( parts[i].match(/^[^aeiouy]+$/i) )
		{ // voweless words are almost always acronyms
			fix = parts[i].toUpperCase();
		}
		else
		{
			fix = parts[i].substr(0,1).toUpperCase() + parts[i].substr(1,parts[i].length);
		}
		fixed.push(fix);
	}
	fixed[0] = fixed[0].substr(0,1).toUpperCase() + fixed[0].substr(1,fixed[0].length);
	return fixed.join(' ');
}

/**
 * Parses string argument and returns boolean true if string is "yes", "true" or represents number 
 * greater than 0 else returns boolean false.
 *
 * Returns corresponding boolean if argument of boolean or number type.
 * Returns false if argument is null or undefined.
 *
 * @syntax parseBoolean(booleanString)
 * @param booleanString
 * @return Boolean
 */
parseBoolean = function(s) {
	if (!s) { return false; }
	s = s.toString().toLowerCase();
	return (s == "true" || s == "yes" || parseInt(s) > 0);
}


// add functions to the on-load method of body
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function')
	{
		window.onload = func;
	}
	else
	{
		// add load events using recursion
		window.onload = function()
		{
			if (oldonload)
			{
				oldonload();
			}
			func();
		}
	}
}

// make external links (specified by red="external") open in new window (using javascript to maintain valid XHTML)
function externalLinks()
{
	if (!document.getElementsByTagName)
	{
		return;
	}
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++)
	{
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external")
		{
			anchor.target = "_blank";
		}
	}
}
addLoadEvent(externalLinks);
