//Function to validate entered Floating point number
function isFloat(n)
{
	var i;
	if(n=="" || CountSymbols(n,'.') > 1) return false;
	for(i=0;i<n.length;i++)
		if(isNaN(parseInt(n.charAt(i))) && n.charAt(i)!='.') return false;
	return true;
}

//Function to validate entered Integer
function isInt(n)
{
	var i;
	if(n=="") return false;
	for(i=0;i<n.length;i++)
		if(isNaN(parseInt(n.charAt(i)))) return false;
	return true;
}

function CountSymbols(s,c)
{
	var i,count=0;
	for(i=0;i<s.length;i++)
		if(s.charAt(i)==c) count++;
	return count;
}

function ParsePrice(p)
{
	var state=0,s,i=0,rp="",result="";
	while(i<=p.length && state>=0)
	{
		if(i==p.length) s='e';
		else s=p.charAt(i);
		switch(state)
		{
			case 0:
				if(isInt(s))
				{
					rp=rp + s;
					state=1;
				}
				else
				{
					if(s=='.')
					{
						rp=rp + s;
						state=2;
					}
					else
					{
						if(s=='e') state=-2;
						else state=-1;
					}
				}
				break;

			case 1:
				if(isInt(s)) rp=rp + s;
				else
				{
					if(s==',') {}
					else
					{
						if(s=='.')
						{
							rp=rp + s;
							state=2;
						}
						else
						{
							if(s=='e') state=-2;
							else state=-1;
						}
					}
				}
				break;

			case 2:
				if(isInt(s)) rp=rp + s;
				else
				{
					if(s=='e') state=-2;
					else state=-1;
				}
				break;
		}
		i++;
	}
	if(state==-2) result=rp;
	return result;
}

