/**************************************
	*	NEW DROPDOWN-MENU	*
	
	author: sara labanchi * interact
	start date: 26-01-06
	end date:	01-02-06
	file: menu.js
	className: SRMenu
**************************************/

/**************************************
	*		DESCRIPTION		*
	questo menu è stato creato in js
	per il sito camera dei deputati
	e presuppone l'esistenza di 
	specifiche classi ed id
/*************************************/
//	'#	SNIFFING ***************************************************************

//	'# variabili globali per la determinazione della piattaforma
var SOWIN = (navigator.userAgent.toLowerCase().indexOf("win") > -1) ? 1 : 0; 
var SOMAC = (navigator.userAgent.toLowerCase().indexOf("mac") > -1) ? 1 : 0; 
var SOLIN = (navigator.userAgent.toLowerCase().indexOf("linux") > -1) ? 1 : 0;
	
//	'# variabili globali per la determinazione del browser
//	'# OPERA
var isOP = ((ind1 = navigator.userAgent.indexOf("Opera")) > -1) ? 1 : 0; 
//	'# INTERNETEXPLORER
var isIE = ((ind2 = navigator.appVersion.indexOf("MSIE")) > -1 && !isOP) ? 1 : 0; 
//	'# MOZILLA	CON VERSIONE
var vers = (navigator.userAgent.indexOf("Firefox/") + 8)
vers	= navigator.userAgent.substring( vers )
vers    = vers.replace(/\./gi, '');
var isMOZ5	= (navigator.userAgent.indexOf("Firefox")>-1 && vers >1500) ? 1 : 0; 
var isMOZ	= ( navigator.userAgent.indexOf("Firefox")>-1 && !isMOZ5) ? 1 : 0;
//	'# NETSCAPE
var isNN = (navigator.appName.indexOf("Netscape")>-1 && !isMOZ && !isMOZ5) ? 1 : 0; 
//	'# OTHERS
var isOT = ( !isOP && !isIE && !isMOZ5 && !isMOZ && !isNN)? 1: 0;

//	'# test browser:
//  alert( 'Opera: ' + isOP + ' IE: ' + isIE + ' MOZ5: ' + isMOZ5+ ' MOZ: '  + isMOZ + ' NN: ' + isNN + ' ot ' + isOT);
//	'# test platform
//	alert( ' SOWIN: ' + SOWIN + ' SOMAC: ' + SOMAC + ' SOLIN: ' + SOLIN );
//	'# ENDSNIFFING **************************************************************

var	DEBUG = false;
var toDebug;
//	'# elemento attivo
var Active = null;
//	'# preservo l'elemento attivo: MOUSEBUG MOZ
var PreserveActive = null;
//	'# variabile per gestire la posizione della bandiera
var ActiveLeft = "0px";
//	'# variabile per gestire la chiusura della bandiera
var KeepAlive = false;
//	'# forzo la chiusura per il MOUSEBUG moz
var CloseTimeOut;
//	'# variabile per gestire l'elemento classe Active
var ActiveClassName;

//	'# OVER SELECT IE SOLUTION
var IFrameElement;
var originalHTML;
var oneTimeIFrame = true;
//	'# FINE OVER SELECT IE SOLUTION
var windowWidth;
//	'# timer per la chiusura bandiera
var MenuTimeOut;
var outEvent;
var Body;
//	'# boolean per gestire la visualizzazione della bandiera
var Visible = false;
//	'# variabili per non catchare il mouseout se la bandiera è già aperta:
var ChildOver = false;
var ActiveElement;
//	'# TORESTORE:
//	document.write('<link rel="stylesheet" media="screen" type="text/css" href="/css/cssmenuJS.css" />');
//	'# su Opera funziona l'apertura solo con il css
if( isOP ) document.write('<link rel="stylesheet" media="screen" type="text/css" href="/css/cssmenuJS.css" />');

