/*
 *  Classe MAHSValidation ---->TODO COMMENT<-----
 */

/* 
 * Questa classe permette di indicare se il campo input di un form è valido.
 *
 * @author Antonio Bencivenga <a.bencivenga@mahs.it>, Marco Giammarini <m.giammarini@mahs.it>
 * @version 0.1.0
 * @copyright 2009-2010 - MAHS di Antonio Bencivenga - www.mahs.it  
 * @package mahsJS/mahsJSBase
 */
var MAHSValidation =
{
  /*
   * Regole di validazione.
   */
  rules:
  {
    euro: /^\d+(\.\d\d)$/,
    year:/^[1-2]{1}[0-9]{3}$/,
    yearMod:/^([1-2]{1}[0-9]{3})?$/,
    twoDecimal: /^\d+(\.\d\d)$/,
    twoDecimalempty: /^(\d+(\.\d\d))?$/,
    decimal: /^-?\d+(\.\d+)?$/,
    rgb: /^[A-Fa-f0-9]{6}$/,
    something: /./,
    emptyOrSomething: /(.)?/,
    notWhitespace: /\S+/,
    nomi: /^[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöøùúûüýa-zA-Z\s']{3,}$/,
    vie: /^[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöøùúûüýa-zA-Z0-9\s',.-]{3,}$/,
    citta: /^[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöøùúûüýa-zA-Z\s'.-]{3,}$/,
    userpass: /^[0-9a-zA-Z]{6,}$/,
    positiveInteger: /^\d*[1-9]\d*$/,
    positiveIntegerMod: /^(\d*[1-9]\d*)?$/,
    positiveOrZeroInteger: /^\d+$/,
    integer: /^-?\d+$/,
    natural: /^\d+$/,
    email: /^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/,
    telephone: /^(\+\d+)?( |\-)?(\(?\d+\)?)?( |\-)?(\d+( |\-)?)*\d+$/,
    telephoneMod: /^((\+\d+)?( |\-)?(\(?\d+\)?)?( |\-)?(\d+( |\-)?)*\d+)?$/,
    provincia: /^[a-zA-Z]{2}$/,
    provinciaMod: /^([a-zA-Z]{2})?$/,
    cFiscale: /^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$/,
    pIva: /^[0-9]{11}$/,
    cFiscaleAzienda: /^(([0-9]{11})|([a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]))$/,
    cFiscaleAziendaMod: /^(([0-9]{11})|([a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]))?$/,
    data: /^(0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.]((19|20)\d\d)$/,
    dataMod: /^((0[1-9]|[12][0-9]|3[01])[.](0[1-9]|1[012])[.]((19|20)\d\d))?$/,
    cap: /^[0-9]{5}$/,
    capMod: /^([0-9]{5})?$/,
    web: /^http:\/\/(www\.)?[a-zA-Z0-9-]{3,}\.[a-zA-Z]{2,}(\/)?$/,
    webMod: /^(http:\/\/(www\.)?[a-zA-Z0-9-]{3,}\.[a-zA-Z]{2,}(\/)?)?$/,
    ip: /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))(\:[0-9]{1:5})?$/
  },

  /*
   * Metodo che associa ad ogni evento 'focus' e 'keyup' degli input di un form un listener per controllare la validità del contenuto.
   * Necessaria per funzionare con mahs.js
   */
  init: function()
  {
    // Acquisisco gli elementi form.
    var forms = document.getElementsByTagName("form");
    // Per ognuno prendo gli elementi interni.
    for(var i = 0; i < forms.length; i++)
    {
      // Prendo ciascun form
      var fields = forms[i].elements;
      // e ne scansiono gli elementi.
      for(var j = 0; j < fields.length; j++)
      {
        // Se ha come classe 'to-validate' allora aggiungo l'evento.
        if(MAHSCore.hasClass(fields[j],"to-validate"))
        {
          MAHSCore.addEventListener(fields[j], "focus", MAHSValidation.validateListener);
          MAHSCore.addEventListener(fields[j], "keyup", MAHSValidation.validateListener);
        }
      }
    }
  },

  /*
   * Metodo che si occupa di controllare se il campo input in cui è stato scatenato l'evento è valido.
   *
   * @param event L'evento che ha scatenato la chiamata del listener.
   */
  validateListener: function(event)
  {
    // tutte le classi presenti.
    var classNames = this.className.split(" ");
    // Prendo la quarta: 1.generale 2.validate 3.required 4.type-validate.
    var ruleClass = classNames[3];
    // Catturo la regola indicata.
    var rule = MAHSValidation.rules[ruleClass];
    // Se la regola esiste.
    if(typeof rule != "undefined")
    {
      // Se la regola non viene rispettata tolgo la classe 'validate' e aggiungo 'not-validate'.
      if(!rule.test(this.value))
      {
        this.focus();
        MAHSCore.removeClass(this, "validate");
        MAHSCore.addClass(this, "not-validate");
      }
      else
      {
        // Altrimenti il contrario.
        MAHSCore.removeClass(this, "not-validate");
        MAHSCore.addClass(this, "validate");
      }
    }
  }
};

MAHSCore.start(MAHSValidation);

