<svg id="svg-root" width="100%" height="100%"
  viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <!--======================================================================-->
  <!--=  Copyright 2008 World Wide Web Consortium, (Massachusetts          =-->
  <!--=  Institute of Technology, European Research Consortium for         =-->
  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
  <!--=  All Rights Reserved.                                              =-->
  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
  <!--======================================================================-->
  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
    template-version="1.4" reviewer="DAS" author="CM" status="accepted"
    version="$Revision: 1.11 $" testname="$RCSfile: animate-dom-01-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/animate.html#InterfaceSVGAnimationElement">
        <p>
          This tests the return value required for the
          SVGAnimationElement.getStartTime() method, as described in
          section 19.5 DOM Interfaces.
        </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
      <p>
        After the loading the document, some animations that have no
        visible effect will run.  The text "Test running..." will
        appear in the bottom right corner until the test has
        completed.  (This takes 2.5s.)
      </p>
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
        The test is passed if all seven rectangles are green once the animations
        have stopped running (i.e., 2.5s after the document has loaded.)
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: animate-dom-01-f.svg,v $</title>
  <defs>
    <font-face
      font-family="SVGFreeSansASCII"
      unicode-range="U+0-7F">
      <font-face-src>
        <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
      </font-face-src>
    </font-face>
  </defs>
  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">

    <text x='30' y='30'>Testing SVGAnimationElement.getStartTime()</text>

    <text x='340' y='340' display='none'>Test running...
      <set attributeName='display' to='inline' begin='0s' dur='2.5s'/>
    </text>

    <g id='g' display='none'/>

    <animate id='a1' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='1s' dur='1s'/>
    <animate id='a2' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='1s' dur='1s' fill='freeze'/>
    <animate id='a3' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='indefinite' dur='1s'/>
    <animate id='a4' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='indefinite; 100s; g.click; 1s; indefinite' dur='1s'/>
    <animate id='a5' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='100s; 1s' dur='1s'/>
    <animate id='a6dep' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='5s' dur='1s'/>
    <animate id='a6' attributeName='display' values='inline; inline'
             calcMode='discrete' begin='a6dep.begin+2s' dur='1s'/>

    <animate attributeName='display' values='inline; inline'
             calcMode='discrete' begin='0.5s' dur='1s' onbegin='before()'/>
    <animate attributeName='display' values='inline; inline'
             calcMode='discrete' begin='1.5s' dur='1s' onbegin='during()'/>
    <animate attributeName='display' values='inline; inline'
             calcMode='discrete' begin='2.5s' dur='1s' onbegin='after()'/>

    <g transform='translate(30,-10)'>
      <rect id='r1' y='50' width='25' height='25'/>
      <rect id='r2' y='80' width='25' height='25'/>
      <rect id='r3' y='110' width='25' height='25'/>
      <rect id='r4' y='140' width='25' height='25'/>
      <rect id='r5' y='170' width='25' height='25'/>
      <rect id='r6' y='200' width='25' height='25'/>
      <rect id='r7' y='230' width='25' height='25'/>
      <rect id='r8' y='260' width='25' height='25'/>
    </g>

    <g font-size='14' transform='translate(70,-15)'>
      <text y='72'>Called before a lone interval starts</text>
      <text y='102'>Called on an animation with no intervals</text>
      <text y='132'>Called during an interval</text>
      <text y='162'>Called after a lone interval ends, fill="remove"</text>
      <text y='192'>Called after a lone interval ends, fill="freeze"</text>
      <text y='222'>Called with multiple begin values</text>
      <text y='252'>Called with multiple begin values including "indefinite"</text>
      <text y='282'>Called with syncbase begin value</text>
    </g>
    <script><![CDATA[
      var i, ids = 'a1 a2 a3 a4 a5 a6 r1 r2 r3 r4 r5 r6 r7 r8'.split(' ');
      for (i in ids) {
        this[ids[i]] = document.getElementById(ids[i]);
      }

      function before() {
        try {
          if (a1.getStartTime() == 1) {
            r1.setAttributeNS(null, 'fill', 'lime');
          }
        } catch (e) {
          r1.setAttributeNS(null, 'fill', 'red');
        }

        r2.setAttributeNS(null, 'fill', 'red');
        try {
          a3.getStartTime();
        } catch (e) {
          if (e.code == DOMException.INVALID_STATE_ERR) {
            r2.setAttributeNS(null, 'fill', 'lime');
          }
        }

        try {
          if (a4.getStartTime() == 1) {
            r6.setAttributeNS(null, 'fill', 'lime');
          }
        } catch (e) {
          r6.setAttributeNS(null, 'fill', 'red');
        }

        try {
          if (a5.getStartTime() == 1) {
            r7.setAttributeNS(null, 'fill', 'lime');
          }
        } catch (e) {
          r7.setAttributeNS(null, 'fill', 'red');
        }

        try {
          if (a6.getStartTime() == 7) {
            r8.setAttributeNS(null, 'fill', 'lime');
          }
        } catch (e) {
          r8.setAttributeNS(null, 'fill', 'red');
        }
      }

      function during() {
        try {
          if (a1.getStartTime() == 1) {
            r3.setAttributeNS(null, 'fill', 'lime');
          }
        } catch (e) {
          r3.setAttributeNS(null, 'fill', 'red');
        }
      }

      function after() {
        r4.setAttributeNS(null, 'fill', 'red');
        try {
          a1.getStartTime();
        } catch (e) {
          if (e.code == DOMException.INVALID_STATE_ERR) {
            r4.setAttributeNS(null, 'fill', 'lime');
          }
        }

        r5.setAttributeNS(null, 'fill', 'red');
        try {
          a2.getStartTime();
        } catch (e) {
          if (e.code == DOMException.INVALID_STATE_ERR) {
            r5.setAttributeNS(null, 'fill', 'lime');
          }
        }
      }
    ]]></script>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
  <text id="revision" x="10" y="340" stroke="none"
    fill="black">$Revision: 1.11 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
  <!-- comment out this watermark once the test is approved --><!--
  <g id="draft-watermark">
    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
  </g>-->
</svg>
