function xmlBehavior(){

// METODO PARA CREAR OBJETOS TIPO DOCUMENTO XML QUE ESTAN VACIOS.
// DEVUELVE UN DOCUMENTO XML (OBJETO)

   this.newXmlDoc = function(){
      if(window.ActiveXObject){
         objXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
//         objXmlDoc.async = false;
      }else if(document.implementation && document.implementation.createDocument){
         objXmlDoc = document.implementation.createDocument("","",null);
//         objXmlDoc.async = false;
      }else{
         objXmlDoc = null;
      }
      return(objXmlDoc);
   }

// CREA UN NODO EN UN DOCUMENTO XML QUE SERA HIJO DEL NODO QUE SE INDIQUE DEL MISMO
// PARAMETROS
// xmlDoc es el documento XML con el que se trabajará
// xmlElem es el nodo del documento XML que será padre del nuevo nodo creado
// name es el nombre que tendrá el nuevo nodo creado

   this.newElement = function(xmlDoc, xmlElem, name){
      xmlNode = xmlDoc.createElement(name);
      xmlElem.appendChild(xmlNode);
      return(xmlNode);
   }

// CREA UN NODO CDATA EN EL NODO INDICADO DEL DOCUMENTO XML
// PARAMETROS
// xmlDco es el documento XML con el que se trabajará
// xmlElem es el nodo del documento XML que será padre del nodo CDATA creado
// valor es el contenido del nuev nodo CDATA creado

   this.addCDATA = function(xmlDoc, xmlElem, valor){
      var newCDATA = xmlDoc.createCDATASection(valor);
      while (xmlElem.childNodes.length > 0){
         xmlElem.removeChild(xmlElem.childNodes(0));
      }
      xmlElem.appendChild(newCDATA);
      newCDATA = null;
   }

   this.addNodeCDATA = function(xmlDoc, strNode, valor){
      var oStr = new strBehavior();

      var newCDATA = xmlDoc.createCDATASection(valor);

      xmlElem = xmlDoc.selectSingleNode(strNode);
      if (!xmlElem){
         nvoNodo = oStr.trim(strNode.substr(strNode.lastIndexOf("/") + 1)); 
         strNodo = strNode.substring(0,strNode.lastIndexOf(nvoNodo)-1); 

         xmlElem = xmlDoc.selectSingleNode(strNodo);
         oXml.newElement(xmlDoc, xmlElem, nvoNodo);
         xmlElem = xmlDoc.selectSingleNode(strNode);
      }

      while (xmlElem.childNodes.length > 0){
         xmlElem.removeChild(xmlElem.childNodes(0));
      }

      xmlElem.appendChild(newCDATA);

      newCDATA = null;
      oStr = null;
   }

   this.eliminaNodo = function(nodXml, pathXml){
      try{ 
         nodRemove = nodXml.selectSingleNode(pathXml);
         nodXml.removeChild(nodRemove);
      }
      catch(err){} 
   }

   this.selectSingleNodeValue = function(xmlDoc, elementPath){
      if(window.ActiveXObject){
         return(xmlDoc.selectSingleNode(elementPath).text);
      }
      else{
         var xpe = new XPathEvaluator();
         var nsResolver = xpe.createNSResolver(xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
         var results = xpe.evaluate(elementPath, xmlDoc.documentElement, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
         return(results.singleNodeValue.textContent); 
      }
   }

   this.selectSingleNode = function(xmlDoc, elementPath){
      if(window.ActiveXObject){
         return(xmlDoc.selectSingleNode(elementPath));
      }
      else{
         var xpe = new XPathEvaluator();
         var nsResolver = xpe.createNSResolver( xmlDoc.ownerDocument == null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentElement);
         var results = xpe.evaluate(elementPath, xmlDoc.documentElement, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
         return(results.singleNodeValue); 
      }
   }


}
