//<!--
//Written by Ivan Franklin

function form_array()	//object
{
	this.element=new Array();	//stores function calls
	this.name=new Array();	//stores field names
}	
function ValidField(value,requiredfield,min_chars,max_chars,min_words,max_words,typerequired)	//all arguments require a '' to default to inactive
{
	var invalid_flag=false;		//false indicates valid data
	var val=value.value;		//arg element to element value var
	var r_field=requiredfield;	//arg true for not '' or ' ' value; arg 'list' for valid selection from select list; arg int for number of radio buttons to be validated; all to var
	var mn_chars=min_chars;		//arg min characters to var
	var mx_chars=max_chars;		//arg max characters to var
	var mn_words=min_words;		//arg min words to var
	var mx_words=max_words;		//arg max words to var
	var type=typerequired;		//arg 1 for numeric data; arg 2 for date data; all to var
	
	if(((val=='')||(val==' '))&&(r_field==true))	//check value if field is required (if arg value=true)
	{
		invalid_flag="value";
	}
	if(r_field=="list")								//check if item from list is selected (if arg value="list")
	{
		invalid_flag=list_select(value);
	}
	if(isNaN(parseInt(r_field))==false)				//check if a radio button is selected (if arg value=int)
	{
		invalid_flag=radio_select(value, r_field);
	}
	if(((mn_chars)&&(invalid_flag==false)&&(r_field==true))||((r_field==false)&&(mn_chars)&&(invalid_flag==false)&&(val)))	//check value for minimum number of characters if specified (if arg min_chars=int) or check value for minimum number of characters if not required but a minimum number of characters argument is specified.
	{
		invalid_flag=minimum_characters(val,mn_chars);
	}
	if((mx_chars)&&(invalid_flag==false))			//check value for maximum number of characters if specified (if arg max_chars=int)
	{
		invalid_flag=maximum_characters(val,mx_chars);
	}
	if(((mn_words)&&(invalid_flag==false)&&(r_field==true))||((r_field==false)&&(mn_words)&&(invalid_flag==false)&&(val)))	//check value for minimum number of words if specified (if arg min_words=int) or check value for minimum number of words if not required but a minimum number of words argument is specified.
	{	
		invalid_flag=minimum_words(val,mn_words);	
	}
	if((mx_words)&&(invalid_flag==false))			//check value for maximum number of words if specified (if arg min_words=int)
	{		
		invalid_flag=maximum_words(val,mx_words);
	}
	if((type)&&(invalid_flag==false))				//check value for valid type (if arg typerequired=1 [numeric] or 2 [date])
	{
		invalid_flag=type_required(val,type);
	}
	return invalid_flag;		
}
function list_select(value)
{
	if(value.selectedIndex == 0)	
	{
		return "value";
	} 
	else
	{
		return false;
	}
}
function radio_select(value, r_field)
{
	var x=0;
	var check_flag=false;
	
	for(x=0;x<r_field;++x)
	{
		if (value[x].checked == true)
		{
			check_flag=true;
			break;
		}
	}
	if(check_flag==false)
	{
		return "value";
	}
	else
	{
		return false;
	}
}
function minimum_characters(val,mn_chars)
{
	if(isNaN(mn_chars)==false)	//if min_chars is being passed a number as an argument
	{
		var val_string = new String(val);
		
		if(val_string.length<mn_chars)
		{
			return "min_chars";
		}
		else
		{
			return false;
		}
	}	
}
function maximum_characters(val,mx_chars)
{
	if(isNaN(mx_chars)==false)	//if max_chars is being passed a number as an argument
	{
		var val_string = new String(val);
		
		if(val_string.length>mx_chars)
		{
			return "max_chars";
		}
		else
		{
			return false;
		}
	}	
}
function minimum_words(val,mn_words)
{
	if(isNaN(mn_words)==false)
	{
		var x=0;
		var word_count=1;
		var val_string = new String(val);
		
		for(x=1;x<val_string.length;++x)
		{
			if((val_string.charAt(x)==' ')&&(val_string.charAt(x-1)!=' ')&&(val_string.charAt(x+1)!=''))	//count spaces as words, consecutive spaces count as one word
			{
				word_count++;
			}
		}
		if(word_count<mn_words)
		{
			return "min_words";
		}
		else
		{
			return false;
		}
	}
}
function maximum_words(val,mx_words)
{
	if(isNaN(mx_words)==false)
	{
		var x=0;
		var word_count=1;
		var val_string = new String(val);
		
		for(x=1;x<val_string.length;++x)
		{
			if((val_string.charAt(x)==' ')&&(val_string.charAt(x-1)!=' ')&&(val_string.charAt(x+1)!=''))	//count spaces as words, consecutive spaces count as one word
			{
				word_count++;
			}
		}
		if(word_count>mx_words)
		{
			return "max_words";
		}
		else
		{
			return false;
		}
	}
}
function type_required(val,type)
{
	if(type==1)	//check for valid numeric data
	{
		var x=0;
		var val_string = new String(val);
			
		for(x=0;x<=val_string.length;++x)
		{
			if((isNaN(val_string.charAt(x)))&&(val_string.charAt(x)!='.'))	//look for non-numeric chars
			{
				return "type";
				break;
			}
		}
		if(x==val_string.length)
		{
			return false;
		}
	}
	if(type==2)	//check for valid date: mm/dd/yy, mm/dd/yyyy, m-d-yy...
	{
		var x=0;
		var num_count=0;
		var separator_count=0;
		var month=0;
		var day=0;
		var digit_multiplier=1;
		var separator_pos=new Array();
		var val_string = new String(val);
			
		if((6>val_string.length)||(val_string.length>10))	//this is not year 10000 compliant in mm/dd/yyyyy format
		{
			return "type";
		}
		else
		{
			for(x=0;x<val_string.length;++x)
			{
				if(isNaN(val_string.charAt(x))==false)
				{
					num_count++;
					if(isNaN(val_string.charAt(x+1))==false)
					{
						digit_multiplier=10;
					}
					else
					{
						digit_multiplier=1;
					}
					if(separator_count==0)
					{							
						month+=digit_multiplier*(val_string.charAt(x));
					}
					if(separator_count==1)
					{
						day+=digit_multiplier*(val_string.charAt(x));
					}
				}
				else
				{
					if((val_string.charAt(x)=='/')||(val_string.charAt(x)=='-')) //check for separator character
					{
						separator_pos[separator_count]=x;
						separator_count++;	
					}
					else	//check for invalid character
					{
						return "type";
						break;
					}
				}
			}
			month=parseInt(month);
			day=parseInt(day);
			if((1>month)||(month>12))
			{
				return "type";	
			}
			if((1>day)||(day>31))
			{
				return "type";	
			}
			if((separator_pos[0]!=1)&&(separator_pos[0]!=2))
			{
				return "type";			
			}
			if((separator_pos[1]!=separator_pos[0]+2)&&(separator_pos[1]!=separator_pos[0]+3))
			{
				return "type";			
			}
			if((4>num_count)||(num_count>8))
			{
				return "type";
			}
			if(separator_count!=2)
			{
				return "type";
			}
		}
	}
}
function validation_routine(frm_arr, frm)
{ 
	var error_string='';
	var case_string='';
	var plural=0;
	var x=0;
	
	for(x=0;x<frm_arr.element.length;++x)
	{
		case_string='';
		switch(frm_arr.element[x])	//call to ValidField(...) inside switch() function call
		{
			case "value" :
				case_string=" is empty.\n"
				break;
			case "min_chars" :
				case_string=" has too few characters.\n"
				break;
			case "max_chars" :
				case_string=" has too many characters.\n"
				break;
			case "min_words" :
				case_string=" has too few words.\n"
				break;
			case "max_words" :
				case_string=" has too many words.\n"
				break;
			case "type" :
				case_string=" is the wrong data type.\n"
				break;
		}
		if(case_string!='')
		{
			error_string+=frm_arr.name[x] + case_string;	//user friendly name--form_name
			plural++;
		}
	}
	if(error_string=='')
	{
		return true;
	}
	else
	{
		if(plural!=1)
		{
			plural='s';
		}
		else
		{
			plural='';
		}
		alert("Your submission has the following error" + plural + ":\n\n" + error_string);
		return false;
	}
}
//-->