// Add an event to the event callbacks. Avoid usage of the <body onLoad>
addEvent(window,'load',onLoadSetValidationWatcher);

function onLoadSetValidationWatcher() {
	startingInvalidNodes = getElementsByClassName_v($('validForm'), 'notValid');
	Marker.registerCallback(watchForAllValid);
	Enabler.registerCallback(watchForAllValid);
	}

/*
formerly enabler.js
*/

function Enabler() {
   }
function Enabler_callback() {
   }
Enabler.callback = Enabler_callback;
function Enabler_enable(id, enabled) {
   var elements = document.getElementsByName(id);
   var nodes = $A(elements);
   nodes.each(function(node) {
      node.disabled =!enabled; if (node.disabled) {
         node.checked = false; }
      }
   );
   if (Enabler.callback != null) Enabler.callback();
   }
Enabler.enable = Enabler_enable;
function Enabler_registerCallback(callback_fn) {
   Enabler.callback = callback_fn;
   }
Enabler.registerCallback = Enabler_registerCallback;

/*
formerly marker.js
*/

function findParentWithClass(node, className, otherClassName) {
   var parent = node.parentNode;
   while (parent && !Element.hasClassName(parent, className) && !Element.hasClassName(parent, otherClassName) && parent.tagName != 'FIELDSET') {
      parent = parent.parentNode;
      }
   return parent;
   }
function Marker() {
   }
function Marker_callback() {
   }
Marker.callback = Marker_callback;
function Marker_registerCallback(callback_fn) {
   this.callback = callback_fn;
   }
Marker.registerCallback = Marker_registerCallback;
function Marker_markValid(obj) {
   var parent = findParentWithClass(obj, "notValid", "valid");
   Element.removeClassName(parent, "notValid");
   Element.addClassName(parent, "valid");
   }
Marker.markValid = Marker_markValid;
function Marker_markNotValid(obj) {
   var parent = findParentWithClass(obj, "notValid", "valid");
   Element.removeClassName(parent, "valid");
   Element.addClassName(parent, "notValid");
   }
Marker.markNotValid = Marker_markNotValid;
function Marker_mark(valid, obj) {
   if (valid) Marker.markValid(obj);
   else Marker.markNotValid(obj);
   if (Marker.callback != null) Marker.callback();
   }
Marker.mark = Marker_mark;

/*
Common validation methods for WebSanity Forms
*/

function isValidIfContainsNChars(n, str) {
	return str.length >= n;
	}

function isValidIfContainsLessThanMax(max, str) {
	return str.length <= max;
	}

function validContains1(obj) {
	Marker.mark(isValidIfContainsNChars(1, $F(obj)), obj);
	}

function validContains1ToMax(obj, max) {
	Marker.mark(isValidIfContainsNChars(1, $F(obj)) && isValidIfContainsLessThanMax(max, $F(obj)), obj);
	}

function isValidIfNumericAndNotEmpty(field) {
	var valid = "0123456789";
	if (field.length == 0) return false;
	for (var i = 0; i < field.length; i++) {
		temp = "" + field.substring(i, i + 1);
		if (valid.indexOf(temp) == "-1") {
			return false;
			}
		}
	return true;
	}

function isValidIfNumericAndLength(len, field) {
	return field.length == len && isValidIfNumericAndNotEmpty(field);
	}

function isValidZIP(field) {
	return isValidIfNumericAndLength(5, field);
	}

function validZip(obj) {
	Marker.mark(isValidZIP($F(obj)), obj);
	}

function validSSN(obj, nextid) {
	var id = obj.id;
	var prefix = id.substr(0, id.length - 1);
	var check1 = isValidIfNumericAndLength(3, $F(prefix + '1'));
	var check2 = isValidIfNumericAndLength(2, $F(prefix + '2'));
	var check3 = isValidIfNumericAndLength(4, $F(prefix + '3'));
	Marker.mark(check1 && check2 && check3, $(prefix + '3'));
	if (id == prefix + '1' && check1) moveNext(nextid);
	if (id == prefix + '2' && check2) moveNext(nextid);
	if (nextid.length > 0 && id == prefix + '3' && check3) moveNext(nextid);
	}

