var fV = {
  init: function() {
    for (var i in validationSet) {
      if (document.getElementsByName(i)) {
        var formField = document.getElementsByName(i)[0];
		/* bind a span to each form field */
		var errorSpan = document.createElement("span");
		errorSpan.className = "errormessage";
		/* give it the id of 'error_' + the current field's name */
		errorSpan.id = 'error_' + formField.name;
		formField.parentNode.appendChild(errorSpan);
		/* append the error span to the field's parent add add the blur handler */
        addEvent(formField, 'blur', fV.checkValid, false);
		
        if (!formField.form.validateSubmit) {
          addEvent(formField.form, 'submit', fV.checkValidSubmit, false);
          formField.form.onsubmit = fV.checkSubmit; // Safari
          formField.form.validateSubmit = true;
        }
      }
    }
  },

  checkValidSubmit: function(e) {
    var frm = window.event ? window.event.srcElement : e ? e.target : null;
    if (!frm) return;
    var errText = [];

    for (var i = 0; i < frm.elements.length; i++) {
      if (frm.elements[i].name && validationSet[frm.elements[i].name]) {

        var failedE = fV.handleValidity(frm.elements[i]);
		
        var errDisplay = document.getElementById('error_' + frm.elements[i].name);
	
		if (failedE && errDisplay) {
		  errDisplay.innerHTML = validationSet[failedE.name]['error'];
		}
	
		if (!failedE && errDisplay) {
		  errDisplay.innerHTML = '';
		}

        if (failedE) {
          var labels = document.getElementsByTagName('label');
          errText[errText.length] = validationSet[failedE.name]['error'];
          for (var j = 0; j < labels.length; j++) {
            if (labels[j].htmlFor == failedE.id) {
              errText[errText.length - 1] +=
                  ' - ' + labels[j].firstChild.nodeValue;
            }
          }
        }
      }  /* end 'if' */
    } /* end 'for' */

    if (errText.length > 0) {
	/* checks for a holder called validationmessage to list out the errors if not the alert them */
	  var fixMsg = "The following fields contain errors or are incomplete please fix these and resubmit:"
	  if (document.getElementById("validationmessage")) {
		var msg = document.getElementById("validationmessage");
		var newul = document.createElement("ul");
		var spanmsg = document.createElement("span");
		spanmsg.appendChild(document.createTextNode(fixMsg));
		msg.appendChild(spanmsg);
		msg.appendChild(newul);
		for (var i=0; i<errText.length; i++) {
			var newli = document.createElement("li");
			newli.appendChild(document.createTextNode(errText[i].split("-")[1]));
			newul.appendChild(newli);
		}
		if (document.getElementById("msgul")) {
			msg.removeChild(document.getElementById("msgul"));
			msg.removeChild(document.getElementById("msgspan"));
		}
		newul.setAttribute("id","msgul");
		spanmsg.setAttribute("id","msgspan");
	  } else {
        alert(fixMsg+'\n' +
          errText.join('\n'));
	  }
      frm.submitAllowed = false;
      if (e && e.stopPropagation && e.preventDefault) {
        e.stopPropagation();
        e.preventDefault();
      }
      if (window.event) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
        return false;
      }
    } else {
      frm.submitAllowed = true;
    }
  },

  checkSubmit: function() {
    if (this.attachEvent) return true;
    return this.submitAllowed;
  },
  
  checkValid: function(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;

    var failedE = fV.handleValidity(target);

    var errDisplay = document.getElementById('error_' + target.name);

    if (failedE && errDisplay) {
      errDisplay.innerHTML = validationSet[failedE.name]['error'];
    }
    if (failedE && !errDisplay) {
      alert(validationSet[failedE.name]['error']);
    }
    if (!failedE && errDisplay) {
      errDisplay.innerHTML = '';
    }
  },

  handleValidity: function(field) {
	var errorClass = field.className.replace(/(^| )textfield( |$)/, "fielderror");
	var normalClass = field.className.replace(/(^| )fielderror( |$)/, "textfield");
	switch(field.type){
		case "select-one":
			if (field.selectedIndex == -1 || field.options[field.selectedIndex].value == ""){
				field.className = errorClass;
				return field;
			} else {
			    field.className = normalClass;
			    return null;
			}
		case "select-multiple":
			if (field.selectedIndex == -1){
				field.className = errorClass;
				return field;
			} else {
			    field.className = normalClass;
				return null;
			}			
		case "text":
		case "textarea":	
			var re = validationSet[field.name]['regexp'];
			if (!field.value.match(re)) {
			  field.className = errorClass;
			  return field;
			} else {
			  field.className = normalClass;
			  return null;
			}
		case "radio":
		case "checkbox":
			var blnchecked = false;
			if (field.type == "radio") {
				for (var j = 0; j < field.form.elements[field.name].length; j++) {
					if (field.form.elements[field.name][j].checked) {
						blnchecked = true;
					}
				}
			} else if (field.type == "checkbox") {
				if (field.checked) {
					blnchecked = true;	
				}
			}
			if (!blnchecked){
				return field;
			} else {
			  	return null;
			}
		default:
			return null;
	}
  }
}

//addEvent(window, 'load', fV.init, false);
addLoadListener(fV.init);