// javascript XML functions
// created by R. Groenedijk, M. Sgaier
// rocked by M. Dekker

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)};
	return false;	
}

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;
		
		// responseXML geeft geen valide XML object terug ?
		// dan maar met het handje :
		//var xmlletje = (new DOMParser()).parseFromString(xmlHttp.responseText, "text/xml");
		//return xmlobj;
		
	}
	else
	{
		url+= ((url.indexOf("?")<0)? "?":"") + data;
		if(document.getElementById("iframeXmlHttp")) document.getElementById("iframeXmlHttp").src=url;
		return false;
	}
}

function postResult(e) {
	alert(xmlHttp);
	alert(xmlHttp.responseXML);
}

function serializePost(form)
{	
	var ar = new Array();
	for (var i=0; i < form.elements.length; i++) {
		if (// only include radio AND checkbox elements when checked
			(form.elements[i].type == 'radio' && form.elements[i].checked)
			||
			(form.elements[i].type == 'checkbox' && form.elements[i].checked)
			||
			(form.elements[i].type != 'radio' && form.elements[i].type != 'checkbox')
			) 
		{
		ar[ar.length] = form.elements[i].name +"="+form.elements[i].value.replace(';', '\;');
		}
	}
	return ar.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 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("record")[0];
	if (!xmlNode) return {}; // return empty object

	var rs = convertXML2Object(xmlNode);
	return rs;
}


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) ) {
	
 		rs = xmlNode.firstChild.nodeValue; // return node value
		
	} else if (hasChildNodesArray(xmlNode)) {
		
		rs = convertXML2Array(xmlNode); // convert to array
		
	} else if (hasChildNodes(xmlNode)) {
	
		// convert to object
		for (var i=0; i<xmlNode.childNodes.length; i++) {	
		
			rs[xmlNode.childNodes[i].nodeName] = convertXML2Object( xmlNode.childNodes[i] );
			
		}
		
	} else {
		
		rs.value = null;
	
	}

	return rs;
}

function convertXML2Array( xmlNode ) {
	var rs = new Array();
	
	for (var i=0; i<xmlNode.childNodes.length; i++) {
	
		rs[i] = convertXML2Object( xmlNode.childNodes[i] );
			
	}
	return rs; 
}

function hasChildNodes( xmlNode ) {
	return (xmlNode.childNodes.length > 0);
}

function hasChildNodesArray( xmlNode ) {
	var is_arr = false;
	
	if (xmlNode.childNodes.length > 1) {
	
		for(var i = 1;i < xmlNode.childNodes.length;i++) {
	
			if (xmlNode.childNodes[i].nodeName == xmlNode.childNodes[i-1].nodeName) {
					is_arr = true;
			} else {
				is_arr = false;
				break;
			}
		}
	}
	return is_arr;
	
}
