/*
 * 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";
import "DOMWindow.idl";
#endif

interface IDOMEvent;
interface IDOMEventException;
interface IDOMEventTarget;
interface IDOMKeyboardEvent;
interface IDOMMouseEvent;
interface IDOMMutationEvent;
interface IDOMNode;
interface IDOMOverflowEvent;
interface IDOMUIEvent;
interface IDOMWheelEvent;
interface IDOMWindow;

typedef long long DOMTimeStamp;

[
    object,
    oleautomation,
    uuid(7f8a0a96-f864-44fb-87fb-c5f03666e8e6),
    pointer_default(unique)
]
interface IDOMEventListener : IDOMObject
{
    //void               handleEvent(in Event evt);
    HRESULT handleEvent([in] IDOMEvent* evt);
}

[
    object,
    oleautomation,
    uuid(62343a9e-a779-4e91-818a-14fc178cf4c2),
    pointer_default(unique)
]
interface IDOMEvent : IDOMObject
{
    // DOM PhaseType
    const unsigned short DOMEVENT_CAPTURING_PHASE     = 1;
    const unsigned short DOMEVENT_AT_TARGET           = 2;
    const unsigned short DOMEVENT_BUBBLING_PHASE      = 3;

    // Reverse-engineered from Netscape
    const unsigned short DOMEVENT_MOUSEDOWN           = 1;
    const unsigned short DOMEVENT_MOUSEUP             = 2;
    const unsigned short DOMEVENT_MOUSEOVER           = 4;
    const unsigned short DOMEVENT_MOUSEOUT            = 8;
    const unsigned short DOMEVENT_MOUSEMOVE           = 16;
    const unsigned short DOMEVENT_MOUSEDRAG           = 32;
    const unsigned short DOMEVENT_CLICK               = 64;
    const unsigned short DOMEVENT_DBLCLICK            = 128;
    const unsigned short DOMEVENT_KEYDOWN             = 256;
    const unsigned short DOMEVENT_KEYUP               = 512;
    const unsigned short DOMEVENT_KEYPRESS            = 1024;
    const unsigned short DOMEVENT_DRAGDROP            = 2048;
    const unsigned short DOMEVENT_FOCUS               = 4096;
    const unsigned short DOMEVENT_BLUR                = 8192;
    const unsigned short DOMEVENT_SELECT              = 16384;
    const unsigned short DOMEVENT_CHANGE              = 32768;

    //readonly attribute DOMString        type;
    HRESULT type([out, retval] BSTR* result);

    //readonly attribute EventTarget      target;
    HRESULT target([out, retval] IDOMEventTarget** result);

    //readonly attribute EventTarget      currentTarget;
    HRESULT currentTarget([out, retval] IDOMEventTarget** result);

    //readonly attribute unsigned short   eventPhase;
    HRESULT eventPhase([out, retval] unsigned short* result);

    //readonly attribute boolean          bubbles;
    HRESULT bubbles([out, retval] BOOL* result);

    //readonly attribute boolean          cancelable;
    HRESULT cancelable([out, retval] BOOL* result);

    //readonly attribute DOMTimeStamp     timeStamp;
    HRESULT timeStamp([out, retval] DOMTimeStamp* result);

    //void               stopPropagation();
    HRESULT stopPropagation();

    //void               preventDefault();
    HRESULT preventDefault();

    //[OldStyleObjC] void initEvent(in DOMString eventTypeArg, 
    //                              in boolean canBubbleArg, 
    //                              in boolean cancelableArg);
    HRESULT initEvent([in] BSTR eventTypeArg, [in] BOOL canBubbleArg, [in] BOOL cancelableArg);
}

[
    object,
    oleautomation,
    uuid(c7cf7d84-d755-40bc-b664-84bc79eff709),
    pointer_default(unique)
]
interface IDOMEventTarget : IUnknown
{
    //void               addEventListener(in DOMString type, 
    //                                    in EventListener listener, 
    //                                    in boolean useCapture);
    HRESULT addEventListener([in] BSTR type, [in] IDOMEventListener* listener, [in] BOOL useCapture);

    //void               removeEventListener(in DOMString type, 
    //                                       in EventListener listener, 
    //                                       in boolean useCapture);
    HRESULT removeEventListener([in] BSTR type, [in] IDOMEventListener* listener, [in] BOOL useCapture);

    //boolean            dispatchEvent(in Event event)
    HRESULT dispatchEvent([in] IDOMEvent* event, [out, retval] BOOL* result);
}

[
    object,
    oleautomation,
    uuid(55AAF192-68CD-409f-A551-89710DC7240A),
    pointer_default(unique)
]
interface IDOMDocumentEvent : IUnknown
{
    //Event              createEvent(in DOMString eventType)
    //    raises(DOMException);
    HRESULT createEvent([in] BSTR eventType, [out, retval] IDOMEvent** result);
}

[
    object,
    oleautomation,
    uuid(76bc4e46-67df-40d3-89b0-a94dcc2ed507),
    pointer_default(unique)
]
interface IDOMKeyboardEvent : IDOMUIEvent
{
    // KeyLocationCode
    const unsigned long       DOMKEYBOARDEVENT_KEY_LOCATION_STANDARD      = 0x00;
    const unsigned long       DOMKEYBOARDEVENT_KEY_LOCATION_LEFT          = 0x01;
    const unsigned long       DOMKEYBOARDEVENT_KEY_LOCATION_RIGHT         = 0x02;
    const unsigned long       DOMKEYBOARDEVENT_KEY_LOCATION_NUMPAD        = 0x03;

    //readonly attribute DOMString        keyIdentifier;
    HRESULT keyIdentifier([out, retval] BSTR* result);

    //readonly attribute unsigned long    keyLocation;
    HRESULT keyLocation([out, retval] unsigned long* result);

    //readonly attribute boolean          ctrlKey;
    HRESULT ctrlKey([out, retval] BOOL* result);

    //readonly attribute boolean          shiftKey;
    HRESULT shiftKey([out, retval] BOOL* result);

    //readonly attribute boolean          altKey;
    HRESULT altKey([out, retval] BOOL* result);

    //readonly attribute boolean          metaKey;
    HRESULT metaKey([out, retval] BOOL* result);

    //readonly attribute boolean          altGraphKey;
    HRESULT altGraphKey([out, retval] BOOL* result);

    //boolean getModifierState(in DOMString keyIdentifierArg);
    HRESULT getModifierState([in] BSTR keyIdentifierArg, [out, retval] BOOL* result);

    // FIXME: this does not match the version in the DOM spec.
    //void initKeyboardEvent(in AtomicString type, 
    //                       in boolean canBubble, 
    //                       in boolean cancelable, 
    //                       in DOMWindow view, 
    //                       in DOMString keyIdentifier,
    //                       in unsigned long keyLocation,
    //                       in boolean ctrlKey,
    //                       in boolean altKey,
    //                       in boolean shiftKey,
    //                       in boolean metaKey,
    //                       in boolean altGraphKey);
    HRESULT initKeyboardEvent([in] BSTR type, [in] BOOL canBubble, [in] BOOL cancelable, [in] IDOMWindow* view, [in] BSTR keyIdentifier, [in] unsigned long keyLocation, [in] BOOL ctrlKey, [in] BOOL altKey, [in] BOOL shiftKey, [in] BOOL metaKey, [in] BOOL graphKey);

    // WebKit Extensions
    //readonly attribute long             keyCode;
    //HRESULT keyCode([out, retval] long* result);

    //readonly attribute long             charCode;
    //HRESULT charCode([out, retval] long* result);

    //void initKeyboardEvent(in AtomicString type, 
    //                       in boolean canBubble, 
    //                       in boolean cancelable, 
    //                       in DOMWindow view, 
    //                       in DOMString keyIdentifier,
    //                       in unsigned long keyLocation,
    //                       in boolean ctrlKey,
    //                       in boolean altKey,
    //                       in boolean shiftKey,
    //                       in boolean metaKey);
}

[
    object,
    oleautomation,
    uuid(bdd97151-5f6a-4ba4-a902-9b008392eb54),
    pointer_default(unique)
]
interface IDOMMouseEvent : IDOMUIEvent
{
    //readonly attribute long             screenX;
    HRESULT screenX([out, retval] long* result);

    //readonly attribute long             screenY;
    HRESULT screenY([out, retval] long* result);

    //readonly attribute long             clientX;
    HRESULT clientX([out, retval] long* result);

    //readonly attribute long             clientY;
    HRESULT clientY([out, retval] long* result);

    //readonly attribute boolean          ctrlKey;
    HRESULT ctrlKey([out, retval] BOOL* result);

    //readonly attribute boolean          shiftKey;
    HRESULT shiftKey([out, retval] BOOL* result);

    //readonly attribute boolean          altKey;
    HRESULT altKey([out, retval] BOOL* result);

    //readonly attribute boolean          metaKey;
    HRESULT metaKey([out, retval] BOOL* result);

    //readonly attribute unsigned short   button;
    HRESULT button([out, retval] unsigned short* result);

    //readonly attribute EventTarget      relatedTarget;
    HRESULT relatedTarget([out, retval] IDOMEventTarget** result);

    //[OldStyleObjC] void initMouseEvent(in AtomicString type, 
    //                                   in boolean canBubble, 
    //                                   in boolean cancelable, 
    //                                   in DOMWindow view, 
    //                                   in long detail, 
    //                                   in long screenX, 
    //                                   in long screenY, 
    //                                   in long clientX, 
    //                                   in long clientY, 
    //                                   in boolean ctrlKey, 
    //                                   in boolean altKey, 
    //                                   in boolean shiftKey, 
    //                                   in boolean metaKey, 
    //                                   in unsigned short button, 
    //                                   in EventTarget relatedTarget);
    HRESULT initMouseEvent([in] BSTR type, [in] BOOL canBubble, [in] BOOL cancelable, [in] IDOMWindow* view, [in] long detail, [in] long screenX, [in] long screenY, [in] long clientX, [in] long clientY, [in] BOOL ctrlKey, [in] BOOL altKey, [in] BOOL shiftKey, [in] BOOL metaKey, [in] unsigned short button, [in] IDOMEventTarget* relatedTarget);

    // extensions
    //readonly attribute long             offsetX;
    HRESULT offsetX([out, retval] long* result);

    //readonly attribute long             offsetY;
    HRESULT offsetY([out, retval] long* result);

    //readonly attribute long             x;
    HRESULT x([out, retval] long* result);

    //readonly attribute long             y;
    HRESULT y([out, retval] long* result);

    //readonly attribute Node             fromElement;
    HRESULT fromElement([out, retval] IDOMNode** result);

    //readonly attribute Node             toElement;
    HRESULT toElement([out, retval] IDOMNode** result);
}

[
    object,
    oleautomation,
    uuid(6345d228-ea67-48ee-93c8-ff6e9c6356e9),
    pointer_default(unique)
]
interface IDOMMutationEvent : IDOMEvent
{
    // attrChangeType
    const unsigned short DOMMUTATIONEVENT_MODIFICATION = 1;
    const unsigned short DOMMUTATIONEVENT_ADDITION     = 2;
    const unsigned short DOMMUTATIONEVENT_REMOVAL      = 3;

    //readonly attribute Node           relatedNode;
    HRESULT relatedNode([out, retval] IDOMNode** result);

    //readonly attribute DOMString      prevValue;
    HRESULT prevValue([out, retval] BSTR* result);

    //readonly attribute DOMString      newValue;
    HRESULT newValue([out, retval] BSTR* result);

    //readonly attribute DOMString      attrName;
    HRESULT attrName([out, retval] BSTR* result);

    //readonly attribute unsigned short attrChange;
    HRESULT attrChange([out, retval] unsigned short* result);

    //[OldStyleObjC] void initMutationEvent(in AtomicString type, 
    //                                      in boolean canBubble, 
    //                                      in boolean cancelable, 
    //                                      in Node relatedNode, 
    //                                      in DOMString prevValue, 
    //                                      in DOMString newValue, 
    //                                      in DOMString attrName, 
    //                                      in unsigned short attrChange);
    HRESULT initMutationEvent([in] BSTR type, [in] BOOL canBubble, [in] BOOL cancelable, [in] IDOMNode* relatedNode, [in] BSTR prevValue, [in] BSTR newValue, [in] BSTR attrName, [in] unsigned short attrChange);
}

[
    object,
    oleautomation,
    uuid(6048369e-e444-401b-950d-c9daef9384d2),
    pointer_default(unique)
]
interface IDOMOverflowEvent : IDOMEvent
{
    const unsigned short DOMOVERFLOWEVENT_HORIZONTAL = 0;
    const unsigned short DOMOVERFLOWEVENT_VERTICAL   = 1;
    const unsigned short DOMOVERFLOWEVENT_BOTH       = 2;
    
    //readonly attribute unsigned short orient;
    HRESULT orient([out, retval] unsigned short* result);

    //readonly attribute boolean horizontalOverflow;
    HRESULT horizontalOverflow([out, retval] BOOL* result);

    //readonly attribute boolean verticalOverflow;
    HRESULT verticalOverflow([out, retval] BOOL* result);
}

[
    object,
    oleautomation,
    uuid(b928261d-7c9e-4156-af71-6f698bd97788),
    pointer_default(unique)
]
interface IDOMUIEvent : IDOMEvent
{
    //readonly attribute DOMWindow            view;
    HRESULT view([out, retval] IDOMWindow** result);

    //readonly attribute long                 detail;
    HRESULT detail([out, retval] long* result);

    //[OldStyleObjC] void initUIEvent(in AtomicString type, 
    //                                in boolean canBubble, 
    //                                in boolean cancelable, 
    //                                in DOMWindow view, 
    //                                in long detail);
    HRESULT initUIEvent([in] BSTR type, [in] BOOL canBubble, [in] BOOL cancelable, [in] IDOMWindow* view, [in] long detail);

    // extentsions
    //readonly attribute long                 keyCode;
    HRESULT keyCode([out, retval] long* result);

    //readonly attribute long                 charCode;
    HRESULT charCode([out, retval] long* result);

    //readonly attribute long                 layerX;
    HRESULT layerX([out, retval] long* result);

    //readonly attribute long                 layerY;
    HRESULT layerY([out, retval] long* result);

    //readonly attribute long                 pageX;
    HRESULT pageX([out, retval] long* result);

    //readonly attribute long                 pageY;
    HRESULT pageY([out, retval] long* result);

    //readonly attribute long                 which;
    HRESULT which([out, retval] long* result);
}

[
    object,
    oleautomation,
    uuid(5404e6d9-a2bb-4c74-8070-ce9d2599bd00),
    pointer_default(unique)
]
interface IDOMWheelEvent : IDOMUIEvent
{
    //readonly attribute long    screenX;
    HRESULT screenX([out, retval] long* result);

    //readonly attribute long    screenY;
    HRESULT screenY([out, retval] long* result);

    //readonly attribute long    clientX;
    HRESULT clientX([out, retval] long* result);

    //readonly attribute long    clientY;
    HRESULT clientY([out, retval] long* result);

    //readonly attribute boolean ctrlKey;
    HRESULT ctrlKey([out, retval] BOOL* result);

    //readonly attribute boolean shiftKey;
    HRESULT shiftKey([out, retval] BOOL* result);

    //readonly attribute boolean altKey;
    HRESULT altKey([out, retval] BOOL* result);

    //readonly attribute boolean metaKey;
    HRESULT metaKey([out, retval] BOOL* result);

    //readonly attribute long    wheelDelta;
    HRESULT wheelDelta([out, retval] long* result);

    //readonly attribute long    wheelDeltaX;
    HRESULT wheelDeltaX([out, retval] long* result);

    //readonly attribute long    wheelDeltaY;
    HRESULT wheelDeltaY([out, retval] long* result);

    // WebKit Extensions
    //readonly attribute long    offsetX;
    HRESULT offsetX([out, retval] long* result);

    //readonly attribute long    offsetY;
    HRESULT offsetY([out, retval] long* result);

    //readonly attribute long    x;
    HRESULT x([out, retval] long* result);

    //readonly attribute long    y;
    HRESULT y([out, retval] long* result);

    //readonly attribute boolean isHorizontal;
    HRESULT isHorizontal([out, retval] BOOL* result);

    //void initWheelEvent(in long wheelDeltaX,
    //                    in long wheelDeltaY, 
    //                    in DOMWindow view, 
    //                    in long screenX,
    //                    in long screenY,
    //                    in long clientX,
    //                    in long clientY,
    //                    in boolean ctrlKey,
    //                    in boolean altKey,
    //                    in boolean shiftKey,
    //                    in boolean metaKey);
    HRESULT initWheelEvent([in] long wheelDeltaX, [in] long wheelDeltaY, [in] IDOMWindow* view, [in] long screenX, [in] long screenY, [in] long clientX, [in] long clientY, [in] BOOL ctrlKey, [in] BOOL altKey, [in] BOOL shiftKey, [in] BOOL metaKey);
}
