//------------------------------------------------------------------------------------------ 

/* ---------------------------------------------------------------------------------------
  Page Overview:
  =============	
  We use arrays of form field names to indicate which validation functions(s) should be
  run against each form field (Array names correspond to the validation function names).  
  This allows us to check the potential fields that may be included in a particular page, 
  without knowing the specific form field sets that reside in each individual page.  

  ToDo:  1) We should be able accomplish this same functionality, but with the function calls
		 controlled by the form fields themselves.  This design is more intuitive, and
		 from a performance standpoint, is lighter than instantiating Hashtables with every
		 single field value that exists.
		 2) Phone Number validation
		 3) Text, no numbers, etc... verification (eg: City, Country)
--------------------------------------------------------------------------------------- */


/* ---------------------------------------------------------------------------------------
Form field 'name'/'alert name' Hashtables used by validation functions.  
Hashtables are named [function_name] + "Lst"  
Note: 	In Javascript, Objects are Hashtables and vice versa
--------------------------------------------------------------------------------------- */
//Blank test
var validRequiredLst = { "first_name" : "First Name", "last_name" : "Last Name", 
						 "acct_password" : "Password", "street1" : "Street", "city" : "City", 
						 "country" : "Country", "message" : "Message", "resume" : "Resume",
  						"loc_lost" : "Where was the card lost/stolen or captured?",
						 "loc_last_used" : "Where did you last use the card?", 
						 "borrower_name" : "Borrower's Name", "time_of_call" : "Time of Call",
						 "spoke_to" : "Who you spoke to", "atm_location" : "ATM Location",
						 "atm_number" : "ATM Number", "pc_occurrence_location" : "Specific Location of Occurrence",
						 "pc_orig_trans_amount" : "Original Transaction Amount", 
						 "pc_amount_needed" : "Provisional Credit Amount Needed", 
						 "pc_fulldesc" : "Full Description",
						 "dwt_city" : "Member City",
						 "dwt_bank_name" : "Wire to Bank Name", "dwt_bank_city" : "Wire to Bank City",
						 "dwt_fc_account_name" : "Further Credit Account Name",
						 "dwt_fc_street1" : "Futher Credit \n'Street Address of Beneficiary'", 
						 "dwt_fc_city" : "Futher Credit \n'City'", 
						 "dwt_fc_zip" : "Futher Credit \n'Zip Code'", 
						 "dwt_fc2_account_name" : "Final Credit Account Name",
						 "dwt_fc2_street1" : "Final Credit \n'Street Address of Beneficiary'", 
						 "dwt_fc2_city" : "Final Credit \n'City'", 
						 "dwt_fc2_zip" : "Final Credit \n'Zip Code'", 		 
						 "dwt_wire_amount" : "Wire Amount",
						 "dwt_wire_fee" : "Wire Fee",
						 "zip" : "Zip Code",
						 "business_name" : "Business Name",
						 "card_user_full_name" : "Account Representative First and Last Name"
					   }; 
//Email test
var validEmailLst = { "email" : "Email" };
//Date test 
var validDateLst = { "aft_date" : "Date" , "eff_date" : "Effective Date" , "missing_date" : "Date Discovered Missing", 
					 "last_used_date" : "Card Last Used", "pc_occurrence_date" : "Occurrence Date", "dob_date" : "Birth Date" };
//Phone number test
var validPhoneLst = { "daytime_phone" : "Daytime Phone" ,  "work_phone" : "Work Phone"};
//Numeric test 
var validNumLst = { //Used globally
					"account" : "Account" , 
					//Auto Funds Transfer
					"aft_accountFrom" : "Transfer Funds From: Account", 
					"aft_accountFromSuf" : "Transfer Funds From: Suffix",
					"aft_accountTo" : "Transfer Funds To: Account",
					"aft_accountToSuf" : "Transfer Funds To: Suffix", 
					//Auto Loan Payment
					"alp_accountFrom" : "Transfer Funds From: Account", 
					"alp_accountFromSuf" : "Transfer Funds From: Suffix", 
					"alp_accountTo" : "Transfer Funds To: Account", 
					"alp_accountToSuf" : "Transfer Funds To: Suffix",
					//Open Certificate
					"cert_accountTsfFrom" : "Transfer Account", 
					"cert_accountTsfFromSuf" : "Transfer Suffix",
					//Open Secondary Shares
					"second_account" : "Transfer Account", 
					"second_suffix" : "Transfer Suffix", 
					//Open MMA
					"mma_account" : "Transfer Account", 
					"mma_suffix" : "Transfer Suffix",
					//Event RSVP
					"number_to_attend" : "Number to Attend", 
					//Currency is just number for now
					"aft_amount" : "Amount", "alp_amount" : "Amount", 
					"cert_amount" : "Deposit Amount", "second_amount" : "Deposit Amount",
					"mma_depAmount" : "Deposit Amount",
					//Lost stolen card
					"amt_last_purchase" : "What is the amount of the last purchase and withdrawal?",
					"lost_card_digits" : "Last 4 digits of Card Number",
					//FHAP App
					"loan_amount" : "Loan Amount",
					//Wire transfer
					"dwt_fc_account_num" : "Furhter Credit Account Number", 
					"dwt_fc2_account_num" : "Final Credit Account Number", 
					"dwt_bank_routing" : "ABA/Routing Number", 
					"dwt_zip" : "Member Zip Code"
				  };