//	'# button class
var SRButton = function ( button, dx )
{
	var ndUL;
	var children;
	var limit;
	//	'# distinguo il mouse over sull'elemento del menu e sui singoli item

	button.onmouseover = SRButton_MOZOnMouseOver;
	button.onmouseout = SRButton_MOZOnMouseOut;
	if( button.getElementsByTagName('UL') != null || button.getElementsByTagName('UL') != 'undefined' )
	{
			ndUL = button.getElementsByTagName('UL');	
			ndUL = ndUL[0];
			//	'# prelevo tutti i LI:
			children = ndUL.getElementsByTagName('LI');
			limit = children.length;
			for( var i=0; i<limit;i++ )
			{
				children[i].onmouseover = Child_MOZOnMouseOver;
				children[i].onmouseout = Child_MOZOnMouseOut;
			}
			
			
	}
		
	
}
function Child_MOZOnMouseOver()
{
	
	KeepAlive = true;
	if( DEBUG )toDebug.innerHTML += '	-----	Child_MOZOnMouseOver ------	<BR>';
}
function Child_MOZOnMouseOut()
{
	
	KeepAlive = false;
	if( DEBUG )toDebug.innerHTML += '	-----	Child_MOZOnMouseOut	------	<BR>';
}

//	'# menu class
//	'# parametri costruttore: - id html del menu
var SRMenu = function( idElement )
{
	
	//	'# su IE MAC il menu deve essere statico
	if( SOMAC && isIE ) 
	{
		return;
	}
	
	
	//	'# properties
	windowWidth = document.body.offsetWidth;
	
	toDebug = document.getElementById('toDebug');
	//	'# TODEBUG
	if(DEBUG){
		toDebug = document.getElementById('toDebug');
	toDebug.innerHTML += ' ----------- ' + windowWidth + '---';	
		toDebug.innerHTML += '<BR> --------------SRMENU------------ ' ;
	}
	//	##########

	
	//	'# elemento con l'hover
	this.Hover	= null;
	
	//	'# oggetto menu con l'id passato al costruttore:
	this.Menu = document.getElementById( idElement );
	
	//	'# eventi
	this.OnError = null;
	//	'# inizializzo i button
	this.initButtons();
	
}

SRMenu.prototype.initButtons = function ()
{
	
	if(DEBUG) toDebug.innerHTML += '<BR> --------------INIT BUTTONS------------ ' ;
	
	Body = document.body;
	Body.onclick = Body_OnClick;
	//	'# elementi di primoLivello
	var buttons		= this.Menu.childNodes;
	var limit 		= buttons.length;
	for(var i=0;i<limit;i++)
	{
		//	'# impedisco a mozilla di leggere gli oggetti di testo
		if( buttons[i].nodeName != "#text" )
		{
			ndOnMouse = buttons[i].getElementsByTagName('UL') ;
			/*	se il browser è IE gestisco la visualizzazione sul onmouseleave in modo
				da utilizzare la funzione di timer per la chiusura del menu che fa riferimento
				alla variabile KeepAlive
			*/
			if(isIE)
			{
				//	'# handler onclick sul body
				
	
				buttons[i].onmouseleave = SRButton_IEOnMouseOut;
				buttons[i].onmouseover = SRButton_OnMouseOver;
				//	'# IE OVER SELECT
				buttons[i].onresize = IFrameElement_OnResize;

			}else{
				
				
				
				//	'# gestisco il mouseover per l'apertura della bandiera a dx o a sx - ma non su safari e camino: 
				if(isMOZ5 || isMOZ || isNN  || !isOT )
				{
					
					buttons[i] = new SRButton( buttons[i] );
					
				}

			
			}
			

		}
		//	'# in opera se sotto la bandiera c'è una div vuota (compresa, ad esempio, quella per il
		//	'# float clear il menu non funziona...per cui aggiungo uno spazio in ogni div della pagina.
		if( isOP )
		{
			var test = document.getElementsByTagName( 'div' );
			var limit = test.length
			for(var i=0; i<limit; i++)
			{
				if( i != 4 )
				{
					if( i == 6 ) test[i].setAttribute("style", "font-size:0.1px");
					
					test[i].innerHTML += '&nbsp;';	
				}
			}
		}
		
	}

}
//	'# alla resize azzero le left & right delle bandiere

function Body_OnClick()
{
	if(Active)
	{
		if( isIE )
		{
			HideMenu();
		}else{
			MenuTimeOut = setTimeout("RealOut()", 200);
		}
	}
}

