var nbsp = 160;		// non-breaking space char
var emptyString = /^\s*$/

function test(t) {
	 alert(t);
}

function validate(	// MASTER VALIDATION FUNCTION
//#####################################################################################
	input_element,	// element to be validated
	msg_element_id,	// id of element to receive info/error msg
	required,		// input required if 'true'
	validation_type	// email | digit - each method in own function
){//#####################################################################################
	
	// check for browser compatibility
	var stat = commonCheck (input_element, msg_element_id, required);
	if (stat != 'proceed') {
		return stat; // cancel further validation if commonCheck returns true
	}
	
	// start validation
	
	// input present ?
	if (required) {
		return validatePresent(input_element, msg_element_id);
	}
	
	// email?
	if (validation_type == 'email') {
		return validateEmail(input_element, msg_element_id);
	// telephone number?
	} else if (validation_type == 'tel_no') {
		return validateTelNo(input_element, msg_element_id);
	}
}

function commonCheck(
//#####################################################################################
	input_element,	// element to be validated
	msg_element_id	// id of element to receive info/error msg
){//#####################################################################################
	// Common code for all validation routines to:
	// (a) check for older / less-equipped browsers
	// (b) check if empty fields are required
	// Returns true (validation passed), 
	// false (validation failed) or 
	// proceed (don't know yet)
	
	if (!document.getElementById) 
		return true;// not available on this browser - leave validation to the server
	
	// is message element accesible ?
	var elem = document.getElementById(msg_element_id);
	if (!elem.firstChild)
		return true;// not available on this browser
	if (elem.firstChild.nodeType != 3) // DOM text node-type
		return true;// msg_element_id is wrong type of node

	return 'proceed';
}

function validatePresent(
//#####################################################################################
	input_element, 	// element to be validated
 	msg_element_id	// id of element to receive info/error msg
){//#####################################################################################
	// Validate if something has been entered
	// Returns true if so 
	
	if (emptyString.test(input_element.value)) {
		msg (msg_element_id, "error", "Please enter a value");
		input_element.focus();
		return false;
	}
	msg (msg_element_id, "warn", "");
	return true;
}

function validateEmail(
//#####################################################################################
	input_element, 	// element to be validated
	msg_element_id // id of element to receive info/error msg
){//#####################################################################################
	// Validate if e-mail address

	var tfld = trim(input_element.value);// value of field with whitespace trimmed off
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
	if (!email.test(tfld)) {
		msg (msg_element_id, "error", "Please enter a valid e-mail address");
		input_element.focus();
		return false;
	}
	
	var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
	if (!email2.test(tfld)) 
		msg (msg_element_id, "warn", "Unusual e-mail address - please check if it's correct");
	else
		msg (msg_element_id, "warn", "");
	return true;
}

function validateTelNo(
//#####################################################################################
	input_element,	// element to be validated
	msg_element_id // id of element to receive info/error msg
){//#####################################################################################
	// Validate telephone number
	// Permits spaces, hyphens, brackets and leading +
	
	var tfld = trim(input_element.value);// value of field with whitespace trimmed off
	var telnr = /^\+?[0-9 ()-]+[0-9]$/
	if (!telnr.test(tfld)) {
		msg (msg_element_id, "error", "Please enter a valid telephone number. Characters permitted are digits, space, (, ) and -");
		input_element.focus();
		return false;
	}
	
	var numdigits = 0;
	for (var j=0; j<tfld.length; j++) {
		if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') {
			numdigits++;
		}
	}
	if (numdigits<6) {
		msg (msg_element_id, "error", "The telephone number seems to be too short (only " + numdigits + " digits)");
		input_element.focus();
		return false;
	}
	
	if (numdigits>14) {
		msg (msg_element_id, "error", "The telephone number seems to be too long (" + numdigits + " digits)");
		input_element.focus();
		return false;
	}
	
	return true;
}

function validateAge(
//#####################################################################################
	input_element, 	// element to be validated
	msg_element_id // id of element to receive info/error msg
){//#####################################################################################
	// Validate person's age	
	
	var tfld = trim(input_element.value);
	var ageRE = /^[0-9]{1,3}$/
	if (!ageRE.test(tfld)) {
		msg (msg_element_id, "error", "ERROR: not a valid age");
		input_element.focus();
		return false;
	}
	
	if (tfld>=200) {
		msg (msg_element_id, "error", "ERROR: not a valid age");
		input_element.focus();
		return false;
	}
	
	if (tfld>110) {
		msg (msg_element_id, "warn", "Older than 110: check correct");
	} else {
		if (tfld<7) {
			msg (msg_element_id, "warn", "Bit young for this, aren't you?");
		} else {
			msg (msg_element_id, "warn", "");
		}
	}
	return true;
}

function trim(str) { 
//#####################################################################################
	// Trim leading/trailing whitespace off string
	return str.replace(/^\s+|\s+$/g, '');
}

function msg(
//#####################################################################################
	msg_element_id,		// id of element to display message in
	msg_element_class,	// class to give element ("warn" or "error")
	msg_text			// string to display
){//#####################################################################################
	// Display warn/error message in HTML element
	// commonCheck routine must have previously been called
	// setting an empty string can give problems if later set to a 
	// non-empty string, so ensure a space present. (For Mozilla and Opera one could 
	// simply use a space, but IE demands something more, like a non-breaking space.)
	var dispmessage;
	if (emptyString.test(msg_text)) {
		dispmessage = String.fromCharCode(nbsp);
	} else {
		dispmessage = msg_text;
	}
	var elem = document.getElementById(msg_element_id);
	elem.firstChild.nodeValue = dispmessage;
	
	elem.className = msg_element_class;
}