/*
*	CONTAINS FUNCTIONS TO CHECK TEXT FIELDS, NUMERIC FIELDS, EMAIL FIELDS, REQUIRED FIELDS, DROP-DOWN MENUS, RADIOBUTTONS
*
*/

function vEmail (field,strDisplNm) {
	/**
	 * Allows empty string, combine with ReqTxt to make required
	 */
	varErrMsg = '\nemail address at ' + strDisplNm + ' seems invalid';
	var boolOK = 1;
	var checkTLD=1;											//ENDS IN COUNTRY CODE?
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;									//CHECK GENERAL FORMAT
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";			//SPECIAL CHARACTERS
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";						//ALLOW QUOTED STRINGS
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;	//ALLOW IP ADDRESSES
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");		//STRUCTURE OF USER
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");		//STRUCTURE OF NORMAL SYMBOLIC DOMAIN
	
	//ALLOW EMPTY FIELD
	if (field.value.length == 0)		
		return '';
		
	//BREAK UP ADDRESS STRING
	var matchArray=field.value.match(emailPat);
	
	//NOT IN CORRECT GENERAL FORMAT
	if (matchArray==null) {
		return varErrMsg;
	}
	
	var user=matchArray[1];
	var domain=matchArray[2];
	
	//CHECK FOR NON-ASCII CHARS
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return varErrMsg;
		}
	}
	
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return varErrMsg;
		}
	}
	
	if (user.match(userPat)==null) {
		return varErrMsg;
	}
	
	//ENSURE IP ADDRESS VALID IF USED
	var IPArray=domain.match(ipDomainPat);
	
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return varErrMsg;
			}
		}
	return '';
	}
	
	//CHECK IF SYMBOLIC DOMAIN NAME VALID
	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 varErrMsg;
		}
	}
	
	//CHECK FOR COUNTRY CODE OR TOP-LEVEL
	//DOMAIN PRECEDED BY HOSTNAME
	if (checkTLD && domArr[domArr.length-1].length!=2
		&& domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return varErrMsg;
	}
	
	if (len<2) {
		return varErrMsg;
	}
	
	if (boolOK)
		return '';
	else
		return varErrMsg;
}

/*******************************************************************************************/

function vText(field, fname) {
	var valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ '-(),.!$";
	var ok = "yes";
	var temp;
	
	for (var i=0; i<field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") {
			ok = "no";
			break;
		}
	}
	
	if (ok == "no") {
		return '\ntext characters only allowed in field ' + fname;
	}
	
	else return '';
}

/****************************************************************************************/

function vRegExp(field, fname, pattern) {
	var rex = new RegExp(pattern);
	if (!rex.test(field.value)) {
		return '\ndisallowed input data format in field ' + fname;
	}
	return '';
}

/****************************************************************************************/

function vNumeric(field, fname) {
	var valid = "1234567890 -.()";
	var ok = "yes";
	var temp;
	
	for (var i=0; i<field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") {
			ok = "no";
			break;
		}
	}
	
	if (ok == "no") {
		return '\nnumbers only allowed in field ' + fname;
	}
	
	else return '';
}

/********************************************************************************************/

function vAlphaNum(field, fname) {
	var valid = "1234567890 -()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ '?@&,.!$/";
	var ok = "yes";
	var temp;
	
	for (var i=0; i<field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") {
			ok = "no";
			break;
		}
	}
	
	if (ok == "no")
		return '\nalpha-numeric characters only allowed in field ' + fname
	else return '';
}

/*********************************************************************************************/

function vReqTxt(field, fname) {
	if (field.value.length == 0)
		return '\nplease complete required field at ' + fname;
	else
		return '';
}

/*********************************************************************************************/

function vSame(field1, field2, fnames) {
	if (field1.value !== field2.value)
		return '\nvalues entered in fields ' + fnames + ' must match';
	else
		return '';
}

/*********************************************************************************************/

function vEitherOf(field1, field2, fnames) {
	if ('' == field1.value && '' == field2.value)
		return '\nplease enter something in at least one of ' + fnames + '';
	else
		return '';
}

/*********************************************************************************************/

function vReqMenu(field, fname) {
	var choice = field.selectedIndex;
	if (field.options[choice].value == '')
		return '\nplease select from drop-down menu at ' + fname;
	else
		return '';
}

/*********************************************************************************************/

function vReqRadio(field, fname) {
	if (field.checked)  // case of single button (no length)
		return '';
	for (var i=0; i < field.length; i++) {
		if (field[i].checked)
		return '';
	}
	return '\nplease select radio button at ' + fname;
}

/*********************************************************************************************/

function vReqChkbox(field, fname) {			//ENSURES A CHECKBOX IS SELECTED (no good for arrays of boxes)
	if (field.checked) {
		return '';
	}
	return '\ncheck box at ' + fname + ' must be checked';
}

/*********************************************************************************************/

function vReqOneBox(field, fname) {			//ENSURES AT LEAST ONE CHECKBOX IS SELECTED FROM A GROUP
	var checked = $(field).serializeArray();
	if (checked.length > 0) {
		return '';
	}
	return '\nat least one of the check boxes at ' + fname + ' must be checked';
}

/*********************************************************************************************/

function vInt(field, fname) {			
	var valid = "1234567890";
	var ok = "yes";
	var temp;

	for (var i=0; i<field.value.length; i++) {
		temp = "" + field.value.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") {
			ok = "no";
			break;
		}
	}

	if (ok == "no") {
		return '\nintigers only allowed at ' + fname;
	}
	else return '';
}

/*********************************************************************************************/

function vPostCode(field, codes, fname)
{
	/**
	 * Allows empty string, combine with ReqTxt to make required
	 */
	var fid = field.id;
	var pcodes = codes.split("','");
	var val = $("#" + fid).attr("value");
	var msg;
	var condition = jQuery.inArray(val, pcodes);
	
	if (-1 == condition || -1 >= condition)
	{
		if ('' == val)
		{
			return '';
		}
		else
		{
			msg = val + " is not in the list of valid Australian postcodes";
		}
		return "\n" + msg;
	}
	else
		return '';
}

/*********************************************************************************************/
