var loadstatus = "";
var xmlText = "";
var ss;
var xslcache;
var debugMode = false;

// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function stripHTML(s) {
	return s.replace(/\&/g, "&amp;").replace(/\</g, "&lt;").replace(/\>/g, "&gt;").replace(/\t/g, "&nbsp;&nbsp;&nbsp;").replace(/\n/g, "<br />");
}

// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var strXML = objNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}


function ajaxUpdateElementByID(XMLURL, CSSTargetID, bStripHTML, formMethod, formID, returnFunction) {
//function ajaxUpdateElementByID(XMLURL,CSSTargetID,bStripHTML) {
//	var xmlHttp = XmlHttp.create();
	var xmlHttp = createXMLHttp();
	if (formMethod == undefined){
		xmlHttp.open("get", XMLURL, true);
	}
	else {
		xmlHttp.open(formMethod, XMLURL, true);
		xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); 
	}
		xmlHttp.onreadystatechange = function () {
			switch (xmlHttp.readyState) {
				case 0:
					loadstatus = "Uninitialized";
					break;
				case 1:
					loadstatus = "Loading";
					break;
				case 2:
					loadstatus = "Loaded";
					break;
				case 3:
					loadstatus = "Interactive";
					break;
				case 4:
					if (xmlHttp.status == 200) {
						loadstatus = "Done";

						//Plain Text
						if (CSSTargetID != ''){
						   
							if (bStripHTML == true){
								document.getElementById(CSSTargetID).innerHTML = stripHTML(xmlHttp.responseText);
							} else {						
							
							    var rawResponse = xmlHttp.responseText; 
							    var resResponse = rawResponse.substring(rawResponse.lastIndexOf(">")+1); 				
								document.getElementById(CSSTargetID).innerHTML = resResponse;
							}
						}
						//XML Text
						//document.getElementById("XMLOut").innerHTML = stripHTML(xmlHttp.responseXML.xml);
						//xmlText = xmlHttp.responseXML.xml;
						xmlText = xmlHttp.responseText;
						if (returnFunction != undefined){
							eval(returnFunction + "(xmlHttp.responseXML)"); 
						}
						if (debugMode){
							alert(xmlText);
						}

						//document.getElementById("XMLOut").innerHTML = stripHTML(xmlHttp.responseXML.xml);
						//xmlText = xmlHttp.responseXML.xml;
						xmlText = xmlHttp.responseText;
					} else {
						loadstatus = "ERROR:" + xmlHttp.statusText;
					}
					break;
			}
		}

	if (formMethod == undefined || (formMethod && formMethod.toLowerCase() == 'get')){
		xmlHttp.send(null);
	} else {
		var str = getFormValues(formID);
		if (debugMode == true){
			alert(str);
		}
		xmlHttp.send(str);
	}
}


function ajaxXSLTUpdateElementByID(XMLURL,CSSTargetID,XSLURL) {
//	var xmlHttp = XmlHttp.create();
	var xmlHttp = createXMLHttp();

	xmlHttp.open("get", XMLURL, true);
		xmlHttp.onreadystatechange = function () {
			switch (xmlHttp.readyState) {
				case 0:
					loadstatus = "Uninitialized";
					break;
				case 1:
					loadstatus = "Loading";
					break;
				case 2:
					loadstatus = "Loaded";
					break;
				case 3:
					loadstatus = "Interactive";
					break;
				case 4:
					if (xmlHttp.status == 200) {
						loadstatus = "Done";
						try {
							var xslStylesheet; 
							var xsltProcessor = new XSLTProcessor(); 

							// load the xslt file, example1.xsl 
							var myXMLHTTPRequest = new XMLHttpRequest(); 
							myXMLHTTPRequest.open("get", XSLURL, false); 
							myXMLHTTPRequest.send(null); 

							// get the XML document and import it 
							xslStylesheet = myXMLHTTPRequest.responseXML; 
							xsltProcessor.importStylesheet(xslStylesheet); 

							// load the xml file, example1.xml 
							myXMLHTTPRequest = new XMLHttpRequest(); 
							myXMLHTTPRequest.open("GET", XMLURL, false); 
							myXMLHTTPRequest.send(null); 

							var xmlSource = myXMLHTTPRequest.responseXML; 
							var resultDocument = xsltProcessor.transformToDocument(xmlSource);

							document.getElementById(CSSTargetID).innerHTML = resultDocument.xml;
						}
						catch (ex) {
							//alert("Loading XSL File: " + XSLURL);
							xslLoadAndCache(XSLURL)							//Load XSL File
							
							var processor = xslcache.createProcessor();		//Do XSL Transform
							processor.input = xmlHttp.responseXML;
							processor.transform();							// default mode transformation
							
							//Update Page Element
							document.getElementById(CSSTargetID).innerHTML = processor.output;
						};
				
					} else {
						loadstatus = "ERROR:" + xmlHttp.status;
					}
					break;
			}
		}
	xmlHttp.send(null);	
}


