﻿// <reference path="~/Default_aspx.js" />
/// <reference path="Utilities.js" />
/// <reference path="ResourceStrings.js" />
Type.registerNamespace("ServerTransformed");

ServerTransformed.ModelController = function() {}

ServerTransformed.ModelController.prototype =
{
    handleLoad: function(control, userContext, rootElement)
    {
        if (!this._initialized)
        {
            this._control = control;

            this._downloadAllXAML();
            Sys.Debug.trace("downloaded the deploy file");
            this._initialized = true;

            this._currentMVPTriplet = { model: null, view: null, controller: null }

            this._loadFontsDelegate = Function.createDelegate(this, this._loadFonts);
            this._loadPageForModelDelegate = Function.createDelegate(this, this._loadPageForModel);
            this._exitEventDelegate = Function.createDelegate(this, this._exitEvent);
            this._exitEarlyDelegate = Function.createDelegate(this, this._exitEarly);

            this._soundControlDelegate = Function.createDelegate(this, this._soundControl);
            this._volumeChangeDelegate = Function.createDelegate(this, this._volumeChange);
            this.add_soundHandler(this._volumeChangeDelegate);
            this._soundOn = true;
            this._footerSection = this.get_controller().content.FindName("FooterLinks");
            this._footerSection.FindName("SoundControl").addEventListener("mouseleftbuttonup", this._soundControlDelegate);
            this._footerSection.FindName("ProductInformation").addEventListener("mouseleftbuttonup", this._productInfoClick);
            this._footerSection.FindName("TryIt").addEventListener("mouseleftbuttonup", this._tryItClick);
            this._footerSection.FindName("Partners").addEventListener("mouseleftbuttonup", this._partnersClick);


            this._footerSection.FindName("SoundControl").addEventListener("mouseenter", function(sender, eventArgs) { sender.Opacity = "1"; });
            this._footerSection.FindName("ProductInformation").addEventListener("mouseenter", function(sender, eventArgs) { sender.Opacity = "1"; });
            this._footerSection.FindName("TryIt").addEventListener("mouseenter", function(sender, eventArgs) { sender.Opacity = "1"; });
            this._footerSection.FindName("Partners").addEventListener("mouseenter", function(sender, eventArgs) { sender.Opacity = "1"; });


            this._footerSection.FindName("SoundControl").addEventListener("mouseleave", function(sender, eventArgs) { sender.Opacity = "0.5"; });
            this._footerSection.FindName("ProductInformation").addEventListener("mouseleave", function(sender, eventArgs) { sender.Opacity = "0.5"; });
            this._footerSection.FindName("TryIt").addEventListener("mouseleave", function(sender, eventArgs) { sender.Opacity = "0.5"; });
            this._footerSection.FindName("Partners").addEventListener("mouseleave", function(sender, eventArgs) { sender.Opacity = "0.5"; });

            this._footerSection.Width = "150";
            this._footerSection.FindName("ProductInformation").Visibility = "Collapsed";
            this._footerSection.FindName("TryIt").Visibility = "Collapsed";
            this._footerSection.FindName("Partners").Visibility = "Collapsed";
            this._footerSection.FindName("FooterBackground").Visibility = "Collapsed";

            this._audioPlayer1 = this.get_controller().content.FindName("AudioPlayer1");
            this._audioPlayer2 = this.get_controller().content.FindName("AudioPlayer2");
            this._videoPlayer1 = this.get_controller().content.FindName("VideoPlayer1");
            this._videoPlayer2 = this.get_controller().content.FindName("VideoPlayer2");

            this._retryMediaHandler = Function.createDelegate(this, this._retryMedia);
            this._audioPlayer1.addEventListener("MediaFailed", this._retryMediaHandler);
            this._audioPlayer2.addEventListener("MediaFailed", this._retryMediaHandler);
            this._videoPlayer1.addEventListener("MediaFailed", this._retryMediaHandler);
            this._videoPlayer2.addEventListener("MediaFailed", this._retryMediaHandler);

            this.get_events().addHandler("preloadPhase1", Function.createDelegate(this, function() { this._loadPage("intro"); }));
            this.get_events().addHandler("preloadPhase2", Function.createDelegate(this, this._showSkip));

            this._audioEndedHandler = Function.createDelegate(this, this._playAmbientAudio);
            this._videoDownloadHandler = Function.createDelegate(this, this._videoDownloadComplete);
            this._videoSetList = new Array();

            //phase 1
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['introAudio'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['ambientAudio'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['mainNavigation'];
            //phase 2
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['hyper_v'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['security'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['stability'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['web_innovations'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['manageability'];
            //phase 3
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['meet_it_24_7'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['customer'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['toy_box'];
            this._videoSetList[this._videoSetList.length] = ServerTransformed.Res.URL['impatient'];

            this._currentVideoDownload = 0;
            Sys.Debug.trace("about to preload videos");
            this._preloadVideo();
        }
    },

    _showSkip: function()
    {
        if (this._pageName == "intro")
            this._currentMVPTriplet.model.showSkipIntro();
    },

    _preloadVideo: function()
    {
        var PreloadPanel = this.get_controller().content.FindName("PreloadPanel");
        PreloadPanel.children.Clear();

        if (this._currentVideoDownload == 3)
        {
            this._raiseEvent("preloadPhase1");
            Sys.Debug.trace("phase 1 is done");
        }
        if (this._currentVideoDownload == 8)
        {
            this._raiseEvent("preloadPhase2");
            Sys.Debug.trace("phase 2 is done");
        }
        if (this._currentVideoDownload >= this._videoSetList.length)
        {
            Sys.Debug.trace("video preload is finished");
            return;
        }
        else
        {
            Sys.Debug.trace("now downloading: " + this._videoSetList[this._currentVideoDownload]);
            var videoPlayer = ServerTransformed.Utilities.MakeVideoCanvas(this.get_controller(), "preload", this._videoSetList[this._currentVideoDownload]);
            videoPlayer.Opacity = 0;
            videoPlayer.Volume = 0;
            videoPlayer.AddEventListener("DownloadProgressChanged", this._videoDownloadHandler);
            videoPlayer.Source = this._videoSetList[this._currentVideoDownload];
            PreloadPanel.children.Add(videoPlayer);
            this._currentVideoDownload++;
        }
    },

    _videoDownloadComplete: function(sender, eventArgs)
    {
        if (sender.DownloadProgress == 1)
        {
            this._preloadVideo();
        }
    },

    add_soundHandler: function(handler) { this.get_events().addHandler("volumeChange", handler); },
    remove_soundHandler: function(handler) { this.get_events().removeHandler("volumeChange", handler); },

    _downloadAllXAML: function()
    {
        var downloader = this.get_controller().createObject("downloader");
        this._xamlDownloadHandler = Function.createDelegate(this, this._xamlDownloadCompleted);
        downloader.addEventListener("completed", this._xamlDownloadHandler);

        downloader.open("GET", "assets/xaml.deploy");
        downloader.send();
    },

    _xamlDownloadCompleted: function(sender, eventArgs)
    {
        if (sender.status == 200)
        {
            this._xamlStore = sender;
            this._showWaiting();
        }
    },

    _loadFonts: function(sender, eventArgs)
    {
        var downloader = this.get_controller().createObject("downloader");
        downloader.addEventListener("completed", Function.createDelegate(this, this._fontDownloadCompleted));

        downloader.open("GET", "assets/fonts/Segoe_TT_PC.deploy");
        downloader.send();
    },

    _fontDownloadCompleted: function(sender, eventArgs)
    {
        if (sender.status == 200)
        {
            var canvas = this.get_controller().content.FindName("ContentViewport");
            ServerTransformed.Utilities.SetCanvasFonts(canvas, sender);
            sender = null;
            this._hideWaiting();
            this._currentMVPTriplet.model.set_fontsLoaded(true);
        }
    },

    get_controller: function() { return this._control; },

    _exitEvent: function(sender, eventArgs)
    {
        var closeCommand = sender.get_closeCommand();


        if (this._pageName != "intro")
        {
            this._currentMVPTriplet.model.remove_loadFontsHandler(this._loadFontsDelegate);
        }
        this._currentMVPTriplet.model.remove_loadPageHandler(this._loadPageForModelDelegate);
        this._currentMVPTriplet.model.remove_exitHandler(this._exitEventDelegate);

        this._loadPage(closeCommand);
    },

    _loadTabForModel: function(sender, eventArgs)
    {
        var tabName = eventArgs.name;
        switch (eventArgs.tabType)
        {
            case "caseStudies":
                for (var i = 0; i < $get("caseStudies").childNodes.length; i++)
                {
                    if ($get("caseStudies").childNodes[i].id != tabName)
                        continue;

                    sender.set_currentName($get("caseStudies").childNodes[i].id);
                    sender.set_currentVideo($get("caseStudies").childNodes[i].childNodes[0].childNodes[0].href);
                    sender.set_currentStoryText(ServerTransformed.Utilities.ConvertHTMLToXAML($get("caseStudies").childNodes[i].childNodes[2].innerHTML));
                    sender.set_currentStoryFullLink($get("caseStudies").childNodes[i].childNodes[1].childNodes[0].href);
                    break;
                }
                break;
            case "toyBox":
                for (var i = 0; i < $get("toyBox").childNodes.length; i++)
                {
                    if ($get("toyBox").childNodes[i].id != tabName)
                        continue;

                    sender.set_currentName($get("toyBox").childNodes[i].id);
                    sender.set_currentTabContent($get("toyBox").childNodes[i]);
                    break;
                }
                break;
            default:
                var content = $get(sender.get_pageName());
                var copy = ServerTransformed.Utilities.ConvertHTMLToXAML(content.childNodes[1].innerHTML);
                var subhead = content.childNodes[0].innerHTML;
                sender.set_subHead(subhead);
                sender.set_copy(copy);
                break;
        }
    },

    _loadPageForModel: function(sender, eventArgs)
    {
        var xaml = this.get_controller().content.createFromXamlDownloader(this._xamlStore, eventArgs.url);
        sender.set_pageXAML(xaml);
    },

    _loadPage: function(pageName)
    {
        var actionTag = '';
        this._ambientAudio(true);
        switch (pageName)
        {
            case "intro":
                this._currentMVPTriplet.view = new ServerTransformed.IntroAnimView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.IntroAnimModel();
                this._currentMVPTriplet.presenter = new ServerTransformed.IntroAnimPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                break;
            case "Security":
                this._currentMVPTriplet.view = new ServerTransformed.TextContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TextContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TextContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08SecurityWEIGHTED_1";
                break;
            case "Stability":
                this._currentMVPTriplet.view = new ServerTransformed.TextContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TextContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TextContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08StabilityWEIGHTED_1";
                break;
            case "Manageability":
                this._currentMVPTriplet.view = new ServerTransformed.TextContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TextContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TextContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08ManageabilityWEIGHTED_1";
                break;
            case "Web_Innovations":
                this._currentMVPTriplet.view = new ServerTransformed.TextContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TextContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TextContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08WebInnovationsWEIGHTED_1";
                break;
            case "Hyper-V":
                this._currentMVPTriplet.view = new ServerTransformed.TextContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TextContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TextContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY09WS08SLHyperV_1";
                break;
            case "Customer":
                //load the first customer story
                this._currentMVPTriplet.view = new ServerTransformed.TabContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.TabContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.TabContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);

                this._currentMVPTriplet.model.set_currentName($get("caseStudies").childNodes[0].id);
                this._currentMVPTriplet.model.set_currentVideo($get("caseStudies").childNodes[0].childNodes[0].childNodes[0].href);
                this._currentMVPTriplet.model.set_currentStoryText(ServerTransformed.Utilities.ConvertHTMLToXAML($get("caseStudies").childNodes[0].childNodes[2].innerHTML));
                this._currentMVPTriplet.model.set_currentStoryFullLink($get("caseStudies").childNodes[0].childNodes[1].childNodes[0].href);

                this._currentMVPTriplet.model.add_tabChangeHandler(Function.createDelegate(this, this._loadTabForModel));

                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08CustomersWEIGHTED_1";
                break;
            case "Meet IT 24-7":
                this._currentMVPTriplet.view = new ServerTransformed.VideoContentView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.VideoContentModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.VideoContentPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08MeetITWEIGHTED_1";
                break;
            case "Toy Box":
                this._currentMVPTriplet.view = new ServerTransformed.ToyBoxView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.ToyBoxModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.ToyBoxPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);

                this._currentMVPTriplet.model.set_currentName($get("toyBox").childNodes[0].id);

                this._currentMVPTriplet.model.add_tabChangedHandler(Function.createDelegate(this, this._loadTabForModel));

                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08ToyBoxWEIGHTED_1";
                break;
            case "Download Trial":
                this._currentMVPTriplet.view = new ServerTransformed.LaunchPageView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.LaunchPageModel(pageName);
                this._currentMVPTriplet.presenter = new ServerTransformed.LaunchPagePresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                this._currentMVPTriplet.model.set_LaunchPage($get("Download_Trial").childNodes[0].href);
                this._hideWaiting();
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY09WS08SLTrialDownloadHyperV_1";
                break;
            case "mainNavigation":
            default:
                this._ambientAudio(false);
                this._currentMVPTriplet.view = new ServerTransformed.MainNavigationView(this.get_controller());
                this._currentMVPTriplet.model = new ServerTransformed.MainNavigationModel();
                this._currentMVPTriplet.presenter = new ServerTransformed.MainNavigationPresenter(this._currentMVPTriplet.model, this._currentMVPTriplet.view);
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08AdLandingWEIGHTED_1";
                break;
        }


        if (pageName != "intro")
        {
            this._showFooter();
            this._trackActionTag(actionTag);
        }
        else
        {
            this._currentMVPTriplet.model.add_exitEarlyHandler(this._exitEarlyDelegate);
            this._playAudio("intro");
        }

        this._currentMVPTriplet.model.add_loadFontsHandler(this._loadFontsDelegate);
        this._currentMVPTriplet.model.add_loadPageHandler(this._loadPageForModelDelegate);
        this._currentMVPTriplet.model.add_exitHandler(this._exitEventDelegate);
        this._currentMVPTriplet.presenter.init();
        this._pageName = pageName;
    },

    _ambientAudio: function(pause)
    {
        if (pause)
        {
            this._audioPlayer1.Pause();
            this._footerSection.FindName("SoundControl").Visibility = "Collapsed";
        }
        else
        {
            this._footerSection.FindName("SoundControl").Visibility = "Visible";
            this._audioPlayer1.Play();
        }
    },

    _trackActionTag: function(actionTag)
    {
        $get("trackingtag").src = actionTag;
    },

    _exitEarly: function(sender, eventArgs)
    {
        this._playAmbientAudio(this._audioPlayer1, Sys.EventArgs.Empty);
    },

    _playAudio: function(value)
    {
        this._audioPlayer1.Opacity = 1;
        this._audioPlayer1.AutoPlay = "True";
        this._audioPlayer1.AddEventListener("MediaEnded", this._audioEndedHandler);
        this._audioPlayer2.AddEventListener("MediaEnded", this._audioEndedHandler);
        //this._audioPlayer1.AddEventListener("MarkerReached", this._audioEndedHandler);
        this._audioPlayer1.Source = ServerTransformed.Res.URL['introAudio'];
        this._currentAudioPlayer = this._audioPlayer1.Name;
        this._audioPlayer2.Source = ServerTransformed.Res.URL['ambientAudio'];
    },

    _playAmbientAudio: function(sender, eventArgs)
    {
        sender.Source = ServerTransformed.Res.URL['ambientAudio'];
        sender.Stop();
        sender.Play();

    },

    _showWaiting: function()
    {
        if (!this._isWaitingDisplayed)
        {
            var xaml = this.get_controller().content.createFromXamlDownloader(this._xamlStore, "xaml/Waiting.xaml");
            this.get_controller().content.FindName("WaitingCanvas").Visibility = "Visible";
            this.get_controller().content.FindName("WaitingCanvas").children.Add(xaml);
            this._isWaitingDisplayed = true;
        }
    },

    _hideWaiting: function()
    {
        if (this._isWaitingDisplayed)
        {
            this.get_controller().content.FindName("WaitingCanvas").Visibility = "Collapsed";
            this.get_controller().content.FindName("WaitingCanvas").children.Clear();
            this._isWaitingDisplayed = false;
        }
    },

    _showFooter: function()
    {
        if (!this._footerSection)
        {
            this._footerSection = this.get_controller().content.FindName("FooterLinks");
        }
        this._footerSection.Width = "980";
        this._footerSection.FindName("ProductInformation").Visibility = "Visible";
        this._footerSection.FindName("TryIt").Visibility = "Visible";
        this._footerSection.FindName("Partners").Visibility = "Visible";
        this._footerSection.FindName("FooterBackground").Visibility = "Visible";
        this._footerSection.Opacity = "1";
    },

    _volumeChange: function(sender, eventArgs)
    {
        this._audioPlayer1.Volume = eventArgs.volume;
        this._audioPlayer2.Volume = eventArgs.volume;
        this._videoPlayer1.Volume = eventArgs.volume;
        this._videoPlayer2.Volume = eventArgs.volume;
    },

    _soundControl: function(sender, eventArgs)
    {
        var soundControl = this._footerSection.FindName("SoundControl");
        if (this._soundOn)
        {
            soundControl.FindName("SoundLabel").Text = ServerTransformed.Res['soundOn'];
            this._soundOn = false;
        }
        else
        {
            soundControl.FindName("SoundLabel").Text = ServerTransformed.Res['soundOff'];
            this._soundOn = true;
        }
        this._raiseEvent("volumeChange", { volume: (this._soundOn ? 0.75 : 0) });
    },

    _productInfoClick: function()
    {
        dcsMultiTrack('DCS.dcsuri', '/ws2008/bottom/prodinfo', 'WT.ti', 'Bottom: Product Information', 'WT.cg_n', '', 'DCSext.ws2008', 'Referral - Product Info', 'WT.dl', '6');
        window.open(ServerTransformed.Res.URL['readMore']);
        $get("trackingtag").src = "http://switch.atdmt.com/action/mrtitp_FY09WS08SLProdInfoFooter_1";
    },

    _tryItClick: function()
    {
        dcsMultiTrack('DCS.dcsuri', '/ws2008/bottom/tryit', 'WT.ti', 'Bottom: Try It', 'WT.cg_n', '', 'DCSext.ws2008', 'Referral - Try It', 'WT.dl', '6');
        window.open(ServerTransformed.Res.URL['tryIt']);
        $get("trackingtag").src = "http://switch.atdmt.com/action/mrtitp_FY09WS08SLTrialDownloadFooter_1";
    },

    _partnersClick: function()
    {
        dcsMultiTrack('DCS.dcsuri', '/ws2008/bottom/partners', 'WT.ti', 'Bottom: Partners', 'WT.cg_n', '', 'DCSext.ws2008', 'Referral - Partners', 'WT.dl', '6');
        window.open(ServerTransformed.Res.URL['partner']);
    },

    _retryMedia: function(sender, eventArgs)
    {
        if (this._retryCount)
            this._retryCount = 1;
        else if (this._retryCount > 10)
            throw new Error("Media Failed: Retry count exceeded. Please refresh the page.");
        else
            this._retryCount++;
        var source = sender.Source;
        sender.Source = source;
    },

    get_events: function()
    {
        if (!this._events)
        {
            this._events = new Sys.EventHandlerList();
        }
        return this._events;
    },

    _raiseEvent: function(eventName, eventArgs)
    {
        var handler = this.get_events().getHandler(eventName);

        if (handler)
        {
            if (!eventArgs) eventArgs = Sys.EventArgs.Empty;
            handler(this, eventArgs);
        }
    }
}

ServerTransformed.ModelController.registerClass("ServerTransformed.ModelController");
