/*
 * This file is part of the DOM implementation for KDE.
 *
 * Copyright 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., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * This file includes excerpts from the Document Object Model (DOM)
 * Level 1 Specification (Recommendation)
 * https://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_FORM_H
#define HTML_FORM_H

// --------------------------------------------------------------------------
#include <dom/html_element.h>
#include <dom/html_misc.h>

namespace DOM
{

class HTMLButtonElementImpl;
class HTMLFormElement;
class DOMString;

/**
 * Push button. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-BUTTON">
 * BUTTON element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLButtonElement : public HTMLElement
{
public:
    HTMLButtonElement();
    HTMLButtonElement(const HTMLButtonElement &other);
    HTMLButtonElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLButtonElement(HTMLButtonElementImpl *impl);
public:

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

    ~HTMLButtonElement();

    /**
     * Returns the \c FORM element containing this
     * control. Returns null if this control is not within the context
     * of a form.
     *
     */
    HTMLFormElement form() const;

    /**
     * A single character access key to give access to the form
     * control. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accesskey">
     * accesskey attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accessKey() const;

    /**
     * see accessKey
     */
    void setAccessKey(const DOMString &);

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * Form control or object name when submitted with a form. See the
     * <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-name-BUTTON">
     * name attribute definition </a> in HTML 4.0.
     *
     */
    DOMString name() const;

    /**
     * see name
     */
    void setName(const DOMString &);

    /**
     * Index that represents the element's position in the tabbing
     * order. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-tabindex">
     * tabindex attribute definition </a> in HTML 4.0.
     *
     */
    long tabIndex() const;

    /**
     * see tabIndex
     */
    void setTabIndex(long);

    /**
     * The type of button. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-type-BUTTON">
     * type attribute definition </a> in HTML 4.0.
     *
     */
    DOMString type() const;

    /**
     * The current form control value. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-value-BUTTON">
     * value attribute definition </a> in HTML 4.0.
     *
     */
    DOMString value() const;

    /**
     * see value
     */
    void setValue(const DOMString &);

    /**
     * Removes keyboard focus from this element.
     *
     */
    void blur();

    /**
     * Gives keyboard focus to this element.
     *
     */
    void focus();
};

// --------------------------------------------------------------------------

class HTMLFieldSetElementImpl;
/**
 * Organizes form controls into logical groups. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-FIELDSET">
 * FIELDSET element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLFieldSetElement : public HTMLElement
{
public:
    HTMLFieldSetElement();
    HTMLFieldSetElement(const HTMLFieldSetElement &other);
    HTMLFieldSetElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLFieldSetElement(HTMLFieldSetElementImpl *impl);
public:

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

    ~HTMLFieldSetElement();

    // TODO: deprecate/remove?
    HTMLFormElement form() const;
};

// --------------------------------------------------------------------------

class HTMLFormElementImpl;
/**
 * The \c FORM element encompasses behavior similar to a
 * collection and an element. It provides direct access to the
 * contained input elements as well as the attributes of the form
 * element. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-FORM">
 * FORM element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLFormElement : public HTMLElement
{
    friend class HTMLButtonElement;
    friend class HTMLFieldSetElement;
    friend class HTMLInputElement;
    friend class HTMLLabelElement;
    friend class HTMLLegendElement;
    friend class HTMLSelectElement;
    friend class HTMLTextAreaElement;
    friend class HTMLOptionElement;
    friend class HTMLIsIndexElement;
    friend class HTMLObjectElement;

public:
    HTMLFormElement();
    HTMLFormElement(const HTMLFormElement &other);
    HTMLFormElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLFormElement(HTMLFormElementImpl *impl);
public:

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

    ~HTMLFormElement();

    /**
     * Returns a collection of all control elements in the form.
     *
     */
    HTMLCollection elements() const;

    /**
     * The number of form controls in the form.
     *
     */
    long length() const;

    /**
     * Names the form.
     *
     */
    DOMString name() const;

    /**
     * see name
     */
    void setName(const DOMString &);

    /**
     * List of character sets supported by the server. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accept-charset">
     * accept-charset attribute definition </a> in HTML 4.0.
     *
     */
    DOMString acceptCharset() const;

    /**
     * see acceptCharset
     */
    void setAcceptCharset(const DOMString &);

    /**
     * Server-side form handler. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-action">
     * action attribute definition </a> in HTML 4.0.
     *
     */
    DOMString action() const;

    /**
     * see action
     */
    void setAction(const DOMString &);

    /**
     * The content type of the submitted form, generally
     * "application/x-www-form-urlencoded". See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-enctype">
     * enctype attribute definition </a> in HTML 4.0.
     *
     */
    DOMString enctype() const;

    /**
     * see enctype
     */
    void setEnctype(const DOMString &);

    /**
     * HTTP method used to submit form. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-method">
     * method attribute definition </a> in HTML 4.0.
     *
     */
    DOMString method() const;

    /**
     * see method
     */
    void setMethod(const DOMString &);

    /**
     * Frame to render the resource in. See the <a
     * href="https://www.w3.org/TR/REC-html40/present/frames.html#adef-target">
     * target attribute definition </a> in HTML 4.0.
     *
     */
    DOMString target() const;

    /**
     * see target
     */
    void setTarget(const DOMString &);

    /**
     * Submits the form. It performs the same action as a submit
     * button.
     *
     */
    void submit();

    /**
     * Restores a form element's default values. It performs the same
     * action as a reset button.
     *
     */
    void reset();
};

