//file Javascript di appoggio per gestione dei menu
//11/06/2002 Axioma

//aggiungere nei template le variabili per la Rilevazione di Browser
//-> isNN6, isMozilla

var Dom;					//se il browser è compatibile W3C
var currentOpMenuId;		//id del menu di primo livello attualmente aperto
var currentMenuTimeout;		//timeout di menu
var mFrObj;					//riferimento al frame in cui compaiono i menu
var mTgtObj;				//riferimento al frame in cui si aprono i link
var loadable = true;		//se si possono caricare i menu
var loaded = false;			//se la pagina è stata caricata

// I menu funzionano solo se il browser è compatibile W3C
function Initialize()
{
	Dom=(document.getElementById && document.documentElement)? true:false;
	if (Dom)
	{
		currentOpMenuId=null;
		//creazione di un riferimento ai frame usati o alla finestra singola
		mFrObj=(usingFrames)? parent.frames[menuFrame]:window;
		mTgtObj=(usingFrames)? parent.frames[targetFrame]:window;
		loaded=true;
	}
	else
	{
		loadable=false;
	}
}


function menuPopup(menuId, eve)
{	
	var estMenu;
	var rectEstMenu;
	var newPopup;
	var x;
	var y;
	var menuW;
	
	if (!loadable) return;
	if (!loaded) return;
	
	//chiude i menu aperti	
	if (currentOpMenuId)
	{
		if (currentOpMenuId==(menuId+"item"))
		{
			if (currentMenuTimeout)
			{
				clearTimeout(currentMenuTimeout);
			}
		}
		else
		{
			closeMenu(currentOpMenuId);
		}
	}
	
	estMenu = document.getElementById(menuId+"est");
	recEstMenu = getRectCoord(estMenu);
	
	//allineamento dei menu a dx o sotto l'elemento di origine  
	if (isMenuOrizontal)
	{
		y=(usingFrames)?0:recEstMenu.b;
		y+=indentVertOffset;
		x=recEstMenu.l+indentOrizzOffset;
	}
	else
	{
		y=recEstMenu.t+indentVertOffset;
		x=(usingFrames)?0:recEstMenu.r;
		x+=indentOrizzOffset;
	}
	
	//impostazione dell'ampiezza
	if (menuMaxWidth>=0)
	{
		menuW=(menuMaxWidth>0)?menuMaxWidth:(recEstMenu.r-recEstMenu.l);
	}
	else 
	{
		menuW=-1;
	}
	
	//creazione del menu e apertura	
	newPopup=createMenu(menuId,0,menuW);
	showMenu(newPopup,x,y,menuW);	
	currentOpMenuId=newPopup.id;	
}

//ottiene le coordinate dell'elemento su cui si è
function getRectCoord(item)
{
	var topRect=0;
	var leftRect=0;
	var bottRect=0;
	var rightRect=0;
	var toOffsetObj;
	var rect = new rectangle();
	
	toOffsetObj = item;
	while (toOffsetObj)
	{
		topRect += toOffsetObj.offsetTop;
		leftRect += toOffsetObj.offsetLeft;
		if (toOffsetObj.offsetParent == mFrObj.document.body) break;
		//per calcolare la posizione risale con offsetparent nella gerarchia
		toOffsetObj=toOffsetObj.offsetParent;
	}
	bottRect = topRect+item.offsetHeight;
	rightRect = leftRect+item.offsetWidth;
	rect.t=topRect;
	rect.l=leftRect;
	rect.b=bottRect;
	rect.r=rightRect;
	return rect;
}

//prototipo di rettangolo
function rectangle(t,l,b,r)
{
	this.t=t;
	this.l=l;
	this.b=b;
	this.r=r;
}