function ParsePhone(p)
{
	var result="";
	var state,s,i,rp="";
	state=0;
	i=0;
	while(i<p.length+1 && state>=0)
	{
		if(i==p.length)
			s="e";
		else
			s=p.charAt(i);
		switch(state)
		{
			case 0:
				if(!isNaN(parseInt(s)))
				{
					rp="(" + s;
					state=1;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 1:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=2;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 2:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=3;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 3:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + ") " + s;
					state=4;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 4:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=5;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 5:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=6;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 6:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + "-" + s;
					state=7;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 7:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=8;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 8:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=9;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
			case 9:
				if(!isNaN(parseInt(s)))
				{
					rp=rp + s;
					state=-2;
				}
				else
				{
					if(s=="e")
						state=-1;
				}
				break;
		}
		i=i+1;
	}
	if(state==-2)
		result=rp;

	return result;
}

//Function to validate entered Date
function isDate(d)
{
	var n;
	if(d.length!=10) return false;
	if(d.charAt(2)!='/' && d.charAt(2)!='-' || d.charAt(5)=='/' && d.charAt(5)=='-') return false;
	n=d.substr(0,2);
	if(!isInt(n)) return false;
	if(n<1 || n>12) return false;
	n=d.substr(3,2);
	if(!isInt(n)) return false;
	if(n<1 || n>31) return false;
	n=d.substr(6,4);
	if(!isInt(n)) return false;
	if(n<1900) return false;
	return true;  
}

//Function to validate entered Email
function isEmail(e)
{
  if (e.length>=3 && CountSymbols(e,'@') == 1) return true;
  return false;
}

//Function to validate entered Money amount
function isMoney(m,fm)
{
	fm=ParsePrice(m);
	if(fm=="") return false;
	return true;
}

//Function to validate entered Phone
function isPhone(p,fp)
{
	fp=ParsePhone(p);
	if(fp=="") return false;
	return true;
}

//Function to validate entered URL
function isURL(u)
{
  if (u.length<10 || u=="http://") return false;
  return true;
}

//Function to validate entered SSN
function isSSN(s)
{
	var i, c=0;
	if(s=="") return false;
	for(i=0;i<s.length;i++)
		if(!isNaN(parseInt(s.charAt(i)))) c++;
	if(c!=9) return false;
	return true;
}

//Function to check if at least one element of radio/checkbox is checked
function scanElements(f,n)
//Precondition: f - form object, n - radio/checkbox field name
//Postcondition: true if at least one element is checked, false otherwise
{
	var i,l,ok=false;
	eval('l=f.'+n+'.length')
	for(i=0;i<l;i++)
	    eval('if (f.'+n+'['+i+'].checked) ok=true');
	return ok;
}

//Section of the form validation function which takes care of multileveled conditions

counter=0;								// global form elements counter
dataOK=true;							// global validation variable
arrCheckedYes = new Array();			// leveled array of Yes
arrCheckedNo = new Array();				// leveled array of No
arrCheckedMark = new Array();			// leveled array of Mark

function checkData(level,letter)
//Precondition: level - level of form recursion, letter - condition character
//Postcondition: swapped invalid entry images, dataOK
{
	eval('var f=document.'+formName);
    var i,Name,Value,FormattedValue,Length,Character;
	var RadioName="",CheckBoxName="";						// variables to save radio/checkbox Names
	var bExpr,bRadioExpr,bCheckBoxExpr;						// boolean validation Expressions
	var bOther;

	if(level==0)
	{
		counter=0;
		dataOK=true;
	}

	while(counter<f.elements.length && counter<arrType.length)
	{
		bExpr=false;										// reset Expression and Other flag
		bOther=false;

		Name=f.elements[counter].name;						// store form element name
		Value=f.elements[counter].value;					// value
		Length=Name.length;									// name length
		Character=arrType[counter].charAt(level);			// key character

		if(level>0)
			if(arrType[counter].charAt(level-1)!=letter) return;

		if(arrMandatory[counter]=="Yes")
		{
			switch(Character)									// check key character
			{
/*text*/		case 't':
					bExpr=(Value!="");
					break;

/*URL*/			case 'u':
					bExpr=isURL(Value);
					break;

/*date*/		case 'd':
					bExpr=isDate(Value);
					break;

/*money*/		case 'm':
//					bExpr=isMoney(Value,FormattedValue);
					FormattedValue=ParsePrice(Value);
					if(FormattedValue=="") bExpr=false;
					else bExpr=true;
					if(bExpr) f.elements[counter].value=FormattedValue;
					break;

/*phone*/		case 'p':
//					bExpr=isPhone(Value,FormattedValue);
					FormattedValue=ParsePhone(Value);
					if(FormattedValue=="") bExpr=false;
					else bExpr=true;
					if(bExpr) f.elements[counter].value=FormattedValue;
					break;

/*SSN*/			case 'S':
					bExpr=isSSN(Value);
					break;

/*select*/		case 's':
					if( arrType[counter].charAt(level+1) == 'e' )
					{				
						if( arrType[counter].charAt(level+1) == 'm' )					// check for multiple
							bExpr=(f.elements[i].selectedIndex!=-1);
		  				else
							bExpr=(f.elements[i].options[f.elements[i].selectedIndex].value!="");
					}
					break;

/*radio*/		case 'r':
			 		if(Name!=RadioName)											// if new radio set
					{
						RadioName=Name;											//save Name
						eval('arrCheckedYes['+level+']=f.'+Name+'[0].checked');	//check current Name
						eval('arrCheckedNo['+level+']=f.'+Name+'[1].checked');	//check next Name
						bExpr=scanElements(f,Name);								//get Expression
						bRadioExpr = bExpr;										//save Expression
					}
					else														// if same radio
					{
						bExpr = bRadioExpr;										//restore Expression
					}
					arrCheckedMark[level] = f.elements[counter].checked;		// update leveled Mark array
					break;

/*checkbox*/	 case 'c': 
			  		if(Name!=CheckBoxName)
		  			{
						CheckBoxName=Name;
						if( arrType[counter].charAt(level+1)=='_')				// check for mandatiory
							bExpr=scanElements(f,Name);
						else
							bExpr=true;
						bCheckBoxExpr=bExpr;
					}
					else
					{
						bExpr=bCheckBoxExpr;
					}
					arrCheckedMark[level] = f.elements[counter].checked;
					break;

/*condition character*/
				case 'y':
				case 'n':
				case 'h':
				 	checkData(level+1, arrType[counter].charAt(level));
					continue;
					break;

/*not a key character*/
				default:
					bOther=true;
					bExpr=true;
					break;	
			}

			if(!bOther)													// if a key character
			{
				for(i=level-1; i>=0; i--)								//loop through leveled checked arrays
				{														//updating Expression
					switch(arrType[counter].charAt(i))
					{
						case "y" :
							bExpr=( !arrCheckedYes[i] || (arrCheckedYes[i] && bExpr) );
							break;
						case "n" :
							bExpr=( !arrCheckedNo[i] || (arrCheckedNo[i] && bExpr) );
							break;
						case "h" :
							bExpr=( !arrCheckedMark[i] || (arrCheckedMark[i] && bExpr) );
							break;
					}
				}
				if(bExpr)
					MM_swapImage(Name+'Image','','../images/nothing.gif',1);
				else
				{
					MM_swapImage(Name+'Image','','../images/invalid.gif',1);
					if(dataOK) tagURL='#'+Name+'Anchor';
					dataOK=false;
				}
			}
		}
			
		counter++;
	}

	if(level==0)
	{
		if(!dataOK) window.location=unescape(tagURL);
	}
}


//Function to fill the form with existing info

counter=0;			//form elements counter
index=0;			//filling arrays index

function formFill()
{
	var i, j, level;
	var Name, Type, Value, Length;
	var Character;
	var values;
	eval('var f=document.'+formName);

	while(counter<f.elements.length && index<arrType.length)
	{
		Name=f.elements[counter].name;						// store form element name
		Value=f.elements[counter].value;					// value
		Type=f.elements[counter].type;
		level=0;
		switch(arrType[index])
		{
			case 'checkbox':
			case 'radio':
				values=arrValue[index].split(', ');				// split up 
				j=0;
				for(i=counter;i<f.elements.length && j<values.length;i++)
				{
					if(f.elements[i].name==Name && f.elements[i].value==values[j])
					{
						f.elements[i].checked=true;
						j++;
					}
				}
				break;

			case 'select':
				values=arrValue[index].split(', ');
				j=0;
				for(i=0;i<f.elements[counter].options.length && j<values.length;i++)
				{
					if(f.elements[counter].options[i].value==values[j])
					{
						f.elements[counter].options[i].selected=true;
						j++;
					}
				}
				break;

			case 'submit':
			case 'hidden':
			case 'image':
				break;

			default:
				f.elements[counter].value=arrValue[index];
				break;

		}//end of switch

		index++;

		counter++;
	}//end of for loop
}//end of function
