/*
 * 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.
 */

// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#htmlselectelement

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 Element item(unsigned long index);
    Element namedItem([Default=Undefined] optional DOMString name);
    // FIXME: should be union type http://crbug.com/240176
    [RaisesException, TypeChecking=Interface, DartSuppress] void add(HTMLElement element, optional HTMLElement? before = null);
    [ImplementedAs=addBeforeOptionAtIndex, RaisesException, TypeChecking=Interface] void add(HTMLElement element, long before);
    [RaisesException, DartSuppress] void remove(); // ChildNode overload
    [DartSuppress] void remove(long index);
    [RaisesException, TypeChecking=Interface|Nullable] setter HTMLOptionElement (unsigned long index, HTMLOptionElement? value);

    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;
};
