//form validation
/*
Functions for validating forms & contents 

validates for 
string, number, SSN, phone,date, zip, state

USE:  call onSubmit="return validate(this,htag)"; 
			first parameter: this - current form 
			second parameter false will write errors into the name of htag ie <div name="errorTable" id="errorTable"></div>
												  

FormFildValidation  add validate and validatetype to the form field to be validated
	<input type="text" name="Address" id="Address" value="" validate="true" validatetype="string" >
	<input type="text" name="Address" id="Address" value="" validate="true" validatetype="date" >
	<input type="text" name="Address" id="Address" value="" validate="true" validatetype="phone" >

	Note: Attribute 'id' is required  on all fields for firefox and other browser compatablility.

*/

stringLen = 1; // to validate string lengths
function validate(formName, display)
{
	var e,str ,validateType,skip;
	var errorIndex =0;
	var error= new Array();
	//document.getElementById('First_Name').style.backgroundColor="red";
	 
	var myRegExp = /_/ig; 
	
   for(i=0; i<formName.elements.length; i++)
   {
  		 e = formName.elements[i] ;
		 
		 //skip if the type is hidden
		 if(  e.type =="hidden" )
		 {   continue;
		 }
		
		 if(  e.getAttribute('validate') && (e.getAttribute('validate') == "true") )
		 { 
		 
			currentName =e.name.replace(myRegExp, ' ')
		    validateType = e.getAttribute('validatetype');
		 		
				switch(validateType)
				{
						case 'string' : if(  isString(e.value) && (e.value.length <= stringLen ) )
										{	error[errorIndex] =  currentName ;
											e.style.backgroundColor="#FF8888";
											 errorIndex++;
										}
										else if( isString(e.value) && (e.value.length >= 3 ) )
										{	e.style.backgroundColor="#FFF";
										}
										break;
										  
						case 'number' :if ( !isNumeric(e.value)  )
										{	error[errorIndex] =  currentName+ " is not a number ";
										
											 e.style.backgroundColor="#FF8888";
											  errorIndex++;
										}
										else if (  isNumeric(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										break;
										  
						case 'SSN': 	if( !isValidSSN(e.value) )
										{   error[errorIndex] =  currentName+ " invalid format xxx-xx-xxxx ";
										 
											 e.style.backgroundColor="#FF8888";
											  errorIndex++;
										}
										else if ( isValidSSN(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
										 
						case 'phone':   if( !isPhone(e.value) )
										{   
										  error[errorIndex] =  currentName+ " invalid format xxx-xxx-xxxx ";
										   e.style.backgroundColor="#FF8888";
										  errorIndex++;
										}
										else if ( isPhone(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
										 
						case 'date':   if( !isDate(e.value) )
										{   error[errorIndex] =  currentName+ " invalid date mm/dd/yyyy ";
											 e.style.backgroundColor="#FF8888";
											  errorIndex++;
										}
										else if ( isDate(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
						case 'zip':   if( !isZip(e.value) )
										{   error[errorIndex] =  currentName+ " invalid format xxxxx ";
										    e.style.backgroundColor="#FF8888";
											 errorIndex++;
										}
										else if ( isZip(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
					
						case 'email':   if( !isEmail(e.value) )
										{   error[errorIndex] =  currentName+ " invalid email address ";
											 e.style.backgroundColor="#FF8888";
											  errorIndex++;
										}
										else if ( isEmail(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
						case 'checkbox':  
										if( e.type == 'checkbox' && e.checked == false )
										{   error[errorIndex] =  currentName;
											 e.style.backgroundColor="#FF8888";
											  errorIndex++;
										}
										else if ( isEmail(e.value)  )
										{	 e.style.backgroundColor="#FFF";
										}
										 break;
										 
						case 'radio':  
										if( e.type == 'radio' )
										{  radioIsChecked =false;
												//look through all the radio elements with the same name
												//to see if any are checked
											  for(k=0; k<formName.elements.length; k++)
											  {
												   testElements = formName.elements[k] ;
												   	if(testElements.name == e.name && testElements.checked == true)
												  	{  radioIsChecked =true;
													   break;}
											 }
											 
											if (radioIsChecked == true)
											{
												e.style.backgroundColor="#FFF";
											}
											else
											{		error[errorIndex] =  currentName;
													e.style.backgroundColor="#FF8888";
													errorIndex++;
											}
												
											 
										}
										 
										 break;

						default:	if(e.value == "")
									{	 error[errorIndex] =  currentName+ " field cannot be empty ";
										 e.style.backgroundColor="#FF8888";
										 errorIndex++;
									}
									else 
									{	 e.style.backgroundColor="#FFF";
									}
							break;
				}//end switch
		 }//end if attribute
 
 		
	}//end for loop
	
 
var errorString ="";	
 	 
 
	if(document.getElementById(display) && errorIndex > 0)
	{
				
					for(var k=0;k < errorIndex;k++)
					{ 
						errorString = errorString+"<li class='error'>"+error[k]+"</li>";
					}
					 
					 
					document.getElementById("errorTable").className='visible';	 
					document.getElementById(display).innerHTML= "<span class='error'> Error(s) have occoured please fill in the Required Fields</span> <ul class='error'>"+errorString+"</ul>";
				 
				
				
	}
	else if( errorIndex > 0)
	{
		for(var k=0;k < errorIndex;k++)
		{
			errorString = errorString+"\n "+error[k];
		}
		
		alert(errorString);
	}
 

	// return  true;
return errorString.length <= 0 ? true:false ;
}//end validate



function isNumeric(sText)
{  var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;
     if(sText.length ==0)
   	  {
	  return false; 
	  }

 
      for (var j = 0; j< sText.length && IsNumber == true; j++) 
      {  Char = sText.charAt(j); 
         if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
}

function isValidSSN(value) { 
    var re = /^([0-6]\d{2}|7[0-6]\d|77[0-2])([ \-]?)(\d{2})\2(\d{4})$/; 
    if (!re.test(value)) { return false; } 
    var temp = value; 
    if (value.indexOf("-") != -1) { temp = (value.split("-")).join(""); } 
    if (value.indexOf(" ") != -1) { temp = (value.split(" ")).join(""); } 
    if (temp.substring(0, 3) == "000") { return false; } 
    if (temp.substring(3, 5) == "00") { return false; } 
    if (temp.substring(5, 9) == "0000") { return false; } 
    return true; 
}

function isPhone(value) { 
    var re = /^([0-9]\d{2})([ \-]?)(\d{3})\2(\d{4})$/; 
    if (!re.test(value)) { return false; } 
 
    var temp = value; 
    if (value.indexOf("-") != -1) { temp = (value.split("-")).join(""); } 
    if (value.indexOf(" ") != -1) { temp = (value.split(" ")).join(""); } 
    if (temp.substring(0, 3) == "000") { return false; } 
    if (temp.substring(3, 6) == "000") { return false; } 
    if (temp.substring(6, 10) == "0000") { return false; } 
    return true; 
}


/************************************************
DESCRIPTION: Validates that a string contains a 
  valid state abbreviation. 
  
 PARAMETERS:
   strValue - String to be tested for validity
   
RETURNS:
   True if valid, otherwise false.
*************************************************/

function isState (strValue ) {

var objRegExp = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i; 

  return objRegExp.test(strValue);
}

function isZip(value) { 
    var re = /(^\d{5}$)|(^\d{5}\-\d{4}$)/; 
    if (!re.test(value)) { return false; } 
 
    var temp = value; 
    if (temp.substring(0, 4) == "00000") { return false; } 
 
    return true; 
}

function isDate(value) { 
    var re = /^([0-9]\d)([\-\/]?)(\d{2})\2(\d{4})$/; 
    if (!re.test(value)) { return false; } 
 
    var temp = value; 
    if (value.indexOf("/") != -1) { temp = (value.split("/")).join(""); } 
    if (value.indexOf("-") != -1) { temp = (value.split("-")).join(""); } 
    if (temp.substring(0, 2) == "00" || temp.substring(0, 2) > "12") { return false; } 
    if (temp.substring(2, 4) == "00" || temp.substring(2, 4) > "31")  { return false; } 
    if (temp.substring(4, 8) == "0000") { return false; } 
    return true; 
}

function isEmail(value)
{	var re = /^([a-zA-Z0-9_\-])+([\.a-zA-Z0-9_\-])*@([a-zA-Z0-9_\-])+(\.[a-zA-Z0-9]+)+$/;
			
	if (!re.test(value)) { return false; } 
	
	return true;
}

function isBoolean(a) 
{ return typeof a == 'boolean';
}

function isString(a) 
{return typeof a == 'string';
}

function isUndefined(a) 
{return typeof a == 'undefined';
} 

