/******************************************************************************
 HOST4NET
 Form validation script
 Written by Marius Popovici
 (C) 4NET 2003
*******************************************************************************
To use this, insert the following into the head of your document:

<script src="PATH/validlib.js" type="text/javascript" language="javascript1.2">
</script>

Main Functions: validateInput(input_control) , validateForm(form)

Usage:
	Input fields that need validation should have the following attributes:
	- required -  it's a required field
	- value_type - can be one of the following: numeric, email, range, date

Usage Examples:

The form declaration:

<FORM method='POST'  ACTION='formhandler.cgi' onSubmit="return validateForm(this,'There are errors on this form');">

Input fields:

A required numeric field:
<INPUT type='text' name='numeric_field' value_type='numeric' required
  onBlur="validateInput(this);">

An optional email address field:
<INPUT type='text' name='email_field' value_type='email' required onBlur="validateInput(this);">

A required date field with date format MM/DD/YYYY:
<INPUT type='text' name='date_field2' value_type='date' required onBlur="validateInput(this);">

A required input with range validator:
<INPUT type='text' name='range_field4' value_type='range' min='10' max='20'
  strict required onBlur="validateInput(this);">

******************************************************************************/

var errorColor  = '#FF4F4F'; // red
var fieldColor = '#FFFFFF'; //black

/**
 Specifies the validation behaviour
 Replace or modify this function to provide your
 own behaviour
*/
function validationBehaviour (formField,error)
{
  // change input field background color
	if (error==true) {
		// when things go bad
		formField.style.backgroundColor = errorColor;
	} else {
		// when everything is cool
		formField.style.backgroundColor=fieldColor;
	}
}

/**
	Checks if a  value is numeric or not
	Returns true/false
*/
function isNumeric(sText)
{
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	for (i = 0; i < sText.length && IsNumber == true; i++)
	{
		Char = sText.charAt(i);
		if (ValidChars.indexOf(Char) == -1) {
			IsNumber = false;
		}
	}
	return IsNumber;
}

/**
	Checks if a  value is a valid email address
	Returns true/false
*/
function isEmailAddress(sText)
{
	var result = false;
	var theStr = new String(sText);
	var index = theStr.indexOf("@");
	if (index > 0)
	{
		var pindex = theStr.indexOf(".",index);
		if ((pindex > index+1) && (theStr.length > pindex+1))
		result = true;
	}
	return result;
}

/**
	Checks date values for a valid format (yyyy/mm/dd)
*/
function isValidDate(sText)
{
	var result = true;
	if (result)
	{
		var elems = sText.split("/");
		result = (elems.length == 3); // should be three components

		if (result) {
			var month = parseInt(elems[1],10);
			var day = parseInt(elems[2],10);
			var year = parseInt(elems[0],10);
			result = !isNaN(month) && (month > 0) && (month < 13) &&
					!isNaN(day) && (day > 0) && (day < 32) &&
					!isNaN(year) && (elems[0].length == 4);
		}
	}
	return result;
}

/**
	Checks if a  value is within a range of min and max
	strict specifies if strict range check is done
	Returns true/false
*/
function isInRange(sText,min,max,strict)
{
	var result = false;
	if (isNumeric(sText))
	{
		var n = sText-0;
		if (strict==null) {
			// use less equal and greater or equal
			if (n >= min && n <= max) result = true;
		} else {
			// use strict comparison
			if (n > min && n < max) result =true;
		}
	}
	return result;
}


function isvalidPwd(sText,omolog) {

var result = false;
var invalid = " "; // Invalid character is a space
var minLength = 6; // Minimum length

var pw1 = document.forms[0].password.value;
var pw2 = new String(sText);
// check for a value in both fields.
if (pw1 == '' || pw2 == '') {
	result=false;
}
// check for minimum length
if (document.forms[0].password.value.length < minLength) {
	result=false;
}
// check for spaces
if (document.forms[0].password.value.indexOf(invalid) > -1) {
	result=false;
}
else {
	if (pw1 != pw2) {
	/*alert ("You did not enter the same new password twice. Please re-enter your password.");*/
	result=false;
	}
	else {
	result=true;
	}
 }
return result;
}

/**
	Checks if a  value is numeric or not
	Returns true/false
*/



