<!--//
/*
Script for client-side validation

Instructions for Use:

theForm must be declared.:
Call function validateField with the following parameters:

	fieldName:	Name of the INPUT field
	fieldDesc:	A user-friendly description
	isRequired:	If the field is required or not
	fieldType:	Type of the field.  Possible values are: text,email,zip,number
	minVal:		Minimum value for a number field
				also minimum characters for a text field
	maxVal:		Maximum value for a number field
				also maximum characters for a text field
	isArray:	If it is a list of input fields with the same name
				Set true for radio, checkbox field

*/

// Supporting functions

var errFlag;

errFlag = false;

function getNumber(fieldValue) {
 		
 		var field = new String(fieldValue);
 		//Get rid of any $
  		if (field.indexOf("$") != -1) {
  			var r = new RegExp("$", "g");
			field = field.replace(r, "");
		}
		//Get rid of any commas
		if (field.indexOf(",") != -1) {
			var r = new RegExp(",", "g");
			field = field.replace(r, "");
		}		
		//Now parse the number
		returnThis = Math.round(parseFloat(field));
		if(isNaN(returnThis) || (field == "")){
			returnThis = 0;
		}
		return returnThis;
}

function getCurrency(fieldValue, decPoints){
 		//Get rid of any commas
 		var field = new String(fieldValue);
 		//Get rid of any $
  		if (field.indexOf("$") != -1) {
  			var r = new RegExp("$", "g");
			field = field.replace(r, "");
		}
		//Get rid of any commas
		if (field.indexOf(",") != -1) {
			var r = new RegExp(",", "g");
			field = field.replace(r, "");
		}		
		//Now parse the number
		returnThis = parseFloat(field);
		if(isNaN(returnThis) || (field == "")){
			returnThis = 0;
		}
		
		var checkOK = "0123456789.";		
		var checkStr = field;
		var idec;
		var decPoints;
 
		var newStr = "";
		if(isNaN(decPoints)) { decPoints = 2; }
		for (i = 0; i < checkStr.length; i++) // This funct erases '$' or ',' from the string,  
		{									  
			ch = checkStr.charAt(i);		  // But, if the field was cleared by this function,	
			if (ch == ".")		  // it didn't raise isErr, so fieldValid was set to 1,
			{								  // allowing a zero value to be posted to the form. 	
				idec = i;
				newStr = newStr + ch;
			}
			else 
			{
				newStr = newStr + ch;
				if (i >= idec + decPoints) {
					if (checkStr.substr(i+1, 1) >= 5) {
						newStr = Number(newStr) + (1/Math.pow(10,decPoints))
					}
					break;
				}
			}
		}
		returnThis = newStr
		return returnThis;
}

