/*
 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
 * Copyright (C) 2004, 2005, 2010 Rob Buis <buis@kde.org>
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2006 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.
 */

// FIXME: no css::ViewCSS available!
// FIXME: Fix SVGSVGElement inheritance (css::DocumentCSS)!
// FIXME: no events::DocumentEvent available!

[
    JSGenerateToNativeObject,
    ExportMacro=WEBCORE_EXPORT,
] interface SVGSVGElement : SVGGraphicsElement {
    readonly attribute SVGAnimatedLength x;
    readonly attribute SVGAnimatedLength y;
    readonly attribute SVGAnimatedLength width;
    readonly attribute SVGAnimatedLength height;
    attribute DOMString contentScriptType;
    attribute DOMString contentStyleType;
    [NewObject] readonly attribute SVGRect viewport;
    readonly attribute unrestricted float pixelUnitToMillimeterX;
    readonly attribute unrestricted float pixelUnitToMillimeterY;
    readonly attribute unrestricted float screenPixelToMillimeterX;
    readonly attribute unrestricted float screenPixelToMillimeterY;
    readonly attribute boolean useCurrentView;
    readonly attribute SVGViewSpec currentView;
    attribute unrestricted float currentScale;
    readonly attribute SVGPoint currentTranslate;

    unsigned long suspendRedraw(optional unsigned long maxWaitMilliseconds = 0);
    void unsuspendRedraw(optional unsigned long suspendHandleId = 0);
    void unsuspendRedrawAll();
    void forceRedraw();
    void pauseAnimations();
    void unpauseAnimations();
    boolean animationsPaused();
    unrestricted float getCurrentTime();
    void setCurrentTime(optional unrestricted float seconds = NaN);

    // FIXME: referenceElement should not be optional.
    NodeList getIntersectionList(SVGRect rect, optional SVGElement? referenceElement = null);

    // FIXME: referenceElement should not be optional.
    NodeList getEnclosureList(SVGRect rect, optional SVGElement? referenceElement = null);

    boolean checkIntersection(SVGElement? element, SVGRect rect); // element should not be nullable.
    boolean checkEnclosure(SVGElement? element, SVGRect rect); // element should not be nullable.

    void deselectAll();

    [NewObject] SVGNumber createSVGNumber();
    [NewObject] SVGLength createSVGLength();
    [NewObject] SVGAngle createSVGAngle();
    [NewObject] SVGPoint createSVGPoint();
    [NewObject] SVGMatrix createSVGMatrix();
    [NewObject] SVGRect createSVGRect();
    [NewObject] SVGTransform createSVGTransform();
    [NewObject] SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);

    Element getElementById([RequiresExistingAtomString] DOMString elementId);
};

SVGSVGElement implements SVGExternalResourcesRequired;
SVGSVGElement implements SVGFitToViewBox;
SVGSVGElement implements SVGZoomAndPan;
