/*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()
porExtenso.nome = "Nome"
porExtenso.senha = "Senha"
porExtenso.email = "Email"

/*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"

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
}

function numValido(campo){
	var n = parseFloat(campo.value)
	if (isNaN(n)) {
		return false
	}
	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
}

//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

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 == -1) {
			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") {
		achourro = validaSelect(campo)
	}
	if (achouErro) {
	    erros[erros.length] = achouErro
	    erros.length += 1
        }
    }

    if (erros.length == 0){
	return true;
    }
    alert("Atenção!\n\nSua ficha não pode ser enviada.\nPreencha todos os campos obrigatórios para efetivar sua inscrição\n------------------------------\n"+ erros.join('\n'))
    return false
}

