// javascript XML functions
// created by R. Groenedijk, M. Sgaier

var load_retries = 2;

function hasError(xmlObj)
{ 
	return (xmlObj.getElementsByTagName('parsererror').length > 0)
}
function getError(xmlObj)
{
	var errorMsg = xmlObj.getElementsByTagName('parsererror')[0];
 	return (errorMsg.firstChild.nodeValue);
}

function httpGet(url,nocache)
{
	var attempts = 0;
	var succes = false;
	while (!succes && (attempts < load_retries))
	{
		var xmlHttp = createXmlHttpObject();
		// no cache
		if (nocache) 
			url+=(url.indexOf("?")<0)? "?"+(Math.floor(Math.random()*100000)):"&"+(Math.floor(Math.random()*100000));
		if(xmlHttp)
		{
			//xmlHttp.overrideMimeType('text/xml');
			xmlHttp.open("GET", url, false);
			xmlHttp.send(null);
			if (!hasError(xmlHttp.responseXML))
			{
				succes = true;
				return xmlHttp.responseXML;
			}
		}
		else
		{
			if(document.getElementById("iframeXmlHttp")) document.getElementById("iframeXmlHttp").src=url;
			succes = true;
			return false;			
		}
		attempts++;
		// set timeout?
	}
	if (!succes) throw {message: getError(xmlHttp.responseXML)};
}

function httpPost(url, form, nocache)
{
	var xmlHttp = createXmlHttpObject();
	var data = serializePost(form);
	// no cache
	if (nocache)
		url+=(url.indexOf("?")<0)? "?"+(Math.floor(Math.random()*100000)):"&"+(Math.floor(Math.random()*100000));
	if(xmlHttp)
	{
		xmlHttp.open("POST", url, false)
		xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xmlHttp.send(data);
		return xmlHttp.responseXML;
	}
	else
	{
		url+= ((url.indexOf("?")<0)? "?":"") + data;
		if(document.getElementById("iframeXmlHttp")) document.getElementById("iframeXmlHttp").src=url;
		return false;
	}
}


function serializePost(form)
{	
	var package = new Array();
	for (var i=0; i < form.elements.length; i++) {
		package[package.length] = form.elements[i].name +"="+form.elements[i].value;
	}
	return package.join("&");
}

function createXmlHttpObject()
{
	var xmlHttp = null;
	if (window.XMLHttpRequest)
	{
		xmlHttp = new XMLHttpRequest();  
	}
	else if (window.ActiveXObject) 
	{
		try {
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return xmlHttp;
}


function fillArrayFromXml(xmlfile, method, form)
// deze functie verwacht een 'platte' xmlstructuur met records als hoofdelementen
// EG: 
/*
	<?xml version="1.0" encoding="ISO-8859-1" ?>
	<result>
		<record>
			<id>12</id>
			<title>test</title>
			<descr>bla</descr>
		</record>
		<record>
			<id>14</id>
			<title>test 2</title>
			<descr>etc etc etc</descr>
		</record>
	</result>
	
	
	wordt 
	
	array {
		[0] => {id: 12, title: 'test', descr: 'bla'}
		[1] => {id: 14, title: 'test 2', descr: 'etc etc etc'}
	}
*/
{
	try
	{
		var xmlObj = method == 'post' ? httpPost(xmlfile, form) : httpGet(xmlfile);
	}
	catch (e)
	{
		//alert(e.message);
		window.status = e.message.replace(/\r\n/g,' ');
		return null;
	}
	if (!xmlObj) null;

	var xmlList = xmlObj.getElementsByTagName("record");
	if (!xmlList || (xmlList.length<=0)) return new Array(); // return empty array
	
	// make assoc. array
	var rs = new Array();
	for (var i=0; i<xmlList.length; i++)
	{
		rs[i] = new Object();
		var row = xmlList[i].childNodes;
		for (var col=0; col<row.length; col++)
		{
			var val = (row[col].firstChild) ? row[col].firstChild.nodeValue : null;
			rs[i][row[col].nodeName] = val;
		}
	}
	return rs; 
}


function fillObjectFromXml(xmlfile, method, form)
{
	try
	{
		var xmlObj = method == 'post' ? httpPost(xmlfile, form) : httpGet(xmlfile);
	}
	catch (e)
	{
		//alert(e.message);
		window.status = e.message.replace(/\r\n/g,' ');
		return null;
	}
	
	if (!xmlObj) return null;

	var xmlNode = xmlObj.getElementsByTagName("result")[0];
	if (!xmlNode) return {}; // return empty object

	var rs = convertXML2Object(xmlNode);
	return rs;
}

// maarten testing the hell out of it
function convertXML2Object( xmlNode ) 
{
	var rs = {};
	//1. get attributes
	if (xmlNode.attributes)
	{
		for (var a=0; a<xmlNode.attributes.length; a++)
		{
			rs[xmlNode.attributes[a].name] = xmlNode.attributes[a].value ;
		}
	}
	
	//2. get childs recursively
	if (xmlNode.firstChild && (xmlNode.firstChild.childNodes.length == 0) )
	//3. return node value
	{
		//alert('only child? '+xmlNode.nodeName);
 		rs = xmlNode.firstChild.nodeValue;
	}
	else if (xmlNode.childNodes.length > 0) // is not an textnode
	{
		for (var i=0; i<xmlNode.childNodes.length; i++)
		{
			rs[xmlNode.childNodes[i].nodeName] = convertXML2Object( xmlNode.childNodes[i] );
		}
	}
	else rs.value = null;

	return rs;
}