/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
import "DOMCore.idl";
#endif

interface IDOMHTMLElement;
interface IDOMHTMLFormElement;
interface IDOMHTMLTableCaptionElement;
interface IDOMHTMLTableSectionElement;
interface IDOMDocument;
interface IDOMElement;
interface IDOMNode;
interface IDOMNodeList;
interface IWebFrame;

/*
    @interface DOMHTMLCollection : DOMObject
*/
[
    object,
    oleautomation,
    uuid(DD8E4E33-D1D4-48e7-BB23-6DC3D7CCEC42),
    pointer_default(unique)
]
interface IDOMHTMLCollection : IDOMObject
{
    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] UINT* result);

    /*
        - (DOMNode *)item:(unsigned)index;
    */
    HRESULT item([in] UINT index, [out, retval] IDOMNode** node);

    /*
        - (DOMNode *)namedItem:(NSString *)name;
    */
    HRESULT namedItem([in] BSTR name, [out, retval] IDOMNode** node);
}

/*
    @interface DOMHTMLOptionsCollection : DOMObject
*/
[
    object,
    oleautomation,
    uuid(1AD98D99-163C-4c04-B6EE-85A3DD31F5C4),
    pointer_default(unique)
]
interface IDOMHTMLOptionsCollection : IDOMObject
{
    /*
        - (unsigned)length;
    */
    HRESULT length([out, retval] unsigned int* result);

    /*
        - (void)setLength:(unsigned)length;
    */
    HRESULT setLength([in] unsigned int length);

    /*
        - (DOMNode *)item:(unsigned)index;
    */
    HRESULT item([in] unsigned int index, [out, retval] IDOMNode** result);

    /*
        - (DOMNode *)namedItem:(NSString *)name;
    */
    HRESULT namedItem([in] BSTR name, [out, retval] IDOMNode** result);
}

/*
    @interface DOMHTMLDocument : DOMDocument
*/
[
    object,
    oleautomation,
    uuid(A7DF8485-25B7-4a98-B70C-1E29CAA00597),
    pointer_default(unique)
]
interface IDOMHTMLDocument : IDOMDocument
{
    /*
        - (NSString *)title;
    */
    HRESULT title([out, retval] BSTR* result);

    /*
        - (void)setTitle:(NSString *)title;
    */
    HRESULT setTitle([in] BSTR title);

    /*
        - (NSString *)referrer;
    */
    HRESULT referrer([out, retval] BSTR* result);

    /*
        - (NSString *)domain;
    */
    HRESULT domain([out, retval] BSTR* result);

    /*
        - (NSString *)URL;
    */
    HRESULT URL([out, retval] BSTR* result);

    /*
        - (DOMHTMLElement *)body;
    */
    HRESULT body([out, retval] IDOMHTMLElement** bodyElement);

    /*
        - (void)setBody:(DOMHTMLElement *)body;
    */
    HRESULT setBody([in] IDOMHTMLElement* body);

    /*
        - (DOMHTMLCollection *)images;
    */
    HRESULT images([out, retval] IDOMHTMLCollection** collection);

    /*
        - (DOMHTMLCollection *)applets;
    */
    HRESULT applets([out, retval] IDOMHTMLCollection** collection);

    /*
        - (DOMHTMLCollection *)links;
    */
    HRESULT links([out, retval] IDOMHTMLCollection** collection);

    /*
        - (DOMHTMLCollection *)forms;
    */
    HRESULT forms([out, retval] IDOMHTMLCollection** collection);

    /*
        - (DOMHTMLCollection *)anchors;
    */
    HRESULT anchors([out, retval] IDOMHTMLCollection** collection);

    /*
        - (NSString *)cookie;
    */
    HRESULT cookie([out, retval] BSTR* result);

    /*
        - (void)setCookie:(NSString *)cookie;
    */
    HRESULT setCookie([in] BSTR cookie);

    /*
        - (void)open;
    */
    HRESULT open();

    /*
        - (void)close;
    */
    HRESULT close();

    /*
        - (void)write:(NSString *)text;
    */
    HRESULT write([in] BSTR text);

    /*
        - (void)writeln:(NSString *)text;
    */
    HRESULT writeln([in] BSTR text);

