//Returns XML Object (DOM) (Syncronous) from url (works in Mozilla browsers)
function getXMLData(url) {
	var http_request;
	var result = "";
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType("text/xml");
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP.3.0");
		} catch (e) {}
	}
	http_request.open('GET', url, false);
    http_request.send(null);
	result = http_request.responseXML;
	return result;
}

//Returns XML Object (DOM) (Asyncronous) from url (works in Mozilla browsers)
function getXMLDataAsync(url, funcName) {
	var http_request;	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType("text/xml");
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {alert(e.message);}
	}
	
	http_request.open("GET", url, true);	
	/*
	http_request.onreadystatechange = processState;
	try {
		http_request.open("GET", url, true);
		http_request.send(null);
	} catch(e) { alert("Error obtaining remote resource (Status Code: " + http_request.status + "): " + ((e.message)?e.message:e)); }
	
	function processState() {
		if(http_request.readyState == 4) {
			funcName(http_request.responseXML);
		}
	}
	*/
	
	http_request.onreadystatechange = function() {
		if(http_request.readyState == 4) {
			var xd = http_request.responseXML;
			if (!xd.documentElement) {
				xd.loadXML(http_request.responseText);
			}
			funcName(xd);
		}
	}
	http_request.send(null);	
}

//IE Only used for Stylesheet templates
function getFTDOM(url) {
	var ftdom = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
	ftdom.async = false;
	ftdom.resolveExternals = false;	
	ftdom.load(url);
	if (ftdom.parseError.errorCode != 0) {
		return false;
	} else {
		return ftdom;
	}
}

function XSLTemplate(url) {
	this.xslProcessor;
	this.addParameter = _addParameter;
	this.processInput = _processInput;
	var xslDoc = (window.ActiveXObject)?getFTDOM(url):getXMLData(url);
	var xslTemplate;	
	if(xslDoc) {
		if(window.ActiveXObject) {
			xslTemplate = new ActiveXObject("Msxml2.XSLTemplate.3.0");
			xslTemplate.stylesheet = xslDoc;
			this.xslProcessor = xslTemplate.createProcessor();
		} else {
			xslTemplate = new XSLTProcessor();
			xslTemplate.importStylesheet(xslDoc);
			this.xslProcessor = xslTemplate;
		}
	}
	function _processInput(xmldom) {
		var output = "";
		if(xmldom) {
			if(window.ActiveXObject) {
				this.xslProcessor.input = xmldom;
				this.xslProcessor.transform();
				output = this.xslProcessor.output;
			} else {
				output = getOuterHTML(this.xslProcessor.transformToDocument(xmldom).documentElement);
			}			
		}
		return output;
	}
	
	function _addParameter(name, value) {
		if(window.ActiveXObject) {
			this.xslProcessor.addParameter(name, value);
		} else {
			this.xslProcessor.setParameter(null, name, value);
		}
	}
}

//Multi-Browser XSL Transformer
function XSLTransformer() {
	this.setStylesheet = _setStylesheet;
	this.setSource = _setSource;
	this.processResult = _processResult;
	this.processDOM = _processDOM;
	var xslProc;
	var xslDoc;
	var xmlDoc;
	
	function _setStylesheet(url) {
		xslDoc = getXMLData(url);
	}
	
	function _setSource(url) {
		xmlDoc = getXMLData(url);
	}
	
	function _processResult() {
		var output = "";
		if(xslDoc && xmlDoc) {
			if(window.ActiveXObject) {				
				output = xmlDoc.transformNode(xslDoc);
			} else {
				xslProc = new XSLTProcessor();
				xslProc.importStylesheet(xslDoc);
				output = xslProc.transformToDocument(xmlDoc).documentElement.innerHTML;
			}			
		}
		return output;
	}
	
	function _processDOM(xmlDom) {
		var output = "";
		if(xslDoc && xmlDom) {
			if(window.ActiveXObject) {				
				output = xmlDom.transformNode(xslDoc);
			} else {
				xslProc = new XSLTProcessor();
				xslProc.importStylesheet(xslDoc);
				output = xslProc.transformToDocument(xmlDom).documentElement.innerHTML;
			}			
		}
		return output;
	}
}

//Makes a background call to a URL resource
//Returns true if requested resource is available, false otherwise
function callResource(url) {
	var http_request;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP.4.0");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Msxml2.XMLHTTP.3.0");
			} catch (e) {}
		}
	}
	http_request.open('GET', url, false);
    http_request.send(null);
	return (http_request.status == 200)?true:false;
}