/*
 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
 * 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.
 */

[
    Custom=Wrap,
    DependentLifetime,
] interface Node : EventTarget {
    // NodeType
    const unsigned short      ELEMENT_NODE                   = 1;
    const unsigned short      ATTRIBUTE_NODE                 = 2;
    const unsigned short      TEXT_NODE                      = 3;
    const unsigned short      CDATA_SECTION_NODE             = 4;
    const unsigned short      ENTITY_REFERENCE_NODE          = 5; // EntityReference nodes are impossible to create in WebKit.
    const unsigned short      ENTITY_NODE                    = 6;
    const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;
    const unsigned short      COMMENT_NODE                   = 8;
    const unsigned short      DOCUMENT_NODE                  = 9;
    const unsigned short      DOCUMENT_TYPE_NODE             = 10;
    const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;
    const unsigned short      NOTATION_NODE                  = 12;

    readonly attribute DOMString nodeName;

    [CustomElementCallbacks] attribute DOMString? nodeValue;

    [DartNoAutoScope] readonly attribute unsigned short   nodeType;
    [PerWorldBindings] readonly attribute Node             parentNode;
    [PerWorldBindings, DartNoAutoScope] readonly attribute NodeList         childNodes;
    [PerWorldBindings, DartNoAutoScope] readonly attribute Node             firstChild;
    [PerWorldBindings, DartNoAutoScope] readonly attribute Node             lastChild;
    [PerWorldBindings, DartNoAutoScope] readonly attribute Node             previousSibling;
    [PerWorldBindings, DartNoAutoScope] readonly attribute Node             nextSibling;
    [PerWorldBindings] readonly attribute Document         ownerDocument;

    [CustomElementCallbacks, PerWorldBindings, RaisesException, TypeChecking=Interface] Node insertBefore(Node newChild, Node? refChild);
    [CustomElementCallbacks, PerWorldBindings, RaisesException, TypeChecking=Interface] Node replaceChild(Node newChild, Node oldChild);
    [CustomElementCallbacks, RaisesException, TypeChecking=Interface] Node removeChild(Node oldChild);
    [CustomElementCallbacks, PerWorldBindings, RaisesException, TypeChecking=Interface] Node appendChild(Node newChild);

    [ImplementedAs=hasChildren] boolean hasChildNodes();
    [CustomElementCallbacks, DartCustom] Node cloneNode(optional boolean deep);
    [CustomElementCallbacks] void normalize();

    // Introduced in DOM Level 2:
    [MeasureAs=NodeNamespaceURI] readonly attribute DOMString? namespaceURI; // Moved to Element and Attr in DOM4.
    [MeasureAs=NodeLocalName] readonly attribute DOMString? localName; // Moved to Element and Attr in DOM4.

    // Introduced in DOM Level 3:
    readonly attribute DOMString? baseURI;

    [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, TreatUndefinedAs=NullString, CustomElementCallbacks] attribute DOMString textContent;

    [MeasureAs=NodeIsSameNode] boolean isSameNode([Default=Undefined] optional Node other); // Removed in DOM4.
    boolean isEqualNode(Node other);
    DOMString? lookupPrefix(DOMString? namespaceURI);
    boolean isDefaultNamespace(DOMString? namespaceURI);
    DOMString? lookupNamespaceURI(DOMString? prefix);

    // DocumentPosition
    const unsigned short      DOCUMENT_POSITION_DISCONNECTED = 0x01;
    const unsigned short      DOCUMENT_POSITION_PRECEDING    = 0x02;
    const unsigned short      DOCUMENT_POSITION_FOLLOWING    = 0x04;
    const unsigned short      DOCUMENT_POSITION_CONTAINS     = 0x08;
    const unsigned short      DOCUMENT_POSITION_CONTAINED_BY = 0x10;
    const unsigned short      DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;

    unsigned short compareDocumentPosition(Node other);

    // Introduced in DOM4
    boolean contains(Node other);

    // IE extensions
    [PerWorldBindings] readonly attribute Element parentElement;
};
