/******************************************************\
*						*
*	(c) 2005 Wouter van der Harg			*
*						*
*	Mozilla 1.0 / MSIE 5.0 (PC) compatible		*
*	XML Loader uses XPath			*
*	Adds DOM Menu Items			*
*						*
*	contact:	wouter.vanderharg@getronics.com	*
*						*
* -------------------------------------------------------------------------- *
*		Getronics PinkRoccade 		*
\******************************************************/

function getHTTPObject()
{
	/*	This function gets the XML HTTP object	*/
	var xmlhttpobj;

	if (window.XMLHttpRequest)							// Native XMLHttpRequest object
	{
		xmlhttpobj = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)						// Microsoft ActiveX (IE/Windows) object
	{
		var msxmls = new Array(
			'Msxml2.XMLHTTP.7.0',
			'Msxml2.XMLHTTP.6.0',
			'Msxml2.XMLHTTP.5.0',
			'Msxml2.XMLHTTP.4.0',
			'Msxml2.XMLHTTP.3.0',
			'Msxml2.XMLHTTP',
			'Microsoft.XMLHTTP'
		);
		for (var i = 0; i < msxmls.length; i++)			// Use the most recent supported version of XMLHTTP
		{
			try
			{
				return new ActiveXObject(msxmls[i]);
			}
			catch (e) {}								// This object is not supported in the browser
		}
		return null;									// Browser does not support on-the-fly document loading.
	}
	return xmlhttpobj;
}


function doRequest(xmlObject, url)
{
	xmlObject.open("GET", url, true);
	xmlObject.onreadystatechange = function()
	{
		switch (xmlObject.readyState)
		{
			case 0	:
						// FireFox starts here
						/*
							Object is not initialized
						*/
						break;
			case 1	:
						/*
							Loading object is loading data
						*/
						break;
			case 2	:
						/*
							Loaded object has loaded data
						*/
						break;
			case 3	:
						// MSIE starts here
						// FireFox gives data result here
						/*
							Data from object can be worked with
						*/
						break;
			case 4	:
						// MSIE gives data result here
						/*
							Object completely initialized
						*/
						/*
							Note that this function is called from an function that is already finished.
							Returning a value will not result in returning the value to the calling function.
							So here you should handle the data.
							Putting it into a global variable will have no result,
							since you do not know when the variable contains the updated value.
						*/
						hanleXMLCode(xmlHTTP);
						break;
		}
	}
	xmlObject.send(null);
}


function hanleXMLCode(xmlHTTP)
{
	var xmlResponse = xmlHTTP.responseXML;
	if(xmlResponse!=null)
	{
		if(xmlHTTP.responseXML.childNodes.length == 0)						// DOM object found.
		{
			xmlResponse.loadXML(xmlHTTP.responseText);						// Load XML code
		}                   
		var errorNode = xmlResponse.getElementsByTagName("error");
		if(errorNode!=null && errorNode.length>0)							// Error occurred:
		{
			window.statusbar.text=errorNode.nodeValue;
		}
		else																// XML loaded
		{   
			var kruimelpad = document.getElementById('crumbtrail'); 
			var laatsteKruimel = document.getElementById('actieveNode');
			var kruimels = new Array;
			if (kruimelpad!=null && laatsteKruimel!=null)
			{
				kruimels = getKruimelPad(kruimelpad, laatsteKruimel);
			}
			var xmlKruimelNode = getKruimelNode(kruimels);

			var rootitem = xmlResponse.documentElement.selectNodes("//navigatie/item[@titel='Home']/item[@weergeven='true']")
			var htmlNode = document.getElementById("secondaryNav");										// menu root

			if (htmlNode!=null && rootitem.length>0)
			{
				addSubMenus(htmlNode, rootitem, xmlKruimelNode);
				activateMenu(htmlNode);
			}
		}
	}
}


function getMenuTitle(node)
{
	// Haal titel als deze getoond mag worden

	if(node.getAttribute('weergeven')=="true")
	{
		return node.getAttribute('titel');
	}
	else
	{
		return false;
	}
}


function getMenuLink(node)
{
	// Haal link als deze getoond mag worden

	if(node.getAttribute('weergeven')=="true")
	{
		return node.getAttribute('path');
	}
	else
	{
		return false;
	}
}

function addListItem(titel, link, submenu, classes, id)
{
	if (classes != "")
		classes = " class=\""+classes+"\"";
	if (id != "")
		id = " id=\""+id+"\"";

	if (link !="" && titel !="")
		return "<li"+classes+id+"><a href=\""+link+"\" title=\"Naar de pagina "+titel+"\">"+titel+"&nbsp;</a>"+submenu+"</li>";
	else
		return "<li"+classes+id+">"+submenu+"</li>";
}