//crea un menu di nome el, livello indent, larghezza w_width
function createMenu(el, indent, w_width)
{
	var menuName;
	var elMenu;
	var estMenu;
	var menuArray;
	var i=1;
	
	menuName = el+"item";
	elMenu = mFrObj.document.getElementById(menuName);
	estMenu= mFrObj.document.getElementById(el+"est");
	if(elMenu)
	{
			return elMenu;
	}
	elMenu=mFrObj.document.createElement("DIV");
	mFrObj.document.body.appendChild(elMenu);
	elMenu.id=menuName;
	elMenu.style.display="none";
	elMenu.style.zIndex=maxZindex + indent;
	elMenu.style.position="absolute";
	//aggiunta di eventi per far comparire e scomparire i menu
	addEvent(elMenu, "mouseout", onMenuOut);
	addEvent(elMenu, "mouseover", onMenuOver);
	//tabella interna
	var intTable;
	var newTBody;
	var newRow;
	var newSxCol;
	var newCol;
	var newArrCol;
	var newP;
	var newDesc;
	var newImage;
	var Arrow = new Image();
	var SxImage = new Image();
	var Trasp = new Image();
	var newArrow;
	var newTrasp;
	var newSxImage;
	var re_special_chars;
		
	//solo se si vuole mostrare la freccia per i sottomenu
	if (iconHW>0)
	{
		Arrow.Width=iconHW;
		Arrow.Height=iconHW;
		Arrow.src = img+"/dxicona.gif"
	}
	//solo se si usa una immagine a sinistra delle voci	
	if (sximageHW>0)
	{
		SxImage.Width=sximageHW;
		SxImage.Height=sximageHW;
	}
	Trasp.Width=1;
	Trasp.Height=1;
	Trasp.src = img+"/trasp.gif"
	menuArray=eval(el);
	intTable=mFrObj.document.createElement("TABLE");
	elMenu.appendChild(intTable);
	intTable.id=el+"table"
	intTable.cellSpacing=0;
	intTable.cellPadding=0;
	if (w_width>=0) intTable.width=w_width;
	intTable.creator=elMenu;	
	//senza tbody la tabella non funziona
	newTBody=mFrObj.document.createElement("TBODY");
	intTable.appendChild(newTBody);
	newTBody.id=el+"tableI"+indent+"Body";
	newTBody.creator=elMenu;
	
	i=1;
	j=1;
	while (i<=menuArray.length)
	{
		newRow=mFrObj.document.createElement("TR");
		newTBody.appendChild(newRow);
		newRow.id=el+"tableI"+indent+"Row"+j;
		newRow.creator=elMenu;
		//aggiunta di eventi che governano il passaggio del mouse sulle voci
		addEvent(newRow, "mouseover", onVoiceOver)
		addEvent(newRow, "mouseout", onVoiceOut)
		addEvent(newRow, "mousedown", onVoiceClick)
		if (sximageHW>0)
		{	
			newSxCol=mFrObj.document.createElement("TD");
			newRow.appendChild(newSxCol);
			newSxCol.id=el+"tableI"+indent+"ColA"+j;
		    	newSxCol.className=tdClassStyle;
		    	newSxCol.width=sximageHW;
		    	newSxCol.style.borderBottomWidth=0;
		    	newSxCol.style.borderRightWidth=0;
		    	newSxCol.creator=elMenu;
		    	newSxImage=mFrObj.document.createElement("IMG");
			newSxCol.appendChild(newSxImage);
			newSxImage.Width=sximageHW;
			newSxImage.Height=sximageHW;
			newSxImage.src=img+"/"+menuArray[i];
			newSxImage.creator=elMenu;
		}
		newCol=mFrObj.document.createElement("TD");
		newRow.appendChild(newCol);
		newCol.id=el+"tableI"+indent+"ColB"+j;
		newCol.className=tdClassStyle;
		newCol.style.borderBottomWidth=0;
		newCol.creator=elMenu;
		if (iconHW>0)
		{
			newCol.style.borderRightWidth=0;
		}
		if (sximageHW>0)
		{
			newCol.style.borderLeftWidth=0;
		}		
		if (iconHW>0)
		{
			newArrCol=mFrObj.document.createElement("TD");
			newRow.appendChild(newArrCol);
			newArrCol.id=el+"tableI"+indent+"ColC"+j;
			newArrCol.width=iconHW
			newArrCol.className=tdClassStyle;
			newArrCol.style.borderBottomWidth=0;
			newArrCol.style.borderLeftWidth=0;
			newArrCol.creator=elMenu;
		}
		newP=mFrObj.document.createElement("P");
		newCol.appendChild(newP);
		newP.id=el+"textI"+indent+"Row"+j;
		newP.className=linkClassStyle;
		newP.elementLink=menuArray[i+1];
		newP.Target=menuArray[i+2];
		newP.creator=elMenu;
		re_special_chars=/&#224/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"à");
		re_special_chars=/&#232/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"è");
		re_special_chars=/&#233/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"é");
		re_special_chars=/&#236/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"ì");
		re_special_chars=/&#242/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"ò");
		re_special_chars=/&#249/g;
		menuArray[i-1]=menuArray[i-1].replace(re_special_chars,"ù");
		newDesc=mFrObj.document.createTextNode(menuArray[i-1]);
		newP.appendChild(newDesc);
		if (iconHW>0)
		{
			if (menuArray[i+3])
			{
				newArrow=mFrObj.document.createElement("IMG");
				newArrCol.appendChild(newArrow);
				newArrow.id=el+"arrowI"+indent+"R"+j;
				newArrow.src=Arrow.src;
				newArrow.creator=elMenu;		
			}
			else
			{
				newTrasp=mFrObj.document.createElement("IMG");
				newArrCol.appendChild(newTrasp);
				newTrasp.src=Trasp.src;
				
				/*var newSp;
				newSp=mFrObj.document.createTextNode(" ");
				newArrCol.appendChild(newSp);*/
			}
		}
		j++;
		i+=5;
	}
	if (sximageHW>0)
	{
		newSxCol.style.borderBottomWidth='';
	}
	newCol.style.borderBottomWidth='';
	if (iconHW>0)
	{
		newArrCol.style.borderBottomWidth='';
	}
	return elMenu;
}

