/*
 * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
 * 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.
 */

module html {

    interface HTMLImageElement : HTMLElement {
                 attribute [ConvertNullToNullString, Reflect] DOMString name;
                 attribute [ConvertNullToNullString, Reflect] DOMString align;
                 attribute [ConvertNullToNullString, Reflect] DOMString alt;
                 attribute [ConvertNullToNullString, Reflect] DOMString border;        
                 attribute long height;
                 attribute long hspace;
                 attribute boolean isMap;
                 attribute [ConvertNullToNullString, ReflectURL=longdesc] DOMString longDesc;
                 attribute [ConvertNullToNullString, ReflectURL] DOMString src;
                 attribute [ConvertNullToNullString, Reflect=usemap] DOMString useMap;
                 attribute long vspace;
                 attribute long width;
        
        // Extensions
        readonly attribute boolean complete;
                 attribute [ConvertNullToNullString, ReflectURL] DOMString lowsrc;
        readonly attribute long naturalHeight;
        readonly attribute long naturalWidth;
        readonly attribute long x;
        readonly attribute long y;

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        // Objective-C extension:
        readonly attribute DOMString altDisplayString;
        readonly attribute URL absoluteImageURL;
#endif
    };

}
