//INICIALIZA AS VARIAVEIS PARA CONTROLE DA FILA
var ifila = 0
var fila = new Array();
//fila[X][0] - Div onde sera carregada a pagina
//fila[X][1] - Pagina que sera chamada
//fila[X][2] - Metodo de envio
//fila[X][3] - Campos do form concatenados no padrao para serem enviados. Null caso seja um link



//INICIALIZA O OBJETO QUE IRA FAZER AS SOLICITACOES
try{
    xmlhttp = new XMLHttpRequest();// Mozilla, Safari, Firefox, etc...
    try {
        if (xmlhttp.overrideMimeType) {
            //Se possível, ignora cabecalho usado pelo servidor e forca o padrao "text/xml". Alguns navegadores exigem esse padrao e pode dar erro se o servidor nao utilizar ele
            xmlhttp.overrideMimeType('text/xml');
        }
    } catch (e1) { }
}catch(e2){
    try{
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");// Internet Explorer
    }catch(e3){
        try{
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// Internet Explorer
        }catch(e4){
            //tratamento para alguma outra forma de implementar XMLHTTP
            xmlhttp = false;
        }
    }
}
if (!xmlhttp){
    //Nao conseguiu instanciar o objeto xmlhttp para fazer as solicitacoes
    alert("AJAX error. Your browser must support XMLHttpRequest object or enable use of scripting.");
}



//GUARDA NA FILA O ID DO OBJETO E A URL QUE SERAO CARREGADOS PELO LINK CLICADO
function ajaxLink(id_target,url){
    //Exibe mensagem de que esta carregando a pagina no objeto de ID informado
    ajaxMensagemCarregando(id_target);

    //Adiciona a solicitacao na fila
    fila[fila.length]=[id_target,url,"GET",null];

    //Se nao tem conexoes na fila, inicia a execucao
    if(fila.length==1){
        ajaxRun();
    }
    return;
}



//GUARDA NA FILA O ID DO OBJETO E O FORM QUE SERAO CARREGADOS PELO LINK CLICADO
function ajaxForm(id_target,id_form){
    //Pega a pagina que sera chamada pelo form
    var url = document.getElementById(id_form).action;
    //Busca metodo de envio definido no form
    var metodoEnvio = document.getElementById(id_form).method.toUpperCase();
    //Busca os elementos do form que serao enviados para a pagina solicitada
    var elementos_form = BuscaElementosForm(id_form);

    //Exibe mensagem de que esta carregando a pagina no objeto de ID informado
    ajaxMensagemCarregando(id_target);

    //Adiciona a solicitacao na fila
    fila[fila.length]=[id_target,url,metodoEnvio,elementos_form];

    //Se nao tem conexoes na fila, inicia a execucao
    if(fila.length==1){
        ajaxRun();
    }
    return;
}



//EXECUTA A PROXIMA SOLICITACAO DA FILA
function ajaxRun(){
    var url = fila[ifila][1];

    //Define o metodo de envio (GET ou POST)
    var metodoEnvio;
    if (fila[ifila][3]==null){
        //Se for Link, utiliza GET
        metodoEnvio = "GET";
    }else{
        //Se for Form, define o metodo de envio e prepara a url
        metodoEnvio = fila[ifila][2];
        if (metodoEnvio=="" || metodoEnvio==null){
            //Se nao tiver definido nada, usa POST
            metodoEnvio = "POST";
        }
        if (metodoEnvio=="GET"){
            //Metodo GET passa as informacoes na linha da url
            url = url + "?" + fila[ifila][3];
        }
    }

    //Abre a conexao
    xmlhttp.open(metodoEnvio,url,true);

    //Seta as funcoes que irao tratar a mudanca de estado do objeto XMLHTTP
    xmlhttp.onreadystatechange=ajaxXMLHTTP_StateChange;

    //Executa a solicitacao
    if (metodoEnvio=="POST"){
        //Metodo POST precisa definir este RequestHeader
        xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        //Metodo POST passa as variaveis pelo metodo Send
        xmlhttp.send(fila[ifila][3]);
    }else{
        xmlhttp.send(null);
    }
    return;
}



