if (!window.ActiveXObject && window.XMLHttpRequest) {

  /* Adding xml property to Mozilla's Node object */

  Node.prototype.__defineGetter__("xml", function() {

    var xmlSerializer = new XMLSerializer();

    return xmlSerializer.serializeToString(this, "text/xml");

  });

  

  /* Adding parseError property to Mozilla's Document object */

  function ParseErrorObject(xmlError)

  {

	if (xmlError == null) {

	  this.errorCode = 0;

	  this.filepos = -1;

	  this.line = -1;

	  this.linepos = -1;

	  this.reason = null;

	  this.srcText = null;

	  this.url = null;

	  this.valueOf = function() {return this.errorCode;}

	  this.toString = function() {return this.errorCode.toString();}

	} else {

      var reError = null;

      if (xmlError.toLowerCase().indeOx("ubicacion")) {

	    reError = />([\s\S]*?)Ubicacion:([\s\S]*?)Numero de linea (\d+), columna (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;

      } else {

        reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column(\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;

      }

      reError.test(xmlError);

      this.errorCode = -999999;

      this.reason = RegExp.$1;

      this.url = RegExp.$2;

      this.line = parseInt(RegExp.$3);

      this.linepos = parseInt(RegExp.$4);

      this.srcText = RegExp.$5;	    

	}

	return this;

  }

  

  Document.prototype.__defineGetter__

  (

    "parseError",

	function()

	{

	  if (this.documentElement.tagName=="parsererror") {

		return new ParseErrorObject(this.xml);

	  } else {

		return new ParseErrorObject(null);

	  }

    }

  );  

  

  Document.prototype.setProperty = function(sName, sValue)

  {

  };

}



/* Adding selectNodes and selectSingleNodes methods to Mozilla's Node object */

if (window.XPathEvaluator) { 

  XPathResult.prototype.__defineGetter__

  (

    "length",

    function()

    {

      return this.snapshotLength;

    }

  );

  

  XPathResult.prototype.item = function(iIndex)

  {

    return this.snapshotItem(iIndex);

  };

  

  var xpathEvaluator = new XPathEvaluator();

  

  if (!Node.prototype.selectSingleNode) {

    Node.prototype.selectSingleNode = function(sXPathExpression)

    {

      return xpathEvaluator.evaluate(sXPathExpression, this, xpathEvaluator.createNSResolver(this), XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

    }

  }

  

  if (!Node.prototype.selectNodes) {

    Node.prototype.selectNodes = function(sXPathExpression)

    {

      return xpathEvaluator.evaluate(sXPathExpression, this, xpathEvaluator.createNSResolver(this), XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

    }    

  }

}



var ieActiveXObjects = new Array();



function CreateXMLHttpRequest()

{

  var oXMLHttpRequest = null;

  if (window.ActiveXObject) {

    /* IE */

    var msxmls = new Array("MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "MICROSOFT.XMLHTTP");

    for (var i=0; i<msxmls.length; i++) {

      try {

        oXMLHttpRequest = new ActiveXObject(msxmls[i]);

      } catch (e) {

	    oXMLHttpRequest = null;

      }

	  if (oXMLHttpRequest!=null) {

        ieActiveXObjects["XMLHTTP"] = msxmls[i];

	    break;

	  }

    }     

  } else {

    /* Mozilla */

    try {

      oXMLHttpRequest = new XMLHttpRequest();

    } catch (e) {

      oXMLHttpRequest = null;

    }

  }

  return oXMLHttpRequest;

}



/* Create XML funcionality

*****************************************************************************/

function CreateDocument()

{

  var oDOMDocument = null;



  if (window.ActiveXObject) {

  	var aux;

    /* IE */

    var msxmls = new Array("Msxml2.DOMDocument.4.0", "MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom");

    for (var i=0; i<msxmls.length; i++) {

      try {

        oDOMDocument = new ActiveXObject(msxmls[i]);

      } catch (e) {

	    oDOMDocument = null;

      }

	  if (oDOMDocument!=null) {

	  	aux = msxmls[i];

	    break;

	  }

    }

  } else if (document.implementation && document.implementation.createDocument) {

    /* Mozilla */

    oDOMDocument = document.implementation.createDocument("", "", null);

  }

  return oDOMDocument;  

}



/* XSLT/XPath funcionality

*****************************************************************************/

function LoadXslt(xsltSrc)

{

  if (window.ActiveXObject) {

    var oFreeThreadedDOMDocument = null;

    var msxmls = new Array("Msxml2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.5.0", "MSXML2.FreeThreadedDOMDocument.4.0", "MSXML2.FreeThreadedDOMDocument.3.0", "MSXML2.FreeThreadedDOMDocument");

    for (var i=0; i<msxmls.length; i++) {

      try {

        oFreeThreadedDOMDocument = new ActiveXObject(msxmls[i]);

      } catch (e) {

	    oFreeThreadedDOMDocument = null;

      }

	  if (oFreeThreadedDOMDocument!=null) {

        ieActiveXObjects["FreeThreadedDOMDocument"] = msxmls[i];

	    break;

	  }

    }

    if (oFreeThreadedDOMDocument!=null) {

      oFreeThreadedDOMDocument.async = false;

      oFreeThreadedDOMDocument.load(xsltSrc);

      return oFreeThreadedDOMDocument;

    }  

  } else {

    var oXMLHttpRequest = CreateXMLHttpRequest();

    if (oXMLHttpRequest!=null) {

      oXMLHttpRequest.open("GET", xsltSrc, false);

	  oXMLHttpRequest.setRequestHeader("Cache-Control", "no-cache");

      oXMLHttpRequest.send(null);

      return oXMLHttpRequest.responseXML;

    }

  }

}



function LoadXmlFromStr(s){

	var oDoc = null;

	if (window.ActiveXObject) {

		oDoc = CreateDocument();

		oDoc.async="false";

  		oDoc.loadXML(s);

	}else if (document.implementation && document.implementation.createDocument) {

		var parser=new DOMParser();

  		oDoc = parser.parseFromString(s,"text/xml");

	}

	return oDoc;

}



function CreateXsltProcessor(xsltSrc)

{

  var oXsltProcessor = null;

  try {

    var oXsltDoc = LoadXslt(xsltSrc);

    if (window.ActiveXObject) {

      var oXSLTemplate = null;

      var msxmls = new Array("Msxml2.XSLTemplate.4.0", "MSXML2.XSLTemplate.5.0", "MSXML2.XSLTemplate.4.0", "MSXML2.XSLTemplate.3.0", "MSXML2.XSLTemplate");

      for (var i=0; i<msxmls.length; i++) {

        try {

          oXSLTemplate = new ActiveXObject(msxmls[i]);

        } catch (e) {

	      oXSLTemplate = null;

        }

	    if (oXSLTemplate!=null) {

          ieActiveXObjects["XSLTemplate"] = msxmls[i];

	      break;

	    }

      }

      if (oXSLTemplate!=null) {  

        oXSLTemplate.stylesheet = oXsltDoc;

        oXsltProcessor = oXSLTemplate.createProcessor();

      }

    } else {

      oXsltProcessor = new XSLTProcessor();

      oXsltProcessor.importStylesheet(oXsltDoc);

    }

  } catch (e) {

    oXsltProcessor = null;

  }

  return oXsltProcessor;

}



function ApplyTransformation(oXmlDoc, oXsltProcessor, oParams)

{

  var output = null;  

  if (window.ActiveXObject) {

    oXsltProcessor.input = oXmlDoc;

    if (arguments.length==3) {

      for (var sParamName in oParams) {

        oXsltProcessor.addParameter(sParamName, oParams[sParamName]);

      }

    }

    oXsltProcessor.transform();

    output = oXsltProcessor.output;

  } else {

    var oOutputDoc;

    if (arguments.length==3) {

      for (var sParamName in oParams) {

        oXsltProcessor.setParameter("", sParamName, oParams[sParamName]);

      }

    }

    oOutputDoc = oXsltProcessor.transformToDocument(oXmlDoc);

    var xmlSerializer = new XMLSerializer();

    output = DisableOutputEscapingAdjust(xmlSerializer.serializeToString(oOutputDoc));

  }

  return ForceCloseTagAdjust(output);

}



/* Utils

*****************************************************************************/

function DisableOutputEscapingAdjust(s)

{

  var res = [[new RegExp("&lt;", "gi"), "<"], [new RegExp("&gt;", "gi"), ">"], [new RegExp("&amp;", "gi"), "&"]];

  var output = s;

  var length = res.length;

  for(var i=0; i<length; i++) {

    output = output.replace(res[i][0], res[i][1]);

  }

  return output;

}



function ForceCloseTagAdjust(s)

{

  var res = [[new RegExp("\\$ForceCloseTab\\$", "gi"), ""]];

  var output = s;

  var length = res.length;

  for(var i=0; i<length; i++) {

    output = output.replace(res[i][0], res[i][1]);

  }

  return output;

}

