<html>
    <head>
        <script src=media-file.js></script>
        <script src=video-test.js></script>
        <script>
            var playCount = 0;
            var pauseCount = 0;
            var seekedCount = 0;
            var playThroughCount = 0;
            var videos = [];

            function logEvent(evt)
            {
                consoleWrite("EVENT(" + evt.type + ")");
            }

            function ended(evt)
            {
                logEvent(evt);
            }

            function seeked(evt)
            {
                logEvent(evt);

                switch (++seekedCount)
                {
                case 2:
                    consoleWrite("<br>** Send a play command, it should go to videos[0] because it was playing most recently.");
                    run("internals.postRemoteControlCommand('play')");
                    consoleWrite("");
                    break;
                }
            }

            function pause(evt)
            {
                logEvent(evt);

                switch (++pauseCount)
                {
                case 1:
                    testExpected("event.target.id", "two");
                    testExpected("videos[0].paused", false);
                    testExpected("videos[1].paused", true);
                    consoleWrite("<br>** Pause video[0], so they both stop playing...");
                    run("videos[0].pause()");
                    consoleWrite("");
                    break;
                case 2:
                    testExpected("event.target.id", "one");
                    testExpected("videos[0].paused", true);
                    testExpected("videos[1].paused", true);

                    consoleWrite("<br>** Seek so video[1] will pause automatically when playback ends.");
                    
                    var seekTime = (videos[1].duration - .5).toFixed(1);
                    run("videos[0].currentTime = 0");
                    run("videos[1].currentTime = " + seekTime);
                    consoleWrite("");
                    break;
                case 3:
                    testExpected("event.target.id", "two");
                    testExpected("videos[0].paused", false);
                    testExpected("videos[1].paused", true);

                    consoleWrite("<br>** Send a pause command, videos[0] is still playing so it should get the command.");
                    run("internals.postRemoteControlCommand('pause')");
                    consoleWrite("");
                    break;
                case 4:
                    testExpected("event.target.id", "one");
                    testExpected("videos[0].paused", true);
                    testExpected("videos[1].paused", true);
                    consoleWrite("");
                    endTest();
                    break;
                case 4:
                }
            }

            function playing(evt)
            {
                logEvent(evt);

                switch (++playCount)
                {
                case 2:
                    consoleWrite("<br>** Send a pause command, it should go to video[1].");
                    run("internals.postRemoteControlCommand('pause')");
                    consoleWrite("");
                    break;
                case 3:
                    testExpected("event.target.id", "one");
                    consoleWrite("<br>** Start videos[1], wait for it to pause at duration.");
                    run("videos[1].play()");
                    consoleWrite("");
                    break;
                case 4:
                    testExpected("event.target.id", "two");
                    consoleWrite("");
                    break;
                }
            }

            function canplaythrough(evt)
            {
                logEvent(evt);

                if (++playThroughCount < 2)
                    return;

                consoleWrite("<br>** Play both videos, the last one started (video[1]) should get focus...");
                run("videos[0].play()");
                run("videos[1].play()");

                consoleWrite("");
            }

            function start()
            {
                if (!window.internals) {
                    failTest('This test requires window.internals.');
                    return;
                }

                videos = document.getElementsByTagName('video');
                for (var i = 0; i < videos.length; ++i) {
                    video = videos[i];
                    video.addEventListener("canplaythrough", canplaythrough);
                    video.addEventListener('playing', playing);
                    video.addEventListener('pause', pause);
                    video.addEventListener('seeked', seeked);
                    video.src = findMediaFile("video", "content/test");
                }
            }
        </script>
    </head>

    <body onload="start()">
        <video controls id="one"></video>
        <video controls id="two"></video>
        <p>Test play and pause with "remote control" interface.</p>
    </body>
</html>
