// 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;
  
}

//------------------------
// VERIFICAÇÃO DE CNPJ
// original em: http://www.imasters.com.br/artigo.php?cn=2451&cc=78
//------------------------

	function onlyDigits(str)
	{
		str = str.replace(/[^0-9]/g, '');
		return str;
	}
	

	// verificação apenas dígitos: AABBBCCCDDDDEE
	function validaCNPJ(CNPJ)
	{

		if (CNPJ == null) return false;
		
		if (CNPJ.length < 12) return false;
		var a = [];
		var b = new Number;
		var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
		for (i=0; i<12; i++){
			a[i] = CNPJ.charAt(i);
			b += a[i] * c[i+1];
		}
		if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
		b = 0;
		for (y=0; y<13; y++) {
			b += (a[y] * c[y]); 
		}
		if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
		if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
			return false;
		}

		return true;
	
	}

	// verificação formato padrão: AA.BBB.CCC/DDDD-EE
	function isCNPJ(CNPJ) {

		if (CNPJ == null) return false;
		if ( CNPJ.length != 18 )
		{
			if (CNPJ.length < 18) return false;
			if (CNPJ.length == 19 && CNPJ.charAt(0) == '0') CNPJ = CNPJ.substring(1);
			else return false;
		}
		
		if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
			return false;
		}

		return validaCNPJ(onlyDigits(CNPJ));

	}


//------------------------
// VERIFICAÇÃO DE CNPJ
// original em http://www.imasters.com.br/artigo.php?cn=664&cc=2
//------------------------

	// verifica apenas dígitos: AAABBBCCCDD
	function validaCPF(st2)
	{

		if (st2 == null) return false;
		
		if ( st2.length != 11) 
		{
			if (st2.length == 10) st2 = '0' + st2;
			else if (st2.length == 9) st2 = '00' + st2;
			return false;
		}

		digito1 = st2.substring(9,10);
		digito2 = st2.substring(10,11);
		digito1 = parseInt(digito1,10);
		digito2 = parseInt(digito2,10);
		sum = 0; mul = 10;
		for (i = 0; i < 9 ; i++) {
			digit = st2.substring(i,i+1);
			tproduct = parseInt(digit ,10) * mul;
			sum += tproduct;
			mul--;
		}
		dig1 = ( sum % 11 );
		if ( dig1==0 || dig1==1 ) dig1=0;
		else dig1 = 11 - dig1;
		if (dig1!=digito1) return (false);
		sum = 0;
		mul = 11;
		for (i = 0; i < 10 ; i++) {
			digit = st2.substring(i,i+1);
			tproduct = parseInt(digit ,10)*mul;
			sum += tproduct;
			mul--;
		}
		dig2 = (sum % 11);
		if ( dig2==0 || dig2==1 ) dig2=0;
		else dig2 = 11 - dig2;
		if (dig2 != digito2) return (false);
		return (true);
	
	}

	// verifica formato padrão: AAA.BBB.CCC-DD
	function isCPF(st) {

		if (st == null) return false;

		if (st.length != 14) 
		{
			if (st.length == 13) st = '0' + st;
			else if (st.length == 12) st = '00' + st;
			else return false;
		}
		
		if ( (st.charAt(3) != ".") || (st.charAt(7) != ".") || (st.charAt(11) != "-") ){
			return false;
		}

		return validaCPF(onlyDigits(st));

	}
   
 


// 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;
    
  }
  

  // CNPJ
  if (definicao.categ == "cnpj") {

    if ( (definicao.val1 == null || definicao.val1 == 'formatado') && !isCNPJ(campo.value) ) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" não contém um número de CNPJ válido.\nPor favor confira o número e utilize o formato XX.XXX.XXX/XXXX-XX');
    }  
 
    if ( definicao.val1 == 'numerico' && !validaCNPJ(campo.value) ) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" não contém um número de CNPJ válido.\nPor favor confira o número e preencha o campo apenas com números.');
    } 
    
    return true;
    
  }
  

  // CPF
  if (definicao.categ == "cpf") {

    if ( (definicao.val1 == null || definicao.val1 == 'formatado') && !isCPF(campo.value) ) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" não contém um número de CPF válido.\nPor favor confira o número e utilize o formato XXX.XXX.XXX-XX');
    }  
 
    if ( definicao.val1 == 'numerico' && !validaCPF(campo.value) ) {
      return dadoInvalido(campo, 'O campo "' + definicao.label + '" não contém um número de CPF válido.\nPor favor confira o número e preencha o campo apenas com números.');
    } 
    
    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;

}
