var valid1 = "The ";
var valid2 = " field contains invalid characters or values.";
var mandatory =" field is a mandatory field";

function isFieldValid(fieldStr,fieldName,fieldMinLength,fieldMaxLength,fieldType,customReg) {
	var result = "";
	var error = 0;

	if (isEmpty(fieldMaxLength)) {
		if (fieldType =="text") {
			fieldMaxLength = 50;
		} else if (fieldType == "num") {
			fieldMaxLength = 12;
		} else if (fieldType == "email") {
			fieldMaxLength = 80;
		} else {
			fieldMaxLength = 500;
		}
	}

   if (fieldStr.length > 0) {
		//remove trailing space for $str value
		var replaceReg = /[ ]*$/;
		fieldStr = fieldStr.replace(replaceReg,"");
		
		// Check whether string match the regular expression
		
		if (fieldType == "text") {
			var regPattern = /(^[a-zA-Z]([a-zA-Z\s.-]*[\']?[a-zA-Z\s\.-]*[a-zA-Z.])?$)/;
			valid2 =  " field contains invalid characters or values. Only the following characters are allowed a-z, A-Z, hyphen and single quote";
		} else if (fieldType == "num") {
			var regPattern = /(^[\d$-]([\d\s-,\.]*)$)/;
			valid2 =  " field contains invalid characters or values. Only the following characters are allowed 0-9, full-stop, comma and hyphen";
		} else if (fieldType =="email")	{
			var regPattern = /(\w{1}[\w-_\.]*)\@(\w{1})([\w-_\.]+\.\w+)/;
			valid2 =  " field contains invalid characters or values. Must be a valid email address e.g. yourname@emailaddress.com";
		} else if (fieldType == "alphaNum") {
			var replaceReg = /(<.*?>(.*?)<\/.*?>|<.*?>)/g;
			fieldStr = fieldStr.replace(replaceReg,""); //strip out <script tags or html type tags

			replaceReg = /[\"]/g; //strip out double quotes and replace with single quotes
			fieldStr = fieldStr.replace(replaceReg,"'");
			replaceReg = /[\x80-\xff]/g; //strip out certain ascii characters
			fieldStr = fieldStr.replace(replaceReg,"");
			replaceReg = /[\"\<\>\|\`\&\=\{\}\~\^\*\+\|\[\]\;\\]/g;
			fieldStr = fieldStr.replace(replaceReg,"");
			
			var regPattern = /(^([\w\s-\.\!\@\:\/\?\$\#\_\'\,\(\)\%]*[\w\s.!?]*)$)/;
 		    valid2 =  " field contains invalid characters or values. Only the following characters are allowed a-z, A-Z, 0-9 and common punctuation characters";			
		} else if (fieldType =="numOnly") {
			var regPattern = /([^0-9])/;
			valid2 =  " field contains invalid characters or values. Only the following characters are allowed 0-9";
		} else if (fieldType =="alphaOnly") {	
			var regPattern = /([^a-zA-Z])/;
			valid2 =  " field contains invalid characters or values. Only the following characters are allowed a-z and A-Z";
		} else if (fieldType =="alphaNumOnly") {
			var regPattern = /([^a-zA-Z0-9])/;
 		    valid2 =  " field contains invalid characters or values. Only the following characters are allowed a-z, A-Z and 0-9";			

		} else {
			if (isEmpty(customReg)) {
				var regPattern = /(^[a-zA-Z]([a-zA-Z\s.-]*[\']?[a-zA-Z\s\.-]*[a-zA-Z.])?$)/;
			} else {
				var regPattern = new RegExp(customReg);
			}
		} 
		
		if ((fieldType == "numOnly") || (fieldType == "alphaOnly") || (fieldType == "alphaNumOnly")) {
			if (regPattern.test(fieldStr) == true) {
				result = result + valid1 + "<strong>" + fieldName + "</strong>" + valid2 + "<br /><br />";
				error = 1;
			}
		} else {
			if (regPattern.test(fieldStr) == false) {
				if (fieldType =="email") {
					result = "Please type in valid email address in <strong>" + fieldName + " </strong>field.<br /><br />";
				} else if (fieldType == "optionsList") {
					result = "Please select one of the provided options in <strong>" + fieldName + "</strong> field.<br /><br />";
				} else {
					result = result + valid1 + "<strong>" + fieldName + "</strong>" + valid2 + "<br /><br />";
				}
				error = 1;	
			}
		}

		if ((fieldStr.length > fieldMaxLength) || (fieldStr.length < fieldMinLength)) {
			if (fieldMaxLength == fieldMinLength) {
			result = result + valid1 + "<strong>" + fieldName + "</strong>" + " must be in " + fieldMinLength + " characters in length." + "<br /><br />";

			} else {
				result = result + valid1 + "<strong>" + fieldName + "</strong>"  + " must be between " + fieldMinLength + " and " + fieldMaxLength + " characters in length."+ "<br /><br />";
			}
			error = 1;
		}
   } else {
		//if the field is mandatory, display error message
		if (fieldMinLength != 0) {
			if (fieldType == "optionsList") {
				result = valid1 + "<strong>" + fieldName + "</strong>" + mandatory + ". Please select one of the provided options in <strong>" + fieldName + "</strong> field.<br /><br />";
			} else {
				if (fieldMaxLength == fieldMinLength) {
					result = valid1 + "<strong>" + fieldName + "</strong>" + mandatory +  " or must be in " + fieldMinLength + " characters in length." + "<br /><br />";
				} else {
					result = valid1 + "<strong>" + fieldName + "</strong>" + mandatory + " or must be between " + fieldMinLength + " and " + fieldMaxLength + " characters in length.<br /><br />";
				}
			}
			error = 1;
		} 
	}
	return result;
 }

function getSelectedOptionValue(selectField) {
	var selectedValue = "";
	selectedValue = selectField.options[selectField.selectedIndex].value;
	return selectedValue;
}

function getRadioButtonValue(radio) {
	var cValue = "";
	for (var i = 0; i < radio.length; i++) {
		if (radio[i].checked) { cValue = radio[i].value; break }
    }
	return cValue
}

function getCheckBoxValue(box) {
	var cBoxValue = "";
	for (var i = 0; i < box.length; i++) {
		if (box[i].checked) { cBoxValue = box[i].value; break }
    }
	return cBoxValue
}

// Check whether string s is empty.
function isEmpty(s) {
	return ((s == null) || (s.length == 0))
}

// Returns true if string s is empty or whitespace characters only.
function isWhitespace (s) {
	var i;

	// Is s empty?
	if (isEmpty(s)) return true;
    // Search through string's characters one by one until we find a
	// non-whitespace character. When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++) {
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) return false;
	 }

    // All characters are whitespace.
    return true;
}
