/*
 * Copyright (C) 2006 Apple Computer, Inc.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * 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.
 */

// Introduced in DOM Level 2:
[
    ImplementationLacksVTable
] interface Range {

    readonly attribute Node startContainer
        getter raises(DOMException);
    readonly attribute long startOffset
        getter raises(DOMException);
    readonly attribute Node endContainer
        getter raises(DOMException);
    readonly attribute long endOffset
        getter raises(DOMException);
    readonly attribute boolean collapsed
        getter raises(DOMException);
    readonly attribute Node commonAncestorContainer
        getter raises(DOMException);

    [ObjCLegacyUnnamedParameters] void setStart(in [Optional=DefaultIsUndefined] Node refNode, 
                                 in [Optional=DefaultIsUndefined] long offset)
        raises(RangeException, DOMException);
    [ObjCLegacyUnnamedParameters] void setEnd(in [Optional=DefaultIsUndefined] Node refNode, 
                               in [Optional=DefaultIsUndefined] long offset)
        raises(RangeException, DOMException);
    void setStartBefore(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);
    void setStartAfter(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);
    void setEndBefore(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);
    void setEndAfter(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);
    void collapse(in [Optional=DefaultIsUndefined] boolean toStart)
        raises(DOMException);
    void selectNode(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);
    void selectNodeContents(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);

    // CompareHow
    const unsigned short START_TO_START = 0;
    const unsigned short START_TO_END   = 1;
    const unsigned short END_TO_END     = 2;
    const unsigned short END_TO_START   = 3;

    [ObjCLegacyUnnamedParameters] short compareBoundaryPoints(in [Optional=DefaultIsUndefined] CompareHow how,
                                               in [Optional=DefaultIsUndefined] Range sourceRange)
        raises(DOMException);

    void deleteContents()
        raises(DOMException);
    DocumentFragment extractContents()
        raises(DOMException);
    DocumentFragment cloneContents()
        raises(DOMException);
    void insertNode(in [Optional=DefaultIsUndefined] Node newNode)
        raises(DOMException, RangeException);
    void surroundContents(in [Optional=DefaultIsUndefined] Node newParent)
        raises(DOMException, RangeException);
    Range cloneRange()
        raises(DOMException);
    DOMString toString()
        raises(DOMException);

    void detach()
        raises(DOMException);

#if defined(LANGUAGE_JAVASCRIPT) || LANGUAGE_JAVASCRIPT
    // CSSOM View Module API extensions

    ClientRectList getClientRects();
    ClientRect getBoundingClientRect();
#endif

    // extensions

    DocumentFragment createContextualFragment(in [Optional=DefaultIsUndefined] DOMString html)
        raises(DOMException);

    // WebKit extensions

    boolean intersectsNode(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);

    short compareNode(in [Optional=DefaultIsUndefined] Node refNode)
        raises(RangeException, DOMException);

    // CompareResults
    const unsigned short NODE_BEFORE           = 0;
    const unsigned short NODE_AFTER            = 1;
    const unsigned short NODE_BEFORE_AND_AFTER = 2;
    const unsigned short NODE_INSIDE           = 3;

    short comparePoint(in [Optional=DefaultIsUndefined] Node refNode, 
                       in [Optional=DefaultIsUndefined] long offset)
        raises(RangeException, DOMException);

    boolean isPointInRange(in [Optional=DefaultIsUndefined] Node refNode, 
                           in [Optional=DefaultIsUndefined] long offset)
        raises(RangeException, DOMException);

    void expand(in [Optional=DefaultIsUndefined] DOMString unit)
        raises(RangeException, DOMException);

#if !defined(LANGUAGE_JAVASCRIPT) || !LANGUAGE_JAVASCRIPT
    readonly attribute DOMString text;
#endif
};

