/**
 *  Kontrola formulárov podľa určených pravidiel
 */

  if (!FormChecker && typeof $ != 'undefined') {
  
    /**
     *  Kontrolór formulárov. Ako vstupný parameter sa zadáva
     *  pole obsahujúce objekty pravidiel, podľa ktorých sa 
     *  budú kontrolovať prvky.
     *  
     *  Typy kontrôl:
     *    - jednoduchá kontrola, element musí byť vyplnený: mandatory
     *    - e-mail: email
     *    - celé číslo (integer): int
     *    - regulárny výraz (musí byť tiež definovaný vlastnosťou rule.re): regex
     *  
     *  Kontrola sa spúšťa metódou FormChecker::checkForm().      
     */           
    var FormChecker = {
      rulesStack: {},
      messageStack: {},
      
      /**
       *  Inicializácia kontrolóra formulárov.
       *  
       *  @param object r pole pravidiel
       */                   
      init: function(r) {
        this.rulesStack = r;
        return this;
      },
      
      /**
       *  Spustenie kontroly formulára. Kontrolujú sa polia
       *  podľa ID, ktoré je uložené v poli polí.
       *  @param noCheck vylučuje polia, ktoré sa nemajú kontrolovať     
       */              
      checkForm: function(noCheck) {
        $(".form-error").remove();
        var ret = true;
        for (rule in this.rulesStack) {
          var rv = true;
          var r = this.rulesStack[rule];
          var e = $("#" + r.id);
          var v = e.val();
          var t = r.type;
          var m = r.message;
          if (t == 'mandatory' && v.length < 1) rv = false;
          else if (t == 'email' && !v.match(/^.+@.+\..+$/)) rv = false;
          else if (t == 'int' && !v.match(/^[0-9]+$/)) rv = false;
          else if (t == 'regex' && !v.match(r.re)) rv = false;
          else if (t == 'checked' && !e.attr('checked')) rv = false;
          else if (t == 'match' && v != $('#' + r['with']).val()) rv = false;
          for (nc in noCheck)
            if (noCheck[nc] == r.id) rv = true;
          if (!rv) {
            e.parent().prepend('<p class=\'form-error\'>' + m + '</p>');
            this.messageStack[r.id] = m;
            ret = rv;
          }
        }
        return ret;
      },
      
      /**
       *  Získa chybovú správu podľa ID poľa.
       */         
      getMessage: function(id) {
        return this.messageStack[id];
      }
    };
    
  }

