salve a tutti,

il mio problema riguarda l'uso di Javascript per fare una ricerca nel file xml e riportare i risultati in una pagina HTML

il tipo di ricerca che devo usare č mediante due menų a tendina dinamici che leggendo i valori "categoria" e "gruppo" dal file XML, generano le varie opzioni di ricerca
una indica la categoria principale e la seconda mette in dettaglio i contenuti

solo che le due select non prendono i dati e di conseguenza non va tutto il resto.
credo che la causa del malfunzionamento sia l'oggetto this.lista che non viene letto dai gestori delle select, ho provato a risolvere ma da solo non ci riesco e sono arrivato alla disperazione, per caso qualcuno sa come risolvere? grazie in anticipo

allego il codice e il link diretto alla pagina cosi potete provarla

http://halo.altervista.org/database.html

Codice:
function caricaXML(nomeFile) {
var xmlhttp;
if (window.XMLHttpRequest) {
// IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
} else {
// IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", nomeFile, false);
xmlhttp.send();
return xmlhttp.responseXML;
}


/*funzione costruttrice dell'oggetto profilo*/

function Scheda(nom, appar, prof, grup, img){
/*proprietā dell'oggetto*/
	this.nome = nom;
	this.apparizione = appar;
	this.profilo = prof;
	this.gruppo = grup;
	this.immagine = img;
	
}
	

function Archivio(){
	 this.lista = [];/*array vuoto che conterrā tutti i profili*/
	this.inizializza = 
		function(nodo){
	/*per ogni nodo con marca "scheda", creo un oggetto scheda, lo inizializzo e lo aggiungo all'array*/
		var schede = nodo.getElementsByTagName("scheda");

		for(var i = 0; i<schede.length; i++){
		
			var categoria = schede[i].getAttribute("categoria");
			var nomi = schede[i].getElementsByTagName("nome");
			var nome = nomi[0].firstChild.nodeValue;
			var apparizioni = schede[i].getElementsByTagName("apparizione");
			var apparizione = apparizioni[0].firstChild.nodeValue;
			var profili = schede[i].getElementsByTagName("profilo");
			var profilo = profili[0].firstChild.nodeValue;	
			var immagini = schede[i].getElementsByTagName("immagine");
			var immagine = 	immagini[0].firstChild.nodeValue;
			
			var scheda = new Scheda(nome, apparizione, profilo, categoria,immagine, categoria);
			this.lista.push(scheda);
			
		}
	}
		/*metodo con cui creo la prima select "categoria"*/
	this.creaSelectCategoria =
      function (nodo) {
         var categoria = [];
         for (var i = 0; i<this.lista.length; i++) {
            categoria[this.lista[i].categoria] = true;
         }
         var s = '<option value="null" >Seleziona una Categoria </option>';
         for (var i in categoria) {
            s += '<option value="' + i + '">' + i + '</option>';
         }
		 return s;
      }  
		/*metodo con cui creo la seconda select "gruppo"*/
	 this.creaSelectGruppo =
      function (nodo) {
         var gruppi = [];
         for (var i = 0; i<this.lista.length; i++) {
            gruppi[lista[i].gruppo] = true;
         }
         var s = '<option value="null" >Seleziona un gruppo</option>';
         for (var i in gruppi) {
            s += '<option value="' + i + '">' + i + '</option>';
         }
		 
         return s;
      }
	  
	  
	  // crea la lista con gli elementi selezionati precedentemente
    this.cerca2 = function (categoria,gruppo) {
         var risultati = [];
		 
           for (var i = 0; i < this.lista.length; i++) {
             if (this.lista[i].categoria == categoria &&
                this.lista[i].gruppo == gruppo )
				{
               risultati.push(this.lista[i]);
            }
		 
		 }
         return risultati;
		} 
	
	this.cerca1 = function(testo){
		var risultato = [];
		var trovato = 0;
		var i = 0;
		
		while(i<this.lista.length && trovato == 0){
			if(this.lista[i].nome == testo)
			{
				trovato = 1;
				risultato.push(this.lista[i]);
			}
			else
				i++;
		}
		
		if(trovato == 1)
			return risultato;
		else
		{
			risultato[0] = null;
			return risultato;
		}
	}
	

	
	this.genera = function(valori){  // genera la lista con gli elementi di xml
		var s = "";
	
		if(valori[0] == null)
			s = "Nessun risultato";
		else{	
			for(var i = 0; i<valori.length; i++)
				s = s + '<li><span class="trovato" onclick="mostra(this);">' + valori[i].nome + "  " + '</span><br/><ol class="nascosto"><li class="nopallino2"> <img class="avatar" src='+ valori[i].immagine+'> <br/><br/><p class="titolo4"> Profilo: </p> <p class="bianco">'+ valori[i].profilo +'</p> <p class="titolo4">Apparizione:</p> <p class="bianco">' + valori[i].apparizione +'</p></li></ol></li><br/><br/>';
		} 
		return s;	
	}
	
	this.nascondi = function(){
		var liste = document.getElementsByTagName("ol");
		
		for(var i = 0; i<liste.length; i++){
			if(liste[i].className == "nascosto")
				liste[i].style.display = "none";
		}
	}
}


// gestore cerca2
function cercaGruppo () {
   var nodoSelectCategoria = document.getElementById("selectCategoria");
   var categoria = nodoSelectCategoria.value;
   var nodoSelectGruppo = document.getElementById("selectGruppo");
   var gruppo = nodoSelectGruppo.value;
   var schede = contenitore.cerca2(categoria,gruppo);
 
   var nodoLista = document.getElementById("lista");
// alert e messaggi d'errore
   if (schede.length > 0) {
      var s = "";
      for (var i = 0; i < schede.length; i++) {
         s += schede[i].genera();
      }
      nodoLista.innerHTML = s;
   } 
   
   else if (nodoSelectCategoria.value == "null"){
	
	alert("Completa la selezione");
	}
   
   else if (nodoSelectGruppo.value == "null"){
	alert("Completa la selezione");
	}
   
   
   else {
      nodoLista.innerHTML = "NESSUNA SCHEDA TROVATA";
   }
}




function mostra(nome){

	var testo = nome.nextSibling.nextSibling;
	
	if(testo.style.display == "none")
		testo.style.display = "block"

	else
		testo.style.display = "none"
}

// funzione che cerca le schede relative all'oggetto cercato digitando il nome
function cercaNome(){

	var casella = document.getElementsByTagName("input");
	var nome;
	var elenco = document.getElementById("ricerca");
	var scheda;
	
	nome = casella[0].value;
	
	scheda = contenitore.cerca1(nome);

	elenco.innerHTML = contenitore.genera(scheda);
	
	contenitore.nascondi();
}

// funzione per mostrare tutte le schede
function tutto(){

	var elenco = document.getElementById("ricerca");

	elenco.innerHTML = contenitore.genera(contenitore.lista);
	
	contenitore.nascondi();	
}


var contenitore = new Archivio();


function inizializza(){

	var c1 = document.getElementById("cerca1");
	var c2 = document.getElementById("cerca2");
	var c3 = document.getElementById("cerca3");

	var nodoSelectCategoria = document.getElementById("selectCategoria");
   nodoSelectCategoria.innerHTML = contenitore.creaSelectCategoria();	
var nodoSelectGruppo = document.getElementById("selectGruppo");
   nodoSelectGruppo.innerHTML = contenitore.creaSelectGruppo();	
   
	c1.onclick = cercaNome;
	c2.onclick = cercaGruppo;
	c3.onclick = tutto;
	

	
	var nodo = caricaXML("elenco.xml");
	contenitore.inizializza(nodo);
}

function crea_gruppo(cat, gruppo) {
         var gruppi = {};
         for (var i = 0; i < lista.length; i++) {
			if(lista[i].categoria==categoria)
			{
				gruppi[lista[i].gruppo] = true;
			}
         }
         var s = '<option value="null"  >Seleziona gruppo</option>';
         for (var i in gruppi) {
            
			s += '<option value="' + i + '">' + i + '</option>';
         }
		
         document.getElementById("selectGruppo").innerHTML= s;
      
}



window.onload = inizializza;