function validCardNum(obj, nextid) {
	var id = obj.id;
	var prefix = id.substr(0, id.length - 1);
	var check1 = isValidIfNumericAndLength(4, $F(prefix + '1'));
	var check2 = isValidIfNumericAndLength(4, $F(prefix + '2'));
	var check3 = isValidIfNumericAndLength(4, $F(prefix + '3'));
	var check4 = isValidIfNumericAndLength(4, $F(prefix + '4'));
	Marker.mark(check1 && check2 && check3 && check4, $(prefix + '4'));
	if (id == prefix + '1' && check1) moveNext(nextid);
	if (id == prefix + '2' && check2) moveNext(nextid);
	if (id == prefix + '3' && check3) moveNext(nextid);
	if (nextid.length > 0 && id == prefix + '4' && check4) moveNext(nextid);
	}

function validPhone(obj, nextid) {
	var id = obj.id;
	var prefix = id.substr(0, id.length - 1);
	var check1 = isValidIfNumericAndLength(3, $F(prefix + '1'));
	var check2 = isValidIfNumericAndLength(3, $F(prefix + '2'));
	var check3 = isValidIfNumericAndLength(4, $F(prefix + '3'));
	Marker.mark(check1 && check2 && check3, $(prefix + '3'));
/* Commenting out code to jump to next field. CMB 2008-03-13 */
/*
	if (id == prefix + '1' && check1) moveNext(nextid);
	if (id == prefix + '2' && check2) moveNext(nextid);
	if (nextid.length > 0 && id == prefix + '3' && check3) moveNext(nextid);
*/
	}

function validOrEmptyPhone(obj, nextid) {
	var id = obj.id;
	var prefix = id.substr(0, id.length - 1);
	var check1 = isValidIfNumericAndLength(3, $F(prefix + '1'));
	var check2 = isValidIfNumericAndLength(3, $F(prefix + '2'));
	var check3 = isValidIfNumericAndLength(4, $F(prefix + '3'));
	Marker.mark((($F(prefix + '1').length == 0 && $F(prefix + '2').length == 0 && $F(prefix + '2').length == 0) || (check1 && check2 && check3)), $(prefix + '3'));
	if (id == prefix + '1' && check1) moveNext(nextid);
	if (id == prefix + '2' && check2) moveNext(nextid);
	if (nextid.length > 0 && id == prefix + '3' && check3) moveNext(nextid);
	}

function moveNext(nextid) {
	$(nextid).focus();
	}

function isValidEmail(str) {
	var emailRegex = /^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$/;
	return str.match(emailRegex) != null;
	}

function validEmail(obj) {
	Marker.mark(isValidEmail($F(obj)), obj);
	}

function validSelection(obj) {
	Marker.mark($F(obj).strip().length > 0, obj);
	}

function getByName(name) {
	return $A(document.getElementsByName(name));
	}

function validCheckbox(obj) {
	var nodes = getByName(obj.name);
	var chosen = 0;
	nodes.each(function(node){if (node.checked) chosen++;});
	Marker.mark(chosen > 0, obj);
	}

function validHours(obj) {
	var check = isValidIfNumericAndNotEmpty($F(obj));
	Marker.mark(check, obj);
	}

function validMonthDayYear(prefix) {
	var check = $F(prefix + 'Month').length > 1 && $F(prefix + 'Day').length > 1 && $F(prefix + 'Year').length > 1;
	Marker.mark(check, $(prefix + 'Year'));
	}

