// ----------------------------------------------------------------------
// Client-Side Subscription Form Validation
// ----------------------------------------------------------------------

var nbsp = 160;		 // non-breaking space char
var node_text = 3; // DOM text node-type
emptyString = /^\s*$/

// -----------------------------------------
//									trim
// Trim leading/trailing whitespace off string
// -----------------------------------------

function trim(str)
{
	return str.replace(/^\s+|\s+$/g, '')
};

// -----------------------------------------
//									msg
// Display warn/error message in HTML element
// commonCheck routine must have previously been called
// -----------------------------------------

function msg(fld,			// id of element to display message in
				msgtype,	// class to give element ("warn" or "error")
				message)	// string to display
{
	// 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(message)) 
		dispmessage = String.fromCharCode(nbsp);		
	else	
		dispmessage = message;

	var elem = document.getElementById(fld);
	elem.firstChild.nodeValue = dispmessage;	
	
	elem.className = msgtype;
};

// -----------------------------------------
//						commonCheck
// 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)
// -----------------------------------------

var proceed = 2;	

function commonCheck		(vfld,	 // element to be validated
							ifld,	 // id of element to receive info/error msg
							reqd)	 // true if required
{
	if (!document.getElementById) 
		return true;	// not available on this browser - leave validation to the server
	var elem = document.getElementById(ifld);
	if (!elem.firstChild)
		return true;	// not available on this browser 
	if (elem.firstChild.nodeType != node_text)
		return true;	// ifld is wrong type of node	 

	if (emptyString.test(vfld.value)) {
		if (reqd) {
			msg (ifld, "error", "<-- REQUIRED!");	 
			vfld.focus();
			return false;
		}
		else {
			msg (ifld, "warn", "");		// OK
			return true;	
		}
	}
	return proceed;
}

// -----------------------------------------
//						validatePresent
// Validate if something has been entered
// Returns true if so 
// -----------------------------------------

function validatePresent(vfld,	 // element to be validated
						ifld )	 // id of element to receive info/error msg
{
	var stat = commonCheck (vfld, ifld, true);
	if (stat != proceed) return stat;

	msg (ifld, "warn", "");	 
	return true;
};

// -----------------------------------------
//							 validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// -----------------------------------------

function validateEmail	(vfld,	 // element to be validated
						ifld,	 // id of element to receive info/error msg
						reqd)	 // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = trim(vfld.value);	// value of field with whitespace trimmed off
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
	if (!email.test(tfld)) {
		msg (ifld, "error", "<-- ERROR: Invalid Address");
		vfld.focus();
		return false;
	}

//	var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
//	if (!email2.test(tfld)) 
//		msg (ifld, "warn", "Unusual e-mail address - check if correct");
//	else
		msg (ifld, "warn", "");

	return true;
};


// -----------------------------------------
//						validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateTelnr	(vfld,	 // element to be validated
						ifld,	 // id of element to receive info/error msg
						reqd)	 // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = trim(vfld.value);	// value of field with whitespace trimmed off
	var telnr = /^\+?[0-9 ()-]+[0-9]$/
	if (!telnr.test(tfld)) {
		msg (ifld, "error", "<-- ERROR - Ex: 123-456-7890");
		vfld.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!=10) {
		msg (ifld, "error", "<-- ERROR - Ex: 123-456-7890");
		vfld.focus();
		return false;
	}

	msg (ifld, "warn", "");
	return true;
};


// -----------------------------------------
//						validateZIP
// Validate ZIP code
// Returns true if so (and also if could not be executed because of old browser)
// Permits standard 5 number ZIP as well as 9 digit ZIP+4
// -----------------------------------------

function validateZIP	(vfld,	 // element to be validated
						ifld,	 // id of element to receive info/error msg
						reqd)	 // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = trim(vfld.value);	// value of field with whitespace trimmed off
	var telnr = /^\+?[0-9 ()-]+[0-9]$/
	if (!telnr.test(tfld)) {
		msg (ifld, "error", "ERROR - ex: 12345 or 12345-6789");
		vfld.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 != 5) && (numdigits != 9)) {
		msg (ifld, "error", "ERROR - ex: 12345 or 12345-6789");
		vfld.focus();
		return false;
	}

	msg (ifld, "warn", "");
	return true;
};


// -----------------------------------------
//						validateURL
// Validate a URL
// Returns true if so (and also if could not be executed because of old browser)
// Supports http://, https://, ftp:// as well as ?, asp and #
// -----------------------------------------

function validateURL	(vfld,	 // element to be validated
						ifld,	 // id of element to receive info/error msg
						reqd)	 // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = trim(vfld.value);	// value of field with whitespace trimmed off

	var urlf = /^(((ht|f)tp(s?))\:\/\/)?(www.|[a-zA-Z0-9].)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$/

//	var urlf = /^(ht|f)tp(s?)\:\/\/[a-zA-Z0-9\-\._]+(\.[a-zA-Z0-9\-\._]+){2,}(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$/

	if (!urlf.test(tfld)) {
		msg (ifld, "error", "ERROR");
		vfld.focus();
		return false;
	}

	msg (ifld, "warn", "");
	return true;
};

// -----------------------------------------
//						validateSubscribeSubmit
// validate all the elements on the subscription form
// Returns true if everything is good
// -----------------------------------------

function validateSubmit() {
	var elem;
	var errs=0;
	// execute all element validations in reverse order, so focus gets set to the first one in error.

	if (!validateURL    (document.forms.sub_form.company_url,		'inf_company_url', false))	errs += 1; 
	if (!validateZIP    (document.forms.sub_form.addr_zip,			'inf_addr_zip', true))		errs += 1; 
	if (!validatePresent(document.forms.sub_form.addr_state,		'inf_addr_state'))			errs += 1; 
	if (!validatePresent(document.forms.sub_form.addr_city,			'inf_addr_city'))			errs += 1; 
	if (!validatePresent(document.forms.sub_form.addr_street1,		'inf_addr_street1'))		errs += 1; 

	if (!validateEmail  (document.forms.sub_form.contact_email,		'inf_contact_email', true))	errs += 1; 
	if (!validateTelnr  (document.forms.sub_form.contact_phone,		'inf_contact_phone', true))	errs += 1; 
	if (!validatePresent(document.forms.sub_form.contact_name,		'inf_contact_name'))		errs += 1; 
	if (!validatePresent(document.forms.sub_form.company_name,		'inf_company_name'))		errs += 1; 


	if (errs==1) {
		alert('The indicated field must be completed \nor corrected before your \nrequest can be processed.');
	} else if (errs>1) {
		alert('The indicated fields must be completed \nor corrected before your \nrequest can be processed.');
	} else if (document.forms.sub_form.hardscape.checked == false && document.forms.sub_form.adhesive.checked == false) {
		document.forms.sub_form.hardscape.focus() ;
		alert('You must select at least one \ntype of products that you \ninterested in distributing.');
		errs += 1
	} else if (document.forms.sub_form.ppolicy.checked == false) {
		document.forms.sub_form.ppolicy.focus() ;
		alert('You must click the checkbox confirming that \nyou have read the Privacy Policy before \nyour request can be processed.');
		errs += 1
	}

	return (errs==0);
};
