
/*
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
jsFORM-CHECK version 1.3
AUTO-FORM VALIDATOR 

WRITTEN BY:
Jordan M. Mrazek
jordanm@tea-corp.com
Technology Specialist
Technology Engineers & Architects, LLC
201-226-9333 ext. 12
MCSE


REVISION HISTORY
5/19/2004	started Version 1.0 
5/20/2004	initial development & enhancements to functionality
5/28/2004	Version 1.2 
	added support to validate against two email fields namesd email1 & email2, 
	added support to validate against two password fields named passowrd1 & password2
	added support to perform date validation on a text field (Courtesy of SmartWebby.com, checks for valid 'mm/dd/yyyy' format), default supports text fields named 'birthdate' 
	added support to better handle the slectbox values

6/1/2004	Version 1.3
	Added support to validate credit card entries. Checks for the presence of a field called 'CardNumber' that has data in it, and if it exists, checks card info, uses CheckCardNumber(form) function.
	Added support to check for a numeric value on a field named 'dollar_amount'

6/2/2004	Version 1.4
	Added support for the input tag parameter 'jsFORMCHECK_type='????'', where specifying this parameter in a form's input tag will enable for specific validation of entered values
							
							THESE VALUES SPECIFIED IN THE FORM'S ELEMENT CONTROL DIFFERENT JS VALIDATION;	
							jsFORMCHECK_type='dollar' - uses isNaN to check for numeric
							jsFORMCHECK_type='date'	 - Courtesy of SmartWebby.com, checks for valid 'mm/dd/yyyy' format, replaces need to specify input tag name 'birthdate' from version 1.2
							jsFORMCHECK_type='number' - uses isNaN to check for numeric 
												CURRENT-if (isNaN(trimmedstr)){  //use this for strict numeric on the whole string
												DISABLED-if (isNaN(parseFloat(trimmedstr))){ - use this version to read numbers at the beginning of an alphanumberic string (45fdafkl will return 45)

							jsFORMCHECK_type='phone_type1' - Courtesy of SmartWebby.com, checks for valid phone numebr and allows +()- chars
							jsFORMCHECK_type='phone_type2' - Courtesy of SmartWebby.com, checks for valid phone number using '0123456789'
							jsFORMCHECK_type='creditcardnumber' - uses CheckCardNumber(form) function
	
6/8/2004	Version 1.5
	Added code to clear email fields on failed validation
	
7/1/2004	Version 1.6
	Added new required type 5, this one displays the informational tag ', or enter N/A if not applicable' on the alert message for text fields.

	On checkreq==2, add the informational tag ', or enter N/A if not applicable' on the alert message for text fields if one of the NACKS is n/a, n\a, not applicable. 
		This makes the inclusion of the n/a dynamic for checreq==2's. 
		
	Got rid of character case dependency for req. type 2, 3, 4
	
	fixed a bug with checkbox validation failing
	
7/22/2004	Version 1.7
    fixed liability where form was not named 'form'
	the line [ var myarray=new Array(form.elements.length+20); ]  caused problems with forms not named 'form' 
    changed line to hardcode the myarray limit to 200 for now.
    
	var myarray=new Array(200);
	for (i=0; i <200; i++){
	myarray[i]=new Array(4);
    
    Alex seems to think he helped!!

4/19/2005	Version 1.8
	added jsFORMCHECK_type='email1' - trap to check a field set to this type, will validate email and compare to a field named email2
		4/20/2005 exclude jsFORMCHECK_type='email1' and form.element.name='email1' from inclusion of N/A response option in alert to user.
    
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

The following arrays are samples to be used in the individual form's INI page. The following script call needs to be included in the form's ASP page, and target an external INI file.

	<script language="JavaScript">
		<!-- #include file="inifilename.INI" -->
	</script>


				THIS CODE-BASE PROCESSES FORM DATA USING THE ELEMENT-LEVEL INSTRUCTIONS DEFINED IN THE PASSED ARRAYS
				
				This code will loop thru the form elements and based on what type the element is,
				it will validate their requirements based on the instructions in the element-level array.
				This code only checks for the existence of a value, it does not perform numeric vs. alpha-only validation.
				
				this file recieves the following instructions from the form source file;
				
				FORM ARRAY INSTRUCTIONS - ELEMENT-LEVEL INSRUCTION ARRAY [SEE 'MYARRAY' BELOW]
				NACK ARRAY
				ACK ARRAY
				OTHER ARRAY
				
				/* 
				INSRUCTIONS - FILL THE ARRAY WITH FORM-SPECIFIC DATA
					
						myarray[0][0]	=	'FIELD' (enter HTML form element name, case-sensitive) 
						myarray[0][1]	=	'requirement type
							values 	0 <not required>
				
									1 <required>
				
									2 <required 'IF YES THEN' type, this is required only if the pre-requisite question is affirmative (checks against NACKS array), 
										specify pre-req. form element name in myarray[0][3]> 
				
									3 <required 'IF NO THEN' type, this is required only if the pre-req. question is affirmative (checks against ACKS array), 
										specify pre-req. form element name in myarray[0][3]> 
									
									4 <required 'IF OTHER THEN' type, this is required only if the pre-req. question is 'other' (checks against other array), 
										specify pre-req. form element name in myarray[0][3]> 
									
									CURRENTLY TYPE 4 IS ONLY ENABLED FOR RADIO ELEMENT TYPES
									
						myarray[0][2]	=	'<response message insert>'	
						myarray[0][3]	=	'<pre-requisite form element (only if MYARRAY[0][1] is > 1)>'	
				*/
						
					/*
					This array provides allowed ACK responses for processing fields that are pre-requisite on other fields ('if yes then')
							Acks[0]='yes';
							Acks[1]='y';
							Acks[2]='true';
							Acks[3]='t';
							Acks[4]='1';
							Acks[5]='ok';
					*/
					
					/*
					This array provides allowed NACK responses for processing fields that are pre-requisite on other fields ('if yes then')
							Nacks[0]='no';
							Nacks[1]='0';
							Nacks[2]='false';
							Nacks[3]='f';
							Nacks[4]='';
				
						The following NACK respomnses, if included will trigger the alert messages to inform the user that they can select N/A as an allowable response.
							Nacks[5]='n/a';
							Nacks[6]='n\\a';
							Nacks[7]='not applicable';
					*/
							
					/*
					This array provides allowed OTHER responses for processing fields that are pre-requisite on other fields ('if other then')
							Others[0]='other';
							Others[1]='';
					*/
					
	