function validOrEmptyMonthDayYear(prefix) {
	var check = ($F(prefix + 'Month').length == 0 && $F(prefix + 'Day').length == 0 && $F(prefix + 'Year').length == 0) || ($F(prefix + 'Month').length > 1 && $F(prefix + 'Day').length > 1 && $F(prefix + 'Year').length > 1);
	Marker.mark(check, $(prefix + 'Year'));
	}

function validOrEmptyHourMinAmPm(prefix) {
	var check = ($F(prefix + 'Hr').length == 0 && $F(prefix + 'Min').length == 0 && $F(prefix + 'AmPm').length == 0) || 
	($F(prefix + 'Hr').length > 0 && $F(prefix + 'Min').length > 0 && $F(prefix + 'AmPm').length > 0);
	Marker.mark(check, $(prefix + 'AmPm'));
	}

function validCreditCardExp() {
	Marker.mark($F('creditCardExpMonth').length > 1 && $F('creditCardExpYear').length > 1, $('creditCardExpYear'));
	}

function validExtension(obj, arrayOfValidExtensions) {
	var extension = fileExtension(obj.value);
	var partBeforeExtension = obj.value.substring(0, obj.value.lastIndexOf('.'));
	var check = arrayOfValidExtensions.include(extension) && partBeforeExtension.length > 0;
	Marker.mark(check, obj);
	}

function validExtensionOrEmpty(obj, arrayOfValidExtensions) {
	var extension = fileExtension(obj.value);
	var partBeforeExtension = obj.value.substring(0, obj.value.lastIndexOf('.'));
	var check = (obj.value.length == 0) || (arrayOfValidExtensions.include(extension) && partBeforeExtension.length > 0);
	Marker.mark(check, obj);
	}

function fileExtension(filename) {
	var period = filename.lastIndexOf('.');
	return filename.substring(period + 1);
	}

function getChildRadioName(obj) {
	var row = obj.parentNode.parentNode.nextSibling.nextSibling;
	if (row == null) return null;
	return row.childNodes[1].nextSibling.nextSibling.firstChild.name;
	}

function enableChildRadios(obj) {
	var allMajors = getMajors();
	allMajors.each(function(node) {
		majorChildName = getChildRadioName(node); if (majorChildName != null) {
			Enabler.enable(majorChildName, false); }
		}
	);
	}

function elementsOfTypeWithClassName(startingNode, className, tagName) {
	var nodes = [];
	$A(startingNode.getElementsByTagName(tagName)).each(function(node) {
		if (Element.hasClassName(node, className)) nodes.push(node); }
	);
	return nodes;
	}

function getElementsByClassName_v(startingNode, className) {
	return elementsOfTypeWithClassName(startingNode, className, 'fieldset').concat( elementsOfTypeWithClassName(startingNode, className, 'td')).concat( elementsOfTypeWithClassName(startingNode, className, 'p'));
	}
var startingInvalidNodes = [];
var currentNotValidNodes = [];
var doDebug = false;

function allParentsVisible(node) {
	var parent = node //.parentNode;
	var parentsVisible = true;
	if (!Element.visible(parent)) return false;
	while (parent && parent.tagName != 'FIELDSET') {
		parentsVisible = parentsVisible && Element.visible(parent);
		if (!parentsVisible) break;
		parent = parent.parentNode;
		}
	return parentsVisible && Element.visible(parent);
	}

function anyNotValid() {
	var currentNotValidNodes = getElementsByClassName_v($('validForm'), 'notValid');

/*
	currentNotValidNodes = [];
	startingInvalidNodes.each(function(node) {
		var parentsVisible = allParentsVisible(node); if (parentsVisible && Element.hasClassName(node, 'notValid')) currentNotValidNodes.push(node); }
	);
*/
	return currentNotValidNodes.length != 0;
	}

function watchForAllValid() {
	if (anyNotValid()) {
		Element.show($('allNotValid'));
		$('submit').disabled = true;
		}
	else {
		// Joy!
		Element.hide($('allNotValid'));
		$('submit').disabled = false;
		}
	}