    /*
        - (DOMElement *)getElementById:(NSString *)elementId;
    */
    HRESULT getElementById_([in] BSTR elementId, [out, retval] IDOMElement** element);

    /*
        - (DOMNodeList *)getElementsByName:(NSString *)elementName;
    */
    HRESULT getElementsByName([in] BSTR elementName, [out, retval] IDOMNodeList** nodeList);
}

/*
    @interface DOMHTMLElement : DOMElement
*/
[
    object,
    oleautomation,
    uuid(EBD5F41D-FF65-41d8-97C9-FCE3A3D4CC3E),
    pointer_default(unique)
]
interface IDOMHTMLElement : IDOMElement
{
    /*
        - (NSString *)idName;
    */
    HRESULT idName([out, retval] BSTR* result);

    /*
        - (void)setIdName:(NSString *)idName;
    */
    HRESULT setIdName([in] BSTR idName);

    /*
        - (NSString *)title;
    */
    HRESULT title([out, retval] BSTR* result);

    /*
        - (void)setTitle:(NSString *)title;
    */
    HRESULT setTitle([in] BSTR title);

    /*
        - (NSString *)lang;
    */
    HRESULT lang([out, retval] BSTR* result);

    /*
        - (void)setLang:(NSString *)lang;
    */
    HRESULT setLang([in] BSTR lang);

    /*
        - (NSString *)dir;
    */
    HRESULT dir([out, retval] BSTR* result);

    /*
        - (void)setDir:(NSString *)dir;
    */
    HRESULT setDir([in] BSTR dir);

    /*
        - (NSString *)className;
    */
    HRESULT className([out, retval] BSTR* result);

    /*
        - (void)setClassName:(NSString *)className;
    */
    HRESULT setClassName([in] BSTR className);

    /*
        - (NSString *)innerHTML;
    */
    HRESULT innerHTML([out, retval] BSTR* result);
    
    /*
        - (void)setInnerHTML:(NSString *)innerHTML;
    */
    HRESULT setInnerHTML([in] BSTR html);

    /*
        - (NSString *)innerHTML;
    */
    HRESULT innerText([out, retval] BSTR* result);

    /*
        - (void)setInnerText:(NSString *)innerText;
    */
    HRESULT setInnerText([in] BSTR text);
}

/*
    @interface DOMHTMLFormElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(DF5C0054-DDDB-4888-9198-7A4E4EBF8D69),
    pointer_default(unique)
]
interface IDOMHTMLFormElement : IDOMHTMLElement
{
    /*
        - (DOMHTMLCollection *)elements;
    */
    HRESULT elements([out, retval] IDOMHTMLCollection** result);

    /*
        - (int)length;
    */
    HRESULT length([out, retval] int* result);

    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* result);

    /*
        - (void)setName:(NSString *)name;
    */
    HRESULT setName([in] BSTR name);

    /*
        - (NSString *)acceptCharset;
    */
    HRESULT acceptCharset([out, retval] BSTR* result);
    /*
        - (void)setAcceptCharset:(NSString *)acceptCharset;
    */
    HRESULT setAcceptCharset([in] BSTR acceptCharset);

    /*
        - (NSString *)action;
    */
    HRESULT action([out, retval] BSTR* result);

    /*
        - (void)setAction:(NSString *)action;
    */
    HRESULT setAction([in] BSTR action);

    /*
        - (NSString *)enctype;
    */
    HRESULT encType([out, retval] BSTR* result);

    /*
        - (void)setEnctype:(NSString *)enctype;
    */
    HRESULT setEnctype([out, retval] BSTR* encType);

    /*
        - (NSString *)method;
    */
    HRESULT method([out, retval] BSTR* method);

    /*
        - (void)setMethod:(NSString *)method;
    */
    HRESULT setMethod([in] BSTR method);

    /*
        - (NSString *)target;
    */
    HRESULT target([out, retval] BSTR* result);

    /*
        - (void)setTarget:(NSString *)target;
    */
    HRESULT setTarget([in] BSTR target);

    /*
        - (void)submit;
    */
    HRESULT submit();

    /*
        - (void)reset;
    */
    HRESULT reset();
}

