/*
 * Copyright (C) 2006 Apple Computer, Inc.
 * 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.
 */

[
    ConstructorTemplate=Event
] interface KeyboardEvent : UIEvent {
    const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
    const unsigned long DOM_KEY_LOCATION_LEFT     = 0x01;
    const unsigned long DOM_KEY_LOCATION_RIGHT    = 0x02;
    const unsigned long DOM_KEY_LOCATION_NUMPAD   = 0x03;
    // FIXME: The following constants are defined in the specification but
    // not yet supported (crbug.com/265446).
    // const unsigned long DOM_KEY_LOCATION_MOBILE   = 0x04;
    // const unsigned long DOM_KEY_LOCATION_JOYSTICK = 0x05;

    [InitializedByEventConstructor] readonly attribute DOMString        keyIdentifier;
    [InitializedByEventConstructor] readonly attribute unsigned long    location;
    [ImplementedAs=location, DeprecateAs=KeyboardEventKeyLocation, InitializedByEventConstructor] readonly attribute unsigned long keyLocation; // Deprecated.
    [InitializedByEventConstructor] readonly attribute boolean          ctrlKey;
    [InitializedByEventConstructor] readonly attribute boolean          shiftKey;
    [InitializedByEventConstructor] readonly attribute boolean          altKey;
    [InitializedByEventConstructor] readonly attribute boolean          metaKey;
    readonly attribute boolean          altGraphKey;

    boolean getModifierState(DOMString keyArgument);

    // FIXME: this does not match the version in the DOM spec.
    void initKeyboardEvent([Default=Undefined] optional DOMString type,
                           [Default=Undefined] optional boolean canBubble,
                           [Default=Undefined] optional boolean cancelable,
                           [Default=Undefined] optional Window view,
                           [Default=Undefined] optional DOMString keyIdentifier,
                           [Default=Undefined] optional unsigned long location,
                           [Default=Undefined] optional boolean ctrlKey,
                           [Default=Undefined] optional boolean altKey,
                           [Default=Undefined] optional boolean shiftKey,
                           [Default=Undefined] optional boolean metaKey,
                           [Default=Undefined] optional boolean altGraphKey);
};

