/*=========================================================
Biblioteca de funções em javascript para uso do AJAX
Conselho Regional de Contabilidade de SP
Março/2010
==========================================================*/

/*==== VARIÁVEIS GLOBAIS ====*/
var dest_combo = null;      // usada para preenchimento de combo de municipios via ajax
var txtNomeRegDest = null;  // usada para retornar o nome do registro via ajax
var req = null;             // usada para fazer as requisições em ajax

var campo_logradouro_dest;  // usado para retorno do logradouro
var campo_endereco_dest;    // usado para retorno do endereço
var campo_bairro_dest;      // usado para retorno do bairro
var campo_uf_dest;          // usado para retorno da UF
var campo_cidade_dest;      // usado para retorno da cidade
var cidade_padrao;          // nome da cidade padrão

// URL da página com as funções Ajax
var urlSrvAjax = "/lib/ajax/FuncoesAjax.aspx";  

// Funcao que faz uma requisição AJAX para o servidor
//   tpFun: tipo da função que foi definida na página com as funcoes Ajax (passo como parametro)
//   parametros: parametros que sera enviados na requisição. Ex: "nome=claudio&idade=27"
//   FuncaoRetorno: Nome da funcao que sera executada depois que a requisição for completada
//   Nome do objeto imagem que mostrará o "Carregando" enqto a requisição estiver sendo efetuada
// OBSERVACOES:
// ==============
// Se primeiros caracteres do retorno for "popup", ele abre um popup de acordo com os atributos do retorno (url, nome e parametros),
// caso contrario ele simplesmente retorna o valor do retorno
function enviaAJAX(tpFun, parametros, funcaoRetorno, objImgAguarde, Assincrono)
{
    //var req = null;
    req = null;
    
    try {
        req = new XMLHttpRequest();
    } catch(e) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Msxml2.XMLHTTP.4.0");
                } catch(e) {
                    try {
                        req = new ActiveXObject("Msxml2.XMLHTTP.3.0");
                    } catch(e) {
                        return "1;msg=Navegador não suportado!";
                    }
                }
            }
        }
    }

    req.onreadystatechange = function()
    {
		if ( (req.readyState == 1) && (objImgAguarde) )
		{
			objImgAguarde.style.visibility = "visible";
		}
			
        if (req.readyState == 4)
        {                  
			if (objImgAguarde)
			{
				objImgAguarde.style.visibility = "hidden";
			}
			
            if(req.status == 200)
            {               
                // Se funcao de retorno não pedir parametros (caso de retorno XML)
                if (funcaoRetorno == "retAjaxCarregaCidades")
                {
                    eval(funcaoRetorno  + "();");                 
                }
                else 
                {              
                    var retorno = req.responseText;                                  
    			    // Substitui aspas
				    while (retorno.indexOf("'") != -1 || retorno.indexOf('"') != -1)
				    {
					    retorno = retorno.replace("'", "");
					    retorno = retorno.replace('"', '');
				    }

                    if (req.responseText.substr(0,5) == 'popup')
                    {                   
                        var vurl = getAttString(retorno, 'url');
                        var vnome = getAttString(retorno, 'nome');
                        var vparametros = getAttString(retorno, 'parametros');

                        result = window.open(vurl,vnome,vparametros);
                        if (result == null ) {
                                return '1;msg=Bloqueador de pop-up possivelmente ativo!<br/>Para abrir a página <a href="javascript:OpenWindow('+String.fromCharCode(39)+vurl+String.fromCharCode(39)+','+String.fromCharCode(39)+vnome+String.fromCharCode(39)+','+String.fromCharCode(39)+vparametros+String.fromCharCode(39)+');">clique aqui!</a>';
                        }
                    }
                    else
                    {
                        eval(funcaoRetorno  + "('" + encodeURIComponent(retorno) + "');");
                    }
                }
            }
            else
            {
				eval(funcaoRetorno + "('1;msg=Erro ao conectar com o servidor! Tente novamente mais tarde...');");
            }
        }
    };    

    parametros = "tp=" + tpFun + (parametros != "" ? "&" : "") + parametros;	
	
	req.open('Post', urlSrvAjax, Assincrono);
	req.setRequestHeader("Content-Type", "Application/X-Www-Form-Urlencoded");
	req.setRequestHeader("Encoding", "Iso-8859-1"); 
	req.setRequestHeader("Charset","Iso-8859-1");   
	req.setRequestHeader("Content-Length", parametros.length);

	req.send(parametros);
}

