function YY_checkform() { //v3.05
  var pwErr = '';
  var chkChars = /[$\\@\\\#%\^\&\*\(\)\[\]\<\>\+\_\{\}\`\~\-\;\,=\|]/;
  var args = YY_checkform.arguments; var myDot=true; myV=''; var myErr='';var addErr=false;var addPWErr=false;var addMustBeErr=false;var mustBeErrMsg = "";
  if (document.all){eval("args[0]=args[0].replace(/.layers/gi, '.all');");}
  for (var i=1; i<args.length;i=i+4){
    if (args[i+1].charAt(0)=='#'){
      var myReq=true; args[i+1]=args[i+1].substring(1);
    }else{myReq=false}
    var myObj = eval(args[0]+'.'+args[i])

//// SPECIAL CHARACTER CHECK \\\
    if ((myObj.type=='text') && (args[i+1] == 'chkChar')){
		myV=myObj.value;
		for (var yy=0; yy<myV.length;yy=yy+1){
			myVchar = myV.charAt(yy);
			if(myVchar.search(chkChars) != -1) {
				addPWErr = true;
				pwErr = 'Invalid Characters found in ' + args[i] + '! The following characters are not allowed:\n           _ / \ ( ) [ ] < > @ # % & $ + = - ~ ; , | *';
				yy = myV.length - 1;
			}
		}
	}
    if (myObj.type=='text'){

      if (myReq&&myObj.value.length==0){addErr=true}
      myV=myObj.value;
      if ((myV.length>0)&&(args[i+2]==1)){ //fromto number
//        if (isNaN(parseInt(myV))||myV<args[i+1].substring(0,args[i+1].indexOf('_'))/1||myV > args[i+1].substring(args[i+1].indexOf('_')+1)/1){addErr=true}
        if (isNaN(myV)||myV<args[i+1].substring(0,args[i+1].indexOf('_'))/1||myV > args[i+1].substring(args[i+1].indexOf('_')+1)/1){addErr=true}
      }
      if ((myV.length>0)&&(args[i+2]==2)){ //e-mail
        if (myV.lastIndexOf('.')<myV.lastIndexOf('@')||myV.lastIndexOf('.')==-1||myV.lastIndexOf('@')==-1){addErr=true}
      }
	  
	  ////////////////// FOR CONFIRM EMAIL ADDRESS -- WHERE EMAIL AND CONFIRM EMAIL MUST BE THE SAME
	  ////////////////// ENSURE THE "CONFIRM EMAIL" INPUT TEXTBOX IS NAMED: NAME="ConfirmEmail" ie: <INPUT TYPE="text" NAME="ConfirmEmail">
	  ////////////////// WHEN CALLING IN THE <form onSubmit USE THE FOLLOWING FORMAT:
	  ////////////////// 'Email','#q','22','Field \&quot;Email Address\&quot; and \&quot;Retype Email Address\&quot; do not match.'
	  if ((myV.length>0)&&(args[i+2]==22)){ //CONFIRM e-mail
	  	var confirmEmail = eval(args[0]+'.ConfirmEmail.value');
		if (myV != confirmEmail) {addErr = true}
      }
	  
	  if ((myV.length>0)&&(args[i+2]==3)){ // date
		var myDot=true;
		var strDateArray = myV.split("/");
		if (strDateArray.length == 3) {
			var intMonth = parseInt(strDateArray[0], 10);
			var intDay = parseInt(strDateArray[1], 10);
			var intYear = parseInt(strDateArray[2], 10);
			if(intMonth >= 1 && intMonth <= 12 && intDay >= 1 && intDay <= 31 && intYear >= 1900 && intYear <= 2100){myDot=true;}
			else{myDot=false;}
		}
		else{myDot=false;}
		if(!myDot){addErr=true}
       }
      if ((args[i+2]==6)){ // used for dates that are entered but not required -- IF LENGTH>0 THEN{ CHECK IF VALID{ ELSE {ERROR=FALSE}
		if (myV.length>0){
			var myDot=true;
			var strDateArray = myV.split("/");
			if (strDateArray.length == 3) {
				var intMonth = parseInt(strDateArray[0], 10);
				var intDay = parseInt(strDateArray[1], 10);
				var intYear = parseInt(strDateArray[2], 10);
				if(intMonth >= 1 && intMonth <= 12 && intDay >= 1 && intDay <= 31 && intYear >= 1900 && intYear <= 2100){myDot=true;}
				else{myDot=false;}
			}
			else{myDot=false;}
			if(!myDot){addErr=true}
		}
		else{addErr=false;}
       }
      if ((myV.length>0)&&(args[i+2]==4)){ // time
        var myDot=true;
        var myH = myObj.value.substr(0,myObj.value.indexOf(':'))/1;
        var myM = myObj.value.substr(myObj.value.indexOf(':')+1,2)/1;
                var myP = myObj.value.substr(myObj.value.indexOf(':')+3,2);
        if ((args[i+1])=="12:00pm"){if(myH<0||myH>12||myM<0||myM>59||(myP!="pm"&&myP!="am")||myObj.value.length>7)myDot=false; }
        if ((args[i+1])=="12:00"){if(myH<0||myH>12||myM<0||myM>59||myObj.value.length>5)myDot=false;}
        if ((args[i+1])=="24:00"){if(myH<0||myH>23||myM<0||myM>59||myObj.value.length>5)myDot=false;}
        if(!myDot){addErr=true}
      }
      if ((myV.length>0)&&(args[i+2]==5)){ // check this 2
        if (!eval(args[0]+'.'+args[i+1]+'.checked')){addErr=true}
      }
    }
    if (myObj.type=='radio'){
      if (args[i+2]==1&&myObj.checked&&eval(args[0]+'.'+args[i+1]+'.value.length')/1==0){addErr=true}
      if (args[i+2]==2){
        myDot=false;
        myV=eval(args[0]+'.'+args[i].substring(0,args[i].lastIndexOf('[')));
        for(var j=0;j<myV.length;j++){myDot=myDot||myV[j].checked}
        if(!myDot){myErr+='* ' +args[i+3]+'\n'}
      }
      /// IF THE SECONDARY FIELD IS A DROP-DOWN ENTER '3' FOR THE THIRD FIELD
      /// 'RadioButtonName[n]','RequiredFieldName','3','When RadioButtonName[n] is chosen then RequiredFieldName is required'
      if(args[i+2]==3&&myObj.checked&&eval(args[0]+'.'+args[i+1]+'.selectedIndex')/1==0){addErr=true}
    }
    if (myObj.type=='checkbox'){  //checkboxes
      if(args[i+2]==1&&myObj.checked==false){addErr=true}  //if checkbox is required
	      /// WHEN checkbox is CHECKED and other fields are then required
	      /// in the obSubmit statement in the <form> tag us the following format:
	      /// 		'checkboxname','required comma-delimited fields,error message,required comma-delimited fields,error message,etc.....','CHECKED --or-- NOCHECKED','leave blank --or-- enter heading message'
	      ///			           ^^^^^^ each field required when checkbox is CHECKED followed by its error^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  					       ^^^^^^^^^^^^^ if you want a heading message to come before the required messages, enter it here, otherwise leave it completely blank
	      ///														      ^^^^^^^ use CHECKED if the checkbox must be checked before checking the other required fields
	      ///														      		  ^^^^^^^ use NOCHECKED if the checkbox is NOT checked before checking the other required fields (used with "Same As Shipping" in the IntimateStore
	      /// do the split for the specified fields that must be entered if this checkbox is checked.
      var mustBeChecked = args[i+1].split(",");
      for (var ii=0; ii<mustBeChecked.length;ii=ii+2){
      	if(args[i+2]=='CHECKED'){
	      if(eval(args[0]+'.'+mustBeChecked[ii]+'.type')=='text'){		// if when checkbox is checked and a textbox cannot be blank
	            if(myObj.checked&&eval(args[0]+'.'+mustBeChecked[ii]+'.value.length')/1==0){
					mustBeErrMsg += '* ' + mustBeChecked[ii+1] + '\n';
					eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'yellow'");
				}
				else {
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'white'");
			  }

	      }
	      if(eval(args[0]+'.'+mustBeChecked[ii]+'.type')=='select-one'){ 	// if when a checkbox is checked and a the drop-down cannot be the first
	            if(myObj.checked&&eval(args[0]+'.'+mustBeChecked[ii]+'.selectedIndex')/1==0){
					mustBeErrMsg += '* ' + mustBeChecked[ii+1] + '\n';
					eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'yellow'");
				}
			    else {
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'white'");
			    }
	      }
	  }
      if(args[i+2]=='NOCHECKED'){
	    if(eval(args[0]+'.'+mustBeChecked[ii]+'.type')=='text'){		// if when checkbox is checked and a textbox cannot be blank
	          if(!myObj.checked&&eval(args[0]+'.'+mustBeChecked[ii]+'.value.length')/1==0){
				  mustBeErrMsg += '* ' + mustBeChecked[ii+1] + '\n';
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'yellow'");
			  }
			  else {
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'white'");
			  }
	    }
	    if(eval(args[0]+'.'+mustBeChecked[ii]+'.type')=='select-one'){ 	// if when a checkbox is checked and a the drop-down cannot be the first
	          if(!myObj.checked&&eval(args[0]+'.'+mustBeChecked[ii]+'.selectedIndex')/1==0){
				  mustBeErrMsg += '* ' + mustBeChecked[ii+1] + '\n';
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'yellow'");
			  }
			  else {
				  eval(args[0]+ "." + mustBeChecked[ii] + ".style.background = 'white'");
			  }
	    }
	}
	  } // end for loop      
      if (mustBeErrMsg != ''){
		if(args[i+3]!=''){myErr += '\n' + args[i+3] + '\t\n';}
		myErr += mustBeErrMsg;
      }
    }
    if (myObj.type=='select-one'||myObj.type=='select-multiple'){	/// SELECT (DROP-DOWN)
      if(args[i+2]==1&&eval(args[0]+'.'+args[i]+'.selectedIndex')/1==0){addErr=true}
    }
    if (myObj.type=='textarea'){
      myV = eval(args[0]+'.'+args[i]+'.value');
      if(myV.length<args[i+1]){addErr=true}
    }

////////////////// check passwords %%%%%%% ENSURE THE "CONFIRM PASSWORD" INPUT TEXTBOX IS NAMED: NAME="ConfirmPassword"
////////////////// check passwords %%%%%%% <INPUT TYPE="password" NAME="ConfirmPassword">

    if (myObj.type=='password'){   			
      if (myReq&&myObj.value.length<6){addErr=true}
      myV=myObj.value;
						//      myV = eval(args[0]+'.'+args[i]+'.value');
	    if ((myV.length>0)&&(args[i+2]==12)){ //password
			var confirmPW = eval(args[0]+'.ConfirmPassword.value');
			var invalChars = /[$\\@\\\#%\^\&\*\(\)\[\]\<\>\+\_\{\}\`\'\~\-\;\,=\|]/;	
			if (myV != confirmPW) {
				addPWErr = true;
				pwErr = 'The Fields Password & Confirm Password do not match.';
			}
			else{
				for (var ii=0; ii<myV.length;ii=ii+1){
					myVchar = myV.charAt(ii);
					if(myVchar.search(invalChars) != -1) {
						addPWErr = true;
						pwErr = "Invalid Characters found in Password! The following characters are not allowed:\n           _ / \ ( ) [ ] < > @ # % & $ + = - ~ ; , | * '";
						ii = myV.length - 1;
					}
					else {
						if(myVchar == " ") {// no spaces allowed
							addPWErr = true;
							pwErr = "Invalid Characters found in Password! The following characters are not allowed:\n           _ / \ ( ) [ ] < > @ # % & $ + = - ~ ; , | * '";
							ii = myV.length - 1;
						}
					}
				}
			}
       }
	}
    
    if (addErr){
		myErr+='* '+args[i+3]+'\n'; addErr=false;
//		alert("error found for " + myObj.value);
		myObj.style.background = 'yellow';
	}
	else {
		myObj.style.background = 'white';
	}
    if (addPWErr){
		myErr+='* '+pwErr+'\n'; addPWErr=false;
		myObj.style.background = 'yellow';
	}
	else {
		if (myObj.type=='password'){
			myObj.style.background = 'white';
		}
	}
  }
  if (myErr!=''){alert('The required information is incomplete or contains errors:\t\t\t\t\t\n\n'+myErr)}
  document.MM_returnValue = (myErr=='');
}

/////////////////////////////////////////////////////////////////////    VALIDATE CREDIT CARD NUMBERS ////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////    VALIDATE CREDIT CARD NUMBERS ////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////    VALIDATE CREDIT CARD NUMBERS ////////////////////////////////////////////////////////////////////////////////////////////////

function YY_ccard(daForm, daField, daType, daMsg) { //v3.02
  var aRulerz = new Array(); var aCNames = new Array(); var myReturn = false;
////////////// ORIGINAL ////////////  aCNames = ["MASTER","VISA","AMEX","DINERS","JCB","DICOVER","ENROUTE"];
  aCNames = ["2","1","AMEX","DINERS","JCB","DICOVER","ENROUTE"];  // I set VISA to 1 & MASTER to 2, since the dropdown is populated by the database Table CCType
  
  aRulerz[aCNames[0]] = new Array("16"  ,"51:52:53:54:55");
  aRulerz[aCNames[1]] = new Array("13:16"  ,"4");
  aRulerz[aCNames[2]] = new Array("15"  ,"34:37");
  aRulerz[aCNames[3]] = new Array("14"  ,"300:301:302:303:304:305:36:38");
  aRulerz[aCNames[4]] = new Array("16"  ,"3088:3096:3112:3158:3337:3528:2131:1800");
  aRulerz[aCNames[5]] = new Array("16"  ,"6011");
  aRulerz[aCNames[6]] = new Array("15"  ,"2014:2149");
  var count=(daType=="ANY")?aCNames.length:1;
  if(daType.indexOf("#")==0){
    daType = MM_findObj(daType.substr(1));
    daType = daType.options[daType.selectedIndex].value;
  }
  var myForm=MM_findObj(daForm);
  if(myForm[daField]){var CardNumber=myForm[daField].value}else{var CardNumber="0";}
for(var j=0;j<count;j++){
  var cType = (daType=="ANY")?aCNames[j]:daType;
  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0; var pat = false;var cln=false; var ldn=false;
  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
  {
    var aCln = aRulerz[ cType][0].split(":");
    var aLdn = aRulerz[ cType][1].split(":");
    for(var i=0; i<aCln.length; i++){
      if(aCln[i]==no_digit){cln=true; break}
    }
    for(var i=0; i<aLdn.length; i++){
      if(CardNumber.indexOf(aLdn[i])==0){ldn=true; break}
    }
  }
  if (sum % 10 == 0 && cln == true && ldn==true){
    myReturn=true;
    break;
  }
}
  if(myReturn==false){
	eval(daForm + "." + daField + ".style.background = 'yellow'");
	alert(daMsg);
  }
  else {
	eval(daForm + "." + daField + ".style.background = 'white'");
  }
  document.MM_returnValue = myReturn;
}