/*
alert(myarray[56][0]);
*/





/*	BEGIN jsFORM-CHECK		*/

/* 
define globals
*/
	var selectedvalue='';
	var prereq=0;
	var notappmessage=0;
	var displaymessage='';
	var checkreq=0;
	var ValidateCreditCard = 0;
	var CreditCardFormElementIndex = 0;
	var trimmedstr = '';
/* 
define a two-dimensional array to hold per-element processing instructions
*/
	var myarray=new Array(200);
	for (i=0; i <200; i++){
	myarray[i]=new Array(4);
	}


/* 
arrays for pre-requisite questions processing.
*/
	var Acks=new Array(20);
	var Nacks=new Array(20);
	var Others=new Array(20);

	


function Process (form) {

//alert(form.name);

/*	BEGIN PROCESSOR		*/

  exit_element_loop:
  for (var e = 0; e < form.elements.length; e++) {
	//alert(form.elements[e].jsFORMCHECK_type);
	//alert('1');
    //alert(form.elements[e].name);

	//if (form.elements[e]){
	   // alert('2');
		//alert(myarray.length);
		//alert(form.elements[e].value);
		
		getselectedvalue (form.elements[e]); 
		//alert(form.elements[e].name);
		//alert('|'+selectedvalue+'|');
		
		prereq=0;

		if (selectedvalue == ''){
			//alert(form.elements[e].name);
			//alert('selectedvalue:'+selectedvalue);
		
			  exit_array_loop: /* this loop will run thru the configuration array (myarray) looking to match the current form element index's name in order to get processing instructions */
			  for (var x = 0; x < myarray.length; x++) {
			  		
						if (myarray[x][0] !=''){
				
							if (form.elements[e].name == myarray[x][0]){
								//alert('4');
							    //alert(myarray[x][0]);
				
								checkreq=myarray[x][1];
								//alert(checkreq);
								if (checkreq !='' || checkreq > 0){
										var el = form.elements[e];
									    //alert(el.type);
										if (el.type == 'text' || el.type == 'textarea' || el.type == 'password' || el.type == 'file' ) { 
											if (checkreq==1){
											      if (el.value == '') {
												        //alert(x);
											        //alert(myarray[x][2]+' is required. Please provide an answer to continue.');
													displaymessage='';
													displaymessage=' is required. Please provide an answer to continue';
													displaymessage	=	displaymessage	+ '.';
													
													alert(myarray[x][2]+displaymessage);
											        //alert(myarray[x][2]+' is required. Please provide an answer to continue.');
													//alert('Please fill out the text field ' + el.name);
											        el.focus();
											        return false;
											      }
											}
											
											if (checkreq==5){
											      if (el.value == '') {
												        //alert(x);
											        //alert(myarray[x][2]+' is required. Please provide an answer to continue.');
													displaymessage='';
													displaymessage=' is required. Please provide an answer to continue';
													displaymessage	=	displaymessage	+ ', or enter N/A if not applicable';
													displaymessage	=	displaymessage	+ '.';
													
													alert(myarray[x][2]+displaymessage);
											        //alert(myarray[x][2]+' is required. Please provide an answer to continue, or enter N/A if not applicable.');
													//alert('Please fill out the text field ' + el.name);
											        el.focus();
											        return false;
											      }
											}

											if (checkreq==2 || checkreq==3 || checkreq==4){
											  /*
												  This field has a pre-requisite field. 
												  The following will look at the value 
												  of the specified prerequisite field 
												  (myarray[0][3]) 
											  */
		
												var checkprereq=myarray[x][3];
												if (checkprereq !=''){
												  //alert (myarray[x][0]);
												  //alert (myarray[x][1]);
													//alert('checkprereq:'+checkprereq);
			
													exit_prereq_loop: /* this loop will run thru the form elements, looking for the pre-requisite form element in order to check the selected answer*/
													for (var p = 0; p < form.elements.length; p++) {
														if (form.elements[p].name == myarray[x][3]){
																//alert(form.elements[p].value);
																 
																 getselectedvalue (form.elements[p]); 
																 
															 getreqtype (selectedvalue, checkreq);

																//alert('return prereq:'+prereq);
																//alert('pre-req selectedvalue:'+selectedvalue);
														  
															  if (prereq==1){
																//alert('need');
															      if (el.value == '') {
																        //alert(x);
															        
																	/*
																	Set display message
																	*/
																	displaymessage='';
																	displaymessage=' is required. Please provide an answer to continue';
																		if (notappmessage==1){
																			if (el.jsFORMCHECK_type	!==	'email1' && el.name	!==	'email1' ) {
																				displaymessage	=	displaymessage	+ ', or enter N/A if not applicable';
																			}
																			//alert(displaymessage);
																		}
																	displaymessage	=	displaymessage	+ '.';
																	
																	alert(myarray[x][2]+displaymessage);
																	//alert('Please fill out the text field ' + el.name);
															        el.focus();
															        return false;
															      }
															  }
														break exit_prereq_loop; /* found the pre-requisite field, no need to continue */
														}
													}
												}
											}
											
										}
									    else if (el.type.indexOf('select') != -1) {
											/*
											Set display message
											*/
											displaymessage='';
											displaymessage=' is required. Please select an answer to continue';
											displaymessage	=	displaymessage	+ '.';
											
											alert(myarray[x][2]	+	displaymessage);

									        //alert(myarray[x][2]+' is required. Please select an answer to continue.');
											//alert('Please fill out the text field ' + el.name);
									        el.focus();
									        return false;

									    }
									    else if (el.type == 'radio') {
										
										  if (checkreq==1){
											//alert('radio required 1');
											  /*
												  This field is required. The following code will 
												  prompt for a value if there is more than one group element
											  */
											  var group = form[el.name];
										      var checked = false;
										      if (!group.length)
										        checked = el.checked;
										      else
										        for (var r = 0; r < group.length; r++)
										          if ((checked = group[r].checked))
										            break;
										      if (!checked) {
										        /*
												alert(x);
										        alert(myarray[x][0]);
										        alert(myarray[x][1]);
										        alert(myarray[x][2]);
										        alert(myarray[x][3]);
												*/
												displaymessage='';
												displaymessage=' is required. Please choose an answer to continue';
												displaymessage	=	displaymessage	+ '.';
												
												alert(myarray[x][2]	+	displaymessage);
										        //alert(myarray[x][2]+' is required. Please choose an answer to continue.');
												//alert('Please choose an answer for '+myarray[x][2]+' to continue.');
												//alert('Please check one of the radio buttons ' + el.name);
										        el.focus();
										        return false;
										      }
										  }
		
										  
										  if (checkreq==2 || checkreq==3 || checkreq==4) {
											  /*
												  This field has a pre-requisite field. 
												  The following will look at the value 
												  of the specified prerequisite field 
												  (myarray[0][3]) 
											  */
		
											var checkprereq=myarray[x][3]
											if (checkprereq !=''){
												//alert('Field:'+myarray[x][0]);
												//alert('checkprereq:'+checkprereq);
		
											  exit_prereq_loop: /* this loop will run thru the form elements, looking for the pre-requisite form element in order to check the selected answer*/
											  for (var p = 0; p < form.elements.length; p++) {
													if (form.elements[p].name == myarray[x][3]){
															
															//alert('pre-req. Field '+form.elements[p].name);
															
															getselectedvalue (form.elements[p]); 
																//alert('pre-req selectedvalue:'+selectedvalue);

															 getreqtype (selectedvalue, checkreq);
																//alert('return prereq:'+prereq);
																 
																 
															
															//selectedvalue = form.elements[p].value;
															//alert('prereq selectedvalue:'+selectedvalue);
													  
														//alert('prereq:'+prereq);
													  
													  if (prereq==1){
														//alert('need');
														  var group = form[el.name];
					
													      var checked = false;
													      if (!group.length)
													        checked = el.checked;
													      else
													        for (var r = 0; r < group.length; r++)
													          if ((checked = group[r].checked))
													            break;
													      if (!checked) {

															displaymessage='';
															displaymessage=' is required. Please choose an answer to continue';
															displaymessage	=	displaymessage	+ '.';
															
															alert(myarray[x][2]	+	displaymessage);
													        //alert(myarray[x][2]+' is required. Please choose an answer to continue.');
													        //alert('Please select an answer for '+myarray[x][2]+' to continue.');
															//alert('Please check one of the radio buttons ' + el.name);
													        el.focus();
													        return false;
													      }
					
													  }
									    			
													break exit_prereq_loop; /* found the pre-requisite field, no need to continue */
													}
												}
											  
											  }
											  
											  
										  }
									    }
									    else if (el.type == 'checkbox') {

											  var group = form[el.name];
										      var checked = false;
										      if (!group.length){
										        checked = el.checked;
										      }
											  else 
											  {
										        for (var r = 0; r < group.length; r++)
										          if ((checked = group[r].checked))
										            break;
										      }
											  if (!checked) {



												displaymessage='';
												displaymessage=' is required. Please choose an answer to continue';
												displaymessage	=	displaymessage	+ '.';
												
												alert(myarray[x][2]	+	displaymessage);
										        //alert(myarray[x][2]+' is required. Please choose an answer to continue.');
										      //alert('Please select an answer for '+myarray[x][2]+' to continue.');
									          //alert('Please check one of the checkboxes ' + el.name);
									          el.focus();
									          return false;
									        }
									    }
						
								}
		
			    			break exit_array_loop;
							}
				
						}
		
			  }
		}
		else if (form.elements[e].name	==	'email1' || form.elements[e].name	==	'password1' || form.elements[e].name	==	'birthdate' || form.elements[e].name	==	'CardNumber' || form.elements[e].name	==	'dollar_amount' || form.elements[e].jsFORMCHECK_type == 'dollar' || form.elements[e].jsFORMCHECK_type == 'date' || form.elements[e].jsFORMCHECK_type == 'number' || form.elements[e].jsFORMCHECK_type == 'creditcardnumber' || form.elements[e].jsFORMCHECK_type	==	'phone_type1' || form.elements[e].jsFORMCHECK_type	==	'phone_type2' || form.elements[e].jsFORMCHECK_type	==	'email1'){
			if (form.elements[e].name	==	'email1' ){
				var Check_Email_var = Check_Email (form);
				if (Check_Email_var == false){
					if (form.email1){
						form.email1.value='';
					}
					if (form.email2){
						form.email2.value='';
					}
					return false;
					break exit_element_loop;
				}
			}


			if (form.elements[e].jsFORMCHECK_type 	==	'email1'){
				//alert(form.elements[e].jsFORMCHECK_type);
				var Check_Email_var = Check_Email_V2 (form, e);
				if (Check_Email_var == false){
					if (form.elements[e].name){
						form.elements[e].name.value='';
					}
					if (form.email2){
						form.email2.value='';
					}
					return false;
					break exit_element_loop;
				}
			}


			else if(form.elements[e].name	==	'password1'){
				var trimmedstr	=	trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
				var Check_Password_var = Check_Password (form);
				if (Check_Password_var == false){
					return false;
					break exit_element_loop;
				}
			}
			
			if (form.elements[e].name	==	'CardNumber' || form.elements[e].jsFORMCHECK_type 	==	'creditcardnumber'){
				//alert('found CC form');
				ValidateCreditCard = 1;
			}
			
			/* this comparision does not work for radios 
			
			if (form.elements[e].name	==	'CardType' ){
				//alert(form.elements[e].name);
				CreditCardFormElementIndex = e;
			}
			*/

			if (form.elements[e].name	==	'dollar_amount'){
				//alert('dollar_amount');
				trimmedstr = trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
	
				//if (isNaN(parseFloat(trimmedstr))){ - use this version to read numbers at the beginning of an alphanumberic string (45fdafkl will return 45)
				if (isNaN(trimmedstr)){  //use this for strict numeric on the whole string
					alert('Please enter a numeric value for this field.');
					form.elements[e].select();
					form.elements[e].focus();
					return(false);
				}
			}
			
			if (form.elements[e].name	==	'birthdate' || form.elements[e].jsFORMCHECK_type	==	'date'){
				trimmedstr	=	trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
				var Check_Date_var = Check_Date(form.elements[e]);
				if (Check_Date_var == false){
					return false;
					break exit_element_loop;
				}
			} 
			if (form.elements[e].jsFORMCHECK_type	==	'dollar'){
			//alert('jsFORMCHECK_type dollar');
				trimmedstr = trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
	
				//if (isNaN(parseFloat(trimmedstr))){ - use this version to read numbers at the beginning of an alphanumberic string (45fdafkl will return 45)
				if (isNaN(trimmedstr)){  //use this for strict numeric on the whole string
					alert('Please enter a numeric value for this field.');
					form.elements[e].select();
					form.elements[e].focus();
					return(false);
				}
			}
			
			if (form.elements[e].jsFORMCHECK_type	==	'number'){
			//alert('jsFORMCHECK_type number');
				trimmedstr = trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
	
				//if (isNaN(parseFloat(trimmedstr))){ - use this version to read numbers at the beginning of an alphanumberic string (45fdafkl will return 45)
				if (isNaN(trimmedstr)){  //use this for strict numeric on the whole string
					alert('Please enter a numeric value for this field.');
					form.elements[e].select();
					form.elements[e].focus();
					return(false);
				}
			}
			
			if (form.elements[e].jsFORMCHECK_type	==	'phone_type1'){
				trimmedstr	=	trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
				var Check_Phone_var = Check_Phone_type1(form.elements[e]);
				if (Check_Phone_var == false){
					return false;
					break exit_element_loop;
				}
				
			}
			
			if (form.elements[e].jsFORMCHECK_type	==	'phone_type2'){
				trimmedstr	=	trim(form.elements[e].value);
				form.elements[e].value = trimmedstr;
				var Check_Phone_var = Check_Phone_type2(form.elements[e]);
				if (Check_Phone_var == false){
					return false;
					break exit_element_loop;
				}
				
			}
			
		}

	//}
  }
  
	//alert(ValidateCreditCard);
	if (ValidateCreditCard==1){
		var CheckCardNumber_var = CheckCardNumber(form, CreditCardFormElementIndex);
		if (CheckCardNumber_var == false){
			return false;
		}
	}

 	
	return true;
}

