/*
 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
 * Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org>
 *
 * 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.
 */

module core {

    interface [
        GenerateConstructor,
        GenerateToJS,
        CustomMarkFunction,
        InterfaceUUID=48BB95FC-2D08-4c54-BE65-7558736A4CAE,
        ImplementationUUID=FF5CBE81-F817-429c-A6C2-0CCCD2328062
    ] Document : EventTargetNode {

        // DOM Level 1 Core
        readonly attribute DocumentType doctype;
        readonly attribute DOMImplementation implementation;
        readonly attribute Element documentElement;

        Element            createElement(in DOMString tagName)
            raises (DOMException);
        DocumentFragment   createDocumentFragment();
        Text               createTextNode(in DOMString data);
        Comment            createComment(in DOMString data);
        CDATASection       createCDATASection(in DOMString data)
            raises(DOMException);
        [OldStyleObjC] ProcessingInstruction createProcessingInstruction(in DOMString target,
                                                                         in DOMString data)
            raises (DOMException);
        Attr               createAttribute(in DOMString name)
            raises (DOMException);
        EntityReference    createEntityReference(in DOMString name)
            raises(DOMException);
        NodeList           getElementsByTagName(in DOMString tagname);

        // Introduced in DOM Level 2:

        [OldStyleObjC] Node importNode(in Node importedNode,
                                       in boolean deep)
            raises (DOMException);
        [OldStyleObjC] Element createElementNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                               in DOMString qualifiedName)
            raises (DOMException);
        [OldStyleObjC] Attr createAttributeNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                              in DOMString qualifiedName)
            raises (DOMException);
        [OldStyleObjC] NodeList getElementsByTagNameNS(in [ConvertNullToNullString] DOMString namespaceURI,
                                                       in DOMString localName);
        Element            getElementById(in DOMString elementId);

        // DOM Level 3 Core

        readonly attribute [ConvertNullStringTo=Null] DOMString inputEncoding;

        readonly attribute [ConvertNullStringTo=Null] DOMString xmlEncoding;
                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString xmlVersion
                    setter raises (DOMException);
                 attribute boolean xmlStandalone
                    setter raises (DOMException);

        Node               adoptNode(in Node source)
            raises (DOMException);

                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString documentURI;

#if !defined(LANGUAGE_COM)
        // DOM Level 2 Events (DocumentEvents interface)

        Event              createEvent(in DOMString eventType)
            raises(DOMException);

        // DOM Level 2 Tranversal and Range (DocumentRange interface)

        Range              createRange();

        // DOM Level 2 Tranversal and Range (DocumentTraversal interface)

#if !defined(LANGUAGE_OBJECTIVE_C)
        NodeIterator       createNodeIterator(in Node root,
                                              in unsigned long whatToShow,
                                              in NodeFilter filter,
                                              in boolean entityReferenceExpansion)
            raises(DOMException);
        TreeWalker         createTreeWalker(in Node root,
                                            in unsigned long whatToShow,
                                            in NodeFilter filter,
                                            in boolean entityReferenceExpansion)
            raises(DOMException);
#endif // !defined(LANGUAGE_OBJECTIVE_C)

        // DOM Level 2 Abstract Views (DocumentView interface)

        readonly attribute DOMWindow defaultView;

        // DOM Level 2 Style (DocumentStyle interface)

        readonly attribute StyleSheetList styleSheets;

        // DOM Level 2 Style (DocumentCSS interface)

        [OldStyleObjC] CSSStyleDeclaration getOverrideStyle(in Element element,
                                                            in DOMString pseudoElement);
#ifdef ENABLE_XPATH
        // DOM Level 3 XPath (XPathEvaluator interface)
        [OldStyleObjC] XPathExpression createExpression(in DOMString expression,
                                                        in XPathNSResolver resolver)
            raises(DOMException);
        XPathNSResolver    createNSResolver(in Node nodeResolver);
        [OldStyleObjC] XPathResult evaluate(in DOMString expression,
                                            in Node contextNode,
                                            in XPathNSResolver resolver,
                                            in unsigned short type,
                                            in XPathResult inResult)
            raises(DOMException);
