function Validator()
{
  //Var
  this.errordiv = 'message';
  this.typeError = '';

  //Utility function
  this.getEl = function(id)
  {
    return  document.getElementById(id);
  }

  this.cleanError = function(tovalidate)
  {
    this.getEl('message').style.visibility = 'hidden';
    this.getEl('message').innerHTML = '';
    for(i = 0; i < tovalidate.length; i++)
      this.removeimg(tovalidate[i].id+'_img');
  }

  this.removeimg = function(id)
  {
    if(imgerror = document.getElementById(id))
    {
      imgerror.parentNode.removeChild(imgerror);
    }
  }

  this.error = function(el,message)
  {
    if(message == undefined)
    {
      message = 'Errore nel campo '+el.id;
    }
    //el.style.backgroundColor = '#f4141';
    el.style.backgroundColor = '#e15151';
    //gen img
    var img = document.createElement('img');
    img.height = 14;
    img.width = 14;
    img.src = 'tpl/default/img/divieto.gif';
    img.title = message + this.typeError;
    img.id = el.id + '_img';
    img.setAttribute('class','divieto');
    el.parentNode.appendChild(img);

    el.onfocus = function(){this.style.backgroundColor = 'white'; this.value = ''}
    errorcontainer = document.getElementById('message');
    errorcontainer.style.visibility = 'visible';
    errorcontainer.setAttribute('class','error');
    //errorcontainer.innerHTML += "<br>"+ message + this.typeError;
    errorcontainer.innerHTML = 'Errore nell\'invio. Assicurarsi di riempire i campi obbligatori e e riprovare';
  }

  //Clenup function
  this.comma2dot = function(number)
  {
      var pattern = /,/;
      var temp = number.replace(pattern, ".");
      return temp;
  }

  //control function
  this.isEmpty = function(str)
  {
    if(str.length == 0 || str == undefined || str == '')
    {
      return true;
    }
    return false;
  }

  this.isEmail = function(str)
  {
     emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
     if(!this.isEmpty(str))
      return emailRegExp.test(str);
     return true;
  }

  this.isTelephone = function(str)
  {
     telephoneRegExp = /^(\s)*([+]{1}[0-9]{2,3})?[0-9]{6,}(\s)*$/
     if(!this.isEmpty(str))
      return telephoneRegExp.test(str);
     else return true;
  }

  this.toLong= function(str,size)
  {
    if(!this.isEmpty(str))
    {
      if(str.length  > size)
        return true;
    }
    else
      return false;
  }

  this.isZipCode = function(zipcode,country)
  {
    if(this.isEmpty(zipcode)) return true;
    if(!country) format = 'MA';
    zpcRegExp = '';
    switch(country)
    {
      case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
      case'MA': zpcRegExp = /^\d{5}$/; break;
      case'CA': zpcRegExp = /^[A-Z]\d[A-Z] \d[A-Z]\d$/; break;
      case'DU': zpcRegExp = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/; break;
      case'FR': zpcRegExp = /^\d{5}$/; break;
      case'Monaco':zpcRegExp = /^(MC-)\d{5}$/; break;
    }
    return zpcRegExp.test(zipcode);
  }

  this.isAlpha = function(str)
  {
    if(this.isEmpty(str)) return true;
    regExp =  /^[a-zA-Z -àòè'ùì]+$/
    return regExp.test(str);
  }

  this.isNum = function(number)
  {
    if(this.isEmpty(number)) return true;
    numRegExp = /^[0-9]+$/
    return numRegExp.test(number);
  }

  this.isDec = function(number)
  {
    if(this.isEmpty(str)) return true;
    decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
    return decimalRegExp.test(number);
  }

  this.notSelect = function(selection,para)
  {
    if(selection == para)
      return false;
    else return true;
  }

  this.validDate = function(date)
  {
    if(this.isEmpty(date)) return true;
    if (date.substring(2,3) != "/" || date.substring(5,6) != "/" || isNaN(date.substring(0,2))
      || isNaN(date.substring(3,5)) || isNaN(date.substring(6,10)))
      return false;
    var dmy = date.split(/\//);
    var td = new Date( dmy[2], dmy[1]-1, dmy[0] );
    var result = (td.getFullYear() == parseInt(dmy[2],10) && td.getMonth() == parseInt(dmy[1]-1,10) && td.getDate() == parseInt(dmy[0],10));
    if (result == false) return false;
    if (date.substring(0,2) > 31 || date.substring(0,2) < 1)
      return false;
    if (date.substring(3,5) > 12 || date.substring(3,5) < 1)
      return false;
    if (date.substring(6,10) < 1900)
      return false;
    return true;
  }

  this.validDateTime = function(datetime)
  {
    if(!this.isEmpty(datetime)){
    datesplit = datetime.split(" ");
    dateva = this.validDate(datesplit[0]);
    if(!dateva)
      return false;
    time = this.validTime(datesplit[1])
    if(!time)
      return false;
    return true;
    }
    else return true;
  }

  this.validTime = function(time)
  {
    if(this.isEmpty(time)) return true;
    if(time.substring(2,3) != ':')return false;
    hs = time.split(":");
    if(hs[0] < 0 || hs[0] > 24) return false;
    if(hs[1] < 0 || hs[1] > 60) return false;
    return true;
  }

  //core
  this.validateField = function(con,el,para)
  {
    try
    {
      valtovalidate = el.value;
    }
    catch(noinput)
    {
      try
      {
        valtovalidate = el.innerHTML;
      }
      catch(isselect)
      {
        valtovalidate = el.selectedIndex;
        alert(valtovalidate);
      }
    }

    switch(con)
    {
      case 'empty':
        if(this.isEmpty(valtovalidate))
        {
          this.typeError += ', il campo è vuoto.';
          return false;
        }
        break;
      case 'email':
        if(!this.isEmail(valtovalidate))
        {
          this.typeError += ', email non valida.';
          return false;
        }
        break;
       case 'telephone':
        if(!this.isTelephone(valtovalidate))
        {
          this.typeError += ', formato non valido.';
          return false;
        }
        break;
      case 'maxlength':
        if(this.toLong(valtovalidate,para))
        {
          this.typeError += ', campo troppo lungo.';
          return false;
        }
        break;
      case 'onlytext':
        if(!this.isAlpha(valtovalidate))
        {
          this.typeError += ', campo non letterale.';
          return false;
        }
        break;
      case 'onlynum':
        if(!this.isNum(valtovalidate))
        {
          this.typeError += ', campo non numerico.';
          return false;
        }
        break;
      case 'decimal':
        if(this.isEmpty(el.value)) return true;
        newval = this.comma2dot(valtovalidate);
        if(valtovalidate != newval) el.value = newval;
        if(!this.isDec(newval))
        {
          this.typeError += ', campo non decimale.';
          return false;
        }
        break;
     case 'notselect':
        if(!this.notSelect(valtovalidate,para))
        {
          this.typeError += ', campo selezionato non valido.';
          return false;
        }
        break;
      case 'date':
        if(!this.validDate(valtovalidate))
        {
          this.typeError += ', formato data non valido.';
          return false;
        }
        break;
      case 'datetime':
        if(!this.validDateTime(valtovalidate))
        {
          this.typeError += ', formato data/time non valido.';
          return false;
        }
        break;
      case 'zipcode':
        if(this.isZipCode(valtovalidate,'MA'))
        {
          this.typeError += ', formato zipcode non valido.';
          return false;
        }
        break;
    }
    return true;
  }

  this.validate= function(tovalidate)
  {
    this.cleanError(tovalidate);
    this.fields = tovalidate;
    this.valid = true;
    for(var i = 0; i < tovalidate.length; i++)        //for all element
    {
      var el = tovalidate[i];
      var element = this.getEl(el.id);
      var checks = el.check.split('|');
      var validfield  = true;

      for(var j = 0; j  < checks.length; j++)         //for all control in elements
      {
        str = checks[j];
        if(str.indexOf('=') != -1)
        {
          para = str.split('=');
          control = para[0];
          dim = para[1];
        }
        else
        {
          control = str;
          dim = false;
        }
        if(!this.validateField(control,element,dim))
        {
          validfield = false;
        }
      }

      if(!validfield)
      {
        this.error(element,el.message);
        validfield = true;
        this.valid = false;
      }

      this.typeError = '';
    }
    return this.valid;
  }
}

function contatti()
{
  var validator = new Validator();
  var fields = [
  { id : 'nome', check: 'empty|maxlength=20' },
  { id : 'cognome', check: 'empty|maxlength=20'},
  //{ id : 'citta', check: 'empty|maxlength=20'},
  //{ id : 'paese', check: 'empty|maxlength=20'},
  //{ id : 'indirizzo', check: 'empty|maxlength=30'},
  { id : 'telefono', check: 'empty|maxlength=18|telephone'},
  //{ id : 'fax', check: 'empty|maxlength=18|telephone'},
  { id : 'mail', check: 'empty|maxlength=30|email'},
  { id : 'descrizione', check: 'empty|maxlength=1024|textarea'},
  ]
  return validator.validate(fields);
}

function validate(frm)
{
  var formname = frm.getAttribute('name');
  var response = eval(formname+'()');
  if(!response)
  {
    return false;
  }
  return true;
}
