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(s)
{
	var j=s.length-1,j1=3,s1="";
	while(j>=0)
	{
		switch(j1)
		{
			case 3: if(isInt(s.charAt(j))&&isInt(s.charAt(j-1))&&isInt(s.charAt(j-2))&&isInt(s.charAt(j-3)))
					{
					    s1=s.substring(j-3,j+1);
						j1=2;
						j=j-3;
					}
					break;
			case 2: if(isInt(s.charAt(j))&&isInt(s.charAt(j-1))&&isInt(s.charAt(j-2)))
					{
						s1=s.substring(j-2,j+1)+'-'+s1;
					  	j1=1;
						j=j-2;
					}
					break;
			case 1: if(isInt(s.charAt(j))&&isInt(s.charAt(j-1))&&isInt(s.charAt(j-2)))
					{
						s1=s.substring(j-2,j+1)+') '+s1;
						j1=0;
					}
					break;
		}
		j=j-1;
	}
	s1="("+s1;
	return s1;
}

//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 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 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 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;
	
	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;

		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);
				if(bExpr) f.elements[counter].value=FormattedValue;
				break;

/*phone*/	case 'p':
				bExpr=isPhone(Value,FormattedValue);
				if(bExpr) f.elements[counter].value=FormattedValue;
				break;

/*select*/	case 's':
				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','','http://projects.metrostarsystems.com/{3D412E46-EE10-11D4-AF15-009027AFC2B6}/images/forms/nothing.gif',1);
			else
			{
				MM_swapImage(Name+'Image','','http://projects.metrostarsystems.com/{3D412E46-EE10-11D4-AF15-009027AFC2B6}/images/forms/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;
		do
		{
			Character=arrType[index].charAt(level);
			level++;
		} while(Character=='y' || Character=='n' || Character=='h');
		if(Type!="hidden" && Type!="submit" && Type!="reset" && Type!="button" && Type!="image")
		{
			switch(Character)
			{
				case 'c'://checkbox
				case 'r':
					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 's'://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;

				default://other
					f.elements[counter].value=arrValue[index];
					break;

			}//end of switch

			index++;
		}

		counter++;
	}//end of for loop
}//end of function