#endif // ENABLE_XPATH
#endif // !defined(LANGUAGE_COM)

        // Common extensions

        boolean            execCommand(in DOMString command,
                                       in boolean userInterface,
                                       in [ConvertUndefinedOrNullToNullString] DOMString value);

#if defined(LANGUAGE_OBJECTIVE_C)
        // FIXME: remove the these two versions once [Optional] is implemented for Objective-C.
        boolean            execCommand(in DOMString command,
                                       in boolean userInterface);
        boolean            execCommand(in DOMString command);
#endif

        boolean            queryCommandEnabled(in DOMString command);
        boolean            queryCommandIndeterm(in DOMString command);
        boolean            queryCommandState(in DOMString command);
        boolean            queryCommandSupported(in DOMString command);
        [ConvertNullStringTo=False] DOMString queryCommandValue(in DOMString command);

        // Moved down from HTMLDocument

                 attribute [ConvertNullToNullString] DOMString title;
        readonly attribute DOMString referrer;
#if defined(LANGUAGE_JAVASCRIPT)
                 attribute [ConvertNullToNullString] DOMString domain;
#else
        readonly attribute DOMString domain;
#endif
        readonly attribute DOMString URL;

        // FIXME: the DOM spec states that this attribute can 
        // raise an exception on setting.
                 attribute [ConvertNullToNullString] DOMString cookie
                     /*setter raises (DOMException)*/;

        // FIXME: the DOM spec does NOT have this attribute
        // raising an exception.
                 attribute HTMLElement body
                     setter raises (DOMException);

        readonly attribute HTMLCollection images;
        readonly attribute HTMLCollection applets;
        readonly attribute HTMLCollection links;
        readonly attribute HTMLCollection forms;
        readonly attribute HTMLCollection anchors;
        readonly attribute DOMString lastModified;

        NodeList getElementsByName(in DOMString elementName);

#if defined(LANGUAGE_JAVASCRIPT)
                 attribute [Custom] Location location;
#endif

        // IE extensions

                 attribute [ConvertNullStringTo=Undefined, ConvertNullToNullString] DOMString charset;
        readonly attribute [ConvertNullStringTo=Undefined] DOMString defaultCharset;
        readonly attribute [ConvertNullStringTo=Undefined] DOMString readyState;

        Element            elementFromPoint(in long x, in long y);

        // Mozilla extensions
#if defined(LANGUAGE_JAVASCRIPT)
        DOMSelection       getSelection();
#endif
        readonly attribute [ConvertNullStringTo=Null] DOMString characterSet;

        // WebKit extensions

        readonly attribute [ConvertNullStringTo=Null] DOMString preferredStylesheetSet;
                 attribute [ConvertNullStringTo=Null, ConvertNullToNullString] DOMString selectedStylesheetSet;

#if !defined(LANGUAGE_COM)
#if !defined(LANGUAGE_JAVASCRIPT)
        CSSStyleDeclaration createCSSStyleDeclaration();
#endif
#endif

#if defined(LANGUAGE_OBJECTIVE_C)
        // DOM Level 2 Style Interface
        [OldStyleObjC, UsesView] CSSStyleDeclaration getComputedStyle(in Element element,
                                                                      in DOMString pseudoElement);

        // WebKit extension
        // FIXME: remove the first version once [Optional] is implemented for Objective-C.
        [UsesView] CSSRuleList getMatchedCSSRules(in Element element,
                                                  in DOMString pseudoElement);
        [UsesView] CSSRuleList getMatchedCSSRules(in Element element,
                                                  in DOMString pseudoElement,
                                                  in [Optional] boolean authorOnly);
#endif

        // HTML 5
        NodeList            getElementsByClassName(in DOMString tagname);

        // DocumentSelector - Selector API
        Element             querySelector(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
            raises(DOMException);
        NodeList            querySelectorAll(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
            raises(DOMException);
    };

}