// --------------------------------------------------------------------------

class HTMLInputElementImpl;
/**
 * Form control. Note. Depending upon the environment the page is
 * being viewed, the value property may be read-only for the file
 * upload input type. For the "password" input type, the actual value
 * returned may be masked to prevent unauthorized use. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-INPUT">
 * INPUT element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLInputElement : public HTMLElement
{
public:
    HTMLInputElement();
    HTMLInputElement(const HTMLInputElement &other);
    HTMLInputElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLInputElement(HTMLInputElementImpl *impl);
public:

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

    ~HTMLInputElement();

    /**
     * Stores the initial control value (i.e., the initial value of
     * \c value ).
     *
     */
    DOMString defaultValue() const;

    /**
     * see defaultValue
     */
    void setDefaultValue(const DOMString &);

    /**
     * When \c type has the value "Radio" or "Checkbox",
     * stores the initial value of the \c checked
     * attribute.
     *
     */
    bool defaultChecked() const;

    /**
     * see defaultChecked
     */
    void setDefaultChecked(bool);

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * A comma-separated list of content types that a server
     * processing this form will handle correctly. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accept">
     * accept attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accept() const;

    /**
     * see accept
     */
    void setAccept(const DOMString &);

    /**
     * A single character access key to give access to the form
     * control. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accesskey">
     * accesskey attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accessKey() const;

    /**
     * see accessKey
     */
    void setAccessKey(const DOMString &);

    /**
     * Aligns this object (vertically or horizontally) with respect to
     * its surrounding text. See the <a
     * href="https://www.w3.org/TR/REC-html40/struct/objects.html#adef-align-IMG">
     * align attribute definition </a> in HTML 4.0. This attribute is
     * deprecated in HTML 4.0.
     *
     */
    DOMString align() const;

    /**
     * see align
     */
    void setAlign(const DOMString &);

    /**
     * Alternate text for user agents not rendering the normal content
     * of this element. See the <a
     * href="https://www.w3.org/TR/REC-html40/struct/objects.html#adef-alt">
     * alt attribute definition </a> in HTML 4.0.
     *
     */
    DOMString alt() const;

    /**
     * see alt
     */
    void setAlt(const DOMString &);

    /**
     * Describes whether a radio or check box is checked, when
     * \c type has the value "Radio" or "Checkbox". The value is
     * true if explicitly set. Represents the current state of the
     * checkbox or radio button. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-checked">
     * checked attribute definition </a> in HTML 4.0.
     *
     */
    bool checked() const;

    /**
     * see checked
     */
    void setChecked(bool);

    /**
     * Describes whether a radio box is indeterminate
     */
    bool indeterminate() const;

    /**
     * see indeterminate
     */
    void setIndeterminate(bool);

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * Maximum number of characters for text fields, when \c type
     * has the value "Text" or "Password". See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-maxlength">
     * maxlength attribute definition </a> in HTML 4.0.
     *
     */
    long maxLength() const;

    /**
     * see maxLength
     */
    void setMaxLength(long);

    /**
     * Form control or object name when submitted with a form. See the
     * <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-name-INPUT">
     * name attribute definition </a> in HTML 4.0.
     *
     */
    DOMString name() const;

    /**
     * see name
     */
    void setName(const DOMString &);

    /**
     * This control is read-only. When \c type has the
     * value "text" or "password" only. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-readonly">
     * readonly attribute definition </a> in HTML 4.0.
     *
     */
    bool readOnly() const;

    // ### remove in 4.0
    /**
     * see readOnly
     */
    void setReadOnly(bool);

    /**
     * @deprecated
     */