//FUNCAO EXECUTADA QUANDO ALTERAR O STATUS DA SOLICITACAO (readyState)
function ajaxXMLHTTP_StateChange() {
    //0-Nao inicializado, 1-Carregando, 2-Carregado, 3-Interativo, 4-Completo
    if (xmlhttp.readyState==1){
        ajaxXMLHTTP_StateChange_Carregando(fila[ifila][0]);//Quando iniciar a solicitacao
    }else{
        if (xmlhttp.readyState==4){
            ajaxXMLHTTP_StateChange_Completo(xmlhttp, fila[ifila][0]);//Quando estiver completa a solicitacao
        }
    }
}



//FUNCAO EXECUTADA QUANDO INICIAR A SOLICITACAO (readyState=1)
function ajaxXMLHTTP_StateChange_Carregando(id){
    //Exibe mensagem de que está carregando a página no objeto de ID que solicitacao esta sendo feita
    ajaxMensagemCarregando(id);
    return;
}



//FUNCAO EXECUTADA QUANDO A SOLICITACAO ESTIVER COMPLETA (readyState=4)
function ajaxXMLHTTP_StateChange_Completo(xmlhttp, id){
    var retorno;
	
	//Verifica o status da pagina de retorno
    if (xmlhttp.status == 200 || xmlhttp.status==0) {
        //Caso o status seja 200(Sucesso) ou nao utilize servidor(chamada local [C:\...]), trata o valor retornado
        retorno=unescape(xmlhttp.responseText.replace(/\+/g," "));
	
    }else{
        //Caso o status ainda nao foi tratado, chama a funcao de tratamento de pagina de erro
        retorno=ajaxPaginaErro(xmlhttp);
    }
    //Exibe o valor retornado no objeto de ID informado
    document.getElementById(id).innerHTML=retorno;
    // executa scripts
    ExtraiScript(retorno);

//passa para a proxima posicao da fila
    ifila++;
    if(ifila<fila.length){
        //Caso tenha mais solicitacoes na fila, executa a proxima
        setTimeout("ajaxRun()",20);
    }else{
        //Caso nao tenha mais solicitacoes na fila, reinicia a fila
        fila = null;
        fila = new Array();
        ifila = 0;
    }
    return;
}



//FUNCAO PARA RETORNAR A MENSAGEM DE ERRO QUANDO O SERVIDOR RETORNAR UMA PAGINA DE ERRO
function ajaxPaginaErro(xmlhttp){
    var retorno;
    switch (xmlhttp.status) {
        case 404:
            return "Página não encontrada!!!";
            break;
        case 500:
            return "Erro interno do servidor!!!";
            break;
        default:
            return "Erro desconhecido!!!<br>" + xmlhttp.status + " - " + xmlhttp.statusText.replace(/\+/g," ");
    }
}



//FUNCAO PARA RETORNAR A MENSAGEM DE QUE ESTA CARREGANDO A PAGINA
function ajaxMensagemCarregando(id){
    document.getElementById(id).innerHTML = "carregando...";
}



