// forms.js - functions for validating and formating forms in HTML pages

function validateForm(theForm, exceptionList) {

	var validity = false;
	var frm = document.getElementById(theForm);
	var container = frm.parentNode;
	var exceptions = exceptionList.toLowerCase();
	var lbls = frm.getElementsByTagName("label");
	var lblNames = new Array();
	for(var i=0; i<lbls.length; i++) {
		var k = lbls[i].getAttributeNode('for').value;
		var v = lbls[i].innerHTML;
		lblNames[k] = v;
	}

	var errorList = '';

	for(var i=0; i<frm.length; i++) {
		var frmBox = frm.elements[i];
		
		if(exceptions.indexOf(frmBox.name.toLowerCase())<0) {

			if(frmBox.name.toLowerCase() == "email") { 
				if(!validateEmail(frmBox.value)) {
					errorList += "<li>" + lblNames[frmBox.name] + " ('" + frmBox.value + "' is not a valid email address.)</li>\n";
				}
			} else if(frmBox.name.toLowerCase() == "street") {
				if(frmBox.value.replace(/[^a-z0-9]/ig, '').length<5) {
					errorList += "<li>" + lblNames[frmBox.name] + " (please enter your full street address)</li>\n";
				}
			} else if(frmBox.name.toLowerCase() == "city") {
				if(frmBox.value.replace(/[^a-z0-9]/ig, '').length<3) {
					errorList += "<li>" + lblNames[frmBox.name] + " (please enter your full city name)</li>\n";
				}
			} else if(frmBox.name.toLowerCase() == "state") {
				if(frm.elements['country'].value.toLowerCase().match(/usa|us|united states|america/)) {
					if(!validateState(frmBox.value)) {
						errorList += "<li>" + lblNames[frmBox.name] + " (US states must be a two-letter state abbreviation, Ex: NY for New York.)</li>\n";
					}
				}
			} else if(frmBox.name.toLowerCase() == "zip") {
				if(frm.elements['country'].value.toLowerCase().match(/usa|us|united states|america/) || frm.elements['country'].value.length<2) {
					if(frmBox.value.replace(/\D/g, '').length<5 || frmBox.value.replace(/\D/g, '').length>9) {
						errorList += "<li>" + lblNames[frmBox.name] + " (US postal codes must be 5-9 digits)</li>\n";
					} else {
						frmBox.value = standardizeZip(frmBox.value);
					}
				}
			} else if(frmBox.name.toLowerCase() == "url") {
				if(!validateWebsite(frmBox.value)) {
					errorList += "<li>" + lblNames[frmBox.name] + " ('" + frmBox.value + "' is not a valid website address.)</li>\n";
				}
			} else if(frmBox.name.toLowerCase() == "phone") {
				if(!validatePhone(frmBox.value)) {
					errorList += "<li>" + lblNames[frmBox.name] + " (US phone numbers should be in this format: 888-888-8888)</li>\n";
				} else {
					frmBox.value = standardizePhone(frmBox.value);
				}
			} else {
				if(frmBox.type=="select-one" && frmBox.options.selectedIndex == 0 || frmBox.type=="select-one" && frmBox.options.selectedIndex.value == '') {
					errorList += "<li>" + lblNames[frmBox.name] + " (Please choose an option)</li>\n";
				} else if(frmBox.value.replace(/[^a-z0-9]/ig, '').length<2 || frmBox.value=='' || frmBox.value==null) {
					errorList += "<li>" + lblNames[frmBox.name] + " (must be at least 2 characters)</li>\n";
					// frmBox.style.borderColor='#ce0101';
					// frmBox.style.color='#000000';
				}
			}
		}
	}


	if(errorList) {
		if(document.getElementById("msg-box")) {
			container.removeChild(document.getElementById("msg-box"));
		}

		var errBox = document.createElement('div');
		errBox.id = "msg-box";
		errBox.innerHTML = "<h3>The following fields failed validation</h3>\n<ul>" + errorList + "\n</ul>\n";
		errBox.className = "error";
		container.insertBefore(errBox, container.firstChild);
	} else {
		validity = true;
	}
	
	return validity;
}


function validateEmail(emailAddress) { // Checks if a given email address is valid
	var email = emailAddress.toUpperCase();
	var validity = false;
	var regex = /^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,6}$/;
	
	if (email.match(regex)) {
		validity = true;
	}
	return validity;	
}

function validateWebsite(websiteAddress) { // Checks if a given website address is valid
	var website = websiteAddress.toUpperCase();
	var validity = false;
	var regex = /^[A-Z0-9._%-]+\.[A-Z0-9._%-]+\.[A-Z]{2,6}$/;
	
	if (website.match(regex)) {
		validity = true;
	}
	return validity;	
}

function validatePhone(phoneNumber) { // Checks if a given phone number is valid
	var pn = phoneNumber.replace(/\D/g, '');
	var validity = false;

	if (pn.length>9 && pn.length<15) {
		validity = true;
	}
	return validity;	
}

function validateState(stateAbbreviation) { // Checks if a given state abbreviation is valid
	var validStates = 'AL,AK,AZ,AR,CA,CO,CT,DE,DC,FL,GA,HI,ID,IL,IN,IA,KS,KY,LA,ME,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,OH,OK,OR,PA,RI,SC,SD,TN,TX,UT,VT,VA,WA,WV,WI,WY';
	var state = stateAbbreviation.toUpperCase();
	if(state.length!=2) {
		return false;
	} else if(validStates.indexOf(state)<0) {
		return false;
	} else {
		return true;
	}
}

function standardizePhone(phoneNumber) { //Forces a phone number to match 888-888-8888 format
	var pn = phoneNumber.replace(/\D/g, '');
	var standardizedPhone = pn.substring(0,3) + '-' + pn.substring(3,6) + '-' + pn.substring(6,10);
	return standardizedPhone;
}

function standardizeZip(zipCode) { //Forces a US zip code to be 99999 or 99999-9999 format
	var zc = zipCode.replace(/\D/g, '');
	if(zc.length == 5) {
		var standardizedZipCode = zc.substring(0,6);
	} else {
		var standardizedZipCode = zc.substring(0,5) + '-' + zc.substring(5,10);
	}
	return standardizedZipCode;
}