var whitespace = " \t\r\n";
var decimalPointDelimiter = ".";
var defaultEmptyOK = false;

function isEmpty(s){
	return ((s == null) || (s.length == 0))
}

function isDigit (c){
	if (c == '0' || c =='1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9')
		return true;
	else
		return false;
}

function lrTrim (s){
	var i, j, str;

	// Is s empty?
	if (isEmpty(s)) return null;
	for (i = 0; i < s.length; i++){   
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) break;
	}
	for (j = s.length - 1; j >= 0; j--){   
		var c = s.charAt(j);
		if (whitespace.indexOf(c) == -1) break;
	}
	str = s.substring(i, s.length);
	str = str.substring(0,j - i + 1);
	return str;
}

function trim11 (str) {
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}

function isInteger (s){
	var i;
	if (isEmpty(s)) 
		if (isInteger.arguments.length == 1) return defaultEmptyOK;
	else return (isInteger.arguments[1] == true);
	for (i = 0; i < s.length; i++){   
		var c = s.charAt(i);
		if (!isDigit(c)) return false;
	}
	return true;
}

function isFloat (s){
	var i;
	var seenDecimalPoint = false;

	if (isEmpty(s)) 
	if (isFloat.arguments.length == 1) return defaultEmptyOK;
	else return (isFloat.arguments[1] == true);
	if (s == decimalPointDelimiter) return false;
	// Search through string's characters one by one
	// until we find a non-numeric character.
	// When we do, return false; if we don't, return true.
	for (i = 0; i < s.length; i++){   
		// Check that current character is number.
		var c = s.charAt(i);
		if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
		else if (!isDigit(c)) return false;
	}
	// All characters are numbers.
	return true;
}

function isblank(s){
	return false;
	for( var i = 0; i < s.length; i++ ) {
		var c = s.charAt(i);
		if (( c != ' ' ) && ( c != '\n' ) && ( c != '\t' )) return false;
	}
	return true;
}

function isEmail(poEmail){
	var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.*[.].*$";
	var regex = new RegExp(emailReg);
	if (!regex.test(poEmail)){
		return false;
	}else{
		return true;    
	}
}

function isPhone(poPhone){
	var phoneReg = "^\(?(?<AreaCode>[2-9]\d{2})(\)?)(-|.|\s)?(?<Prefix>[1-9]\d{2})(-|.|\s)?(?<Suffix>\d{4})$";
	var regex = new RegExp(phoneReg);
	if (!regex.test(phoneReg)){
		return false;
	}else{
		return true;    
	}
}


function isRadioChecked(radioObj){
	if (radioObj.length){
		for (var i = 0; i < radioObj.length; i ++){
			if (radioObj[i].checked){
				return true;
			}
		}
	}else{
		if (radioObj.checked){
			return true;
		}
	}
	return false;
}

function isCheckBoxSelected(chkBxObj){
	if (chkBxObj.length){
		for (var i = 0; i < chkBxObj.length; i ++){
			if (chkBxObj[i].checked){
				return true;
			}
		}
	}else{
		if (chkBxObj.checked){
			return true;
		}
	}
	
	return false;
}

function fncLZ(x) {return(x<0||x>9?"":"0")+x}

