////////////////////////////////////////////
//                                        //
//                                        //
//       FUNÇOES AJAX BY ADRIANO          //
//             03/09/2008                 //
//             VERSÃO 1.2                 //
//                                        //
////////////////////////////////////////////



// Variáveis de Animação //
var timerlen = 10;
var slideAniLen = 200;
var UsarAnimacao = false;

// Variáveis Globais //
var objAJAX = null;
var sDIV = '';
var sLOAD = '';
var sSCRIPT = '';
var aSCRIPTS = '';
var timerID = new Array();
var startTime = new Array();
var objDIV = new Array();
var objDIVAnima = new Array();
var endHeight = new Array();
var Direcao = new Array();


// Função principal para Carregar Página
//
//  AjaxCarregar(1,2,3,4,5);
//     1 = URL, Endereço da página a ser carregada. Obrigatório
//     2 = DIV ou SPAN, Área onde será inserida a página carregada. Opcional
//     3 = DIV ou SPAN, Área que será exibida DURANTE o carregamento. Opcional
//     4 = POST, Parametros a ser enviado á página por POST. Opcional
//     5 = SCRIPT, Script que será executado após o carregamento. Opcional
//
//  Exemplo de como carregar uma página em uma área:
//             AjaxCarregar('http://www.teste.com/teste.php','areateste');
//
//  Exemplo de como carregar uma página em uma área exibindo div 'Carregando':
//             AjaxCarregar('http://www.teste.com/teste.php','areateste','carregando');
//
//  Exemplo de como carregar uma página em uma área e executar um script no final:
//             AjaxCarregar('http://www.teste.com/teste.php','areateste',,,"alert('Terminou.');");
//
//  Exemplo de como enviar parametros por POST sem resposta:
//             AjaxCarregar('http://www.teste.com/teste.php',,,'Id=21&Nome=Adriano&Ano=2008&Mes=08');
//
//  Exemplo de como enviar parametros por POST com resposta:
//             AjaxCarregar('http://www.teste.com/teste.php','arearesposta',,'Id=21&Nome=Adriano&Ano=2008&Mes=08');
//
//  Exemplo de como enviar parametros por POST com resposta, exibindo área 'carregando' e executando script no final:
//             AjaxCarregar('http://www.teste.com/teste.php','arearesposta','carregando','Id=21&Nome=Adriano&Ano=2008&Mes=08',"alert('Terminado.')");
//


