/*
 * 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:
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
};

