﻿Phizz.Xml = {

	EncodeAsXml: function(s) {
		var result = "";
		for (var i = 0; i < s.length; i++) {
			var c = s.charCodeAt(i);
			if (c == 34) {
				result = result.concat("&quot;");
			} else if (c == 38) {
				result = result.concat("&amp;");
			} else if (c == 39) {
				result = result.concat("&apos;");
			} else if (c == 60) {
				result = result.concat("&lt;");
			} else if (c == 62) {
				result = result.concat("&gt;");
			} else if (c > 127) {
				result = result.concat("&#x", c.toString(16), ";");
			} else {
				result = result.concat(s.charAt(i));
			}
		}
		return result;
	},
	
	CreateXmlDocument: function() {
		var objXmlDocument = null;
		if (window.ActiveXObject) {
			objXmlDocument = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.3.0");
		} else if (window.DOMParser) {
			objXmlDocument = document.implementation.createDocument("ns", "root", null);
		} else {
			alert("Unsupported Browser Error: Cannot create XML Document.");
		}
		return objXmlDocument;
	},
	
	LoadXmlDocumentFromString: function(sXml) {
		var objXmlDocument = null;
		if (window.ActiveXObject) {
			objXmlDocument = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.3.0");
			objXmlDocument.async = false;
			objXmlDocument.loadXML(sXml);
		} else if (window.DOMParser) {
			var domParser = new DOMParser();
			objXmlDocument = domParser.parseFromString(sXml, "text/xml");
		} else {
			alert("Unsupported Browser Error: Cannot create XML Document.");
		}
		return objXmlDocument;
	},
	
	LoadXmlDocumentFromUrl: function(url, isAsync) {
		var objXmlDocument = null;
		if (window.ActiveXObject) {
			objXmlDocument = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.3.0");
			objXmlDocument.async = isAsync;
			objXmlDocument.load(url);
		} else if (window.XMLHttpRequest) {
			var objXMLHttpRequest = new XMLHttpRequest();
			objXMLHttpRequest.open("GET", url, false);
			objXMLHttpRequest.send(null);
			objXmlDocument = objXMLHttpRequest.responseXML;
		} else if (window.DOMParser) {
			objXmlDocument = document.implementation.createDocument("", "", null);
			objXmlDocument.load(url);
		} else {
			alert("Unsupported Browser Error: Cannot create XML Document.");
		}
		return objXmlDocument;
	},
	
	LoadXmlDocumentFromDataIsland: function(id) {
		var objXmlDocument = null;
		if (window.ActiveXObject) {
			objXmlDocument = Phizz.Dom.ByID(id).XMLDocument;
		} else if (document.implementation && document.implementation.createDocument) {
			var xmlDataIslands = Phizz.Dom.ByTagName("xml");
			for (var i = 0; i < xmlDataIslands.length; i++) {
				if (xmlDataIslands[i].id == id) {
					var xml = Phizz.Xml.ParseDataIsland(xmlDataIslands[i].firstChild, "");		
					//alert(xml);
					objXmlDocument = Phizz.Xml.LoadXmlDocumentFromString(xml);
					//alert((new XMLSerializer()).serializeToString(objXmlDocument.documentElement));
					break;
				}
			}
		} else {
			alert("Unsupported Browser Error: Cannot create XML Document.");
		}
		if (objXmlDocument.documentElement.childNodes.length == 1 && objXmlDocument.documentElement.childNodes[0].nodeType == 3 && (objXmlDocument.documentElement.childNodes[0].nodeValue.charCodeAt(0) == 160 || objXmlDocument.documentElement.childNodes[0].nodeValue.charCodeAt(0) == 65533)) objXmlDocument.documentElement.removeChild(objXmlDocument.documentElement.childNodes[0]);
		return objXmlDocument;
	},
	
	ParseDataIsland: function(obj, xml) {
		var name = obj.nodeName.toLowerCase();
		xml = xml.concat("<", name);
		if (obj.hasAttributes()) {
			var atts = obj.attributes;
			for (var i = 0; i < atts.length; i++) if (atts[i].name != "_moz-userdefined") xml = xml.concat(" ", atts[i].name, "=\"", atts[i].value, "\"");
		}
		if (obj.hasChildNodes()) {
			xml = xml.concat(">");
			var nodes = obj.childNodes;
			for (var i = 0; i < nodes.length; i++) {
				if (nodes[i].nodeType == 3) {
					if (Phizz.Tools.TrimString(nodes[i].nodeValue).length > 0) xml = xml.concat(Phizz.Xml.EncodeAsXml(nodes[i].nodeValue));
				} else {
					xml = Phizz.Xml.ParseDataIsland(nodes[i], xml);
				}
			}
			xml = xml.concat("</", name, ">");
		} else {
			xml = xml.concat(" />");
		}
		return xml;
	},
	
	ConvertXmlDocumentToString: function(objXmlDocument) {
		if (window.DOMParser) {
			return (new XMLSerializer()).serializeToString(objXmlDocument);
		} else if (window.ActiveXObject) {
			return objXmlDocument.documentElement.xml;
		} else {
			alert("Unsupported Browser Error: Cannot serialize XML Document.");
		}
	},
	
	XslTransform: function(objXmlDocument, objXslDocument) {
		if (window.XSLTProcessor) {
			var processor = new XSLTProcessor();
			processor.importStylesheet(objXslDocument);
			var objXmlTransformation = processor.transformToDocument(objXmlDocument);
			return (new XMLSerializer()).serializeToString(objXmlTransformation);
		} else if (window.ActiveXObject) {
			return objXmlDocument.transformNode(objXslDocument);
		} else {
			alert("Unsupported Browser Error: Cannot transform XML Document.");
		}
	},
	
	XslTransformWithParam: function(objXmlDocument, objXslDocument, paramName, paramValue) {
		if (window.XSLTProcessor) {
			var processor = new XSLTProcessor();
			processor.importStylesheet(objXslDocument);
			processor.setParameter("", paramName, paramValue);
			var objXmlTransformation = processor.transformToDocument(objXmlDocument);
			return (new XMLSerializer()).serializeToString(objXmlTransformation);
		} else if (window.ActiveXObject) {
			var objXSLTemplate = new ActiveXObject("MSXML2.XSLTemplate.3.0");
			objXSLTemplate.stylesheet = objXslDocument;
			var objProcessor = objXSLTemplate.createProcessor();
			objProcessor.input = objXmlDocument;
			objProcessor.addParameter(paramName, paramValue);
			objProcessor.transform();
			return objProcessor.output;
		} else {
			alert("Unsupported Browser Error: Cannot transform XML Document.");
			return "";
		}
	},
		
	XslTransformWithParams: function(objXmlDocument, objXslDocument, paramNames, paramValues) {
		if (window.XSLTProcessor) {
			var processor = new XSLTProcessor();
			processor.importStylesheet(objXslDocument);
			for (var i = 0; i < paramNames.length; i++) processor.setParameter("", paramNames[i], paramValues[i]);
			var objXmlTransformation = processor.transformToDocument(objXmlDocument);
			return (new XMLSerializer()).serializeToString(objXmlTransformation);
		} else if (window.ActiveXObject) {
			var objXSLTemplate = new ActiveXObject("MSXML2.XSLTemplate.3.0");
			objXSLTemplate.stylesheet = objXslDocument;
			var objProcessor = objXSLTemplate.createProcessor();
			objProcessor.input = objXmlDocument;
			for (var i = 0; i < paramNames.length; i++) objProcessor.addParameter(paramNames[i], paramValues[i]);
			objProcessor.transform();
			return objProcessor.output;
		} else {
			alert("Unsupported Browser Error: Cannot transform XML Document.");
			return "";
		}
	},
	
	CreateXmlHttpRequest: function() {
		var objXmlHttpRequest = null;
		if (window.XMLHttpRequest) {
			objXmlHttpRequest = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			try {
				objXmlHttpRequest = new ActiveXObject("MSXML2.XMLHTTP.3.0");
			} catch(e) {
				objXmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
		} else {
			alert("Unsupported Browser Error: Cannot create XML HTTP Request.");
		}
		return objXmlHttpRequest;
	}
	
}
