// Autor: Wagner Rodrigues Chagas
// Certificado: MCSD - Microsoft Certified Solution Developer 
// Funçao: (Gerente de Projetos Web/Desktop)
//         (Analista de Sistemas)
//
// E-mail: wagner@agencydevolp.com
// E-mail: wagner.rodry@gmail.com
// Contato: (061) 84757871
// HomePage: www.agencydevelop.com
//-------------------------------------------------------------------------

//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

// ###############################################################################################################

try{
   // Mozilla, Safari, Firefox, etc...
	xmlhttp = new XMLHttpRequest();
    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{
		// Internet Explorer
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
	catch(e3){
        try{
            // Internet Explorer
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }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){
	var rndNumber = Math.floor(Math.random()*1000);
	var fileName = url.substring(url.lastIndexOf('/')+1, url.length);
	var paramentroRandomico = (fileName.indexOf('?')<0) ? '?'+rndNumber : '&'+rndNumber;
	url += paramentroRandomico;
    AjaxCarregando(id_target);
    fila[fila.length]=[id_target,url,"GET",null];
    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){
    var url = document.getElementById(id_form).action;
    var metodoEnvio = document.getElementById(id_form).method.toUpperCase();
    var elementos_form = BuscaElementosForm(id_form);
    AjaxCarregando(id_target);
    fila[fila.length]=[id_target,url,metodoEnvio,elementos_form];
    if(fila.length==1){
        ajaxRun();
    }
    return;
}

//EXECUTA A PROXIMA SOLICITACAO DA FILA
function ajaxRun(){
	
	var url = fila[ifila][1];
    var metodoEnvio;
    if (fila[ifila][3]==null){
        metodoEnvio = "GET";
    }
	else{
        metodoEnvio = fila[ifila][2];
        if (metodoEnvio=="" || metodoEnvio==null){
            metodoEnvio = "POST";
        }
        if (metodoEnvio=="GET"){
            url = url + "?" + fila[ifila][3];
        }
    }
    xmlhttp.open(metodoEnvio,url,true);
    xmlhttp.onreadystatechange = ajaxXMLHTTP_StateChange;
    if (metodoEnvio=="POST"){
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
		xmlhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
		xmlhttp.setRequestHeader("Pragma", "no-cache");	
        xmlhttp.send(fila[ifila][3]);
    }else{
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		xmlhttp.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
		xmlhttp.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
		xmlhttp.setRequestHeader("Pragma", "no-cache");	
        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){
        //Quando iniciar a solicitacao
		ajaxXMLHTTP_StateChange_Carregando(fila[ifila][0]);
    }else{
        if (xmlhttp.readyState==4){
            //Quando estiver completa a solicitacao
			ajaxXMLHTTP_StateChange_Completo(xmlhttp, fila[ifila][0]);
        }
    }
}

//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
    AjaxCarregando(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) {
        retorno = unescape(xmlhttp.responseText.replace(/\+/g," "));
    }else{
        retorno = ajaxPaginaErro(xmlhttp);
    }
    document.getElementById(id).innerHTML=retorno;
    ExtraiScript(retorno); 
    ifila++;
    if(ifila<fila.length){
        setTimeout("ajaxRun()",20);
    }else{
        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 0: return "Erro desconhecido de javascript";
		case 400: return "400: Solicita&ccedil;&atilde;o incompreensível"; break;
		case 403: case 404: return "404: N&atilde;o foi encontrada a URL solicitada"; break;
		case 405: return "405: O servidor n&atilde;o suporta o m&eacute;todo solicitado"; break;
		case 500: return "500: Erro desconhecido de natureza do servidor"; break;
		case 503: return "503: Capacidade m&aacute;xima do servidor alcançada"; break;
		default: return "Erro desconhecido!!!<br>" + xmlhttp.status + " - " + xmlhttp.statusText.replace(/\+/g," ");break;
    } 
}

//FUNCAO PARA RETORNAR A MENSAGEM DE QUE ESTA CARREGANDO A PAGINA
function AjaxCarregando(id){
	var text;
	text = "<table width=\"100%\"  cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
	text = text + "<tr>";
	text = text + "<td align=\"center\" valign=\"middle\">";
	text = text + "<center>";
	//text = text + "<img src=\"incs/imgs/carregando.gif\" width=\"32\" height=\"32\">"
	text = text + "<b>&nbsp;&nbsp;&nbsp;Carregando Sistema...</b>";
	text = text + "</center>";
	text = text + "</td>";
	text = text + "</tr>";
	text = text + "</table>";
    document.getElementById(id).innerHTML = text;
}

//FUNCAO PARA PEGAR OS CODIGOS SCRIPT
function ExtraiScript(texto){
    var ini, pos_src, fim, codigo, texto_pesquisa;
    var objScript = null;
    texto_pesquisa = texto.toLowerCase()					// Converte para minusculo
    ini = texto_pesquisa.indexOf('<script', 0)				// Busca a primeira tag <script
    while (ini!=-1){										// Executa o loop enquanto achar um <script
        var objScript = document.createElement("script"); 	// Inicia o objeto script
        pos_src = texto_pesquisa.indexOf(' src', ini)		// Busca se tem algum src a partir do inicio do script
        ini = texto_pesquisa.indexOf('>', ini) + 1;			// Define o inicio para depois do fechamento dessa tag

        // Verifica se existe um src
        if (pos_src < ini && pos_src >=0){					// Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script
            ini = pos_src + 4;								// Marca como sendo o inicio do nome do arquivo para depois do src
            fim = texto_pesquisa.indexOf('.', ini)+4;		// Procura pelo ponto do nome da extencao do arquivo e marca para depois dele
            codigo = texto.substring(ini,fim);				// Pega o nome do arquivo
            
			// Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano
            codigo = codigo.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");
            objScript.src = codigo;							// Adiciona o arquivo de script ao objeto que sera adicionado ao documento
        }
		else{												// Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script
            fim = texto_pesquisa.indexOf('</script>', ini);	// Procura o final do script
            codigo = texto.substring(ini,fim);				// Extrai apenas o script
            objScript.text = codigo; 						// Adiciona o bloco de script ao objeto que sera adicionado ao documento
       }
        document.body.appendChild(objScript);				// Adiciona o script ao documento
        ini = texto.indexOf('<script', fim);				// Procura a proxima tag de <script
		objScript = null;									// Limpa o objeto de script
    }
}



//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;
}