﻿/* **************************************************************
							--XJS--
Desenvolvedora: Rhianna Cantarelli
Versão: 2.0
Data: 17.10.2007
Email: r.rhianna@yahoo.com.br
************************************************************** */







/* **************************************************************
Engine das Requisições Assincronas (Ajax)
Métodos do Objeto XMLHTTP:
	- Faz Requisição de Documento
	obj.open("GET ou POST", "URL "[, sinaldesincronização[, "nomeUsuário"[, "senha"]]]);
	- Faz Envio de Parametros de Comunicação
	obj.send(null);

Existem 2 formas de tratar o retorno de uma requisição:
	obj.responseXML  <-- Retorna um Objeto XML Navegável por DOM
	obj.responseText <-- Retorna todo o documento em formato String

Resgatando Estado da Comunicação
State = obj.readyState;
	0 - Não iniciado (Uninitialised)
	1 - Carregando (Loading)
	2 - Carregado (Loaded)
	3 - Interativo (Interactive)
	4 - Completado (Completed)

Resultado da Requisição:
Result = obj.status;
    500 - Erro no Servidor
	404 - não encontrado
	200 - ok.

O Método transforma caracteres especiais em formato compativel com URL
escape(param);

Quando estiver sendo usado uma linguagem de Servidor, no documento que será entregue
o conteudo real que será entregue deve estar dentro das Tags:
<getThis> e </getThis>




************************************************************** */





/* **************************************************************
Cria Objeto que Carrega Configurações que serão usadas nas
requisições assincronas
************************************************************** */
function objXmlHttpRequestConfig() {
	this.method = 'POST'; // Pode ser GET ou POST
	this.isDOM = false; // Define retorno como um documento XML ou uma String
	this.isProtected = false; // Se 'true', usará credenciais
	this.login = '';
	this.password = '';


	// Altera Configurações Básicas 
	this.setConfig = function(met, isXml, isProt, user, senha) {
		this.method = met;
		this.isDOM = isXml;
		this.isProtected = isProt;
		this.login = user;
		this.password = senha;
	};

    // Carrega Informações Sobre Execução de JS em cada Estagio da Requisição
	this.arrayState = new Array();
	this.arrayIsExec = new Array();
	this.setState = function(n, value, isExec) { 
	    this.arrayState[n] = value; 
	    this.arrayIsExec[n] = isExec;
	};

	this.clearArrayState = function() { this.arrayState = new Array(4); };
	
	this.error = null;
	this.execInError = function(v) { this.error = v; };
};