// Função para carregar um combo com as cidades de uma determinada uf com ajax (usa a base de CEP)
//   EX: <select name="ddEstado" id="ddEstado" onchange="AjaxCarregaCidades(ddEstado.value, 'ddCidade');">
function AjaxCarregaCidades(uf, combo_destino)
{
    dest_combo = combo_destino;
    var par = "uf=" + uf;
    enviaAJAX(2, par, "retAjaxCarregaCidades", null, true);
}

//Função de retorno do AjaxCarregaCidades
function retAjaxCarregaCidades()
{
    var idSel = -1;
    var result = req.responseXML;    
    var cidades = result.getElementsByTagName("nome");   
    var ids = result.getElementsByTagName("id");       
   
    // Limpa itens
    document.getElementById(dest_combo).innerHTML = "";
    
    // Adiciona o "Selecione..."
    var opSelecione = document.createElement("option");
    var txSelecione = document.createTextNode("Selecione...");
    var id = "";
    opSelecione.setAttribute("value",id);      
    opSelecione.appendChild(txSelecione);
    document.getElementById(dest_combo).appendChild(opSelecione);    
        
    // Adiciona as cidades   
    for (var i = 0; i < cidades.length; i++) 
    {    
        var new_opcao = document.createElement("option");
        var texto = document.createTextNode(cidades[i].childNodes[0].data);
        var id = ids[i].childNodes[0].data;    

        if ( (cidade_padrao!=null) && (cidade_padrao!="") &&
             (texto.toString().toUpperCase() == retiraAcentuacao(cidade_padrao.toUpperCase()) ) )
            idSel = id;
        
        // Se o ID tivesse em um atributo usaria a linha comentada logo abaixo e comentaria a de cima
        //var id = cidades[i].getAttribute("id");
        
        new_opcao.setAttribute("value",id);           
        new_opcao.appendChild(texto); //Adiciona o texto a OPTION.    
        document.getElementById(dest_combo).appendChild(new_opcao);
    }        
    
    if (idSel> -1) {        
        document.getElementById(dest_combo).value = idSel;
    }
}

// Esta função chama a janela de pesquisa via Ajax.
function efetuarPesquisa(tipo, usarRadio, itensRadio)
{
    Tp = 0;
    if (tipo == 1) Tp = 1;
    else if (tipo == 2) Tp = 2;
    else if (tipo == 3) Tp = 3;
    else if (tipo == 4) Tp = 4;
    else if (tipo == 5) Tp = 5;
    else if (tipo == 6) Tp = 6;

    Rb = (usarRadio ? "S" : "N");
    urlPesq = "/lib/pesquisa/pesquisa.aspx?Tp=" + Tp + "&Rb=" + Rb + "&TpRb=" + itensRadio;
        
    document.getElementById(divpesquisa).setAttribute("value","1");
    document.getElementById(ifrmPesquisa).setAttribute("src", urlPesq);
    atualiza();
}

// Esta função preenche um combobox com os municípios a partir de uma UF
function obterMunicipios(uf, combo_destino, cidadePadrao)
{
    if ((combo_destino)&&(uf!="")) {        
        dest_combo = combo_destino;
        
        if (cidadePadrao!="")
            cidade_padrao = cidadePadrao;
        else
            cidade_padrao = "";
        
        document.getElementById(dest_combo).length = 0;
        var opSelecione = document.createElement("option");
        var txSelecione = document.createTextNode("Carregando...");
        var id = "";
        opSelecione.setAttribute("value",id);
        opSelecione.appendChild(txSelecione);
        document.getElementById(dest_combo).appendChild(opSelecione);
        
        var par = "uf=" + uf;
        enviaAJAX(11, par, "retAjaxCarregaCidades", null, true);
    }
}

// Esta função preenche um combobox com as escolas a partir do código do município e da categoria
function obterEscolas(cod_municipio, categoria, combo_escola)
{
    if ((combo_escola)&&(cod_municipio!="")&&((categoria=="1")||(categoria=="2"))) {        
        dest_combo = combo_escola;
        
        document.getElementById(dest_combo).length = 0;
        var opSelecione = document.createElement("option");
        var txSelecione = document.createTextNode("Carregando...");
        var id = "";
        opSelecione.setAttribute("value",id);
        opSelecione.appendChild(txSelecione);
        document.getElementById(dest_combo).appendChild(opSelecione);
        
        var par = "cm=" + cod_municipio + "&ctg=" + categoria;
        enviaAJAX(12, par, "retAjaxCarregaCidades", null, true);
    }
}