String.prototype.trim = function()
{
  return( this.replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1') );
}

function fncValidateFormField(n_formObject, n_type, n_blnRequired){
	blnSuccess = true;
	if (n_blnRequired){
		if (!n_formObject.value.trim().length && (n_type != 'dateterm')){
			errors.push(n_formObject.title + " is required");
		}
	}
	switch (n_type){
		case "string":
		case "nonreservedstring":
		case "numeric":
		case "alpha":
		case "alphanospace":
		case "alphanumeric":
		case "name":
		case "corporatename":
		case "nonpobox":
		case "any":

			if (fncValidateFormField.arguments.length == 4) {
				var intMinLength = parseInt(fncValidateFormField.arguments[3]);
				if (n_formObject.value.trim().length < intMinLength && n_formObject.value.length > 0){
					blnSuccess = false;
					fncWriteError("must be at least " + intMinLength + " characters" + "\n" , n_formObject)
				}
			}
			if (((n_blnRequired) || (n_formObject.value.trim().length > 0)) && (fncValidateFormField.arguments.length == 5)) {
				var intMinLength = parseInt(fncValidateFormField.arguments[3]);
				var intMaxLength = parseInt(fncValidateFormField.arguments[4]);

				if(isNaN(intMinLength) && isNaN(intMaxLength)){
					//No boundary search
					blnSuccess = false;
					fncRemoveError(n_formObject);
					fncWriteError(""+isNaN(intMinLength)+" "+isNaN(intMaxLength), n_formObject);
				}else if(isNaN(intMinLength) && (n_formObject.value.trim().length > intMaxLength)){
					errors.push(n_formObject.title + " characters, currently you have " +n_formObject.value.trim().length+" characters.");
				}else if((n_formObject.value.trim().length < intMinLength) && isNaN(intMaxLength)){
					blnSuccess = false;
					errors.push(n_formObject.title + " must be at least " + intMinLength + " characters, currently you have " +n_formObject.value.trim().length+" characters.");
				}else if((intMinLength == intMaxLength) && (n_formObject.value.trim().length != intMinLength)){
					errors.push(n_formObject.title + " must be exactly " + intMinLength + " characters, currently you have " +n_formObject.value.trim().length+" characters.");
				}else if((n_formObject.value.trim().length < intMinLength) || (n_formObject.value.trim().length > intMaxLength)){
					errors.push(n_formObject.title + " must be between " + intMinLength + ' and '+ intMaxLength + " characters, currently you have " +n_formObject.value.trim().length+" characters.");
				}
			}

			if (n_type == "nonreservedstring"){

				if (n_formObject.value.indexOf('%') >= 0){
					blnSuccess = false;
					fncWriteError("cannot contain a '%'", n_formObject)
				}

			}

			if (n_type == "name"){
				var n_regExpression = new RegExp("[^A-Za-z .'`,-]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be alpha characters (A-Z), spaces, commas, apostrophes, hyphens and periods.");
				}
				var n_regExpression = new RegExp("[^A-Za-z ]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");

				if (blnSuccess && (n_formObject.value.trim().length > 0) && (n_strAlphaOnly.length < 2) ){
					errors.push(n_formObject.title + " must contain at least two alpha characters (A-Z).");
				}

			}

			if (n_type == "corporatename"){
				var n_regExpression = new RegExp("[^0-9A-Za-z .'`,-]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be alpha numeric characters (0-9, A-Z), spaces, commas, apostrophes, hyphens and periods.");
				}
				var n_regExpression = new RegExp("[^0-9A-Za-z ]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");


				if (blnSuccess && (n_formObject.value.trim().length > 0) && (n_strAlphaOnly.length < 2) ){
					errors.push(n_formObject.title + " must contain at least two alpha numeric characters (0-9, A-Z).");
				}

			}
			if (n_type == "numeric"){
				var n_regExpression = new RegExp("[^0-9]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be numeric (0-9).");
				}

			}
			if (n_type == "alpha"){
				var n_regExpression = new RegExp("[^A-Za-z ]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be alpha characters (A-Z).");
				}

			}
			if (n_type == "alphanospace"){
				var n_regExpression = new RegExp("[^A-Za-z]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be alpha characters (A-Z) no spaces.");
				}

			}
			if (n_type == "alphanumeric"){
				var n_regExpression = new RegExp("[^0-9A-Za-z]","gi");
				var n_strAlphaOnly = n_formObject.value.trim();
				var n_strAlphaOnly = n_strAlphaOnly.replace(n_regExpression,"");
				if (n_strAlphaOnly != n_formObject.value.trim()){
					errors.push(n_formObject.title + " can only be alpha numeric characters (0-9, A-Z).");
				}
			}

			break;
		case "phone":
			var phoneReg = "^[2-9][0-9]{2}-[0-9]{3}-[0-9]{4}";
   			var regex = new RegExp(phoneReg);

			if (n_formObject.value.trim().length > 0){
				if (!regex.test(n_formObject.value.trim())){
					errors.push(n_formObject.title + " must be of the correct format (999-999-9999).");
				}
			}
		break;
		case "email":
			var emailReg = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.*[.].*$";
   			var regex = new RegExp(emailReg);
			
			if (n_formObject.value.trim().length > 0){
				if (!regex.test(n_formObject.value.trim())){
					errors.push(n_formObject.title + " is not a syntactically valid email address.");
				}
			}
		break;
	}
	return;
}


