/*
 * Copyright (C) 2006, 2010 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 * Copyright (C) 2013 Samsung Electronics. 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.
 */

interface HTMLSelectElement : HTMLElement {
    [Reflect] attribute boolean autofocus;
    [Reflect] attribute boolean disabled;
    [ImplementedAs=formOwner] readonly attribute HTMLFormElement form;
    attribute boolean multiple;
    [Reflect] attribute DOMString name;
    [Reflect] attribute boolean required;
    attribute long size;

    readonly attribute DOMString type;

    readonly attribute HTMLOptionsCollection options;
    [RaisesException=Setter] attribute unsigned long length;

    getter Node item(unsigned long index);
    [ImplementedAs=anonymousIndexedSetter, RaisesException] setter HTMLOptionElement (unsigned long index, [TreatNullAs=anonymousIndexedSetterRemove, TreatUndefinedAs=anonymousIndexedSetterRemove] HTMLOptionElement value);
    Node namedItem([Default=Undefined] optional DOMString name);
     [RaisesException] void add([Default=Undefined] optional HTMLElement element,
                            [Default=Undefined] optional HTMLElement before);
    void remove(long index);
    void remove(HTMLOptionElement option); // Non standard.
    [RaisesException] void remove();
    readonly attribute HTMLCollection selectedOptions;
    attribute long selectedIndex;
    attribute DOMString value;

    readonly attribute boolean willValidate;
    readonly attribute ValidityState validity;
    readonly attribute DOMString validationMessage;
    boolean checkValidity();
    void setCustomValidity([TreatNullAs=NullString, TreatUndefinedAs=NullString] DOMString error);

    readonly attribute NodeList labels;
};
