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

module html {

    interface [HasIndexGetter, HasCustomIndexSetter, GenerateConstructor] HTMLSelectElement : HTMLElement {

        readonly attribute DOMString       type;
                 attribute long            selectedIndex;
                 attribute [ConvertNullToNullString] DOMString       value;
        
        // Modified in DOM Level 2:
#if defined(LANGUAGE_OBJECTIVE_C)
        readonly attribute long            length;
#else
                 attribute unsigned long   length
                    setter raises (DOMException);
#endif

        readonly attribute HTMLFormElement form;

        // Modified in DOM Level 2:
        readonly attribute HTMLOptionsCollection options;

                 attribute boolean         disabled;
                 attribute boolean         multiple;
                 attribute [ConvertNullToNullString] DOMString       name;
                 attribute long            size;
                 attribute long            tabIndex;
        
        [OldStyleObjC] void add(in HTMLElement element, 
                               in HTMLElement before)
            raises(DOMException);

#if defined(LANGUAGE_JAVASCRIPT)
        // In JS, we support both options index and options object parameters - this cannot be autogenerated now.
        [Custom] void      remove(/* 1 */);
#else
        void               remove(in long index);
#endif
        void               blur();
        void               focus();

        // These methods are not in DOM Level 2 IDL, but are mentioned in the standard:
        // "The contained options can be directly accessed through the select element as a collection."
        Node item(in [IsIndex] unsigned long index);
        Node namedItem(in DOMString name);
    };

}
