/*--- 
************************************************************************************************

@name			js_SubmitForm.js

@description  	this module performs various validation edit checks.  it has been
				built to mirror the cf template mod_validation.cfm. the following edit 
				checks are supported:
				
					creditcard       -  requires valid amex, disc, mc, or visa format *
					date             -  requires mm/dd/yyyy format
					email            -  requires valid email format
					fieldequality    -  requires two fields to contain equal values **
					filename         -  requires valid file name
					float            -  requires valid rational number
					floatcomma		 -  requires valid number (accepts commas)
					integer          -  requires valid integer
					phone            -  requires nnn-nnn-nnnn format
					range            -  requires value to be between two values ***
					requirecheck     -  requires at least one of many checkboxes to be checked
					requirecheckone  -  requires a single checkbox to be checked
					requireradio     -  requires radio button to be checked
					requireselect    -  requires select box option to be chosen
					requiretext      -  requires value in text field
					ssn              -  requires nnn-nn-nnnn format
					year             -  requires value to be between 1800 and 2100
					zipcode          -  requires nnnnn or nnnnn-nnnn format
					
				*	also requires name of field containing card type
				**	also requires name of other field being compared
				***	also requires start and end range values	 


@param			form (object) - form object to which onSubmit is attached (use reserved
    			"this" in function call)
				 		
@param			ObjectList (string) - text string containing command instructions. 
				instructions are formatted in comma-delimited lists within a 
				semi-colon-delimited list.  the values in the inner lists
				are [field name],[edit check type],[name to use in error text],
				    [optional 4th value],[optional 5th value]
				
				ex) to require a field named txtTest and ensure that the value 
				    it contains is a valid integer, ObjectList would contain the 
					following value:
					
					txtTest,requiretext,Test Field;txtTest,integer,Test Field


@return			(boolean) - true, if all edit checks pass
						  - false, if any edit check fails (also causes alert box with
						     error messages to be displayed)

							 
@author			john dugan
@authoremail	john.dugan@weberize.com

@copyright		Copyright (c) 2000 by Weberize.  All rights reserved.
@date			12/31/2000
				
************************************************************************************************
---*/


	function SubmitForm(form, ObjectList) {
	
		//-------------------------------------------------------//
		//---  set variables used by this script              ---//
		//-------------------------------------------------------//
		ErrorMessage = ""
		CarriageReturn = "\r\n"
				
		
		//--------------------------------------------------//
		//---  alert developer if last character is ';'  ---//
		//--------------------------------------------------//
		if (ObjectList.charAt(ObjectList.length - 1) == ";")
			alert("Last character cannot be a semi-colon");
		
		
		//-------------------------------------------------//
		//---  parse "object triples" into outer array  ---//
		//-------------------------------------------------//
		ObjectOuterArray = ObjectList.split(";")
		
		
		//------------------------------------------------------//
		//---  for each "object triple" in outer array,      ---//
		//---   set object name, evaluate requirement,       ---//
		//---   and build alert box for errors encountered.  ---//
		//------------------------------------------------------//		
		for (x=0; x<ObjectOuterArray.length; x++) {
			
			ObjectInnerArray = ObjectOuterArray[x].split(",")
			
			ThisObject = eval("form." + ObjectInnerArray[0])
			
			
			switch (ObjectInnerArray[1].toLowerCase()) {
				
				//---------------------------//
				//---  check credit card  ---//
				//---------------------------//
				case "creditcard":
					OtherObject = eval("form." + ObjectInnerArray[3]);
					
					if (!checkcreditcard(ThisObject.value, OtherObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid credit card number." + CarriageReturn
					}
			  		break
			
				//--------------------//
				//---  check date  ---//
				//--------------------//
				case "date":
					if (!checkdate(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid date (format = mm/dd/yyyy)." + CarriageReturn
					}
			  		break
			
				//---------------------//
				//---  check email  ---//
				//---------------------//
				case "email":
					if (!checkemail(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid email." + CarriageReturn
					}
					break  
				
				//-------------------------//
				//---  check file name  ---//
				//-------------------------//
				case "filename":
					if (!checkfilename(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid file name (format filename.ext)." + CarriageReturn
					}
					break  
				
				//---------------------------------------//
				//---  check equality between fields  ---//
				//---------------------------------------//
				case "fieldequality":
					OtherObject = eval("form." + ObjectInnerArray[3]);
										
					if (ThisObject.value != OtherObject.value) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " and " + ObjectInnerArray[4] + " must be equal." + CarriageReturn
					}
					break  
				
				//-------------------------------//
				//---  check rational number  ---//
				//-------------------------------//
				case "float":
					if (!checknumber(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a rational number." + CarriageReturn
					}
					break  
				//-------------------------------//
				//---  check valid number  ---//
				//-------------------------------//
				case "floatcomma":
					if (!checknumbercomma(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid number." + CarriageReturn
					}
					break  				
				//-----------------------//
				//---  check integer  ---//
				//-----------------------//
				case "integer":
					if (!checkinteger(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be an integer." + CarriageReturn
					}
					break  
				
				//---------------------//
				//---  check phone  ---//
				//---------------------//
				case "phone":
					if (!checkphone(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid phone (format = 555-555-5555)." + CarriageReturn
					}
					break  
					
				//---------------------//
				//---  check range  ---//
				//---------------------//
				case "range":
					minvalue = ObjectInnerArray[3].toLowerCase();
					maxvalue = ObjectInnerArray[4].toLowerCase();
					
					if (!checkrange(ThisObject.value.toLowerCase(),minvalue,maxvalue)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be between " + minvalue + " and " + maxvalue + "." + CarriageReturn
					}
					break  
				
				//---------------------------//
				//---  require check box  ---//
				//---------------------------//
				case "requirecheck":
					
					//---  loop over checkbox and look for checked option  ---//
					var bChecked = false;
					for (var i=0; i < ThisObject.length; i++ ) {
						
						if (ThisObject[i].checked) {
						
							bChecked = true;
							break;
						}
					}
						
					//---  run normal check  ---//
					if (!bChecked) {
						ErrorMessage += ObjectInnerArray[2] + " must be specified." + CarriageReturn;
					}
					break  	
				
				//---------------------------//
				//---  require check box  ---//
				//---------------------------//
				case "requirecheckone":
					
					//---  run normal check  ---//
					if (!ThisObject.checked) {
						ErrorMessage += ObjectInnerArray[2] + " must be specified." + CarriageReturn;
					}
					break  	
				
				//------------------------------//
				//---  require radio button  ---//
				//------------------------------//
				case "requireradio":
					
					//---  loop over radio and look for checked option  ---//
					var bChecked = false;
					for (var i=0; i < ThisObject.length; i++ ) {
						
						if (ThisObject[i].checked) {
						
							bChecked = true;
							break;
						}
					}
					
					//---  run normal check  ---//
					if (!bChecked) {
						ErrorMessage += ObjectInnerArray[2] + " must be specified." + CarriageReturn;
					}
					break  	
				
				//----------------------------//
				//---  require select box  ---//
				//----------------------------//
				case "requireselect":

					//---  find first option selected  ---//
					var ThisObject_value = "";
					for (var i=0; i < ThisObject.options.length; i++ ) {

						if (ThisObject.options[i].selected) {
						
							ThisObject_value = ThisObject.options[i].value;
							break;
						}
					}
					
					//---  run normal check  ---//
					if (!requireselect(ThisObject_value)) {
						if (ErrorMessage == "") {
							ThisObject.focus();
						}
						ErrorMessage += ObjectInnerArray[2] + " must be specified." + CarriageReturn;
					}
					break  	
				
				//--------------------------------------//
				//---  require textbox or text area  ---//
				//--------------------------------------//
				case "requiretext":
					if (!requiretext(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be specified." + CarriageReturn
					}
					break  
				
				//---------------------------//
				//---  require valid ssn  ---//
				//---------------------------//
				case "ssn":
					if (!checkssn(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid SSN (format = 555-55-5555)." + CarriageReturn
					}
					break
				
				//----------------------------//
				//---  require valid year  ---//
				//----------------------------//
				case "year":
					if (!checkyear(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid year." + CarriageReturn
					}
					break
				
				//-----------------------------//
				//---  require us zip code  ---//
				//-----------------------------//
				case "zipcode":
					if (!checkzip(ThisObject.value)) {
						if (ErrorMessage == "") {
							ThisObject.focus()
						}
						ErrorMessage += ObjectInnerArray[2] + " must be a valid ZIP code (format = 55555 or 55555-5555)." + CarriageReturn
					}
					break
				
				//--------------------------------------//
				//---  if no match, alert developer  ---//
				//--------------------------------------//
				default:
					alert(ObjectInnerArray[1].toLowerCase() + " is not a valid requirement type.")
					
			}
		}
		
		//------------------------------------------------------//
		//---  if ErrorMessage not null, create alert box.   ---//
		//------------------------------------------------------//
		if (ErrorMessage != "") {
			alert(ErrorMessage)
			return false
		}
		
		return true
	}
	
