function DOMAdapter() 
{	
	// CONSTRUCTOR
	{
		
	}
	
	/**
	* function creates blank XML DOM Document.
	* return XMLDocument
	*/
	this.createDocument = function (ns, root) 
	{
		if (typeof ActiveXObject != 'undefined') 
		{
			var names = ["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];
			for (var key in names) 
			{
				try 
				{
					return new ActiveXObject(names[key]);
				} 
				catch (e) {}
			}
			throw new Error('Unable to create DOMDocument');
		} 
		else if (typeof document != 'undefined' && document.implementation && document.implementation.createDocument && typeof DOMParser != 'undefined')
		{
			return document.implementation.createDocument(ns, root, null);
		}
	};
	
	/**
	* function converts XML DOM Document to a string.
	* @param doc:XMLDocument
	* return string
	*/
	this.convertToString = function (doc) 
	{
		if (typeof ActiveXObject != 'undefined') 
		{
			return doc.xml;
		} 
		else if (typeof document != 'undefined' && document.implementation && document.implementation.createDocument && typeof DOMParser != 'undefined')
		{
			return new XMLSerializer().serializeToString(doc);
		}
	};
	
	/**
	* function parses XML string and returns XML DOM Document, throws expcetion if parsing fails.
	* @param xml:string
	* return XMLDocument
	*/
	this.parseXml = function (xml) 
	{
		if (typeof ActiveXObject != 'undefined') 
		{
			var doc = this.createDocument();
			if (!doc.loadXML(xml)) 
			{
				throw new Error('Parse error');
			}
			return doc;
		} 
		else if (typeof document != 'undefined' && document.implementation && document.implementation.createDocument && typeof DOMParser != 'undefined')
		{
			var doc = new DOMParser().parseFromString(xml, "text/xml");
			if ("parsererror" == doc.documentElement.nodeName) 
			{
				throw new Error('Parse error');
			}
			return doc;
		}
	};
}

if(!domAdapter)
	var domAdapter = new DOMAdapter();
