function validateObj(formName) {
  this.form = document.getElementById(formName);
  if (!this.form) this.form = document.forms[formName];
	this.clearError();
}

/*
*  Vyprázdní všechna vstupní pole která se mají validovat.
*/
validateObj.prototype.clear = function() {
  var em = this.form.elements;
  for(var i=0; i<em.length; i++) {
    var e = em[i];
    if (this.isValiding(e)) {
      switch (e.tagName.toLowerCase()) {
        case 'input' :
          switch (e.getAttribute('type')) {
            case 'text' :
              e.value = '';
              break;
            case 'checkbox' :
              e.checked = false;
              break;
            case 'select' :
              e.selectedIndex = -1;
              break;
          }
          break;
        case 'textarea' :
          e.innerHTML = '';
          break;
      }
    }
  }
}

/*
*  Zjistí jestli DOM element má být validován
*/
validateObj.prototype.isValiding = function(e) {
  return e.getAttribute('_typ');
}

/*
*  Skryje všechna chybová hlášení
*/
validateObj.prototype.clearError = function() {
  var em = this.form.elements;
  for(var i=0; i<em.length; i++) {
    var e = em[i];
    var err = this.getErrorElement(e.getAttribute('name'));
    if (this.isValiding(e) && err) {
      err.style.display = 'none';
      err.innerHTML = '';
    }
  }
}

/*
*  Vrátí DOM element ukazující na objekt pro zobrazení chyby
*/
validateObj.prototype.getErrorElement = function(name) {
  return document.getElementById('err' + name);
}

/*
*  Vrátí hodnotu uloženou v předaném DOM elementu
*/
validateObj.prototype.getValueFromElement = function(element) {
  var value = '';
  switch (element.tagName.toLowerCase()) {
    case 'input' :
      switch (element.getAttribute('type')) {
        case 'text' :
          value = element.value;
          break;
        case 'checkbox' :
          value = element.checked ? '1' : '0'
          break;
        case 'select' :
          value = element.value;
          break;
      }
      break;
    case 'textarea' :
      //value = element.innerHTML;
      value = element.value;
      break;
    default :
      value = element.innerHTML;
  }
  return value;
}

/*
*  Zobrazí chybové hlášení k danému DOM elementu
*/
validateObj.prototype.setErrorElement = function(name,textError) {
  var e = this.getErrorElement(name);
  if (e) {
    e.style.display = 'inline';
    e.innerHTML = textError;
  }
}

/*
*  Kontrola vstupu dle regulárního výrazu
*/
validateObj.prototype.checkReg = function(exp,str) {
  if (exp !="" && str!="") {
    return str.match(exp);
  }
  return false;
}

/*
*  Zkontroluje zda hodnota zadané v elementu je validní dle nastavených parametrů
*/
validateObj.prototype.isValidElement = function(element) {
  var type = element.getAttribute('type');
  if (type == 'text' || element.tagName.toLowerCase() == 'textarea') {
    var value = this.getValueFromElement(element);
    var name = element.getAttribute('name');
    var typ = element.getAttribute('_typ');
    var max = element.getAttribute('_max') ? Number(element.getAttribute('_max')) : 'x';
    var min = element.getAttribute('_min') ? Number(element.getAttribute('_min')) : 'x';
    var pov = element.getAttribute('_povinne') ? (element.getAttribute('_povinne') == 'ano') : false;
    var reg = element.getAttribute('_regex') ? element.getAttribute('_regex') : false;

    if (value.length == 0 && pov) {
      this.setErrorElement(name,'Povinný údaj!');
      return false;
    }
    if (value.length > 0) pov = true; // -- pokud je zadaná nějaká hodnota, tak je povinnost kontrolovat vždy

    switch (typ) {
      case 'mail' :
        if (pov && !this.checkReg('^([[:alnum:]]|_|\.|-)+@([[:alnum:]]|\.|-)+(\.)([a-z]{2,4})$',value)) {
          this.setErrorElement(name,'Chybně zadaný mail!');
          return false;
        }
        break;
      case 'www' :
        if (pov && !this.checkReg('^(http://)([[:alnum:]]|_|\.|-)+(\.)([[:alnum:]]|\.|-)+(\.)([a-z]{2,4})$',value)) {
          this.setErrorElement(name,'Chybně zadaná webová adresa! Požadovaný formát je "http://www.example.com".');
          return false;
        }
        break;
      case 'date' :
        if (pov && !this.checkReg('^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$',value)) {
          this.setErrorElement(name,'Údaj není datum!');
          return false;
        }
        break;
      case 'integer' :
      case 'money' :
        if (typ == 'integer' && pov && !this.checkReg('^-{0,1}[0-9]{1,10}$',value)) {
          this.setErrorElement(name,'Údaj není celým číslem!');
          return false;
        }
        if (typ == 'money' && pov && !this.checkReg('^-{0,1}[0-9]{1,10}\.{0,1}[0-9]{0,5}$',value)) {
          this.setErrorElement(name,'Údaj není číslem!');
          return false;
        }
        value = Number(value);
        if (pov && min != 'x' && value < min) {
          this.setErrorElement(name,'Nejmenší povolená hodnota je ' + min);
          return false;
        }
        if (pov && max != 'x' && value > max) {
          this.setErrorElement(name,'Největší povolená hodnota je ' + max);
          return false;
        }
        break;
      default : // -- text
        if (pov && min != 'x' && value.length < min) {
          this.setErrorElement(name,'Text musí mít minimálně ' + min + ' znaků!');
          return false;
        }
        if (pov && max != 'x' && value.length > max) {
          this.setErrorElement(name,'Text může mít maximálně ' + max + ' znaků!');
          return false;
        }
    }

    if (reg != false) {
      if (pov && !this.checkReg(reg,value)) {
        this.setErrorElement(name,'Chybný vstup!');
        return false;
      }
    }
  }
  return true;
}

/*
*  Provede validaci formuláře.
*/
validateObj.prototype.isValidate = function() {
  var result = true;
  this.clearError();
  var em = this.form.elements;
  for(var i=0; i<em.length; i++) {
    if (this.isValiding(em[i])) {
      result = this.isValidElement(em[i]) && result;
    }
  }
  return result;
}