function getselectedvalue (sl){
/*
This function reads a form element and returns it's value
*/	
selectedvalue='';

	if (sl.type == 'text' || sl.type == 'textarea' || sl.type == 'password' || sl.type == 'file' ) { 
		selectedvalue = sl.value;
	}
	
	else if (sl.type == 'radio') {
	//alert('sl.name:'+sl.name);
	
	    var aPreReqRadios = document.getElementsByName(sl.name);	
		for (var w = 0; w < aPreReqRadios.length; w++) {
	            
			 if (aPreReqRadios[w].checked) selectedvalue = aPreReqRadios[w].value;
		}
		//alert('in lookup lookup selected:'+selectedvalue);
	}
	
	else if (sl.type == 'checkbox') {
	
	    var aPreReqRadios = document.getElementsByName(sl.name);	
		for (var w = 0; w < aPreReqRadios.length; w++) {
	            
			 if (aPreReqRadios[w].checked) selectedvalue = aPreReqRadios[w].value;
		}
	}
									
	else if (sl.type.indexOf('select') != -1) {
			selectedvalue = sl.options[sl.selectedIndex].value;
	}
	
return 	selectedvalue;

}

function getreqtype (selectedvalue, checkreq){
//alert('getreqtype selectedvalue:'+selectedvalue);
	if (checkreq==2){ 
		/*This is 'if yes then's, compare against a list 
		of negative responses, and clear requirement if 
		negative answers were picked in the perequisite question 
		(makes an answer required on everything but the list of NACKS)*/

		//alert('checkreq:'+checkreq);

		prereq=1; /*make required*/
		notappmessage=0; /**/
		for (var z = 0; z < Nacks.length; z++) {
			/* check the list of NACK responses */
				//alert('NACK:'+Nacks[z]);
		
			/*7/1/2004, add support to dynamically include the N/A informational message when one of the allowed NACKS is n/a, n\a, not applicable*/
			charcheck = new String(Nacks[z])
			charcheck = charcheck.toLowerCase()
			if (charcheck=='n/a' || charcheck=='n\a' || charcheck=='not applicable'){
				notappmessage=1;
			}
			if (selectedvalue.toLowerCase() == charcheck){
				//alert('match');
				//alert (Nacks[z]);
				/* the pre-requisite field provided an allowed NO response.  */
				prereq=0; /*clear if NACK received in previous question*/
				break;
			}
		}
	//alert('prereqtype'+prereq);
	}
	
	if (checkreq==3){
		/*This is "IF NO THEN's", compare against a list 
		of affirmative responses, and clear requirement if 
		affrimative answers were picked in the perequisite question 
		(makes an answer required on everything but the list of ACKS)*/

		//alert('checkreq:'+checkreq);

		prereq=1;
		for (var z = 0; z < Acks.length; z++) {
			/* check the list of ACK responses */

			charcheck = new String(Acks[z])
			charcheck = charcheck.toLowerCase()

			if (selectedvalue.toLowerCase() == charcheck){

				/* the pre-requisite field provided an allowed YES response.  */
				prereq=0; /*clear if ACK received in previous question*/
				break;
			}
		}
	}

	if (checkreq==4){
		//alert('selectedvalue:'+selectedvalue);
		/*This is "IF OTHER THEN's", compare against a list 
		of OTHERS responses, and clear requirement if 
		'other' answers were picked in the pre-requisite question 
		(makes an answer required on OTHERS answers )*/

		//alert('checkreq:'+checkreq);

		prereq=0;
		for (var z = 0; z < Others.length; z++) {
			/* check the list of OTHERS responses */

			charcheck = new String(Others[z])
			charcheck = charcheck.toLowerCase()
			//alert('charcheck:'+charcheck);

			if (selectedvalue.toLowerCase() == charcheck){
				//alert('match');
				prereq=1; /*require on OTHER received in previous question*/
				break;
			}
		}
	}

return prereq, checkreq;
}


