/*****
 * validation varieties:
 *****
 * validation initiated with following call in <FORM> tag:
 *   onsubmit="form_validate('formname','fieldname1,fieldname2','checktype1,checktype2','alertmsg1,alertmsg2')"
 * where formname is the value of the <FORM> tag's declared name
 * where the fieldname array corresponds to the actual field names to be validated
 * where the checktype array corresponds to the field names array in reference, and to the values of validation varieties
 * and where the alerttext array corresponds to both above arrays in reference, and to text descriptions for use in error alerts
 *****
 *  1 - test char string against null value
 *        expects fieldname, 1, string for alert text (i.e. "Username")
 *  2 - test string length against passed char lengths -- min and max
 *        expects fieldname, 2|lengthA|lengthB, alertmsgID (i.e. "2|4|8" for a string between 4 and 8 characters long)
 *  3 - test string match against two passed fields
 *        expects fieldnameA|fieldnameB, 3, alertmsgID (unless using non-custom alertmsg, then pass alerttextA|alerttextB)
 *  4 - test for selected option
 *        expects fieldname, 4, string for alert text (i.e. "Username") 
 *  5 - test for radio or checkbox selection
 *        expects fieldname, 5, alertmsgID
 *  6 - test email for format
 *        expects fieldname, 6, alertmsgID
 *  7 - test date for format (mm/dd/yyyy) and valid dateparts and optional test for date within future range
 *        expects fieldname, 7|dayrange, alertmsgID (i.e. "7|30" checks for a date no more than 30 days in the future)
 *  8 - test for numeric chars and against passed char length -- strips and returns only numeric string
 *        expects fieldname, 8|length, string for alert text (i.e. "Username") (i.e. "8|9" checks for a numeric string 9 characters long)
 *  9 - test for non-alphanumeric chars and against passed char lengths -- strips and returns alphanumeric string while testing against min and max lengths
 *        expects fieldname, 9|length1|length2, alertmsgID (i.e. "9|4|8" checks for a string between 4 and characters long)
 * 10 - test phone number for format (xxx-xxx-xxxx) -- strips and returns numeric string with phone number mask
 *        expects fieldname, 10, alertmsgID
 * 11 - subvalues check
 *
 *  13 - test url for format
 *        expects fieldname, 13, alertmsgID
 *  14 - test url or email for format
 *        expects fieldname, 14, alertmsgID
 *****
 * for forms located within a netscape layer, reference the formname as "layername.document.formname"
******/ 

