// ********************************************************************
// * bestandsnaam : /common/scripts/menu.js
// * functie	: maakt een hierarchische menustructuur.
// * aanroep	: zie documentatie navigatiemenu v0.1.doc
// * auteur	: webteam, BA, AR
// ********************************************************************

// ********************************************************************
// Laden images voor menunavigatie
// ********************************************************************
imageDir = "N:/Maarten/Emerge/site/Images/";
imageOpen = new Image();
imageOpen.src = imageDir + "vingerlinks.gif";
imageClose = new Image();
imageClose.src = imageDir + "vingerrechts.gif";
imageFolderOpen = new Image();
imageFolderOpen.src = imageDir + "vingerlinks.gif";
imageFolderClose = new Image();
imageFolderClose.src = imageDir + "vingerrechts.gif";
imageMail = new Image();
imageMail.src = imageDir + "email.gif";

// ********************************************************************
// Initialiseren variabelen
// ********************************************************************
var lastMenu = "initMenu";
var lastParent = "initParent";
var toggleMode = "block";

// ********************************************************************
// Functie: 	initMenu
// Invoer:	String: menuLevel0
//		String: menuLevel1
//		String: menuLevel2
// Doel: 	Het initialiseren van het menu. Alle pijltjes worden
//		dichtgezet.
//		Als een of meer parameters zijn ingevuld, wordt het
//		betreffende (sub)menu geopend.
// ********************************************************************
function initMenu(menuLevel0, menuLevel1, menuLevel2)
{
	//alert("In initMenu");
	//alert("menuLevel0=" + menuLevel0);
	//alert("menuLevel1=" + menuLevel1);
	//alert("menuLevel2=" + menuLevel2);
	//alert("images.length=" + document.images.length);

	try
	{
		for (i=0; document.images.length; i++)
		{
			if (document.images[i].name.indexOf("Img") > -1)
			{
				document.images[i].src = imageClose.src;
			}

			if (document.images[i].name == "folder")
			{
				document.images[i].src = imageFolderClose.src;
				document.images[i].alt = "Open alle menukeuzes";
			}

			if (document.images[i].name == "mail")
			{
				document.images[i].src = imageMail.src;
			}
		}
	}
	catch (error)
	{
		// Error melding kan genegeerd worden, de melding betreft IMG tags
		// zonder SRC attribute. Deze worden in initMenu gevuld.
	}

	if (menuLevel0)
	{
		result = toggleMenu(menuLevel0);
	}

	if (menuLevel1)
	{
		result = toggleMenu(menuLevel1);
	}

	if (menuLevel2)
	{
		result = toggleMenu(menuLevel2);
	}
}

// ********************************************************************
// Functie: 	toggleMenu
// Invoer: 	String: currMenu
//		String: hrefDefault
//	  	String: hreftContentFrame
// Uitvoer: 	Boolean
// Doel: 	Indien binnen het menu een nieuwe keuze wordt gemaakt,
//		het nieuw gekozen (sub)menu (currMenu) openen of
//		sluiten, afhankelijk van de status.
//		Indien hrefDefault en hrefContentFrame meegegeven zijn,
//		wordt er van pagina geswitched, afhankelijk van openen
//		of sluiten van het menu.
// ********************************************************************
function toggleMenu(currMenu, hrefDefault, hrefContentFrame)
{
	if (document.getElementById)
	{
		//alert("In toggleMenu");
		//alert("currMenu=" + currMenu);
		//alert("hrefDefault=" + hrefDefault);
		//alert("hrefContentFrame=" + hrefContentFrame);
		lastMenu = checkLastMenu(lastParent, lastMenu, currMenu);
		lastParent = checkLastParent(lastParent, currMenu);
		toggleImage(currMenu);
		thisMenu = document.getElementById(currMenu).style;
        	if (thisMenu.display == "block")
		{
			thisMenu.display = "none";
			if (hrefDefault)
			{
				parent.inhoud.location = hrefDefault;
			}
		}
		else
		{
          		thisMenu.display = "block";
			if (hrefContentFrame)
			{
				parent.inhoud.location = hrefContentFrame;
			}
		}
		return false;
	}
	else
	{
		return true;
	}
}

