function clXmlParser() {
	var xmlParser = null;
	var currentNode = null;
	var currentChildNode = 0;
	var xmlParseDOM = true;
	var endOfStackReached = false;
	this.documentElement = null;

	try {
		// Firefox, Opera 8.0+, Safari
		xmlParser = new DOMParser();
	}
	catch (e) {
		xmlParseDOM = false;
		// Internet Explorer

		// vanwege verschillende xml implementaties van microsoft
		ProgIds = new Array();
		ProgIds[0] = 'Msxml2.DOMDocument.6.0';
		ProgIds[1] = 'Msxml2.DOMDocument.5.0';
		ProgIds[2] = 'Msxml2.DOMDocument.4.0';
		ProgIds[3] = 'Msxml2.DOMDocument.3.0';
		ProgIds[4] = 'Microsoft.XMLDOM';

		for(var i = 0; i < ProgIds.length; i++) {
			try {
				xmlParser = new ActiveXObject(ProgIds[i]);
				xmlParser.async = false;
				break;
			}
			catch(e) {}
		}
	}

	clXmlParser.prototype.parseFromString = function (text) {
		if(!xmlParseDOM) {
			xmlParser.loadXML(text);
			this.documentElement = xmlParser.documentElement;
		}
		else {
			var doc = xmlParser.parseFromString(text, "text/xml");
			this.documentElement = doc.documentElement;
		}
	};

	clXmlParser.prototype.childNodes = function (parentNode) {
		if(!isset(parentNode)) {
			parentNode = this.documentElement;
		}
		return parentNode.childNodes;
	};

	clXmlParser.prototype.childNodeNames = function (parentNode) {
		var result = new Array();
		if(!isset(parentNode)) {
			parentNode = this.documentElement;
		}

		if (parentNode.childNodes.length > 0) {
			for(var i = 0; i < parentNode.childNodes.length; i++) {
				if(!in_array(parentNode.childNodes[i].nodeName, result)) {
					result[result.length] = parentNode.childNodes[i].nodeName;
				}
			}
		}

		return result;
	};

	clXmlParser.prototype.getNodeValue = function (nodeName, parentNode) {
		if(!isset(parentNode)) {
			parentNode = this.documentElement;
		}

		var node = parentNode.getElementsByTagName(nodeName)[0];
		return (node && node.firstChild) ? node.firstChild.nodeValue : false;
	};

	clXmlParser.prototype.getChildNode = function (nodeName, parentNode) {
		var result = false;

		if(!isset(parentNode)) {
			parentNode = this.documentElement;
		}

		if(currentNode != parentNode) {
			currentNode = parentNode;
			endOfStackReached = false;
			currentChildNode = 0;
		}

		if((nodes = parentNode.getElementsByTagName(nodeName)).length > 0 && !endOfStackReached) {
			result = nodes[currentChildNode];
			currentChildNode++;
			if(currentChildNode >= nodes.length) {
				endOfStackReached = true;
				currentChildNode = 0;
			}
		}
		else if((nodes = parentNode.getElementsByTagName(nodeName)).length > 0 && endOfStackReached) {
			endOfStackReached = false;
		}

		return result;
	};
}