function formatCommas (number)  {
		var returnThis = "";
	     if(number != 0){
	          var inNumber = new String(number);
         		var decimals = "";
         		var length = inNumber.length;
     		if(inNumber.indexOf(".") != -1){
     			decimals = (inNumber.substring(inNumber.indexOf("."), (length + 1)));
     			inNumber = (inNumber.substring(0, (length - decimals.length)));
     			length = inNumber.length;
     		}
     		if(length >= 3){
     			while(length > 0){
     				var temp = inNumber.substring((length - 3), length);
     				if(temp.length == 3){
     					returnThis = "," + temp + returnThis;
     					length = (length - 3);
     				}else{
     					returnThis = temp + returnThis;
     					length = 0;
     				}
     			}

     			if((returnThis.substring(0, 1) == ",")){
     				returnThis = (returnThis.substring(1, returnThis.length));
     			}

     			if((returnThis.substring(0, 1) == "-") && (returnThis.substring(1,2) == ",")){
     				returnThis = "-" + (returnThis.substring(2, returnThis.length));
     			}

     			returnThis = (returnThis + decimals);
     		}else{
     			returnThis = inNumber;
     		}
          }else{
               returnThis = "0";
          }
		return returnThis;
}
function isValidDate(val) 
{
	var vdate = new String(val);
	if (vdate == "") return false;
	vdate = vdate.split(" ");
	var mmddyy = vdate[0];
	var datearray = mmddyy.split("/");
	if (datearray.length == 0)	 {
		datearray = mmddyy.split(".")
	}
	if (datearray.length < 3)	 {
		return false;
	}
	// get rid of any leading 0 before month
	if (datearray[0].substr(0,1) == "0") {
		datearray[0] = datearray[0].substr(1);
	}
	// get rid of any leading 0 before day
	if (datearray[1].substr(0,1) == "0") {
		datearray[1] = datearray[1].substr(1);
	}
	//alert(datearray[0] + datearray[1] + datearray[2]);
	if (datearray.length == 3) {
		return isDate (datearray[2], datearray[0], datearray[1])
	} else {
		return false;
	}
}
function futureDate(val)
{
	if (val == "") return false;
	
	sdate = new String(val);
	dd = sdate.split("/");
	var today = new Date();

	if (dd.length == 3) {
		if (dd[2].length == 2) { dd[2] = "20" + dd[2]; } 
		sdate = dd[0] + "/" + dd[1] + "/" + dd[2];
		if (Date.parse(sdate) > Date.parse(today) ) {
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	} 
}
// main function

function validateField (fieldName, fieldDesc, isRequired, fieldType, minVal, maxVal, isArray) {
	//form must be named 'theForm'
	//returns 1 if there is an error else 0
	
	var isErr = false;
	var validate = true;	//should validate this field?
	var selected = false;	//used for checkboxes and radio buttons
	var nitems;				//number of items in a combobox, checkbox
	
	errString = ""; //this is a page level variable and must be declared on the calling page
	
	if (isArray) {
		//the value would be set later
		theField = eval("document.theForm." + fieldName + "[0]");
	} else {
		theField = eval("document.theForm." + fieldName );
	}
	//if field doesn't exists, just exit
	if (!theField) {
		//errString += "\n" + fieldDesc + ": Field does'nt exist";
		errString += buildErrList(fieldDesc + " does not exist");
		focusCheck(theField);
		return 1;
	}

	if (theField.type == "radio") {
		if (isRequired) {
			for (var i=0;i<=1;i++) {
				if ( eval("document.theForm." + fieldName + "[" + i + "].checked" ) == true) {
					selected = true;
					break;
				}
			}
			if (!selected) {
				//errString += "is not selected";
				errString += buildErrList(fieldDesc + " is not selected");
				focusCheck(theField);
				isErr=true;
			}
		}
		validate = false; //no need to validate
		
	} else if (theField.type == "checkbox") {
		if (isRequired) {
			nitems =  eval("document.theForm." + fieldName + ".length")
			for (var i=0;i<nitems;i++) {
				if ( eval("document.theForm." + fieldName + "[" + i + "].checked") == true) {
					selected = true;
					break;
				}
			}
		}
		validation = false; //no need to validate
		
	} else if (theField.type == "select") {
		index = theField.selectedIndex
		if (isRequired) {
			if (index > 0) { seleced = true };
			if (!selected) {
				//errString += "is not selected";
				errString += buildErrList(fieldDesc + ": is not selected");
				focusCheck(theField);
				isErr=true;
			}
		}
		validate = false; //no need to validate
		
	} else {
		//text field
		fieldVal = theField.value;
	}
	
	isText = (fieldType == 'text');
	isNumber = ((fieldType == 'number') || (fieldType == 'amount'));
	isDate = (fieldType == 'date');
	isAmount = (fieldType == 'amount');
	isPhone = (fieldType == 'phone');
	
	if (isRequired && ((theField.value == "")||(!theField.value)) ) 
	{
		//errString += "is required";
		errString += buildErrList(fieldDesc + " is required");
		focusCheck(theField);
		isErr=true;
		validate=false;
	}
	
	if (validate && isText) 
	{
		minC = minVal;
		maxC = maxVal;
		if (minC != -1 && theField.value.length < minC) 
		{
			//errString = makeSentence (errString, "is less than " + minC + " characters long");
			errString += buildErrList(fieldDesc + "is less than " + minC + " characters long");
			focusCheck(theField);
			isErr = true;
		}
		if (maxC != -1 && theField.value.length > maxC) 
		{
			//errString = makeSentence (errString, "is longer than " + maxC + " characters");
			errString += buildErrList(fieldDesc + "is longer than " + maxC + " characters");
			focusCheck(theField);
			isErr = true;
		}
	}
	if (validate && isNumber) 
	{		
		if (minVal != -1 && fieldVal < minVal) 
		{
			//errString = makeSentence (errString, "Its value is less than " + minVal);
			errString += buildErrList(fieldDesc + "'s value is less than " + minVal);
			focusCheck(theField);
			isErr = true;
		}
		if (maxVal != -1 && fieldVal > maxVal) 
		{
			//errString = makeSentence (errString, "Its value is greater than " + maxVal);
			errString += buildErrList(fieldDesc + "'s value is greater than " + maxVal);
			focusCheck(theField);
			isErr = true;
		}
	}
	if (validate && isPhone) 
	{	
		minC = minVal;
		maxC = maxVal;
		
		if (minC != -1 && theField.value.length < minC) 
		{
			//errString = makeSentence (errString, "It must be at least " + minC + " digits");
			errString += buildErrList(fieldDesc + "must be at least " + minC + " digits");
			focusCheck(theField);
			isErr = true;
		}
	}	
	//check if field is empty (contain only spaces)
	if (isRequired) 
	{
		var checkStr = theField.value;
		for (i=0; i<checkStr.length; i++) 
		{
			ch = checkStr.charAt(i);
			if (ch != " ") 
			{
			break;
			}
		}
		if (i == checkStr.length && checkStr.length != 0) 
		{
		isErr = true;	
		//errString = makeSentence (errString, "Only spaces");
		errString += buildErrList(fieldDesc + " contains only spaces");
		focusCheck(theField);
		}
	}
	if (validate && isNumber) 
	{		
		var checkOK = "0123456789";		
		var checkStr = theField.value;
		var allValid = true;
		var decPoints = 0;
		var allNum = "";
		if (fieldType == "$") 
		{
			checkOK = checkOK + "$.,"; 
			var newStr = "";
			for (i = 0; i < checkStr.length; i++) // 3-4-99 JPM This funct erases '$' or ',' from the string,  
			{									  // or anything after and including '.' .  	
				ch = checkStr.charAt(i);		  // But, if the field was cleared by this function,	
				if (ch == "$" || ch==",")		  // it didn't raise isErr, so fieldValid was set to 1,
				{								  // allowing a zero value to be posted to the form. 	
					continue;
				}
				else if (ch == ".") 
				{
					break;				
				}
				else 
				{
					newStr = newStr + ch;
				}
			}
			theField.value = newStr;
			checkStr = newStr;			
			if(checkStr.length == 0)		//  So I added this.
				isErr=true;	
		}
		for (i = 0;  i < checkStr.length;  i++)	
		{
			ch = checkStr.charAt(i);
			for (j = 0;  j < checkOK.length;  j++)
				if (ch == checkOK.charAt(j))
					break;
			if (j == checkOK.length) 
			{
				allValid = false;
				break;
			}
			allNum += ch; //3-4-99 JPM allNum is unreferenced.
		}
		if (!allValid)   
		{
			//errString = makeSentence (errString, "is not a number");
			errString += buildErrList(fieldDesc + " is not a number");
			focusCheck(theField);
			isErr = true;
		}
	} // end of isNumber
	
	// start of isDate
	if (validate && fieldType=='date')
	{
		if( !isValidDate(theField.value) )
		{
			//errString = makeSentence (errString, "is not a valid date");
			errString += buildErrList(fieldDesc + " is not a valid date");
			focusCheck(theField);
			isErr=true;
		}	
	} // end of isDate
	
	// Validates E-Mail suffix by checking that there is a '.' and at least two trailing characters.		
	if (validate && fieldType=='email')
	{
		var period = /[.]\w/;
		var ampersand = /[@]\w/;
		var returnval;
		if((returnval=theField.value.search(period))==-1)
		{
			//errString = makeSentence (errString, "is not a valid e-mail address");
			errString += buildErrList(fieldDesc + " is not a valid e-mail address");
			focusCheck(theField);
			isErr=true;
		}
		else if((returnval=theField.value.search(ampersand))==-1)
		{
			//errString = makeSentence (errString, "is not a valid e-mail address");
			errString += buildErrList(fieldDesc + " is not a valid e-mail address");
			focusCheck(theField);
			isErr=true;
		}	
	}
	
	if (isErr) 
	{
		//make background red
		if (document.all) {
			theField.style.backgroundColor = "#FF9900"
		} else {
			theField.bgcolor = "#FF9900"
		}
		//errString = "\n" + fieldDesc + " " + errString;
	
		if (theField.type != "hidden") {
			//	theField.focus();
		}
		return 1;
	} else {
		theField.style.backgroundColor = "#FFFFFF"
		errString = "";
		return 0;
	} 	
}

function buildErrMsg(errList)
{
	var retVal;
	
	//errList = "<ul>" + errList + "</ul>";
	retVal = "<br><b>You have made an invalid entry. Please check your information and try again.</b><br><br><font color=\"red\">" + errList + "</font>";
	
	return retVal;
}

function makeSentence (previous, newString) 
{
		if (previous != "") 
		{
			previous += ", and "; 
		}
		return (previous + newString);
}

function buildErrList(errMsg)
{
	return("<font class=\"bullet\">&middot;&nbsp;&nbsp;&nbsp;</font><font color=\"red\"><b>" + errMsg + "</b></font><br>");
}

function focusCheck(fieldObj)
{
	if (errFlag == false)
	{
		fieldObj.focus();
		errFlag = true;
	}
}