﻿// Script para validar preenchimento do formulário.
// Dependencias: ajax.js, dialogs.js, strings.js, array.js, validadores.js


/*
    - Para cada pergunta deve haver um <h3 id="descricao_[idpergunta]">. É desse
      elemento que a descrição da pergunta será buscada.
    
    - Toda pergunta deve estar dentro de um DIV.
        Os atributos do DIV são:
          id=div_[idpergunta]
      
    - Cada controle deve estar dentro do div.
        Os atributos são:
          id=input_[idpergunta]  - INPUT TYPE TEXT e TEXTAREA
          id=[idResposta]        - INPUT TYPE CHECKBOX e INPUT TYPE RADIO
          name=[idPergunta]
*/


//------------------------------------------------------------
// Classe Pergunta
//------------------------------------------------------------
function Pergunta(strId, strTipoDado, boolObrigatoria, strValorMinimo, strValorMaximo)
{
    var instance = this;
    this.id = strId;
    this.tipo = strTipoDado;
    this.obrigatoria = boolObrigatoria;
    this.valorMinimo = strValorMinimo;
    this.valorMaximo = strValorMaximo;
    this.ignorarVerificacao = false;
    var validadores = new Array(); // ver validadores.js
    
    this.getDescricao = function()
    {
        return document.getElementById("descricao_" + instance.id).innerHTML;
    }
    
    this.getInput = function()
    {
        return document.getElementById("input_" + instance.id);
    }
    
    this.getDiv = function()
    {
        return document.getElementById("div_" + instance.id);
    }
    this.getSpanErro = function()
    {
        return document.getElementById("span_erro_" + instance.id);
    }
    
    //Oculta o div onde está a pergunta
    this.ocultar = function (bValue)
    {
        instance.ignorarVerificacao = bValue;
        instance.getDiv().style.display = bValue ? "none" : "block";
        if (bValue) instance.limpar();
    }
    
    //Limpa o valor da pergunta
    this.limpar = function()
    {
        switch (instance.tipo)
        {
            case "numerico":
            case "data":
            case "texto":
                instance.setValor("");
                break;
            case "multiselect":
            case "radio":
                var nodes = instance.getValor();
                for (var i = 0; i < nodes.length; i++)
                    nodes[i].checked = false;
                break;
            case "lista":
                var nodes = instance.getValor();
                nodes[0].selected = true;
                break;
            default:
                throw "problemas ao pegar tipo de dado";
                break;
        }
    }
    
    //Adiciona um validador à pergunta
    // param: validador - um objeto com o método 'validar'
    //                      e um atributo 'pergunta'
    this.adicionarValidador = function(validador)
    {
        validador.pergunta = instance;
        validadores.push(validador);
    }
    
    //Valida a pergunta
    this.validar = function()
    {
        if (instance.ignorarVerificacao)
            return;
            
        //Verifica se o é obrigatória
        if (!instance.isRespondida() && instance.obrigatoria )
            throw "A pergunta é obrigatória.";
            
        //Executa validações de tipo e faixa de valores / tamanho :
        switch (instance.tipo)
        {
            case "numerico":
            case "data":
            case "texto":
                //Verifica faixas de valores
                switch (instance.tipo)
                {
                    case "numerico":
                        if (instance.valorMinimo)
                            if (instance.getValor() < instance.valorMinimo.toNumber())
                                throw "O valor não pode ser menor que " + instance.valorMinimo + ".";
                                
                        if (instance.valorMaximo)
                            if (instance.getValor() > instance.valorMaximo.toNumber())
                                throw "O valor não pode ser maior que " + instance.valorMaximo + ".";
                                
                        break;
                        
                    case "data":
                        if (instance.valorMinimo)
                            if (instance.getValor() < instance.valorMinimo.toDate())
                                throw "O valor não pode ser menor que " + instance.valorMinimo + ".";
                                
                        if (instance.valorMaximo)
                            if (instance.getValor() > instance.valorMaximo.toDate())
                                throw "O valor não pode ser maior que " + instance.valorMaximo + ".";
                        break;
                        
                    case "texto":
                        var length = instance.getInput().value.trim().length;
                        if (instance.valorMinimo)
                            if (length < instance.valorMinimo.toNumber())
                                throw "O conteúdo deve ter, no mínimo, " + instance.valorMinimo + " caracteres.";
                                
                        if (instance.valorMaximo)
                            if (length > instance.valorMaximo.toNumber())
                                throw "O conteúdo deve ter, no máximo, " + instance.valorMaximo + " caracteres.";
                        break;
                }
                break;
            
            case "radio":
            case "multiselect":
                if (instance.obrigatoria && !instance.ignorarVerificacao)
                {
                    var nodes = instance.getValor();
                    for (var i = 0; i < nodes.length; i++)
                    {
                        if (nodes[i].checked)
                            return;
                    }
                    throw "A pergunta deve ser respondida.";
                }           
                break;
                
            case "lista":
                if (instance.obrigatoria && !instance.ignorarVerificacao)
                {
                    var nodes = instance.getValor();
                    for (var i = 0; i < nodes.length; i++)
                    {
                        if (nodes[i].selected)
                            return;
                    }
                    throw "A pergunta deve ser respondida.";
                }           
                break;
                   
            default:
                window.alert ("Problemas ao validar pergunta");
                throw "erro";
        }
        
        //Executa validadores extras (ex: cpf, email, etc)
        for (var i = 0; i < validadores.length; i++)
            validadores[i].validar();
    }
    
    //Retorna o valor da pergunta digitada
    this.getValor = function()
    {
        switch (instance.tipo)
        {
            case "numerico":
                return instance.getInput().value.toNumber();
                break;
            case "data":
                return instance.getInput().value.toDate();
                break;
            case "texto":
                return instance.getInput().value;
                break;
            case "multiselect":
            case "radio":
                return document.getElementsByName(instance.id);
                break;
            case "lista":
                return document.getElementById("input_" + instance.id).options;
                break;
            default:
                throw "problemas ao pegar tipo de dado";
                break;
        }
    }
    //Retorna o valor da pergunta digitada em forma de string.
    this.getStrValor = function()
    {
        return instance.getInput().value;
    }
    //Altera o valor da pergunta digitada
    this.setValor = function(value)
    {
        switch (typeof(value))
        {
            case "number":
                instance.getInput().value = (value + "").replace("\.",",");
                break;
            default:
                instance.getInput().value = value;
                break;
        }
    }    
    //Verifica se a pergunta foi respondida
    this.isRespondida = function()
    {
        switch (instance.tipo)
        {
            case "numerico":
            case "data":
            case "texto":
                return (instance.getInput().value.trim() != "");
                break;
            case "multiselect":
            case "radio":
                var nodes = instance.getValor();
                for (var i = 0; i < nodes.length; i++)
                    if (nodes[i].checked)
                        return true;
                return false;
                break;
            case "lista":
                var nodes = instance.getValor();
                for (var i = 1; i < nodes.length; i++)
                    if (nodes[i].selected)
                        return true;
                return false;
                break;
        }
    }
    
    //Retorna true se a resposta estiver marcada ou false se não.
    // Recebe como parâmetro o id da resposta
    this.respostaMarcada = function (idResposta)
    {
        return document.getElementById(idResposta).checked;
    }
    
    this.marcaResposta = function (idResposta)
    {
        document.getElementById(idResposta).checked = true;
    }
}



