addLoadEvent(prepareForms);

function prepareForms()
{
	for (var i = 0; i < document.forms.length; i++)
	{
		var thisform = document.forms[i];
		thisform.onsubmit = function()
		{
			return validateForm(this);
		}
	}
}

function validateForm(whichform)
{
	var email;
	var confirmEmail;
	
	var errors = new Array();
	
	for (var i = 0; i < whichform.elements.length; i++)
	{
		var element = whichform.elements[i];
		
		if (element.className.indexOf("required") > -1)
		{
			if (!isFilled(element))
			{
				addClass(element, "error");
				errors[errors.length] = "Please fill in the " + findLabelText(element) + " field.";
				if (errors.length == 1)
				{
					element.focus();
					element.select();
				}
				continue;
			}
		}
		
		if (element.className.indexOf("email") > -1)
		{
			if (!isEmail(element))
			{
				addClass(element, "error");
				errors[errors.length] = "The " + findLabelText(element) + " field must be a valid email address.";
				if (errors.length == 1)
				{
					element.focus();
					element.select();
				}
				continue;
			}
		}
		
		// Clean out the error class since the element is valid.
		removeClass(element, "error");
		
		// Store the email fields for later use.
		if (element.id == "email")
			email = element;
		else if (element.id == "confirmEmail")
			confirmEmail = element;
	}
	
	if (email && confirmEmail && (email.value != confirmEmail.value))
	{
		addClass(confirmEmail, "error");
		errors[errors.length] = "Both email addresses must match.";
		if (errors.length == 1)
		{
			confirmEmail.focus();
			confirmEmail.select();
		}
	}
	
	if (errors.length)
	{
		alert(errors.join("\n"));
		return false;
	}
	
	return true;
}

function isFilled(field)
{
	return field.value.length > 0;
}

function isEmail(field)
{
	return (field.value.indexOf("@") > -1 && field.value.indexOf(".") > -1);
}

function addClass(element, value)
{
	if (!element.className)
	{
		element.className = value;
	}
	else
	{
		element.className = element.className + " " + value;
	}
}

function removeClass(element, value)
{
	if (element.className && element.className.indexOf(value) > -1)
	{
		value = value.replace("\\", "\\\\");
		var re = new RegExp("^" + value + " | " + value + " | " + value + "$", "g");
		element.className = element.className.replace(re,"");
	}
}

function findLabelText(element)
{
	var result = "";
	
	var labels = element.form.getElementsByTagName("label");
	for (var i = 0; i < labels.length; i++)
	{
		if (labels[i].getAttribute("for") == element.id || (labels[i].htmlFor && labels[i].htmlFor == element.id))
		{
			var children = labels[i].childNodes;
			for (var j = 0; j < children.length; j++)
			{
				if (children[j].nodeType == 3)
				{
					result = children[j].nodeValue;
					if (result.charAt(result.length - 1) == ':')
					{
						result = result.substr(0, result.length - 1);
					}
					break;
				}
			}
			break;
		}
	}
	
	return result;
}


function addLoadEvent(func)
{
	var oldonload = window.onload;
	if (typeof window.onload != 'function')
	{
		window.onload = func;
	}
	else
	{
		window.onload = function()
		{
			oldonload();
			func();
		}
	}
}