//-----------------------------------------------------------------
// Class XMLDom1
//
//-----------------------------------------------------------------

function XMLDom1(sXML) {
	if ( window.ActiveXObject ) {
		var _MSXMLDOM_ = false;
		var _MSXMLSSIGNATURES_ = [	"MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
                          			"MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument.2.0",
                          			"MSXML2.DOMDocument", "Microsoft.XmlDom"];
	   var bFound = false;
	   for (var i=0; i < _MSXMLSSIGNATURES_.length; i++) {
	      try {
	         var oXMLDom = new ActiveXObject(_MSXMLSSIGNATURES_[i]);
	         _MSXMLDOM_ = _MSXMLSSIGNATURES_[i];
	         // alert(_MSXMLSSIGNATURES_[i]);
	         if ( sXML )
		         oXMLDom.loadXML(sXML);
	         return oXMLDom;
	      } 
	      catch (e) {
	      	// ignore
	      } // end try
	   } // end for
	   var oError = new Error("MSXML is not installed on your system.");
	   oError.name = 'XMLDOM_ERROR_MSXML';
	   throw oError;
	}
	else if ( document.implementation && document.implementation.createDocument ) {
		try {
			var oXMLDom = document.implementation.createDocument('','',null);
			oXMLDom.parseError = {
			   valueOf: function () { return this.errorCode; },
			   toString: function () { return this.errorCode.toString() }
			};
			
			oXMLDom.__initError__();
			oXMLDom.addEventListener('load', function () {
			   this.__checkForErrors__();
			   this.__changeReadyState__(4);
			}, false);
	      if ( sXML )
		        oXMLDom.loadXML(sXML);
			return oXMLDom;   
		} 
		catch (e) {
	      var oError = new Error('Error creating W3C XML DOM object.');
		   oError.name = 'XMLDOM_ERROR_XMLDOM';
		   throw oError;
		}
	}
	else {
		var oError = new Error("Your browser doesn't support an XML DOM object.");
	   oError.name = 'XMLDOM_ERROR_DEFAULT';
	   throw oError;
	}
} // class XMLDom1

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

    Document.prototype.readyState = 0;
    Document.prototype.onreadystatechange = null;

    Document.prototype.__changeReadyState__ = function (iReadyState) {
        this.readyState = iReadyState;

        if (typeof this.onreadystatechange == "function") {
            this.onreadystatechange();
        }
    };

    Document.prototype.__initError__ = function () {
        this.parseError.errorCode = 0;
        this.parseError.filepos = -1;
        this.parseError.line = -1;
        this.parseError.linepos = -1;
        this.parseError.reason = null;
        this.parseError.srcText = null;
        this.parseError.url = null;
    };
    
    Document.prototype.__checkForErrors__ = function () {

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

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

            reError.test(this.xml);
            
            this.parseError.errorCode = -999999;
            this.parseError.reason = RegExp.$1;
            this.parseError.url = RegExp.$2;
            this.parseError.line = parseInt(RegExp.$3);
            this.parseError.linepos = parseInt(RegExp.$4);
            this.parseError.srcText = RegExp.$5;
        }
    };
    
        
    Document.prototype.loadXML = function (sXml) {
        this.__initError__();
        this.__changeReadyState__(1);
    
        var oParser = new DOMParser();
        var oXmlDom = oParser.parseFromString(sXml, "text/xml");
 
        while (this.firstChild) {
            this.removeChild(this.firstChild);
        }

        for (var i=0; i < oXmlDom.childNodes.length; i++) {
            var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
            this.appendChild(oNewNode);
        }
        
        this.__checkForErrors__();
        this.__changeReadyState__(4);
    };
    
    Document.prototype.__load__ = Document.prototype.load;

    Document.prototype.load = function (sURL) {
        this.__initError__();
        this.__changeReadyState__(1);
        this.__load__(sURL);
    };
    
    Node.prototype.__defineGetter__("xml", function () {
        var oSerializer = new XMLSerializer();
        return oSerializer.serializeToString(this, "text/xml");
    });

    Node.prototype.__defineGetter__("text", function () {
    	return this.xml.replace(/<(\/){0,1}[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"');
    });

    Node.prototype.transformNode = function(oXSL) {
    	var oProcessor = new XSLTProcessor();
    	oProcessor.importStylesheet(oXSL);
    	var oTransformedNode = oProcessor.transformToDocument(this);
    	// strip off <transformiix:result> root node
    	return this.__serializeTransformedNode__(oTransformedNode);
    }

    Node.prototype.__serializeTransformedNode__ = function(oNode) {
    	switch ( oNode.nodeName ) {
    		case 'xml':
    		case '#document':
    		case 'transformiix:result':
    			var sXML = ''
    			for ( var i = 0; i < oNode.childNodes.length; i++ )
    				sXML += this.__serializeTransformedNode__(oNode.childNodes[i]);
    			return sXML;
    		default:
    			return oNode.xml;
    	}
    }

    Document.prototype.setProperty = function (sProperty, sValue) {
    }
    
    Node.prototype.selectNodes = function(sXPath) {
		var oDocument = ( this.nodeName == '#document' ? this : this.ownerDocument );
		var oResult = oDocument.evaluate(sXPath, this, oDocument.createNSResolver(oDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		var aNodes = new Array();
		if ( oResult ) {
			var oResultNode = oResult.iterateNext();
 			while( oResultNode ) {
 				aNodes.push(oResultNode);
 				oResultNode = oResult.iterateNext();
 			}
		}
		return aNodes ;
    }

    Node.prototype.selectSingleNode = function(sXPath) {
		var aNodes = this.selectNodes(sXPath);
		if ( aNodes.length > 0 )
			return aNodes[0];
		else
			return null;
    }

}
