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

[
    Constructor(DOMString type, optional KeyboardEventInit eventInitDict),
] 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;

    [Conditional=KEYBOARD_KEY_ATTRIBUTE] readonly attribute DOMString key;
    [Conditional=KEYBOARD_CODE_ATTRIBUTE] readonly attribute DOMString code;
    readonly attribute unsigned long location;

    readonly attribute boolean ctrlKey;
    readonly attribute boolean shiftKey;
    readonly attribute boolean altKey;
    readonly attribute boolean metaKey;
    readonly attribute boolean repeat;

    readonly attribute boolean isComposing;

    boolean getModifierState(DOMString keyArg);

    // Everything below is legacy.
    readonly attribute DOMString keyIdentifier;
    [ImplementedAs=location] readonly attribute unsigned long keyLocation;
    readonly attribute boolean altGraphKey;
    readonly attribute unsigned long charCode;
    readonly attribute unsigned long keyCode;
    readonly attribute unsigned long which;

    // FIXME: this does not match the version in the DOM spec.
    // FIXME: Using "undefined" as default parameter value is wrong.
    void initKeyboardEvent(optional DOMString type = "undefined", optional boolean canBubble = false, optional boolean cancelable = false,
        optional DOMWindow? view = null, optional DOMString keyIdentifier = "undefined", optional unsigned long location = 0,
        optional boolean ctrlKey = false, optional boolean altKey = false, optional boolean shiftKey = false, optional boolean metaKey = false, optional boolean altGraphKey = false);
};

dictionary KeyboardEventInit : EventModifierInit {
    DOMString key = "";
    DOMString code = "";
    unsigned long location = 0;
    boolean repeat = false;
    boolean isComposing = false;

    // This members are not in the specification but are needed to initialize the corresponding legacy
    // attributes we still support on KeyboardEvent for backward compatibility.
    DOMString keyIdentifier = "";
    unsigned long keyLocation;
    unsigned long charCode = 0;
    unsigned long keyCode = 0;
    unsigned long which = 0;
};
