// form_val_v2.js
// Validaçao de formulários
// Programação: Y2Studio Comunicação Interativa
//              www.y2studio.com.br
//              equipe@y2studio.com.br
// 
// Versão: 2.0
// Utilizar com Javascript 1.2

var campos = new Array;

function cpObj () {

  var args = cpObj.arguments;

  this.nome  = args[0];
  this.label = args[1];
  this.tipo  = args[2];

  this.categ = args[3];
  this.val1  = args[4];
  this.val2  = args[5];

}


// verifica se a entrada é um e-mail válido
function isEmail (str) {

  if (str == null) return false;

  if (str.search(/^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/) != -1)
    return true;
  else
    return false;
                    
}


// verifica se o campo contém algum caractere alem de espaços
function isBlank (str) {

  if (str == null) return false;

  if (str.search(/^\W*$/) != -1)
    return true;
  else 
    return false;

}


// verifica se a string é um inteiro
function isInteger (str) {

  if (str == null) return false;

  if (str.search(/^-*[0123456789]+$/) != -1)
    return true;
  else 
    return false;

}


// verifica se a string é um float
function isFloat (str) {

  if (str == null) return false;

  if (str.search(/^-*[0123456789]*\.*[0123456789]+$/) != -1)
    return true;
  else 
    return false;

}


// verifica se a extensao do arquivo e' valida
function isValidFileType(definicao, str) {

  var types = definicao.val1.split(',');
  
  var str_len = str.length;
  
  for (var i=0; i<types.length; i++) {

    var ext_len = types[i].length;
    
    if (types[i] == str.substr((str_len-ext_len), ext_len)) 
      return true;
  
  }
  
  return false;
  
}

// retorna uma mensagem de erro ao usuário
function dadoInvalido(campo, msg) {
  alert (msg);
  campo.focus();
  return false;
}


// verifica se o campo foi preenchido corretamente:
function dadosValidos(definicao, campo) {

  // BLANK
  if (isBlank(campo.value)) { 
    if (definicao.categ == "file") 
      return dadoInvalido(campo, 'É necessário especificar um arquivo no campo "' + definicao.label + '".');
    else 
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" é de preenchimento obrigatório.'); 
  }
  
  
  // FILE
  if (definicao.categ == "file" && !isValidFileType(definicao, campo.value)) {
    return dadoInvalido(campo, 'Os tipos de arquivos válidos são: ' + definicao.val1);
  }
  


  // EMAIL
  if (definicao.categ == "email" && !isEmail(campo.value)) {
    return dadoInvalido(campo, 'O campo "' + definicao.label + '" parece não conter um e-mail válido.');
  }
  
  
  // NUMBERS
  
    // INTEGERS
  if (definicao.categ == "integer") {
  
    if (!isInteger(campo.value)) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" deve conter um número inteiro.');
    }
    
    // MIN
    if (definicao.val1 != null && campo.value < definicao.val1) {
      return dadoInvalido(campo, 'O valor mínimo do campo "' + definicao.label + '" é ' + definicao.val1);
    }
    
    // MAX
    if (definicao.val2 != null && campo.value > definicao.val2) {
      return dadoInvalido(campo, 'O valor máximo do campo "' + definicao.label + '" é ' + definicao.val2);
    }
  
    return true;
    
  }
  
    // FLOATS
  if (definicao.categ == "float") {
  
    if (!isFloat(campo.value)) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" deve conter um número.');
    }
    
    // MIN
    if (definicao.val1 != null && campo.value < definicao.val1) {
      return dadoInvalido(campo, 'O valor mínimo do campo "' + definicao.label + '" é ' + definicao.val1);
    }
    
    // MAX
    if (definicao.val2 != null && campo.value > definicao.val2) {
      return dadoInvalido(campo, 'O valor máximo do campo "' + definicao.label + '" é ' + definicao.val2);
    }
  
    return true;
    
  }
  
  
  // STR LEN
  if (definicao.categ == "length") {

    if (definicao.val1 != null && campo.value.length < definicao.val1) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" deve conter pelo menos ' + definicao.val1 + ' caracteres.');
    }  
 
    if (definicao.val2 != null && campo.value.length > definicao.val2) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" deve conter no máximo ' + definicao.val2 + ' caracteres.');
    } 
    
    return true;
    
  }
  
  return true;

} 


// verificação do preenchimento do formulário
function verificaCampos(form) {

  for (var i=0; i<campos.length; i++) {
    var cp = eval("form['" + campos[i].nome + "']");
    
    // campos em formato texto
    if (campos[i].tipo == "text" || campos[i].tipo == "textarea" || campos[i].tipo == "file") {
      if (!dadosValidos(campos[i], cp)) { return false; }
    }

    // campos em formato radio
    else if (campos[i].tipo == "radio") {
      var checked = false;
      for (var j=0; j<cp.length; j++) {
        if (cp[j].checked) {
          checked = true;
          break;
        }
      }
      if (!checked) {
        alert ('Escolha uma opção de "' + campos[i].label + '".');
        cp[0].focus();
        return false;
      }

    }
 
    // campos em formato select
    else if (campos[i].tipo == "select") {
      if (cp.selectedIndex == -1 || cp.options[cp.selectedIndex].value == "") {
        alert ('Escolha uma opção de "' + campos[i].label + '".');
        cp.focus();
        return false;
      }
    } 
  
  } // FOR

  return true;

}

