/*
 * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
 * Copyright (C) 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 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 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. 
 */

[
    Conditional=SVG,
    EventTarget
] interface SVGElementInstance
#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    : Object, EventTarget
#else
    : EventTarget
#endif /* defined(LANGUAGE_OBJECTIVE_C) */
{
    readonly attribute SVGElement correspondingElement;
    readonly attribute SVGUseElement correspondingUseElement;
    readonly attribute SVGElementInstance parentNode;
    readonly attribute SVGElementInstanceList childNodes;
    readonly attribute SVGElementInstance firstChild;
    readonly attribute SVGElementInstance lastChild;
    readonly attribute SVGElementInstance previousSibling;
    readonly attribute SVGElementInstance nextSibling;

    // EventTarget
#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
    attribute [NotEnumerable] EventListener onabort;
    attribute [NotEnumerable] EventListener onblur;
    attribute [NotEnumerable] EventListener onchange;
    attribute [NotEnumerable] EventListener onclick;
    attribute [NotEnumerable] EventListener oncontextmenu;
    attribute [NotEnumerable] EventListener ondblclick;
    attribute [NotEnumerable] EventListener onerror;
    attribute [NotEnumerable] EventListener onfocus;
    attribute [NotEnumerable] EventListener oninput;
    attribute [NotEnumerable] EventListener onkeydown;
    attribute [NotEnumerable] EventListener onkeypress;
    attribute [NotEnumerable] EventListener onkeyup;
    attribute [NotEnumerable] EventListener onload;
    attribute [NotEnumerable] EventListener onmousedown;
    attribute [NotEnumerable] EventListener onmousemove;
    attribute [NotEnumerable] EventListener onmouseout;
    attribute [NotEnumerable] EventListener onmouseover;
    attribute [NotEnumerable] EventListener onmouseup;
    attribute [NotEnumerable] EventListener onmousewheel;
    attribute [NotEnumerable] EventListener onbeforecut;
    attribute [NotEnumerable] EventListener oncut;
    attribute [NotEnumerable] EventListener onbeforecopy;
    attribute [NotEnumerable] EventListener oncopy;
    attribute [NotEnumerable] EventListener onbeforepaste;
    attribute [NotEnumerable] EventListener onpaste;
    attribute [NotEnumerable] EventListener ondragenter;
    attribute [NotEnumerable] EventListener ondragover;
    attribute [NotEnumerable] EventListener ondragleave;
    attribute [NotEnumerable] EventListener ondrop;
    attribute [NotEnumerable] EventListener ondragstart;
    attribute [NotEnumerable] EventListener ondrag;
    attribute [NotEnumerable] EventListener ondragend;
    attribute [NotEnumerable] EventListener onreset;
    attribute [NotEnumerable] EventListener onresize;
    attribute [NotEnumerable] EventListener onscroll;
    attribute [NotEnumerable] EventListener onsearch;
    attribute [NotEnumerable] EventListener onselect;
    attribute [NotEnumerable] EventListener onselectstart;
    attribute [NotEnumerable] EventListener onsubmit;
    attribute [NotEnumerable] EventListener onunload;
#endif /* defined(LANGUAGE_OBJECTIVE_C) */
};
