Newsgroup: it.comp.lang.javascript
Titolo: Aiutoooo... per favore...

Sono alle prese con questo script scritto da me, non riesco a
sistemarlo... mi dà sempre errore! E' un modo per visualizzare un
semplice menu ad albero come quelli che si possono vedere nel sito
della Micro$oft (mi spiace di usare questo esempio... ;-)). Quando una
voce è contratta, visualizza un'immagine con un '+', quando espansa un
'-'. Una voce finale, che apra un documento, ha un altro tipo di
immagine e carica la pagina di destra al posto che quella di sinistra.
La potete distinguere anche dall'attributo corsivo.
Non sono un esperto, e se qualcuno mi può aiutare, mi fa veramente
felicissimo... se qualcuno lo ritiene opportuno, si metta in contatto
con me, e gli invierò lo zip con i files html, cosicché sia più
semplice fare il debug. Inoltre io li ho messi in file separati ".js",
ma sono strasicuro che nn è quello il problema.
Ricordate che ci sono due frames: una chiamata 'menu' e una 'main',
dove vengono visual gli articoli.
/////////////  SCRIPT STARTS HERE ///////////////////
$menu = new Array();
$menu = [ ["Primo", "0", "expandable", ""],
	  ["Secondo", "0.0", "static", ".\/try.htm"],
	  ["Terzo", "0.1", "expandable", ""],
	  ["Quattro", "0.1.0", "static", ".\/try.htm"],
	  ["Cinque", "1", "static", ".\/try.htm"] ];
//Sinossi= label, id, status, link
//status= expandable, static
// This should be the output
//
// + First
// + Fifth
// By cliking on the First link, this should be the result:
//
// - First
//   o Second
//   + Third
// + Fifth
//
// And so on...
function write_menu() {
	var $temp = "";
	//Converte da sringa a array, con delimitatore il punto
	$open_str = document.location.search;
	$open_str = $open_str.substr(1);
	$open = $open_str.split(".");
	//Scrive tutti le voci del menu contenuti nella variabile globale
	//$menu[], che è un array di array
	for(i=0; i < $menu.length; ++i) {
		$voce = new Array();
		$id = new Array();
		$voce = $menu[i];
		$id = $voce[1].split(".");
 
		if ($open.length > 0) {
			if (compare_array($id, $open, 0) && ($id.length <= $open.length)) {
				if($voce[2] == "expandable") {		
					$temp += "<B><A HREF='.\/sx_menu.htm?";
					$href_a = new Array();
					$href_a = $id;
					$href_a.pop();
					$temp += $href_a.join(".");
					$temp += "' TARGET='menu'><IMG
SRC='..\/img\/cmn_menu.contract.gif' WIDTH='11'
HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></B>\n";
				} else {
					$temp += "<I><A HREF='.\/";
					$temp += $voce[3];
					$temp += "' TARGET='main'><IMG SRC='..\/img\/cmn_menu.final.gif'
WIDTH='11' HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></I>\n";
				}
			} elseif ((compare_array($id, $open, 1)) && ($id.length <=
($open.length + 1))) {
				if($voce[2] == "expandable") {		
					$temp += "<B><A HREF='.\/sx_menu.htm?";
					$temp += $voce[1];
					$temp += "' TARGET='menu'><IMG
SRC='..\/img\/cmn_menu.expandable.gif' WIDTH='11'
HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></B>\n";
				} else {
					$temp += "<I><A HREF='.\/";
					$temp += $voce[3];
					$temp += "' TARGET='main'><IMG SRC='..\/img\/cmn_menu.final.gif'
WIDTH='11' HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></I>\n";
				}
			}
		}
		else {
			if ($id.length <= 1) {
				if($voce[2] == "expandable") {		
					$temp += "<B><A HREF='.\/sx_menu.htm?";
					$temp += $voce[1];
					$temp += "' TARGET='menu'><IMG
SRC='..\/img\/cmn_menu.expandable.gif' WIDTH='11'
HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></B>\n";
				} else {
					$temp += "<I><A HREF='.\/";
					$temp += $voce[3];
					$temp += "' TARGET='main'><IMG SRC='..\/img\/cmn_menu.final.gif'
WIDTH='11' HEIGHT='11'>\n\t&nbsp;";
					$temp += $voce[0];
					$temp += "</A></I>\n";
				}
			}
		}
	}
	return $temp;
}
function compare_array($array1, $array2, $meno_n_elementi) {
	var $result = true;
 
	//if ($array2.length < $array1.length)
	//	{var $temp = new Array(); $temp = $array2; $array2 = $array1;
$array1 = $temp;}
 
	for (i=0; (i < ($array1.length - $meno_n_elementi) &&
(($array1.length - $meno_n_elementi) >= 0)); ++i) {
		if ($array1[i] != $array2[i])
			{$result = false;}
	}
	return $result;
}
////////// SCRIPT ENDS HERE /////////////////
// THIS GOES INTO THE BODY OF THE HTML MENU !! 
<SCRIPT>
document.writeln(write_menu());
</SCRIPT>
/////////////////////////
Please, help me!!!
Thank you,
LordHawk

 for(i=0; i < $menu.length; ++i)
La variabile i è globale, per cui nella successiva chiamata alla funzione
compare_array viene modificata. Dovrestri definirla come variabile locale in
ambedue le funzioni.
Maurizio.

Grazie mille!! C'era anche un altro errore, che comunque sono stato in
grado di correggere da solo. Adesso funziona a meraviglia!