var errormsg 	= '';		//stores overall errormessage. 
var firstError	= null;	//field where first error came from.
var lastError	= null;	//field where last found error came from.

function initErrMsgs() {
	
	errormsg 	= '';		
	firstError	= null;	
	lastError	= null;	
}

function displayMsg() {
	if (errormsg == '') 
		return true; 
	else {
		alert(errormsg);
		firstError.focus();
		return false;
	}
}

function addErrorMsg(msg) {
	errormsg = errormsg + msg + '\n';
	return;
}

function setError(fld) {
	if (firstError == null) {
		firstError = fld;
	}
	lastError = fld;
}

//==========================================

function returnMatches(parsePattern, searchString) {
	var matchArray=searchString.match(parsePattern);
	if (matchArray==null) return false;
	var newStr = '';
	for (i=0; i<matchArray.length; i++) {
		newStr += matchArray[i];
	}
	return newStr;
}


/****************************VALIDATION FUNCTIONS **************************************/
function chkEmptyFld (fld, nam) {
	if (fld.value.length == 0) {
		addErrorMsg ('You have not filled in the \'' + nam + '\'.');
		setError(fld);
		return;
	}
	else if (fld.value == null) {
		addErrorMsg ('You have not filled in the \'' + nam + '\'.');
		setError(fld);
		return;
	}
	else {
		for (var i=0; i<fld.value.length; i++) {
			var ch = fld.value.charAt(i);
			if (ch != ' ' && ch != '\t') {
				break;
			}
			else {
				if ((i + 1) == fld.value.length) {
					addErrorMsg ('You have not filled in the \'' + nam + '\'.');
					setError(fld);
					break;
				}
			}
		}
	}
}

//==========================================

function chkSelect (fld, nam) {
	if (fld.value == '') {
		addErrorMsg ('You have not chosen a \'' + nam + '\'.');
		setError(fld);
		return;
	}
}

//==========================================

function chkValidDate(fld, nam) {
	var dateStr = fld.value;
	if (chkDate(dateStr)) {
		return true;
	}
	else {
		addErrorMsg ('The \'' + nam + '\' field is formatted incorrectly');
		setError(fld);
		return false;
	}
}

//---------------------------------------------------------------------------

function chkDate (fld) {
	var datePat = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/;
	var matchArray = fld.match(datePat); // is the format ok?
	
	if (matchArray == null) return false;
	
	 // parse date into variables
	year = matchArray[1];
	month = matchArray[3];
	day = matchArray[5];
	
	if (month < 1 || month > 12) return false;
	
	if (day < 1 || day > 31) return false;
	
	if ((month==4 || month==6 || month==9 || month==11) && day==31) return false;
	
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) return false;
	}
	
	return true;
}//==========================================

function chkValidEmail(fld, nam) {
	var emailStr = fld.value;
	if (chkEmailAddress(emailStr)) {
		return true;
	}
	else {
		addErrorMsg ('The \'' + nam + '\' field is formatted incorrectly');
		setError(fld);
		return false;
	}
}

//---------------------------------------------------------------------------

function chkEmailAddress(emailStr) {

	if (emailStr.length == 0 || emailStr == null) return false;
	
	var checkTLD=1;
	
	// http://www.iana.org/gtld/gtld.htm
	// knownDomsPat is a list of known domain suffixes larger than 2 characters in length
	var knownDomsPat=/^(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro)$/;
	
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);

	if (matchArray==null) return false;

	var user=matchArray[1];
	var domain=matchArray[2];

	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) return false;
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) return false;
	}

	if (user.match(userPat)==null) return false;

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) return false;
		}
	}

	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) return false;
	}

	if (checkTLD && domArr[len-1].length!=2 && domArr[len-1].search(knownDomsPat)==-1) return false;

	if (len<2) return false;

	return true;
}

//==========================================

function chkValidPostal(fld, nam) {
	var postal = fld.value;
	postal = postal.toUpperCase();
	var ch = postal.charAt(3);
	
	if (postal.length < 6 || postal.length > 7) {
		addErrorMsg('The \''+nam+'\' is not in a valid format (X9X9X9 or X9X 9X9)');
		setError(fld);
		return;
	}
	else if (postal.length == 7) {
		var ch = postal.charAt(3);
		if (ch == ' ') {
			postal = postal.substring(0,3) + postal.substring(4);
		}
		else {	
			addErrorMsg('The \''+nam+'\' is not in a valid format (X9X9X9 or X9X 9X9)');
			setError(fld)
			return;
		}
	}
		
	for (var i = 0; i<postal.length; i++) {
		var ch = postal.charAt(i);
		if (i == 0 || i == 2 || i == 4) {
			if (ch < 'A' || ch > 'Z') {
				// it is not a letter
				addErrorMsg ('The \''+nam+'\' is not in a valid format (X9X9X9 or X9X 9X9)');
				setError(fld)
				return;
			}
		}
		else if (i == 1 || i == 3 || i == 5) {
			if (ch < '0' || ch > '9') {
				// it is not a number
				addErrorMsg ('The \''+nam+'\' is not in a valid format (X9X9X9 or X9X X9X)');
				setError(fld)
				return;
			}
		}
	}
	
	fld.value = postal;
}