function SRButton_MOZOnMouseOut()
{
	
	KeepAlive = false;
	if( DEBUG )toDebug.innerHTML += ' SRButton_MOZOnMouseOut<br>'; 
	//	'# con il timeout rilevo se effettivamente il mouse out ha causato
	//	'# la chiusura della bandiera o se è solo un passaggio tra un elemento e un altro
	//ActiveElement = this;
	MenuTimeOut = setTimeout("RealOut()", 200);
}

function RealOut( )
{
	
	//	'# ChildOVer è gestito dal mouse over e out sugli item
	//	'# per cui se dopo tot tempo dal mouse out sull'elemento principale
	//	'# risulta ancora falso, vuol dire che la bandiera è stata chiusa e
	//	'# posso pulire tutte le variabili
	if( !KeepAlive   ) 
	{
		
		Active.parentNode.className = ActiveClassName;
		//	'# pulisco tutte le variabili
		Active.style.left = null;
		Active.style.right = null; 
		Active.style.display = 'none';
		Active = null;
		Visible = false;
	}
	clearTimeout( MenuTimeOut ); 
}
function SRButton_MOZOnMouseOver()
{
		
		if( DEBUG )toDebug.innerHTML += 'KeepAlive '  + KeepAlive +'<BR>';
		if( DEBUG )toDebug.innerHTML += 'Active '  + Active +'<BR>';
		//	'# se keepalive vuol dire che un mouse over già è stato effettuato
		if( KeepAlive )
		{
			return;
		}
		KeepAlive = true;
		//	'# nel passaggio tra una prima voce ed un'altra l'active rimane attivo
		if( Active )
		{
			Active.parentNode.className = ActiveClassName;
			//	'# pulisco tutte le variabili
			Active.style.left = null;
			Active.style.right = null; 
			Active.style.display = 'none';
			Active = null;
		}
		//	'# conservo l'informazione della visualizzazione bandiera
		Visible = true;
		//	'# rilevo la dimensione del button
		var buttonWidth	= this.offsetWidth;
		//	'# rilevo il margine sx del button
		var buttonLeft  = this.offsetLeft;
		var buttonRight	= buttonLeft + buttonWidth;
		var originalLeft;
		if( this.getElementsByTagName('UL') != null || this.getElementsByTagName('UL') != 'undefined' || Active == null)
		{
			//toDebug.innerHTML += "this.getElementsByTagName('UL') != null || this.getElementsByTagName('UL') != 'undefined' <br>"
			ndUL = this.getElementsByTagName('UL');	
		}else{
			//toDebug.innerHTML += 'return<br>';
			return;
		}
		//	'# rendo graficamente l'elemento attivo
		ActiveClassName	= this.className;
		if(this.className.indexOf('Active') < 0)
		this.className += 'Active';
		
		//	'# conservo l'innerHTML dell'active per controllare al mouseout se l'elemento è lo stesso
		Active = ndUL[0];
		Active.style.display = 'block';
		
		//	'# mi conservo la left originaria
		originalLeft = Active.style.left;
		//	'# controllo che la posizione dx del button abbia un margine
		//	'# rispetto alla dimensione del video maggiore di 350px		
		if ( (windowWidth - buttonRight) < 350 )
		{
			
			//	'# controllo che il contenuto non scompaia a sx...in tal caso si apre come viene!
			if( buttonLeft > 5 )
			{
				//	'# il right considera il margine dx della window come 0
				Active.style.right = ((windowWidth)- (buttonRight)) + 'px';
				var testo = ((windowWidth)- buttonRight);
			}
		}else{
			Active.style.left = originalLeft + 'px';
		}
		
		
		
		
}