//FUNCAO PARA PEGAR OS CODIGOS SCRIPT
function ExtraiScript(texto){
//desenvolvido por Skywalker.to, Micox e Pita.
//Não retire para não violar os direitos autorais.
    var ini, pos_src, fim, codigo;
    var objScript = null;
    ini = texto.indexOf('<script', 0)
    while (ini!=-1){
        var objScript = document.createElement("script");
        //Busca se tem algum src a partir do inicio do script
        pos_src = texto.indexOf(' src', ini)
        ini = texto.indexOf('>', ini) + 1;

        //Verifica se este e um bloco de script ou include para um arquivo de scripts
        if (pos_src < ini && pos_src >=0){//Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script
            //Marca como sendo o inicio do nome do arquivo para depois do src
            ini = pos_src + 4;
            //Procura pelo ponto do nome da extencao do arquivo e marca para depois dele
            fim = texto.indexOf('.', ini)+4;
            //Pega o nome do arquivo
            codigo = texto.substring(ini,fim);
            //Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano
            codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");
            // Adiciona o arquivo de script ao objeto que sera adicionado ao documento
            objScript.src = codigo;
        }else{//Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script
            // Procura o final do script
            fim = texto.indexOf('</script>', ini);
            // Extrai apenas o script
            codigo = texto.substring(ini,fim);
            // Adiciona o bloco de script ao objeto que sera adicionado ao documento
            objScript.text = codigo;
        }

        //Adiciona o script ao documento
        document.body.appendChild(objScript);
        // Procura a proxima tag de <script
        ini = texto.indexOf('<script', fim);

        //Limpa o objeto de script
        objScript = null;
    }
}


//FUNCAO PARA PEGAR OS ELEMENTOS DO FORM
function BuscaElementosForm(idForm) {
    var elementosFormulario = document.getElementById(idForm).elements;
    var qtdElementos = elementosFormulario.length;
    var queryString = "";
    var elemento;

    //Cria uma funcao interna para concatenar os elementos do form
    this.ConcatenaElemento = function(nome,valor) {
                                if (queryString.length>0) {
                                    queryString += "&";
                                }
                                queryString += encodeURIComponent(nome) + "=" + encodeURIComponent(valor);
                             };
							 
							 
    //Loop para percorrer todos os elementos
    for (var i=0; i<qtdElementos; i++) {
        //Pega o elemento
        elemento = elementosFormulario[i];
        if (!elemento.disabled) {
            //Trabalha com o elemento caso ele nao esteja desabilitado
            switch(elemento.type) {
                //Realiza a acao dependendo do tipo de elemento
                case 'text': case 'password': case 'hidden': case 'textarea':
                    this.ConcatenaElemento(elemento.name,elemento.value);
                    break;
                case 'select-one':
                    if (elemento.selectedIndex>=0) {
                        this.ConcatenaElemento(elemento.name,elemento.options[elemento.selectedIndex].value);
                    }
                    break;
                case 'select-multiple':
                    for (var j=0; j<elemento.options.length; j++) {
                        if (elemento.options[j].selected) {
                            this.ConcatenaElemento(elemento.name,elemento.options[j].value);
                        }
                    }
                    break;
                case 'checkbox': case 'radio':
                    if (elemento.checked) {
                        this.ConcatenaElemento(elemento.name,elemento.value);
                    }
                    break;
            }
        }
    }
    return queryString;
}

/**
 *
 * @author Bernardo Rufino <bermonruf@gmail.com>
 * @license Creative Commons Developing Nations: http://creativecommons.org/licenses/devnations/2.0/
 * @version 0.8
 * @description Script to add dynamic navigating functionality, it's framework independent
 *
 *       !Não retire essas informações!
 *       !Do not drop this information!
 */

//Just like the prototype, it returns a function wrapped in a context
Function.prototype.bind = function(context){
	var closure = this;
	var tmp_fnc = function(){
		return closure.apply(context, arguments);
	}
	return tmp_fnc;
}

Object.prototype.merge = function(object){
	for(attr in object){
		this[attr] = object[attr];
	}
}

