var nbsp = 160;				// Non-breaking space character code
// Empty string regular expression
emptyString = /^\s*$/


// Trims white space from beginning and end of string
function trim(str)
{
	return str.replace(/^\s+|\s+$/g, '');
}



// Set value of HTML element with id to 'msg'
function setMsg( id, msg )
{
	// If 'msg' is empty string
	if ( emptyString.test( msg ) )
	{
		// Set 'dispmsg' to non-breaking space character
		dispmsg = String.fromCharCode( nbsp );
	}
	// Else if 'msg' is not empty
	else
	{
		// Set 'dispmsg' to 'msg'
		dispmsg = msg;
	}
	var elem = document.getElementById( id );
	elem.firstChild.nodeValue = dispmsg;
}



// input				= Form input: To focus on if input is invalid
// valid				= true/false: true if input is valid, false otherwise
// valid_pop_msg		= String/null: Input valid popup message, null if no popup
// invalid_pop_msg		= String/null: Input invalid popup message, null if no popup
// valid_html_msg		= String/null: Input valid HTML message, null if no HTML
// invalid_html_msg		= String/null: Input invalid HTML message, null if no HTML
// id					= String/null: ID of HTML tag to display HTML messages, null if not required
// Added 20050408
function displayValidate(	input,
							valid,
							valid_pop_msg,
							invalid_pop_msg,
							valid_html_msg,
							invalid_html_msg,
							id )
{
	// Initialize 'pop_msg' and 'html_msg' to the invalid values
	var pop_msg = invalid_pop_msg;
	var html_msg = invalid_html_msg;
	// If input is valid
	if ( valid )
	{
		// Set 'pop_msg' and 'html_msg' to the valid values
		pop_msg = valid_pop_msg;
		html_msg = valid_html_msg;
	}
	// Else if invalid
	else
	{
		// Focus on input
		input.focus();
	}
	// Display popup message
	if ( pop_msg != null )
	{
		alert( pop_msg );
	}
	// Display HTML message
	if ( ( html_msg != null ) && ( id != null ) )
	{
		setMsg( id, html_msg );
	}
}














// ******************************** The individual validate functions *******************************

// validateNotEmpty()
// input				= Form input
// valid_pop_msg		= String/null: Input valid popup message, null if no valid popup
// invalid_pop_msg		= String/null: Input invalid popup message, null if no invalid popup
// valid_html_msg		= String/null: Input valid HTML message, null if no valid HTML
// invalid_html_msg		= String/null: Input invalid HTML message, null if no invalid HTML
// id					= String/null: ID of HTML tag to display HTML messages, null if not required
// Added 20050408
function validateNotEmpty(	input,
							valid_pop_msg,
							invalid_pop_msg,
							valid_html_msg,
							invalid_html_msg,
							id )
{
	// Initialize 'valid' to false
	var valid = false;
	// If input length is greater than 0, it is valid
	if ( input.value.length > 0 )
		// Set 'valid' to true
		valid = true;

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}


// Validates if radio input is selected
function validateRadioNotEmpty( input,
								valid_pop_msg,
								invalid_pop_msg,
								valid_html_msg,
								invalid_html_msg,
								id )
{
	var valid = false;
	var i;

		for ( i = 0; i < input.length; i++ )
	{
		if ( input[i].checked )
		{
			valid = true;
		}
	}

	displayValidate( input[0], valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}


// Validates if selection is not empty
function validateSelectNotEmpty(	input,
									valid_pop_msg,
									invalid_pop_msg,
									valid_html_msg,
									invalid_html_msg,
									id )
{
	var valid = false;
	var i;

	for ( i = 0; i < input.options.length; i++ )
	{
		if ( input.options[i].selected && ( input.options[i].value.length > 0 ) )
		{
			valid = true;
		}
	}

	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}



// Validates if input length is within range, inclusive
function validateLength(	input,
							min_length,
							max_length,
							valid_pop_msg,
							invalid_pop_msg,
							valid_html_msg,
							invalid_html_msg,
							id )
{
	var valid = false;

	// If both 'min_length' and 'max_length' are not null
	if ( ( min_length != null ) && ( max_length != null ) )
	{
		// If 'input.value' length is between both 'min_length' and 'max_length' inclusive
		if ( ( min_length <= input.value.length ) && ( input.value.length <= max_length ) )
		{
			valid = true;
		}
	}

	// Else if 'min_length' is null and "max_length' is not null
	else if ( ( min_length == null ) && ( max_length != null ) )
	{
		// If 'input.value' length is less than 'max_length' inclusive
		if ( input.value.length <= max_length )
		{
			valid = true;
		}
	}

	// Else if 'min_length' is not null and "max_length' is null
	else if ( ( min_length != null ) && ( max_length == null ) )
	{
		// If 'input.value' length is more than 'min_length' inclusive
		if ( min_length <= input.value.length )
		{
			valid = true;
		}
	}

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}



// Validates if input is an email address
function validateEmail(	input,
						valid_pop_msg,
						invalid_pop_msg,
						valid_html_msg,
						invalid_html_msg,
						id )
{
	var valid = false;
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/

	// If email input is valid
	if ( email.test( input.value ) )
		valid = true;

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );
	
	return valid;
}



