/*
 * Copyright (C) 2006, 2007 Apple 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 HTMLTableRowElement : HTMLElement {

        readonly attribute long            rowIndex;
        readonly attribute long            sectionRowIndex;
        readonly attribute HTMLCollection  cells;
                 attribute [ConvertNullToNullString] DOMString       align;
                 attribute [ConvertNullToNullString] DOMString       bgColor;
                 attribute [ConvertNullToNullString] DOMString       ch;
                 attribute [ConvertNullToNullString] DOMString       chOff;
                 attribute [ConvertNullToNullString] DOMString       vAlign;

        HTMLElement        insertCell(in long index)
            raises(DOMException);
        void               deleteCell(in long index)
            raises(DOMException);

    };

}
