/*
 * 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.
 */

interface KeyboardEvent : UIEvent {
    constructor(DOMString type, optional KeyboardEventInit eventInitDict);

    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;

    readonly attribute DOMString key;
    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 WindowProxy? 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;
};
