(function(){

	// voceMenu è la classe che viene istanziata PER OGNI <LI> del menù
	var voceMenu = function(list_item,orizzontale,adattaLarghezza){

		var regexp = /^js_open:+[\d]{1,}$/;
		
		// larghezza minima delle voci di primo livello
		var min = 78;
		this.voce = list_item;
		this.classe = this.voce.className;
		
		// se il title della voce ha l'indicazione necessaria per essere una voce che apre il menù
		// istanzio il sottomenù relativo
		if(regexp.test(list_item.title)){
			// SE TROVO IL TITLE CHE INDICA L'APERTURA
			var temp = this.voce.title.split(':');
			this.riferimento = temp[1];
			
			// impostazione larghezza minima delle voci di primo livello
			if(this.voce.clientWidth < min) this.voce.style.width = min+'px';

			// questa parte di codice scorre tutti i nodi successivi al <LI> passato in input alla classe
			// quando trova un title che indica il sottomenù che deve essere aperto
			this.sottomenu = this.voce.nextSibling;

			while (this.sottomenu && !this.sottomenu.title && this.sottomenu.title != 'js_sottomenu:'+this.riferimento){
				this.sottomenu = this.sottomenu.nextSibling;
			}
			// istanzio l'<UL> che contiene il sottomenù
			if(this.sottomenu) this.sottomenu_ul = this.sottomenu.getElementsByTagName('ul')[0] || false;

		} else {
			// SE NON TROVO IL TITLE CHE INDICA L'APERTURA, setto a false le proprietà che altrimenti avrebbero un valore
			this.riferimento = false;
			this.sottomenu = false;
			this.sottomenu_ul = false;
		}

		this.voce.title='';

		// CODICE ESEGUITO SOLO SE VOGLIO INIZIALIZZARE IL MENU' IN ORIZZONTALE
		if(orizzontale){
			// stile per ogni voce del menù
			if(this.voce.parentNode.className =='js_menu') this.voce.style.display='inline';

			// stili solo nel caso in cui il <LI> sia una voce che apre il sottomenù
			if(orizzontale && this.sottomenu_ul){

				// in pratica qui posiziono il sottomenù appena sotto (top) e all'inizio (left) della voce che lo apre (qui con
				// margine a destra di 1 px - modificare in base alla spaziatura data fra le voci di primo livello)
				this.sottomenu_ul.style.left = '-'+(this.voce.offsetWidth+1)+'px';
				this.sottomenu_ul.style.top = this.voce.offsetHeight+'px';
				// larghezza predefinita se si attiva l'opzione della larghezza fissa del sottomenu
				//this.sottomenu_ul.style.width = '300px';

				// dò al sottomenù la larghezza della voce che lo apre
				if(adattaLarghezza) this.sottomenu_ul.style.width = this.voce.offsetWidth+'px';

				// stili definiti a tutte le voci del sottomenù
				// necessarie per la visualizzazione corretta
				var li = this.sottomenu_ul.getElementsByTagName('li');
				var i = 0;
				for ( i = 0 ; i < li.length ; i++){
					li[i].style.display='block';
					li[i].style.width = '100%';
				}
			}
		}


		// CODICE ESEGUITO SOLO SE VOGLIO INIZIALIZZARE IL MENU' IN VERTICALE
		if(!orizzontale){
			// stile per ogni voce del menù
			this.voce.style.width='100%';

			// stili solo nel caso in cui il <LI> sia una voce che apre il sottomenù
			if(this.sottomenu_ul){

				// in pratica qui posiziono il sottomenù alla stessa altezza (top) e alla fine (left) della voce che lo apre
				this.sottomenu_ul.style.right = '-'+this.sottomenu_ul.offsetWidth+'px';
				this.sottomenu_ul.style.top = '-'+this.voce.offsetHeight+'px';
			}
		}

		var _self = this;

		//----------------------------------------------------------------------
		// METODI PER INSERIRE ALL'ONMOUSEOVER DI OGNI <LI> LA FUNZIONE CHE AGGIUNGE LA CLASSE CSS 'hover'
		// tramite la classe hover posso definire i css a piacere
		this.evidenziaOn=function(){
			return _self.voce.className = _self.classe+' hover';
		};

		this.evidenziaOff=function(){
			return _self.voce.className = _self.classe;
		};
		//----------------------------------------------------------------------

		//----------------------------------------------------------------------
		// METODI PER GESTIRE L'APERTURA E LA CHIUSURA DEI SOTTOMENU'
		this.voce.onmouseover=function(){
			if(_self.sottomenu_ul) _self.sottomenu_ul.style.display='block';
			if(_self.voce.className!='primo_livello_corrente_home') _self.evidenziaOn();
		};
		this.voce.onmouseout=function(){
			if(_self.sottomenu_ul) _self.sottomenu_ul.style.display='none';
			if(_self.voce.className!='primo_livello_corrente_home') _self.evidenziaOff();
		};
		if(this.sottomenu){
			_self.sottomenu_ul.onmouseover=function(){
				_self.sottomenu_ul.style.display='block';
				_self.evidenziaOn();
			};
			_self.sottomenu_ul.onmouseout=function(){
				_self.sottomenu_ul.style.display='none';
				_self.evidenziaOff();
			};
		}
		//----------------------------------------------------------------------

		return list_item;

	};


	// INIZIALIZZAZIONE DEL MENU'
	function init_menu(menu_id,orizzontale,adattaLarghezza){

		var li = document.getElementById(menu_id).getElementsByTagName('li');
		var i = 0;
		for ( i = 0 ; i < li.length ; i++){
			// istanzio un oggetto per ogni <li> dentro al menù
			new voceMenu(li[i],orizzontale,adattaLarghezza);
		}
		var ul = document.getElementById(menu_id).getElementsByTagName('ul');
		var i = 0;
		for ( i = 0 ; i < ul.length ; i++){
			// nascondo i sottomenù
			// è necessario farlo in un secondo momento in quanto la classe necessità di "leggere" le dimensioni delle voci
			// se i sottomenù sono "display:none" le dimensioni non sono leggibili
			ul[i].style.display = 'none';
		}
		document.getElementById(menu_id).style.visibility = 'visible';
	}

	// funzione aggiunta all'onload
	if(window.addEventListener){
		window.addEventListener('load',init,true);
	} else {
		window.attachEvent('onload',init);
	}

	// FUNZIONE CON PARAMETRI CHE MODIFICO PER AFERE MENU' ORIZZONTALE O VERTICALE
	function init(){
		//-------------------------------------------------
		// INIZIALIZZAZIONE
		//-------------------------------------------------
		//
		// PARAMETRI PER ISTANZIARE IL MENU'
		//-------------------------------------------------
		// PRIMO PARAMETRO -> stringa contenente l'id del menù
		//-------------------------------------------------
		//
		// PARAMETRI PER L'USO VERTICALE O ORIZZONTALE
		//-------------------------------------------------
		// SECONDO PARAMETRO
		// = true -> il menù sarà orizzontale
		// = false -> il menù sarà verticale
		//
		// TERZO PARAMETRO
		//  avrà influenza sul menù SOLAMENTE se lo usiamo come menù verticale
		// = true -> il sottomenù adatta la larghezza alla voce che lo apre
		//  = false -> il sottomenù mantiene la larghezza definita nel CSS
		//-------------------------------------------------

		init_menu('mio_menu',true,true);		//<-- modifico qui
	}

})();