/*
 * Copyright (C) 2006, 2007, 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.
 */

[
    V8CustomToJSObject,
    V8SkipVTableValidation
] interface HTMLElement : Element {
             // iht.com relies on id returning the empty string when no id is present. 
             // Other browsers do this as well. So we don't convert null to JS null.
             [Reflect] attribute DOMString id;
             [Reflect] attribute DOMString title;
             [Reflect] attribute DOMString lang;
             attribute boolean             translate;
             [Reflect] attribute DOMString dir;

             attribute long              tabIndex;
             attribute boolean           draggable;
             [Reflect] attribute DOMString webkitdropzone;
             [Reflect] attribute boolean hidden;
             [Reflect] attribute DOMString accessKey;

    // Extensions
             [TreatNullAs=NullString, V8DeliverCustomElementCallbacks] attribute DOMString innerHTML
                 setter raises(DOMException);
             [TreatNullAs=NullString] attribute DOMString innerText
                 setter raises(DOMException);
             [TreatNullAs=NullString, V8DeliverCustomElementCallbacks] attribute DOMString outerHTML
                 setter raises(DOMException);
             [TreatNullAs=NullString] attribute DOMString outerText
                 setter raises(DOMException);

    Element insertAdjacentElement(in [Optional=DefaultIsUndefined] DOMString where,
                                  in [Optional=DefaultIsUndefined] Element element)
        raises(DOMException);
    [V8DeliverCustomElementCallbacks]
    void insertAdjacentHTML(in [Optional=DefaultIsUndefined] DOMString where,
                            in [Optional=DefaultIsUndefined] DOMString html)
        raises(DOMException);
    void insertAdjacentText(in [Optional=DefaultIsUndefined] DOMString where,
                            in [Optional=DefaultIsUndefined] DOMString text)
        raises(DOMException);

    readonly attribute HTMLCollection children;

             [TreatNullAs=NullString] attribute DOMString contentEditable
                 setter raises(DOMException);
    readonly attribute boolean isContentEditable;

             attribute boolean spellcheck;

#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C // No Objective-C bindings yet.
             [Conditional=MICRODATA, Reflect] attribute boolean itemScope;
    [Conditional=MICRODATA] readonly attribute DOMSettableTokenList itemType;
             [Conditional=MICRODATA, Reflect, URL] attribute DOMString itemId;

    [Conditional=MICRODATA] readonly attribute DOMSettableTokenList itemRef;
    [Conditional=MICRODATA] readonly attribute DOMSettableTokenList itemProp;

#if defined(ENABLE_MICRODATA) && ENABLE_MICRODATA
    [Conditional=MICRODATA] readonly attribute HTMLPropertiesCollection properties;
#endif
#endif

#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
             [Conditional=MICRODATA, Custom] attribute any itemValue
                 setter raises(DOMException);
#endif
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
    readonly attribute DOMString titleDisplayString;
#endif

    void click();
};