document.navigators = {
	settings: {
		interval: 100, //The interval which the verification for new data will be done (in miliseconds)
		helper: true, //Specify if the onnavigate function will return the helper, do not change!
		iframe_src: "control.htm" //The location of the file control.htm, absolute path please
	},
	initialize: function(){
		this.is_ie = (navigator.userAgent.toLowerCase().indexOf("msie") > -1) ? true : false;
		if(this.is_ie){
			this.settings.iframe_src = this.settings.iframe_src.replace(/(\?|#).*$/, "");
			window.attachEvent("onload", (function(){
				//this.running = true; The iFrame that needs to make it running
				this.iframe = document.createElement("iframe");
				this.iframe.setAttribute("src", this.settings.iframe_src);
				this.iframe.style.display = "none";
				document.getElementsByTagName("body")[0].appendChild(this.iframe);
			}).bind(this));
		} else {this.running = true;}
	},
	//The function that is called by the user and puts new data in the hash to be called
	helper: function(data, force){
		var navs = document.navigators; var data = "[" + this.id + "]" + data;
		if(force){navs.data_buffer = "";} //If force is true then calling sequentially the same helper works
		if(navs.is_ie){navs.iframe.src = navs.settings.iframe_src + "?id=" + data;}
		else{window.location.hash = "#" + data;}
	},
	called: false,
	history: [],
	data_buffer: ""
};

function onnavigate(id, callback){
	var navs = document.navigators; navs[id] = {};
	if(!navs.running){navs.initialize();}
	setInterval(function(){if(navs.running){
		var url = window.location.href;
		var hash = window.location.hash.replace(/#/, "");
		var theid = "#[" + id + "]";
		if(url.indexOf(theid) > -1){ //If the call is with us!
			var data = url.split(theid)[1] || "";
			var new_data = theid + data;
			if(navs.data_buffer != new_data){ //If the old content is diferent
				callback(data); //Calling the callback function!
				navs.called = true; //To make sure was already called to fix the index state
				navs.history.push(new_data);
				navs.data_buffer = new_data;
			}
		} else if (!hash && navs.called){ //If the navigators was called and the page is in index state (no hashes), it means reload!
			navs.running = false; //To stop the others Intervals to dont make it the same way and broke something
			window.location = ((url.indexOf("#") > -1) ? url.split("#")[0] : url) + "#";
			window.location.reload();
		}
	}}, navs.settings.interval);
	navs[id].merge({callback: callback});
	if(navs.settings.helper){
		navs[id].helper = navs.helper.bind({id: id}); return navs[id].helper;
	}
}

function FormataValor(input) {
	num = input.value.replace(/[^0-9]+/g,'').toString().split('').reverse().join('');
	tam = num.length;

	if (tam > 2) {
		numtemp = num.substring(0, 4) + '/' + num.substring(4,tam);
		num = numtemp;
		if (tam > 6) {
			numtemp = num.substring(0, 7) + '/' + num.substring(7, num.length);
			num = numtemp;
			if (tam == 10) {
			num.substring(num.length);
			}
		}
	}
	input.value = num.toString().split('').reverse().join('');
}

function mascara(o,f){
    v_obj=o
    v_fun=f
    setTimeout("execmascara()",1)
}

function execmascara(){
    v_obj.value=v_fun(v_obj.value)
}

function telefone(v){
    v=v.replace(/\D/g,"")                 //Remove tudo o que não é dígito
    v=v.replace(/^(\d\d)(\d)/g,"($1) $2") //Coloca parênteses em volta dos dois primeiros dígitos
    v=v.replace(/(\d{4})(\d)/,"$1-$2")    //Coloca hífen entre o quarto e o quinto dígitos
    return v
}

function cep(v){
    v=v.replace(/D/g,"")                //Remove tudo o que não é dígito
    v=v.replace(/^(\d{5})(\d)/,"$1-$2") //Esse é tão fácil que não merece explicações
    return v
}

function cpf(v){
    v=v.replace(/\D/g,"")                    //Remove tudo o que não é dígito
    v=v.replace(/(\d{3})(\d)/,"$1.$2")       //Coloca um ponto entre o terceiro e o quarto dígitos
    v=v.replace(/(\d{3})(\d)/,"$1.$2")       //Coloca um ponto entre o terceiro e o quarto dígitos
                                             //de novo (para o segundo bloco de números)
    v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2") //Coloca um hífen entre o terceiro e o quarto dígitos
    return v
}