// Constants used for validation
var disabled 		= false;

var valText 		= 0;
var valNumeric		= 1;
var valDecimal		= 2;
var valPhone 		= 3;
var valEmail		= 4;
var valDomain		= 5;
var valCreditCard	= 6;
var valZipPostal	= 7;
var valSSN		= 8;
var valDateDay		= 9;
var valDateMonth	= 10;
var valDateYear		= 11;
var valSelect		= 12;
var valCheckbox		= 13;

var regularExpressions = new Array( 	".+" ,			// valText
					"^[0-9]+$",		// valNumeric
					"^[0-9]*\.[0-9]*$",	// valDecimal
					"^([0-9]{3}-){2}.{4,}$",	// valPhone
					"^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$" ,  // valEmail
					"(^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}$)" , // valDomain
					"^[0-9]{16}$",		// valCreditCard
					"(^[0-9]{5}(-[0-9]{4})?$)|(^[A-Z][0-9][A-Z](-|\\s){0,1}[0-9][A-Z][0-9]$)",	// valZipPostal
					"^[0-9]{9}$",	// valSSN
					"^([1-9])|([0-2][0-9])|(3[0-1])$" , // valDateDay
					"^(0?[1-9]{1})|(1[0-2]{1})$" , // valDateMonth
					"^[0-9]{4}$",  // valDateYear
					"^.+$",		// valSelect
					"^.+$"		// valCheckbox
					
					);	
					
var descriptions = new Array( 	"field cannot be blank" ,			// valText
				"field must be a number",		// valNumeric
				"field must be a decimal number",	// valDecimal
				"must be a valid phone number (###-###-####)",	// valPhone
				"must be a valid email address" ,  // valEmail
				"must be a valid domain name" , // valDomain
				"must be a 16 digit credit card number (no spaces)",		// valCreditCard
				"must be a zip or postal code (e.g. 12345 or A1A-1A1)",	// valZipPostal
				"must be a valid Social Insurance Number (9 digits, e.g. 987654312)",	// valSSN
				"must be a valid date" , // valDateDay
				"must be a valid date" , // valDateMonth
				"must be a valid date",  // valDateYear
				"please select a drop down entry", // valSelect
				"please confirm"	// valCheckbox
				);	

function disableFormChecks()
{
	disabled = true;
}

function enableFormChecks()
{
	disabled = false;
}
				
function initForm( formName )
{
	var frm = document.getElementById( formName );
	var childNodes = frm.getElementsByTagName( 'input' );
	var result = true;
	
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			childNodes.item(i).onblur = function (event){return validateField(this);};
			childNodes.item(i).onchange = function (event){return validateField(this);};
			
		}
	}
	
	childNodes = frm.getElementsByTagName( 'select' );
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			childNodes.item(i).onblur = function (event){return validateField(this);};
			childNodes.item(i).onchange = function (event){return validateField(this);};
		}
	}
	
	childNodes = frm.getElementsByTagName( 'textarea' );
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			childNodes.item(i).onblur = function (event){return validateField(this);};
			childNodes.item(i).onchange = function (event){return validateField(this);};
		}
	}
	
}

function validateForm( formName )
{
	if( disabled )
		return true;
	
	var frm = document.getElementById( formName );
	var childNodes = frm.getElementsByTagName( 'input' );
	var result = true;
	var lastMistake;
	
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			if( !validateField( childNodes.item(i) ) )
			{
				lastMistake = childNodes.item(i);
				result = false;
			}
		}
	}
	
	childNodes = frm.getElementsByTagName( 'select' );
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			if( !validateField( childNodes.item(i) ) )
			{
				lastMistake = childNodes.item(i);
				result = false;
			}
		}
	}
	
	childNodes = frm.getElementsByTagName( 'textarea' );
	for( i = childNodes.length - 1 ; i >= 0 ; --i )
	{
		if( childNodes.item(i).getAttribute('validation') )
		{
			if( !validateField( childNodes.item(i) ) )
			{
				lastMistake = childNodes.item(i);
				result = false;
			}
		}
	}
	
	if( lastMistake )
	{
		lastMistake.style.background = '#F8D8D8';
		lastMistake.focus();
		lastMistake = null;
	}

	return result;
}

function validateField( formElement )
{
	var valType = eval( formElement.getAttribute('validation') );
	var desc = document.getElementById( formElement.id + 'Description' );
	var required = desc.className == 'required';
	

	if( validateField_(  valType , required , formElement ) )
	{
		desc.innerHTML = (required? 'Required' : '' );
		if( formElement.style ) formElement.style.background = ''; 
		return true;
	}
	else
	{
		desc.innerHTML = descriptions[valType];
		formElement.style.background = '#FFFFA1';
		return false;
	}
}


function validateField_( valType , required,  formElement )
{
	
	var re = new RegExp( regularExpressions[valType] , "gim" );
		
	return ( !required && formElement.value == '' ) || formElement.value.match( re );
}