<!DOCTYPE html>
<html>
    <head>
        <title>Selecting from a list of tracks</title>
        <script src="../media-controls.js"></script>
        <script src="../media-file.js"></script>
        <script src="../video-test.js"></script>
        <script src="../trackmenu-test.js"></script>
        <script>
            var timer = null;
            var expectedLanguage;
            var testStage = 0;
            var captionsButtonCoordinates;
            var trackMenuItems;

            function showCaptionMenu()
            {
                captionsButtonCoordinates = mediaControlsButtonCoordinates(video, "toggle-closed-captions-button");
                consoleWrite("- show captions menu.");
                eventSender.mouseMoveTo(captionsButtonCoordinates[0], captionsButtonCoordinates[1]);
                eventSender.mouseDown();
                eventSender.mouseUp();
                timer = setTimeout(nextStep, 100);
            }

            function trackLoaded()
            {
                consoleWrite("EVENT(load)");
                if (expectedLanguage == "") {
                    failTest("'" + event.target.srclang + "' track loaded unexpectedly.");
                    return;
                }
                testExpected("event.target.srclang", expectedLanguage);
                testExpected("event.target.readyState", HTMLTrackElement.LOADED);

                timer = setTimeout(nextStep, 200);
            }

            function createTrackElement(language, isDefault)
            {
                var track = document.createElement('track');
                track.setAttribute('kind', "captions");
                track.src = 'data:text/vtt,' + encodeURIComponent("WEBVTT\n\n00:00:00.000 --> 00:00:01.000\nCaption 1\n");
                track.setAttribute('srclang', language);
                track.setAttribute('onload', 'trackLoaded()');
                if (isDefault) {
                    consoleWrite("-- '" + language + "' track marked as default.");
                    track.setAttribute('default', 'default');
                }
                video.appendChild(track);
            }

            function createTrackElements(languages, defaultIndex)
            {
                var tracks = document.querySelectorAll('track');
                for (var ndx = 0; ndx < tracks.length; ++ndx)
                    video.removeChild(tracks[ndx]);

                consoleWrite("- creating tracks for: [" + languages + "].");
                for (var ndx = 0; ndx < languages.length; ++ndx)
                    createTrackElement(languages[ndx], ndx == defaultIndex);
            }

            function nextStep()
            {
                ++testStage;
                switch (testStage) {
                case 1:
                    consoleWrite("<br>Test 1: 'no' track selected because of user preferred language");
                    createTrackElements(['en', 'fr', 'no']);
                    expectedLanguage = 'no';
                    break;

                case 2:
                    consoleWrite("<br>Test 2: 'no' track still selected because of language, overriding 'default' attribute");
                    createTrackElements(['fr', 'en', 'no'], 1);
                    expectedLanguage = 'no';
                    break;

                case 3:
                    consoleWrite("<br>Test 3: select 'fr' track from menu");
                    showCaptionMenu();
                    break;

                case 4:
                    trackMenuItems = captionTrackMenuList();
                    testExpected("trackMenuItems[indexOfCaptionMenuItemBeginningWith('French')].className", "");
                    testExpected("trackMenuItems[indexOfCaptionMenuItemBeginningWith('English')].className", "");
                    testExpected("trackMenuItems[indexOfCaptionMenuItemBeginningWith('Norwegian')].className", "selected");

                    selectCaptionMenuItem("French");
                    expectedLanguage = 'fr';
                    break;

                case 5:
                    testExpected("video.textTracks[0].mode", "showing");
                    testExpected("video.textTracks[0].language", "fr");

                    consoleWrite("<br>Test 4: preferred language was changed to 'fr' by selecting track from menu");
                    createTrackElements(['ru', 'en', 'fr']);
                    expectedLanguage = 'fr';
                    break;

                case 6:
                    testExpected("video.textTracks[2].mode", "showing");
                    testExpected("video.textTracks[2].language", "fr");

                    consoleWrite("<br>Test 5: turning captions off from menu disables caption selection");
                    showCaptionMenu();
                    break;

                case 7:
                    selectCaptionMenuItem("Off");
                    expectedLanguage = '';
                    createTrackElements([ 'ru', 'jp', 'en']);
                    timer = setTimeout(nextStep, 100);
                    break;

                case 8:
                    for (var ndx = 0; ndx < video.textTracks.length; ++ndx)
                        testExpected("video.textTracks[" + ndx + "].mode", "disabled");

                    consoleWrite("");
                    endTest();
                    return;
                }
            }

            function start()
            {
                findMediaElement();
                video.src = findMediaFile('video', '../content/test');
                video.addEventListener('canplaythrough', nextStep);
                consoleWrite("<br>Set user languages to: ['no', 'es-ES', 'en', 'fr'].");
                internals.setUserPreferredLanguages(['no', 'es-ES', 'en', 'fr']);
                internals.settings.setShouldDisplayTrackKind('Captions', true);
            }
        </script>
    </head>

    <body onload="start()">
        <p>Test track user preferences.</p>
        <video width="500" height="300" controls>
        </video>
    </body>
</html>