/*
    @interface DOMHTMLSelectElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(3825AA04-B38F-4399-95BB-F5410B29594A),
    pointer_default(unique)
]
interface IDOMHTMLSelectElement : IDOMHTMLElement
{
    /*
        - (NSString *)type;
    */
    HRESULT type([out, retval] BSTR* result);

    /*
        - (int)selectedIndex;
    */
    HRESULT selectedIndex([out, retval] int* result);

    /*
        - (void)setSelectedIndex:(int)selectedIndex;
    */
    HRESULT setSelectedIndx([in] int selectedIndex);

    /*
        - (NSString *)value;
    */
    HRESULT value([out, retval] BSTR* result);

    /*
        - (void)setValue:(NSString *)value;
    */
    HRESULT setValue([in] BSTR value);

    /*
        - (int)length;
    */
    HRESULT length([out, retval] int* result);

    /*
        - (DOMHTMLFormElement *)form;
    */
    HRESULT form([out, retval] IDOMHTMLFormElement** result);

    /*
        - (DOMHTMLOptionsCollection *)options;
    */
    HRESULT options([out, retval] IDOMHTMLOptionsCollection** result);

    /*
        - (BOOL)disabled;
    */
    HRESULT disabled([out, retval] BOOL* result);

    /*
        - (void)setDisabled:(BOOL)disabled;
    */
    HRESULT setDisabled([in] BOOL disabled);

    /*
        - (BOOL)multiple;
    */
    HRESULT multiple([out, retval] BOOL* result);

    /*
        - (void)setMultiple:(BOOL)multiple;
    */
    HRESULT setMultiple([in] BOOL multiple);

    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* result);

    /*
        - (void)setName:(NSString *)name;
    */
    HRESULT setName([in] BSTR name);

    /*
        - (int)size;
    */
    HRESULT size([out, retval] int* size);

    /*
        - (void)setSize:(int)size;
    */
    HRESULT setSize([in] int size);

    /*
        - (int)tabIndex;
    */
    HRESULT tabIndex([out, retval] int* result);

    /*
        - (void)setTabIndex:(int)tabIndex;
    */
    HRESULT setTabIndex([in] int tabIndex);

    /*
        - (void)add:(DOMHTMLElement *)element :(DOMHTMLElement *)before;
    */
    HRESULT add([in] IDOMHTMLElement* element, [in] IDOMHTMLElement* before);

    /*
        - (void)remove:(int)index;
    */
    HRESULT remove([in] int index);

    /*
        - (void)blur;
    */
    HRESULT blur();

    /*
        - (void)focus;
    */
    HRESULT focus();
}

/*
    @interface DOMHTMLOptionElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(0E1EF5AB-4008-4d83-9135-D4DC1B4603D4),
    pointer_default(unique)
]
interface IDOMHTMLOptionElement : IDOMHTMLElement
{
    /*
        - (DOMHTMLFormElement *)form;
    */
    HRESULT form([out, retval] IDOMHTMLFormElement** result);

    /*
        - (BOOL)defaultSelected;
    */
    HRESULT defaultSelected([out, retval] BOOL* result);

    /*
        - (void)setDefaultSelected:(BOOL)defaultSelected;
    */
    HRESULT setDefaultSelected([in] BOOL defaultSelected);

    /*
        - (NSString *)text;
    */
    HRESULT text([out, retval] BSTR* result);

    /*
        - (int)index;
    */
    HRESULT index([out, retval] int* result);

    /*
        - (BOOL)disabled;
    */
    HRESULT disabled([out, retval] BOOL* result);

    /*
        - (void)setDisabled:(BOOL)disabled;
    */
    HRESULT setDisabled([in] BOOL disabled);

    /*
        - (NSString *)label;
    */
    HRESULT label([out, retval] BSTR* result);

    /*
        - (void)setLabel:(NSString *)label;
    */
    HRESULT setLabel([in] BSTR label);

    /*
        - (BOOL)selected;
    */
    HRESULT selected([out, retval] BOOL* result);

    /*
        - (void)setSelected:(BOOL)selected;
    */
    HRESULT setSelected([in] BOOL selected);

    /*
        - (NSString *)value;
    */
    HRESULT value([out, retval] BSTR* result);

    /*
        - (void)setValue:(NSString *)value;
    */
    HRESULT setValue([in] BSTR value);
}