#ifndef KHTML_NO_DEPRECATED
    KHTML_DEPRECATED DOMString size() const;
#endif

    /**
     * @deprecated
     */
#ifndef KHTML_NO_DEPRECATED
    KHTML_DEPRECATED void setSize(const DOMString &);
#endif

    /**
     * Size information. The precise meaning is specific to each type
     * of field. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-size-INPUT">
     * size attribute definition </a> in HTML 4.0.
     *
     */
    long getSize() const;

    /**
     * see getSize
     */
    void setSize(long);

    /**
     * When the \c type attribute has the value "Image",
     * this attribute specifies the location of the image to be used
     * to decorate the graphical submit button. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-src">
     * src attribute definition </a> in HTML 4.0.
     *
     */
    DOMString src() const;

    /**
     * see src
     */
    void setSrc(const DOMString &);

    /**
     * Index that represents the element's position in the tabbing
     * order. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-tabindex">
     * tabindex attribute definition </a> in HTML 4.0.
     *
     */
    long tabIndex() const;

    /**
     * see tabIndex
     */
    void setTabIndex(long);

    /**
     * The type of control created. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-type-INPUT">
     * type attribute definition </a> in HTML 4.0.
     *
     */
    DOMString type() const;

    /**
     * see type
     */
    void setType(const DOMString &);

    /**
     * Use client-side image map. See the <a
     * href="https://www.w3.org/TR/REC-html40/struct/objects.html#adef-usemap">
     * usemap attribute definition </a> in HTML 4.0.
     *
     */
    DOMString useMap() const;

    /**
     * see useMap
     */
    void setUseMap(const DOMString &);

    /**
     * The current form control value. Used for radio buttons and
     * check boxes. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-value-INPUT">
     * value attribute definition </a> in HTML 4.0.
     *
     */
    DOMString value() const;

    /**
     * see value
     */
    void setValue(const DOMString &);

    /**
     * Removes keyboard focus from this element.
     *
     */
    void blur();

    /**
     * Gives keyboard focus to this element.
     *
     */
    void focus();

    /**
     * Select the contents of the text area. For \c INPUT
     * elements whose \c type attribute has one of the
     * following values: "Text", "File", or "Password".
     *
     */
    void select();

    /**
     * Simulate a mouse-click. For \c INPUT elements whose
     * \c type attribute has one of the following values:
     * "Button", "Checkbox", "Radio", "Reset", or "Submit".
     */
    void click();

    /**
     * Returns the character offset of beginning of selection, or if none,
     * the cursor position.
     * This operation is only supported if the type of this element is text;
     * otherwise -1 is returned.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    long selectionStart();

    /**
     * Move the beginning of the selection to the given offset in text
     * This call has no effect if the type of this input element isn't text
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionStart(long offset);

    /**
     * Returns the character offset of end of selection, or if none,
     * the cursor position.
     * This operation is only supported if the type of this element is text;
     * otherwise -1 is returned.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    long selectionEnd();

    /**
     * Move the end of the selection (and the cursor) to the given offset in text
     * This call has no effect if the type of this input element isn't text
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionEnd(long offset);

    /**
     * Makes the position span from start to end, and positions the cursor after the selection.
     * This call has no effect if the type of this input element isn't text or if it is not rendered.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionRange(long start, long end);

};

// --------------------------------------------------------------------------

class HTMLLabelElementImpl;
/**
 * Form field label text. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-LABEL">
 * LABEL element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLLabelElement : public HTMLElement
{
public:
    HTMLLabelElement();
    HTMLLabelElement(const HTMLLabelElement &other);
    HTMLLabelElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLLabelElement(HTMLLabelElementImpl *impl);
public:

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

    ~HTMLLabelElement();

    /**
     * A single character access key to give access to the form
     * control. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accesskey">
     * accesskey attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accessKey() const;

    /**
     * see accessKey
     */
    void setAccessKey(const DOMString &);

    /**
     * This attribute links this label with another form control by
     * \c id attribute. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-for">
     * for attribute definition </a> in HTML 4.0.
     *
     */
    DOMString htmlFor() const;

    /**
     * see htmlFor
     */
    void setHtmlFor(const DOMString &);
};

