//
function validateForm(id)
{
	// Get the validatable fields. A field is validatable 
	//	iff it contains a 'validate' attribute
	var validatableFields = $("#" + id + " :input[validate]");
	
	// Iterate over validatable fields, validating each one
	for (var i = 0; i < validatableFields.length; ++i)
	{
		var validatableField = validatableFields[i];
		
		// alert("element: " + validatableField.name + ", validate=" + validatableField.getAttribute("validate") + ", value=" + validatableField.value);

		if(!isValidFieldByType(validatableField))
		{
			// Mark the field as invalid 
			$(validatableField).addClass("formInvalidField");
			validatableField.focus();
			
			// Build and display the invalid-field message 
			var invalidMessage = validatableField.getAttribute("invalidmessage");
			if(isBlankStringOrNull(invalidMessage))
				invalidMessage = validatableField.name + ": invalid (" + validatableField.getAttribute("validate") + ")";
			
			alert(invalidMessage);
			
			// Fail
			return false;
		}
		
		// Mark the field as valid 
		$(validatableField).removeClass("formInvalidField");
	}
	
	// Everything ok
	return true;
}


//
function isValidFieldByType(validatableField)
{
	// Validation differs depending on validation-type. We get the
	//	validation type of each validatable-field by querying the value of the
	//	'validate' attribute
	var validationType = validatableField.getAttribute("validate");
	switch(validationType)
	{
		// Text validation 
		case "textwithdefault":
			return isValidTextWithDefault(validatableField);
		
		case "text":
			return isValidText(validatableField);
		
		// Email validation
		case "email":
			return isValidEmail(validatableField);
			
		// Other validation types
		default:
			if(/^select:/.test(validationType))
			{
				return isValidSelect(validatableField);
			}
			if(/^selectnot:/.test(validationType))
			{
				return isValidSelectNot(validatableField);
			}
			break;
	}
	
	// Having reached this point, we're can be certain that the given validatable-field
	//	had a validation-type which is not recognised and therefore could not be handled.
	//	This should never happen in production code so
	alert(validatableField.name + ": Unexpected validation-type '" + validationType + "'");
	return false;
}


//
function isValidTextWithDefault(inputTextElement)
{
	var chk1 = isValidText(inputTextElement);
	var chk2 = (inputTextElement.getAttribute("initLabel") != inputTextElement.value);
	return (chk1 && chk2);
}

//
function isValidText(inputTextElement)
{return !isBlankStringOrNull(inputTextElement.value);}


//
function isValidEmail(inputTextElement)
{return inputTextElement.value.match(/^(([^<>()[\]\\.,;:\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,}))$/);} 


//
function isValidSelect(selectElement)
{
	var value = selectElement.options[selectElement.selectedIndex].value;
	var validValues = selectElement.getAttribute("validate").substring(("select:").length).split(";");
	
	for (var i = 0; i < validValues.length; ++i)
		if(value === validValues[i])
			return true;
	
	return false;
}


//
function isValidSelectNot(selectElement)
{
	var value = selectElement.options[selectElement.selectedIndex].value;
	var validValues = selectElement.getAttribute("validate").substring(("selectnot:").length).split(";");
	
	for (var i = 0; i < validValues.length; ++i)
		if(value === validValues[i])
			return false;
	
	return true;
}


//  
function isBlankStringOrNull(s)
{return s == null || /^\s*$/.test(s);}
