/*
 * 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 {

    [GetterRaisesException] readonly attribute Node startContainer;
    [GetterRaisesException] readonly attribute long startOffset;
    [GetterRaisesException] readonly attribute Node endContainer;
    [GetterRaisesException] readonly attribute long endOffset;
    [GetterRaisesException] readonly attribute boolean collapsed;
    [GetterRaisesException] readonly attribute Node commonAncestorContainer;

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

    // 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;

     [RaisesException] short compareBoundaryPoints([Optional=DefaultIsUndefined] CompareHow how,
                                               [Optional=DefaultIsUndefined] Range sourceRange);

    [RaisesException] void deleteContents();
    [RaisesException] DocumentFragment extractContents();
    [RaisesException] DocumentFragment cloneContents();
    [RaisesException] void insertNode([Optional=DefaultIsUndefined] Node newNode);
    [RaisesException] void surroundContents([Optional=DefaultIsUndefined] Node newParent);
    [RaisesException] Range cloneRange();
    [RaisesException] DOMString toString();

    [RaisesException] void detach();

    // CSSOM View Module API extensions

    ClientRectList getClientRects();
    ClientRect getBoundingClientRect();

    // extensions

    [RaisesException] DocumentFragment createContextualFragment([Optional=DefaultIsUndefined] DOMString html);

    // WebKit extensions

    [RaisesException] boolean intersectsNode([Optional=DefaultIsUndefined] Node refNode);

    [RaisesException] short compareNode([Optional=DefaultIsUndefined] Node refNode);

    // 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;

    [RaisesException] short comparePoint([Optional=DefaultIsUndefined] Node refNode, 
                       [Optional=DefaultIsUndefined] long offset);

    [RaisesException] boolean isPointInRange([Optional=DefaultIsUndefined] Node refNode, 
                           [Optional=DefaultIsUndefined] long offset);

    [RaisesException] void expand([Optional=DefaultIsUndefined] DOMString unit);
};