// --------------------------------------------------------------------------

class HTMLLegendElementImpl;
/**
 * Provides a caption for a \c FIELDSET grouping. See the
 * <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-LEGEND">
 * LEGEND element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLLegendElement : public HTMLElement
{
public:
    HTMLLegendElement();
    HTMLLegendElement(const HTMLLegendElement &other);
    HTMLLegendElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLLegendElement(HTMLLegendElementImpl *impl);
public:

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

    ~HTMLLegendElement();

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * A single character access key to give access to the form
     * control. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accesskey">
     * accesskey attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accessKey() const;

    /**
     * see accessKey
     */
    void setAccessKey(const DOMString &);

    /**
     * Text alignment relative to \c FIELDSET . See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-align-LEGEND">
     * align attribute definition </a> in HTML 4.0. This attribute is
     * deprecated in HTML 4.0.
     *
     */
    DOMString align() const;

    /**
     * see align
     */
    void setAlign(const DOMString &);
};

// --------------------------------------------------------------------------

class HTMLOptGroupElementImpl;
/**
 * Group options together in logical subdivisions. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-OPTGROUP">
 * OPTGROUP element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLOptGroupElement : public HTMLElement
{
public:
    HTMLOptGroupElement();
    HTMLOptGroupElement(const HTMLOptGroupElement &other);
    HTMLOptGroupElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLOptGroupElement(HTMLOptGroupElementImpl *impl);
public:

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

    ~HTMLOptGroupElement();

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * Assigns a label to this option group. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-label-OPTGROUP">
     * label attribute definition </a> in HTML 4.0.
     *
     */
    DOMString label() const;

    /**
     * see label
     */
    void setLabel(const DOMString &);
};

// --------------------------------------------------------------------------