/**
	Checks Time values for a valid format (hh:mm)
*/
function isValidTime(sText) {
	var result = true;
	if (result)
	{
		var elems = sText.split(':');
		result = (elems.length == 2); // should be two components

		if (result) {

			var minutes = parseInt(elems[1],10);
			var hours = parseInt(elems[0],10);

            result = !isNaN(hours) && (elems[0].length == 2) &&
                	 !isNaN(minutes) && (elems[1].length == 2);
		}
	}
	return result;
}





function isEmpty(formField) {
	if ((formField.value.length==0) || (formField.value==null)) {
		return true;
	}
	else { return false; }
}

/**
	Checks if an HTML input has the required attribute
	Returns true/false
*/
function isRequired(formField) {
	if (formField.getAttribute('required') != null) {
		return true;
	}
	else
		return false;
}

/**
	Checks if an HTML input has a valid emai address value
	Returns true/false
*/
function validatePwd(formField) {
	var result=true;


	if (isvalidPwd(formField.value)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		// no errors
		validationBehaviour(formField,false);
	} else {
		// there is an error
		validationBehaviour(formField,true);
	}
	return result;
}



/**
	Checks if an HTML input has a numeric value
	Returns true/false
*/
function validateNumeric(formField) {
	var result=true;
	// check if field is numeric
	if (isNumeric(formField.value)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}
	if (!isRequired(formField) && isEmpty(formField)) result = true;
	if (result) {
		validationBehaviour(formField,false);
	} else {
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Checks if an HTML input has a valid emai address value
	Returns true/false
*/
function validateEmail(formField) {
	var result=true;
	// check if field is numeric

	if (isEmailAddress(formField.value)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		// no errors
		validationBehaviour(formField,false);
	} else {
		// there is an error
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Checks if an HTML input has a valid email address value
	Returns true/false
*/
function validateDate(formField) {
	var result=true;
	// check if field is a valid date
	if (isValidDate(formField.value)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		validationBehaviour(formField,false);
	} else {
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Checks if an HTML input has a valid emai address value
	Returns true/false
*/
function validateRange(formField) {
	var result=true;
	var min = formField.getAttribute("min");
	var max = formField.getAttribute("max");
	var strict = formField.getAttribute("strict");
	// no null values allowed for min and max, strict is optional
	if (min==null || max==null) {
		return true;
	}
	// check if field is a valid date
	if (isInRange(formField.value,min,max,strict)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		validationBehaviour(formField,false);
	} else {
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Validate generic field
	Returns true/false
*/
function validateGeneric(formField) {
	var result=true;
	// is it required?
	if (isRequired(formField) && isEmpty(formField)) {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		validationBehaviour(formField,false);
	} else {
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Checks if an HTML input has a valid emai address value
*/

function validateTime(formField) {
	var result=true;
	// check if field is a valid time
	if (isValidTime(formField.value)) {
		result = true;
		// is it also required?
		if (isRequired(formField) && isEmpty(formField)) {
			result = false;
		}
	} else {
		result = false;
	}

	if (!isRequired(formField) && isEmpty(formField)) result = true;

	if (result) {
		validationBehaviour(formField,false);
	} else {
		validationBehaviour(formField,true);
	}
	return result;
}

/**
	Validates input control based on it's type
*/
function validateInput(formField)
{
	var fieldName = formField.name;
	var fieldValue = formField.value;
	var required = formField.required;
	var type = formField.getAttribute('value_type');
	var result;
	if (type == null) return;
	switch (type) {
		case "numeric":
			result = validateNumeric(formField);
			break;
		case "email":
			result = validateEmail(formField);
			break;
		case "date":
			result = validateDate(formField);
			break;
		case "range":
			result = validateRange(formField);
			break;
		case "generic":
			result = validateGeneric(formField);
			break;
		case "passwd":
			result = validatePwd(formField);
			break;
		case "time":
			result = validateTime(formField);
			break;
	}
	return result;
}

/**
	Validate an entire form
*/
function validateForm(theForm,message) {
	var errors = false;
	for (var j=0;j<theForm.length;j++) {
		var currentField=theForm.elements[j];
		if (validateInput(currentField)==false) errors = true ;
	}
	if (errors)  {
		alert(message);
		return false;
	}
	else {
		return true;
	}
}
