// JavaScript Document

/*  Funzioni utilizzate al caricamento della pagina per integrare i fogli di stile.
	
	1. garantiscono che le aree a comparsa (div con classe "area_nascosta") appaiano in primo piano (e non sotto altre aree)
	2. permettono anche a IExplorer (che non segue pienamente le specifiche CSS) di avere CSS per ":hover" su tag diversi da "a"
	   (si realizza implementando una funzione che all'onmouseover e onmouseout sul tag aggiunge e rimuove dinamicamente
		la classe ".over" al tag, e nei CSS si gestiscono entrambi i casi: "tag:hover, tag.over { ...stile... }" )
*/

//  ALL'ONLOAD DELLA PAGINA: **************************

addEvent(window,'onload', inizializzaCSS);

//*****************************************************

function addEvent(obj, evt, func) { 
	// AGGIUNGE una funzione all'event-handler di un oggetto (es. aggiunge funzione a window.onload)
	// anzichč sovrascriverlo (e permette l'uso di "this" nella funzione)
	//es. addEvent(window,'onload', inizializzaCSS);
	  if(obj[evt]) { 
		obj[evt]=function(f,g){ 
		   return function(){ 
			 f.apply(this,arguments); 
			 return g.apply(this,arguments); 
		   }; 
		}(func, obj[evt]); 
	  } else obj[evt]=func; 
} 


function inizializzaCSS(){
	//chiama una funzione recursiva che scandaglia tutti i nodi della pagina individuando i tag con determinati stili
	sistemaCSSinSottonodi(document.body);
	
}


function sistemaCSSinSottonodi(node) {
	/* funzione recursiva che integra i CSS con javascript;
	   cerca gli elementi della pagina con determinati stili
	   e associa agli event-handler "onmouseover" e "onmouseout" di quegli elementi determinate funzioni	   
	*/	
	var nodoFiglio, nodoPadre;
	if (node.className) {
		//******************************************************************
		if ( node.className.indexOf("mostra_area_nascosta")!=-1 ) {			
			ieHover(node); // per poter anche in IE far apparire agli "area_nascosta" all'onmouseover sui "mostra_area_nascosta"
			primoPiano(node); // e per farli balzare in primo piano		
		}
	}	
	for ( var i = 0; i < node.childNodes.length; i++) { 
		nodoFiglio = node.childNodes[i];			
		sistemaCSSinSottonodi(nodoFiglio); 
	}
}


function ieHover(obj) {
	// per sopperire al bug di IExplorer che non riconosce l'evento .hover al di fuori del tag a,
	// all'onmouseover e onmouseout aggiunge e toglie dinamicamente all'oggetto la classe over (che posso gestire con i CSS)
	if (navigator.appName.indexOf('Microsoft') != -1) {
		addEvent( obj, 'onmouseover', function(){ this.className+=" over"; });
		addEvent( obj, 'onmouseout', function() { this.className=this.className.replace(" over", "") });
	}
}


function primoPiano(obj) {
	// per garantire la visibilitą ai DIV che potrebbero essere nascosti da altri con z-index maggiore,
	// all'onmouseover e onmouseout pone lo z-index ai valori 100 e 1
	// (NB: potrebbe generare problemi con DIV parz.sovrapposti, inizialmente con z-index diversi)
	addEvent( obj, 'onmouseover', function(){
		// trovo tutti i nodi genitori DIV e ne incremento lo z-index (per garantire visibilitą di "area_nascosta")
		var nodoPadre = this;
		while (nodoPadre!=document.body) {
			if (nodoPadre.nodeName == "DIV") { nodoPadre.style.zIndex=100; }			
			nodoPadre = nodoPadre.parentNode;
		}
	});
	addEvent( obj, 'onmouseout', function() {
		// trovo tutti i nodi genitori DIV e ne ripristino lo z-index prima dell'incremento
		var nodoPadre = this;
		while (nodoPadre!=document.body) {
			if (nodoPadre.nodeName == "DIV") { nodoPadre.style.zIndex=1; }
			nodoPadre = nodoPadre.parentNode;
		}
	});
}