function AjaxCarregar(URL,DIV,LOAD,POST,SCRIPT){
	// Verifica se foi passado um endereço //
	if(!URL) {
		alert('É necessario um endereço (URL).');
		return;
	}
	// Verifica se foi passado uma area de 'carregando' //
	if(LOAD) {
		// Salva informação para a função 'AjaxTerminar' //
		sLOAD = LOAD;
		// Verifica se irá utilizar animação //
		if(UsarAnimacao) {		
			// Se não estiver, Informa qual direção será feita a animação //
			Direcao[LOAD] = "down";
			// Inicia a animação //
			IniciaAnimacao(LOAD);
		} else {
			// Exibe a área 'carregando' //
			document.getElementById(LOAD).style.display='block';
		}
	}
	// Verifica se vai exibir retorno //
	if(DIV) {
		// Salva informação para a função 'AjaxTerminar' //
		sDIV = DIV;
		// Verifica se irá utilizar animação //
		if(UsarAnimacao) {		
			// Se não estiver, Informa qual direção será feita a animação //
			Direcao[DIV] = "up";
			// Inicia a animação //
			IniciaAnimacao(DIV);
		} else {
			// Oculta a área onde será carregada //
			document.getElementById(DIV).style.display='none';
		}
	}
	// Verifica se recebeu script //
	if(SCRIPT) {
		// Salva informação para a função 'AjaxTerminar' //
		sSCRIPT = SCRIPT;
	}
	// Serializa para forçar uma resposta sem utilizar CACHE //
    	if(URL.indexOf('?')>0) { // Verifica se já tem variáveis GET //
	    	URL = URL+'&act_serial='; // Se houver variáveis GET, adiciona mais uma //
		} else {
		    URL = URL+'?act_serial='; // Se não houver variáveis GET, adiciona uma nova //
		}
		// Cria um objeto Data //
		var Data = new Date;
		// Insere um valor no 'act_serial=' //
		URL = URL + Data.getFullYear()+''+Data.getMonth()+''+Data.getDate()+'';
		URL = URL + Data.getHours()+''+Data.getMinutes()+''+Data.getSeconds()+''+Data.getMilliseconds;
		
	// Verifica por um objeto AJAX nativo (Mozilla/Safari) //
	if (window.XMLHttpRequest) {
		// Carrega o objeto AJAX //
		objAJAX = new XMLHttpRequest();
	// Procura por uma versao AJAX ActiveX (IE) //
	} else if (window.ActiveXObject) {
		// Tenta carragar AJAX 5.0 //
		try {objAJAX = new ActiveXObject("MSXML2.XMLHttp.5.0");} catch(e) {
		// Tenta carragar AJAX 4.0 //
		try {objAJAX = new ActiveXObject("MSXML2.XMLHttp.4.0");} catch(e) {
		// Tenta carragar AJAX 3.0 //
		try {objAJAX = new ActiveXObject("MSXML2.XMLHttp.3.0");} catch(e) {
		// Tenta carragar AJAX 2.0 //
		try {objAJAX = new ActiveXObject("MSXML2.XMLHttp");} catch(e) {
		// Tenta carragar AJAX 1.0 //
		try {objAJAX = new ActiveXObject("Microsoft.XMLHttp");} catch(e) {
		// Não há um objeto AJAX //
		objAJAX = false;
		}
		}
		}
		}
		}
	}
	// Verifica se foi carregado um objeto AJAX
	if(objAJAX) { // Se existir objeto AJAX //
		// Informa qual função será chamada quando terminar de carregar //
		objAJAX.onreadystatechange = AjaxTerminar;
		// Verifica se envia parametros por POST //
		if(POST) {
			// Verifica se pode ser substituido o padrão de envio //
			if(objAJAX.overrideMimeType) {
				// Envia no formato XML //
				/* objAJAX.overrideMimeType('text/xml'); */
				// Envia no formato HTML //
				objAJAX.overrideMimeType('text/html');
			}
			// Prepara o Ajax //
			objAJAX.open('POST', URL, true)
			// Prepara formato de envio //
			objAJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			// Prepara tamanho do Buffer para envio //
			objAJAX.setRequestHeader("Content-length", POST.length);
			// Prepara o tipo de conexão //
			objAJAX.setRequestHeader("Connection", "close");
			// Prepara o retorno sem cache //
			objAJAX.setRequestHeader("cache-Control","no-store, no-cache, must-revalidate");
			// Prepara o retorno sem cache //
			objAJAX.setRequestHeader("Pragma", "no-cache");
			// Envia a requisição da página //
			objAJAX.send(POST);
		} else {
			// Prepara o Ajax //
			objAJAX.open("GET", URL, true);
			// Prepara o retorno sem cache //
			objAJAX.setRequestHeader("cache-Control","no-store, no-cache, must-revalidate");
			// Prepara o retorno sem cache //
			objAJAX.setRequestHeader("Pragma", "no-cache");
			// Envia a requisição da página //
			objAJAX.send(null);
		}
	} else { // Se não existir objeto AJAX //
		// Avisa o erro //
		alert('O seu navegador não tem suporte para uma função necessária para o funcionamento correto deste site.');
		// Verifica se foi passado uma area de 'carregando' //
		if(LOAD!='') {
			// Verifica se irá utilizar animação //
			if(UsarAnimacao) {		
				// Se não estiver, Informa qual direção será feita a animação //
				Direcao[LOAD] = "up";
				// Inicia a animação //
				IniciaAnimacao(LOAD);
			} else {
				// Oculta a área 'carregando' //
				document.getElementById(LOAD).style.display='none';
			}
		}
		// Verifica se vai exibir retorno //
		if(DIV!='') {
			// Verifica se irá utilizar animação //
			if(UsarAnimacao) {		
				// Se não estiver, Informa qual direção será feita a animação //
				Direcao[DIV] = "down";
				// Inicia a animação //
				IniciaAnimacao(DIV);
			} else {
				// Exibe a área onde deveria ser carregada //
				document.getElementById(DIV).style.display='block';
			}
		}
		// Limpa valores //
		sDIV='';
		sLOAD='';
		sSCRIPT='';
		aSCRIPTS='';
	}
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
// 

function AjaxTerminar(){
	// Verifica se o estado do AJAX está 'completado' //
	if(objAJAX.readyState == 4) {
		// Verifica se o retorno está 'OK' //
		if (objAJAX.status == 200) {
			// Salva resposta //
			CodigoHTML = objAJAX.responseText
			// Limpa scripts existentes na página //
			CodigoHTML = LimparScripts(CodigoHTML);
			// Verifica se vai exibir retorno //
			if(sDIV!='') {
				// Insere na área de retono a página //
				document.getElementById(sDIV).innerHTML = CodigoHTML;
				// Verifica se irá utilizar animação //
				if(UsarAnimacao) {		
					// Se não estiver, Informa qual direção será feita a animação //
					Direcao[sDIV] = "down";
					// Inicia a animação //
					IniciaAnimacao(sDIV);
				} else {
					// Exibe área de retorno //
					document.getElementById(sDIV).style.display='block';
				}
			}
			// Verifica se foi passado uma area de 'carregando' //
			if(sLOAD!='') {
				// Verifica se irá utilizar animação //
				if(UsarAnimacao) {		
					// Se não estiver, Informa qual direção será feita a animação //
					Direcao[sLOAD] = "up";
					// Inicia a animação //
					IniciaAnimacao(sLOAD);
				} else {
					// Oculta a área 'carregando' //
					document.getElementById(sLOAD).style.display='none';
				}
			}
			// Executa scripts existentes na página //
			ExecutarScripts();
			// Verifica se exsite um Script a ser executado após o termino //
			if(sSCRIPT!='') {
				// Executa o Script 2 segundos após o termino //
				setTimeout(sSCRIPT,2000);
			}
			// Limpa valores //
			sDIV='';
			sLOAD='';
			sSCRIPT='';
			aSCRIPTS='';
		} else if (objAJAX.status == 404) { // Se o retorno for 404 //
			// Avisa o erro gerado //
			alert ("A página requisitada não existe.");
			// Limpa valores //
			sDIV='';
			sLOAD='';
			sSCRIPT='';
			aSCRIPTS='';
		} else if (objAJAX.status == 403) { // Se o retorno for 403 //
			// Avisa o erro gerado //
			alert("Acesso negado.");
			// Limpa valores //
			sDIV='';
			sLOAD='';
			sSCRIPT='';
			aSCRIPTS='';
		} else { // Se o retorno não estiver 'OK' //
			// Avisa o erro gerado //
			alert("Houve um problema ao obter os dados:\n" + objAJAX.statusText);
			// Limpa valores //
			sDIV='';
			sLOAD='';
			sSCRIPT='';
			aSCRIPTS='';
		}
	} else { // Se o estado do AJAX não estiver 'completado' //
		// Aqui o AJAX está carregando a página //
	}
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
// 


function LimparScripts(SCRIPT) {
	// Recebe o código html //
	var source = SCRIPT;
	// Cria uma matriz //
	aSCRIPTS = new Array();
	// Procura por scripts //
	while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
		// Localiza inicio da posição inicial do script //
		var s = source.indexOf("<script");
		// Localiza fim da posição inicial do script //
		var s_e = source.indexOf(">", s);
		// Localiza inicio da posição final do script //
		var e = source.indexOf("</script", s);
		// Localiza final da posição final do script //
		var e_e = source.indexOf(">", e);
		// Adiciona a matriz o script inteiro //
		aSCRIPTS.push(source.substring(s_e+1, e));
		// Remove script do código html //
		source = source.substring(0, s) + source.substring(e_e+1);
	}
	// Retorna o código html sem os scripts //
	return source;
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
// 

function ExecutarScripts(SCRIPT) {
	// Cicla entre todos os scripts coletados //
	for(var i=0; i<aSCRIPTS.length; i++) {
		// Executa o script //
		try {eval(aSCRIPTS[i]);} catch(ex) {
	    // Caso ocorra erro //
		}
	}
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
//

function IniciaAnimacao(ADIV){
	// Resgata todo conteúdo da caixa //
	sourceHTML = document.getElementById(ADIV).innerHTML;
	// Gera número randomico de 4 digitos //
	id = Math.ceil(1000 + (9999-1000)*Math.random());
	// Cria DIV de animação //
	sourceHTML = '<div id="DIV_Interna_Anima'+id+'" style="height: 100%; width: 100%; margin-top: 0px;">'+sourceHTML+'</div>';
	// Insere o conteúdo atualizado //
	document.getElementById(ADIV).innerHTML = sourceHTML;
	// Resgata DIV //
	objDIV[ADIV] = document.getElementById(ADIV);
	// Resgata DIV da animação //
	objDIVAnima[ADIV] = document.getElementById('DIV_Interna_Anima' + id);
	// Verifica se tem altura atribuida ao DIV //
    if(!parseInt(objDIV[ADIV].style.height)) {
		// Se não tiver, resgata a área ocupada //
		endHeight[ADIV] = objDIV[ADIV].offsetHeight;
	} else {
		// Se tiver, pega esta altura //
		endHeight[ADIV] = parseInt(objDIV[ADIV].style.height);
	}
	// Verifica a direção da animação //
	if(Direcao[ADIV] == "up"){
		// Atribui a margem de cima //
		objDIVAnima[ADIV].style.marginTop = "0px";
		// Atribui a altura //
		objDIV[ADIV].style.height = endHeight[ADIV] + "px";
	} else {
		// Atribui a margem de cima //
		objDIVAnima[ADIV].style.marginTop = -endHeight[ADIV] + "px";
		// Atribui a altura //
		objDIV[ADIV].style.height = "0px";
	}
	// Exibe o DIV //
	objDIV[ADIV].style.display = "block";
	// Atribui informação para esconder o que não couber na caixa //
	objDIV[ADIV].style.overflow = "hidden";
	// Marca o tempo do início da animação //
	startTime[ADIV] = (new Date()).getTime();
	// Cria o temporizador para animar //
	timerID[ADIV] = setInterval('MoveAnimacao(\'' + ADIV + '\');',timerlen);
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
//

function MoveAnimacao(ADIV){
	// Verifica o tempo passado desde o início da animação //
	var elapsed = (new Date()).getTime() - startTime[ADIV];
	// Verifica se terminou o tempo //
	if (elapsed > slideAniLen) {
		// Chama função para Terminar a animação //
		TerminaAnimacao(ADIV);
	} else {
		// Calcula a nova posição //
		var d =Math.round(elapsed / slideAniLen * endHeight[ADIV]);
		// Verifica se a direção é para cima //
		if(Direcao[ADIV] == "up") {
			// Calcula número subtraindo o tamanho //
			d = endHeight[ADIV] - d;
		}
		// Atribui a margem de cima //
		objDIVAnima[ADIV].style.marginTop = -(endHeight[ADIV] - d) + "px";
		// Atribui o tamanho da área //
		objDIV[ADIV].style.height = d + "px";;
	}
	// Termina //
	return;
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
//

function TerminaAnimacao(ADIV){
	// Para o temporizador //
	clearInterval(timerID[ADIV]);
	// Verifica qual direção da animação //
	if(Direcao[ADIV] == "up") {
		// Oculta a DIV //
		objDIV[ADIV].style.display = "none";
	} else {
		// Exibe a DIV //
		objDIV[ADIV].style.display = "block";
	}
	// Atribui a margem //
	objDIVAnima[ADIV].style.marginTop = "0px";
	// Atribui a altura //
	objDIV[ADIV].style.height = endHeight[ADIV] + "px";
	// Exclui variáveis utilizadas pela animação //
	delete(timerID[ADIV]);
	delete(startTime[ADIV]);
	delete(endHeight[ADIV]);
	delete(objDIV[ADIV]);
	delete(objDIVAnima[ADIV]);
	delete(Direcao[ADIV]);
	// Resgata todo conteúdo da caixa //
	sourceHTML = document.getElementById(ADIV).innerHTML;
	// verifica se tem a DIV de animação //
	if(sourceHTML.indexOf("DIV_Interna_Anima")>0) {
		// Resgata o tamanho do conteúdo //
		len = sourceHTML.length;
		// Elimina a DIV de animação //
		sourceHTML = sourceHTML.substring(84,len-6);
	}
	// Insere o conteúdo atualizado //
	document.getElementById(ADIV).innerHTML = sourceHTML;
	// Termina //
	return;
}



// Função secundária
//
//  Não deve ser utilizada, diretamente, o AJAX executa ela no momento apropriado.
//

function Animar(ADIV){
	// Verifica se a DIV está visivel //
	if(document.getElementById(ADIV).style.display == "none"){
		// Se não estiver, Informa qual direção será feita a animação //
		Direcao[ADIV] = "down";
		// Inicia a animação //
		IniciaAnimacao(ADIV);
	}else{
		// Se estiver, Informa qual direção será feita a animação //
		Direcao[ADIV] = "up";
		// Inicia a animação //
		IniciaAnimacao(ADIV);
	}
}

