var whitespace = " \t\n\r";
var reInteger = /^\d+$/;
var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/;
var reEmail = /^.+\@.+\..+$/;
var ssnDelimeters = "- ";
var phoneDelimeters = "()- ";
var zipDelimeters = "- ";
var currencyDelimeters = "$,"

function isEmpty(s) {
	return ((s == null) || (s.length == 0));
}

function isInteger(s, isEmptyOK) {
	if (isEmpty(s)) return isEmptyOK;
	else return reInteger.test(s);
}

function isFloat(s, isEmptyOK) {
	var flt = stripCharsInBag(s, currencyDelimeters);

	if (isEmpty(flt)) return isEmptyOK;
	else return reFloat.test(flt);
}

function isEmail(s, isEmptyOK) {
	if (isEmpty(s)) return isEmptyOK;
	else return reEmail.test(s);
}

function isSSN(s, isEmptyOK) {
	var ssn = stripCharsInBag(s, ssnDelimeters);

	if (isEmpty(ssn)) return isEmptyOK;
	else return (isInteger(ssn,false) && (ssn.length == 9));
}

function isZIP(s, isEmptyOK) {
	var zip = stripCharsInBag(s, zipDelimeters);

	if (isEmpty(zip)) return isEmptyOK;
	else return (isInteger(zip,false) && ((zip.length == 9) || (zip.length == 5)));
}

function isPhone(s, isEmptyOK) {
	var phone = stripCharsInBag(s, phoneDelimeters);

	if (isEmpty(phone)) return isEmptyOK;
	else return (isInteger(phone,false) && (phone.length == 10));
}

function stripCharsInBag(s, bag) {
	var i;
	var returnString = "";

	for (i = 0; i < s.length; i++) {   
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}

function reformat(s) {
	var arg;
	var sPos = 0;
	var resultString = "";
	for (var i = 1; i < reformat.arguments.length; i++) {
		arg = reformat.arguments[i];
		if (i % 2 == 1) {
			resultString += arg;
		} else {
			resultString += s.substring(sPos, sPos + arg);
			sPos += arg;
		}
	}
	return resultString;
}

function reformatZIPCode(ZIPString) {
	var strippedZIPString = stripCharsInBag(ZIPString,zipDelimeters);

	if (strippedZIPString.length == 5) return strippedZIPString;
	else return (reformat (strippedZIPString, "", 5, "-", 4));
}

function reformatPhone(PhoneString) {
	var strippedPhoneString = stripCharsInBag(PhoneString,phoneDelimeters);

	return (reformat (strippedPhoneString, "(", 3, ") ", 3, "-", 4))
}

function reformatSSN(SSNString) {
	var strippedSSNString = stripCharsInBag(SSNString,ssnDelimeters);

	return (reformat (strippedSSNString, "", 3, "-", 2, "-", 4))
}

function checkAlertAndSetFocus(valid,object,msg) {
	if (!valid) {
		alert('\n' + msg + '.');
		object.select();
		object.focus();
		return false;
	}
	return valid;
}

function valid_text(txtField) {
	return checkAlertAndSetFocus(!isEmpty(stripCharsInBag(txtField.value,whitespace)),txtField, 'You must enter a value for ' + txtField.name);
}

function valid_currency(txtField,isEmptyOK) {
	return checkAlertAndSetFocus(isFloat(txtField.value,isEmptyOK),txtField, 'You must enter a valid dollar amount for ' + txtField.name);
}

function valid_ssn(txtField,isEmptyOK) {
	return checkAlertAndSetFocus(isSSN(txtField.value,isEmptyOK),txtField, 'You must enter a valid Social Security Number');
}

function valid_zip(txtField,isEmptyOK) {
	return checkAlertAndSetFocus(isZIP(txtField.value,isEmptyOK),txtField, 'You must enter a valid ZIP Code');
}

function valid_phone(txtField,isEmptyOK) {
	return checkAlertAndSetFocus(isPhone(txtField.value,isEmptyOK),txtField, 'You must enter a valid Phone Number (Including Area Code)');
}

function valid_email(txtField,isEmptyOK){
	return checkAlertAndSetFocus(isEmail(txtField.value,isEmptyOK),txtField, 'You must enter a valid E-mail Address');
}

function valid_checkbox(chkBox) {
	return checkAlertAndSetFocus(chkBox.checked,chkBox, 'Please indicate that you have completed this form by checking this checkbox');
}

function validate_online_application(myForm) {
	var tmp;

	if (!valid_text(myForm.elements['First Name'])) return false;
	if (!valid_text(myForm.elements['Last Name'])) return false;
//	if (!valid_ssn(myForm.elements['Social Security Number'],false)) return false;
//	myForm.elements['Social Security Number'].value = reformatSSN(stripCharsInBag(myForm.elements['Social Security Number'].value,ssnDelimeters));
	if (!valid_text(myForm.elements['Address'])) return false;
	if (!valid_text(myForm.elements['City'])) return false;
	if (!valid_zip(myForm.elements['Zip'],false)) return false;
	myForm.elements['Zip'].value = reformatZIPCode(myForm.elements['Zip'].value);
	if (!valid_phone(myForm.elements['Home Phone'],false)) return false;
	myForm.elements['Home Phone'].value = reformatPhone(myForm.elements['Home Phone'].value);
	if (!valid_phone(myForm.elements['Alternate Phone'],true)) return false;
	if (!isEmpty(myForm.elements['Alternate Phone'].value)) myForm.elements['Alternate Phone'].value = reformatPhone(myForm.elements['Alternate Phone'].value);
	if (!valid_text(myForm.elements['Position(s) Desired'])) return false;
//	if (!valid_currency(myForm.elements['Monthly Salary Desired'],false)) return false;

	if (!valid_text(myForm.elements['High School'])) return false;

	if (!valid_text(myForm.elements['Reference1 Name'])) return false;
	if (!valid_text(myForm.elements['Reference1 Title'])) return false;
	if (!valid_text(myForm.elements['Reference1 Company'])) return false;
	if (!valid_text(myForm.elements['Reference1 City'])) return false;
	if (!valid_zip(myForm.elements['Reference1 Zip'],false)) return false;
	myForm.elements['Reference1 Zip'].value = reformatZIPCode(myForm.elements['Reference1 Zip'].value);
	if (!valid_phone(myForm.elements['Reference1 Phone'],false)) return false;
	myForm.elements['Reference1 Phone'].value = reformatPhone(myForm.elements['Reference1 Phone'].value);

	if (!valid_email(myForm.elements['E-mail Address'],true)) return false;
	if (!valid_checkbox(myForm.elements['Finished'])) return false;
	return true;
}
