function xslParamObj(){
	this.pName = new Array()
	this.pValue = new Array()
}

function DomElmtData(domObj, eName, eIdx){
	try {
		return domObj.getElementsByTagName(eName)[eIdx].firstChild.data
		}
	catch(err) {
		return ''
	}
}

function fillUsingXsl(xmlResp, xslFile, targetObj, paramObj){

	//Notes:
	//xslFile must be local (on this server/domain).
	//xmlResp must be the 'responseXML' object.
	//targetObj is any object on the page that has a writable innerHTML property.

	var XSLDoc
	var resDoc

	if (window.XSLTProcessor){ //Mozilla
		var xsltProcessor = new XSLTProcessor()
			
		XSLDoc = document.implementation.createDocument('','',null)
		XSLDoc.async = false
		XSLDoc.load(xslFile)
			
		xsltProcessor.importStylesheet(XSLDoc)
		
		if(paramObj){
			for(i=0;i<paramObj.pName.length;i++){
				xsltProcessor.setParameter(null, paramObj.pName[i], paramObj.pValue[i])
			}
		}

		try { resDoc = xsltProcessor.transformToFragment(xmlResp, document) } catch (e) { alert(e) }
		document.getElementById(targetObj).innerHTML = ''
		document.getElementById(targetObj).appendChild(resDoc)
	}else if(window.ActiveXObject){  //IE
		var xml = new ActiveXObject("MSXML2.DomDocument.3.0");
		xml.async = false;
		xml.load(xmlResp);

		var xsl = new ActiveXObject("MSXML2.FreeThreadedDomDocument.3.0");
		xsl.async = false;
		xsl.load(xslFile);

		xsl_template = new ActiveXObject("Msxml2.XSLTemplate")
		xsl_template.stylesheet = xsl;
		
		xslProc = xsl_template.createProcessor()
		xslProc.input = xml
		
		if(paramObj){
			for(i=0;i<paramObj.pName.length;i++){
				xslProc.addParameter(paramObj.pName[i], paramObj.pValue[i])
			}
		}
		
		xslProc.transform()
		document.getElementById(targetObj).innerHTML = xslProc.output		
	}

}

/**
function fillUsingXsl(xmlResp, xslFile, targetObj){

	//Notes:
	//xslFile must be local (on this server/domain).
	//xmlResp must be the 'responseXML' object.
	//targetObj is any object on the page that has a writable innerHTML property.

	var XSLDoc
	var resDoc

	if (window.XSLTProcessor){ //Mozilla
		var xsltProcessor = new XSLTProcessor()
			
		XSLDoc = document.implementation.createDocument('','',null)
		XSLDoc.async = false
		XSLDoc.load(xslFile)
			
		xsltProcessor.importStylesheet(XSLDoc)
		resDoc = xsltProcessor.transformToFragment(xmlResp,document)
		document.getElementById(targetObj).innerHTML = ''
		document.getElementById(targetObj).appendChild(resDoc)
	}else if(window.ActiveXObject){  //IE
		XSLDoc = new ActiveXObject("MSXML2.DOMDocument");
		XSLDoc.async = false
		XSLDoc.load(xslFile)
		//alert(xmlResp.transformNode(XSLDoc))
		//alert(document.getElementById(targetObj).innerHTML)		
		document.getElementById(targetObj).innerHTML = xmlResp.transformNode(XSLDoc)
	}

}
**/

function appendUsingXsl(xmlResp, xslFile, targetObj){

	//Notes:
	//xslFile must be local (on this server/domain).
	//xmlResp must be the 'responseXML' object.
	//targetObj is any object on the page that has a writable innerHTML property.

	var XSLDoc
	var resDoc

	if (window.XSLTProcessor){ //Mozilla
		var xsltProcessor = new XSLTProcessor()
			
		XSLDoc = document.implementation.createDocument('','',null)
		XSLDoc.async = false
		XSLDoc.load(xslFile)
			
		xsltProcessor.importStylesheet(XSLDoc)
		resDoc = xsltProcessor.transformToFragment(xmlResp,document)
		//document.getElementById(targetObj).innerHTML = ''
		document.getElementById(targetObj).appendChild(resDoc)
	}else if(window.ActiveXObject){  //IE
		XSLDoc = new ActiveXObject("MSXML2.DOMDocument");
		XSLDoc.async = false
		XSLDoc.load(xslFile)
		//alert(xmlResp.transformNode(XSLDoc))
		//alert(document.getElementById(targetObj).innerHTML)		
		document.getElementById(targetObj).innerHTML += xmlResp.transformNode(XSLDoc)
	}

}
function loadXMLString(strXMLDom, txt) {
    if (window.DOMParser) {
        return strXMLDom.parseFromString(txt, "text/xml");
    }
    else // Internet Explorer
    {
        strXMLDom.async = "false";
        strXMLDom.loadXML(txt);
    }
    return strXMLDom;
}

