function LiveValidate() {
  this.elements = new Array;
//  this.form = null;
  this.submitError = 'Het formulier is niet juist ingevuld!';
  this.errorMessage = 'Onjuiste invoer!';
  this.successMessage = 'Ok';
  // public methods
  this.addElement = LV_addElement;
  this.validate = LV_validate;
  // private methods
  this.testMatch = LV_testMatch;
  this.success = LV_success;
  this.failure = LV_failure;
//  this.validateKeys = LV_validateKeys;
  this.hasClass = LV_hasClass;
  this.addClass = LV_addClass;
  this.removeClass = LV_removeClass;
}

function LV_addElement(element_id, lv_match, lv_method, emsg, smsg) {
  var element = document.getElementById(element_id);
  
  // standaard waarden van element instellen
  this.elements.push(element);
  if (lv_match)  { element.lv_match = lv_match; }
  if (lv_method) { element.lv_method = lv_method; }
  element.errorMessage = emsg == null ? this.errorMessage : emsg;
  element.successMessage = smsg == null ? this.successMessage : smsg;

  // element voor berichten aanmaken
  var error_message;
  if ((element.error_message != '' || element.successMessage != '') && !document.getElementById("lv_message_" + element.id)) {
    error_message = document.createElement("span");
    error_message.className = "lv_message";
    error_message.setAttribute("id", "lv_message_" + element.id);
    element.parentNode.insertBefore(error_message, element.nextSibling);
  }
  this.addClass(element, "live_validate");
  this.validate([element]);
  
/*
  if (element.allowedKeys)) element.onkeypress = function(e) {
    if (!e) var e = window.event;
    this.validateKeys(e, this);
  }
*/  
  if (element.lv_match || element.lv_method) {
    var ths = this;
    element.onkeyup = function() {
      ths.testMatch(this);
    }
  }
}

function LV_validate(elements) {
  var i = elements.length;
  var testOK = true;
  while (i > 0 && testOK) {
    --i;
    testOK = this.testMatch(elements[i]);
  }
  return testOK;
}

function LV_testMatch(element) {
  // test element volgens reguliere expressie
  if (element.lv_match) {
    var match_reg = new RegExp(element.lv_match);
    if (!match_reg.test(element.value)) {
      this.failure(element);
      return false;
    }
  }
  
  // test element volgens functie evaluatie
  if (element.lv_method) {
    if (!eval(element.lv_method)) {
      this.failure(element);
      return false;
    }
  }
  
  this.success(element);
  return true;
}

function LV_success(element) {
  this.removeClass(element, "lv_error");
  this.addClass(element, "lv_success");

  var msgspan = document.getElementById("lv_message_" + element.id)
  if (msgspan) {
    this.removeClass(msgspan, "lv_error_message");
    this.addClass(msgspan, "lv_success_message");
  
    if (element.successMessage && element.successMessage != '')
      msgspan.innerHTML = element.successMessage;
  }
}

function LV_failure(element) {
  this.removeClass(element, "lv_success");
  this.addClass(element, "lv_error");

  var msgspan = document.getElementById("lv_message_" + element.id)
  if (msgspan) {
    this.removeClass(msgspan, "lv_success_message");
    this.addClass(msgspan, "lv_error_message");
  
    if (element.errorMessage && element.errorMessage != '')
      msgspan.innerHTML = element.errorMessage;
  }
}
/*
function LV_validateKeys(e, ele) {
  //Find Which key is pressed
  if (e.keyCode) code = e.keyCode;
  else if (e.which) code = e.which;
  var character = String.fromCharCode(code);

  //We need only valid keypresses - not stuff like shift, Enter, Backspace etc.
  //Delete Key
  if (e.ctrlKey || code == 46) return;
  if (e.shiftKey) {
    if (!(code >= 37 && code <= 40)) return; //Up,Down,Right and Left - same keycode as %,&,' and (
  } else {
    if (!(code >= 41 && code <= 126)) return;
  }

  if (ele.getAttribute("allowedkeys")) {
    var allowed_chars = new RegExp(ele.getAttribute("allowedkeys"));
    if (!allowed_chars.test(character)) { //If a character was entered that is not allowed.
      this.stopEvent(e);
    }
  }
}
*/
function LV_hasClass(ele, cls) {
  return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}

function LV_addClass(ele, cls) {
  if (!this.hasClass(ele, cls)) ele.className += " " + cls;
}

function LV_removeClass(ele, cls) {
  if (this.hasClass(ele, cls)) {
    var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
    ele.className = ele.className.replace(reg, ' ');
  }
}