// XSL Functions for IE
function xslLoadAndCache(strXSLFile)
{ 				
	ss = new ActiveXObject('Msxml2.FreeThreadedDOMDocument');
	ss.async = false;
	ss.load(strXSLFile);
	//alert("XSL File Loaded");
			
	xslcache = new ActiveXObject("Msxml2.XSLTemplate");
	//alert("xslcache object created");
	xslcache.stylesheet = ss;
	//alert("xslcache.stylesheet set");
}



//====================================================================================
//Function to retrieve all form element values
//====================================================================================
function getFormValues(fobj) { 
	try {
		var test = fobj.elements.length;	//don't attempt if this isn't a valid form object
	} catch(ex) {
		return;
	}
	var str = '';

	for(var i=0; i<fobj.elements.length; i++){
		switch(fobj.elements[i].type){ 
			case 'text': 
				str += fobj.elements[i].name + '=' + escape(fobj.elements[i].value) + '&'; 
                break; 
			case 'hidden': 
				str += fobj.elements[i].name + '=' + escape(fobj.elements[i].value) + '&'; 
                break; 
			case 'select-one': 
                str += fobj.elements[i].name + '=' + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + '&'; 
                break; 
            case 'checkbox':
				if (fobj.elements[i].checked==true){
					str += fobj.elements[i].name + '=' + escape(fobj.elements[i].value) + '&'; 
				}
                break; 
            case 'radio':
				if (fobj.elements[i].checked==true){
					str += fobj.elements[i].name + '=' + escape(fobj.elements[i].value) + '&'; 
				}
                break;
			case 'textarea': 
				str += fobj.elements[i].name + '=' + escape(fobj.elements[i].value) + '&'; 
                break;                             
       } 
	} 
	
	str = str.substr(0, (str.length-1)); 
	return str; 
}

// Synchronous Data Load
function syncDataLoad(XMLURL) {
	// Create an xmlHttp object and load the requested URL in synchronous mode
	var xmlHttp = XmlHttp.create();
	xmlHttp.open("GET", XMLURL, false);
	xmlHttp.send(null);
	
	// Return the serialized (string) data from the file
	var xmlReturn = xmlHttp.responseXML;
	
	// Return the data
	return xmlReturn;
}

// Ajax Result Class
function AjaxResult(httpStatusCode, responseXML, responseText)
{
    this.responseXML = responseXML;
    this.httpStatusCode = httpStatusCode;
    this.responseText = responseText;
}

// Performs a synchronous web form post to a URL
function ajaxSyncPost(XMLURL, postData)
{
	// Create an xmlHttp object and load the requested URL in synchronous mode
	var xmlHttp = XmlHttp.create();
	xmlHttp.open("POST", XMLURL, false);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    xmlHttp.send(postData);
	
	// Return the serialized (string) data from the file
	var xmlReturn = xmlHttp.responseXML;
	var textReturn = "";
	if (xmlHttp.responseText != null) textReturn = xmlHttp.responseText;
	
	// Return the data
	var intStatusCode = 0;
	if (xmlHttp.status != null) intStatusCode = xmlHttp.status;
	
	return new AjaxResult(intStatusCode, xmlReturn, textReturn);
}

function ajaxAsyncPost(XMLURL, postData, returnFunction)
{
	// Create an xmlHttp object and load the requested URL in synchronous mode
	var xmlHttp = XmlHttp.create();
	xmlHttp.open("POST", XMLURL, true);
	xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
	if (returnFunction != null)
	{
	    xmlHttp.onreadystatechange = function()    // Bubble up event
	    {
	        if (xmlHttp.readystate == 4)
	            eval(returnFunction + "(xmlHttp.status, xmlHttp.responseXML, xmlHttp.responseText);");
	    }
	}

	xmlHttp.send(postData);
}

function createXMLHttp() {
	if (typeof XMLHttpRequest != "undefined") {
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		var aVersions = [ "MSXML2.XMLHttp.5.0",
		"MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0",
		"MSXML2.XMLHttp","Microsoft.XMLHttp" ];

		for (var i = 0; i < aVersions.length; i++) {
			try {
				var oXmlHttp = new ActiveXObject(aVersions[i]);
				return oXmlHttp;
			} catch (oError) {
				//Do nothing, try another version
			}
		}
	}
	throw new Error("XMLHttp object could not be created.");
}

