var explorer = (navigator.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Opera") < 0);
var mozilla = navigator.appName == "Netscape" || navigator.userAgent.indexOf("Opera") >= 0;


// #############################################################################################################

// http://de.wikipedia.org/wiki/XMLHttpRequest
var activeXList = ['MSXML2.XMLHTTP.6.0',
				   'MSXML2.XMLHTTP.3.0',
				   'MSXML2.XMLHTTP',
				   'Microsoft.XMLHTTP'];
var activeXListFreeThreaded = [
				   'Msxml2.FreeThreadedDOMDocument.6.0',
				   'Msxml2.FreeThreadedDOMDocument.4.0',
				   'Msxml2.FreeThreadedDOMDocument',
				   'Msxml.FreeThreadedDOMDocument'];
var noAjaxErrorMsg = "Ihr Browser kann keine Daten nachladen. Bitte verwenden Sie eine neuere Browser-Version. Momentan verwenden Sie\n" + navigator.userAgent;
var noXsltErrorMsg = "Ihr Browser kann kein XMLT. Bitte verwenden Sie eine neuere Browser-Version. Momentan verwenden Sie\n" + navigator.userAgent;

function executeAjaxRequest(url, callback) {
	var ajaxRequest = null;
	if (window.ActiveXObject) {
		for (var i = 0; i < activeXList.length; ++i) {
			try {
				ajaxRequest = new ActiveXObject(activeXList[i]);
				break;
			} catch(e) {
				ajaxRequest = null;
			}
		}
	}
	if (!ajaxRequest && window.XMLHttpRequest) {
		try {
			ajaxRequest = new XMLHttpRequest();
		} catch(e) {
			ajaxRequest = null;
		}
	}
	if (!ajaxRequest) {
		alert(noAjaxErrorMsg);
		return null;
	}
	
	ajaxRequest.onreadystatechange = function () {
        if (ajaxRequest.readyState == 4) {
        	if (ajaxRequest.status == 200) {
        		callback(ajaxRequest.responseText);
        	} else {
				alert('Fehler beim Zugriff auf das XML-Document "' + url + '"');
        	}
        }
	};
	ajaxRequest.open('GET', url, true);
	ajaxRequest.send(null);
	
	return ajaxRequest;
}
function abortPendingAjaxRequest(request) {
	if ((request != null) && (request.readyState != 0) && (request.readyState != 4)) {
		request.abort();
	}
}


function isXMLSupportAvailable() {
	var ajaxRequest = null;
	
	if (window.ActiveXObject) {
		for (var i = 0; i < activeXListFreeThreaded.length; ++i) {
			try {
				ajaxRequest = new ActiveXObject(activeXListFreeThreaded[i]);
				return true;
			} catch(e) {}
		}
		try {
			ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
			return true;
		} catch (e) {
			ajaxRequest = null;
		}
	}
	if (window.XMLHttpRequest) {
		try {
			ajaxRequest = new XMLHttpRequest();
			return true;
		} catch(e) {}
	}
	return false;
}

function createTXTDocument(url) {
	var request = null;
	if (window.ActiveXObject) {
		for (var i = 0; i < activeXListFreeThreaded.length; ++i) {
			try {
				var xmlDoc = new ActiveXObject(activeXListFreeThreaded[i]);
				xmlDoc.async = false;				// diese Passage wird nur noch deshalb genommen, weil es aus den Maps "&apos;" wandelt
				xmlDoc.resolveExternals = false;	// was responseXML nicht tut; beuzuzt man resonseXML werden die roten Rahmen nicht angezeigt
				try {
					if (xmlDoc.load(url))
						return xmlDoc.xml;
					break;	// nicht erfogreich geparst, daher noch mit XMLHTTP probieren:
				} catch (e) {
					alert('Fehler beim TXT-Zugriff auf "'+url+'":\n' + e.message);
					return null;
				}
			} catch(e) {}
		}
		try {
			request = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			request = null;
		}
	}
	if (!request) {
		try {
			if (window.XMLHttpRequest)
				request = new XMLHttpRequest();
		} catch(e) {
			request = null;
		}
	}
	if (!request) {
		alert(noAjaxErrorMsg);
		return null;
	}
	
	var txtDoc = null;
	try {
		request.open("GET", url, false);
		request.send(null);
		txtDoc = request.responseText;
	} catch(e) {
		alert('Fehler beim TXT-Zugriff auf "'+url+'":\n' + e.message);
	}
	return txtDoc;
}

function createXMLDocument(url) {
	var request = null;
	try {
		if (window.XMLHttpRequest)
			request = new XMLHttpRequest();
	} catch(e) {
		request = null;
	}
	if (!request && window.ActiveXObject) {
		for (var i = 0; i < activeXList.length; ++i) {
			try {
				request = new ActiveXObject(activeXList[i]);
				break;
			} catch(e) {
				request = null;
			}
		}
	}
	if (!request) {
		alert(noAjaxErrorMsg);
		return null;
	}
	
	var xmlDoc = null;
	try {
		request.open("GET", url, false);
		request.send(null);
		xmlDoc = request.responseXML;
		if (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.nodeName == "html" && xmlDoc.documentElement.firstChild == null)
			xmlDoc = null;	// das macht mozilla aus leerem input
	} catch(e) {
		alert('Fehler beim XML-Zugriff auf "'+url+'":\n' + e.message);
	}
	return xmlDoc;
}

function createXSLTProcessor(url) {
	var XSLTDocument = createXMLDocument(url);
	if (XSLTDocument)
	{
		if (window.XSLTProcessor) {
			try {
				var xsltProc = new XSLTProcessor();
				try {
		        	xsltProc.importStylesheet(XSLTDocument);
		        	return xsltProc;
				} catch (e) {
		        	alert('Fehler beim Import des Stylesheet "'+url+'":\n' + e.message);
		        	return null;
				}
			} catch (e) {}
		}
		if (window.ActiveXObject) {
			try {
				var xsltDoc = new ActiveXObject("Msxml2.XSLTemplate");
				try {
					xsltDoc.stylesheet = XSLTDocument;
					xsltProc = xsltDoc.createProcessor();
					return xsltProc;
				} catch (e) {
		        	alert('Fehler beim Import des Stylesheet "'+url+'":\n' + e.message);
		        	return null;
				}
			} catch (e) {}
		}
	}
	
	alert(noXsltErrorMsg);
	return null;
}

function transform(xml, processor) {
	var result = null;
	if (xml && processor) {
		if (processor.addParameter) {
			processor.input = xml;
			for (var i=2; i<arguments.length; i+=2)
				processor.addParameter(arguments[i],arguments[i+1]);
			processor.transform();
			result = processor.output;
		} else if (processor.setParameter) {
			for (var i=2;i<arguments.length;i+=2)
				processor.setParameter(null,arguments[i],arguments[i+1]);
			result = new XMLSerializer().serializeToString(processor.transformToDocument(xml));
		}
	} else alert('XMLsupport: Fehler beim XSLT Process: XML oder XSL gleich "null"');
	return result;
}

function serialize(xml) {
	var result = null;
	if (xml) {
		result = ""
		if (xml.xml) {
			result = xml.xml;
		} else if (window.XMLSerializer) {
			result = new XMLSerializer().serializeToString(xml);
		}
	}
	return result;
}



function selectSingleNode(xml,xpath) {
	var node = null;
	if (explorer) node = xml.selectSingleNode(xpath);
	else if (mozilla) try {
               node = new XPathEvaluator().evaluate(xpath, xml, null,XPathResult.ANY_TYPE, null).iterateNext();
	} catch (e) { alert(e); }
	return node;
}

function selectNodes(xml,xpath) {
	var nodes = null;
	if (explorer) nodes = xml.selectNodes(xpath);
	else if (mozilla) {
		nodes = new Array();
		var r = new XPathEvaluator().evaluate(xpath,xml,null,0,null);
		var n = null;
		while (n=r.iterateNext()) nodes.push(n);
	}
	return nodes;
}


