/*
 * 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 [GenerateConstructor, 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);
    };

}