//Currency test 
var validCurrencyLst = { /*"aft_amount" : "Amount", "alp_amount" : "Amount", 
						 "cert_amount" : "Certificate Amount", "second_amount" : "Deposit Amount",
						 "mma_depAmount" : "Deposit Amount"*/
					   }; 
//Radio button Test
var isRadioCheckedLst = { "aft_frequency" : "Frequency", "closeAcct_reason" : "Reason for Closing Account", 
						  "mma_type" : "Money Market Type", "card_type" : "Card Type", 
						  "lost_desc" : "How was it Lost", "after_hours" : "Call After Hours", "keep_pin" : "Keep PIN", 
						  "pin_stolen" : "PIN Stolen", "police_report" : "Reported to Police",
						  "atm_problem" : "Problem with ATM", "pc_dep_or_wd" : "Deposit or Withdrawal",
						  "pc_atm_or_sc" : "ATM or Service Center", "checking_savings" : "Savings or Checking",
						  "cert_type" : "Certificate Type"
						};

//Checkbox Test
var isCheckboxCheckedLst = { "td_agree" : "Terms & Disclosure Agreement", "otl_optin" : "Over The Limit" };

//Dropdown Test
var isDropDownSelectedLst = { "cert_term" : "Certificate Term", "last_used_date" : "Approximate date last used", 
							  "missing_date" : "Approximate date discovered missing", "loan_program" : "Loan Program", 
							  "dwt_state" : "State", "dwt_bank_state" : "Wire to Bank State",
							  "dwt_fc_state" : "Futher Credit \n'State'", "dwt_fc2_state" : "Final Credit \n'State'"
							};

/* ------------------------------------------------------------------------------------- */


/* ---------------------------------------------------------------------------------------
   Validation functions  
--------------------------------------------------------------------------------------- */
//Check for blank fields 
function validRequired(formField, fieldLabel, required) {
	var result = true;

	if (required && formField.value == "") {
		alert('Please enter a value for the "' + fieldLabel +'" field.');
		formField.focus();
		result = false;
	}	
	
	return result;
}

//Validate e-mail address (part I)
function validEmail(formField, fieldLabel, required) {
	var result = true;
	
	if (required && !validRequired(formField, fieldLabel, required))
		result = false;

	if (result && ((formField.value.length < 3) || !isEmailAddr(formField.value)))	{
		alert("Please enter a complete email address in the form: yourname@yourdomain.com");
		formField.focus();
		result = false;
	}
   
  return result;
}
//Validate e-mail address (part II)
function isEmailAddr(email) {
  	var result = false;
  	var theStr = new String(email);
  	var index = theStr.indexOf("@");

  	if (index > 0) {
    	var pindex = theStr.indexOf(".",index);
    	if ((pindex > index + 1) && (theStr.length > pindex+1))
			result = true;
  	}

  	return result;
}
var trimcnt=1;
//Validate Date (Drop down boxes)
function validDate1(formField, fieldLabel, required) {
	var result = true;
	var selection = formField.options[formField.options.selectedIndex];
	var dateSection = formField.name.substring(formField.name.length-1, formField.name.length);
	var dateSectionName = { 1 : "Month", 2 : "Day", 3 : "Year" };
		
	if (required && isNaN(parseInt(selection.text))) {
		alert('Please enter a ' + dateSectionName[dateSection] + ' value for the "' + fieldLabel +'" field.');
		result = false;
		formField.focus();		
	}

	return result;
}
//Validate Date (Format: YYYY/MM/DD)
function validDate2(formField, fieldLabel, required) {
	var result = true;

	if (required && !validRequired(formField, fieldLabel, required))
		result = false;
  
 	if (result) {
 		var elems = formField.value.split("/");
 		
 		result = (elems.length == 3); //should be three components
 		
 		if (result) {
 			var month = parseInt(elems[0], 10);
  			var day = parseInt(elems[1], 10);
 			var year = parseInt(elems[2], 10);
			result = allDigits(elems[0]) && (month > 0) && (month < 13) &&
					 allDigits(elems[1]) && (day > 0) && (day < 32) &&
					 allDigits(elems[2]) && ((elems[2].length == 2) || (elems[2].length == 4));
 		}
 		
  		if (!result) {
			alert('Please enter a date in the form: MM/DD/YYYY for the "' + fieldLabel +'" field.');
			formField.focus();		
		}
	} 
	return result;
}