//------------------------------------------------------------
// Funções auxiliares
//------------------------------------------------------------

//Exibe/oculta controles e recalcula campos
function recalculaFormulario()
{
    exibeOcultaPerguntas(); //Função gerada pelo xsl
    executaCalculos(); //Função gerada pelo xsl
    // Não chamar a função abaixo aqui senão o cursor voltará para o início da página a cada recálculo
	//16/07/2009 (Eduardo): fiz um teste e voltou a funcionar. Não sei o motivo.
    setIframe(); //frame.js - Problema: cursor volta para o início da página.
}

//Verifica se um valor está selecionado na lista de checkboxes/radios/lista
function nodeChecked (nodes, value)
{
    for (var i = 0; i < nodes.length; i++)
        if ((nodes[i].checked && nodes[i].value == value) || (nodes[i].selected && nodes[i].value == value))
            return true;
    return false;
}

function exibirMensagem(html)
{
      document.getElementById("divMensagem").style.display = "inline";
      document.getElementById("divMensagem").innerHTML = html;
      document.getElementById("divFormulario").style.display = "none";
}
function exibirAguarde()
{
      document.getElementById("divMensagem").style.display = "inline";
      document.getElementById("divMensagem").innerHTML = "Por favor aguarde...";
      document.getElementById("divFormulario").style.display = "none";
}
function ocultarAguarde()
{
      document.getElementById("divMensagem").style.display = "none";
      document.getElementById("divFormulario").style.display = "block";
}

