// CRIA E RETORNA UM OBJETO HTTPREQUEST
function getConector()
{
   var xmlreq = false;
   if (window.XMLHttpRequest)
   {
      xmlreq = new XMLHttpRequest();
   }
   else if (window.ActiveXObject) {
      try {
         xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch (e1) {
         try {
            xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
         }
         catch (e2) {
         }
      }
   }
   return xmlreq;
}

// OBJETO AJAX
function tAjax()
{
   this.LastModified = 'Sat, 1 Jan 2000 00:00:00 GMT';
   this.xmlreq = getConector();
   this.getXML = function (url,responseXmlHandler,extra)
   {
      if ( ! this.xmlreq ) return false;
      var myself = this;
      this.xmlreq.open("GET", url , true);
      this.xmlreq.onreadystatechange = function()
      {
         // 0 - UNINITIALIZED, open() has not been called.
         // 1 - LOADING, open() has been called but send() has not been called.
         // 2 - LOADED, send() has been called and the response status and headers have been received.
         // 3 - INTERACTIVE, the response data is being downloaded.
         // 4 - COMPLETE, the request has completed and all response data has been

         if (myself.xmlreq.readyState < 4)
         {
            //document.getElementById("mensagem").innerHTML = "Carregando";
            window.status = 'Carregando...';
         }
         else if (myself.xmlreq.readyState == 4)
         {
            // 304 = Not Modified cached version
            if ( myself.xmlreq.status == 200 || myself.xmlreq.status == 304)
            {
               myself.LastModified = myself.xmlreq.getResponseHeader("Last-Modified");
               //alert(myself.xmlreq.responseText)
               responseXmlHandler(myself.xmlreq.responseXML,extra);
            }
            //document.getElementById("mensagem").innerHTML = "Ok";
            window.status = '';
         }
      }
      this.xmlreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      this.xmlreq.setRequestHeader("If-Modified-Since", this.LastModified );
      this.xmlreq.send(null);
   }
}

// CRIA E RETORNA UM OBJETO XML (OPCIONALMENTE COM UM ELEMENTO RAIZ)
function criaXMLDoc(rootElement) {
   var xmldoc = false;
   if (window.DOMParser) {
      xmldoc = new DOMParser();
      if (rootElement) {
         xmldoc = xmldoc.parseFromString("<"+rootElement+"></"+rootElement+">", "text/xml");
      }
   }
   else if (window.ActiveXObject) {
      try {
         xmldoc = new ActiveXObject("Msxml2.DOMDocument");
      }
      catch (e1) {
         try {
            xmldoc = new ActiveXObject("Microsoft.XMLDOM");
         } catch (e2) {
         }
      }
      if (rootElement) {
         xmldoc.appendChild(xmldoc.createNode("element", rootElement, ""));
      }
   }
   return xmldoc;
}

// CRIA E RETORNA UM NODE XML (OPCIONALMENTE COM UM TEXTNODE DENTRO)
function criaXMLNode(nodename, texto)
{
   var myXml = criaXMLDoc("DUMMY");
   var nodeElm = (window.ActiveXObject) ? myXml.createNode("element", nodename, "") : myXml.createElement(nodename);
   if (texto != 'undefined')
   {
      var nodeTxt = myXml.createTextNode(texto+"");
      nodeElm.appendChild(nodeTxt);
   }
   return nodeElm;
}

// CARREGA E TRANSFORMA TEMPLATES XSLT
function tXslt()
{
   this.init = function (url, divname) {
      this.conteudo = divname;
      var xmlreq = getConector();
      if ( ! xmlreq ) { return false; }
      xmlreq.open("GET", url, false);
      xmlreq.send("");
      if (window.ActiveXObject) {
         this.xsltp = criaXMLDoc();
         this.xsltp.async = false;
         this.xsltp.load(url);
      } else {
         this.xsltp = new XSLTProcessor();
         this.xsltp.importStylesheet(xmlreq.responseXML);
      }
   }

   this.transform = function (xmldoc) {
      if (window.ActiveXObject) {
         var fragment = xmldoc.transformNode(this.xsltp);
         fragment = fragment.replace(/&lt;/g, "<");
         fragment = fragment.replace(/&gt;/g, ">");
         document.getElementById(this.conteudo).innerHTML = fragment;
      } else {
         var fragment = this.xsltp.transformToFragment(xmldoc, document);
         document.getElementById(this.conteudo).innerHTML = "";
         document.getElementById("donotdelete").innerHTML = "";
         document.getElementById("donotdelete").appendChild(fragment);
         var ihtm = document.getElementById("donotdelete").innerHTML;
         ihtm = ihtm.replace(/&lt;/g, "<");
         ihtm = ihtm.replace(/&gt;/g, ">");
         document.getElementById("donotdelete").innerHTML = "";
         document.getElementById(this.conteudo).innerHTML = ihtm;
      }
   }
}