/*
 * Sarissa XML library v 0.9 beta 4
 * Author: Manos Batsis, mailto: mbatsis@netsmart.gr
 *
 * This source code is distributed under the GNU GPL version 2 (see sarissa_license_gpl.txt) or higher, if
 * a more recent version has been released.
 * In case your copy of Sarissa does not include a copy of the license, you may find it online at
 * http://www.gnu.org/copyleft/gpl.html
 */
// some basic browser detection
var _SARISSA_IS_IE = (navigator.userAgent.toLowerCase().indexOf("msie") > -1)?true:false;
var _SARISSA_IS_MOZ = (document.implementation && document.implementation.createDocument)?true:false;
var _sarissa_iNsCounter = 0;
var _SARISSA_IEPREFIX4XSLPARAM = "";
if (_SARISSA_IS_MOZ) {
    //============================================
    // Section: Factory methods for Moz
    //============================================
    // @param sUri the namespace of the root node (if any)
    // @param sUri the local name of the root node (if any)
    // @return a DOM Document
    Sarissa.getDomDocument = function(sUri, sName) {
        var oDoc = document.implementation.createDocument(sUri, sName, null);
        oDoc.addEventListener("load", _sarissa__XMLDocument_onload, false);
        return oDoc;
    };
    // AFAIK, the object behaves exactly like
    // IE's IXMLHTTPRequest)
    // @return a XmlHttpRequst object suitable for Moz
    Sarissa.getXmlHttpRequest = function() {
        return new XMLHttpRequest();
    };
    //============================================
    // Section: utility functions for internal use
    //============================================
    // Attached by an event handler to the load event.
    function _sarissa__XMLDocument_onload() {
        _sarissa_loadHandler(this);
    };
    // Ensures the document was loaded correctly, otherwise sets the parseError to -1
    // to indicate something went wrong.
    function _sarissa_loadHandler(oDoc) {
        if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")
            oDoc.parseError = -1;
        _sarissa_setReadyState(oDoc, 4);
    };
    // Sets the readyState property
    function _sarissa_setReadyState(oDoc, iReadyState) {
        oDoc.readyState = iReadyState;
        if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")
            oDoc.onreadystatechange();
    };

    XMLDocument.prototype._sarissa_clearDOM = function() {
        while(this.hasChildNodes())
            this.removeChild(this.firstChild);
    }
    // Replaces the contents of the object with the contents of
    // the object given as the parameter
    XMLDocument.prototype._sarissa_copyDOM = function(oDoc) {
        this._sarissa_clearDOM();
        // importNode is not yet needed in Moz due to a bug but it will be
        // fixed so...
        var oNodes = oDoc.childNodes;
        for(i=0;i<oNodes.length;i++)
            this.appendChild(this.importNode(oNodes[i], true));
    };
    var _SARISSA_WSMULT = new RegExp("^\\s*|\\s*$", "g");
    var _SARISSA_WSENDS = new RegExp("\\s\\s+", "g");
    function _sarissa_normalizeText(sIn) {
        return sIn.replace(_SARISSA_WSENDS, " ").replace(_SARISSA_WSMULT, " ");
    }
    //============================================
    // Section: Extending Mozilla's DOM implementation
    // to emulate IE extentions
    //============================================
    // Parses the String given as parameter to build the document content
    // for the object, exactly like IE's loadXML().
    // @return the old contents serialized to String (xml)
    XMLDocument.prototype.loadXML = function(strXML) {
        _sarissa_setReadyState(this, 1);
        var sOldXML = this.xml;
        var oDoc = (new DOMParser()).parseFromString(strXML, "text/xml");
        _sarissa_setReadyState(this, 2);
        this._sarissa_copyDOM(oDoc);
        _sarissa_setReadyState(this, 3);
        _sarissa_loadHandler(this);
        return sOldXML;
    };
    // Emulates IE's xml property. Gives an XML serialization of the DOM Object
    XMLDocument.prototype.__defineGetter__("xml", function () {
        return (new XMLSerializer()).serializeToString(this);
    });
    // Emulates IE's xml property. Gives an XML serialization of the DOM Object
    Node.prototype.__defineGetter__("xml", function () {
        return (new XMLSerializer()).serializeToString(this);
    });
    // Ensures and informs the xml property is read only
    XMLDocument.prototype.__defineSetter__("xml", function () {
        throw "Invalid assignment on read-only property 'xml'. Hint: Use the 'loadXML(String xml)' method instead. (original exception: "+e+")";
    });
    // Emulates IE's innerText (write). Note that this removes all childNodes of
    // an Element and just replaces it with a textNode
    HTMLElement.prototype.__defineSetter__("innerText", function (sText) {
        var s = "" + sText;
        this.innerHTML = s.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    });
    // Emulate IE's innerText (read). Gives the concatenation of all text nodes under the Element
    HTMLElement.prototype.__defineGetter__("innerText", function () {
        return _sarissa_normalizeText(this.innerHTML.replace(/<[^>]+>/g,""));
    });
    // Emulate IE's onreadystatechange attribute
    // used as a listener to the onreadystatechange event (also emulated)
    Document.prototype.onreadystatechange = null;
    // Emulate IE's parseError attribute
    Document.prototype.parseError = 0;
    // Emulates IE's readyState property, which always gives an integer from 0 to 4:
    // 1 == LOADING
    // 2 == LOADED
    // 3 == INTERACTIVE
    // 4 == COMPLETED
    XMLDocument.prototype.readyState = 0;
    // Emulates IE's async property. It controls whether loading of
    // remote XML files works synchronously or asynchronously.
    // NOTE: setting async to false will only work with documents
    // called over HTTP (meaning a server), not the local file system,
    // unless you are using Moz 1.4.
    // BTW the try>catch block is for 1.4; I haven't found a way to check if the property is implemented without
    // causing an error and I dont want to use user agent stuff for that...
    try{
        XMLDocument.prototype.async = true;
    }catch(e){/*trap*/}
    // Keeps a handle to the original load() method
    XMLDocument.prototype._sarissa_load = XMLDocument.prototype.load;
    /** Extends the load method to provide synchronous loading
     * using an XMLHttpRequest object (if async is set to false)
     * @return the DOM Object as it was before the load() call (may be empty)
     */
    XMLDocument.prototype.load = function(sURI) {
        var oDoc = document.implementation.createDocument("", "", null);
        oDoc._sarissa_copyDOM(this);
        this.parseError = 0;
        _sarissa_setReadyState(this, 1);
        try {
            if(this.async == false) {
                var tmp = new XMLHttpRequest();
                tmp.open("GET", sURI, false);
                tmp.overrideMimeType("text/xml");
                tmp.send(null);
                _sarissa_setReadyState(this, 2);
                this._sarissa_copyDOM(tmp.responseXML);
                _sarissa_setReadyState(this, 3);
            }
            else
                this._sarissa_load(sURI);
        }
        catch (objException) {
            this.parseError = -1;
        }
        finally {
            _sarissa_loadHandler(this);
        }
        return oDoc;
    };
    // Emulate IE's transformNodeToObject
    Document.prototype.transformNodeToObject = function(xslDoc, oResult) {
        var xsltProcessor = null;
        try {
            xsltProcessor = new XSLTProcessor();
            if(xsltProcessor.reset) {
                // new nsIXSLTProcessor is available
                xsltProcessor.importStylesheet(xslDoc);
                var newFragment = xsltProcessor.transformToFragment(this, oResult);
                oResult._sarissa_copyDOM(newFragment);
            }
            else {
                // only nsIXSLTProcessorObsolete is available
                xsltProcessor.transformDocument(this, xslDoc, oResult, null);
            }
        }
        catch(e) {
            if(xslDoc && oResult)
                throw "Sarissa_TransformNodeToObjectException: Failed to transform document. (original exception: "+e+")";
            else if(!xslDoc)
                throw "Sarissa_TransformNodeToObjectException: No Stylesheet Document was provided. (original exception: "+e+")";
            else if(!oResult)
                throw "Sarissa_TransformNodeToObjectException: No Result Document was provided. (original exception: "+e+")";
            else if(xsltProcessor == null)
                throw "Sarissa_XSLTProcessorNotAvailableException: Could not instantiate an XSLTProcessor object. (original exception: "+e+")";
            else
                throw e;
        }
    };
    // Emulate IE's transformNode() method. Gives the result XML serialised to a String
    Document.prototype.transformNode = function(xslDoc) {
        var out = document.implementation.createDocument("", "", null);
        this.transformNodeToObject(xslDoc, out);
        var str = null;
        try {
            var serializer = new XMLSerializer();
            str = serializer.serializeToString(out);
        }
        catch(e) {
            throw "Sarissa_TransformNodeException: Failed to serialize result document. (original exception: "+e+")";
        }
        return str;
    };
    // Extend the Array to behave as a NodeList
    Array.prototype.item = function(i) {
        return this[i];
    };
    // add IE's expr property
    Array.prototype.expr = "";
    // dummy, used to accept IE's stuff without throwing errors
    XMLDocument.prototype.setProperty  = function(x,y){};
    // Emulate IE's selectNodes
    XMLDocument.prototype.selectNodes = function(sExpr, contextNode) {
        var oResult = this.evaluate(sExpr, (contextNode?contextNode:this),
            this.createNSResolver(this.documentElement),
            XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        var nodeList = new Array(oResult.snapshotLength);
        nodeList.expr = sExpr;
        for(i=0;i<nodeList.length;i++)
            nodeList[i] = oResult.snapshotItem(i);
        return nodeList;
    };
    Element.prototype.selectNodes = function(sExpr) {
        var doc = this.ownerDocument;
        if(doc.selectNodes)
            return doc.selectNodes(sExpr, this);
        else
            throw "SarissaXPathOperationException: Method selectNodes is only supported by XML Nodes";
    };
    // Emulate IE's selectSingleNode
    XMLDocument.prototype.selectSingleNode = function(sExpr, contextNode) {
        var ctx = contextNode?contextNode:null;
        sExpr += "[1]";
        var nodeList = this.selectNodes(sExpr, ctx);
        if(nodeList.length > 0)
            return nodeList[0];
        else
            return null;
    };
    Element.prototype.selectSingleNode = function(sExpr) {
        var doc = this.ownerDocument;
        if(doc.selectSingleNode)
            return doc.selectSingleNode(sExpr, this);
        else
            throw "SarissaXPathOperationException: Method selectSingleNode is only supported by XML Nodes. (original exception: "+e+")";
    };
}
else if (_SARISSA_IS_IE) {
    //============================================
    // Section: IE Initialization
    //============================================
    // Add NodeType constants; missing in IE4, 5 and 6
    if(!window.Node) {
        var Node = {
            ELEMENT_NODE: 1,
            ATTRIBUTE_NODE: 2,
            TEXT_NODE: 3,
            CDATA_SECTION_NODE: 4,
            ENTITY_REFERENCE_NODE: 5,
            ENTITY_NODE: 6,
            PROCESSING_INSTRUCTION_NODE: 7,
            COMMENT_NODE: 8,
            DOCUMENT_NODE: 9,
            DOCUMENT_TYPE_NODE: 10,
            DOCUMENT_FRAGMENT_NODE: 11,
            NOTATION_NODE: 12
        }
    }
    // for XSLT parameter names
    _SARISSA_IEPREFIX4XSLPARAM = "xsl:";
    // used to store the most recent ProgID available out of the above
    var _SARISSA_DOM_PROGID = "";
    var _SARISSA_XMLHTTP_PROGID = "";
    // used to pick most recent ProgIDs
    function pickRecentProgID(idList) {
        // found progID flag
        var bFound = false;
        for (var i=0; i < idList.length && !bFound; i++) {
            try {
                var oDoc = new ActiveXObject(idList[i]);
                o2Store = idList[i];
                bFound = true;
            }
            catch (objException) {
            // trap; try next progID
            }
        }
        if (!bFound)
            throw "Sarissa_Exception: Could not retreive a valid progID of Class: " + idList[idList.length-1]+". (original exception: "+e+")";
        idList = null;
        return o2Store;
    };
    // store proper progIDs
    _SARISSA_DOM_PROGID = pickRecentProgID(["Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom"]);
    _SARISSA_XMLHTTP_PROGID = pickRecentProgID(["Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]);
    // we dont need this anymore
    pickRecentProgID = null;
    //============================================
    // Section: Factory methods (IE)
    //============================================
    // Factory method, returns a DOMDocument suitable for IE
    Sarissa.getDomDocument = function(sUri, sName) {
        var oDoc = new ActiveXObject(_SARISSA_DOM_PROGID);
        // if a root tag name was provided, we need to load it in the DOM object
        if (sName) {
            // if needed, create an artifical namespace prefix the way Moz does
            if (sUri) {
                oDoc.loadXML("<a" + _sarissa_iNsCounter + ":" + sName + " xmlns:a" + _sarissa_iNsCounter + "=\"" + sUri + "\" />");
                // don't use the same prefix again
                ++_sarissa_iNsCounter;
            }
            else
                oDoc.loadXML("<" + sName + "/>");
        }
        return oDoc;
    };
    // Factory method, returns an IXMLHTTPRequest object
    // AFAIK, the object behaves exactly like
    // Mozilla's XmlHttpRequest
    Sarissa.getXmlHttpRequest = function() {
        return new ActiveXObject(_SARISSA_XMLHTTP_PROGID);
    };
}
// Factory Class
function Sarissa(){}
// Common factory method, used to set xslt parameters.
// TODO: figure out how to implement support for both Mozilla's and IE's
// XSL Processor objects to improove performance for reusable stylesheets.
// @param oXslDoc the target XSLT DOM Document
// @param sParamName the name of the XSLT parameter
// @param sParamValue the value of the XSLT parameter
// @return whether the parameter was set succefully
Sarissa.setXslParameter = function(oXslDoc, sParamQName, sParamValue) {
    try {
        var params = oXslDoc.getElementsByTagName(_SARISSA_IEPREFIX4XSLPARAM+"param");
        var iLength = params.length;
        var bFound = false;
        var param;

        if(sParamValue) {
            for(i=0; i < iLength && !bFound;i++) {
                // match a param name attribute with the name given as argument
                if(params[i].getAttribute("name") == sParamQName) {
                    param = params[i];
                    // clean up the parameter
                    while(param.firstChild)
                        param.removeChild(param.firstChild);
                    if(!sParamValue || sParamValue == null) {
                    // do nothing; we've cleaned up the parameter anyway
                    }
                    // if String
                    else if(typeof sParamValue == "string") {
                        param.setAttribute("select", sParamValue);
                        bFound = true;
                    }
                    // if node
                    else if(sParamValue.nodeName) {
                        param.removeAttribute("select");
                        param.appendChild(sParamValue.cloneNode(true));
                        bFound = true;
                    }
                    // if NodeList
                    else if (sParamValue.item(0)
                        && sParamValue.item(0).nodeType) {
                        for(j=0;j < sParamValue.length;j++)
                            if(sParamValue.item(j).nodeType) // check if this is a Node
                                param.appendChild(sParamValue.item(j).cloneNode(true));
                        bFound = true;
                    }
                    // if Array or IE's IXMLDOMNodeList
                    else
                        throw "SarissaTypeMissMatchException in method: Sarissa.setXslParameter. (original exception: "+e+")";
                }
            }
        }
        return bFound;
    }
    catch(e) {
        throw e;
        return false;
    }
}
// EOF
/**
 *  Ajax.js
 *  Criada por Luciano Ulhoa
 *  Data de criação: 20/10/2008
 **/
var Ajax = new Object();
/**
 * MÉTODO PARA CRIAR UMA VARIÁVEL TIPO XML objeto DOM
 */
Ajax.criarDOM = function(retorno) {
    var xmlDoc;

    try {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
    } catch (e) {
        xmlDoc = Sarissa.getDomDocument();
        //xmlDoc = document.implementation.createDocument("", "", null);
        xmlDoc.async = false;
    }

    if (!xmlDoc) {
        //Nao conseguiu instanciar o objeto xmlhttp para fazer as solicitacoes
        alert("Erro ao criar objeto DOM.\nSeu browser pode não suportar o objeto XML.\n\nFavor informar ao administrador do sistema.");
    }

    return xmlDoc;
};

/**
 * FUNÇÕES GETTERS E SETTERS PARA GERENCIAMENTO DE ERRO
 */
Ajax.setError = function(error){

            Ajax.error = error

            return true;

}

Ajax.getError = function(){

            return Ajax.error;

}

Ajax.setMsgError = function(msgError){

            Ajax.msgError = msgError;

            return true;

}

Ajax.getMsgError = function(){

            return Ajax.msgError;

}



/**
 * MÉTODO PARA CRIAR UMA VARIÁVEL TIPO XMLHTTP REQUEST DO AJAX objeto XMLHttpRequest
 */
Ajax.criarHTTP = function(ocorrenciaNormal) {
    var xmlhttp;

    try {
        //cria o objeto caso o Browser
        //seja compatível com o W3C
        xmlhttp = new XMLHttpRequest();
        if (xmlhttp.overrideMimeType) {
            xmlhttp.overrideMimeType('text/xml');
        }
    } catch(e) {
        //caso IE < IE7
        //array com versões conhecidas
        //de implementações do ActiveX
        var msxml = ['MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
        for (var i = 0, len = msxml.length; i < len; ++i) {
            try {
                //varre o array até identificar qual ActiveX
                xmlhttp = new ActiveXObject(msxml[i]);
                break;
            } catch(e) {
                xmlhttp = false;
            }
        }
    }

    if (!xmlhttp) {
        //Nao conseguiu instanciar o objeto xmlhttp para fazer as solicitacoes
        alert("Erro ao criar objeto AJAX.\nSeu browser pode não suportar o objeto XMLHttpRequest.\n\nFavor informar ao administrador do sistema.");
    }

    return xmlhttp;
};


/** Ajax.getXML
  - Descrição	 : Recupera um xml e atribui a um objeto xml de retorno, que
  - Evento	 : Não
  - Dependência	 : Não
  - Exibe alerta : Sim -> é necessário implementar montarCaixaMensagem(sTituloJanela,sSeveridade,sMensagem,sTipoMensagem,sAcao,sAcao)
  - Exemplo	 : Padrão: 
		   var xmlRetorno = Ajax.criarDOM();
		   Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191",xmlRetorno);
		   alert(xmlRetorno.xml);

		   ou 

		   Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191");
		   alert(Ajax.retorno.xml);
		  
		   ou 

		   var xmlRetorno = Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191");
		   alert(xmlRetorno.xml);

  - Observação	 : Caso o parametro xmlRetorno não seja informado, o estado do xml de retorno não é mantido.
		   Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191");
		   alert(Ajax.retorno.xml);
		   Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00063514923");
		   alert(Ajax.retorno.xml);
		   
                   or

		   var xml1 = Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191");
		   var xml2 = Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00063514923");
		   O xml2 sobrepos o xml1


  @param string sPagina
  Página que retorna o xml
  @param opcional string xmlRetorno
  Objeto xml que recebe o retorno da função
  @return Object xml
  retorna o objeto xml contendo o retorno da função
  **/

//O ultimo parametro é opcional 
Ajax.getXML = function(sPagina, xmlRetorno,sProcessando){

 	    var aArgumentos = sPagina.split("?");

	    if(aArgumentos.length > 1){
		sPagina += "&nocCache=" + Math.random();
	    }else{
		sPagina += "?nocCache=" + Math.random();	
	    }

	 if(xmlRetorno){
	    Ajax.enviar("GET", sPagina, false, sProcessando, Ajax.getMsgError(), "", xmlRetorno)
	    return xmlRetorno;
	 }else{
	   if(!Ajax.retorno){Ajax.retorno = Ajax.criarDOM()}
   	   Ajax.enviar("GET", sPagina, false, sProcessando, Ajax.getMsgError(), "", Ajax.retorno);
	   return Ajax.retorno;
	 }
}


/** Ajax.carregarDiv
  - Descrição	 : Processa um xml apartir de um xsl e atribui o resultado em uma div
  - Evento	 : Não
  - Dependência	 : Não
  - Exibe alerta : Não
  - Exemplo	 : var xmlPessoaFisica = Ajax.criarDOM();
		   var xslPessoaFisica = Ajax.criarDOM();
		   Ajax.getXML("/mte_corporativo/usogeral/consultarPorNRCPF_xml.asp?NRCPF=00000000191",xmlPessoaFisica);
		   Ajax.getXML("/mte_corporativo/exemplos/CPF.xsl", xslPessoaFisica);
  		   Ajax.carregarDiv(xmlPessoaFisica, xslPessoaFisica, "divTeste")
		   <html>
			   <body>
			   	<div id="divTeste" ></div>
			   </body>
		   </html>


  @param Object oXML
  Objeto XML que contém os dados que serão processados
  @param Object oXSL
  Objeto XSL que aplicará formatação aos dados do XML
  @param Object sDIV
  Elemento que receberá o contéudo formatado

  @return bool
  **/

Ajax.carregarDiv = function(oXML, oXSL, sDiv){
	    if(!Ajax.aux){Ajax.aux = Ajax.criarDOM()}
            oXML.transformNodeToObject(oXSL, Ajax.aux);
            document.getElementById(sDiv).innerHTML = Ajax.aux.xml;
            return true;        
}


Ajax.setXML = function (sXML, OBJXML){

	var aArgumentos = sXML.split("?");
	if(aArgumentos.length > 1){
		sXML += "&nocCache=" + Math.random();
	}else{
		sXML += "?nocCache=" + Math.random();	
	}

	    if(!Ajax.retorno){Ajax.retorno = Ajax.criarDOM()}

	    Ajax.enviar("POST",sXML,false,"",Ajax.getMsgError(),OBJXML,Ajax.retorno,"");


	    if(Ajax.retorno){
            return Ajax.retorno
	    }else{
		return null
	    }
}




/**
 * EXECUTA O AJAX PASSANDO A URL
 */
Ajax.enviar = function(metodo, url, tipoReq, id_target, msg, xmlSend, xmlResultado) {
    /***
	 **	Ajax.enviar(
	 **	metodo, -> Se GET ou POST
	 **	url, -> URL que quer envia para consultar Exemplo:  "pnpeConsultar.asp?" + "strUsuario=" + $('strUsuario').value + "&tipoRetorno=xml" + "&nomeSP=SPConsultarCursoInstituicaoXML" + "&nocache=" + Math.random()
	 **	tipoReq, -> Sincrono ou assincrono (true ou false);
	 **	id_target, -> ID da div ou da combo que queira aparecer uma mensagem carregando, caso vazio aparece o gif processando
	**	msg, ->  Mensagem que será exibida caso seja passado o ID da combo.
	**	xmlSend, ->  caso preencha com um xml valido envia para consulta caso vazio a consulta sera feita via URL.
	**	xmlResultado,  -> xml que será retornado o resultado da consulta
	**	xmlHTTP) -> xmlHTTPRequest da criação do ajax.
	 ***/
    var textResultado = "";
    var xmlHTTP = Ajax.criarHTTP(); //HTTP request Object
    if (metodo == "" || metodo == null) {	//Se nao tiver definido nada, usa POST
        metodo = "POST";
    }
    var objAjax = new AjaxFuncoes();

    url = objAjax.ReplaceAll(url, " ", "%20");
    url = objAjax.TrataAcento(url);

    var dados = url.split("?");

    if (id_target) {
        if (document.getElementById(id_target)) {
            document.getElementById(id_target).innerText = msg;
            msg = "Carregando...";
        }
    } else {
        //Senão Ativa a o Gif Processando
        objAjax.AtivaDiv();
    }

    if (!tipoReq) { // tipo conexão sincrona
        if (!objAjax.Ocupado(xmlHTTP)) {
            if (metodo == "POST" && (xmlSend.xml == undefined || xmlSend.xml == "")) {
                xmlHTTP.open(metodo, dados[0], false);
            } else {
                xmlHTTP.open(metodo, url, false);
            }
            if (xmlSend.xml != undefined && xmlSend.xml != "") {
                xmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=ISO-8859-1");
                xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=ISO-8859-1"); //"application/x-www-form-urlencoded");
                xmlHTTP.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
                xmlHTTP.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
                xmlHTTP.setRequestHeader("Method", metodo);
                xmlHTTP.setRequestHeader("Pragma", "no-cache");
                xmlHTTP.setRequestHeader("encoding", "ISO-8859-1");
                xmlHTTP.setRequestHeader('Content-length', url.length + xmlSend.xml.length);
                if (navigator.appName.indexOf('Microsoft') != -1) {
                    xmlHTTP.send(xmlSend); // colocar o mesmo nome na pagina para enviar um xml
                } else {
                    xmlHTTP.send(xmlSend.xml); // colocar o mesmo nome na pagina para enviar um xml
                }
            } else {
                xmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=ISO-8859-1");
                xmlHTTP.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
                xmlHTTP.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
                xmlHTTP.setRequestHeader("Method", metodo);
                xmlHTTP.setRequestHeader("Pragma", "no-cache");
                xmlHTTP.setRequestHeader("encoding", "ISO-8859-1");
                xmlHTTP.setRequestHeader('Content-length', url.length);
                if (dados[1] == undefined || dados[1] == "") {
                    xmlHTTP.send(null);
                } else {
                    xmlHTTP.send(dados[1]);
                }
            }

            if (xmlHTTP.status != 200) {
                //caso de algum erro mostrar o erro retornado pelo servidor
             	alert(xmlHTTP.responseText + "\nOcorreu um erro interno do servidor.\n\nFavor informar ao administrador do sistema.");
             	//montarCaixaMensagem("Ajax","erro",xmlHTTP.responseText + "\nOcorreu um erro interno do servidor.\n\nFavor informar ao administrador do sistema.","alerta","","");
                if (!id_target) {
                    window.setTimeout("var objAjax = new AjaxFuncoes();objAjax.DesativaDiv()", 1000);
                }
            } else {
                if (objAjax.Processa(xmlHTTP)) {
					if (xmlHTTP.responseXML) {
						xmlResultado.loadXML(xmlHTTP.responseXML.xml);
					}
                    textResultado = xmlHTTP.responseText;
					if (xmlHTTP.responseText == "null") {
						window.location.href = 'PermissaoConsultarLogin.asp';
					}
                    if (!id_target) {
                        window.setTimeout("var objAjax = new AjaxFuncoes();objAjax.DesativaDiv()", 1000);
                    }
                }
            }
        }
    } else {  // tipo conexão Assíncrona
        //Abre a conexao
        if (metodo == "POST" && (xmlSend.xml == undefined || xmlSend.xml == "")) {
            xmlHTTP.open(metodo, dados[0], true);
        } else {
            xmlHTTP.open(metodo, url, true);
        }
        //Seta as funcoes que irao tratar a mudanca de estado do objeto xmlHTTP
        xmlHTTP.onreadystatechange = function() {
            if (xmlHTTP.readyState == 4) {
                var retorno;
                //objAjax o status da página de retorno
                // 200 significa que os dados veio sem erros
                // 0 caso nao esteja em um servidor
                if (xmlHTTP.status == 200 || xmlHTTP.status == 0) {
                    //caso o tipo de requisição seja assincrono = true chamar a funcao mostrarResultado
					if (xmlHTTP.responseXML) {
						xmlResultado.loadXML(xmlHTTP.responseXML.xml);					
					}
					if (xmlHTTP.responseText == "null") {
						window.location.href = 'PermissaoConsultarLogin.asp';
					}
                    Ajax.mostrarResultado(xmlResultado, xmlHTTP.responseText);
                    if (!id_target) {
                        window.setTimeout("var objAjax = new AjaxFuncoes();objAjax.DesativaDiv()", 250);
                    }
                } else {
                    //caso de algum erro mostrar o erro retornado pelo servidor
					alert(xmlHTTP.responseText + "\nOcorreu um erro interno do servidor.\n\nFavor informar ao administrador do sistema.");
                    //montarCaixaMensagem("Ajax","erro",xmlHTTP.responseText + "\nOcorreu um erro interno do servidor.\n\nFavor informar ao administrador do sistema.","alerta","","");
					//alert(xmlHTTP.responseText);
                    if (!id_target) {
                        window.setTimeout("var objAjax = new AjaxFuncoes();objAjax.DesativaDiv()", 250);
                    }
                }
            }
        };
        //** Se for mandar um xml para gravar ou buscar declarar como global e sera entao enviado aqui.
        if (xmlSend.xml != undefined && xmlSend.xml != "") {
            //Metodo POST precisa definir estes RequestHeader
            xmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=ISO-8859-1");
            xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=ISO-8859-1"); //"application/x-www-form-urlencoded");
            xmlHTTP.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            xmlHTTP.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
            xmlHTTP.setRequestHeader("Method", metodo);
            xmlHTTP.setRequestHeader("Pragma", "no-cache");
            xmlHTTP.setRequestHeader("encoding", "ISO-8859-1");
            xmlHTTP.setRequestHeader('Content-length', url.length + xmlSend.xml.length);
            if (navigator.appName.indexOf('Microsoft') != -1) {
                xmlHTTP.send(xmlSend); // colocar o mesmo nome na pagina para enviar um xml
            } else {
                xmlHTTP.send(xmlSend.xml); // colocar o mesmo nome na pagina para enviar um xml
            }
        } else {
            //Metodo POST precisa definir estes RequestHeader
            xmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;ISO-8859-1");
            xmlHTTP.setRequestHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            xmlHTTP.setRequestHeader("Cache-Control", "post-check=0, pre-check=0");
            xmlHTTP.setRequestHeader("Method", metodo);
            xmlHTTP.setRequestHeader("Pragma", "no-cache");
            xmlHTTP.setRequestHeader("encoding", "ISO-8859-1");
            xmlHTTP.setRequestHeader('Content-length', url.length);
            if (dados[1] == undefined || dados[1] == "") {
                xmlHTTP.send(null);
            } else {
                xmlHTTP.send(dados[1]);
            }
        }
    }

    //Caso o metodo seja sincrono e possivel retornar o processamento do ajax.
    return textResultado;
}
/**
 * FUNÇÃO PARA MOSTRAR O RESULTADO DA CONSULTA -> OBS.: DEVE SER IMPLEMENTADA
 */
Ajax.mostrarResultado = function (xmlResultado, textResultado) {

    var mensagem =  "Favor implementar a função \nAjax.mostrarResultado = function(xmlResultado, textResultado) { \n	" +
    "//exemplo	\n	xmlRetorno.loadXML(xmlResultado.xml);\n	intRegistros = xmlRetorno.selectNodes('//ROOT/row').length;\n	" +
    "MontarPaginacaoXML(0, 30, intRegistros, 'ROOT', 'xsl'); \n};"
    if (xmlResultado) {
        alert(mensagem + "\n\n" + "xmlResultado: \n" + xmlResultado.xml);
    } else if (textResultado != "") {
        alert(mensagem + "\n\n" + "xmlResultado: \n" + textResultado);
    }
    return false;
}

/**
 * FUNÇÃO PARA VERIRFICAR O STATUS DE PROCESSAMENTO QUANDO O TIPO DE REQUISIÇÃO FOR SINCRONO
 */
function AjaxFuncoes() {
// Prototipo da classe, metodos serão acessados atraves dele.
};
/**
 * BLOQUEIA A PÁGINA PARA O USUÁRIO E SATIVA A DIV 'CARREGANDO'....
 */
AjaxFuncoes.prototype.AtivaDiv = function() {
    var objAjax = new AjaxFuncoes();
    window.scrollTo(0, 0);
try{
    document.body.style.overflow = "hidden";
}catch(e){}

	if (navigator.appVersion.indexOf("MSIE 6.0") != -1) {
		if (document.getElementById('divBloqueioPaginaFrame')) {
			document.getElementById('divBloqueioPaginaFrame').style.display = '';
		}

	} else {
		if (document.getElementById('divBloqueioPagina')) {
			document.getElementById('divBloqueioPagina').style.display = '';
		}
	}

    if (document.getElementById('divProcessandoPagina')) {
        document.getElementById('divProcessandoPagina').style.display = '';
    }
    objAjax.CentralizaDivNaTela(document.getElementById('divProcessandoPagina'));
    window.onresize = function(e) {
        objAjax.CentralizaDivNaTela(document.getElementById('divProcessandoPagina'));
    };
}
/**
 * DESLOQUEIA A PÁGINA PARA O USUÁRIO E DESATIVA A DIV 'CARREGANDO'
 */
AjaxFuncoes.prototype.DesativaDiv = function() {
    window.scrollTo(0,0);
    document.body.style.overflow = "auto";

    if (navigator.appVersion.indexOf("MSIE 6.0") != -1) {
		if (document.getElementById('divBloqueioPaginaFrame')) {
			document.getElementById('divBloqueioPaginaFrame').style.display = 'none';
		}
	} else {
		if (document.getElementById('divBloqueioPagina')) {
			document.getElementById('divBloqueioPagina').style.display = 'none';
		}
	}

    if (document.getElementById('divProcessandoPagina')) {
        document.getElementById('divProcessandoPagina').style.display = 'none';
    }
}
/**
 * FUNÇÃO PARA CENTRALIZAR DIV NA TELA
 */
AjaxFuncoes.prototype.CentralizaDivNaTela = function(objdiv) {

    if(objdiv){
	    if (parseInt(objdiv.offsetHeight) > parseInt(document.body.clientHeight)) {
        	objdiv.style.top = 0;
	    } else {
        	objdiv.style.top = parseInt((document.body.clientHeight / 2)) - parseInt(objdiv.offsetHeight / 2) + document.body.scrollTop;
	    }
	    objdiv.style.left = parseInt(document.body.clientWidth / 2) - parseInt(objdiv.offsetWidth / 2);
    }
}
/**
 * FUNÇÃO PARA TRATAR OS ACENTOS
 */
AjaxFuncoes.prototype.TrataAcento = function(objeto) {
    var objAjax = new AjaxFuncoes();
    var Acentos = "áàãââÁÀÃÂéêÉÊíÍóõôÓÔÕúüÚÜabcçÇdefghijklmnopqrstuvxwyz";
    var Traducao ="aaaaaAAAAeeEEiIoooOOOuuUUabcçÇdefghijklmnopqrstuvxwyz";
    var Posic, Carac;
    var TempLog = "";
    for (var i = 0; i < objeto.length; i++) {
        Carac = objeto.charAt(i) ;
        Posic = Acentos.indexOf(Carac);
        if (Posic > -1)
            TempLog += escape(Carac);
        else
            TempLog += objeto.charAt(i);
    }
    return objAjax.ReplaceAll(TempLog, "ç", "c");
}
/**
 * FUNÇÃO PARA TRATAR OS ACENTOS
 */
AjaxFuncoes.prototype.ReplaceAll = function(valor, from, to) {
    var indice = valor.indexOf(from);
    while ( indice > -1 ) {
        valor = valor.replace(from, to);
        indice = valor.indexOf( from );
    }
    return valor;
}
/**
 * FUNÇÃO QUE RETORNA O STATUS DO AJAX
 */
AjaxFuncoes.prototype.Ocupado = function(xmlHTTP) {
    estadoAtual = xmlHTTP.readyState;
    return (estadoAtual && (estadoAtual < 4));
}
/**
 * FUNÇÃO QUE RETORNA O STATUS OK
 */
AjaxFuncoes.prototype.Processa = function(xmlHTTP) {
    if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) {
        return true;
    }
}


Ajax.funcao = new AjaxFuncoes();