//------------------------------------------------------------
// Funções usadas ao enviar o formulário
//------------------------------------------------------------

//Valida todas as perguntas e
// mostra erros em seus spans
function validarPerguntas()
{
    var erros = 0;
    for (var i = 0; i < perguntas.getLength(); i++)
    {
        var spanErro = perguntas.getItemByIndex(i).getSpanErro();
        try
        {
            spanErro.style.display = "none";
            perguntas.getItemByIndex(i).validar();
        }
        catch (e)
        {
            spanErro.style.display = "inline";
            spanErro.innerHTML = "&nbsp;" + e;
            erros++;
        }
    }
    setIframe(); //frame.js - Problema: cursor volta para o início da página.
	             //16/07/2009 (Eduardo): fiz um teste e voltou a funcionar. Não sei o motivo.
    return erros;
}

//Envia dados do formulário via Ajax.
function enviarDadosForm()
{
    var erros = validarPerguntas();
    if (erros > 0)
    {
        window.alert("Há " + erros + " erro(s) no preenchimento.");
        return false;
    }
    exibirAguarde();
    
    var a = new Ajax();
    var parametros = getFieldsFromForm(document.getElementById("formEnquete"), "POST");
    a.sendRequest("RecebeRespostasAjax.aspx", parametros, "POST", endRequest, requestError);
}
//Função executada após enviar os dados do formulário
function endRequest(req)
{
    ocultarAguarde();
    try
    {
        var parser = new XMLParser(req.responseText);
        
        var nodeErro = parser.getNode("erro", 0);
        if (nodeErro != null)
        {
            window.alert(unescape(nodeErro.nodeValue));
        }
        else
        {
            var nodeMensagem = parser.getNode("mensagem", 0);
            if (nodeMensagem != null)
            {
                //Monta html da mensagem e exibe
                var textoMensagem = nodeMensagem.nodeValue;
                textoMensagem += "<br/>";
                textoMensagem += "<a href='" + urlSeguinte + "'>Voltar</a>";
                exibirMensagem(textoMensagem);
                if (typeof autoRedirect != "undefined")
                    window.location = urlSeguinte;
            }
            else
                exibirErro("Problemas no retorno do servidor:<br/>" + req.ResponseText);
        }
    }
    catch (e)
    {
        window.alert("Exception: " + e);
    }
}
//Função executada se ocorrer erro durante o envio do formulário
function requestError(req)
{
    alert("Erro ao enviar formulário");
    ocultarAguarde();
}

















/*
function ExpressaoLiteral(valor)
{
    var instance = this;
    this.valor = valor;
    
    this.evaluate = function()
    {
        return instance.valor;
    }
}

function ExpressaoBinaria(expressao1, expressao2, strOperador)
{
    var instance = this;
    this.expressao1 = expressao1;
    this.expressao2 = expressao2;
    this.operador = operador;
    
    this.evaluate = function()
    {
        switch (strOperador)
        {
            case "+":
                return expressao1.evaluate() + expressao2.evaluate();
                break;
            case "-":
                return expressao1.evaluate() - expressao2.evaluate();
                break;
            case "/":
                return expressao1.evaluate() / expressao2.evaluate();
                break;
            case "*":
                return expressao1.evaluate() * expressao2.evaluate();
                break;
        }
    }
}
*/