function Check_Email(form) {
	if (form.email1.value.length < 1) {
		alert("Please enter your email address.");
		form.email1.focus();
		return(false);
	}
	else if (window.RegExp) {
		var reg = new RegExp("^([-a-zA-Z0-9._]+@[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+)*$","gi");
	
		if (!reg.test(form.email1.value)) {
			alert("The email address you entered does not appear to be valid.  Please re-enter email address.");
			form.email1.focus();
			return(false);
		}
		else if (form.email2){
			if (form.email1.value != form.email2.value) {
				alert("Email addresses entered do not match.  Please re-enter email address.");
				form.email1.focus();
				return (false);
			}
		}

	}

}


function Check_Email_V2(form, e) {
	//alert(form.elements[e].value);
	if (form.elements[e].value.length < 1) {
		alert("Please enter your email address.");
		form.elements[e].focus();
		return(false);
	}
	else if (window.RegExp) {
		var reg = new RegExp("^([-a-zA-Z0-9._]+@[-a-zA-Z0-9]+(\.[-a-zA-Z0-9]+)+)*$","gi");
	
		if (!reg.test(form.elements[e].value)) {
			alert("The email address you entered does not appear to be valid.  Please re-enter email address.");
			form.elements[e].focus();
			return(false);
		}
		else if (form.email2){
			if (form.elements[e].value != form.email2.value) {
				alert("Email addresses entered do not match.  Please re-enter email address.");
				form.elements[e].focus();
				return (false);
			}
		}

	}

}