// Esta função retorna o nome de um registro via Ajax.
function obterNomeRegistro(tipo, numero_registro, txtDestNomeReg, chamaJanelaPesquisa, comRadio, itensRadio)
{
    if (numero_registro != "") {
        txtNomeRegDest = txtDestNomeReg;
        document.getElementById(txtDestNomeReg).value = "Carregando...";        
        
        var par = "TPNR=" + tipo + "&NR=" + numero_registro;
        enviaAJAX(10, par, "retObterNomeRegistro", null, true);
    } else {
        if (chamaJanelaPesquisa)
            efetuarPesquisa(2, comRadio, itensRadio);
    }
}

// Função de retorno do obterNomeRegistro
function retObterNomeRegistro()
{
    var result = req.responseText;
    nome = getAttString(result, 'nome');
    
    if (nome!=null) {        
        document.getElementById(txtNomeRegDest).value = nome;
    } else
        window.alert(getAttString(result, 'msg'));
}

// Esta função retorna o endereço a partir de um CEP via Ajax.
function obterEnderecoPeloCep(cep, campo_logradouro, campo_endereco, campo_bairro, campo_uf, campo_cidade)
{
    if (cep != "") {
        campo_logradouro_dest = campo_logradouro;
        campo_endereco_dest = campo_endereco;
        campo_bairro_dest = campo_bairro;
        campo_uf_dest = campo_uf;
        campo_cidade_dest = campo_cidade;
        document.getElementById(campo_logradouro_dest).value = "Carregando...";        
        document.getElementById(campo_endereco_dest).value = "Carregando...";        
        document.getElementById(campo_bairro_dest).value = "Carregando...";        
        
        var par = "cep=" + cep;
        enviaAJAX(13, par, "retObterEnderecoPeloCep", null, true);
    } else {
        if (chamaJanelaPesquisa)
            efetuarPesquisa(2, comRadio, itensRadio);
    }
}

// Função de retorno do endereço a partir de um CEP via Ajax.
function retObterEnderecoPeloCep()
{
    var result = req.responseText;
    msg = getAttString(result, 'msg');
    
    if (msg!="") {
        document.getElementById(campo_logradouro_dest).value = "";
        document.getElementById(campo_endereco_dest).value = "";
        document.getElementById(campo_bairro_dest).value = "";
        window.alert(msg);
    } else {    
        cep = getAttString(result, 'cep');
        tp_logr = getAttString(result, 'tp_logr');
        logradouro = getAttString(result, 'logradouro');
        bairro = getAttString(result, 'bairro');
        localidade = getAttString(result, 'localidade');
        uf = getAttString(result, 'uf');
        
        document.getElementById(campo_logradouro_dest).value = tp_logr;
        document.getElementById(campo_endereco_dest).value = logradouro;
        document.getElementById(campo_bairro_dest).value = bairro;
        document.getElementById(campo_uf_dest).value = uf;
        obterMunicipios(uf, campo_cidade_dest, localidade);
    }
}

// Função para codificar uma string para que seja enviado por POST para uma página.
// Deve-se usá-la ao montar os parametros para enviar para a função enviaAjax()
function url_encode(str) 
{  
	var hex_chars = "0123456789ABCDEF";  
	var noEncode = /^([a-zA-Z0-9\_\-\.])$/;  
	var n, strCode, hex1, hex2, strEncode = "";  

	for(n = 0; n < str.length; n++) {  
		if (noEncode.test(str.charAt(n))) {  
			strEncode += str.charAt(n);  
		} else {  
			strCode = str.charCodeAt(n);  
			hex1 = hex_chars.charAt(Math.floor(strCode / 16));  
			hex2 = hex_chars.charAt(strCode % 16);  
			strEncode += "%" + (hex1 + hex2);  
		}  
	}  
	return strEncode;  
}

function EnviaTempoExpira()
{
    enviaAJAX(14, "", "VerificaExpira", null, true);    
}

// Função para calculo do tempo restante
function VerificaExpira(retorno)
{
    retorno = decodeURIComponent(retorno);
    if (retorno.substr(0,1) != "0")
        window.location.reload();
    else
        // Envia 2 vezes pois a primeira pega o tempo vencido e a segunda o novo    
        enviaAJAX(14, "", "TempoExpira", null, true);    
}

// Função para calculo do tempo restante
function TempoExpira(retorno)
{
    pararAnima = true; 
    retorno = decodeURIComponent(retorno);
    if (retorno.substr(0,1) == "0")
    {
        document.getElementById(t_expira).value = getAttString(retorno, "te");
        dt1 = new Date();
        tmp_expira = (dt1.getTime()/1000) + Number(document.getElementById(t_expira).value);    
        // Segurança caso não tenha expirado e o tempo_func esteja parado
        if (ctrl_tempo == 0) 
            tempo_func();  
    } else {
        window.location.reload();
    }
}