// for lack of easier means to create site specific alert messages, use this array
// non-customized messages are commented out in validation section just in case
var alertmsg=new Array();
    alertmsg[0]="\nPlease make sure you have filled out the PASSEDNAME field"; // hardcoded msg
    alertmsg[1]="\nYour member ID is 9 digits long.\nIf you're not sure, please refer to the ID number we sent you in the mail.";
    alertmsg[2]="\nYour password must be at least 4 characters long, but no more than 16 characters.";
    alertmsg[3]="\nThe passwords you typed do not match.\nPlease type them again.\nNote that your password is Case Sensitive.";
    alertmsg[4]="\nDates should be filled out in this format: mm/dd/yyyy\n(Examples: 01/05/1965 or 11/22/2000)";
    alertmsg[5]="\nPlease enter a valid 5-digit zip code.";
    alertmsg[6]="\nWe're sorry, but the effective date cannot be more than 30 days from today.";
    alertmsg[7]="\nPlease select your option by clicking on a circled button.";
    alertmsg[8]="\nPlease check at least one of the boxes.";
    alertmsg[9]="\nYour email address is not valid.";
    alertmsg[10]="\nYour phone number must be in this format: 555-555-1212";
    alertmsg[11]="\nPlease select an option from the PASSEDNAME drop-down menu."; // hardcoded msg
    alertmsg[12]="\nPlease enter a 4-digit year.";
    alertmsg[13]="\nYour member name must be at least 4 characters long, but no more than 16 characters.";    
	alertmsg[14]="\nPlease enter a 16-digit credit card number.";
	alertmsg[15]="\nPlease enter a 3-digit area code.";	
	alertmsg[16]="\nPlease limit the length of your Company Description to 2000 characters.";	
	alertmsg[17]="\nPlease limit the length of your Terms and Conditions to 2000 characters.";
	alertmsg[18]="\nPlease make a selection for each question";
   	alertmsg[19]="\nYour fax number must be in this format: 555-555-1212";
	alertmsg[20]="\nPlease enter a priority between 1 and 999.";	
	alertmsg[21]="\nPlease enter a state abbreviation. Leave blank for international addresses.";	
	alertmsg[22]="\nThe title can not be longer than 512 characters.";	
	alertmsg[23]="\nPlease enable or disable automatic publishing.";	
	alertmsg[24]="\nThe description can not be longer than 4000 characters.";	 
	alertmsg[25]="\nThe keywords can not contain more than 4000 characters.";	 
	alertmsg[26]="\nPlease enter a valid URL/Email address";	 
	alertmsg[27]="\nPlease enter a valid URL";	 
	alertmsg[28]="\nPlease enter a number with 2 or 3 digits";	 
	alertmsg[29]="\nThe title can not be longer than 55 characters.";	
	alertmsg[30]="\nPlease select a premium content package.";
	alertmsg[31]="\nThe Email Addresses you typed do not match.\nPlease type them again.";	
	alertmsg[32]="\nThe RSS Channel Title  can not be longer than 100 characters.";	
	alertmsg[33]="\nThe RSS Channel Description can not be longer than 500 characters.";	
	alertmsg[34]="\nPlease enter a number with 1 or 2 digits";	 
	alertmsg[35]="\nPlease select a HTML template";
	alertmsg[36]="\nBlog comment cannot exceed 2,000 characters.";
	alertmsg[37]="\nState Code must be exactly two characters.";
	alertmsg[38]="\nPlease enter a number less than or equal to 4 digits";
	alertmsg[39]="\nThe message field cannot exceed 250 characters.";
	alertmsg[40]="\nThe message field cannot exceed 2000 characters.";
	alertmsg[41]="\nThe Bio field cannot exceed 1024 characters.";
	alertmsg[42]="\nThe Account Creation Info field cannot exceed 1500 characters.";
	alertmsg[43]="\nThe Icopyright Publication Id field cannot exceed 10 characters.";
	alertmsg[44]="\nThe message field cannot exceed 750 characters.";
	alertmsg[45]="\nThe message field cannot exceed 4000 characters.";
	alertmsg[46]="\nThe message field cannot exceed 500 characters.";
	alertmsg[47]="\nThe message field cannot exceed 1500 characters.";
	alertmsg[48]="\nThe message field cannot exceed 1024 characters.";
	alertmsg[49]="\nThe introduction field cannot exceed 3000 characters.";
	
// validation variables
var falert="",ffocus="",fchk=0;

// validation shell function
function form_validate(fname,vnamearr,vtypearr,vtextarr){

//start function to prevent double submission
  if (submitted)
	  {
	    //return false if form has already been submitted
		return false;
	  }
	  else
	  {
		submitted = true;
	  }
//end function to prevent double submission

//alert('the function is being called');
  if (parseInt(navigator.appVersion)>=4){
    var vname=vnamearr.split(",");
    var vtype=vtypearr.split(",");
    var vtext=vtextarr.split(",");
    for (v=0;v<vname.length;v++){
      fchk+=field_validate(fname,vname[v],vtype[v],vtext[v]);
    }
    if (fchk){
      falert+="\n";
      if (falert && navigator.userAgent.toLowerCase().indexOf("mac")!=-1 && navigator.userAgent.toLowerCase().indexOf("win")==-1 && navigator.userAgent.toLowerCase().indexOf("msie")==-1){
        if (falert.length>255){
          falert=falert.substr(0,255);
          falert=falert.substring(0,falert.lastIndexOf("\n\n"));
        }
      }
	  alert(falert);
      if (ffocus){
        document[fname][ffocus].focus();
      }
      falert="";ffocus="";fchk=0;
      submitted = false;
	  return false;
    }else{
//      alert('Hey! NOW IT'S TIME TO SUBMIT '+fname);
//we're letting the page submit...
	  //document.forms[fname].submit();


//      return true;
    }
  }else{
    return true;
  }
}

