//Javascript to validate form fields

//global vars
errorString = "";
elementsToValidate = new Array();
//This function is for Netscape Compatibility
//function to set up the field parameters for specific fields
function initField(form,name,title,labelID,mask,flag,chain,required,minimum,maximum,allowchar){
	for(i=0;i<form.length;i++){
		if(form.elements[i].name==name){ 
			curField = eval(form.elements[i]);
			elementsToValidate.push(i);
			curField.title = title;
			curField.labelID = labelID;
			if (required != '')
				curField.REQUIRED = required;
			if (flag != '')
				curField.FLAG = flag;
			if(chain != '')
				curField.CHAIN = chain;	
			if(mask != '')
				curField.MASK = mask;  
			if(minimum != '')
				curField.MIN = minimum;
			if(maximum != '')
				curField.MAX = maximum;
			if(allowchar != '')
				curField.ALLOWCHAR = allowchar;		
		}
	}
}
//Function to split the fields into the various types that need to be validated.
function preParse(curForm)
{		
	//set up the arrays to handle the types of fields.
	validate = 0;
	curForm.requiredElements = new Array(); // fields that are required
	curForm.flags = new Array(); // fields that are "flags"
	curForm.chains = new Array();  // fields that are chains	 
	curForm.needValidData = new Array();   //fields that will require validation
	curForm.hasError = new Array(); //fields that have an error.
	//loop over the form fields and determine what validation needs to be done.
	for(var i=0;i<curForm.elements.length;i++)
	{  
		for(v=0;v<elementsToValidate.length;v++){
			if(elementsToValidate[v] == i){
				validate = 1;
				break;
			}
		}
		
		if(validate == 1){
			//if the field is required put it in the required array
			if(curForm.elements[i].REQUIRED != null)  
				curForm.requiredElements[curForm.requiredElements.length] = curForm.elements[i];
			
			//if the field is a "Chain" then hook it to the correct chain
			if(curForm.elements[i].CHAIN !=null)
			{	var curChain = curForm.elements[i].CHAIN;
				var found = 0;
				for(var chainCount=0; chainCount<curForm.chains.length;chainCount++)
				{	if(curForm.chains[chainCount][0]==curChain)
					{	curForm.chains[chainCount][curForm.chains[chainCount].length]=curForm.elements[i];
						found = 1;
						break;
					}
				}
				if(found!=1)
					curForm.chains[curForm.chains.length]=[curChain,curForm.elements[i]];
			}
			
			//If the field is a Flag type field then hook it to the right array.
			if(curForm.elements[i].FLAG !=null)
			{	var curFlag = curForm.elements[i].FLAG;
				var found = 0;
				for(var flagCount=0; flagCount<curForm.flags.length;flagCount++)
				{	if(curForm.flags[flagCount][0]==curFlag)
					{	curForm.flags[flagCount][curForm.flags[flagCount].length]=curForm.elements[i];
						found = 1;
						break;
					}
				}	 
				if(found!=1) 
				{
					curForm.flags[curForm.flags.length]=[curFlag,curForm.elements[i]];
				} 
			}	   
			
			//if the field will need to be validated
			if(curForm.elements[i].MASK != null)
			curForm.needValidData[curForm.needValidData.length] = curForm.elements[i];	
		validate = 0;
		}
	}	
} 

//function to make sure the form completely filled out.
function checkForm(curForm)
{	 
	var isComplete = true;
	//clear the error string
	errorString = "";
	isComplete = checkData(curForm) && isComplete;  
	isComplete = checkFlagFields(curForm) && isComplete;
	isComplete = checkChainFields(curForm) && isComplete;
	isComplete = checkRequiredFields(curForm) && isComplete;
	//change field's label color and alert user of errors.
	if(isComplete == false){
		alert("The following problems were discovered:\n\n" + errorString);
	}
	return isComplete;
}	 

//Check to be sure that the Chains are filled out properly (if one then all)
function checkChainFields(curForm)
{	var allOk = true;	
	for(var i=0;i<curForm.chains.length;i++)
	{	numValues = 0;
		for(var j=1;j<curForm.chains[i].length;j++)
		{	switch(curForm.chains[i][j].type)
			{	case 'checkbox': if(curForm.chains[i][j].checked!=0)numValues++;break;
				case 'radio': if(curForm.chains[i][j].checked!=0)numValues++;break;
				default: if(hasValue(curForm.chains[i][j]))numValues++;break;
			}			   
		}  
		if((numValues!=0)&(numValues!=curForm.chains[i].length-1))
		{	allOk = false;					
			errorString = errorString + curForm.chains[i][1].CHAIN + " (Either All or None)\n";
			curForm.hasError[curForm.hasError.length]=curForm.chains[i][1];
		}		 
	}			 
	return allOk;
}

//Check the validity of data in the form
function checkData(curForm)
{	var isOK = true;
	for(var i=0;i<curForm.needValidData.length;i++)
		if(!fieldValidate(curForm.needValidData[i])){
			curForm.hasError[curForm.hasError.length]=curForm.needValidData[i];
			isOK = false;
		}
	return isOK;
}

//make sure that at least one of each set of flags is filled out
function checkFlagFields(curForm)
{	var allOk = true;
	for(var i=0;i<curForm.flags.length;i++)
	{	var isOk = false;
		for(var j=1;j<curForm.flags[i].length;j++)
		{	switch(curForm.flags[i][j].type)
			{	case 'checkbox': if(curForm.flags[i][j].checked!=0)isOk = true;break;
				case 'radio': if(curForm.flags[i][j].checked!=0)isOk = true;break;
				default: if(hasValue(curForm.flags[i][j]))isOk = true;break;
			}
		}														
		
		if(!isOk)
		{	allOk = false;
			errorString = errorString + curForm.flags[i][1].FLAG + " (Required) \n";
			curForm.hasError[curForm.hasError.length]=curForm.flags[i][1];	
		}
	}	  
	return allOk;
}		   

//check to be sure that all required fields for the form are filled out.
function checkRequiredFields(curForm)
{	var allOk = true;
	for(var i=0;i<curForm.requiredElements.length;i++)
	{	if(!hasValue(curForm.requiredElements[i]))
		{	allOk = false;
			errorString = errorString + curForm.requiredElements[i].title + " (Required) \n";
			curForm.hasError[curForm.hasError.length]=curForm.requiredElements[i];
		}
	}
	return allOk;
}	

//function to determine if an element has a selected value
function hasValue(curElement)
{	//set up a reg expression for all whitespace
	var pattern = /^\s*$/;
	//if it's a select box do a bit more checking
	if(curElement.type == 'select-one')
	{	
		if (((curElement.selectedIndex!=-1)&&(curElement.options)) && ((curElement.options[curElement.selectedIndex].value == "") || (curElement.options[curElement.selectedIndex].value == "0")))
			return false;
		else
			return true;
	}	   	
	//otherwise just check to be sure the value is there
	else if((curElement.value == "")||(pattern.test(curElement.value)))
	return false;
	//default to returning true;
	return true;
}



