//--------------------------------------------------------------------
// Module Name: validate.js
// Created by:  G. Ajamian
// Copywrite of G. Ajamian and the Arabic Baptist Church.
//--------------------------------------------------------------------
//
// This script is called when the Submit button is clicked to validate
// the form before populating the database and sending emails
//
//--------------------------------------------------------------------
// TODO:: fix error messages. too messy and scattered with different phillosophies //



//---------------------------------------------------------------
// Validate the entire form.  Return false if something is wrong.
// Main Function
//---------------------------------------------------------------
function ValidateRegStep1(frm) 
{
	var theElement;
	var Err;


	// Now make sure that all the fields in the frm contain a
	// value.  We deliberately skip the first element, because we know
	// it isn't a text field and the second field is the person's title. 
	// which is also not a textfield.

	// All form elements that are of type text input require validation to prevent from hijacking the dB
	// Validate Required Fields in HHH
	if (0 == document.getElementById("FirstName").value)		{ alertUser(document.getElementById("FirstName"), "Please provide the First Name");  return false; }
	if (0 == document.getElementById("LastName").value)			{ alertUser(document.getElementById("LastName"), "Please provide the Last Name");  return false; }
	if (0 == document.getElementById("Address").value)			{ alertUser(document.getElementById("Address"), "Please provide the Street Address");  return false; }
	if (0 == document.getElementById("City").value)				{ alertUser(document.getElementById("City"), "Please provide the City Name");  return false; }
	if (0 == document.getElementById("StateOrProvince").value)	{ alertUser(document.getElementById("StateOrProvince"), "Please provide the State / Province Name");  return false; }
	if (!emailCheck(frm.Email.value)) { frm.Email.focus(); return false; }


	// Note: if field has a non empty value, verify that it is valid
	frm.FirstName.value = scrubStr(frm.FirstName.value);
	frm.LastName.value = scrubStr(frm.LastName.value);
	frm.Address.value = scrubStr(frm.Address.value);
	frm.City.value = scrubStr(frm.City.value);
	frm.StateOrProvince.value = scrubStr(frm.StateOrProvince.value);
	
	frm.PostalCode.value = scrubStr(frm.PostalCode.value);
	frm.Country.value = scrubStr(frm.Country.value);

	
	// validate Phone number
	Err = checkPhone(frm.PhoneNumber.value, true);
	if (0 != Err.length) { alertUser(frm.PhoneNumber, Err); return false; }

	return true;
}

//---------------------------------------------------------------
// ValidateRegStep2 
//
// return true only if the following conditions are true:
// 1) the user made a selection
// 2) if the user selected "Hotel" verify that they entered 
//    a valid number of rooms
//---------------------------------------------------------------

function ValidateRegStep2(frm) 
{
	var bSelectedAccom = false;
	
	for (i=frm.AccomType.length-1; i > -1; i--) {
		if (frm.AccomType[i].checked) {
			bSelectedAccom = true;
		}
	}

	if (!bSelectedAccom) { 
		alertUser(frm.AccomType[0], "Please select an accomodation");  
		return false; 
	}
	
	// if hotel is selecte, validate number of rooms
	if (frm.AccomType[2].checked){
		Err = checkNoRoomsReq(frm.QtyHotelRoom.value, false);
		if (0 != Err.length) { alertUser(frm.QtyHotelRoom, Err); frm.QtyHotelRoom.value=""; return false; }
	}
	
	return true;
}


//---------------------------------------------------------------
//checkNoRoomsReq
//
// the user selected "Hotel" ... verify that they entered 
// a valid number of rooms. return true if:
// Entered a valid integeri.e. 0 < value < 9 (TBC) 
// str = string to test
// optional = boolean value. true=optional; false=required
//---------------------------------------------------------------
function checkNoRoomsReq (str, optional)
{
	var error = "";
	if ((str == "") && (!optional)) {
		error = "Please enter the number of rooms needed.\nYou can select up to 4 rooms";
		return error;
	}

 	if (isNaN(str)) {
		error = "Invalid character used.\nPlease enter a number between 1 - 4";
		return error;
    }
	
	if (str < 1) {
		error = "Please enter a number between 1 - 4";
		return error;
 	}
	
	if (str > 4) {
		error = "Please enter a number between 1 - 4";
		return error;
 	}

	return error;
}