class HTMLSelectElementImpl;
/**
 * The select element allows the selection of an option. The contained
 * options can be directly accessed through the select element as a
 * collection. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-SELECT">
 * SELECT element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLSelectElement : public HTMLElement
{
public:
    HTMLSelectElement();
    HTMLSelectElement(const HTMLSelectElement &other);
    HTMLSelectElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLSelectElement(HTMLSelectElementImpl *impl);
public:

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

    ~HTMLSelectElement();

    /**
     * The type of control created.
     *
     */
    DOMString type() const;

    /**
     * The ordinal index of the selected option. The value -1 is
     * returned if no element is selected. If multiple options are
     * selected, the index of the first selected option is returned.
     *
     */
    long selectedIndex() const;

    /**
     * see selectedIndex
     */
    void setSelectedIndex(long);

    /**
     * The current form control value.
     *
     */
    DOMString value() const;

    /**
     * see value
     */
    void setValue(const DOMString &);

    /**
     * The number of options in this \c SELECT .
     *
     */
    long length() const;

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * The collection of \c OPTION elements contained by
     * this element.
     *
     */
    HTMLCollection options() const;

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * If true, multiple \c OPTION elements may be
     * selected in this \c SELECT . See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-multiple">
     * multiple attribute definition </a> in HTML 4.0.
     *
     */
    bool multiple() const;

    /**
     * see multiple
     */
    void setMultiple(bool);

    /**
     * Form control or object name when submitted with a form. See the
     * <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-name-SELECT">
     * name attribute definition </a> in HTML 4.0.
     *
     */
    DOMString name() const;

    /**
     * see name
     */
    void setName(const DOMString &);

    /**
     * Number of visible rows. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-size-SELECT">
     * size attribute definition </a> in HTML 4.0.
     *
     */
    long size() const;

    /**
     * see size
     */
    void setSize(long);

    /**
     * Index that represents the element's position in the tabbing
     * order. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-tabindex">
     * tabindex attribute definition </a> in HTML 4.0.
     *
     */
    long tabIndex() const;

    /**
     * see tabIndex
     */
    void setTabIndex(long);

    /**
     * Add a new element to the collection of \c OPTION
     * elements for this \c SELECT .
     *
     * @param element The element to add.
     *
     * @param before The element to insert before, or 0 for the
     * tail of the list.
     *
     */
    void add(const HTMLElement &element, const HTMLElement &before);

    /**
     * Remove an element from the collection of \c OPTION
     * elements for this \c SELECT . Does nothing if no
     * element has the given index.
     *
     * @param index The index of the item to remove.
     *
     */
    void remove(long index);

    /**
     * Removes keyboard focus from this element.
     *
     */
    void blur();

    /**
     * Gives keyboard focus to this element.
     *
     */
    void focus();
};

// --------------------------------------------------------------------------

class HTMLTextAreaElementImpl;
/**
 * Multi-line text field. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-TEXTAREA">
 * TEXTAREA element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLTextAreaElement : public HTMLElement
{
public:
    HTMLTextAreaElement();
    HTMLTextAreaElement(const HTMLTextAreaElement &other);
    HTMLTextAreaElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLTextAreaElement(HTMLTextAreaElementImpl *impl);
public:

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

    ~HTMLTextAreaElement();

    /**
     * Stores the initial control value (i.e., the initial value of
     * \c value ).
     *
     */
    DOMString defaultValue() const;

    /**
     * see defaultValue
     */
    void setDefaultValue(const DOMString &);

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * A single character access key to give access to the form
     * control. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-accesskey">
     * accesskey attribute definition </a> in HTML 4.0.
     *
     */
    DOMString accessKey() const;

    /**
     * see accessKey
     */
    void setAccessKey(const DOMString &);

    /**
     * Width of control (in characters). See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-cols-TEXTAREA">
     * cols attribute definition </a> in HTML 4.0.
     *
     */
    long cols() const;

    /**
     * see cols
     */
    void setCols(long);

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * Form control or object name when submitted with a form. See the
     * <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-name-TEXTAREA">
     * name attribute definition </a> in HTML 4.0.
     *
     */
    DOMString name() const;

    /**
     * see name
     */
    void setName(const DOMString &);

    /**
     * This control is read-only. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-readonly">
     * readonly attribute definition </a> in HTML 4.0.
     *
     */
    bool readOnly() const;

    /**
     * see readOnly
     */
    void setReadOnly(bool);

    /**
     * Number of text rows. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-rows-TEXTAREA">
     * rows attribute definition </a> in HTML 4.0.
     *
     */
    long rows() const;

    /**
     * see rows
     */
    void setRows(long);

    /**
     * Index that represents the element's position in the tabbing
     * order. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-tabindex">
     * tabindex attribute definition </a> in HTML 4.0.
     *
     */
    long tabIndex() const;

    /**
     * see tabIndex
     */
    void setTabIndex(long);

    /**
     * The type of this form control.
     *
     */
    DOMString type() const;

    /**
     * The current textual content of the multi-line text field. If
     * the entirety of the data can not fit into a single wstring, the
     * implementation may truncate the data.
     *
     */
    DOMString value() const;

    /**
     * see value
     */
    void setValue(const DOMString &);

    /**
     * Removes keyboard focus from this element.
     */
    void blur();

    /**
     * Gives keyboard focus to this element.
     */
    void focus();

    /**
     * Select the contents of the \c TEXTAREA .
     */
    void select();

    /**
     * Returns the character offset of beginning of selection, or if none,
     * the cursor position.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    long selectionStart();

    /**
     * Move the beginning of the selection to the given offset in text
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionStart(long offset);

    /**
     * Returns the character offset of end of selection, or if none,
     * the cursor position.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    long selectionEnd();

    /**
     * Move the end of the selection (and the cursor) to the given offset in text
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionEnd(long offset);

    /**
     * Selects the text from start to end, and positions the cursor after the selection.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    void setSelectionRange(long start, long end);

    /**
     * Returns the length of the text.
     * NOTE: this method is not part of the DOM, but a Mozilla extension
     */
    long textLength();
};

