var emptyString = /^\s*$/
var nbsp = 160;

function validateForm () 
{
	if (!passSanityCheck()) { return true; }
	else {
	   	var required = document.getElementById('required');
	   	var reqLength = 0;
	   	if (required != null) { 
	   		required = required.value.split(','); 
	   		reqLength = required.length;
	   	}
	   
	   	var atLeastOne = document.getElementById('atleast');
		var atLeast = "Please pick at least one from the following fields: \n";
	   	var aloLength = 0;
	   	if (atLeastOne != null) { 
	   		atLeastOne = atLeastOne.value.split(','); 
	   		aloLength = atLeastOne.length;
	   	}
	   
	   	var errors = [];	
	   
		if (aloLength != 0) {
	   		var atLeastBool = false;
	   		var set;
	   	
	   		for (var i = 0; i < aloLength ; i++) {
	   			set = document.getElementsByName(atLeastOne[i]);
	   			for (var j = 0 ; j < set.length ; j++) {
	   				if (set[j].checked) {
	   					atLeastBool = true;
	   					break;
	   				}
		 		}
			atLeast += "--" + set[0].id + "\n";
	   		}
	   		if (!atLeastBool) { 
				// I could do this functionally (ie map warn...), but I'm lazy?
		        for (var k = 0 ; k < aloLength ; k++) {
					warn(document.getElementsByName(atLeastOne[k])[0], false)
		        }
				errors.push([document.getElementsByName(atLeastOne[0])[0], atLeast]); }
	   	}
	
	   	var noErr = true;
	   	var msg;
	   	var field;
	   	var type;
	   	var value;

		var className; var min; var max;
	
	   	for (var i = 0 ; i < reqLength ; i++) {       
	   		field 		= document.getElementsByName(required[i])[0];
	   		type		= field.type;
	   		value 		= field.value;
			className 	= (field.className.split(',') || []);
	   	
	   		if (value == "" || value == null) {
				msg = field.id + " cannot be left blank\n";
	   			noErr = false;
	   		}
			else if (className[0] == "minmax") {
				min = className[1];
				max = className[2];
				
				noErr =  validateTextfieldMinMax(field, min, max);
				msg = field.id + " must be greater than " + min + " and less than " + max + "\n";
			}
			else if (className[0] == "min") {
				min = className[1];				
				noErr = validateTextfieldMin(field, className[1]);
				msg = field.id + " must be greater than " + min + "\n";
			}
			else if (className[0] == "max") {
				max = className[1];
				noErr = validateTextfieldMin(field, className[1]);
				msg = field.id + " must be less than " + min + "\n";				
			}
	   		else if (type == "text")	{ 
	   			noErr = isValidText(field);
	   			msg = field.id + ": " + value + " is an invalid value\n";
	   		}
	   		else if (type == "checkbox" || type == "radio") { 
	   			noErr = isValidMultiples(field);
	   			msg = "Please choose a " + field.id + "\n";
	   		}
	   	
	   		if (!noErr) {
	   			errors.push([field, msg]);
	   			noErr = true;
	   		}
	   	}
	
	   	if (errors.length != 0) { 
	   		alertMsg(errors);
	   		return false; 
	   	}
	
	   	return true;
	}
}	

function validateTextfield (field)
{
	var valid;
	var value = field.value;
	if (!passSanityCheck()) { valid = true; } // degrade for older versions of js
	else if (value != "") {
		valid = isValidText(field); 
//		if (length != null) { valid = ((value.length  length) && valid); }
	}
	else { valid = false; }

    warn(field, valid);
	if (!valid) { field.focus(); }
	return valid;
}

function validateTextfieldMinMax (field, min, max)	
{
	var valid = (validateTextfieldMin(field, min) && validateTextfieldMax(field, max));
	warn(field, valid);

	return valid;
}

function validateTextfieldMin (field, min)
{
	var value = field.value;	
	var valid = (validateTextfield(field) && (parseInt(value) >= min));
	warn(field, valid);
	
	return valid;
}

function validateTextfieldMax (field, max)
{
	var value = field.value;	
	var valid = (validateTextfield(field) && (parseInt(value) <= max));	
	warn(field, valid);
	
	return valid;
}

