/*
 * dom2ranges.idl
 *
 * DOM Level 2 Ranges IDL definitions, rewritten in Web IDL.
 *
 * Original OMG IDL:
 *
 *   http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/ranges.idl
 */

module ranges {

  typedef dom::Node Node;
  typedef dom::Document Document;
  typedef dom::DOMException DOMException;
  typedef dom::DocumentFragment DocumentFragment;

  // Introduced in DOM Level 2:
  exception RangeException {
    // RangeExceptionCode
    const unsigned short      BAD_BOUNDARYPOINTS_ERR         = 1;
    const unsigned short      INVALID_NODE_TYPE_ERR          = 2;

    unsigned short   code;
  };

  // Introduced in DOM Level 2:
  interface Range {
    readonly attribute Node             startContainer getraises(DOMException);

    readonly attribute long             startOffset getraises(DOMException);

    readonly attribute Node             endContainer getraises(DOMException);

    readonly attribute long             endOffset getraises(DOMException);

    readonly attribute boolean          collapsed getraises(DOMException);

    readonly attribute Node             commonAncestorContainer getraises(DOMException);

    void               setStart(in Node refNode, 
                                in long offset)
                                        raises(RangeException, 
                                               DOMException);
    void               setEnd(in Node refNode, 
                              in long offset)
                                        raises(RangeException, 
                                               DOMException);
    void               setStartBefore(in Node refNode)
                                        raises(RangeException, 
                                               DOMException);
    void               setStartAfter(in Node refNode)
                                        raises(RangeException, 
                                               DOMException);
    void               setEndBefore(in Node refNode)
                                        raises(RangeException, 
                                               DOMException);
    void               setEndAfter(in Node refNode)
                                        raises(RangeException, 
                                               DOMException);
    void               collapse(in boolean toStart)
                                        raises(DOMException);
    void               selectNode(in Node refNode)
                                        raises(RangeException, 
                                               DOMException);
    void               selectNodeContents(in 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;

    short              compareBoundaryPoints(in unsigned short how, 
                                             in Range sourceRange)
                                        raises(DOMException);
    void               deleteContents()
                                        raises(DOMException);
    DocumentFragment   extractContents()
                                        raises(DOMException);
    DocumentFragment   cloneContents()
                                        raises(DOMException);
    void               insertNode(in Node newNode)
                                        raises(DOMException, 
                                               RangeException);
    void               surroundContents(in Node newParent)
                                        raises(DOMException, 
                                               RangeException);
    Range              cloneRange()
                                        raises(DOMException);
    DOMString          toString()
                                        raises(DOMException);
    void               detach()
                                        raises(DOMException);
  };

  // Introduced in DOM Level 2:
  interface DocumentRange {
    Range              createRange();
  };

  Document implements DocumentRange;
};
