/**
* Provides DOM-Documents and their functionality
*
* @package Ceasy_Core
* @author Ralf Glaser
*
*
*/

var MadChickDomDocSettings= {
	availableDomVersions: [
		'Msxml2.FreeThreadedDOMDocument.6.0',
		'Msxml2.FreeThreadedDOMDocument.5.0',
		'Msxml2.FreeThreadedDOMDocument.4.0',
		'Msxml2.FreeThreadedDOMDocument.3.0'
	],
	useActiveX: (typeof(ActiveXObject) != 'undefined'),
	useDom: document.implementation && document.implementation.createDocument,
	domVersion: null
}

function MadChickDomDoc() {


}

// --------------------------------------------------------------------------------------
MadChickDomDoc.factory=function (data, async) {

	async=async || false;

	var xmlDomDoc;

	if (MadChickDomDocSettings.useDom) {

		// gecko
		xmlDomDoc= document.implementation.createDocument('', '', null);

		/*xmlDomDoc.addEventListener('load', function() {
			this._checkForErrors();
			this._changeReadyState(4);
		}, false);*/

	} else if (MadChickDomDocSettings.useActiveX) {

		// IE
		if (!MadChickDomDocSettings.domVersion) {

			for (var i=0; i < MadChickDomDocSettings.availableDomVersions.length; i++) {

				try {

					new ActiveXObject(MadChickDomDocSettings.availableDomVersions[i]);
					MadChickDomDocSettings.domVersion = MadChickDomDocSettings.availableDomVersions[i];
					break;

				} catch (e) {}

			}

		}

		if (MadChickDomDocSettings.domVersion) {

			xmlDomDoc=new ActiveXObject(MadChickDomDocSettings.domVersion);

		} else {

			alert('Leider konnte keine aktuelle Version des MSXML2 gefunden werden.\nBitte intallieren Sie MSXML2 ab Version 6.0 oder benutzen Sie Firefox.\n\nMSXML2 6.0 können Sie kostenlos von der Website von Mircorsoft herunterladen:\nhttp://download.microsoft.com/download/a/4/5/a45cb3d5-2268-4d13-9efb-ec800262ac98/msxml6.msi');

			throw new Error('MadChickDomDoc::factory(): Could not create XML DOM document by instanciating ActiceXObject. No matching domVersion found.');

		}

	} else {

		throw new Error('MadChickDomDoc::factory(): Your browser doesn\'t support XML DOM documents.');

	}

	if (typeof(data)=='string') {

		if (data.substring(0, 4)=='http') {

			xmlDomDoc.async=async;
			xmlDomDoc.load(data);

		} else {

			xmlDomDoc.loadXML(data);

		}

		if (!xmlDomDoc.documentElement) {

			var msg='';

			if (xmlDomDoc.parseError.reason) { //IE

				msg=': '+xmlDomDoc.parseError.reason+' (line: '+xmlDomDoc.parseError.line+'/'+xmlDomDoc.parseError.linepos+')\n'+xmlDomDoc.parseError.srcText;

			} else { // gecko

				msg=' or document is invalid.';

			}

			throw new Error('MadChickDomDoc::factory(\''+data+'\'): couldn\'t load XML-document'+msg);

		}

	}

	return xmlDomDoc;

}

// --------------------------------------------------------------------------------------
MadChickDomDoc.selectSingleNode=function (referenceNode, xPathString, nsArray) {

	nsArray= nsArray || {'':''};

	if (!referenceNode) {

		throw new Error('MadChickDomDoc::selectSingleNode(): referenceNode is undefinded. [xPathString='+xPathString+']');

	}

	if (MadChickDomDocSettings.useActiveX) {

		if (nsArray) {

			var nsString = '';

			for (var nsPrefix in nsArray) {

				nsString+= 'xmlns:'+nsPrefix+'="'+nsArray[nsPrefix]+'" ';

			}

			if (!referenceNode.ownerDocument) {

				var newDocument=MadChickDomDoc.factory(referenceNode.xml, false);
				referenceNode=newDocument.documentElement;

			}

			referenceNode.ownerDocument.setProperty('SelectionNamespaces', nsString);

		}

		return referenceNode.selectSingleNode(xPathString);

	} else if (MadChickDomDocSettings.useDom) {

		if (typeof(XPathEvaluator)!= "undefined") {

			var nsResolver= function (sPrefix) {

				return nsArray[sPrefix];

			};

			var evaluator = new XPathEvaluator();

			var result = evaluator.evaluate(xPathString, referenceNode, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

			if (result != null) {

				return result.singleNodeValue;

			} else {

				return null;

			}

		} else {

			throw new Error('XPath is not supported in this browser');

		}

	} else {

		throw new Error('MadChickDomDoc::selectSingleNode(): Your browser doesn\'t support XML DOM documents.');

	}




}

// --------------------------------------------------------------------------------------
MadChickDomDoc.selectNodes=function (referenceNode, xPathString, nsArray) {

	nsArray= nsArray || {'':''};

	if (MadChickDomDocSettings.useActiveX) {

		if (nsArray) {

			var nsString = '';

			for (var nsPrefix in nsArray) {

				nsString+= 'xmlns:'+nsPrefix+'="'+nsArray[nsPrefix]+'" ';

			}

			if (!referenceNode.ownerDocument) {

				var newDocument=MadChickDomDoc.factory(referenceNode.xml, false);
				referenceNode=newDocument.documentElement;

			}

			referenceNode.ownerDocument.setProperty('SelectionNamespaces', nsString);

		}

		return referenceNode.selectNodes(xPathString);

	} else if (MadChickDomDocSettings.useDom) {

		if (typeof(XPathEvaluator)!= "undefined") {

			var nsResolver= function (sPrefix) {

				return nsArray[sPrefix];

			};

			var evaluator = new XPathEvaluator();

			var result = evaluator.evaluate(xPathString, referenceNode, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

			var nodes = new Array();

			if (result != null) {

				var node = result.iterateNext();

				while(node) {

					nodes.push(node);
					node = result.iterateNext();

				}

			}

			return nodes;

		} else {

			throw new Error('XPath not supported');

		}

	} else {

		throw new Error('MadChickDomDoc::selectSingleNode(): Your browser doesn\'t support XML DOM documents.');

	}




}


