/*
 * Copyright (c) 2000 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.
 */

// File: smil.idl
#ifndef _SMIL_IDL_
#define _SMIL_IDL_

#include "dom.idl"
#include "views.idl"
#include "events.idl"

#pragma prefix "dom.w3c.org"
module smil
{
  typedef dom::DOMString DOMString;
  typedef dom::Element Element;
  typedef dom::NodeList NodeList;
  typedef dom::Document Document;

  interface SMILRegionElement;

  interface ElementLayout {
             attribute DOMString        title;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        backgroundColor;
                                        // raises(dom::DOMException) on setting

             attribute long             height;
                                        // raises(dom::DOMException) on setting

             attribute long             width;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILRegionInterface {
             attribute SMILRegionElement  region;
  };

  interface Time {
    readonly attribute boolean          resolved;
    readonly attribute double           resolvedOffset;
    // TimeTypes
    const unsigned short      SMIL_TIME_INDEFINITE           = 0;
    const unsigned short      SMIL_TIME_OFFSET               = 1;
    const unsigned short      SMIL_TIME_SYNC_BASED           = 2;
    const unsigned short      SMIL_TIME_EVENT_BASED          = 3;
    const unsigned short      SMIL_TIME_WALLCLOCK            = 4;
    const unsigned short      SMIL_TIME_MEDIA_MARKER         = 5;

    readonly attribute unsigned short   timeType;
             attribute double           offset;
                                        // raises(dom::DOMException) on setting

             attribute Element          baseElement;
                                        // raises(dom::DOMException) on setting

             attribute boolean          baseBegin;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        event;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        marker;
                                        // raises(dom::DOMException) on setting

  };

  interface TimeList {
    Time               item(in unsigned long index);
    readonly attribute unsigned long    length;
  };

  interface ElementTime {
             attribute TimeList         begin;
                                        // raises(dom::DOMException) on setting

             attribute TimeList         end;
                                        // raises(dom::DOMException) on setting

             attribute float            dur;
                                        // raises(dom::DOMException) on setting

    // restartTypes
    const unsigned short      RESTART_ALWAYS                 = 0;
    const unsigned short      RESTART_NEVER                  = 1;
    const unsigned short      RESTART_WHEN_NOT_ACTIVE        = 2;

             attribute unsigned short   restart;
                                        // raises(dom::DOMException) on setting

    // fillTypes
    const unsigned short      FILL_REMOVE                    = 0;
    const unsigned short      FILL_FREEZE                    = 1;

             attribute unsigned short   fill;
                                        // raises(dom::DOMException) on setting

             attribute float            repeatCount;
                                        // raises(dom::DOMException) on setting

             attribute float            repeatDur;
                                        // raises(dom::DOMException) on setting

    boolean            beginElement();
    boolean            endElement();
    void               pauseElement();
    void               resumeElement();
    void               seekElement(inout float seekTo);
  };

  interface ElementTimeManipulation {
             attribute float            speed;
                                        // raises(dom::DOMException) on setting

             attribute float            accelerate;
                                        // raises(dom::DOMException) on setting

             attribute float            decelerate;
                                        // raises(dom::DOMException) on setting

             attribute boolean          autoReverse;
                                        // raises(dom::DOMException) on setting

  };

  interface ElementTimeContainer : ElementTime {
    readonly attribute NodeList         timeChildren;
    NodeList           getActiveChildrenAt(in float instant);
  };

  interface ElementSyncBehavior {
    readonly attribute DOMString        syncBehavior;
    readonly attribute float            syncTolerance;
    readonly attribute DOMString        defaultSyncBehavior;
    readonly attribute float            defaultSyncTolerance;
    readonly attribute boolean          syncMaster;
  };

  interface ElementParallelTimeContainer : ElementTimeContainer {
             attribute DOMString        endSync;
                                        // raises(dom::DOMException) on setting

    float              getImplicitDuration();
  };

  interface ElementSequentialTimeContainer : ElementTimeContainer {
  };

  interface ElementExclusiveTimeContainer : ElementTimeContainer {
             attribute DOMString        endSync;
                                        // raises(dom::DOMException) on setting

    NodeList           getPausedElements();
  };

