function pageLoad ()
{
	enhanceString ();
	loadImages ();
	return true;
}

function enhanceString ()
{
	String.prototype.strip = stripString;
	String.prototype.stripInternal = stripInternalString;
	String.prototype.toTitleCase = toTitleCase;
}

function stripString ()
{
	var whites = " \t\r\n";

	var i, j;
	for (i = 0; i < this.length; i++)
		if (whites.indexOf (this.charAt(i)) < 0)
			break;
	if (i >= this.length)
		return "";

	for (j = this.length-1; j >= 0; j--)
	{
		if (whites.indexOf (this.charAt(j)) < 0)
			break;
	}
	
	return this.substring (i, ++j);
}

function stripInternalString (control)
{
	var result = new Array (this.length);
	var i, j;
	for (i = 0, j = 0; i < this.length; i++)
	{
		var c = this.charAt(i);
		if (control.indexOf (c) < 0)
			result[j++] = c;
	}
	result.length = j;
	return result.join ("");
}

function toTitleCase ()
{
	return this.substring(0,1).toUpperCase() + this.substring(1);
}

function loadImages ()
{
	for (var i = 0; i < document.images.length; i++)
	{
		var img = document.images[i];
		if (img == null)
			continue;
			
		var path = img.src.split ("/");
		var srcname = path[path.length - 1];
		if (srcname.substring (0,2) == "x_")
		{
			path[path.length - 1] = "o" + srcname.substr (1);
			img.out_src = img.src;
			img.over_src = path.join ("/");
			var rollimg = new Image;
			rollimg.src = img.over_src;
		}
	}
	return true;
}

function rollOverImage (img)
{
	return swapImage (img, img.over_src);
}

function rollOutImage (img)
{
	return swapImage (img, img.out_src);
}

function swapImage (img, src)
{
	if (src)
	{
		img.src = src;
		return true;
	}
	return false;
}

function validate (f)
{
	for (var i = 0; i < f.elements.length; i++)
	{
		var field = f.elements[i];
		var msg = validateField (field);
		if (msg.length > 0)
		{
			alert ("[" + msg.toTitleCase() + "]\nRequired field not correctly filled in");
			field.focus ();
			return false;
		}
	}
	return true;
}

function validateField (field)
{
	var v = new Validator (field);
	if (v.validate ())
		return "";
	return v.name;
}

function Validator (field)
{
	this.field = field;
	this.name = "";
	this.validate = validateTrue;
	this.checkLen = checkLength;
	this.relaxed = true;
	this.minLen = 0;
	this.maxLen = 0;
	
	var s = field.name;
	var pos = s.indexOf ('Q');
	if (pos < 1 || pos >= s.length-1)
		return;
	this.name = s.substring (0, pos++);
		
	switch (s.charAt (pos++))
	{
		case 'A':
			this.relaxed = false;
			//FALLTHROUGH
		case 'B':
			this.validate = validateAlpha;
			break;
		case 'N':
			this.relaxed = false;
			//FALLTHROUGH
		case 'M':
			this.validate = validateNumber;
			break;
		case 'W':
			this.relaxed = false;
			//FALLTHROUGH
		case 'X':
			this.validate = validateWord;
			break;
		case 'G':
			this.validate = validateAll;
			break;
		case 'T':
			this.validate = validateBool;
			break;
		case 'L':
			this.validate = validateList;
			break;
		case 'P':
			this.validate = validatePhone;
			break;
		case 'E':
			this.validate = validateMail;
			break;
		case 'U':
			this.validate = validateUrl;
			break;
		case 'Z':
			this.validate = validateName;
			break;
		default:
			return;
	}

	if (pos >= s.length)
		return;
	switch (s.charAt (pos++))
	{
		case 'F':
			this.minLen = charNum (s.charAt (pos));
			break;
		case 'C':
			this.maxLen = charNum (s.charAt (pos));
			break;
		case 'V':
			this.maxLen = charNum (s.charAt (pos));
			this.minLen = this.maxLen;
			break;
		case 'R':
			var v1 = charNum (s.charAt (pos++));
			if (pos < s.length)
			{
				var v2 = charNum (s.charAt (pos));
				if (v1 && v2 && (v2 >= v1))
				{
					this.minLen = v1;
					this.maxLen = v2;
				}
			}
			break;
	}
}

function charNum (c)
{
	if (c >= 'A' && c <= 'Z')
		return c.charCodeAt(0) - 'A'.charCodeAt(0) + 1;
	if (c >= 'a' && c <= 'z')
		return c.charCodeAt(0) - 'a'.charCodeAt(0) + 27;
	return 0;
}

function checkLength (s)
{
	if (this.maxLen > 0 && s.length > this.maxLen)
		return false;
	if (s.length < this.minLen)
		return false;
	return (s.length > 0);
}

function validateTrue ()
{
	return true;
}

function validateNumber ()
{
	var s = this.field.value.strip();
	if (this.relaxed)
		s = s.stripInternal (" \t-");
	if (isNaN (s))
		return false;
	return this.checkLen (s);
}

function validateAll ()
{
	return this.checkLen (this.field.value.strip());
}

function validateAlpha ()
{
	var s = this.field.value.strip().toLowerCase();
	if (this.relaxed)
		s = s.stripInternal (" \t-\"'`&()[]:#,./\r\n");
		
	for (var i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (c < 'a' || c > 'z')
			return false;
	}
	
	return this.checkLen (s);
}

function validateWord ()
{
	var s = this.field.value.strip().toLowerCase();
	if (this.relaxed)
		s = s.stripInternal (" \t-\"'`&()[]:#,./\r\n");
		
	for (var i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (c < 'a' || c > 'z')
			if (c < '0' || c > '9')
				return false;
	}
	
	return this.checkLen (s);
}

function validateName ()
{
	var s = this.field.value.strip().toLowerCase();
	if (!validateNameInternal (s))
		return false;
	return this.checkLen (s);
}

function validateNameInternal (s)
{
	for (var i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (c < 'a' || c > 'z')
			if (c != ' ' && c != '-' && c != "'")
				return false;
	}
	return true;
}

function validateList ()
{
	return (this.field.options[this.field.selectedIndex].value.length > 0);
}

function validateMail ()
{
	var s = this.field.value.strip().toLowerCase();
	var atpos = s.indexOf ('@');
	if (atpos < 1 || atpos >= s.length-1 || s.indexOf ('@', atpos+1) >= 0)
		return false;
	s = s.substring (atpos+1);
	var dotpos = s.indexOf ('.');
	if (dotpos < 1 || dotpos >= s.length-1)
		return false;
	return true;
}

function validatePhone ()
{
	var s = this.field.value.strip().stripInternal (" \t-()");
	if (isNaN (s))
		return false;
	return this.checkLen (s);
}

function validateUrl ()
{
	var s = this.field.value.strip();
	var pos = s.indexOf ('://');
	if (pos < 1 || pos >= s.length-3)
		return false;
	return true;
}

function validateBool ()
{
	switch (this.field.type)
	{
		case "checkbox":
			return this.field.checked;
		case "radio":
			var rlist = this.field.form.elements[this.field.name];
			for (var i = 0; i < rlist.length; i++)
				if (rlist[i].checked)
					return true;
			return false;
		default:
			return true;
	}
}