function validateAtLeastCheckbox (field)
{
	var atLeast = document.getElementById('atleast').value.split(',');
	var valid = false;
	
	for (var i = 0 ; i < atLeast.length ; i++) {
		valid = (valid || validateCheckbox(document.getElementsByName(atLeast[i])[0]));
	}

	for (var i = 0; i < atLeast.length ; i++) {
		warn(document.getElementsByName(atLeast[i])[0], valid)
	}
	
	return valid;
}

function validateCheckbox (field)
{
	var fieldArray = document.getElementsByName(field.name);
	var valid = false;
	
	for (var i = 0 ; i < fieldArray.length ; i++) {
		if (fieldArray[i].checked) { valid = true; break;}
	}
	 
	warn(field, valid);
	return valid;
}

// begin sub funcs    
function isValidMultiples (field) {
	var fieldArray = document.getElementsByName(field.name);
	
	for (var i = 0; i < fieldArray.length ; i++) {
		if (fieldArray[i].checked) {
			return true;
		}
	}
	return false;
}

function isValidText (field)
{
	var className = field.className;
 	var value = stripSpaces(field.value);
	var bool;

	if 		(className == "email") 		{ bool = isValidEmail(value); }
	else if (className == "phone")		{ bool = isValidPhone(value); }
	else if (className == "zip")		{ bool = isValidZip(value); }
	else if (className == "numonly") 	{ bool = isOnly(value, "num"); }
	else if (className == "textonly")	{ bool = isOnly(value, "text"); }
	else 								{ bool = (value != null || value != ""); }
	
	return bool;
}

// thanks to http://www.webreference.com/js/column5/form.html for the reg exps
function isValidEmail (email) {
	var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
  	var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid

	return (!reg1.test(email) && reg2.test(email));
}

function isValidPhone (phone)
{
	var reg1 = /(^911)|([a-zA-Z])|(^0)/; // not valid
	var reg2 = /^((\()?[0-9]{3}(\))?)[0-9]{3}-?[0-9]{4}$/; // valid
	
	return (!reg1.test(phone) && reg2.test(phone));
}

function isValidZip (zip)
{
	var reg1 = /	[0]{5}/;
	var reg2 = /^[0-9]{5}(-[0-9]{4})?$/;
	return (!reg1.test(zip) && reg2.test(zip));
}

function isOnly (text, numORtext)
{
	var length = text.length;
	var regExp;
	if (numORtext == "num") 	  { regExp = /^[0-9]+$/;}
	else if (numORtext == "text") { regExp = /^[a-zA-Z]+$/; }
	return regExp.test(text);
}
// end sub funcs

// begin warnings
function alertMsg (errors)
{
	var msg = "==========================\n";
	msg    += "Your form had errors!\n";
	msg    += "Please fix the following error(s), then submit again\n"
	msg    += "==========================\n";

	var field;
	for (var i = 0 ; i < errors.length ; i++) {
		field = errors[i][0];
        msg = msg + errors[i][1];

		warn(field, false)
	}

	field = errors[0][0];
	field.focus();
	alert(msg);
}

/* if valid, clear warnings.  if !valid, add warnings */
function warn (field, valid)
{
	var warnName = field.name + "_warn";
	var elmnt = document.getElementById(warnName);  
	var msg = String.fromCharCode(nbsp);
	
	if (elmnt != null) {
    	if (valid) { elmnt.firstChild.nodeValue = msg; }
		else 	   { elmnt.firstChild.nodeValue = "<---"; }
	}
	
	return;
}

// end warnings

// begin helpers
function textOfLength (text, length, gtORlt)
{
	if (gtORlt == ">") { return (text.length > length); }
	else 			   { return (text.length < length); }
}	

function stripSpaces (text) 
{
	if (text) return text.replace(/\s+/g, '');
}

function passSanityCheck ()
{
	return (document.getElementById && document.createTextNode)
}

// end helpers

/*window.onload = function () {
	var immediate = document.getElementById('immediate').value.split(',');
	for (var i ; i < immediate.length ; i++) {
		document.
	}
} */