// ********************************************************************
// Functie:	checkLastMenu
// Invoer:	String: lastParent
//		String: lastMenu
//		String: currMenu
// Uitvoer:	String: lastMenu
// Doel: 	Indien binnen het menu een nieuwe keuze wordt gemaakt,
//		reeds geopende (sub)menus sluiten en de oude waarden
//		(lastParent en lastMenu) bewaren.
// ********************************************************************
function checkLastMenu(lastParent, lastMenu, currMenu)
{
	//alert("In checkLastMenu");
	//alert("lastParent in=" + lastParent);
	//alert("lastMenu in=" + lastMenu);
	//alert("currMenu in=" + currMenu);

	// Check eerste aanroep (lastMenu = 'initMenu')
	if (lastMenu == "initMenu")
	{
		return currMenu;
	}

	// Check laatst gekozen Menu tov current Menu
	if (lastMenu == currMenu)
	{
		return lastMenu;
	}

	// Check of geen andere tree is gekozen.
	// Indien een andere tree is gekozen, worden
	// de vorige tree en de onderliggende
	// subtree(s) gesloten.
	//
	if (currMenu.indexOf(lastParent) == -1)
	{
		hideTree(lastParent);
		return currMenu;
	}

	// We zitten nog in dezelfde tree.
	// Bepalen van de navigatie in de tree:
	// up  = hoger submenu gekozen.
	// new = nieuw submenu gekozen.
	//
	if (lastMenu.indexOf(currMenu) > -1)
	{
		// Een hoger gelegen subtree is gekozen, alle subtrees
		// sluiten, behalve het gekozen menu.
		//
		hideSubTrees(currMenu, "up");
		return currMenu;
	}

	if (currMenu.indexOf(lastMenu) == -1)
	{
		// Een andere subtree is gekozen, alle geopende subtrees
		// binnen de tree sluiten.
		//
		hideSubTrees(currMenu, "new");
		return currMenu;
	}
	else
	{
		return currMenu;
	}
}

// ********************************************************************
// Functie:	checkLastParent
// Invoer:	String: lastParent
//		String: currMenu
// Uitvoer:	String: lastParent
// Doel: 	Indien binnen een menu van tree wordt veranderd,
//		de nieuwe tree (currMenu) bewaren.
// ********************************************************************
function checkLastParent(lastParent, currMenu)
{
	//alert("In checkLastParent");
	//alert("lastParent in=" + lastParent);
	//alert("currMenu in=" + currMenu);
	//alert("laatste 6 tekens=" + currMenu.substr(currMenu.length - 6, 6));

	// Bepaal of dit de hoogste parent in de tree is en bewaar deze waarde.
	// Het id van het hoogste niveau eindigt altijd op 'Parent'.
	//
	if (currMenu.substr(currMenu.length - 6, 6) == "Parent")
	{
		lastParent = currMenu;
	}
	return lastParent;
}

// ********************************************************************
// Functie:	hideTree
// Invoer:	String: lastParent
// Doel: 	Indien binnen een menu van tree wordt veranderd,
//		de vorige tree (lastParent) verbergen.
// ********************************************************************
function hideTree(lastParent)
{
	//alert("In hideTree");
	//alert("lastParent=" + lastParent);
	
	// Van tree gewisseld, hele tree wordt gesloten.
	//
	lastParentChilds = document.getElementById(lastParent).childNodes;
	if (lastParentChilds)
	{
		walkChildNodes(lastParentChilds);	
	}

	// Parent wordt zelf ook gesloten.
	//
	thisMenu = document.getElementById(lastParent).style;
	if (thisMenu.display == "block") 
	{
		toggleImage(lastParent);
		thisMenu.display = "none";
	}
}

// ********************************************************************
// Functie:	hideSubTrees
// Invoer:	String: currMenu
//		String: menuState
// Doel: 	Indien binnen een menu van subtree wordt veranderd 
//		(currMenu), het actieve menu verbergen.
// ********************************************************************
function hideSubTrees(currMenu, menuState)
{
	//alert("In hideSubTrees");
	//alert("currMenu=" + currMenu);
	//alert("menuState=" + menuState);
	
	// Binnen tree van subtree gewisseld, laatst actieve subtree en 
	// onderliggende niveaus worden gesloten.
	//
	currMenuParent = getLastActiveParent(currMenu, menuState);
	currMenuChilds = document.getElementById(currMenuParent).childNodes;
	if (currMenuChilds)
	{
		walkChildNodes(currMenuChilds);
	}
}

