/*
 * 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:
[
    Constructor,
    ConstructorCallWith=Document
] 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([Default=Undefined] optional Node refNode,
                                 [Default=Undefined] optional long offset);
     [RaisesException] void setEnd([Default=Undefined] optional Node refNode,
                               [Default=Undefined] optional long offset);
    [RaisesException] void setStartBefore([Default=Undefined] optional Node refNode);
    [RaisesException] void setStartAfter([Default=Undefined] optional Node refNode);
    [RaisesException] void setEndBefore([Default=Undefined] optional Node refNode);
    [RaisesException] void setEndAfter([Default=Undefined] optional Node refNode);
    [RaisesException] void collapse([Default=Undefined] optional boolean toStart);
    [RaisesException] void selectNode([Default=Undefined] optional Node refNode);
    [RaisesException] void selectNodeContents([Default=Undefined] optional 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([Default=Undefined] optional CompareHow how,
                                               [Default=Undefined] optional Range sourceRange);

    [RaisesException, CustomElementCallbacks=Enable] void deleteContents();
    [RaisesException, CustomElementCallbacks=Enable] DocumentFragment extractContents();
    [RaisesException, CustomElementCallbacks=Enable] DocumentFragment cloneContents();
    [RaisesException, CustomElementCallbacks=Enable] void insertNode([Default=Undefined] optional Node newNode);
    [RaisesException, CustomElementCallbacks=Enable] void surroundContents([Default=Undefined] optional Node newParent);
    [RaisesException] Range cloneRange();
    [RaisesException] DOMString toString();

    [RaisesException] void detach();

    // CSSOM View Module API extensions

    ClientRectList getClientRects();
    ClientRect getBoundingClientRect();

    // extensions

    [RaisesException, CustomElementCallbacks=Enable] DocumentFragment createContextualFragment([Default=Undefined] optional DOMString html);

    // WebKit extensions

    [RaisesException] boolean intersectsNode([Default=Undefined] optional Node refNode);

    [RaisesException] short compareNode([Default=Undefined] optional 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([Default=Undefined] optional Node refNode,
                       [Default=Undefined] optional long offset);

    [RaisesException] boolean isPointInRange([Default=Undefined] optional Node refNode,
                           [Default=Undefined] optional long offset);

    [RaisesException] void expand([Default=Undefined] optional DOMString unit);
};