//Validate Phone Number
function validPhone(formField, fieldLabel, required) {
	var result = true;
	var numDigits;
	var phoneSection = formField.name.substring(formField.name.length-1, formField.name.length);

	if (required && !validRequired(formField, fieldLabel, required)) {
		result = false;
	}

	else if (!validNum(null, formField, fieldLabel, true))
		result = false;  

	if (result) {
		if (phoneSection != 3 && formField.value.length < 3) {
			numDigits = 3;
			result = false;
		}
		else if (phoneSection == 3 && formField.value.length < 4) {
			numDigits = 4;
			result = false;
		}
	
		if (!result) {
			alert('Please enter a ' + numDigits + ' digit number for this part of the "' + fieldLabel +'" field.');
			formField.focus();
		}
	}

	return result;
}

//Numeric Validation (Uses Global I & II)
function validNum(theForm, formField, fieldLabel, required) {
	var result = true;
	
	if (required && !validRequired(formField, fieldLabel, required)) {
		result = false;	
	}
  
 	if (result) {
 		if (!allDigits(formField.value)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
			formField.focus();		
			result = false;
		}
		else if (theForm && theForm["range_" + formField.name] && !numRangeCheck(formField, theForm["range_" + formField.name].value, fieldLabel)) {
			formField.focus();		
			result = false;
		}
	} 
	
	return result;
}

//Integer Validation (Same as Numeric Validation) - This is not used by any functions
function validInt(formField, fieldLabel, required) {
	var result = true;

	if (required && !validRequired(formField, fieldLabel, required))
		result = false;
  
 	if (result) {
 		var num = parseInt(formField.value,10);
 		if (isNaN(num)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
			formField.focus();		
			result = false;
		}
	} 
	
	return result;
}

//Currency Validation (Uses Global I & II)
function validCurrency(formField, fieldLabel, required) {
	var result = true;

	if (required && !validRequired(formField, fieldLabel, required)) 
		result = false;

 	if (result) {
 		var elems = formField.value.split("."); 		

		result = (elems.length == 2); //should be two components 		

 		if (result) {
 			var dollars = parseInt(elems[0], 10);
  			var cents = parseInt(elems[1], 10);
			result = (allDigits(elems[0]) && allDigits(elems[1]) && elems[1].length == 2 );
 		}

 		if (!result) {
 			alert('Please enter a dollar amount in the form: "100.00" for the "' + fieldLabel +'" field.');
			formField.focus();		
			result = false;
		}
	} 
	
	return result; 
}

//Check to see if field value is within the required range
function numRangeCheck(formField, range, fieldLabel) {
	var result = true;
	
	var lowerLim = parseInt(range.substring(0, range.indexOf(",")));
	var upperLim = parseInt(range.substring(range.indexOf(",")+1, range.length));
	var fieldVal = parseInt(formField.value);

	if (fieldVal < lowerLim) {
		alert('You`ve entered a value of "' +fieldVal+'", which is below the minimum of "' + lowerLim + '" for the: "' + fieldLabel +'" field.');
		result = false;
	}	
	else if (fieldVal > upperLim && upperLim != '~') {
		alert('You`ve entered a value of "' +fieldVal+'", which is above the maximum of "' + upperLim + '" for the:  "' + fieldLabel +'" field.');
		result = false;
	}
	else
		result = true;
	
	return result; 
}

