﻿// <reference path="~/Default_aspx.js" />
/// <reference path="Utilities.js" />
Type.registerNamespace("ServerTransformed");

ServerTransformed.ModelController = function() {}

ServerTransformed.ModelController.prototype = 
{
    handleLoad: function(control, userContext, rootElement)
    {
        if(!this._initialized)
        {
            this._control = control;
            
            this._downloadAllXAML();
            
            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['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;
            this._preloadVideo();
        }
    },
    
    _showSkip: function()
    {
        if(this._pageName == "intro")
            this._currentMVPTriplet.model.showSkipIntro();
    },
    
    _preloadVideo: function()
    {
        Sys.Debug.trace(this._currentVideoDownload);
        var PreloadPanel = this.get_controller().content.FindName("PreloadPanel");
        PreloadPanel.children.Clear();
        
        if(this._currentVideoDownload == 3)
            this._raiseEvent("preloadPhase1");
        if(this._currentVideoDownload == 7)
            this._raiseEvent("preloadPhase2");
        
        if(this._currentVideoDownload >= this._videoSetList.length)
        {
            return;
        }
        else
        {
            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);        
    },
    
    _showFilters: function(show) { $get("buttonBar").style.visibility = (show) ? "visible" : "hidden"; },
    
    _loadPage: function(pageName)
    {
        var actionTag = '';
        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);
                this._showFilters(false);
                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._showFilters(false);                
                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._showFilters(false);
                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._showFilters(false);
                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._showFilters(false);
                this._currentMVPTriplet.model.add_pageLoadedHandler(Function.createDelegate(this, this._loadTabForModel));
                actionTag = "http://switch.atdmt.com/action/mrtitp_FY08WS08WebInnovationsWEIGHTED_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._showFilters(false);
                
                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);
                this._showFilters(false);
                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._showFilters(false);
                
                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 "mainNavigation":
            default:
                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);
                this._showFilters(true);
                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;
    },
    
    _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']);
    },
    
    _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']);
    },
    
    _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");