var old_color = false;
var error_color = "#fab";
// patterns is an array of pattern name, RegExp(as a string), and default error message
// these probably aren't the most stellar regexps in the world... if something's 
// acting weird, check here first
var patterns = 	[
			["email", "^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$", "invalid email address format."], 
			["alpha", "^[A-Za-z]+$", "non-alphabetic character found."],
			["numeric", "^[0-9\.-]+$", "non-numeric character found."],
			["alphanumeric", "^[0-9A-Za-z\.-]+$", "non-alphanumeric character found."],
			["money", "^\\${0,1}[0-9]*\.{0,1}[0-9]+$", "not a monetary amount"],
			["phone", "^1{0,1}\\s*(-|.){0,1}\\s*[0-9]{3}\\s*(-|.){0,1}\\s*[0-9]{3}\\s*(-|.){0,1}\\s*[0-9]{4}$", "not a valid phone number"],
			["zip", "^[0-9]{5}$", "not a valid zip code"]
		];
function validate(form) { 
	var str = ""; 
	var elements = form.elements;
	// if there are no elements, either the browser sucks or there's no form
	if(!elements) return true;

	var radio_sets = new Array();

	// grab current input field color (assuming all the same)
	if (!old_color) old_color = elements.item(0).style.background;
	if (!old_color) old_color = "#fff";

	// loop through all input elements in form 
	for(var i = 0; i < elements.length; i++) {
		// grab validation attributes
		var required = elements.item(i).getAttribute('required');
		var minlength = parseInt(elements.item(i).getAttribute('minlength'));
		if (isNaN(minlength)) minlength = null;
		var pattern = elements.item(i).getAttribute('pattern');
		var patternMsg = elements.item(i).getAttribute('patternMsg');
		var requireMsg = elements.item(i).getAttribute('requireMsg');
		var element_value = elements.item(i).value;
		var element_name = elements.item(i).name
		var valid = false;
		if (pattern || required || minlength) valid = true;
		if (required != null) { // check for required elements
			if (elements.item(i).type == "select-one" && elements.item(i).selectedIndex == 0) {
				if (requireMsg) str += requireMsg + "\n";
				else str += element_name + ": you must select a value.\n";
				valid = false;
			} else if (elements.item(i).type == "radio") {
				if(!radio_sets[element_name]) {
					var radio_checked = false;
					radio_sets[element_name] = 1;
					var radios = document.getElementsByName(element_name);
					for(var r = 0; r < radios.length; r++) {
						if (radios.item(r).checked) {
							radio_checked = true;
							break;
						}
					}
					if(!radio_checked) {
						if (requireMsg) str += requireMsg + "\n";
						else str += element_name + ": you must select a value.\n";
						valid = false;
					} 
				}
			} else if (element_value == "") {
				if (requireMsg) str += requireMsg + "\n";
				else str += element_name + ": cannot be blank.\n";
				valid = false;
				elements.item(i).style.background = error_color;
			}
		}
		if (valid && minlength && minlength > element_value.length) {
			str += element_name + ": must be at least " + minlength + " characters long.\n";
			valid = false;
			elements.item(i).style.background = error_color;
		}
		if (valid && pattern != null) { // check if element has a pattern match
			// check and set for 'standard' patterns			
			for (var x = 0; x < patterns.length; x++) {
				if (pattern == patterns[x][0]) {
					pattern = patterns[x][1];
					if (!patternMsg) patternMsg = element_name + ": " + patterns[x][2];
				}
			}
			var reg = new RegExp(pattern);
			if(!patternMsg) patternMsg = element_name + ": no error message specified.";
			
			if(!reg.test(element_value)) {
				str += patternMsg + "\n";
				valid = false;
				elements.item(i).style.background = error_color;
			}

		}
		if(valid) { // change the corrected ones back
			elements.item(i).style.background = old_color;
		}
	}  

	if (str != "") { 
		// do not submit the form 
		alert("ERROR:\n" +str);  
		return false; 
	} else { 
		// form values are valid; submit 
		return true; 
	} 
}


function flip_flop(f) {
  if(!f.newsletter.checked) {
    var e=document.createElement('input');
    e.setAttribute("type", "hidden");
    e.name = 'emailOptOut';
    e.value = "1";
    f.appendChild(e);
  }
  return true;
}

