﻿    function getSL2VideoPlayer() {

        var me = this;

        this.variableName = "sl2VideoPlayer";

        this.objectElementID = null;
        this.mediaElementName = null;

        this.host = null;
        this.mediaElement = null;

        this.documentLoadedRetries = 0;

        this.controlsOutTimoutID = 0;
        this.controlsOutDone = false;

        this.LogAppend = function(messageLine) {
            var logContainer = document.getElementById("logContainer");
            logContainer.innerHTML = logContainer.innerHTML + messageLine + "<br />";
        };

        function MediaOpenedHandler(sender, eventArgs) {
            me.LogAppend("MediaOpened");
        };

        function MediaLoadedHandler(sender, eventArgs) {
            me.LogAppend("MediaLoaded");
        };

        function MediaEndedHandler(sender, eventArgs) {
            me.LogAppend("MediaEnded");
        };

        function DownloadProgressChangedHandler(sender, eventArgs) {
            me.LogAppend("DownloadProgressChanged: " + sender.DownloadProgress);
        };

        function BufferingProgressChangedHandler(sender, eventArgs) {
            me.LogAppend("BufferingProgressChanged: " + parseInt(sender.BufferingProgress * 100) + "%");
        };

        function MediaFailedHandler(sender, eventArgs) {
            me.LogAppend("MediaFailed");
        };

        this.controlsOut_Completed = function(sender, eventArgs) {
            try {
                var controlsContainer = me.host.content.findName("controlsContainer");
                controlsContainer.Visibility = "Collapsed";
            }
            catch (e) {
            }
        };

        this.doControlsOut = function() {
            try {
                var controlsOutStoryboard = me.host.content.findName("controlsOut");
                // C#: controlsOut.Completed += controlsOut_Completed;
                controlsOutStoryboard.AddEventListener("Completed", me.controlsOut_Completed);
                controlsOutStoryboard.Begin();
            }
            catch (e) {
            }
            me.controlsOutDone = true;
        };

        this.currentStateChangedHandler = function(sender, eventArgs) {
            if (me.controlsOutDone == true) {
                return;
            }

            if (sender.CurrentState == "Playing") {
                me.controlsOutTimoutID = setTimeout(me.variableName + ".doControlsOut()", 9000);
            }
            else if (me.controlsOutTimoutID > 0) {
                clearTimeout(me.controlsOutTimoutID);
            }
        };

        this.addEventListeners = function() {
            // http://msdn.microsoft.com/en-us/library/bb980132(VS.95).aspx
            me.mediaElement.AddEventListener("MediaFailed", MediaFailedHandler);
            //me.mediaElement.AddEventListener("BufferingProgressChanged", BufferingProgressChangedHandler);
            //me.mediaElement.AddEventListener("DownloadProgressChanged", DownloadProgressChangedHandler);
            me.mediaElement.AddEventListener("CurrentStateChanged", me.currentStateChangedHandler);
            //me.mediaElement.AddEventListener("Loaded", MediaLoadedHandler);
            //me.mediaElement.AddEventListener("MediaOpened", MediaOpenedHandler);
            me.mediaElement.AddEventListener("MediaEnded", MediaEndedHandler);
        };

        this.setupPlayer = function() {

            var thisFunctionName = me.variableName + ".setupPlayer()";

            var pluginLoaded = false;

            try {
                me.host = document.getElementById(me.objectElementID);
                if (me.host) {
                    me.host.focus();
                    if (me.host.content != null) {
                        me.mediaElement = me.host.content.findName(me.mediaElementName);
                        if (me.mediaElement != null) {
                            pluginLoaded = me.addEventListeners(me.mediaElement);
                        }
                    }
                }
            }
            catch (e) {
            }

            if (pluginLoaded != true) {
                if (me.documentLoadedRetries < 8) {
                    me.documentLoadedRetries++
                    setTimeout(thisFunctionName, 300);
                }
            }
        };

        // objectElementID = id attribute of object HTML element which embeds the Silverlight application in the web page.
        // mediaElementName = X:Name attribute of MediaElement XAML element in the Page.xaml.
        this.setup = function(objectElementID, mediaElementName) {
            me.objectElementID = objectElementID;
            me.mediaElementName = mediaElementName;
            me.setupPlayer();
        };
    }

    var sl2VideoPlayer = new getSL2VideoPlayer();
