/*
 * This file is part of the DOM implementation for KDE.
 *
 * (C) 1999 Lars Knoll (knoll@kde.org)
 *
 * 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., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 *
 * This file includes excerpts from the Document Object Model (DOM)
 * Level 1 Specification (Recommendation)
 * http://www.w3.org/TR/REC-DOM-Level-1/
 * Copyright © World Wide Web Consortium , (Massachusetts Institute of
 * Technology , Institut National de Recherche en Informatique et en
 * Automatique , Keio University ). All Rights Reserved.
 *
 */
#ifndef HTML_ELEMENT_H
#define HTML_ELEMENT_H

#include <dom/dom_element.h>
class KHTMLView;

namespace DOM {

class HTMLElementImpl;
class DOMString;
class HTMLCollection;

/**
 * All HTML element interfaces derive from this class. Elements that
 * only expose the HTML core attributes are represented by the base
 * <code> HTMLElement </code> interface. These elements are as
 * follows:
 *
 *  <ulist> <item> HEAD
 *
 *  </item> <item> special: SUB, SUP, SPAN, BDO
 *
 *  </item> <item> font: TT, I, B, U, S, STRIKE, BIG, SMALL
 *
 *  </item> <item> phrase: EM, STRONG, DFN, CODE, SAMP, KBD, VAR,
 * CITE, ACRONYM, ABBR
 *
 *  </item> <item> list: DD, DT
 *
 *  </item> <item> NOFRAMES, NOSCRIPT
 *
 *  </item> <item> ADDRESS, CENTER
 *
 *  </item> </ulist> Note. The <code> style </code> attribute for this
 * interface is reserved for future usage.
 *
 */
class HTMLElement : public Element
{
    friend class HTMLDocument;
    friend class ::KHTMLView;
    friend class HTMLTableElement;
    friend class HTMLTableRowElement;
    friend class HTMLTableSectionElement;

public:
    HTMLElement();
    HTMLElement(const HTMLElement &other);
    HTMLElement(const Node &other) : Element()
         {(*this)=other;}

protected:
    HTMLElement(HTMLElementImpl *impl);
public:

    HTMLElement & operator = (const HTMLElement &other);
    HTMLElement & operator = (const Node &other);

    ~HTMLElement();

    /**
     * The element's identifier. See the <a
     * href="http://www.w3.org/TR/REC-html40/struct/global.html#adef-id">
     * id attribute definition </a> in HTML 4.0.
     *
     */
    DOMString id() const;

    /**
     * see @ref id
     */
    void setId( const DOMString & );

    /**
     * The element's advisory title. See the <a
     * href="http://www.w3.org/TR/REC-html40/struct/global.html#adef-title">
     * title attribute definition </a> in HTML 4.0.
     *
     */
    DOMString title() const;

    /**
     * see @ref title
     */
    void setTitle( const DOMString & );

    /**
     * Language code defined in RFC 1766. See the <a
     * href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#adef-lang">
     * lang attribute definition </a> in HTML 4.0.
     *
     */
    DOMString lang() const;

    /**
     * see @ref lang
     */
    void setLang( const DOMString & );

    /**
     * Specifies the base direction of directionally neutral text and
     * the directionality of tables. See the <a
     * href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#adef-dir">
     * dir attribute definition </a> in HTML 4.0.
     *
     */
    DOMString dir() const;

    /**
     * see @ref dir
     */
    void setDir( const DOMString & );

    /**
     * The class attribute of the element. This attribute has been
     * renamed due to conflicts with the "class" keyword exposed by
     * many languages. See the <a
     * href="http://www.w3.org/TR/REC-html40/struct/global.html#adef-class">
     * class attribute definition </a> in HTML 4.0.
     *
     */
    DOMString className() const;

    /**
     * see @ref className
     */
    void setClassName( const DOMString & );

    /**
     * The HTML code contained in this element.
     * This function is not part of the DOM specifications as defined by the w3c.
     */
    DOMString innerHTML() const;

    /**
     * Set the HTML content of this node.
     *
     * @exception DOMException
     * NO_MODIFICATION_ALLOWED_ERR: Raised if there is the element does not allow
     * children.
     */
    void setInnerHTML( const DOMString &html );

    /**
     * The text contained in this element.
     * This function is not part of the DOM specifications as defined by the w3c.
     */
    DOMString innerText() const;

    /**
     * Set the text content of this node.
     *
     * @exception DOMException
     * NO_MODIFICATION_ALLOWED_ERR: Raised if there is the element does not allow
     * children.
     */
    void setInnerText( const DOMString &text );

    /**
     * The HTML code of this element, including the element itself.
     * This function is not part of the DOM specifications as defined by the w3c.
     */
    DOMString outerHTML() const;

    /**
     * Replace the HTML code of this element, including the element itself.
     * This function is not part of the DOM specifications as defined by the w3c.
     */
    void setOuterHTML( const DOMString &html );

    /**
     * The text contained in this element.
     * This function is not part of the DOM specifications as defined by the w3c.
     */
    DOMString outerText() const;

    /**
     * Replace this element with the given text
     *
     * @exception DOMException
     * NO_MODIFICATION_ALLOWED_ERR: Raised if there is the element does not allow
     * children.
     */
    void setOuterText( const DOMString &text );

    /**
     * Retrieves a collection of nodes that are direct descendants of this node.
     * IE-specific extension.
     */
    HTMLCollection children() const;

    bool isContentEditable() const;
    DOMString contentEditable() const;
    void setContentEditable(const DOMString &enabled);

protected:
    /*
     * @internal
     */
    void assignOther( const Node &other, int elementId );
};

}; //namespace

#endif
