
/* 
 * Autor de funçoes: Elcio Ferreira
 * adaptacao para funcoes so de numeros
 */
/* 
function mascara(o,f){
    v_obj=o
    v_fun=f
    setTimeout("execmascara()",1)
}

function execmascara(){
    v_obj.value = v_fun(v_obj.value)
}

function soNumeros(v){
    return v.replace(/\D/g,"")
}
*/

/**
 * Autor: Paulo Eduardo Neves neves@samba-choro.com.br
 * Use à vontade, me dê apenas os devidos créditos, licensa tipo Python.
 *
 * Comando para colocar no <header> incluir este arquivo:
 *  <SCRIPT>function valida(f){return true}</SCRIPT>
 *  <SCRIPT LANGUAGE="JavaScript1.1" SRC="/validacaoForm.js">
 *  o anterior é para ficar compativel com IE3.0
 *
 * Para funcionar o mime-tyde deste arquivo tem que ser application/x-javascript
 *
 * Atributos pre-definidos dos elementos do form:
 * opcional, int, num, min, max, email, deveAlterar
 *
 * Defina no corpo de sua pagina como cada elemento do form vai ser chamado
 * por extenso. 
 * Objeto porExtenso fala como a mensagem de erro deve se referenciar ao 
 * determinado campo.
 * Se o atributo "name" do campo nao for uma propriedade do objeto porExtenso, 
 * entao o proprio valor da propriedade "name" sera' usado.
 */


var porExtenso = new Object()

/*Na mensagem de erro o
		% é substituido pelo nome do objeto definido em "porExtenso"
		* é substitudo pelo valor do campo
		# é substituido pelo valor do atributo
 por enquanto tem que mudar o código para cada coisa. Javascript é uma merda!
*/
simboloNome = "%"
simboloValor = "*"
simboloAtributo = "#"

//Voce pode redefinir suas mensagens de erro em sua pagina
//Tambem pode definir mensagens para cada tipo de erro em cada atributo
//    basta criar atributos de msgErro da forma msgErro['opcional:username']
var msgErro = new Object()

msgErro.opcional    = "% deve ser preenchido."
msgErro.num         = "% deve ter um valor numérico."
msgErro.min         = "% deve ser um número maior ou igual do que #."
msgErro.max         = "% deve ser um número menor ou igual do que #."
msgErro.email       = "O email * não parece válido, por favor verifique-o.\n  Exemplo de email correto: nome@provedor.com.br"
msgErro.deveAlterar = "% deve ser preenchido com outro valor"
msgErro.cpf         = "O cpf * não parece válido, por favor verifique-o."

function geraErro(campo, atributo){

	var nome = campo.name
	
	if (porExtenso[nome]){
		nome = porExtenso[nome]
	}
	
	var temp = new Substituidor(nome, campo.value, campo[atributo])
	
	if (msgErro[atributo + ":" + campo.name]) {

		msg = msgErro[atributo + ":" + campo.name]

	} else {

		msg = msgErro[atributo]

	}

	return temp.formataMsg(msg)

}


function substitui(umaStr, valor, simbolo){

	var pedacos = umaStr.split(simbolo)
	return pedacos.join(valor)

}


function Substituidor(nome, valor, atributo) {

	this.simbolos = new Object()

	this.simbolos[simboloNome]     = nome
	this.simbolos[simboloValor]    = valor
	this.simbolos[simboloAtributo] = atributo

}

new Substituidor('','',''); //merda de NS3

function Substituidor_formataMsg(msg){

	var novaMsg = msg

	for (var i in this.simbolos) {
		novaMsg = substitui(novaMsg, this.simbolos[i], i)
	}

	return novaMsg

}

Substituidor.prototype.formataMsg = Substituidor_formataMsg