function showMenu(el, xc, yc, w_width)
{
	var left=0;
	var right;
	el.style.top=yc
	//se sono oltre fuori dalla finestra a dx sposto i menu
	//questa funzione non c'e se non viene impostata una larghezza per le celle
	if (w_width>=0)
	{
		if(mFrObj.pageXOffset)left=mFrObj.pageXOffset;
		else if(mFrObj.document.body.scrollLeft)left=mFrObj.document.body.scrollLeft;
		if(mFrObj.innerWidth)right=left+mFrObj.innerWidth;
		else if(mFrObj.document.body.clientWidth)right=left+mFrObj.document.body.clientWidth;
		
		if (el.style.zIndex>maxZindex)
		{
			if ((xc+w_width)>right)
			{
				//sposto il menu figlio a sx del genitore
				el.style.left=xc-2*w_width+7;
			}
			else
			{
				el.style.left=xc;
			}
		}
		else
		{
			if ((xc+w_width)>right)
			{
				el.style.left=right-w_width;
			}
			else
			{
				el.style.left=xc;
			}
		}
	}
	else
	{
		el.style.left=xc;
	}
	el.style.display=""
}

//nasconde i menu
function hideMenu(elid)
{
	var elMenu;
	
	if (!loadable) return;
	if (!loaded) return;
	
	elMenu = mFrObj.document.getElementById(elid+"item");
	if (elMenu) onMenuOutPar(elMenu);
}

//aggiunge eventi a oggetti e ne ferma la risalita
function addEvent(obj, ev, action)
{
	if (obj.addEventListener)
	{
		obj.addEventListener(ev, action, false)
	}
	else
	{
		eval("obj.on"+ ev + "=" +action)
	}
}

//quando si passa sopra con il mouse su una voce vengono cancellati i timeout
function onMenuOver()
{ 
  if (currentOpMenuId && isChildofCurrentMenu(this)) clearTimeout(currentMenuTimeout);
}

//funzione di appoggio perchè con addeventlistener non posso passare esplicitamente parametri
function onMenuOut()
{
	var p=this;
	onMenuOutPar(p);
}

//funzione che chiude i figli del menu corrente impostando dei timeout
function onMenuOutPar(mnu)
{
 if (currentOpMenuId && isChildofCurrentMenu(mnu))
 {	
	if (currentMenuTimeout) clearTimeout(currentMenuTimeout);
	currentMenuTimeout=setTimeout("closeMenu('"+currentOpMenuId+"');", closeDelay);
 }
}

//funzione che chiude i figli
function closeMenu(idel)
{
	var elMenu;
	
	elMenu = mFrObj.document.getElementById(idel);
	var i=0;
	//finchè esistono figli
	while (elMenu)
	{
		elMenu.style.display="none";
		if (elMenu.toChild) 
		{
			elMenu=elMenu.toChild;		
		}
		else 
		{
			break;
		}		
	}
	if (currentOpMenuId && (currentOpMenuId==idel))
	{
		currentOpMenuId=null;
	}
}