function IFrameElement_OnResize()
{
	if(DEBUG) toDebug.innerHTML += '<BR> --------------ON RESIZE------------ ' ;
	//	'# se viene effettuato il resize a bandiera aperta cancello
	//	'# l'iframe per il BUG OVER SELECT di IE:
	if( Active != null && document.getElementById( 'RFrameElement' ) != null)
	{
		SelectOver(false);
	
	}
}
function SRButton_OnMouseOver()
{
		if(DEBUG)toDebug.innerHTML += '<BR> --------------SRButton_OnMouseOver------------ ' ;
		if( Active != null )
		{
			HideMenu();
		}
		var ndUL;
		
	
		//	'# se esistente prendo il secondo livello
		//	'# per evitare vada in errore se un li non ha sottovoci...
		if( this.getElementsByTagName('UL') != null || this.getElementsByTagName('UL') != 'undefined' )
		{
			ndUL = this.getElementsByTagName('UL');	
		}else{
			return;
		}
		
		//	'# rendo graficamente l'elemento attivo
		//	'# TODO: regular expression
		ActiveClassName	= this.className;
		if(this.className.indexOf('Active') < 0)
			this.className += 'Active';
		if(DEBUG)toDebug.innerHTML += '<BR> <<<<<<<<<<<<<< ' + this.className;
		
		Active = ndUL[0];
		Active.style.display = "block";
	
		var newLeft = this.offsetLeft;
		
		/*	calcolo per definire se l'elemento aperto va oltre il margini dx
			del monitor in tal caso prendo in cosiderazione il margine destro del padre	
			non più il sinistro 
		*/
		var widthLeft = Active.offsetWidth + Active.offsetLeft ;
		var windowWidth = document.body.offsetWidth;
		
		if( widthLeft > windowWidth )
		{
	
			newLeft = (this.offsetLeft + this.offsetWidth) - Active.offsetWidth;
		}
		//	in IE è più 5

		
		if(DEBUG) toDebug.innerHTML += '<BR> --------------if(isIE ) ------------ ' ;			
		newLeft+=5;

		Active.style.left  = newLeft + 'px';
		//	'# OVER SELECT IE BUG
		if( oneTimeIFrame )
		{
			if(DEBUG)toDebug.innerHTML += '<BR> --------------if( oneTimeIFrame )------------ ' ;
			//	'# pulisco la variabile original per refreshare sempre il contenuto della bandiera
			originalHTML = '';
			//	'# chiamata alla funzione SelectOver
			SelectOver(true);
		}
}

function HideMenu()
{		
	if(DEBUG)toDebug.innerHTML += '<BR> --------------HideMenu()------------ ' ;
	//	'# la variabile KeepAlive va a true se il mouse si trova su una voce del menu...
	if(!KeepAlive)
	{
		if( Active != null )
		{
			//	'# riassegno all'elemento padre la classe originaria, prima dell'Active
			Active.parentElement.className = ActiveClassName;
			if(DEBUG)toDebug.innerHTML += '<BR> --------------if( !KeepAlive)------------ ' ;
			//	'# riporto la bandiera nella sua posizione originaria:
			Active.style.left = ActiveLeft;
			Active.style.display = "none";
			Active = null;
			KeepAlive = false;
			clearTimeout(MenuTimeOut);
		}
	}
}
function SRButton_IEOnMouseOut()
{	
		if(DEBUG)toDebug.innerHTML += '<BR> --------------SRButton_IEOnMouseOut------------ <br><br>' ;
		//	'# conservo il valore del margin left
		ActiveLeft = this.style.left ;
		//	'# Select Over
		SelectOver(false);
		
		
		MenuTimeOut = setTimeout("HideMenu()", 200)
}
function SRButton_OnMouseOut()
{
	if(DEBUG)toDebug.innerHTML += '<BR> --------------SRButton_OnMouseOut------------ ' ;

	Active.style.left = this.style.left ;
	Active.style.display = "none";
	Active = null;
}
//	'# funzione per la gestione dell'innerHTML di Active -- workaround SELECT OVER
function SelectOver(toWrite)
{
		//	'# controllo prima che l'active non sia null
		if( Active != null )
		{
			if(toWrite)
			{
				
				if(DEBUG)toDebug.innerHTML += '<BR> --------------TO WRITE TRUE------------ ' ;
				originalHTML = Active.innerHTML;
				Active.innerHTML = '<IFRAME id="RFrameElement" style="z-index:-1;position:absolute;display:none;width:' + Active.offsetWidth+ 'px;height:' + Active.offsetHeight + 'px;display:inline;" frameborder=1 scrolling=no marginwidth=0 src="" marginheight=0></IFRAME>';
				Active.innerHTML += originalHTML;
				oneTimeIFrame = false;
			}
			else
			{
				if(DEBUG)toDebug.innerHTML += '<BR> --------------TO WRITE FALSE------------ ' ;
				Active.innerHTML = originalHTML ;
				oneTimeIFrame = true;
	
			}
		}
	
}


