// JavaScript Form Utility Functions

// A utility function that returns true if a string contains only
// whitespace characters

function isblank(s)
{
	for(var i = 0; i < s.length; i++) 
	{
		var c = s.charAt(i);
		if ((c != ' ') && (c != '\n') && (c != "")) 
			return false;
	}
	return true;
}

// This is the function that validates the format of the email address entered.
// It does not verify that the address exists, simply that it is in the correct form.
	
function valid_email(theEmail)
{
	var atLoc = theEmail.indexOf("@",1);
	var dotLoc = theEmail.indexOf(".",atLoc+2);
	var len = theEmail.length;
	/* This expression returns true only if the @ symbol and a dot are present 
	   in the e-mail address and the length of the address is sufficient to include a 
	   two-character domain at the end.
	 */
	if (atLoc > 0 && dotLoc > 0 && len > dotLoc+2)
	{
		return "";	// No email format error
	}
	else
	{
		return "Invalid email address format: " + theEmail;
	}   
}

// This is the function that performs form verification. It is invoked
// from the onsubmit event handler. The handler should return whatever
// value this function returns.

function verify(f)
{
	var msg;
	var empty_fields = "";
	var errors = "";
	var email_error = "";
	var ackError = false;
	
	// Loop through the elements of the form, looking for all Text and
	// Textarea elements that don't have an "optional" property defined.
	// Then check for fields that are empty and make a list of them. Also, if
	// any of these elements have a "min" or a "max" property defined, verify
	// that they are numbers and are in the right range. If the element has a
	// "numeric" property defined, verify that it is a number, but don't check
	// its range. Put together error messages for fields that are wrong.

	for(var i = 0; i < f.length; i++) 
	{
		var e = f.elements[i];
		var ename = "";
		
		// first, let's get the element name and figure out a friendly name for it
		switch(e.name)
		{
			case "name":
				ename = "Name";
				break;
			case "date":
				ename = "Date";
				break;
			case "ssn":
				ename = "Social Security Number";
				break;
			case "cur_addr":
				ename = "Present Address";
				break;
			case "perm_addr":
				ename = "Permanent Address";
				break;
			case "phone":
				ename = "Phone Number";
				break;
			case "cellphone":
				ename = "Cell Phone Number";
				break;
			case "age18":
				ename = "Age 18";
				break;
			case "immigration":
				ename = "Immigration Status";
				break;
			case "drugtest":
				ename = "Drug Test";
				break;
			case "position":
				ename = "Position";
				break;
			case "start":
				ename = "Start Date";
				break;
			case "wagerequest":
				ename = "Wage Requested";
				break;
			case "employed":
				ename = "Currently Employed";
				break;
			case "contact":
				ename = "Contact Employer";
				break;
			case "applybefore":
				ename = "Applied Before";
				break;
			case "where":
				ename = "Where";
				break;
			case "when":
				ename = "When";
				break;
			case "referredby":
				ename = "Referred By";
				break;
			case "availablelist":
				ename = "Available for work on:";
				break;
			case "workweekend":
				ename = "Can Work Weekends";
				break;
			case "workweekday":
				ename = "Can Work Weekdays";
				break;
			case "elemschool":
				ename = "Elementary (Grade) School";
				break;
			case "elemyears":
				ename = "Elementary School Years Attended";
				break;
			case "elemgrad":
				ename = "Graduate Elementary School";
				break;
			case "elemsubject":
				ename = "Elementary School Subjects";
				break;
			case "highschool":
				ename = "High School";
				break;
			case "highyears":
				ename = "High School Years Attended";
				break;
			case "highgrad":
				ename = "Graduate High School";
				break;
			case "highsubject":
				ename = "High School Subjects";
				break;
			case "collegeschool":
				ename = "College";
				break;
			case "collegeyears":
				ename = "Cllege Years Attended";
				break;
			case "collegegrad":
				ename = "Graduate College";
				break;
			case "collegesubject":
				ename = "College Subjects";
				break;
			case "tradeschool":
				ename = "Trade School";
				break;
			case "tradeyears":
				ename = "Trade School Years Attended";
				break;
			case "tradegrad":
				ename = "Graduate Trade School";
				break;
			case "tradesubject":
				ename = "Trade School Subjects";
				break;
			case "subjects":
				ename = "Subjects of Special Study";
				break;
			case "skills":
				ename = "Special Skills";
				break;
			case "activities":
				ename = "Activities";
				break;
			case "military":
				ename = "Military Service";
				break;
			case "rank":
				ename = "Military Rank";
				break;
			case "reserves":
				ename = "Reserves";
				break;
			case "employer1":
				ename = "First Employer";
				break;
			case "workphone1":
				ename = "First Employer Phone";
				break;
			case "empladdr1":
				ename = "First Employer Address";
				break;
			case "position1":
				ename = "First Employer Position";
				break;
			case "salary1":
				ename = "First Employer Salary";
				break;
			case "emplfrom1":
				ename = "First Employer From Date";
				break;
			case "emplto1":
				ename = "First Employer To Date";
				break;
			case "duties1":
				ename = "First Employer Duties";
				break;
			case "reason1":
				ename = "First Emplyoer Reason for Leaving";
				break;
			case "contact1":
				ename = "First Employer OK to Contact";
				break;
			case "employer2":
				ename = "Second Employer";
				break;
			case "workphone2":
				ename = "Second Employer Phone";
				break;
			case "empladdr2":
				ename = "Second Employer Address";
				break;
			case "position2":
				ename = "Second Employer Position";
				break;
			case "salary2":
				ename = "Second Employer Salary";
				break;
			case "emplfrom2":
				ename = "Second Employer From Date";
				break;
			case "emplto2":
				ename = "Second Employer To Date";
				break;
			case "duties2":
				ename = "Second Employer Duties";
				break;
			case "reason2":
				ename = "Second Emplyoer Reason for Leaving";
				break;
			case "contact2":
				ename = "Second Employer OK to Contact";
				break;
			case "employer3":
				ename = "Third Employer";
				break;
			case "workphone3":
				ename = "Third Employer Phone";
				break;
			case "empladdr3":
				ename = "Third Employer Address";
				break;
			case "position3":
				ename = "Third Employer Position";
				break;
			case "salary3":
				ename = "Third Employer Salary";
				break;
			case "emplfrom3":
				ename = "Third Employer From Date";
				break;
			case "emplto3":
				ename = "Third Employer To Date";
				break;
			case "duties3":
				ename = "Third Employer Duties";
				break;
			case "reason3":
				ename = "Third Emplyoer Reason for Leaving";
				break;
			case "contact3":
				ename = "Third Employer OK to Contact";
				break;
			case "bestjob":
				ename = "Best Job";
				break;
			case "likedjob":
				ename = "Liked Best About Job";
				break;
			case "known1":
				ename = "Reference 1";
				break;
			case "addr1":
				ename = "Reference 1 Address";
				break;
			case "business1":
				ename = "Reference 1 Business";
				break;
			case "yrs1":
				ename = "Reference 1 Years Known";
				break;
			case "known2":
				ename = "Reference 2";
				break;
			case "addr2":
				ename = "Reference 2 Address";
				break;
			case "business2":
				ename = "Reference 2 Business";
				break;
			case "yrs2":
				ename = "Reference 2 Years Known";
				break;
			case "known3":
				ename = "Reference 3";
				break;
			case "addr3":
				ename = "Reference 3 Address";
				break;
			case "business3":
				ename = "Reference 3 Business";
				break;
			case "yrs3":
				ename = "Reference 3 Years Known";
				break;
			case "emergname":
				ename = "Emergency Contact Name";
				break;
			case "emergaddr":
				ename = "Emergency Contact Address";
				break;
			case "emergphone":
				ename = "Emergency Contact Phone";
				break;
			case "ack1":
				ename = "Acknowledgement #1";
				break;
			case "ack2":
				ename = "Acknowledgement #2";
				break;
			case "ack3":
				ename = "Acknowledgement #3";
				break;
			case "ack4":
				ename = "Acknowledgement #4";
				break;
			case "ack5":
				ename = "Acknowledgement #5";
				break;
			case "datesigned":
				ename = "Date Signed";
				break;
			case "signature":
				ename = "Electronic Signature";
				break;
			case "ID":
				ename = "ID Number";
				break;
			case "FirstName":
				ename = "First Name";
				break;
			case "MI":
				ename = "Middle Initial";
				break;
			case "LastName":
				ename = "Last Name";
				break;
			case "AddressLine1":
				ename = "Address Line 1";
				break;
			case "AddressLine2":
				ename = "Address Line 2";
				break;
			case "City":
				ename = "City";
				break;
			case "StateSelect":
				ename = "State";
				break;
			case "Zip":
				ename = "Zip Code";
				break;
			case "Cherries":
				ename = "Cherry Flyer";
				break;
			case "Summer":
				ename = "Summer Flyer";
				break;
			case "Apples":
				ename = "Apple Flyer";
				break;
			case "email":
			case "EmailAddress":
			case "emailaddr":
				ename = "Email Address";
				break;
			case "Comments":
				ename = "Comments";
				break;
			case "MailType":
				ename = "Preferred Mail Type";
				break;
			case "typeOfChange":
				ename = "Add, Remove, or Update";
				break;
			case "OldFirstName":
				ename = "Old First Name";
				break;
			case "OldMI":
				ename = "Old Middle Initial";
				break;
			case "OldLastName":
				ename = "Old Last Name";
				break;
			case "OldAddressLine1":
				ename = "Old Address Line 1";
				break;
			case "OldAddressLine2":
				ename = "Old Address Line 2";
				break;
			case "OldCity":
				ename = "Old City";
				break;
			case "OldStateSelect":
				ename = "Old State";
				break;
			case "OldZip":
				ename = "Old Zip Code";
				break;
			case "NewFirstName":
				ename = "New First Name";
				break;
			case "NewMI":
				ename = "New Middle Initial";
				break;
			case "NewLastName":
				ename = "New Last Name";
				break;
			case "NewAddressLine1":
				ename = "New Address Line 1";
				break;
			case "NewAddressLine2":
				ename = "New Address Line 2";
				break;
			case "NewCity":
				ename = "New City";
				break;
			case "NewStateSelect":
				ename = "New State";
				break;
			case "NewZip":
				ename = "New Zip Code";
				break;
			default:
				ename = e.name;
				break;
		}
		
		
		if (((e.type == "text") || (e.type == "textarea")) && !e.optional) 
		{
			// First check if the field is empty
			if ((e.value == null) || (e.value == "") || isblank(e.value)) 
			{
				empty_fields += "\n          " + ename;
				continue;
			}

			// Now check for fields that are supposed to be numeric
			if (e.numeric || (e.min != null) || (e.max != null)) 
			{
				var v = parseFloat(e.value);
				if (isNaN(v) ||
					((e.min != null) && (v < e.min)) ||
					((e.max != null) && (v > e.max))) 
				{
					errors += "- The field " + ename + " must be a number";
					if (e.min != null)
						errors += " that is greater than " + e.min;
					if (e.max != null && e.min != null)
						errors += " and less than " + e.max;
					else if (e.max != null)
						errors += " that is less than " + e.max;
					errors += ".\n";
				}
			}
			
	 		// Check for proper format if it is an email address
			if (e.email)
			{
				 email_error = valid_email(e.value);
			}
		}
		else
		{
			if (e.type == "checkbox")
			{
				if (!e.checked && (e.name == "ack1" || e.name == "ack2" || e.name == "ack3" || e.name == "ack4" || e.name == "ack5") && !ackError)
				{
					errors += "- You must check all Acknowledgments to submit your application.\n";
					ackError = true;
				}
			}
		}
	}
	 
	// Now, if there were any errors, display the messages, and
	// return false to prevent the form from being submitted.
	// Otherwise, return true.

	if (!empty_fields && !errors && !email_error) 
		return true;

	msg  = "________________________________\n\n";
	msg += "The form was not submitted because of the following error(s).\n";
	msg += "Please correct these error(s) and re-submit.\n";

	msg += "________________________________\n\n"

	if (empty_fields)
	{
		msg += "- The following required field(s) are empty:"
			+ empty_fields + "\n";
	}
	if (errors) msg += "\n";
	msg += errors;
	if (email_error) msg += "\n";
	msg += email_error;
	alert(msg);

	return false;
}

// This is the function that performs form reset. It is invoked
// from the form event handler. The handler should return false if the user
// cancels.

function formreset(f)
{

	if (confirm("Really erase ALL data and Start Over?"))
	{
		// Loop through the elements of the form, looking for all 
		// Textarea elements.
		// Then check for fields that are not empty and clear them.
		// For some reason, the reset function does not clear textarea fields.
	
		for(var i = 0; i < f.length; i++) 
		{
			var e = f.elements[i];
			if (e.type == "textarea") 
			{
				// First check if the field is empty
				if ((e.value == null) || (e.value == "") || isblank(e.value)) 
				{
					continue;		// its already empty, do nothing
				}
				else
				{
					e.value = "";	// it has data, so clear it
				}
			}
		}

		return true;				// The user chose to clear the form
	}
	else return false;			// The user changed his mind
	
}