function onVoiceOver()
{
	var idel;
	var menuRadix;
	var levelStr;
	var level
	var rowStr;
	var row;
	var rowCount;
	var i;
	var j;
	var k;
	var l;
	var m;
	var menuArr;
	var childMenu;
	var thisMenu;
	var recItem;
	
	//chiudo i figli del menu quando ci si muove sul menu
	if (this.creator.toChild)
	{
		closeMenu(this.creator.toChild.id);
	}
	changeCol(this,overCol,overScrCol,(isNN6 || isMozilla)?"pointer":"hand");
	idel=this.id
	i=idel.indexOf("table");
	menuRadix=idel.substring(0,i);
	j=idel.indexOf("Row");
	levelStr=idel.substring(i+6,j);
	level=parseInt(levelStr);
	rowStr=idel.substr(j+4);
	row=parseInt(rowStr);
	menuArr=eval(menuRadix);
	l=menuArr[row*5-1];
	rowCount=0;
	m=0; 
		while(m<=(row*5-1))
	{
		if(menuArr[m+4]==1) rowCount++;
		m+=4;
	}	
	//riferimento all'oggetto menu che crea 
	thisMenu=this.creator;
	if(l)
	{
		var newMenuName;
		var menuW;
		newMenuName=menuRadix+"Lv"+rowCount;
		level++;
		recItem=getRectCoord(this);		
		if (menuMaxWidth>=0)
		{
			menuW=(menuMaxWidth>0)?menuMaxWidth:(recItem.r-recItem.l);	
		}
		else 
		{
			menuW=-1;
		}
		childMenu=createMenu(newMenuName, level, menuW);
		showMenu(childMenu,recItem.r-5,recItem.t+5, menuW);
		//assegnazione di un riferimento tra menu padre e menu figlio
		if(thisMenu) thisMenu.toChild=childMenu;
	}
	else
	{
		if (thisMenu && thisMenu.toChild)
		{
			closeMenu(thisMenu.toChild.id);
		}
	}
		
}

//quando ci si sposta da una voce di menu
function onVoiceOut()
{
	changeCol(this,bgCol,bgScr,"auto"); 
}

//cambia il colore di sfondo colchosen, delle scritte colscrchosen, e cursore cursortype all'elemento el
function changeCol(el,colChosen, colScrChosen ,cursorType)
{
	var rowId;
	var radix;
	var colBId;
	var iR;
	var nR;
	var rowNum;
	var ColAId;
	var ColBId;
	var ColCId;
	var ColA;
	var ColB;
	var ColC;
	var ParB;

	rowId=el.id;
	iR=rowId.indexOf("Row");
	radix=rowId.substring(0,iR);
	rowNum=rowId.substr(iR+3);
	if (sximageHW>0)
	{
		colAId=radix+"ColA"+rowNum;
		ColA=mFrObj.document.getElementById(colAId);
		ColA.style.backgroundColor=colChosen;
		ColA.style.cursor=cursorType;
	}
	colBId=radix+"ColB"+rowNum;
	ColB=mFrObj.document.getElementById(colBId);
	ColB.style.backgroundColor=colChosen;
	ColB.style.cursor=cursorType;
	ParB=ColB.firstChild;
	ParB.style.color=colScrChosen;
	if (iconHW>0)
	{
		colCId=radix+"ColC"+rowNum;
		ColC=mFrObj.document.getElementById(colCId);
		ColC.style.backgroundColor=colChosen;
		ColC.style.cursor=cursorType;
	}
}

//window location con link premuto
function onVoiceClick()
{
	var idel=this.id;
	var re;
	var parid;
	var parObj;
	
	re=/table/;
	parid=idel.replace(re,"text");
	parObj=mFrObj.document.getElementById(parid);
      if (parObj.Target.substr(0,1)=="B")
        { window.open(parObj.elementLink); }
      else if (parObj.Target.substr(0,1)=="P")
        { popup_centrata_s(parObj.elementLink, parObj.Target.substr(1,4), parObj.Target.substr(5,4),"Popup"); }
      else
	  { mTgtObj.location.href=parObj.elementLink; }
}

//funzione che identifica se un menu è figlio del menu attualmente aperto
function isChildofCurrentMenu(menu)
{
	var aMenu;
	
	aMenu=document.getElementById(currentOpMenuId);
 
	while (aMenu)
	{
		if(aMenu.id==menu.id) 
		{
			return true;
		}
		aMenu=aMenu.toChild;
	}
	return false;
}
