Sistema em Ajax consultando vários arquivos XML
Olá galera,
Estou desenvolvendo o meu primeiro sistema com a vedete do ciber-mundo (Ajax).
A aplicação consiste em um sistema de protocolo eletrônico (quem trabalha em órgão público deverá entender melhor o que é). O sistema lê um cadastro de documentos (processos) com seus respectivos trâmites, nada de mais.
A tela é divida verticalmente em duas partes (esquerda e direita). Do lado direito eu tenho uma listagem de números de processos ordenados em pastas (como as pastas de um webmail) esta listagem é a saída de um XML criado dinamicamente em PHP e do lado esquerdo eu apresento os dados do processo selecionado no lado direito e estes dados vem de uma nova consulta a base que gera outro XML dinamicamente a via PHP.
Note que o conceito é bem simples e até este ponto ele está funcionando, mas eu não estou satisfeito com a forma como implementei, pois eu tive que duplicar as funções LoadXML (listagem abaixo) usando uma função para gerar cada XML. Usando a mesma função (o que deveria ser o correto já que elas fazem a mesma coisa) eu não consigo realizar as duas consultas. Alguém pode dizer uma forma mais higiênica de se fazer isso sem precisar duplicar esta função?
Código :
//Cria um objeto XMLHttpRequest de acordo com o browser - ISSO SIM inicia o Ajax
function GetXmlHttpObject() {
var xmlHttp=null;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
} catch (e) {
// Internet Explorer
try {
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
//
if ( xmlHttp == null ) {
alert('Seu navegador nao suporta AJAX');
}
//
return xmlHttp;
}
/* Carrega a URL especificada em modo assincrono e ao mudar
o estado dispara a função fornecida */
function loadXML(url,funcao) {
xmlHttp = GetXmlHttpObject();
xmlHttp.onreadystatechange=funcao;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
/* Carrega a URL especificada em modo assincrono e ao mudar
o estado dispara a função fornecida */
function loadXML2(url,funcao) {
xmlHttp2 = GetXmlHttpObject();
xmlHttp2.onreadystatechange=funcao;
xmlHttp2.open("GET",url,true);
xmlHttp2.send(null);
}
funções complementares para carga do menu
Código :
/* Carrega os numeros de processos no menu lateral
Esta função é chamada pela funcao loadMenuProcesso */
function loadMenu(xmlDoc) {
processos = xmlDoc.getElementsByTagName("listaprocessos")[0].getElementsByTagName("areceber")[0].getElementsByTagName("processo");
total_processos = processos.length;
//
lista = "<b>A receber ("+ total_processos +")</b><br>";
for (tr = 0 ; tr < total_processos ; tr++) {
//
try {
processo = processos[tr].getElementsByTagName("numprocesso")[0].firstChild.nodeValue;
cod = processos[tr].attributes[0].nodeValue;
processo += ' - ' + cod;
processo = "<A HREF='#' id='itemprocesso' onClick='Javascript:ShowProcesso("+cod+");'>"+processo+"</A>";
}
catch (e) { processo = "-"; }
lista += processo + "<br>";
}
}
/* Carrega os dados e os tramites de um dado processo de forma assincrona */
function loadMenuProcesso() {
if (xmlHttp2.readyState==4) {
// if "OK"
if (xmlHttp2.status==200) {
xmlDoc = xmlHttp2.responseXML;
loadMenu(xmlDoc);
situacao("Menu Pronto!");
} else {
alert("Problemas ao receber os dados XML para construir o menu");
}
} else if (xmlHttp2.readyState==1) {
situacao("Carregando menu...");
}
}
//
/* Carrega a lista de processos do setor especificado no menu de navegacao */
function ShowMenu(codsetor) {
var url="listaprocessos.xml";
var url="listaprocessos_xml.php";
url=url+'?codsetor='+codsetor
//alert(url);
loadXML2(url,loadMenuProcesso);
}
Funções que recebem os dados do processo
Código :
/*Pega o dado especificado da arvore XML */
function my_getnode(mynode) {
try {
return xmlDoc.getElementsByTagName(mynode)[0].childNodes[0].nodeValue;
} catch (e) {
return "<span style='color:red'> "+mynode + " nao especificado</span>";
}
}
/* Carrega os dados do processo especificado
Esta função é chamada pela funcao loadProcesso */
function loadProcessoDados(xmlDoc) {
document.getElementById("numprocesso").innerHTML = my_getnode("numprocesso");
document.getElementById("interessado").innerHTML = my_getnode("interessado");
document.getElementById("assunto").innerHTML = my_getnode("assunto");
document.getElementById("documento").innerHTML = my_getnode("numerodocumento");
document.getElementById("data").innerHTML = my_getnode("datacadastro");
}
//
/* Carrega os dados e os tramites de um dado processo de forma assincrona */
function loadProcesso() {
if (xmlHttp.readyState==4) {
// if "OK"
if (xmlHttp.status==200) {
xmlDoc = xmlHttp.responseXML;
loadProcessoDados(xmlDoc);
loadProcessoTramites(xmlDoc);
situacao("Processo carregado");
} else {
alert("Problemas ao receber os dados XML do processo");
}
} else if (xmlHttp.readyState==1) {
situacao("Carregando dados do processo...");
}
}
//