/*
 * FCKeditor - The text editor for internet
 * Copyright (C) 2003-2005 Frederico Caldeira Knabben
 * 
 * Licensed under the terms of the GNU Lesser General Public License:
 *         http://www.opensource.org/licenses/lgpl-license.php
 * 
 * For further information visit:
 *         http://www.fckeditor.net/
 * 
 * "Support Open Source software. What about a donation today?"
 * 
 * File Name: fckxml.js
 *     Defines the FCKXml object that is used for XML data calls
 *     and XML processing.
 *     This script is shared by almost all pages that compose the 
 *     File Browser frameset.
 * 
 * File Authors:
 *         Frederico Caldeira Knabben (fredck@fckeditor.net)
 */

var FCKXml = function()
{}

FCKXml.prototype.GetHttpRequest = function()
{
    if ( window.XMLHttpRequest )        // Gecko
        return new XMLHttpRequest() ;
    else if ( window.ActiveXObject )    // IE
        return new ActiveXObject("MsXml2.XmlHttp") ;
}

FCKXml.prototype.LoadUrl = function( urlToCall, asyncFunctionPointer )
{
    var oFCKXml = this ;

    var bAsync = ( typeof(asyncFunctionPointer) == 'function' ) ;

    var oXmlHttp = this.GetHttpRequest() ;
        
    oXmlHttp.open( "GET", urlToCall, bAsync ) ;
    
    if ( bAsync )
    {    
        oXmlHttp.onreadystatechange = function() 
        {
            if ( oXmlHttp.readyState == 4 )
            {
                oFCKXml.DOMDocument = oXmlHttp.responseXML ;
                if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
                    asyncFunctionPointer( oFCKXml ) ;
                else
                    alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ;
            }
        }
    }
    
    oXmlHttp.send( null ) ;
    
    if ( ! bAsync )
    {
        if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
            this.DOMDocument = oXmlHttp.responseXML ;
        else
        {
            alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ;
        }
    }
}

FCKXml.prototype.SelectNodes = function( xpath )
{
    if ( document.all )        // IE
        return this.DOMDocument.selectNodes( xpath ) ;
    else                    // Gecko
    {
        var aNodeArray = new Array();

        var xPathResult = this.DOMDocument.evaluate( xpath, this.DOMDocument, 
                this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
        if ( xPathResult ) 
        {
            var oNode = xPathResult.iterateNext() ;
             while( oNode )
             {
                 aNodeArray[aNodeArray.length] = oNode ;
                 oNode = xPathResult.iterateNext();
             }
        } 
        return aNodeArray ;
    }
}

FCKXml.prototype.SelectSingleNode = function( xpath ) 
{
    if ( document.all )        // IE
        return this.DOMDocument.selectSingleNode( xpath ) ;
    else                    // Gecko
    {
        var xPathResult = this.DOMDocument.evaluate( xpath, this.DOMDocument,
                this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);

        if ( xPathResult && xPathResult.singleNodeValue )
            return xPathResult.singleNodeValue ;
        else    
            return null ;
    }
}