/*
    @interface DOMHTMLInputElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(80C40AC5-1755-4894-812F-479269C262A2),
    pointer_default(unique)
]
/* FIXME: The Safari app currently relies on IDOMHTMLInputElement inheriting from
   IDOMElement. This can't be changed until a version of SafariWin which no longer 
   makes this assumption is released.
*/
interface IDOMHTMLInputElement : IDOMElement
{
    /*
        - (NSString *)defaultValue;
    */
    HRESULT defaultValue([out, retval] BSTR* result);

    /*
        - (void)setDefaultValue:(NSString *)defaultValue;
    */
    HRESULT setDefaultValue([in] BSTR val);

    /*
        - (BOOL)defaultChecked;
    */
    HRESULT defaultChecked([out, retval] BOOL* result);

    /*
        - (void)setDefaultChecked:(BOOL)defaultChecked;
    */
    HRESULT setDefaultChecked([in] BSTR checked);

    /*
        - (DOMHTMLFormElement *)form;
    */
    HRESULT form([out, retval] IDOMHTMLElement** result);

    /*
        - (NSString *)accept;
    */
    HRESULT accept([out, retval] BSTR* result);

    /*
        - (void)setAccept:(NSString *)accept;
    */
    HRESULT setAccept([in] BSTR accept);

    /*
        - (NSString *)accessKey;
    */
    HRESULT accessKey([out, retval] BSTR* result);

    /*
        - (void)setAccessKey:(NSString *)accessKey;
    */
    HRESULT setAccessKey([in] BSTR key);

    /*
        - (NSString *)align;
    */
    HRESULT align([out, retval] BSTR* result);

    /*
        - (void)setAlign:(NSString *)align;
    */
    HRESULT setAlign([in] BSTR align);

    /*
        - (NSString *)alt;
    */
    HRESULT alt([out, retval] BSTR* result);

    /*
        - (void)setAlt:(NSString *)alt;
    */
    HRESULT setAlt([in] BSTR alt);

    /*
        - (BOOL)checked;
    */
    HRESULT checked([out, retval] BOOL* result);

    /*
        - (void)setChecked:(BOOL)checked;
    */
    HRESULT setChecked([in] BOOL checked);

    /*
        - (BOOL)disabled;
    */
    HRESULT disabled([out, retval] BOOL* result);

    /*
        - (void)setDisabled:(BOOL)disabled;
    */
    HRESULT setDisabled([in] BOOL disabled);

    /*
        - (int)maxLength;
    */
    HRESULT maxLength([out, retval] int* result);

    /*
        - (void)setMaxLength:(int)maxLength;
    */
    HRESULT setMaxLength([in] int maxLength);

    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* name);

    /*
        - (void)setName:(NSString *)name;
    */
    HRESULT setName([in] BSTR name);

    /*
        - (BOOL)readOnly;
    */
    HRESULT readOnly([out, retval] BOOL* result);

    /*
        - (void)setReadOnly:(BOOL)readOnly;
    */
    HRESULT setReadOnly([in] BOOL readOnly);

    /*
        - (unsigned)size;
    */
    HRESULT size([out, retval] unsigned int *result);

    /*
        - (void)setSize:(unsigned)size;
    */
    HRESULT setSize([in] unsigned int size);

    /*
        - (NSString *)src;
    */
    HRESULT src([out, retval] BSTR* result);

    /*
        - (void)setSrc:(NSString *)src;
    */
    HRESULT setSrc([in] BSTR src);

    /*
        - (int)tabIndex;
    */
    HRESULT tabIndex([out, retval] int* result);

    /*
        - (void)setTabIndex:(int)tabIndex;
    */
    HRESULT setTabIndex([in] int tabIndex);

    /*
        - (NSString *)type;
    */
    HRESULT type([out, retval] BSTR* result);

    /*
        - (void)setType:(NSString *)type;
    */
    HRESULT setType([in] BSTR type);

    /*
        - (NSString *)useMap;
    */
    HRESULT useMap([out, retval] BSTR* result);

    /*
        - (void)setUseMap:(NSString *)useMap;
    */
    HRESULT setUseMap([in] BSTR useMap);

    /*
        - (NSString *)value;
    */
    HRESULT value([out, retval] BSTR* result);

    /*
        - (void)setValue:(NSString *)value;
    */
    HRESULT setValue([in] BSTR value);

    /*
        - (void)blur;
    */
    HRESULT blur();

    /*
        - (void)focus;
    */
    HRESULT focus();

    /*
        - (void)select;
    */
    HRESULT select();

    /*
        - (void)click;
    */
    HRESULT click();

    // FIXME - this is not in objC bindings at the moment
    // attribute long selectionStart;
    HRESULT setSelectionStart([in] long start);
    HRESULT selectionStart([out, retval] long* start);

    // FIXME - thisis not in the objC bindings at the moment
    // attribute long selectionEnd;
    HRESULT setSelectionEnd([in] long end);
    HRESULT selectionEnd([out, retval] long* end);

    /*
        - (void)setValueForUser:(NSString *)value;
    */
    HRESULT setValueForUser([in] BSTR value);
}