function getSubMenus(node, ClassName, xmlKruimelNode, xmlPath)
{
	var submenuItems = node.selectNodes("item[@weergeven='true']");
	var aantalSubmenuItems = submenuItems.length;
	var titel = getMenuTitle(node);
	var link = getMenuLink(node);
	var output = "";
	var submenu = false;

	if (titel)																	// Voeg submenu's toe als deze getoond mogen worden
	{
		xmlPath += "/item[@titel='"+titel+"']";
		if (xmlKruimelNode.substr(0,xmlPath.length) == xmlPath)
		{
			output = "<a class=\"active\" href=\""+link+"\" title=\"Naar de pagina "+titel+"\">"+titel+"&nbsp;</a>";
		}
		else
		{
		    if (aantalSubmenuItems > 0) {
		           output = "<a class=\"subMenu\" href=\""+link+"\" title=\"Naar de pagina "+titel+"\">"+titel+"&nbsp;</a>";
		    } else {
	                           output = "<a href=\""+link+"\" title=\"Naar de pagina "+titel+"\">"+titel+"&nbsp;</a>";
		    }
		}

		if (aantalSubmenuItems>0)												// Node bevat submenu's die getoond mogen worden
		{
			if (xmlKruimelNode.substr(0,xmlPath.length) != xmlPath && (
				xmlPath.substr(0,xmlKruimelNode.length) != xmlKruimelNode ||
				xmlPath.substr(xmlKruimelNode.length).lastIndexOf("/") == xmlPath.substr(xmlKruimelNode.length).indexOf("/") ))
			{
				output += "<ul class=\"menu\">";
			}
			else
			{
				output += "<ul>";
			}
			for (var i=0; i<aantalSubmenuItems; i++)
			{
				submenu = getSubMenus(submenuItems[i], ClassName, xmlKruimelNode, xmlPath);				// Haal submenu's
				if (submenu)													// Submenu's bestaan en mogen worden getoond.
				{
					TempPath = xmlPath+"/item[@titel='"+getMenuTitle(submenuItems[i])+"']";

					if (xmlKruimelNode.substr(0,TempPath.length) != TempPath &&
						( TempPath.substr(xmlKruimelNode.length).lastIndexOf("/") == 
						  TempPath.substr(xmlKruimelNode.length).indexOf("/") ||
						TempPath.substr(0, xmlKruimelNode.length) != xmlKruimelNode))
					{
						output += addListItem("", "", submenu, ClassName, "");
					}
					else
					{
						output += addListItem("", "", submenu, "", "");
					}
					submenu = false;
				}
			}
			output += "</ul>";
		}

		return output;
	}

	return false;
}


function addSubMenu(htmlNode, addNode, xmlKruimelNode, xmlPath)
{
	var submenuItems = addNode.selectNodes("item[@weergeven='true']");
	var titel = getMenuTitle(addNode);
	var htmlSubmenuItems = htmlNode.getElementsByTagName("li");
	var ClassName = 'DOM_menu';
	var submenu = false;

	if(titel)																	// De titel van het sitemap item
	{
		for (var i=0; i<htmlSubmenuItems.length; i++)							// Alle submenu's van de opgegeven node
		{
			var hyperlink = htmlSubmenuItems[i].getElementsByTagName('a')[0];	// De eerste hyperlink
			if (hyperlink.innerHTML==titel)										// De linktekst is gelijk aan de titel van het sitemap item
			{
				TempPath = xmlPath+"/item[@titel='"+titel+"']";
				if (xmlKruimelNode.substr(0,TempPath.length) != TempPath)
				{
					htmlSubmenuItems[i].className = ClassName;
				}
				submenu = getSubMenus(addNode, ClassName, xmlKruimelNode, xmlPath);
				if (submenu)
				{
					htmlSubmenuItems[i].innerHTML = htmlSubmenuItems[i].innerHTML.substring(0, htmlSubmenuItems[i].innerHTML.indexOf(">"))+submenu.substr(submenu.indexOf(">"));
				}
				break;
			}
		}
	}
}


function xmlParserCheck()
{
	if (window.ActiveXObject)
	{
		return true;
	}
	else if (document.implementation.hasFeature("XPath", "3.0"))
	{
		return true;
	}
	return false;
}


function addSubMenus(htmlNode, addNode, xmlKruimelNode)
{
	if (xmlParserCheck())
	{
		for (var i=0; i<addNode.length; i++ )
		{
			xmlPath = xmlKruimelNode.substr(0, xmlKruimelNode.indexOf("]")+1);
			addSubMenu(htmlNode, addNode[i], xmlKruimelNode, xmlPath);
		}
	}
}


function getKruimelPad(crumbtrail, lastcrumb)
{
	path = crumbtrail.getElementsByTagName("li");
	kruimels=new Array;
	for (i=0; i<path.length; i++)
	{
		kruimels[i] = path[i].getElementsByTagName('a')[0].innerHTML;
	}
	kruimels[kruimels.length] = lastcrumb.innerHTML;
	
	return kruimels;
}


function getKruimelNode(kruimels)
{
	var xmlNodePath = "//navigatie";
	for (i=0; i<kruimels.length; i++)
	{
		xmlNodePath += "/item[@titel='"+kruimels[i]+"']";
	}
	return xmlNodePath;
}