if(window.addEventListener) {
 window.addEventListener('load', initFormValidators, false);
} else if(window.attachEvent) {
  window.attachEvent('onload', initFormValidators);
}

function initFormValidators() {
  for(var i = 0; i < document.forms.length; i++) {
    initFormValidator(document.forms[i]);
  }
}

function initFormValidator(form) {
  validateForm(form);
  form.onsubmit = function() { return validateForm(form); };
  if(!form.elements)
    return;
  for(var j = 0; j < form.elements.length; j++) {
    var elem = form.elements[j];
    formValidatorAddEventListener(elem, "change", function(){ validateForm(form); return true; });
    if((elem.tagName == "INPUT" && elem.type != "submit")
	|| elem.tagName == "TEXTAREA") {
      formValidatorAddEventListener(elem, "keyup", function(){ validateForm(form); return true; });
    }
  }
}

function formValidatorAddEventListener(elem, eventType, handler) {
  if(elem.addEventListener)
    elem.addEventListener(eventType, handler, false);
  else if(elem.attachEvent)
    elem.attachEvent('on' + eventType, handler);
}

function validateForm(form) {
  var inputs = form.elements;
  if(!inputs)
    return;
  var valid = true;
  var errorelements = new Array();
  for(var i = 0; i < inputs.length; i++) {
    var input = inputs[i];
    var errorelement = null;
    if(input.id)
      errorelement = "label_for_" + input.id;
    if(input.getAttribute("errorelement"))
      errorelement = input.getAttribute("errorelement");
    if(validateFormField(input)) {
      if(errorelement && typeof errorelements[errorelement] == "undefined")
        errorelements[errorelement] = true;
    } else {
      if(errorelement)
        errorelements[errorelement] = false;
      valid = false;
    }
  }
  for(var i in errorelements) {
    markValid(i, errorelements[i]);
  }
  for(var i = 0; i < inputs.length; i++) {
    var input = inputs[i];
    if(input.getAttribute("type") && input.getAttribute("type") == "submit") {
      if(valid) {
        input.disabled = false;
        input.removeAttribute('disabled');
      } else {
        input.disabled = true;
        input.setAttribute('disabled','disabled');
      }
    }
  }
  var elems = form.getElementsByTagName("*");
  for(var i = 0; i < elems.length; i++) {
    var elem = elems[i];
    if(valid) {
      var src = elem.getAttribute("enabledsrc");
      if(src && src != elem.getAttribute("src"))
        elem.setAttribute("src", src);
    } else {
      var src = elem.getAttribute("disabledsrc");
      if(src && src != elem.getAttribute("src"))
        elem.setAttribute("src", src);
    }
  }
  return valid;
}

function validateFormField(input) {
  if(input.getAttribute("required") && (!input.value || input.value == input.getAttribute("defaultvalue")))
    return false;
  if(!input.getAttribute("required") && input.value == input.getAttribute("defaultvalue"))
    return true;
  var regex = input.getAttribute("mustMatch");
  if(regex && input.value && !input.value.match(regex))
    return false;
  var customCheck = input.getAttribute("customCheck");
  if(customCheck) {
    var value = input.value;
    if(!eval(customCheck))
      return false;
  }
  var xwith = input.getAttribute("xwith");
  if(xwith) {
    var xelem = document.getElementById(xwith);
    if((xelem && xelem.value && xelem.value != "0" && input.value && input.value != "0")
         || (xelem && (!xelem.value || xelem.value == "0") && (!input.value || input.value == "0")))
      return false;
  }
  return true;
}

function markValid(errorelement, valid) {
  var elem = document.getElementById(errorelement);
  if(elem) {
   elem.addClassName(valid ? 'fieldValid' : 'fieldInvalid');
   elem.removeClassName(valid ? 'fieldInvalid' : 'fieldValid');
  }
}

