/*
 * Copyright (C) 2006 Apple Computer, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

module xpath {

    interface [Conditional=XPATH] XPathResult {
        const unsigned short ANY_TYPE                       = 0;
        const unsigned short NUMBER_TYPE                    = 1;
        const unsigned short STRING_TYPE                    = 2;
        const unsigned short BOOLEAN_TYPE                   = 3;
        const unsigned short UNORDERED_NODE_ITERATOR_TYPE   = 4;
        const unsigned short ORDERED_NODE_ITERATOR_TYPE     = 5;
        const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE   = 6;
        const unsigned short ORDERED_NODE_SNAPSHOT_TYPE     = 7;
        const unsigned short ANY_UNORDERED_NODE_TYPE        = 8;
        const unsigned short FIRST_ORDERED_NODE_TYPE        = 9;

        readonly attribute unsigned short  resultType;
        readonly attribute double          numberValue
            getter raises (DOMException);
            
        readonly attribute DOMString       stringValue
            getter raises (DOMException);

        readonly attribute boolean         booleanValue
            getter raises (DOMException);

        readonly attribute Node            singleNodeValue
            getter raises (DOMException);

        readonly attribute boolean         invalidIteratorState;
        readonly attribute unsigned long   snapshotLength
            getter raises (DOMException);
            
        Node iterateNext()
            raises (DOMException);
        Node snapshotItem(in unsigned long index)
            raises (DOMException);
    };

}