  interface ElementTimeControl {
    boolean            beginElement()
                                        raises(dom::DOMException);
    boolean            beginElementAt(in float offset)
                                        raises(dom::DOMException);
    boolean            endElement()
                                        raises(dom::DOMException);
    boolean            endElementAt(in float offset)
                                        raises(dom::DOMException);
  };

  interface ElementTargetAttributes {
             attribute DOMString        attributeName;
    // attributeTypes
    const unsigned short      ATTRIBUTE_TYPE_AUTO            = 0;
    const unsigned short      ATTRIBUTE_TYPE_CSS             = 1;
    const unsigned short      ATTRIBUTE_TYPE_XML             = 2;

             attribute unsigned short   attributeType;
  };

  interface ElementTest {
             attribute long             systemBitrate;
                                        // raises(dom::DOMException) on setting

             attribute boolean          systemCaptions;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        systemLanguage;
                                        // raises(dom::DOMException) on setting

    readonly attribute boolean          systemRequired;
    readonly attribute boolean          systemScreenSize;
    readonly attribute boolean          systemScreenDepth;
             attribute DOMString        systemOverdubOrSubtitle;
                                        // raises(dom::DOMException) on setting

             attribute boolean          systemAudioDesc;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILDocument : Document, ElementSequentialTimeContainer {
  };

  interface SMILElement : Element {
             attribute DOMString        id;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILLayoutElement : SMILElement {
    readonly attribute DOMString        type;
    readonly attribute boolean          resolved;
  };

  interface SMILTopLayoutElement : SMILElement, ElementLayout {
  };

  interface SMILRootLayoutElement : SMILElement, ElementLayout {
  };

  interface SMILRegionElement : SMILElement, ElementLayout {
             attribute DOMString        fit;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        top;
                                        // raises(dom::DOMException) on setting

             attribute long             zIndex;
                                        // raises(dom::DOMException) on setting

  };

  interface TimeEvent : events::Event {
    readonly attribute views::AbstractView  view;
    readonly attribute long             detail;
    void               initTimeEvent(in DOMString typeArg, 
                                     in views::AbstractView viewArg, 
                                     in long detailArg);
  };

  interface SMILMediaElement : ElementTime, SMILElement {
             attribute DOMString        abstractAttr;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        alt;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        author;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        clipBegin;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        clipEnd;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        copyright;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        longdesc;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        port;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        readIndex;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        rtpformat;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        src;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        stripRepeat;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        title;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        transport;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        type;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILRefElement : SMILMediaElement {
  };

  interface SMILAnimation : SMILElement, ElementTargetAttributes, ElementTime, ElementTimeControl {
    // additiveTypes
    const unsigned short      ADDITIVE_REPLACE               = 0;
    const unsigned short      ADDITIVE_SUM                   = 1;

             attribute unsigned short   additive;
                                        // raises(dom::DOMException) on setting

    // accumulateTypes
    const unsigned short      ACCUMULATE_NONE                = 0;
    const unsigned short      ACCUMULATE_SUM                 = 1;

             attribute unsigned short   accumulate;
                                        // raises(dom::DOMException) on setting

    // calcModeTypes
    const unsigned short      CALCMODE_DISCRETE              = 0;
    const unsigned short      CALCMODE_LINEAR                = 1;
    const unsigned short      CALCMODE_PACED                 = 2;
    const unsigned short      CALCMODE_SPLINE                = 3;

             attribute unsigned short   calcMode;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        keySplines;
                                        // raises(dom::DOMException) on setting

             attribute TimeList         keyTimes;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        values;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        from;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        to;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        by;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILAnimateElement : SMILAnimation {
  };

  interface SMILSetElement : ElementTimeControl, ElementTime, ElementTargetAttributes, SMILElement {
             attribute DOMString        to;
  };

  interface SMILAnimateMotionElement : SMILAnimateElement {
             attribute DOMString        path;
                                        // raises(dom::DOMException) on setting

             attribute DOMString        origin;
                                        // raises(dom::DOMException) on setting

  };

  interface SMILAnimateColorElement : SMILAnimation {
  };

  interface SMILSwitchElement : SMILElement {
    Element            getSelectedElement();
  };
};

#endif // _SMIL_IDL_