function Check_Password(form) {
	if (form.password1.value.length < 1) {
		alert("Please enter a password.");
		form.password1.focus();
		return(false);
	}

	if (form.password2){
		if (form.password1.value != form.password2.value) {
		alert("Passwords do not match  Please try again.");
		form.password1.focus();
		return(false);
		}
	}
}
  



function trim(string) {
var temp = "";
string = '' + string;
splitstring = string.split(" ");
for(h = 0; h < splitstring.length; h++)
temp += splitstring[h];
return temp;
}


function Check_Date(sld){
	var dt=sld;
	if (isDate(dt.value)==false){
		dt.focus()
		return false;
	}
    return true;
 }
	
	
	
	
	/**
	 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
	 */
	// Declaring valid date character, minimum year and maximum year
	var dtCh= "/";
	var minYear=1900;
	var maxYear=2100;
	
	function isInteger(s){
		var i;
	    for (i = 0; i < s.length; i++){   
	        // Check that current character is number.
	        var c = s.charAt(i);
	        if (((c < "0") || (c > "9"))) return false;
	    }
	    // All characters are numbers.
	    return true;
	}
	
	function stripCharsInBag(s, bag){
		var i;
	    var returnString = "";
	    // Search through string's characters one by one.
	    // If character is not in bag, append to returnString.
	    for (i = 0; i < s.length; i++){   
	        var c = s.charAt(i);
	        if (bag.indexOf(c) == -1) returnString += c;
	    }
	    return returnString;
	}

	
	function daysInFebruary (year){
		// February has 29 days in any year evenly divisible by four,
	    // EXCEPT for centurial years which are not also divisible by 400.
	    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
	}
	function DaysArray(n) {
		for (var i = 1; i <= n; i++) {
			this[i] = 31
			if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
			if (i==2) {this[i] = 29}
	   } 
	   return this
	}
	
	function isDate(dtStr){
		var daysInMonth = DaysArray(12)
		var pos1=dtStr.indexOf(dtCh)
		var pos2=dtStr.indexOf(dtCh,pos1+1)
		var strMonth=dtStr.substring(0,pos1)
		var strDay=dtStr.substring(pos1+1,pos2)
		var strYear=dtStr.substring(pos2+1)
		strYr=strYear
		if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
		if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
		for (var i = 1; i <= 3; i++) {
			if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
		}
		month=parseInt(strMonth)
		day=parseInt(strDay)
		year=parseInt(strYr)
		if (pos1==-1 || pos2==-1){
			alert("The date format should be : mm/dd/yyyy")
			return false
		}
		if (strMonth.length<1 || month<1 || month>12){
			alert("Please enter a valid month")
			return false
		}
		if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
			alert("Please enter a valid day")
			return false
		}
		if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
			alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
			return false
		}
		if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
			alert("Please enter a valid date")
			return false
		}
	return true
	}
	

