﻿(function (win, basePath) {
    if (!basePath) basePath = '';
    var playerUrl = basePath + 'ClientBin/TV2.Player.Standalone.xap';
    var chooserUrl = basePath + 'ClientBin/TV2.CameraChooser.xap';
    var springTrackerUrl = basePath + 'springTracker2.js';
    var springStreamsUrl = 'http://webtv.tv2.no/multimedia/webtv/dido/springstreams.js';
    var slMissingImageUrl = 'http://webtv.tv2.no/multimedia/webtv/images/sumo/popup/silverlight_missing.jpg';
    var silverlightJsUrl = basePath + 'Silverlight.js';

    var interAppId = (new Date()).getTime();

    if (!win.SumoPlayer || !win.SumoPlayer.insert) {
        if (!win.SumoPlayer) win.SumoPlayer = {}
        win.SumoPlayer.version = '1.3';

        win.SumoPlayer.insert = function (assetAndItemId, injectElement, options, onLoaded) {
            /*
            assetAndItemId:
            Asset (program) only: A single id, like 12345
            Item in asset: A string with assetId, dash separated with itemId, like '12345-67890'
            options: 
            autoplay
            referrer
            startPosition
            className
            stretch
            width
            height
            windowLess
            culture
            useBeta
            interAppId
            */

            var xapUrl = playerUrl;

            var defaultReferrer = '';


            // Initial stuff for all cases of inserting
            if (!options) options = {};

            if (typeof injectElement == 'string') {
                injectElement = document.getElementById(injectElement);
            }

            var elementId = 'video-' + assetAndItemId;
            while (document.getElementById(elementId)) {
                elementId = elementId + '_';
            }

            var width = '';
            var height = '';

            var splitted = ('' + assetAndItemId).split('-');
            var assetId = splitted[0] || '';
            var itemId = splitted[1] || '';

            if (options.width)
                width = isNaN(options.width) ? options.width : options.width + 'px';
            if (options.height)
                height = isNaN(options.height) ? options.height : options.height + 'px';

            var opera = navigator.userAgent.indexOf("Opera") >= 0;
            var linux = navigator.userAgent.indexOf('inux') >= 0;
            var mac = navigator.userAgent.indexOf("Mac") >= 0;
            var iSomething = navigator.userAgent.indexOf('iPad') > 0 || navigator.userAgent.indexOf('iPhone') > 0 || navigator.userAgent.indexOf('iPod') > 0;
            var incompatibleBrowser = (opera && parseFloat(navigator.appVersion) < 9.8) || (navigator.userAgent.indexOf("mac") != -1 && navigator.userAgent.indexOf("ppc") != -1) || linux;
            var ie = navigator.userAgent.indexOf("MSIE") >= 0 && !opera && navigator.userAgent.indexOf("Mac") < 0;
            var ie6 = navigator.userAgent.indexOf('MSIE 6') != -1;
            var ie9 = navigator.userAgent.indexOf("MSIE 9") >= 0 && !opera;

            var slPlayer;
            var slElement;

            if (win.Silverlight && win.Silverlight.isInstalled)
                checkAvailability();
            else
                loadScripts([silverlightJsUrl], checkAvailability);


            function checkAvailability() {
                if (Silverlight.isInstalled('4.0.50524.0')) {
                    loadScripts([springStreamsUrl, springTrackerUrl], getSpringTracker);
                } else {
                    recommendSilverlight();
                }
            }

            function getSpringTracker() {
                loadScripts([springTrackerUrl], insertPlayer);
            }


            function insertPlayer() {
                var xapPath = '';
                //if (options.useBeta || document.cookie.indexOf('webtv.usePlayerBeta=true')>=0) {
                //	xapPath = 'beta/';
                //}

                xapUrl = xapUrl.replace(/{path}/ig, (options.xapPath || xapPath));

                var initParams = [];
                initParams.push('assetId=' + assetId);
                if (itemId) initParams.push('itemId=' + itemId);

                if (options.autoplay) initParams.push('autoPlay=true');
                if (options.startPosition) initParams.push('startPosition=' + options.startPosition);
                if (options.muted) initParams.push('muted=true');
                if (options.bandwidth) initParams.push('maximumBandwidth=' + options.bandwidth);
                if (options.authenticateUser) initParams.push("authenticateUser=true");
                if (options.atHome) initParams.push('atHome=true');
                if (options.purchaseWelcomeTitle) initParams.push('purchaseWelcomeTitle=' + encodeURI(options.purchaseWelcomeTitle));
                if (options.purchaseWelcomeIntro) initParams.push('purchaseWelcomeIntro=' + encodeURI(options.purchaseWelcomeIntro));

                if (options.interAppId) {
                    initParams.push('playerName=MainPlayer' + options.interAppId);
                    initParams.push('chooserName=CameraChooser' + options.interAppId);
                } else if (interAppId) {
                    initParams.push('playerName=MainPlayer' + interAppId);
                    initParams.push('chooserName=CameraChooser' + interAppId);
                }


                if (options.country) initParams.push('country=' + options.country);
                if (!options.enableChannelMenu) initParams.push('enableChannelMenu=false');
                initParams.push('referrer=' + escapeInitParam(options.referrer || defaultReferrer));

                var className = options.className ? options.className : 'SumoPlayer';
                var playerCallbacks = new SumoPlayerCallbacks();

                if (ie) {
                    var slHtml = '<object type="application/x-silverlight-2" data="data:application/x-silverlight-2," id="' + elementId + '" class="' + className + '">';
                    slHtml += '<param name="EnableGPUAcceleration" value="true"/>';
                    slHtml += '<param name="Background" value="#111111"/>';
                    slHtml += '<param name="Framerate" value="25"/>';
                    if (options.culture) slHtml += '<param name="UICulture" value="' + (options.culture) + '"/>';
                    if (options.culture) slHtml += '<param name="Culture" value="' + (options.culture) + '"/>';
                    slHtml += '<param name="AllowHtmlPopupWindow" value="true"/>';
                    slHtml += '<param name="EnableCacheVisualization" value="' + (!!options.enableCacheVisualization) + '"/>';
                    slHtml += '<param name="WindowLess" value="' + (!!options.windowLess) + '"/>';
                    slHtml += '<param name="EnableHtmlAccess" value="true"/></object>';

                    if (options.stretch == null || options.stretch == true) {
                        var newContainer = createFillContainer(injectElement);
                        newContainer.innerHTML = slHtml;

                        slElement = document.getElementById(elementId);
                        styleForFill(slElement);
                    } else {
                        injectElement.innerHTML = slHtml;
                        slElement = document.getElementById(elementId);
                        if (width) slElement.style.width = width;
                        if (height) slElement.style.height = height;
                    }

                    if (options.windowLess) {
                        slElement.style.backgroundColor = 'transparent';
                    }

                    slElement.sumoCallbackRouter = playerCallbacks;
                    slElement.InitParams = initParams.join(',');
                    slElement.Source = xapUrl;
                } else {
                    slElement = document.createElement('object');

                    slElement.setAttribute('id', elementId);
                    slElement.className = className;

                    if (options.stretch != null && options.stretch == false) {
                        if (width) slElement.style.width = width;
                        if (height) slElement.style.height = height;
                    }

                    slElement.setAttribute('type', 'application/x-silverlight-2');
                    slElement.setAttribute('data', 'data:application/x-silverlight-2,');

                    slElement.appendChild(createParamElm('Source', xapUrl));
                    slElement.appendChild(createParamElm('InitParams', initParams.join(',')));
                    slElement.appendChild(createParamElm('MinRuntimeVersion', '4.0.50524.0'));
                    slElement.appendChild(createParamElm('Background', '#111111'));
                    slElement.appendChild(createParamElm('EnableGPUAcceleration', 'true'));
                    slElement.appendChild(createParamElm('Framerate', '25'));
                    if (options.culture) slElement.appendChild(createParamElm('UICulture', options.culture));
                    if (options.culture) slElement.appendChild(createParamElm('Culture', options.culture));
                    slElement.appendChild(createParamElm('WindowLess', !!options.windowLess));
                    slElement.appendChild(createParamElm('EnableCacheVisualization', !!options.enableCacheVisualization));
                    slElement.appendChild(createParamElm('EnableHtmlAccess', 'true'));
                    slElement.appendChild(createParamElm('AllowHtmlPopupWindow', 'true'));

                    if (options.windowLess) {
                        slElement.style.backgroundColor = 'transparent';
                    }

                    slElement.sumoCallbackRouter = playerCallbacks;

                    if (options.stretch == null || options.stretch == true) {
                        var newContainer = createFillContainer(injectElement);
                        slElement = styleForFill(slElement);
                        newContainer.appendChild(slElement);
                    } else {
                        injectElement.appendChild(slElement);
                    }
                }
                new SpringTracker(slElement, { playerEnvironment: 'TV 2 Sumo' });
            }

            function recommendSilverlight() {
                actualWidth = injectElement.clientWidth;
                actualHeight = Math.round(actualWidth * 9 / 16);

                installPoster = document.createElement('a');
                installPoster.target = '_blank';
                installPoster.href = 'http://go.microsoft.com/fwlink/?LinkID=149156';

                var installImage = document.createElement('img');
                installImage.src = slMissingImageUrl;
                installPoster.appendChild(installImage);
                installImage.style.border = '0';
                if (options.stretch == null || options.stretch == true) {
                    var newContainer = createFillContainer(injectElement);
                    installImage = styleForFill(installImage);
                    newContainer.appendChild(installPoster);
                } else {
                    styleForStatic(installImage, actualWidth, actualHeight)
                    injectElement.appendChild(installPoster);
                }
            }


            function createFillContainer(originalContainer) {
                // Thanks to http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/

                var outerWrapper = document.createElement('div');
                outerWrapper.style.position = 'relative';
                outerWrapper.style.height = '0';
                outerWrapper.style.paddingBottom = '56.25%'; //  = 9/16 of width
                outerWrapper.style.paddingTop = '0px'; // Player controls bar's height
                outerWrapper.style.border = '0';
                outerWrapper.style.margin = '0';

                var innerWrapper = document.createElement('div');
                innerWrapper = styleForFill(innerWrapper);
                outerWrapper.appendChild(innerWrapper);
                originalContainer.appendChild(outerWrapper);
                return innerWrapper;
            }

            function styleForFill(elm) {
                elm.style.position = 'absolute';
                elm.style.width = '100%';
                elm.style.height = '100%';
                elm.style.left = '0';
                elm.style.top = '0';
                elm.style.border = '0';
                elm.style.margin = '0';
                elm.style.padding = '0';
                return elm;
            }

            function styleForStatic(elm, w, h) {
                elm.style.position = 'absolute';
                elm.style.width = w + 'px';
                elm.style.height = h + 'px';
                elm.style.left = '0';
                elm.style.top = '0';
                elm.style.border = '0';
                elm.style.margin = '0';
                elm.style.padding = '0';
                return elm;
            }



            function createParamElm(name, value) {
                var newParam = document.createElement('param');
                newParam.setAttribute('name', name);
                newParam.setAttribute('value', value);
                return newParam;
            }

            function escapeInitParam(str) {
                return str.replace(/,/ig, '%2C').replace(/=/ig, '%3D');
            }


            function SumoPlayerCallbacks() {
                var handlers = { 'playerLoaded': [], 'playbackStarted': [], 'playbackCompleted': [] };

                function invokeEvent(eventName, data) {
                    var h = handlers[eventName] || [];
                    for (var i = 0; i < h.length; i++) {
                        try {
                            h[i](data);
                        } catch (e) {
                            if (win.console) {
                                console.log('Event handler for ' + eventName + ' threw an exception: ' + e.message);
                            }
                        }
                    }
                }

                this.PlayerLoaded = function () {
                    slPlayer = slElement.Content.Player;
                    invokeEvent('playerLoaded', slPlayer);
                    win.cameraPlayer = new (function (player) {
                        var me = this;
                        player.addEventListener('SnapshotUploadCompleted', function (sender, e) {
                            if (me.snapshotUploadCompleted) {
                                if (e.Result.indexOf('.jpg') > 0) {
                                    var imageUrl = 'http://static.tv2.no/bigbrother/' + e.Result;
                                    me.snapshotUploadCompleted(imageUrl, e.Result);
                                } else {
                                    me.snapshotUploadCompleted('', e.Result);
                                }
                            }
                        });

                        this.takeSnapshot = function () { return player.TakeSnapshot(); }
                        this.play = function (assetId) { player.Play(assetId); }

                    })(slPlayer);
                    if (onLoaded) {
                        onLoaded(slPlayer);
                    }
                };


                this.PlaybackStarted = function (playbackDetails) {
                    invokeEvent('playbackStarted', playbackDetails);
                }

                this.PlaybackCompleted = function (playbackDetails) {
                    invokeEvent('playbackCompleted', playbackDetails);
                }

                this.Debug = function (data) {
                    if (win.console)
                        console.log(data);
                }

                this.addEventListener = function (eventName, eventHandler) {
                    if (handlers[eventName] == null) {
                        handlers[eventName] = [];
                    }
                    handlers[eventName].push(eventHandler);
                }

            }

            return elementId;
        }

        win.SumoPlayer.insertChooser = function (assetIdList, playAssetId, selectAssetId, injectElement, options) {
            if (options == null) options = {};
            if (assetIdList.join) { // quick and dirty array type check
                assetIdList = assetIdList.join(';');
            }
            if (typeof injectElement == 'string') {
                injectElement = document.getElementById(injectElement);
            }
            if (win.Silverlight && win.Silverlight.isInstalled)
                insertIt();
            else
                loadScripts([silverlightJsUrl], insertIt);

            function insertIt() {
                Silverlight.createObject(chooserUrl, injectElement, 'slChooser', {
                    width: '100%', height: '97', background: 'white', version: '4.0.50826.0', enableGPUAcceleration: 'true', enableHTMLAccess: 'true'
                }, {},
                    'assetIds=' + assetIdList + ',playAssetId=' + playAssetId + ',selectAssetId=' + selectAssetId + ',flowLayout=FlowFlat,startCollapsed=false,chooserHeight=87,maximumBandwidth=400,chooserName=CameraChooser' + (options.interAppId || interAppId) + ',playerName=MainPlayer' + (options.interAppId || interAppId)
                );

            }

        }

        function loadScripts(scripts, onComplete) {
            var i = -1;
            var finished = false;

            loadNextScript();

            function loadNextScript() {
                i++;
                if (i < scripts.length) {
                    var head = document.getElementsByTagName("head")[0];
                    var newScript = document.createElement('script');
                    newScript.onload = loadNextScript;
                    newScript.type = 'text/javascript';
                    newScript.charset = 'ISO-8859-1';
                    newScript.onreadystatechange = function () { if (newScript.readyState == 'loaded' || newScript.readyState == 'complete') { loadNextScript() } };
                    newScript.src = scripts[i];
                    head.appendChild(newScript);
                } else if (onComplete && !finished) {
                    finished = true;
                    onComplete();
                }
            }

        }
    }
})(window, 'http://webtv.tv2.no/multimedia/webtv/sl/embed/');
