var errors='';
function matchEm(editCtrl, selectCtrl) {
  var EditSet = false;
  for (var i=0; i<selectCtrl.options.length; i++) {
    if (selectCtrl.selectedIndex<selectCtrl.options.length-1 && selectCtrl.selectedIndex==i) {
   	  editCtrl.value=selectCtrl.options[i].value; 
			EditSet = true;
		}
	}
	if (EditSet) {
	  return true;
	}
	else
	  return false;
}
function autoComp(editCtrl, selectCtrl) {
	var aList = new Array();
	var bList = new Array();
	var cnt = 0;
  var keyCnt = editCtrl.value.length;

	//Fill the a array with the select list values
	for (var i=0; i<selectCtrl.options.length; i++) {
	  aList[i] = selectCtrl.options[i].value; //text
	}
	
	//Check for a match from the textedit based on what's been typed
  for (var j=0; j<aList.length; j++) { 			
		var tmp=aList[j].toString().substr(0, keyCnt);
    if(editCtrl.value.toLowerCase() == tmp.toLowerCase()) {
		  bList[cnt] = tmp; //Add match to b array odd (avoids 2-dimensions) 
      bList[cnt+1] = j; //Add list pos to b array even
      cnt=cnt+2;
	  }
	}
	
	//No match
	if (bList == 0) { 
	alert('There is no such code.');
	  selectCtrl.selectedIndex=selectCtrl.options[0];
		editCtrl.value='';
	}
	
	//One match
	else if (bList.length == 2) {
		selectCtrl.selectedIndex=bList[1];
	}
	
	//More than one match, check all against the textedit so far (grabs the first in the list)
  else { 
	  for (var k=0, l=0; l<bList.length; l++, k+2) { 
	    if (editCtrl.value.toLowerCase() == bList[k].toString().substr(0,l).toLowerCase()) {
			  //alert(editCtrl.value.toLowerCase() + " = " + bList[k].toString().substr(0,l).toLowerCase());
			  selectCtrl.selectedIndex=bList[1];				  
			}  
		}
	}
	delete aList; 
	delete bList; 
}


//Assumes elements are assigned optional, numeric, etc. at submit -- and are named titlecase with _ for spaces
function isBlank(theElem) {
	for(var i=0;i<theElem.length;i++) {
		var c=theElem.charAt(i);
		if((c!='') && (c!='\n') && (c!='\t')) {
			return false;
		}
	}
	return true;
}


function isPhoneNumber(theElem,theName) { 
	 rePhoneNumber = new RegExp(/[0-9]$/);
	 if (!rePhoneNumber.test(theElem) || theElem.length<10) {
			errors+="\n*"+theName+" may only include numbers, and ( ) - separators, and must have area code.";
			return false;
	 }	
	 return true;
}

function isWebsite(theElem,theName) { 
	 if(theElem.length<12 || theElem.substring(0,7)!='http://') {
			errors+="\n*"+theName+" appears to be invalid. Please include http://____ ...";
			return false;
	 }	
	 return true;
}