var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*
var Cards = new makeArray(8);
Cards[0] = new CardType(" Master Card", "51,52,53,54,55", "16");
var MC = Cards[0];
Cards[1] = new CardType(" Visa", "4", "13,16");
var VI = Cards[1];
Cards[2] = new CardType("n American Express", "34,37", "15");
var AX = Cards[2];
Cards[3] = new CardType(" DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType(" DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType(" enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType(" JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();
*/



/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function CheckCardNumber(form, CreditCardFormElementIndex) {
var tmpyear;
//alert(form);
//alert(form.CardNumber.value);
//alert('CheckCardNumber(form)');
if (form.ExpYear.value > 96)
tmpyear = "19" + form.ExpYear.value;
else if (form.ExpYear.value < 21)
tmpyear = "20" + form.ExpYear.value;
else {
alert("The Expiration Year is not valid.");
  return(false);
}
tmpmonth = form.ExpMon.options[form.ExpMon.selectedIndex].value;
// The following line doesn't work in IE3, you need to change it
// to something like "(new CardType())...".
// if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
alert("This card has already expired.");
  return(false);
}

/* 
alert (form.elements[CreditCardFormElementIndex].name);
getselectedvalue (form.elements[CreditCardFormElementIndex]); 
alert (selectedvalue);
card = selectedvalue;
*/
card = form.CardType.options[form.CardType.selectedIndex].value;
var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value +
"\", " + tmpyear + ", " + tmpmonth + ");");

cardname = "";
if (retval)
aaacardname = "";
// comment this out if used on an order form
// alert("This card number appears to be valid.");


else {
// The cardnumber has the valid luhn checksum, but we want to know which
// cardtype it belongs to.
for (var n = 0; n < Cards.size; n++) {
if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
cardname = Cards[n].getCardType();
break;
   }
}
if (cardname.length > 0) {
alert("This looks like a " + cardname + " number, not a " + card + " number.");
return(false);
}
else {
alert("This card number is not valid.");
  return(false);
      }
   }
}
/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year, 
                                        int month])
