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

[
    ConstructorTemplate=Event,
    SkipVTableValidation
] interface MouseEvent : UIEvent {
    [InitializedByEventConstructor] readonly attribute long             screenX;
    [InitializedByEventConstructor] readonly attribute long             screenY;
    [InitializedByEventConstructor] readonly attribute long             clientX;
    [InitializedByEventConstructor] readonly attribute long             clientY;
    [InitializedByEventConstructor] readonly attribute boolean          ctrlKey;
    [InitializedByEventConstructor] readonly attribute boolean          shiftKey;
    [InitializedByEventConstructor] readonly attribute boolean          altKey;
    [InitializedByEventConstructor] readonly attribute boolean          metaKey;
    [InitializedByEventConstructor] readonly attribute unsigned short   button;
    [InitializedByEventConstructor] readonly attribute EventTarget      relatedTarget;
                                    readonly attribute long             webkitMovementX;
                                    readonly attribute long             webkitMovementY;
    
     void initMouseEvent([Optional=DefaultIsUndefined] DOMString type, 
                                       [Optional=DefaultIsUndefined] boolean canBubble, 
                                       [Optional=DefaultIsUndefined] boolean cancelable, 
                                       [Optional=DefaultIsUndefined] DOMWindow view, 
                                       [Optional=DefaultIsUndefined] long detail, 
                                       [Optional=DefaultIsUndefined] long screenX, 
                                       [Optional=DefaultIsUndefined] long screenY, 
                                       [Optional=DefaultIsUndefined] long clientX, 
                                       [Optional=DefaultIsUndefined] long clientY, 
                                       [Optional=DefaultIsUndefined] boolean ctrlKey, 
                                       [Optional=DefaultIsUndefined] boolean altKey, 
                                       [Optional=DefaultIsUndefined] boolean shiftKey, 
                                       [Optional=DefaultIsUndefined] boolean metaKey, 
                                       [Optional=DefaultIsUndefined] unsigned short button, 
                                       [Optional=DefaultIsUndefined] EventTarget relatedTarget);

    // extensions
    readonly attribute long             offsetX;
    readonly attribute long             offsetY;
    readonly attribute long             x;
    readonly attribute long             y;
    readonly attribute Node             fromElement;
    readonly attribute Node             toElement;

    readonly attribute Clipboard        dataTransfer;
};