// specific field validation function
function field_validate(fname,iname,itype,itext){	
  var i=0,thisv="",thisvarr=new Array(),thisexp="",inamearr=new Array(),itypearr=new Array(),itextarr=new Array();
// 1 - null text string
  if (itype==1 && trim(document[fname][iname].value)==""){
    falert+="Please make sure you have filled out the "+itext+" field.\n";
    !ffocus.length ? ffocus=iname : 0;
    return 1;
// 2 - string length
  }else if (itype.substr(0,1)=="2"){
    itypearr[1]=itype.substring(itype.indexOf("|")+1,itype.lastIndexOf("|"));
    itypearr[2]=itype.substring(itype.lastIndexOf("|")+1,itype.length);
    if (document[fname][iname].value.length<itypearr[1] || document[fname][iname].value.length>itypearr[2]){
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter a value between "+itypearr[1]+" and "+itypearr[2]+" characters long for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }else{
      return 0;
    }
// 3 - string match
  }else if (itype==3){
    inamearr[0]=iname.substring(0,iname.indexOf("|"));
    inamearr[1]=iname.substring(iname.lastIndexOf("|")+1,iname.length);
//    itextarr[0]=itext.substring(0,itext.indexOf("|"));
//    itextarr[1]=itext.substring(itext.lastIndexOf("|")+1,itext.length);
    if (document[fname][inamearr[0]].value=="" || (document[fname][inamearr[0]].value!=document[fname][inamearr[1]].value)){
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter matching values for "+itextarr[0]+" and "+itextarr[1]+".\n";
      !ffocus.length ? ffocus=inamearr[0] : 0;
      return 1;
    }else{
      return 0;
    }
// 4 - select option -- checks against null value, _not_ just against having a selection made
  }else if (itype==4 && document[fname][iname].options[document[fname][iname].selectedIndex].value==""){
    falert+="Please select an option from the "+itext+" drop-down menu.\n";
    !ffocus.length ? ffocus=iname : 0;
    return 1;
// 5 - radio or checkbox -- at least one in array checked
  }else if (itype==5){
    i=0;
    while (i<document[fname][iname].length && !document[fname][iname][i].checked){
      i++;
    }
    if (i==document[fname][iname].length){
	  falert+=alertmsg[itext]+"\n";
//      falert+="Please select an option for "+itext+".\n";
      return 1;
    }else{
      return 0;
    }

// 6 - email -- must be in format "string@charstring.2or3chars" (i.e. minimum of "x@(x.)xx.xx")
  }else if (itype==6){
    //    thisexp=new RegExp("^.+\@\(\\[?)[0-9a-z\-]{2,}.([0-9a-z\-.]{2,})(\\]?)$","i");//old expression  	
	thisexp=new RegExp("^.+\@\(\\[?)([0-9a-z\-]+\\.)?[0-9a-z\-]{2,}\\.([0-9a-z\-.]{2,})(\\]?)$","i");
  
    
    if (document[fname][iname].value=="")
	return 0;
    if (!thisexp.test(document[fname][iname].value)){
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter a value for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }else{
      return 0;
    }
    
// 16 - string length
  }else if (itype.substr(0,2)=="16"){
    itypearr[1]=itype.substring(itype.indexOf("|")+1,itype.lastIndexOf("|"));
    itypearr[2]=itype.substring(itype.lastIndexOf("|")+1,itype.length);
    if (document[fname][iname].value.length<itypearr[1] || document[fname][iname].value.length>itypearr[2]){
      //falert+=alertmsg[itext]+"\n";
      falert+="Please enter a value between "+itypearr[1]+" and "+itypearr[2]+" characters long for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }else{
      return 0;
    }


  // 13 - url -- must be in format "http://" 
  }else if (itype==13){
	thisexp=new RegExp("^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]"+
		"+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1"+
	"}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9"+
	"]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1"+
	"}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1"+
	"-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-"+
	"zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_"+
	"\-]*)*$");
	    
    if (document[fname][iname].value=="")
	return 0;
    if (!thisexp.test(document[fname][iname].value)){
	  falert+=alertmsg[itext]+"\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }else{
      return 0;
	}    
  
// 14 - email or url(http or https)
  }else if (itype==14){
    emailExp=new RegExp("^.+\@\(\\[?)[0-9a-z\-]{2,}.([0-9a-z.]{2,})(\\]?)$","i");
	urlExp=new RegExp("^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]"+
		"+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1"+
	"}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9"+
	"]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1"+
	"}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1"+
	"-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.[a-"+
	"zA-Z]{2,4})(\:[0-9]+)?(/[^/][a-zA-Z0-9\.\,\?\'\\/\+&%\$#\=~_"+
	"\-]*)*$");
	
    if (document[fname][iname].value=="")
	return 0;
    if (!emailExp.test(document[fname][iname].value) && !urlExp.test(document[fname][iname].value)){
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter a value for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }else{
      return 0;
    }
    
  




// 7 - date formatting and optional date range
  }else if (itype.substr(0,1)=="7"){
    if (itype.indexOf("|")!=-1){
      itypearr[1]=itype.substring(itype.lastIndexOf("|")+1,itype.length);
    }
    if (document[fname][iname].value!=""){
      thisexp=new RegExp("[a-z]","gi");
      thisv=document[fname][iname].value.replace(thisexp,"");
      thisexp=new RegExp("\\D","g");
      thisv=document[fname][iname].value.replace(thisexp,"/");
      thisvarr=thisv.split("/");
      if (thisvarr.length>1){
        if (thisvarr[0].length!=2 && parseInt(thisvarr[0])<10){
          thisvarr[0]="0"+thisvarr[0];
        }
        if (thisvarr[1].length!=2 && parseInt(thisvarr[1])<10){
          thisvarr[1]="0"+thisvarr[1];
        }
        if (thisvarr[0]!="" && thisvarr[1]!="" && thisvarr[2]!=""){
          thisv=thisvarr[0]+"/"+thisvarr[1]+"/"+thisvarr[2];
        }
      }else if (String(thisv).length==8){
        thisexp=new RegExp("(\\d{2})(\\d{2})(\\d{4})");
        thisv=thisv.replace(thisexp,"$1/$2/$3");
      }
      thisexp=new RegExp("(\\d{2})\\/(\\d{2})\\/(\\d{4})","i");
    }
    if (document[fname][iname].value!="" && thisexp.test(thisv) && (RegExp.$1>0 && RegExp.$1<=12) && (RegExp.$2>0 && RegExp.$2<=31)){
      document[fname][iname].value=thisv;
      if (itypearr.length==2){
        var sdate=new Date(thisv);
        var cdate=new Date();
        var ndate=new Date();
        ndate.setTime(cdate.getTime()+itypearr[1]*24*60*60*1000);
// if prevent for only future dates needed
        if (sdate.getTime()>ndate.getTime() || sdate.getTime()<cdate.getTime()){
// else just checking for a date any time prior to future date
//        if (sdate.getTime()>ndate.getTime()){
          falert+=alertmsg[itext]+"\n";
//          falert+="Please enter a date less than "+itypearr[1]+" days in the future for "+itext+".\n";
          !ffocus.length ? ffocus=iname : 0;
          return 1;
        }else{
          return 0;
        }
      }else{
        return 0;
      }
    }else if(document[fname][iname].value ==""){
    	return 0;
    }else{
      falert+=alertmsg[itext]+"\n";
     !ffocus.length ? ffocus=iname : 0;
      return 1;
    }
    
    
// 8 - numerical string and length
  }else if (itype.substr(0,1)=="8"){
    itypearr[1]=itype.substring(itype.lastIndexOf("|")+1,itype.length);
	itypeLimit=itype.substring(itype.lastIndexOf("|")+1,itype.length);
    thisexp=new RegExp("\\D","g");
    thisv=document[fname][iname].value;
    if (document[fname][iname].value!=""){
      thisv=thisv.replace(thisexp,"");
    }
    if (document[fname][iname].value!="" && !isNaN(parseFloat(thisv)) && thisv.length==itypearr[1]){
      document[fname][iname].value=thisv;
      return 0;
    }else{
//      falert+=alertmsg[itext]+"\n";
      falert+="Please enter a "+itypeLimit+" digit number for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }
// 9 - non-alphanumeric test and string length
  }else if (itype.substr(0,1)=="9"){
    itypearr[1]=itype.substring(itype.indexOf("|")+1,itype.lastIndexOf("|"));
    itypearr[2]=itype.substring(itype.lastIndexOf("|")+1,itype.length);
    thisexp=new RegExp("\\W","g");
    thisv=document[fname][iname].value;
    if (document[fname][iname].value!=""){
      thisv=thisv.replace(thisexp,"");
    }
    if (document[fname][iname].value!="" && thisv.length>=itypearr[1] && thisv.length<=itypearr[2]){
      document[fname][iname].value=thisv;
      return 0;
    }else{
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter a value between "+itypearr[1]+" and "+itypearr[2]+" characters long for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }
// 10 - phone format -- only works on and for xxx-xxx-xxx numbers
  }else if (itype==10){
    if (document[fname][iname].value==""){
			return 0;
    }
    
    if (document[fname][iname].value!=""){
      thisexp=new RegExp("\\D","g");
      thisv=document[fname][iname].value.replace(thisexp,"");
      if (String(thisv).length==10){
        thisexp=new RegExp("(\\d{3})(\\d{3})(\\d{4})");
        thisv=thisv.replace(thisexp,"$1-$2-$3");
      }
      thisexp=new RegExp("(\\d{3})\-(\\d{3})\-(\\d{4})","i");
      if (thisexp.test(thisv)){
        document[fname][iname].value=thisv;
        return 0;
      }else{
        falert+=alertmsg[itext]+"\n";
//        falert+="Please enter a phone number in the format 555-555-1212 for "+itext+".\n";
        !ffocus.length ? ffocus=iname : 0;
        return 1;
      }
    }else{
      falert+=alertmsg[itext]+"\n";
//      falert+="Please enter a phone number in the format 555-555-1212 for "+itext+".\n";
      !ffocus.length ? ffocus=iname : 0;
      return 1;
    }
    
    
    

    // 15 - radio or checkbox -- at least one in array checked
  }else if (itype==15){
    i=0;
    while (i<document[fname][iname].length && !document[fname][iname][i].checked){
      i++;
    }
    if (i==document[fname][iname].length){
	  falert+=  itext + " is a required field." +"\n";
//      falert+="Please select an option for "+itext+".\n";
      return 1;
    }else{
      return 0;
    }

    
// 11 - subfields check
  }else if (itype==11){

  

  
  
	// 12 - select or text
	}else if (itype==12){	
	    inamearr[0]=iname.substring(0,iname.indexOf("|"));
	    inamearr[1]=iname.substring(iname.indexOf("|")+1,iname.lastIndexOf("|"));    
	    inamearr[2]=iname.substring(iname.lastIndexOf("|")+1,iname.length);    
	    itextarr[0]=itext.substring(0,itext.indexOf("|"));
	    itextarr[1]=itext.substring(itext.lastIndexOf("|")+1,itext.length);
	        
	    if (trim(document[fname][inamearr[1]].value) != "") {    
	    	document[fname][inamearr[2]].value = trim(document[fname][inamearr[1]].value);
	    	return 0;    	
	    } else {    	
	    	document[fname][inamearr[2]].value = document[fname][inamearr[2]].value = document[fname][inamearr[0]].options[document[fname][inamearr[0]].selectedIndex].value;
	    	if (document[fname][inamearr[2]].value == "") {    	
	    		falert+="Please either "+itextarr[0]+" or "+itextarr[1]+".\n";
	      		!ffocus.length ? ffocus=inamearr[0] : 0;
	      		return 1;
	    	} else {    	
	    		return 0;
	    	}
	    }
	}
	else if (itype == 17 && (document[fname][iname].options[document[fname][iname].selectedIndex].value == "" || document[fname][iname].options[document[fname][iname].selectedIndex].value=="0"))
	{
		falert += "Please select an option from the " + itext + " drop-down menu.\n";
		!ffocus.length ? ffocus = iname : 0;
		return 1;
	//18 - validates that date time is in 'mm/dd/yyyy hh:mm aa' format	  
    }else if (itype==18){
		if (document[fname][iname].value==""){
			return 0;
    	}
		
		validDate = false;
		validTime = false;
		
		dtStr = document[fname][iname].value;
		datePattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
		timePattern = /^(\d{1,2}):(\d{2})\s([a|p]m)$/i;
		
		dtSep = dtStr.indexOf(" ");
		dateStr = dtStr.substring(0,dtSep);
		timeStr = dtStr.substring(dtSep+1);
		
		if(dateArr = dateStr.match(datePattern)){
			if((dateArr[1] >= 1 && dateArr[1] <= 12)
				&& (dateArr[2] >= 1 && dateArr[2] <= 31)){				
				validDate = true;
			}
		}
		
		if(trim(timeStr).length == 0){
			validTime = true;	
		} else if(timeArr = timeStr.match(timePattern)){	
			if((timeArr[1] >= 1 && timeArr[1] <= 12)
				&& (timeArr[2] >= 0 && timeArr[1] <= 59)){
				validTime = true;
			}
		}
		
		if(validDate && validTime){
			return 0;
		} else {
			falert+= itext + " is an invalid date.\n";
			return 1;
		}	
	}
	
	else
	{
		return 0;
	}    
}



function trim(strText) { 
    // this will get rid of leading spaces 
    while (strText.substring(0,1) == ' ') 
        strText = strText.substring(1, strText.length);

    // this will get rid of trailing spaces 
    while (strText.substring(strText.length-1,strText.length) == ' ')
        strText = strText.substring(0, strText.length-1);

   return strText;
}