// Note -- HACK in check_reqfields() function -- require Zip only if US
var formProcessUnits = new Array();
var formEntry = document.forms[0];
var formActionOrig = formEntry.action;

// begin verification units
formProcessUnits.push({	input:Array({target:'firstname',prop:'value'}),	outputVarName:'firstname',	required:true,	errorMessage:'Please provide your first name.',	verifyType:'word',				// type needed for check_string	verifyValue:null				// extra info needed for check_string});
formProcessUnits.push({	input:Array({target:'email',prop:'value'}),	outputVarName:'email',	required:true,	errorMessage:'Please be sure your e-mail address is properly formatted.',	verifyType:'email',				// type needed for check_string	verifyValue:null				// extra info needed for check_string});
formProcessUnits.push({	input:Array(
			  {target:'birthyear',prop:'value',index:'selectedIndex'},			  '-',			  {target:'birthmonth',prop:'value',index:'selectedIndex'},			  '-',			  {target:'birthday',prop:'value',index:'selectedIndex'}			  ),	outputVarName:'birthdate',	required:true,	errorMessage:'You must be at least 13 years old.',	verifyType:'birthdate',			// type needed for check_string	verifyValue:jsMaxBirthdate				// extra info needed for check_string});
formProcessUnits.push({
	input:Array({target:'zip',prop:'value'}),
	outputVarName:'zip',
	required:true,
	errorMessage:'Please provide your Zip or postal code.',
	verifyType:'zip',				// type needed for check_string
	verifyValue:null				// extra info needed for check_string
});
// end verification units

// input filters
formEntry.email.onkeyup = function() { input_filter(this,'email','') };
formEntry.firstname.onkeyup = function() {input_filter(this,'name','')};
formEntry.lastname.onkeyup = function() {input_filter(this,'name','')};
formEntry.phone.onkeyup = function() {input_filter(this,'phone','')};
//

// uses globals formActionOrig, formEntry
formEntry.onsubmit = function() {
	var action_true = formActionOrig;
	var action_false = 'javascript:void(0)';
	var fcheck = check_reqfields();
	if (typeof(fcheck) == 'boolean') { 	// req fields have been filled in properly, now check if entered already
        formEntry.action = action_true;
        return true;
	} else {							// req fields have not been filled in properly
		formEntry.action = action_false;
		alert_errors(fcheck.join("\n"));
		return false;
	}
	
}
// alert errors
function alert_errors(jstring) {
	alert ('Oops!\n\n' + jstring);
}


function check_reqfields() {
	var jErrors = new Array();	var jValue;	for (var jPUindex = 0;jPUindex<formProcessUnits.length;jPUindex++) {		// init iteration vars		var jPU = formProcessUnits[jPUindex];		var jInput = jPU.input;		jValue = '';		var jThisValue = '';		var jIsUnchanged = false;		var jThisError = false;
							// build value of this Process Unit or check if unchanged		for (var jPart=0;jPart<jInput.length;jPart++) {
			jThisValue = '';			if (typeof(jInput[jPart]) == 'string') {
				jThisValue = jInput[jPart];			} else {
				jThisValue = formEntry[jInput[jPart].target][jInput[jPart].prop];				if (jThisValue == '') {
					jIsUnchanged = true;
				}
			}
			jValue += jThisValue;		}
		//verify if necessary		if (jPU.required) {
            if (jPU.outputVarName != 'zip' || (jPU.outputVarName == 'zip' && formEntry.country.value == 'US')) {                if (jIsUnchanged) {                    jThisError = true;
                } else {                    if (!check_fieldValue(jValue,jPU.verifyType,jPU.verifyValue)) {
                        jThisError = true;
                    }                }
            }				}		if (jThisError) {			jErrors.push(jPU.errorMessage);		}
	}
	
	if (jErrors.length) {
		return jErrors;
	} else {
		return true;
	}}


// uses globals formProcessUnits, formEntry
function check_fieldValue(theval,thetype,theverifyvalue) {
	switch (thetype) {
		case 'basic' :
			if (theval.length < 1) {
				return false;
			}
		break;
		case 'word' :
			if (theval.search(/\w/) < 0) {
				return false;
			}
		break;
		case 'word_only' :
			if (theval.search(/\W/) > -1) {
				return false;
			}
		break;
		case 'number_only' :
			if (theval.search(/\D/) > -1) {
				return false;
			}
		break;
		case 'whole_phone' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length < 10) {
				return false;
			}
		break;
		case 'phone' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length < 7) {
				return false;
			}
		break;
		case 'area_code' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length < 3) {
				return false;
			}
		break;
		case 'phone_4' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length < 4) {
				return false;
			}
		break;
		case 'zip' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length < 5) {
				return false;
			}
		break;
		case 'digits_strict' :
			var ta = theval.match(/\d/g);
			if (ta == null || ta.length != parseInt(theverifyvalue)) {
				return false;
			}
		break;
		case 'email' :
			if (theval.toLowerCase().search(/^[\w-\.]+@([\w-]+\.)+[a-z]{2,5}$/) < 0) {
				return false;
			}
		break;
		case 'checked' :
			if (!theval) {
				return false;
			}
		break;
		case 'birthdate' :		// YYYY-MM-DD no later than jextra			var jDateParts = theval.split('-');			if (!jDateParts[0] || !jDateParts[1] || !jDateParts[2]) { return false; }			if (theval > theverifyvalue) { return false; }		break;		default :
			if (theval.toLowerCase() != theverifyvalue.toLowerCase()) {
				return false;
			}
		break;
	}
	return true;
}

function input_filter(jfield,jfilter,jreplace) {	switch (jfilter) {
		case 'name' :
			var jre = /[^a-zA-Z \-\'áéíóúàèìòùñÁÉÍÓÚÀÈÌÒÙÑ]/g;
		break;		case 'file' :			var jre = /[^\w-_]/g;		break;		case 'url' :			if (jfield.value.toLowerCase().indexOf('http') == 0) {				var jre = / /g;			} else {				var jre = /[^\w-_]/g;			}		break;		case 'email' :
			var jre = /[ <>`!$%\\()\;:",\|\[\]]/g;		break;		case 'digits' :			var jre = /[^\d]/g;			break;
		case 'phone' :
			var jre = /[^\d\-\.\(\)x]/g;	
		break;
		case 'any' :
			var jre = /\;/g;
		break;	}	if (typeof(jre) != 'undefined') {		jfield.value = jfield.value.replace(jre,jreplace);
	}		if (jreplace.length > 0) {		var jre = new RegExp(jreplace+'+','g');		jfield.value = jfield.value.replace(jre,jreplace);	}}