function ehBranco(c){ //Fun&ccedil;&atilde;o s&oacute; fuciona para chars

        if (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r') return true
        return false

}

function strip(strg){

        for (var posIni = 0;
		(posIni < strg.length) && ehBranco(strg.charAt(posIni));
	     posIni++);
        
        for (var posFim = strg.length;
	     ((posFim - 1) >= posIni) && ehBranco(strg.charAt(posFim - 1));
	     posFim--);

        return strg.substring(posIni, posFim)

}

function preenchido(strg){

	if (strip(strg).length > 0) return true
	return false

}


function emailValido(campo) {
	
	//verifica APENAS o email: coisas como "Neves" <neves@email.com> sao invalidas
	var e = strip(campo.value).toLowerCase()
	var posA = e.indexOf('@')
	var posLastPt = e.lastIndexOf('.')

	//Tem que ter @ e .
	if (posA == -1 || posLastPt == -1  || posLastPt < posA || posA == 0) return false
    
	//Email tem que terminar com .xxx ou .xx
	posLastPt = e.length - posLastPt
	if (posLastPt != 3 && posLastPt !=4) return false

	//Verificando agora os caracteres válidos
	//Válidos para domínio
	var validChar = "0987654321abcdefghijklmnopqrstuvwxyz.-"
	
	for(var i = posA + 1; i < e.length; i++){
		if (validChar.indexOf(e.charAt(i)) == -1) return false;
	}
    
	validChar += "%+_#"

	for(var i = 0; i < posA; i++){
		if (validChar.indexOf(e.charAt(i)) == -1) return false;
	}

	return true

}

//update
function numValido(campo){

	var n = parseInt(campo.value)

	if (isNaN(n)) {
		return false
	} else {
		return true
	}

}


function minValido(campo) {

	var valido = numValido(campo)
	if (valido) {
	   if (parseFloat(campo.value) < campo.min){
	      valido = false
	   }
	}
	return valido
}

function maxValido(campo) {
	var valido = numValido(campo)
	if (valido) {
	   if (parseFloat(campo.value) > campo.max){
	      valido = false
	   }
	}
	return valido
}

function deveAlterarValido(campo){//só está definido para textos
	if (strip(campo.value) == strip(campo.defaultValue)) {//strip por causa de bug no IE4
		return false
	}
	return true
}

/**
 * Funcao de validacao de cpf 
 */
 
function cpfValido(campo) {

	cpf = campo.value;
  erro = new String;
  if (cpf.length < 11) erro += "Sao necessarios 11 digitos para verificacao do CPF! \n\n";
  var nonNumbers = /\D/;
  if (nonNumbers.test(cpf)) erro += "A verificacao de CPF suporta apenas numeros! \n\n";
  if (cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999"){
  	erro += "Numero de CPF invalido!"
	}
  var a = [];
  var b = new Number;
  var c = 11;
  for (i=0; i<11; i++){
  	a[i] = cpf.charAt(i);
    if (i < 9) b += (a[i] * --c);
	}
	if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
	b = 0;
	c = 11;
	for (y=0; y<10; y++) b += (a[y] * c--);
	if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
	if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10])){
		erro +="Digito verificador com problema!";
	}
	if (erro.length > 0){
		//alert(erro);
		return false;
	}
	return true;
}

//a ordem que os erros sao definidos dá prioridade a eles (se dois
//acontecem a msg de erro do primeiro que aparece)
validacao = new Object()
validacao.email = emailValido
validacao.num = numValido
validacao.min = minValido
validacao.max = maxValido
validacao.deveAlterar = deveAlterarValido
validacao.cpf = cpfValido

function validaCampo(campo) {
	if (!campo.opcional) {
		 if (!preenchido(campo.value)) {
			 return geraErro(campo, 'opcional')
		 }
	}
	for (var i in campo) {
	    if (campo[i] && typeof validacao[i] == "function"){
	       if (validacao[i](campo) == false){
	       	       return geraErro(campo, i)
	       } 
	    }
	}

	return false
}

function validaLista(form, campo){ //só verifica se é opcional
        var umMarcado = false
        var lista = form[campo.name]
	if (!lista.opcional) {
           if (typeof(lista.length) != "number") {
              //typeof(lista.length) NS3-retorna "object", NS4-retorna "undefined"
              //caso de merda: só tem um objeto checkbox ou radio, então
              //não constrói array:-(
              if (campo.checked) {
                  umMarcado = true
              }
           } else {
	      for (var i = 0; i < lista.length; i++){
		   if (lista[i].checked) {
			umMarcado = true
			break
		   }
	      }
	   }
           if (!umMarcado) return geraErro(campo, 'opcional') 
	}
	return false
}

function validaSelect(aSelect){
	
	if (!aSelect.opcional) {
		
		if (aSelect.selectedIndex <= 0) { /* updated by líbene and other updates or implementations in functions and routines */
			return geraErro(aSelect, 'opcional')
		}
	
	}

}

//faz a verificação de cada elemento do form
debug = 0

function valida(f) {

	var msg;
	var erros = new Array();
	var listasValidadas = new Object();

    //Iteramos sobre os elementos do form e chamamos a função de validação apropriada para cada um
	for(var i = 0; i < f.length; i++) {

		var campo = f.elements[i];
		var achouErro = null;

		if ((campo.type == "text") || (campo.type == "textarea") || (campo.type == "password") || (campo.type == "file")) {
		
			achouErro = validaCampo(campo);
		
		} else if (campo.type == "radio" || campo.type == "checkbox") {
					
			if (!listasValidadas[campo.name]){
				
				achouErro = validaLista(f, campo);
				listasValidadas[campo.name] = true;
			}
				
		} else if (campo.type == "select-multiple" || campo.type == "select-one") {
			
			achouErro = validaSelect(campo);
		}
	
		if (achouErro) {
			erros[erros.length] = achouErro;
			erros.length += 1;
        }
	}

	if (erros.length == 0){
		return true;
	}
    
    alert("Por favor, faça as modificações abaixo \npara podermos continuar.\n\n"+ erros.join('\n'));
    return false;

}

