﻿if (window.XPathResult) {
  XPathResult.prototype.nextNode = function () {return this.iterateNext();}
}

/*
CAjax
 Constructor for Ajax object
Author: SLR 1/5/07
*/
function CAjax() {

  this.createHttp = CAjax_createHttp;
  this.createXslt = CAjax_createXslt;
  this.createXml = CAjax_createXml;
  this.getDocument = CAjax_getDocument;
  this.nodeFromId = CAjax_nodeFromId;
  this.outputXml = CAjax_outputXml
  this.selectNodes = CAjax_selectNodes;
  this.selectSingleNode = CAjax_selectSingleNode;
  this.setParam = CAjax_setParam;
  this.transform = CAjax_transform;
}

/*
CAjax_createHttp
  Creates the XmlHttpRequest object
*/
function CAjax_createHttp() {
  var oRetVal = null;
  
  if (window.XMLHttpRequest) {
    oRetVal = new XMLHttpRequest();
    if (oRetVal.overrideMimeType) {
      oRetVal.overrideMimeType('text/xml');
    }
  }
  else if (window.ActiveXObject) {
    try {
      oRetVal = new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch (e) {
      try {
         oRetVal = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
    }  
  }
  
  return oRetVal;
}

/*
CAjax_createXslt
  Creates the Xslt object
*/
function CAjax_createXslt(sUrl) {
  var oRetVal = null;
  var xslDoc;
  sUrl = sUrl.toLowerCase();
  
  if (window.XSLTProcessor) {
    xslDoc = this.createXml();
    xslDoc.load(sUrl);
    
    oRetVal = new XSLTProcessor();
    oRetVal.importStylesheet(xslDoc);
  }
  else if (window.ActiveXObject) {
    xslDoc = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.3.0");
    xslDoc.async = false;
    xslDoc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
    xslDoc.setProperty("SelectionLanguage", "XPath");
    xslDoc.load(sUrl);
    
    var xslt = new ActiveXObject("Msxml2.XSLTemplate");

    xslt.stylesheet = xslDoc;
    oRetVal = xslt.createProcessor();
  }
  
  return oRetVal;
}

/*
CAjax_createXml
  Creates the Xml DOM object
*/
function CAjax_createXml() {
  var oRetVal = null;
  
  if (document.implementation && document.implementation.createDocument) {
    oRetVal = document.implementation.createDocument("", "", null);
  }
  else if (window.ActiveXObject) {
    try {
      oRetVal = new ActiveXObject("MSXML2.DOMDocument.3.0");
      oRetVal.setProperty("SelectionLanguage", "XPath");
    }
    catch (err) {
      try {
        oRetVal = new ActiveXObject("Microsoft.FreeThreadedXMLDOM");
      }
      catch (err) {}
    }  
  }
  
  oRetVal.async = false;
  
  return oRetVal;
}

/*
CAjax_getDocument

*/
function CAjax_getDocument(ndNode) {
  return ndNode.ownerDocument ? ndNode.ownerDocument : ndNode;
}

/*
CAjax_nodeFromId

*/
function CAjax_nodeFromId(ndXml, sId) {
  var ndRetVal = null;
  var sName;
  
  if (!sId) sId = '';
  sId = sId.replace(/\D/gi, '');
  sName = sId.replace(/\d/gi, '');
  if (!sName) {
    sName = "*";
  }
  
  ndRetVal = this.selectSingleNode(ndXml, "//" + sName + "[@id = '" + sId + "']");
  
  return ndRetVal;
}

/*
CAjax_outputXml

*/
function CAjax_outputXml(ndXml) {
  var sRetVal = "";
  
  if (window.XMLSerializer) {
    sRetVal = new XMLSerializer().serializeToString(ndXml);
  }
  else {
    sRetVal = ndXml.xml;
  }
  
  return sRetVal;
}

/*
CAjax_selectNodes

*/
function CAjax_selectNodes(ndContext, sXPath) {
  var oRetVal = null;
  
  if (document.evaluate) {
    oRetVal = this.getDocument(ndContext).evaluate(sXPath, ndContext, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
  }
  else {
    oRetVal = ndContext.selectNodes(sXPath);
  }
  
  return oRetVal;
}

/*
CAjax_selectSingleNode

*/
function CAjax_selectSingleNode(ndContext, sXPath) {
  var oRetVal = null;
  
  if (document.evaluate) {
    oRetVal = this.getDocument(ndContext).evaluate(sXPath, ndContext, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  }
  else {
    oRetVal = ndContext.selectSingleNode(sXPath);
  }
  
  return oRetVal;
}

/*
CAjax_setParam

*/
function CAjax_setParam(xsltProc, sName, oValue) {
  if (document.evaluate) {
    xsltProc.setParameter(null, sName, oValue);
  }
  else {
    xsltProc.addParameter(sName, oValue);
  }
}

/*
CAjax_transform

*/
function CAjax_transform(ndXml, xsltProc, eDest) {
  if (document.evaluate) {
    eDest.appendChild(xsltProc.transformToFragment(ndXml, document));
  }
  else {
    xsltProc.input = ndXml;
    xsltProc.transform();
    eDest.innerHTML = xsltProc.output;
  }
}