cardtype    : type of card, eg: MasterCard, Visa, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VisaCard = new CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
var n;
var argv = CardType.arguments;
var argc = CardType.arguments.length;

this.objname = "object CardType";

var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

this.setCardNumber = setCardNumber;  // set CardNumber method.
this.setCardType = setCardType;  // setCardType method.
this.setLen = setLen;  // setLen method.
this.setRules = setRules;  // setRules method.
this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

this.setCardType(tmpcardtype);
this.setLen(tmplen);
this.setRules(tmprules);
if (argc > 4)
this.setExpiryDate(argv[3], argv[4]);

this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
this.getCardType = getCardType;  // getCardType method.
this.isCardNumber = isCardNumber;  // isCardNumber method.
this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
this.luhnCheck = luhnCheck;// luhnCheck method.
return this;
}

/*************************************************************************\
boolean checkCardNumber([String cardnumber, int year, int month])
return true if cardnumber pass the luhncheck and the expiry date is
valid, else return false.
\*************************************************************************/
function checkCardNumber() {
var argv = checkCardNumber.arguments;
var argc = checkCardNumber.arguments.length;
var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
var year = (argc > 1) ? argv[1] : this.year;
var month = (argc > 2) ? argv[2] : this.month;

this.setCardNumber(cardnumber);
this.setExpiryDate(year, month);

if (!this.isCardNumber())
return false;
if (!this.isExpiryDate())
return false;

return true;
}
/*************************************************************************\
String getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
return this.cardtype;
}
/*************************************************************************\
String getExpiryDate()
return the expiry date.
\*************************************************************************/
function getExpiryDate() {
return this.month + "/" + this.year;
}
/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return
false.
\*************************************************************************/
function isCardNumber() {
var argv = isCardNumber.arguments;
var argc = isCardNumber.arguments.length;
var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
if (!this.luhnCheck())
return false;

for (var n = 0; n < this.len.size; n++)
if (cardnumber.toString().length == this.len[n]) {
for (var m = 0; m < this.rules.size; m++) {
var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
if (headdigit == this.rules[m])
return true;
}
return false;
}
return false;
}