function nodeText(nObj){
	try {
		return nObj.firstChild.data
		}
	catch(err) {
		return ''
	}
}

function RemoteXmlGet(remoteurl, paramInObj, dataOutObj, dataOutArray){

	//NOTES
	//"remoteurl" 
	//	specifies URL that returns XML data
	//"paramInObj"
	//	object who's properties define the parameter names and hold the parameter
	//	values to be added to the URL being sent
	//"dataOutObj"
	//	object that returns data to the calling function.
	//	Properties defined in the object determine what we look for (parse) in the XML data.
	//  Properties can be arrays to hold multiple occurences of element in XML data, example: "this.xyz = new Array()"
	//"dataOutArray" (optional)
	//	if included, results will be returned in this array which will be an 
	//	"array of objects" that are constructed based on the dataOutObj.constructor. The
	//	actual "dataOutObj" will be empty, but IS required to get constructor info.


	var XMLTokReq
	var retInArray = false
	var retArrayLen = 0
	var pVal = ''
	var proxyFetchLoc = '/CommonFunctions/XMLProxyFetch.asp'
	url = proxyFetchLoc+'?remoteurl='+remoteurl
	for(var pName in paramInObj){
		//alert(pName)
		if (paramInObj[pName].constructor.toString().indexOf('Array') == -1){ 
			pVal = escape(paramInObj[pName])
			pVal = pVal.replace(/\+/g,'%2B')
			url += '&'+pName+'='+pVal
		}else{
			for(i=0;i<paramInObj[pName].length;++i){
				pVal = escape(paramInObj[pName][i])
				pVal = pVal.replace(/\+/g,'%2B')
				url += '&'+pName+'='+pVal
			}
		}
	}
	
	//alert(url)
	//if(UserID == '2'){
	//	var xmlWin = window.open(url,'urlDebug')
	//}
	
	XMLTokReq = (window.XMLHttpRequest) ? (new XMLHttpRequest()) : (new ActiveXObject("Microsoft.XMLHTTP"))
	XMLTokReq.open("GET", url, false)
	XMLTokReq.send(null)
	if (XMLTokReq.status == 200) {
		xmlDoc = XMLTokReq.responseXML
		if(dataOutArray){
			if(dataOutArray.constructor.toString().indexOf('Array') != -1){retInArray = true}
		}
		if (retInArray){
			//assume the length from the first element name
			for(var pName in dataOutObj){
				retArrayLen = xmlDoc.getElementsByTagName(pName).length
				break //just need the first one
			}
			for(i=0;i<retArrayLen;++i){
				dataOutArray[i] = new dataOutObj.constructor
				for(var pName in dataOutObj){
					retNode = xmlDoc.getElementsByTagName(pName)
					//dataOutArray[i][pName] = DomElmtData(xmlDoc, pName, i)
					dataOutArray[i][pName] = nodeText(retNode[i])
				}
			}
		}else{
			for(var pName in dataOutObj){
				retNode = xmlDoc.getElementsByTagName(pName)
				if (dataOutObj[pName].constructor.toString().indexOf('Array') == -1){ 
					//Not an Array, just use the first occurence (index 0)
					//dataOutObj[pName] = DomElmtData(xmlDoc, pName, 0)
					dataOutObj[pName] = nodeText(retNode[0])
				}else{
					//property IS an Array
					//	inefficient - don't do this//
					//	for(i=0;i<xmlDoc.getElementsByTagName(pName).length;++i){
					//		dataOutObj[pName][dataOutObj[pName].length] = DomElmtData(xmlDoc, pName, i)
					//	}
					for(i=0;i<retNode.length;++i){
						dataOutObj[pName][dataOutObj[pName].length] = nodeText(retNode[i])
					}
				}
			}
		}
		return true
	}else{
		dataOutObj.errorText = XMLTokReq.statusText
	}
	return false
	
}


function XmlGetParamObj(){
	//intentionally empty object
}
function XmlGetRetObj(){
	//intentionally empty object
}