//---------------------------------------------------------------
// ValidateRegStep3 
//  return true if all is empty or all is full
//  else return false
//
//	must also check the case when all rows are blank
//	i.e. one row must contain valid data
//
//  must contain one row of data to be valid.
//  disabled submit button while validating to prevent user 
//     from clicking the button multiple times.
//---------------------------------------------------------------
function ValidateRegStep3(tblID)
{
	var oneRowContainsData = false;
	if (tblID == null){
		var tbl = document.getElementById('tblReg');
	}
	else {
 		var tbl = document.getElementById(tblID);
	}
	
	var elementI = tbl.rows.length;
	document.getElementById("totRegistered").value = elementI;
	document.getElementById("SubmitRegistration").disabled = true;

	
	for (var i=1; i < elementI; i++) 
	{
		(0 == document.getElementById("RegFName"+i).value)	? val  = 0x00 : val  = 0x01;
		(0 == document.getElementById("RegLName"+i).value)	? val |= 0x00 : val |= 0x02;
		(0 == document.getElementById("RegGender"+i).value)	? val |= 0x00 : val |= 0x04;
		(0 == document.getElementById("RegDay"+i).value)	? val |= 0x00 : val |= 0x08;
		(0 == document.getElementById("RegAge"+i).value)	? val |= 0x00 : val |= 0x10;

		if ((val == 0x00) && (1 < i)) 				// row completely empty
		{
			continue;
		}

		else if (val == 0x1f)		// row completely full
		{
			oneRowContainsData = true;
			// scrub row containing text input (not needed for pulldowns)
			document.getElementById("RegFName"+i).value = scrubStr (document.getElementById("RegFName"+i).value);
			document.getElementById("RegLName"+i).value = scrubStr (document.getElementById("RegLName"+i).value);
			continue;
		}

		else					
		{
			if (!(val & 1))			alertUser(document.getElementById("RegFName"+i), "Please provide the First Name");
			else if (!(val & 0x02))	alertUser(document.getElementById("RegLName"+i), "Please provide the Last Name");
			else if (!(val & 0x04))	alertUser(document.getElementById("RegGender"+i), "Please provide the Gender");
			else if (!(val & 0x08))	alertUser(document.getElementById("RegDay"+i), "Please Select one of the Registration Plans");
			else if (!(val & 0x10))	alertUser(document.getElementById("RegAge"+i), "Please provide the Age");

			document.getElementById("SubmitRegistration").disabled = false; // re-enable submit button
			return false;
		}
	}

	if (false == oneRowContainsData) 
	{
		alert ("Registration Step 3 must have at least one person's registration information!");
		document.getElementById("SubmitRegistration").disabled = false; // re-enable submit button
		return false;
	}

	if (document.getElementById("SpecialNotes")) {
		document.getElementById("SpecialNotes").value = scrubStr(document.getElementById("SpecialNotes").value);
	}

	return true;
}

//---------------------------------------------------------------
// Make sure that a required field is filled in.
//---------------------------------------------------------------
function alertUser(elem, msgStr) 
{
	alert(msgStr);
	elem.focus();
}

//---------------------------------------------------------------
// PrintAck
//---------------------------------------------------------------
function PrintAck(frm)
{
	var str;
	
	str = "Thank you ";
// TODO: Fix the below statement to check for an empty string
//	if (frm.Title.options[frm.Title.selectedIndex].value > 0) {
//		str += frm.Title.options[frm.Title.selectedIndex].value;
//	}
	
	str += " " + frm.FirstName.value + " " + frm.LastName.value;
	str += "\n You will receive confirmation by e-mail."
	alert (str);
}

// i just want to verify that they are not adding something that will corrupt the db i.e.:
// look for bad asp or sql chars:   _ ' ; "
function scrubStr (str) {
	var badChar = /[']|["]|[;]|[_]|(\r\n|[\r\n])/g;
	var cleanStr = str.replace (badChar, " ");
	return cleanStr;
}

// phone number - strip out delimiters and check for 15 digits to include international phone numbers
// str = string to test
// optional = boolean value. true=optional; false=required
function checkPhone (str, optional) {
	var error = "";
	if ((str == "") && (!optional)) {
		error = "Please enter a phone number.\n";
		return error;
	}

	var stripped = str.replace(/[\(\)\.\-\+\ ]/g, ''); //strip out acceptable non-numeric characters

 	if (isNaN(stripped)) {
		error = "The phone number contains illegal characters.";
		return error;
    }

    if ((str != "") && (stripped.length < 10)) {
		error = "The phone number length is incorrect. Please verify.\n";
		return error;
    } 
	
	if ((15 < stripped.length)) {
		error = "The phone number length is incorrect. Please verify.\n";
		return error;
    } 
	return error;
}
