﻿var isIE=!!window.ActiveXObject;
var isXML3=false;
function GetDomObj()
{
    var srcDoc;
    if(isIE)
    {
        try
        {
            srcDoc=new ActiveXObject("Msxml2.DOMDocument.6.0");
        }
        catch(ex)
        {
            srcDoc=new ActiveXObject("Msxml.DOMDocument");
            isXML3=true;
        }
    }
    else
        srcDoc=document.implementation.createDocument("", "", null); 
    srcDoc.async=false;    
    return srcDoc;
}
function LoadXml(srcXml)
{
    var srcDoc;
    if(isIE)
    {
        srcDoc=GetDomObj();
        srcDoc.loadXML(srcXml);
    }
    else
    {
        var oParser = new DOMParser();
        srcDoc = oParser.parseFromString(srcXml,"text/xml"); 
        srcDoc.async="false";
    }
    return srcDoc;
}
if(!isIE)
{
   XMLDocument.prototype.selectNodes = function(cXPathString, xNode)
   {
      if( !xNode ) { xNode = this; } 
      var oNSResolver = this.createNSResolver(this.documentElement)
      var aItems = this.evaluate(cXPathString, xNode, oNSResolver, 
                   XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
      var aResult = [];
      for( var i = 0; i < aItems.snapshotLength; i++)
      {
         aResult[i] =  aItems.snapshotItem(i);
      }
      return aResult;
   } 
    // prototying the Element
   Element.prototype.selectNodes = function(cXPathString)
   {
      if(this.ownerDocument.selectNodes)
      {
         return this.ownerDocument.selectNodes(cXPathString, this);
      }
      else{throw "For XML Elements Only";}
   }   
   
    // prototying the XMLDocument
   XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode)
   {
      if( !xNode ) { xNode = this; } 
      var xItems = this.selectNodes(cXPathString, xNode);
      if( xItems.length > 0 )
      {
         return xItems[0];
      }
      else
      {
         return null;
      }
   }
   // prototying the Element
   Element.prototype.selectSingleNode = function(cXPathString)
   {    
      if(this.ownerDocument.selectSingleNode)
      {
         return this.ownerDocument.selectSingleNode(cXPathString, this);
      }
      else{throw "For XML Elements Only";}
   } 
   
   XMLDocument.prototype.transformNode = function(styleDocument)
   {
          var xslProc = new XSLTProcessor();
        xslProc.importStylesheet(styleDocument);
        //alert(styleDocument.xml);
        var mDoc=xslProc.transformToFragment(this,document);
        return mDoc.xml;
   }
   Element.prototype.transformNode = function(styleDocument)
   {
          var xslProc = new XSLTProcessor();
        xslProc.importStylesheet(styleDocument);
        //alert(styleDocument.xml);
        //var mDoc=xslProc.transformToDocument(xDoc);
        var mDoc=xslProc.transformToFragment(this,document);
        return mDoc.xml; 
   }

    XMLDocument.prototype.__defineGetter__("xml",function(){
        var xmlStr;
        try
        {
            xmlStr=new XMLSerializer().serializeToString(this);
        }
        catch(ex)
        {
            var d = document.createElement( " div " );
            d.appendChild(this.cloneNode( true ));
            xmlStr=d.innerHTML;
        }
        var re=/ encoding=\"UTF-8\"/g
        xmlStr=xmlStr.replace(re,"");
        return xmlStr;
    });    
    Element.prototype.__defineGetter__("xml",function(){
        var xmlStr;
        try
        {
            xmlStr=new XMLSerializer().serializeToString(this);
        }
        catch(ex)
        {
            var d = document.createElement( " div " );
            d.appendChild(this.cloneNode( true ));
            xmlStr=d.innerHTML;
        }
        var re=/ encoding=\"UTF-8\"/g
        xmlStr=xmlStr.replace(re,"");
        return xmlStr;
    });    
    DocumentFragment.prototype.__defineGetter__("xml",function(){
        var xmlStr;
        try
        {
            xmlStr=new XMLSerializer().serializeToString(this);
        }
        catch(ex)
        {
            var d = document.createElement( " div " );
            d.appendChild(this.cloneNode( true ));
            xmlStr=d.innerHTML;
        }
        var re=/ encoding=\"UTF-8\"/g
        xmlStr=xmlStr.replace(re,"");        
        return xmlStr;
    });
    
    XMLDocument.prototype.__defineGetter__("text",function(){
        return this.firstChild.textContent;
    });
    Element.prototype.__defineGetter__("text",function(){
        return this.textContent;
    });
}