/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate() {
var argv = isExpiryDate.arguments;
var argc = isExpiryDate.arguments.length;

year = argc > 0 ? argv[0] : this.year;
month = argc > 1 ? argv[1] : this.month;

if (!isNum(year+""))
return false;
if (!isNum(month+""))
return false;
today = new Date();
expiry = new Date(year, month);
if (today.getTime() > expiry.getTime())
return false;
else
return true;
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
argvalue = argvalue.toString();

if (argvalue.length == 0)
return false;

for (var n = 0; n < argvalue.length; n++)
if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
return false;

return true;
}

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
var argv = luhnCheck.arguments;
var argc = luhnCheck.arguments.length;

var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

if (! isNum(CardNumber)) {
return false;
  }

var no_digit = CardNumber.length;
var oddoeven = no_digit & 1;
var sum = 0;

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)
return true;
else
return false;
}

/*************************************************************************\
ArrayObject makeArray(int size)
return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
this.size = size;
return this;
}

/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
this.cardnumber = cardnumber;
return this;
}

/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
this.cardtype = cardtype;
return this;
}

/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
this.year = year;
this.month = month;
return this;
}

/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
// Create the len array.
if (len.length == 0 || len == null)
len = "13,14,15,16,19";

var tmplen = len;
n = 1;
while (tmplen.indexOf(",") != -1) {
tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
n++;
}
this.len = new makeArray(n);
n = 0;
while (len.indexOf(",") != -1) {
var tmpstr = len.substring(0, len.indexOf(","));
this.len[n] = tmpstr;
len = len.substring(len.indexOf(",") + 1, len.length);
n++;
}
this.len[n] = len;
return this;
}

/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
// Create the rules array.
if (rules.length == 0 || rules == null)
rules = "0,1,2,3,4,5,6,7,8,9";
  
var tmprules = rules;
n = 1;
while (tmprules.indexOf(",") != -1) {
tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
n++;
}
this.rules = new makeArray(n);
n = 0;
while (rules.indexOf(",") != -1) {
var tmpstr = rules.substring(0, rules.indexOf(","));
this.rules[n] = tmpstr;
rules = rules.substring(rules.indexOf(",") + 1, rules.length);
n++;
}
this.rules[n] = rules;
return this;
}



/**
 * DHTML phone number validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */

// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}


function checkInternationalPhone(strPhone){
s=stripCharsInBag(strPhone,validWorldPhoneChars);
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

function checkPhoneNoPhoneChars(strPhone){
s=stripCharsInBag(strPhone,'');
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}


function Check_Phone_type1(sld){
	var Phone=sld;
	//alert(Phone.name);
	//alert(Phone.value);
	
	if ((Phone.value==null)||(Phone.value=="")){
		alert("Please enter your phone number");
		Phone.focus();
		return false;
	}
	if (checkInternationalPhone(Phone.value)==false){
		alert("Please enter a valid phone number");
		//Phone.value=""
		Phone.select();
		Phone.focus();
		return false;
	}
	return true;
 }

function Check_Phone_type2(sld){
	var Phone=sld;
	//alert(Phone.name);
	//alert(Phone.value);
	
	if ((Phone.value==null)||(Phone.value=="")){
		alert("Please enter your phone number");
		Phone.focus();
		return false;
	}
	if (checkPhoneNoPhoneChars(Phone.value)==false){
		alert("Please enter the phone number using only numeric characters");
		//Phone.value=""
		Phone.select();
		Phone.focus();
		return false;
	}
	return true;
 }
 