/*
    @interface DOMHTMLTextAreaElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(298B02B7-3EB5-4ba4-AD3F-7FA53241AADE),
    pointer_default(unique)
]
interface IDOMHTMLTextAreaElement : IDOMHTMLElement
{
    /*
        - (NSString *)defaultValue;
    */
    HRESULT defaultValue([out, retval] BSTR* result);

    /*
        - (void)setDefaultValue:(NSString *)defaultValue;
    */
    HRESULT setDefaultValue([in] BSTR val);

    /*
        - (DOMHTMLFormElement *)form;
    */
    HRESULT form([out, retval] IDOMHTMLElement** result);

    /*
        - (NSString *)accessKey;
    */
    HRESULT accessKey([out, retval] BSTR* result);

    /*
        - (void)setAccessKey:(NSString *)accessKey;
    */
    HRESULT setAccessKey([in] BSTR key);

    /*
        - (int)cols;
    */
    HRESULT cols([out, retval] int* result);

    /*
        - (void)setCols:(int)cols;
    */
    HRESULT setCols([in] int cols);

    /*
        - (BOOL)disabled;
    */
    HRESULT disabled([out, retval] BOOL* result);

    /*
        - (void)setDisabled:(BOOL)disabled;
    */
    HRESULT setDisabled([in] BOOL disabled);

    /*
        - (NSString *)name;
    */
    HRESULT name([out, retval] BSTR* name);

    /*
        - (void)setName:(NSString *)name;
    */
    HRESULT setName([in] BSTR name);

    /*
        - (BOOL)readOnly;
    */
    HRESULT readOnly([out, retval] BOOL* result);

    /*
        - (void)setReadOnly:(BOOL)readOnly;
    */
    HRESULT setReadOnly([in] BOOL readOnly);

    /*
        - (int)rows;
    */
    HRESULT rows([out, retval] int* result);

    /*
        - (void)setRows:(int)rows;
    */
    HRESULT setRows([in] int rows);

    /*
        - (int)tabIndex;
    */
    HRESULT tabIndex([out, retval] int* result);

    /*
        - (void)setTabIndex:(int)tabIndex;
    */
    HRESULT setTabIndex([in] int tabIndex);

    /*
        - (NSString *)type;
    */
    HRESULT type([out, retval] BSTR* result);

    /*
        - (NSString *)value;
    */
    HRESULT value([out, retval] BSTR* result);

    /*
        - (void)setValue:(NSString *)value;
    */
    HRESULT setValue([in] BSTR value);

    /*
        - (void)blur;
    */
    HRESULT blur();

    /*
        - (void)focus;
    */
    HRESULT focus();

    /*
        - (void)select;
    */
    HRESULT select();
}

/*
    @interface DOMHTMLIFrameElement : DOMHTMLElement
*/
[
    object,
    oleautomation,
    uuid(8CFFB1DA-7BA5-4cf7-B7E6-80583354855B),
    pointer_default(unique)
]
interface IDOMHTMLIFrameElement : IDOMHTMLElement
{
    HRESULT contentFrame([out, retval] IWebFrame** result);
}
