/*
 * Copyright (C) 2007 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

module html {
interface [GenerateConstructor, Conditional=VIDEO] HTMLMediaElement : HTMLElement {

    // error state
    readonly attribute MediaError error;

    // network state
    attribute DOMString src;
    readonly attribute DOMString currentSrc;
    
    const unsigned short EMPTY = 0;
    const unsigned short LOADING = 1;
    const unsigned short LOADED_METADATA = 2;
    const unsigned short LOADED_FIRST_FRAME = 3;
    const unsigned short LOADED = 4;
    readonly attribute unsigned short networkState;
    readonly attribute float bufferingRate;
    readonly attribute TimeRanges buffered;
    void load() 
        raises (DOMException);

    // ready state
    const unsigned short DATA_UNAVAILABLE = 0;
    const unsigned short CAN_SHOW_CURRENT_FRAME = 1;
    const unsigned short CAN_PLAY = 2;
    const unsigned short CAN_PLAY_THROUGH = 3;
    readonly attribute unsigned short readyState;
    readonly attribute boolean seeking;

    // playback state
    attribute float currentTime
        setter raises (DOMException);
    readonly attribute float duration;
    readonly attribute boolean paused;
    attribute float defaultPlaybackRate 
        setter raises (DOMException);
    attribute float playbackRate 
        setter raises (DOMException);
    readonly attribute TimeRanges played;
    readonly attribute TimeRanges seekable;
    readonly attribute boolean ended;
    attribute boolean autoplay;
    void play() 
        raises (DOMException);
    void pause() 
        raises (DOMException);

    // looping
    attribute float start;
    attribute float end;
    attribute float loopStart;
    attribute float loopEnd;
    attribute unsigned long playCount
        setter raises (DOMException);
    attribute unsigned long currentLoop;

    // controls
    attribute boolean controls;
    attribute float volume 
        setter raises (DOMException);
    attribute boolean muted;
};
}
