/*==================================================================+
|   Program: Validate Form's Required Fields                        |
+===================================================================+
|  Language: JavaScript                                             |
|   Version: 2.0                                                    |
|      Date: 2005-11-08                                             |
|    Author: Iain Gardiner (http://www.firelightning.com)           |
|    E-mail: iain at firelightning.com                              |
| Copyright: (c) 2005 Iain Gardiner. All rights reserved.           |
+------------------------------------------------------------------*/

var handleForm =
{
	doValidation: function(fields)
	{
		var currentField, errorMessages, errorText, emailRegExp, i;
		errorMessages = new Array();
		emailRegExp = /^[a-zA-Z0-9]+[a-zA-Z0-9.\+=_-]*@[a-zA-Z0-9]{2,}|([a-zA-Z0-9]+-[a-zA-Z0-9]+)+(\.[a-zA-Z0-9]{2,})*$/;

		if (document.getElementById('errorDiv')) handleForm.cleanUp(fields);

		for (i = 0; i < fields.length; i++)
		{
			currentField = document.getElementById(fields[i]);
			errorText = '';

			switch (currentField.type.toLowerCase())
			{
				case 'text':
					if (currentField.value && currentField.id == 'email' && !emailRegExp.test(currentField.value))
						errorText = 'Your e-mail address does not appear to be valid';
					else if (!currentField.value)
						errorText = 'You must enter your ' + currentField.id.replace('email', 'e-mail');
				break;
				case 'textarea':
					if (!currentField.value)
						errorText = 'You must enter your ' + currentField.id;
				break;
				case 'checkbox':
					if (!currentField.checked)
						errorText = 'You must tick the ' + currentField.id + 'box';
				break;
				case 'select-one':
					if (!currentField.selectedIndex && currentField.selectedIndex == 0)
						errorText = 'You must select an option for ' + currentField.id;
				break;
			}
			if (errorText)
			{
				errorMessages.push(document.createTextNode(errorText));
				currentField.className = 'invalid';
			}
		}
		if (errorMessages.length) handleForm.showErrors(errorMessages);
		else document.getElementsByTagName('form')[0].submit();
	},

	showErrors: function(errorMessages)
	{
		var pageForm, errorDiv, errorPara, errorList, listItem, i;
		pageForm = document.getElementsByTagName('form')[0];
		errorDiv = document.createElement('div')
		errorDiv.id = 'errorDiv';
		// Create the explanatory paragraph:
		errorPara = document.createElement('p');
		errorPara.appendChild(document.createTextNode('Please correct the following errors:'));
		errorDiv.appendChild(errorPara);
		// Create the list of errors:
		errorList = document.createElement('ul');
		errorDiv.appendChild(errorList);

		for (i = 0; i < errorMessages.length; i++)
		{
			listItem = document.createElement('li');
			listItem.appendChild(errorMessages[i]);
			errorList.appendChild(listItem);
		}
		pageForm.insertBefore(errorDiv, pageForm.firstChild);
	},

	cleanUp: function(fields)
	{
		document.getElementsByTagName('form')[0].removeChild(document.getElementById('errorDiv'));

		for (var i = 0; i < fields.length; i++)
			document.getElementById(fields[i]).className = '';
	}
}