/* **************************************************************
Cria Objeto que faz as requisições assincronas baseado nas informações
que foram configuradas num objeto do tipo objXmlHttpRequestConfig()
************************************************************** */
function objXmlHttpRequest(objConfig) {
	// Cria Objeto de Requisição Assincrona
	var objXmlHttp;

	
	// Conforme Navegador, cria Objeto de Requisição
	try { objXmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
	catch (e) {
		try { objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch (E) { objXmlHttp = false; } 
	} 
	if (!objXmlHttp && typeof  XMLHttpRequest != 'undefined' ) {
		try { objXmlHttp = new  XMLHttpRequest(); }
		catch (e) { objXmlHttp = false; } 
	}


	var nodeTarget = '';


	// Faz Requisição conforme Configurações
	this.LoadPage = function(url, param, node) {
		nodeTarget = node;


		// Define Ação para Mudanças de Estado
		objXmlHttp.onreadystatechange = XmlHttpRequestChangeState;


		// Se for um documento Protejido
		if(objConfig.isProtected == true) {	objXmlHttp.open(objConfig.method, url, true, objConfig.login, objConfig.password); }
		// Se for um documento sem proteção
		else { objXmlHttp.open(objConfig.method, url, true); }


		objXmlHttp.setRequestHeader('Content-Type','text/xml');
		objXmlHttp.setRequestHeader('encoding','utf-8');


		if(objConfig.method == "POST") {
			objXmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			objXmlHttp.setRequestHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
            objXmlHttp.setRequestHeader('Cache-Control', 'post-check=0, pre-check=0');
            objXmlHttp.setRequestHeader('Pragma', 'no-cache');
		}

		if(param == '') { param = 'isEmpty=true'; } // para GET ou POST sem Parametros
		else { param = encodeParam(param); } // para POST
		objXmlHttp.send(param);
	};


    // Faz Tratamento de Parametros
	var encodeParam = function(p) {
		splita = p.split('&');
		finalParam = '';

		for(i=0; i<splita.length; i++) {
	        iIni = splita[i].indexOf('=') + 1;
	        value = splita[i].substring(iIni, splita[i].length);
	        encValue = escape(value);
	        finalParam += splita[i].replace(value, encValue);
	        if(splita.length > 1 && i < (splita.length - 1)) { finalParam += '&'; }
		}
		return finalParam;
	};


	// Faz o Controle das Mudanças no Estado
	var XmlHttpRequestChangeState = function() {
		intState = objXmlHttp.readyState;
		strState = objConfig.arrayState[intState];
		isExec = objConfig.arrayIsExec[intState];
		intStatus = '';

		if(intState == 4) { 
			intStatus = objXmlHttp.status; 
			if(strState == undefined || strState == '') { strState = 'open'; }
		}


		// Se há Ação Definida para este estado
		if(strState != undefined && strState != '') {
			// Se for apenas um Alert, executa-o
			if(nodeTarget == 'alert') { 
				if(intState != 4) { alert(strState); }
				else {
					if(intStatus == 200) { alert(objXmlHttp.responseText+''); }
					else { alert('Erro n: ' + intStatus); }
			} }
			else {
				// Para todos os estados diferentes de 4, Executa Evento se Houver
				if(intState != 4 && isExec == true) { eval(strState); }
				else if(intState == 4) {
				    
				    // Se retorno da requisição for OK
				    if(intStatus == 200) {
				        if(objConfig.isDOM == true && objXmlHttp.responseXML != null) {
						    newXML = objXmlHttp.responseXML.getElementsByTagName('getThis');
						    nodeTarget.innerHTML = '';
						    nodeTarget.appendChild(newXML[0]);
				        }
				        // Se for para retornar uma string
				        else {
					        thisHTML = objXmlHttp.responseText + '';
					        intINI = thisHTML.indexOf('<getThis>') + 9;
					        intEND = thisHTML.indexOf('</getThis>');
					        thisHTML = thisHTML.substring(intINI, intEND);
						    nodeTarget.innerHTML = thisHTML;
				        }

				        // Executa Ação para Status 4 da Requisição
				        if(isExec == true) { eval(strState); }
				    }
				    // Se houver erro, executa Função de Erro.
				    else { eval(objConfig.error); }
				}
	        }
        }
    };
};







/* **************************************************************
Função Responsável por Chamar Conteúdo Assincrono
************************************************************** */
function XmlHttpRetrieve(pageName, pageParam, idTarget) {
    var modalType = pageName; // Nome da Página ASPX na Pasta _componentes à ser carregada
	var modalParam = pageParam; // Parametros à serem enviados para a Página a ser Carregada
    var isXML = xjs_isApplicationXml;

    // Se não for IE deve Restagar como XML
    if(xDoc.userBrowser == "IE") { isXML = false; }

    // Configura Objeto de Configuração
	RequestConfig.setConfig('POST', isXML, false, '', '');
        // Adiciona Ações para cada Estágio
	    if(arguments.length >= 4) { RequestConfig.setState(1, arguments[3], true); }
	    if(arguments.length >= 5) { RequestConfig.setState(2, arguments[4], true); }
	    if(arguments.length == 6) { RequestConfig.setState(3, arguments[5], true); }

    // Finaliza Configurações
    RequestConfig.setState(4, '', true);
    RequestConfig.execInError('alert("Erro n: " + intStatus);');

    // Determina Página da Requisição
	var urlPage = '../_componentes/' + modalType + '.aspx?' + modalParam;

    // Executa Requisição
	XmlHttp.LoadPage(urlPage, modalParam, idTarget);
	
	// Refaz Objeto em caso de IE
	if(xDoc.userBrowser == "IE"){ XmlHttp = new objXmlHttpRequest(RequestConfig); }
};
