/*  ******************************************************************
 **  Soubor  :  /ariadne/javascript/validator_obj.js
 **
 **  Modul   :  Automatický validátor formulářů
 **  Verze   :  0.1.0
 **
 **  Autor   :  Michal Hromádko      michal.hromadko@lifeweb.cz
 **  Revize  :  Martin Jonáš         martin.jonas@lifeweb.cz
 **
 **  Popis   :  Funkce pro validaci vstupu od uživatele
 ** ***************************************************************** */

/**
 * Formát data podle normy ISO
 */
var ISO_DATE_FORMAT = "%Y-%m-%d %H:%M:%S";

/**
 * Funkce provádí validaci vybraných polí formuláře podle zadaných pravidel
 * @param theForm Reference na objekt validovaného formuláře
 * @param value Pole s nastavením validátorú pro validovaná pole
 * @return Vrací true při platnosti všech validovaných polí
 */
function Validate(theForm, validators) {
  var result = true;
  var errors = "";

  for(var field in validators) {
    for (var i in validators[field]) {
      if (!validators[field][i].Validate(theForm[field])) {
        result = false;
        errors += validators[field][i].error + "\n";
      }
    }
  }
  if (!result)
    alert(errors);
  return result;
}

/**
 * Funkce porovnává hodnotu s regulárním výrazem
 * @param regexp Regulární výraz
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function match(regexp, error) {
  this.Reg = new RegExp(regexp);
  this.error = error;

  this.Validate = function(field) {
    var M = this.Reg.exec(field.value);
    return (M != null);
  }
}

/**
 * Funkce zjišťuje prázdnost textového pole
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function isEmpty(error) {
  this.error = error;

  this.Validate = function(field) {
    return !((field.value.length != 0) && (field.value != null));
  }
}

/**
 * Funkce zjišťuje neprázdnost textového pole
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function notEmpty(error) {
  this.error = error;

  this.Validate = function(field) {
    return !((field.value.length == 0) || (field.value == null));
  }
}

/**
 * Funkce porovnává pole se zadanou hodnotou na shodu. Je case-sensitive
 * @param val Porovnávaná hodnota
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function equals(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value == this.val);
  }
}

/**
 * Funkce porovnává pole se zadanou hodnotou na shodu. Je case-insensitive
 * @param val Porovnávaná hodnota
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function equalsCI(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value.toLowerCase() == this.val.toLowerCase());
  }
}

/**
 * Funkce porovnává pole se zadanou hodnotou na neshodu. Je case-sensitive
 * @param val Porovnávaná hodnota
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function notEquals(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value != this.val);
  }
}

/**
 * Funkce porovnává pole se zadanou hodnotou na neshodu. Je case-insensitive
 * @param val Porovnávaná hodnota
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function notEqualsCI(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value.toLowerCase() != this.val.toLowerCase());
  }
}

/**
 * Funkce zjistí zda je prvek obsažen v poli
 * @param array Prohledávané pole
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function isIn(array, error) {
  this.array = array;
  this.error = error;

  this.Validate = function(field) {
    for(var i = 0; i < this.array.length; i++) {
      if(this.array[i] == field.value)
        return true;
    }
    return false;
  }
}

/**
 * Funkce zjistí zda je zadaná hodnota číslem
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function isNumber(error) {
  this.error = error;

  this.Validate = function(field) {
    return (parseFloat(field.value) == field.value);
  }
}

/**
 * Funkce zjistí zda je zadané číslo větší nebo rovno minimu
 * @param val Miniumum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function minimum(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value >= this.val);
  }
}

/**
 * Funkce zjistí zda je zadané číslo menší nebo rovno maximu
 * @param val Maximum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function maximum(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value <= this.val);
  }
}

/**
 * Funkce zjistí zda zadané číslo náleží určenému intervalu
 * @param min Miniumum
 * @param max Maximum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function inInterval(min, max, error) {
  this.min = min;
  this.max = max;
  this.error = error;

  this.Validate = function(field) {
    return ((field.value >= this.min) && (field.value <= this.max));
  }
}

/**
 * Funkce ověřuje minimální délku textu
 * @param val Miniumum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function minLength(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value.length >= this.val);
  }
}

/**
 * Funkce ověřuje maximální délku textu
 * @param val Maximum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function maxLength(val, error) {
  this.val = val;
  this.error = error;

  this.Validate = function(field) {
    return (field.value.length <= this.val);
  }
}

/**
 * Funkce ověřuje, zda má text délku v určeném rozmezí
 * @param min Miniumum
 * @param max Maximum
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function lengthBetween(min, max, error) {
  this.min = min;
  this.max = max;
  this.error = error;

  this.Validate = function(field) {
    return ((field.value.length >= this.min) && (field.value.length <= this.max));
  }
}

/**
 * Funkce ověřuje správnost zadaného data
 * @param format Formát data
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function isDate(format, error) {
  this.format = format;
  this.error = error;

  this.Validate = function(field) {
    return isDateInFormat(field.value, this.format);
  }
}

/**
 * Funkce ověřuje, zda je zadané datum před určeným datem
 * @param date Určené datum v ISO formátu
 * @param format Formát data
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function dateBefore(date, format, error) {
  this.date = date;
  this.format = format;
  this.error = error;

  this.Validate = function(field) {
    var DatValue = getDateFromFormat(field.value, this.format);
    var DatDate = getDateFromFormat(this.date, ISO_DATE_FORMAT);

    return (DatValue <= DatDate);
  }
}

/**
 * Funkce ověřuje, zda je zadané datum po určeném datu
 * @param date Určené datum v ISO formátu
 * @param format Formát data
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function dateAfter(date, format, error) {
  this.date = date;
  this.format = format;
  this.error = error;

  this.Validate = function(field) {
    var DatValue = getDateFromFormat(field.value, this.format);
    var DatDate = getDateFromFormat(this.date, ISO_DATE_FORMAT);

    return (DatValue >= DatDate);
  }
}

/**
 * Funkce ověřuje, zda je zadané datum mezi určenýmy daty
 * @param min Minimální datum v ISO formátu
 * @param max Maximální datum v ISO formátu
 * @param format Formát data
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function dateBetween(min, max, format, error) {
  this.min = min;
  this.max = max;
  this.format = format;
  this.error = error;

  this.Validate = function(field) {
    var DatValue = getDateFromFormat(field.value, this.format);
    var DatMin = getDateFromFormat(this.min, ISO_DATE_FORMAT);
    var DatMax = getDateFromFormat(this.max, ISO_DATE_FORMAT);

    return ((DatValue >= DatMin) && (DatValue <= DatMax));
  }
}

/**
 * Funkce ověřuje správnost zadané emailové adresy
 * @param error Chybové hlášení při neplatnosti pole
 * @return Vrací true při platnosti pole
 */
function isMail(error) {
  this.Reg = new RegExp("^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$");
  this.error = error;

  this.Validate = function(field) {
    var M = this.Reg.exec(field.value);
    return (M != null);
  }
}