//Radio Button Test (Make sure one of them is checked)
function isRadioChecked(formField, fieldLabel, required) {	
	var result = false;
	for (var i=0; i < formField.length; i++) 
		if (formField[i].checked)  
			result = true;

	if (!result)
		alert('Please choose one the options for "' + fieldLabel +'" ');
	
	return result;
}

//Checkbox Test (Make sure it is checked)
function isCheckboxChecked(formField, fieldLabel, required) {	
	var result = false;
	if (formField.checked)  
		result = true;

	if (!result)
		alert('Please check the "' + fieldLabel +'" box If you agree to these');
	
	return result;
}

//Drop down menu test (Make sure option is selected)
function isDropDownSelected(formField, fieldLabel, required) {	
	var result = true;
	var dropDownText = formField.options[formField.options.selectedIndex].text.toLowerCase();

	if (dropDownText == ""  || dropDownText.indexOf("please select") >= 0) {
		alert('Please choose a value for "' + fieldLabel +'" ');
		formField.focus();
		result = false;
	}
	
	return result;
}

//Global I (Pass 'charset' to charset checker)
function allDigits(str) {
	return inValidCharSet(str, "0123456789");
}

//Global II (Charset checker)
function inValidCharSet(str, charset) {
	var result = true;

	//Note: doesn't use regular expressions to avoid early Mac browser bugs	
	for (var i=0; i < str.length; i++)
		if (charset.indexOf(str.substr(i, 1))< 0)	{
			result = false;
			break;
		}
	
	return result;
}

//Trim functions
function ltrim (s1) {
	return s1.replace(/^\s*/, "")
}
function rtrim (s2) {
	return s2.replace(/\s*$/, "");
}
function trim (s3) {
	return rtrim(ltrim(s3));
}
/* --------------------------------------------------------------------------------------- */


/* ---------------------------------------------------------------------------------------
  Main function:  RUN VALIDATION!
--------------------------------------------------------------------------------------- */
function validateForm(theForm) {
	/* Loop through form fields and test each field for different types of validation */
	for (var e=0; e < theForm.elements.length; e++) {
	
		var i, field;
	
		//Check blank 
		for (var fieldName in validRequiredLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !validRequired(field, validRequiredLst[fieldName], true)) {					
					return false;
				}
			}
		}	
		//Check e-mail
		for (var fieldName in validEmailLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !validEmail(field, validEmailLst[fieldName], true))
					return false;
			}
		} 
		//Check Numeric
		for (var fieldName in validNumLst) {

			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !validNum(theForm, field, validNumLst[fieldName], true))
					return false;
			}
		}
		//Check Currency
		for (var fieldName in validCurrencyLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !validCurrency(field, validCurrencyLst[fieldName], true)) {
					return false;
				}
			}
		} 	
		//Check dates
		for (var fieldName in validDateLst) {
			var formFieldName = theForm.elements[e].name;
			if (fieldName == formFieldName.substring(0, formFieldName.length-1)) {				
				field = theForm[formFieldName]; 
				if (field && !validDate1(field, validDateLst[fieldName], true)) {
					return false;
				}
			}
		} 
		//Check phone numbers
		for (var fieldName in validPhoneLst) {
			var formFieldName = theForm.elements[e].name;
			var required = true;
/*			if (formFieldName.substring(0, formFieldName.length-1) == "work_phone") {
				required = false;
			} */
			if (fieldName == formFieldName.substring(0, formFieldName.length-1)) {				
				field = theForm[formFieldName]; 
				if (field && !validPhone(field, validPhoneLst[fieldName], required)) {
					return false;
				}
			}
		}
		//Check radio button sets
		for (var fieldName in isRadioCheckedLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !isRadioChecked(field, isRadioCheckedLst[fieldName], true)) {
					return false;
				}
			}
		} 
		//Check checkboxes
		for (var fieldName in isCheckboxCheckedLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !isCheckboxChecked(field, isCheckboxCheckedLst[fieldName], true)) {
					return false;
				}
			}
		}
		//Check dropdown
		for (var fieldName in isDropDownSelectedLst) {
			if (fieldName == theForm.elements[e].name) {
				field = theForm[fieldName]; 
				if (field && !isDropDownSelected(field, isDropDownSelectedLst[fieldName], true)) {
					return false;
				}
			}
		}
	} //for: form elements 

	return true;
}
/* --------------------------------------------------------------------------------------- */