function isEmail(theElem) {
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=theElem.match(emailPat);
	if (matchArray==null) {
		errors+="\n*Email address seems incorrect (check @ and .'s)";
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	if (user.match(userPat)==null) {
    errors+="\n*Email address username doesn't seem to be valid.";
    return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
	  for (var i=1;i<=4;i++) {
	    if (IPArray[i]>255) {
        errors+="\n*Email address destination IP address is invalid.";
				return false;
	    }
    }
	}
	var domainArray=domain.match(domainPat);
	if (domainArray==null) {
		errors+="\n*Email address domain name doesn't seem to be valid.";
    return false;
	}
	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;
	if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {
   	errors+="\n*Email address must end in a three-letter domain, or two letter country.";
   	return false;
	}
	if (len<2) {
   errors+="\n*Email address is missing a hostname";
   return false;
	}
	return true;
}

function checkForm(theForm) { 
	var empty=''; //holds required field list
	for(var i=0;i<theForm.elements.length;i++) {
		
			//Text website
			if(theForm.elements[i].name=='Website' && theForm.elements[i].value.length!=0) { 		
				if(!isWebsite(theForm.elements[i].value,theForm.elements[i].name)) {
					;
				}
			}
		
		//Select required - assuming element[0] is ''
		if(theForm.elements[i].type=='select-one' || theForm.elements[i].type=='select-multiple'){
			if(theForm.elements[i].options[0].selected && !theForm.elements[i].optional) {
				empty+="\n       "+theForm.elements[i].name.replace(/_/g," ");
			}
		}
		if(theForm.elements[i].type=='text' || theForm.elements[i].type=='textarea'){
			//Text and textarea required
			//alert(theForm.elements[i].name+' '+theForm.elements[i].optional);
			if((theForm.elements[i].value==null) || (theForm.elements[i].value=='') && (isBlank(theForm.elements[i].value)) && !theForm.elements[i].optional) {
				empty+="\n       "+theForm.elements[i].name.replace(/_/g," ");
			}
			//Text email
			if(theForm.elements[i].email && theForm.elements[i].value.length!=0) {			
				if(!isEmail(theForm.elements[i].value)) {
					;
				}
			}				
			//Text phone
			if(theForm.elements[i].phone && theForm.elements[i].value.length!=0) {			
				if(!isPhoneNumber(theForm.elements[i].value,theForm.elements[i].name)) {
					;
				}
			}				
			if(theForm.elements[i].value.length!=0 && (theForm.elements[i].numeric!=null || theForm.elements[i].min!=null || theForm.elements[i].max!=null)) {
				var testNum=parseFloat(theForm.elements[i].value);
				//Text numeric
				if(isNaN(testNum)) {
					errors+="\n*"+theForm.elements[i].name.replace(/_/g," ")+" must be numeric";
				}
				//Text in range
				if(theForm.elements[i].value<theForm.elements[i].min || theForm.elements[i].value>theForm.elements[i].max) {				
					errors+="\n*"+theForm.elements[i].name.replace(/_/g," ")+" must be between "+ theForm.elements[i].min + " and "+theForm.elements[i].max;
				}			
			}
		}			
	}
	
	//Radio required
	var radioList='';
	var curElem='';
	for(var i=0;i<theForm.elements.length;i++) { 
		if(curElem!=theForm.elements[i].name && theForm.elements[i].type=='radio' && !theForm.elements[i].optional) {
			radioList+='|'+theForm.elements[i].name;;
		}
		if(theForm.elements[i].type=='radio' && !theForm.elements[i].optional) { 
			if(theForm.elements[i].checked) {
				theForm.elements[i].isChecked=true;
				radioList+=',1';
			}	else {
				theForm.elements[i].isChecked=false; 
				radioList+=',0';
			}
		}	
		curElem=theForm.elements[i].name;
	}
	rl=radioList.split("|");
	for(var i=1;i<rl.length;i++) {
		if(rl[i].search('1')==-1) {
			empty+="\n       "+rl[i].substring(0,rl[i].indexOf(',')).replace(/_/g," "); //add field to list if no checks in group
		}
	}

	if(theForm.elements.Business_Type[1].checked || theForm.elements.Business_Type[3].checked || theForm.elements.Business_Type[6].checked) {
		var ctChecked=false;
		for(var i=0;i<theForm.elements.Certification_Type.length;i++) {
			if(theForm.elements.Certification_Type[i].checked) {
				ctChecked=true;
			}
		}
		if(!ctChecked) {
			errors+="\n* Certification Type required if you checked Business Type(s) 2, 4, or 7...')";
		}
	}

	msg='______________________________________________________________\n\n';
	msg+='The form cannot be submitted due to the error(s) listed below:\n';
	msg+='Please correct the problem(s) and re-submit.\n';
	msg+='______________________________________________________________\n';
	if(empty) {
		msg+='\n*The following fields are required:'
		+empty+'\n';
	}
	if(errors) {
		msg+=''+errors;
	}
	if(errors || empty) {
		alert(msg);
		errors='';
		empty='';
		return false;
	}
	return true;
}