/*
 * Copyright (c) 2003 World Wide Web Consortium,
 * (Massachusetts Institute of Technology, Institut National de
 * Recherche en Informatique et en Automatique, Keio University). All
 * Rights Reserved. This program is distributed under the W3C's Software
 * Intellectual Property License. This program 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 W3C License http://www.w3.org/Consortium/Legal/ for more details.
 */

package org.w3c.dom.html2;

import org.w3c.dom.Document;

/**
 * Create a frame. See the FRAME element definition in HTML 4.01.
 * <p>See also the <a href='http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109'>Document Object Model (DOM) Level 2 HTML Specification</a>.
 */
public interface HTMLFrameElement extends HTMLElement {
    /**
     * Request frame borders. See the frameborder attribute definition in HTML 
     * 4.01.
     */
    public String getFrameBorder();
    /**
     * Request frame borders. See the frameborder attribute definition in HTML 
     * 4.01.
     */
    public void setFrameBorder(String frameBorder);

    /**
     * URI [<a href='http://www.ietf.org/rfc/rfc2396.txt'>IETF RFC 2396</a>] designating a long description of this image or frame. See the 
     * longdesc attribute definition in HTML 4.01.
     */
    public String getLongDesc();
    /**
     * URI [<a href='http://www.ietf.org/rfc/rfc2396.txt'>IETF RFC 2396</a>] designating a long description of this image or frame. See the 
     * longdesc attribute definition in HTML 4.01.
     */
    public void setLongDesc(String longDesc);

    /**
     * Frame margin height, in pixels. See the marginheight attribute 
     * definition in HTML 4.01.
     */
    public String getMarginHeight();
    /**
     * Frame margin height, in pixels. See the marginheight attribute 
     * definition in HTML 4.01.
     */
    public void setMarginHeight(String marginHeight);

    /**
     * Frame margin width, in pixels. See the marginwidth attribute definition 
     * in HTML 4.01.
     */
    public String getMarginWidth();
    /**
     * Frame margin width, in pixels. See the marginwidth attribute definition 
     * in HTML 4.01.
     */
    public void setMarginWidth(String marginWidth);

    /**
     * The frame name (object of the <code>target</code> attribute). See the 
     * name attribute definition in HTML 4.01.
     */
    public String getName();
    /**
     * The frame name (object of the <code>target</code> attribute). See the 
     * name attribute definition in HTML 4.01.
     */
    public void setName(String name);

    /**
     * When true, forbid user from resizing frame. See the noresize attribute 
     * definition in HTML 4.01.
     */
    public boolean getNoResize();
    /**
     * When true, forbid user from resizing frame. See the noresize attribute 
     * definition in HTML 4.01.
     */
    public void setNoResize(boolean noResize);

    /**
     * Specify whether or not the frame should have scrollbars. See the 
     * scrolling attribute definition in HTML 4.01.
     */
    public String getScrolling();
    /**
     * Specify whether or not the frame should have scrollbars. See the 
     * scrolling attribute definition in HTML 4.01.
     */
    public void setScrolling(String scrolling);

    /**
     * A URI [<a href='http://www.ietf.org/rfc/rfc2396.txt'>IETF RFC 2396</a>] designating the initial frame contents. See the src attribute 
     * definition in HTML 4.01.
     */
    public String getSrc();
    /**
     * A URI [<a href='http://www.ietf.org/rfc/rfc2396.txt'>IETF RFC 2396</a>] designating the initial frame contents. See the src attribute 
     * definition in HTML 4.01.
     */
    public void setSrc(String src);

    /**
     * The document this frame contains, if there is any and it is available, 
     * or <code>null</code> otherwise.
     * @since DOM Level 2
     */
    public Document getContentDocument();

}
