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

// TODO: no css::ViewCSS available!
// TODO: Fix SVGSVGElement inheritance (css::DocumentCSS)! 
// TODO: no events::DocumentEvent available!
[
    Conditional=SVG
] interface SVGSVGElement : SVGStyledElement,
                                            SVGTests,
                                            SVGLangSpace,
                                            SVGExternalResourcesRequired,
                                            SVGTransformable,
                                            SVGFitToViewBox,
                                            SVGZoomAndPan {
    readonly attribute SVGAnimatedLength x;
    readonly attribute SVGAnimatedLength y;
    readonly attribute SVGAnimatedLength width;
    readonly attribute SVGAnimatedLength height;
             attribute DOMString contentScriptType
                 /*setter raises(DOMException)*/;
             attribute DOMString contentStyleType
                 /*setter raises(DOMException)*/;
    readonly attribute SVGRect viewport;
    readonly attribute float pixelUnitToMillimeterX;
    readonly attribute float pixelUnitToMillimeterY;
    readonly attribute float screenPixelToMillimeterX;
    readonly attribute float screenPixelToMillimeterY;
    readonly attribute boolean useCurrentView;
    readonly attribute SVGViewSpec currentView;
             attribute float currentScale
                 /*setter raises(DOMException)*/;
    readonly attribute SVGPoint currentTranslate;

    unsigned long suspendRedraw(in [Optional=DefaultIsUndefined] unsigned long maxWaitMilliseconds);
    void unsuspendRedraw(in [Optional=DefaultIsUndefined] unsigned long suspendHandleId);
    void unsuspendRedrawAll();
    void forceRedraw();
    void pauseAnimations();
    void unpauseAnimations();
    boolean animationsPaused();
    float getCurrentTime();
    void setCurrentTime(in [Optional=DefaultIsUndefined] float seconds);
    NodeList getIntersectionList(in [Optional=DefaultIsUndefined] SVGRect rect, 
                                 in [Optional=DefaultIsUndefined] SVGElement referenceElement);
    NodeList getEnclosureList(in [Optional=DefaultIsUndefined] SVGRect rect, 
                              in [Optional=DefaultIsUndefined] SVGElement referenceElement);
    boolean checkIntersection(in [Optional=DefaultIsUndefined] SVGElement element, 
                              in [Optional=DefaultIsUndefined] SVGRect rect);
    boolean checkEnclosure(in [Optional=DefaultIsUndefined] SVGElement element, 
                           in [Optional=DefaultIsUndefined] SVGRect rect);
    void deselectAll();

    SVGNumber createSVGNumber();
    SVGLength createSVGLength();
    SVGAngle createSVGAngle();
    SVGPoint createSVGPoint();
    SVGMatrix createSVGMatrix();
    SVGRect createSVGRect();
    SVGTransform createSVGTransform();
    SVGTransform createSVGTransformFromMatrix(in [Optional=DefaultIsUndefined] SVGMatrix matrix);
    Element getElementById(in [Optional=DefaultIsUndefined] DOMString elementId);
};