// ********************************************************************
// Functie:	getLastActiveParent
// Invoer:	String: currMenu
//		String: menuState
// Uitvoer:	String: currMenuParent
// Doel: 	De parent van het gekozen menu (currMenu) wordt
//		bepaald.
// ********************************************************************
function getLastActiveParent(currMenu, menuState)
{
	//alert("In getLastActiveParent");
	//alert("currMenu=" + currMenu);
	//alert("menuState=" + menuState);
	//alert("Parent van " + currMenu + "=" + document.getElementById(currMenu).parentNode.id);

	// Binnen dezelfde tree is er van subtree gewisseld of een
	// hogere subtree in de tree gekozen.
	// De laatst actieve subtree wordt bepaald.
	//
	currMenuParent = document.getElementById(currMenu).parentNode.id;
	if (currMenuParent)
	{
		thisMenuChilds = document.getElementById(currMenuParent).childNodes;
		for (i=0; i < thisMenuChilds.length;i++)
		{
			if ((thisMenuChilds[i].nodeType == 1) &&
			    (thisMenuChilds[i].tagName == "DIV") && 
			    (thisMenuChilds[i].style.display == "block"))
			{
				if (menuState == "up")
				{
					// Alleen de onderliggende subtrees van het gekozen 
					// menu moeten worden gesloten.
					// De subtree zelf wordt door functie toggleMenu 
					// gesloten.
					//
					currMenuParent = thisMenuChilds[i].id;
				}
				else
				{
					// Alle onderliggende subtrees inclusief de subtree 
					// moeten worden gesloten.
					//
					currMenuParent = thisMenuChilds[i].parentNode.id;
				}
				break;
			}
		}
	}
	else
	{
		// Gekozen menu is al het hoogste niveau.
		//
		currMenuParent = currMenu;
	}

	return currMenuParent;
}

// ********************************************************************
// Functie:	walkChildNodes
// Invoer:	Object: thisMenuChilds
// Doel: 	Doorlopen van alle zichtbare 'child' DIVisions en 
//		verbergen van de inhoud.
// ********************************************************************
function walkChildNodes(thisMenuChilds)
{
	//alert("In walkChildNodes");
	//alert("thisMenuChilds.length=" + thisMenuChilds.length);

	for (i=0; i < thisMenuChilds.length;i++)
	{
		if ((thisMenuChilds[i].nodeType == 1) &&
		    (thisMenuChilds[i].tagName == "DIV") && 
		    (thisMenuChilds[i].style.display == "block"))
		{
			// Indien een DIV tag gevonden wordt en
			// het menu is zichtbaar, dan
			// wordt het menu onzichtbaar gemaakt
			toggleImage(thisMenuChilds[i].id);
			thisMenuChilds[i].style.display = "none";

       			if (thisMenuChilds[i].childNodes.length > 0)
			{
       	 	 		walkChildNodes(thisMenuChilds[i].childNodes);
			}
		}
	}
}

// ********************************************************************
// Functie:	toggleAll
// Doel: 	Doorlopen van alle DIVisions en tonen of verbergen
//		van de inhoud. Tevens worden alle pijltjes open of
//		dicht gezet.
// ********************************************************************
function toggleAll()
{
	//alert("In toggleAll");
	thisDocument = document.all;

	for (i=0; i < thisDocument.length;i++)
	{
		if ((thisDocument[i].nodeType == 1) &&
		    (thisDocument[i].tagName == "DIV") &&
                    (thisDocument[i].id.indexOf("Parent") > -1)) 
		{
			// Indien een DIV tag gevonden wordt en
			// het is een DIV die een menublok omsluit
			// wordt het menublok (on)zichtbaar gemaakt
			// en de pijl dicht of open gezet.
			imageName = document.images[thisDocument[i].id + "Img"];
			if (toggleMode == "block")
			{
				imageName.src = imageOpen.src;
			}
			else
			{
				imageName.src = imageClose.src;
			}
			thisMenu = document.getElementById(thisDocument[i].id).style;
			thisMenu.display = toggleMode;
		}
	}

	imageName = document.images["folder"];
	if (toggleMode == "block")
	{
		toggleMode = "none";
		imageName.src = imageFolderOpen.src;
		imageName.alt = "Sluit alle menukeuzes";
	}
	else
	{
		toggleMode = "block";
		imageName.src = imageFolderClose.src;
		imageName.alt = "Open alle menukeuzes";
	}

	lastMenu = "initMenu";
	lastParent = "initParent";
}

// ********************************************************************
// Functie:	toggleImage
// Invoer:	String: menuName
// Doel: 	Indien van menu geswitched wordt, wordt de pijl
//        	dicht getoond (dichtklappen) of de pijl open (openen).
// ********************************************************************
function toggleImage(menuName)
{
	//alert("In toggleImage");
	//alert("menuName=" + menuName);
	imageName = document.images[menuName + "Img"];

	if (imageName)
	{
		if (imageName.src == imageOpen.src)
		{
			imageName.src = imageClose.src;
		}
		else
		{
			imageName.src = imageOpen.src;
		}
	}
}