// Validates if 2 inputs are the same
function validateIsEqual(	input1,
							input2,
							valid_pop_msg,
							invalid_pop_msg,
							valid_html_msg,
							invalid_html_msg,
							id )
{
	var valid = false;

	// If 'input1' value is equal to 'input2' value, they are equal
	if ( input1.value == input2.value )
		valid = true;

	// Display validation message
	displayValidate( input1, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}



// Validates if input is a number
function validateIsNumber(	input,
							valid_pop_msg,
							invalid_pop_msg,
							valid_html_msg,
							invalid_html_msg,
							id )
{
	var valid = true;
	var i;

	for ( i = 0; i < input.value.length; i++ )
	{
		if (	( input.value.charAt( i ) != "0" ) &&
				( input.value.charAt( i ) != "1" ) &&
				( input.value.charAt( i ) != "2" ) &&
				( input.value.charAt( i ) != "3" ) &&
				( input.value.charAt( i ) != "4" ) &&
				( input.value.charAt( i ) != "5" ) &&
				( input.value.charAt( i ) != "6" ) &&
				( input.value.charAt( i ) != "7" ) &&
				( input.value.charAt( i ) != "8" ) &&
				( input.value.charAt( i ) != "9" ) )
		{
			valid = false;
		}
	}
	if ( input.value.length < 1 )
	{
		valid = false;
	}

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}



// Validates if 'input' contains only characters in the string 'alphabet'
function validateIsFromAlphabet(	input,
									alphabet,
									valid_pop_msg,
									invalid_pop_msg,
									valid_html_msg,
									invalid_html_msg,
									id )
{
	var valid = true;
	var i;
	var j;

	i = 0;
	// While still valid, loop for each char in input
	while ( valid && ( i < input.value.length ) )
	{
		j = 0;
		// Assume current input char is invalid and try to find a char in alphabet that matches it
		valid = false;
		// While still invalid, loop for each char in alphabet
		while ( !valid && ( j < alphabet.length ) )
		{
			if ( input.value.charAt( i ) == alphabet.charAt( j ) )
			{
				valid = true;
			}
			// Go to next alphabet char
			j++;
		}
		// Go to next input char
		i++;
	}

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}



// Validates if 'input' does not contain any character in the string 'alphabet'
function validateIsNotFromAlphabet(	input,
									alphabet,
									valid_pop_msg,
									invalid_pop_msg,
									valid_html_msg,
									invalid_html_msg,
									id )
{
	var valid = true;
	var i;
	var j;

	i = 0;
	// While still valid, loop for each char in input
	while ( valid && ( i < input.value.length ) )
	{
		j = 0;
		// While still valid, loop for each char in alphabet
		while ( valid && ( j < alphabet.length ) )
		{
			if ( input.value.charAt( i ) == alphabet.charAt( j ) )
			{
				valid = false;
			}
			// Go to next alphabet char
			j++;
		}
		// Go to next input char
		i++;
	}

	// Display validation message
	displayValidate( input, valid, valid_pop_msg, invalid_pop_msg, valid_html_msg, invalid_html_msg, id );

	return valid;
}