// --------------------------------------------------------------------------

class HTMLOptionElementImpl;
/**
 * A selectable choice. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-OPTION">
 * OPTION element definition </a> in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLOptionElement : public HTMLElement
{
public:
    HTMLOptionElement();
    HTMLOptionElement(const HTMLOptionElement &other);
    HTMLOptionElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLOptionElement(HTMLOptionElementImpl *impl);
public:

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

    ~HTMLOptionElement();

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * Stores the initial value of the \c selected
     * attribute.
     *
     */
    bool defaultSelected() const;

    /**
     * see defaultSelected
     */
    void setDefaultSelected(bool);

    /**
     * The text contained within the option element.
     *
     */
    DOMString text() const;

    /**
     * The index of this \c OPTION in its parent
     * \c SELECT .
     *
     */
    long index() const;

    /**
     * see index
     *
     * This function is obsolete - the index property is actually supposed to be read-only
     * (https://www.w3.org/DOM/updates/REC-DOM-Level-1-19981001-errata.html)
     */
    void setIndex(long);

    /**
     * The control is unavailable in this context. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-disabled">
     * disabled attribute definition </a> in HTML 4.0.
     *
     */
    bool disabled() const;

    /**
     * see disabled
     */
    void setDisabled(bool);

    /**
     * Option label for use in hierarchical menus. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-label-OPTION">
     * label attribute definition </a> in HTML 4.0.
     *
     */
    DOMString label() const;

    /**
     * see label
     */
    void setLabel(const DOMString &);

    /**
     * Means that this option is initially selected. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-selected">
     * selected attribute definition </a> in HTML 4.0.
     *
     */
    bool selected() const;

    /**
     * see selected
     */
    void setSelected(bool);

    /**
     * The current form control value. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-value-OPTION">
     * value attribute definition </a> in HTML 4.0.
     *
     */
    DOMString value() const;

    /**
     * see value
     */
    void setValue(const DOMString &);
};

// --------------------------------------------------------------------------

class HTMLIsIndexElementImpl;
class HTMLFormElement;

/**
 * This element is used for single-line text input. See the <a
 * href="https://www.w3.org/TR/REC-html40/interact/forms.html#edef-ISINDEX">
 * ISINDEX element definition </a> in HTML 4.0. This element is
 * deprecated in HTML 4.0.
 *
 */
class KHTML_EXPORT HTMLIsIndexElement : public HTMLElement
{
public:
    HTMLIsIndexElement();
    HTMLIsIndexElement(const HTMLIsIndexElement &other);
    HTMLIsIndexElement(const Node &other) : HTMLElement()
    {
        (*this) = other;
    }
protected:
    HTMLIsIndexElement(HTMLIsIndexElementImpl *impl);
public:

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

    ~HTMLIsIndexElement();

    // TODO: deprecate/remove?
    HTMLFormElement form() const;

    /**
     * The prompt message. See the <a
     * href="https://www.w3.org/TR/REC-html40/interact/forms.html#adef-prompt">
     * prompt attribute definition </a> in HTML 4.0. This attribute is
     * deprecated in HTML 4.0.
     *
     */
    DOMString prompt() const;

    /**
     * see prompt
     */
    void setPrompt(const DOMString &);
};

} //namespace

#endif
