﻿//*************************
//  CONSTRUCTOR
//*************************
function Video(control, rootElement) {

    //*************************
    //  PROPERTIES
    //*************************
    
    var _control = control;
    var _rootElement = rootElement;
    var _oScope = this;
    
    //LISTENERS
    var oVideoStatus = new Object();
    var oTimer = new Object();
 
    
    //ELEMENTS
    var _oVideo = new Object();
    var _oVideoHolder = new Object();
    var _oNavContainer = new Object();
    var _sURL = new String();
    var _oNavProp = new Object();
   
    //CLASS REFERENCE
    var vidHist = new History();
    var vidContHist = new History();
    var navContHist = new History();
    var progressBaseHist = new History();
    var progressShadHist = new History();
    var progressBorderHist1 = new History();
    var progressBorderHist2 = new History();
    var progressContHist = new History();
    
    //VIDEO ELEMENTS
    var volumeHist = new History();
    var fullScreenHist = new History();
    
    //PROGRESS BAR 
    var _isProgressBarEnabled = new Boolean();
     
    //CALLBACKS
    var onVideoStatusChange = new Function();
    var onVideoDuration = new Function();
    var onPositionChange = new Function();
    var onFullScreenChange = new Function();
    
    //PROPERTIES
    var _oVideoProperties = new Object();

    //*************************
    //  GETTER / SETTERS
    //*************************
    
    this.addVideoElement = function(oVideo) {_oVideo = oVideo;};
    this.videoElement = function() {return _oVideo};
    
    this.addVideoHolderElement = function(oVideoHolder) {_oVideoHolder = oVideoHolder};
    this.videoHolderElement = function() {return _oVideoHolder};
    
    this.addNavHolderElement = function(oNavContainer) {_oNavContainer = oNavContainer;};
    this.navHolderElement = function() {return _oNavContainer;};
    
    this.addURL = function(sURL) {_sURL = sURL;};
    this.URL = function() {return _sURL};
    
    this.addProperties = function(oVideoProperties) {_oVideoProperties = oVideoProperties;};
    this.properties = function() {return _oVideoProperties;};
    
    this.addNavProperties = function(oNavProp) {_oNavProp = oNavProp;};
    this.navProperties = function() {return _oNavProp;};
   
   
    this.isFullScreen = function() {return _control.content.FullScreen;};
    
    //DETERMINE IF PROGRESS BAR IS REQUIRED
    this.addIsProgressBar = function(isProgressBarEnabled) {_isProgressBarEnabled = isProgressBarEnabled; };
    this.isProgressBar = function() {return _isProgressBarEnabled;};

    

    //*************************
    //  PRIVATE
    //*************************


    //*************************
    //  GENERAL PROPERTIES
    //*************************
    function applyVideoProperties() {
        var oTarget = _oScope.videoElement();
        var oTargetCont = _oScope.videoHolderElement();
        var oTargetNavCont = _oScope.navHolderElement(); 
        var oNavBground = _oScope.navProperties().background;
        var oProgressContainer = _oScope.navProperties().progressContainer;
        var oPlayPauseBtn = _oScope.navProperties().playPauseBtn;

        //VIDEO PROPERTIES 
        oTarget["Canvas.Top"] = _oScope.properties().canvasTop;
        oTarget["Canvas.Left"] = _oScope.properties().canvasLeft;
        oTarget.Width = _oScope.properties().width;
        oTarget.Height = _oScope.properties().height;
        
         
         //CHECK IF PROGRESS BAR IS REQUIRED
        if(_oScope.isProgressBar() != true) {
                oProgressContainer.Opacity = 0.1;
                oPlayPauseBtn.Opacity = 0.2;
        }else {
                 oProgressContainer.Opacity = 1;
                 oPlayPauseBtn.Opacity = 1;
        }
            
        
        //VIDEO CONTAINER PROPERTIES
        
        //NAV CONTAINER PROPERTIES
        
        
    }
    
    //************************************************
    //  VIDEO HISTORY POSITION
    //*************************************************
    function captureHistoryPos() {
         var oTarget = _oScope.videoElement();
         var oTargetCont = _oScope.videoHolderElement();
         var oTargetNavCont = _oScope.navHolderElement(); 
         var oProgressContainer = _oScope.navProperties().progressContainer;
        
        //CAPTURE HISTORY;
        vidHist.addTarget(oTarget);
        vidContHist.addTarget(oTargetCont);
        navContHist.addTarget(oTargetNavCont);
        
        //PROGRESS BAR 
        progressBaseHist.addTarget(_oScope.navProperties().progressBase);
        progressShadHist.addTarget(_oScope.navProperties().progressShadow);
        progressBorderHist1.addTarget(_oScope.navProperties().border1);
        progressBorderHist2.addTarget(_oScope.navProperties().border2);
        
        //NAV ELEMENTS
        volumeHist.addTarget(_oScope.navProperties().volume);
        fullScreenHist.addTarget(_oScope.navProperties().fullScreen);
        progressContHist.addTarget(oProgressContainer);
    }

    //**************************
    //  MAIN VIDEO CALLER
    //**************************
    function showVideo() {
         var oMedia = _oScope.videoElement();
         var sURL = _oScope.URL();
         var oMediaListener = oMedia.AddEventListener("MediaFailed", onErrorLoadEvent);
         var oMediaOpened = oMedia.AddEventListener("MediaOpened", onMediaOpenedEvent);
         oMedia.Source = sURL;
         
         //SETTINGS
         oMedia.Volume = 100;
         
        
    }
    
    //********************************************************
    //  ADJUST VIDEO PROPERTIES WHEN PLAYING - IF REQUIRED
    //********************************************************
    function checkVideoProperties() {
        var oMedia = _oScope.videoElement();
        var nHeightMedia = oMedia.NaturalVideoHeight;
        var nWidthMedia = oMedia.NaturalVideoWidth;
        
        var oMediaContainer = _oScope.videoHolderElement();
        var nContainerWidth = oMediaContainer.Width;
        var nContainerHeight = oMediaContainer.Height;
    
        //APPLY NEW SIZE PROPERTIES
       oMedia.Width = nWidthMedia;
       oMedia.Height = nHeightMedia;
       
       //APPLY NEW POSITION - Left
      var nContainerCenterLeft = nContainerWidth / 2;
      var nMediaCenterLeft = oMedia.Width / 2;
      var nCenterLeftPos = nContainerCenterLeft - nMediaCenterLeft;
      oMedia["Canvas.Left"] = nCenterLeftPos;
      
      //APPLY NEW POSITION - Top
      var nContainerCenterTop = nContainerHeight / 2;
      var nMediaCenterTop = oMedia.Height / 2;
      var nCenterTopPos = nContainerCenterTop - nMediaCenterTop;
       oMedia["Canvas.Top"] = nCenterTopPos; 
    }
    
    
    //**************************
    //  FULL SCREEN FUNCTIONALITY
    //**************************
    
    function initiateFullScreenListener() {
        _control.content.onfullscreenchange = onResized;
    }
    
    function onResized() {
        var isFullScreen =  _control.content.FullScreen;

        if(isFullScreen) {
           captureHistoryPos();
           fullScreenProperties();
        }else {
          defaultScreenProperties();
           checkVideoProperties();
         }
        //EVENT CALL  
          _oScope.onFullScreenChange(isFullScreen);
    }
    
    
    //******************************************
    //  FULLSCREEN PROPERTIES
    //******************************************
    function fullScreenProperties() {

    
            //VIDEO ELEMENTS
            var oMedia = _oScope.videoElement();
            var oMediaContainer = _oScope.videoHolderElement();
            var oNavContainer = _oScope.navHolderElement(); 
            
            //NAV ELEMENTS - PROGRESS BAR 
            var oNavProgressBase = _oScope.navProperties().progressBase;
            var oNavProgressShadow = _oScope.navProperties().progressShadow;
            var oNavBorder1 =  _oScope.navProperties().border1;
            var oNavBorder2 =  _oScope.navProperties().border2;
            
            //NAV ELEMENTS  - NAV DROPDOWN
            var oDropDown =_oScope.navProperties().dropDown_container;

            //NAV ELEMENTS  - NAV BKGDS
            var oNavBkgdDefault =_oScope.navProperties().defaultNavBkgd;
            var ofullScreenNavBkgd =_oScope.navProperties().fullScreenNavBkgd;        
            
            //BUTTONS
            var oNavFullScreen = _oScope.navProperties().fullScreen;
            var oNavVolume = _oScope.navProperties().volume;
            var oProgressContainer = _oScope.navProperties().progressContainer;
            var oDefaultScreenImage = _oScope.navProperties().defaultScreenImage;
            var oFullScreenImage = _oScope.navProperties().fullScreenImage;
            
            //SPEAKER SELECTION
            var oSpeakerSlectionNav = _oScope.navProperties().speakerNav;
           
            
            //VIDEO ELEMENT PROPERTIES
            oMedia.Width = _control.content.ActualWidth;
            oMedia.Height = _control.content.ActualHeight;
            oMedia["Canvas.Top"] = 0;
            oMedia["Canvas.Left"] = 0;
            oDefaultScreenImage.Opacity=0;
            oFullScreenImage.Opacity=1;            
            
            
            //VIDEO ELEMENT HOLDER PROPERTIES
            oMediaContainer.Width = _control.content.ActualWidth;
            oMediaContainer.Height = _control.content.ActualHeight;
            oMediaContainer["Canvas.Top"] = 0;
            oMediaContainer["Canvas.Left"] = 0;
           
            
            //PROGRESS BAR PROPERTIES
            oProgressContainer["Canvas.Left"] = 60;
            oNavProgressBase.Width=570;
            oNavProgressShadow.Width=570;
            oNavBorder1.Width=570;
            oNavBorder2.Width=570;
            oDropDown.Visibility="Collapsed";
            oNavBkgdDefault.Visibility="Collapsed";
            ofullScreenNavBkgd.Visibility="Visible";
            ofullScreenNavBkgd.Opacity=1;
            
            //NAV ELEMENT POSITIONS
            oNavFullScreen["Canvas.Left"] = + 700;
            oNavVolume["Canvas.Left"] = + 660;

            //NAV CONTAINER PROPERTIES
            oNavContainer.Width = 734;
            oNavContainer.Height = 37;
            oNavContainer["Canvas.Top"] = _control.content.ActualHeight - oNavContainer.Height;
            oNavContainer["Canvas.Left"] = _control.content.ActualWidth/2-367;
            
            
            //SPEAKER SLECTION
            oSpeakerSlectionNav.Visibility = "Collapsed";
            
    }
    
    //*****************************************
    //  DEFAULT SCREEN SIZE PROPERTIES
    //*****************************************
    function defaultScreenProperties() {

           //NAV ELEMENTS  - NAV BKGDS
           var oNavBkgdDefault =_oScope.navProperties().defaultNavBkgd;
           var ofullScreenNavBkgd =_oScope.navProperties().fullScreenNavBkgd;
           
           //NAV ELEMENTS  - NAV DROPDOWN
           var oDropDown =_oScope.navProperties().dropDown_container;     

           //NAV ELEMENTS  - FULL SCREEN BTN           
           var oDefaultScreenImage = _oScope.navProperties().defaultScreenImage;
           var oFullScreenImage = _oScope.navProperties().fullScreenImage;   
           
                
            //SPEAKER SELECTION
            var oSpeakerSlectionNav = _oScope.navProperties().speakerNav;              

           //RESET POS VIA HISTORY
           vidHist.reset();
           vidContHist.reset();
           navContHist.reset();
           
           //PROGRESS BAR RESET
           progressBaseHist.reset();
           progressShadHist.reset();
           
           progressBorderHist1.reset();
           progressBorderHist2.reset();
           
           volumeHist.reset();
           fullScreenHist.reset();
           progressContHist.reset();
           
           oDropDown.Visibility="Visible";
           oNavBkgdDefault.Visibility="Visible";
           oNavBkgdDefault.Opacity=1;            
           ofullScreenNavBkgd.Visibility="Collapsed";
           ofullScreenNavBkgd.Opacity=0;
           oFullScreenImage.Opacity=0;
           oDefaultScreenImage.Opacity=1;
           
            //SPEAKER SLECTION
            oSpeakerSlectionNav.Visibility = "Visible";
            
          
    }
    
    //******************************************
    //  ACTIVATE FULLSCREEN HIDE FULLSCREEN
    //*****************************************
    function showFullScreen() {
      _control.content.FullScreen = true;
        
    }
    
    function hideFullScreen() {
        _control.content.FullScreen = false;
    }
    
 
    //**************************
    //  MEDIA ELEMENT EVENTS
    //*************************
    function mediaEventStatus() {
        var oTarget = _oScope.videoElement();
        oVideoStatus = oTarget.AddEventListener("CurrentStateChanged", statusHasChanged);
    }
    
    //***********************************
    //  LOOP TO CHECK CURRENT POSITION
    //***********************************
    function refresher() {
        if (!window.SilverlightTimer)
	        window.SilverlightTimer = {};

        SilverlightTimer.Scene = function() {};
        SilverlightTimer.Scene.prototype =
        {
	        handleLoad: function(plugIn, userContext, rootElement) 
	        {
		        this.plugIn = plugIn;
	        }
        }
        
        StopTimer();
        StartTimer();
        
        //SET INTERVAL
        function StartTimer() {
          oTimer = window.setInterval(refreshCheck,1000);
        }
        
        function StopTimer() {
          window.clearInterval(oTimer);         
        }
        
        //CALL ITEMS TO BE REFRESHED
        function refreshCheck() {
            videoPosition();
        }        
   } 
    
    
    //VIDEO DURATION
    function onMediaOpenedEvent(sender, eventArgs) {
        var oMedia = _oScope.videoElement();
        var sDuration = oMedia.NaturalDuration.Seconds;
        
          var isFullScreen =  _control.content.FullScreen;
          
          if(isFullScreen != true) {
            //CHECK PROPERTIES
           checkVideoProperties();
          }
       
        
        _oScope.onVideoDuration(sDuration);
        
        refresher();
    }
   
    //CURRENT VIDEOS POSITION 
    function videoPosition() {
        var oMedia = _oScope.videoElement();
        var sPosition = oMedia.Position.Seconds;
        _oScope.onPositionChange(sPosition);
    }
    
    //CURRENT STATUS OF THE VIDEO
    function statusHasChanged(sender, eventArgs) {
        var oTarget = _oScope.videoElement();
        var sStatus = oTarget.CurrentState;
        _oScope.onVideoStatusChange(sStatus);
    }
    
    //**************************
    //  ERROR HANDLING
    //**************************
    function onErrorLoadEvent(sender, events) {
        alert("Video is not working!!! \n Error connecting");
    }

    //*************************
    // PUBLIC
    //*************************

    this.initiate = function() {
        applyVideoProperties();
        initiateFullScreenListener();
        mediaEventStatus();
    };
    
    this.runVideo = function(sVideoURL) {
       _oScope.addURL(sVideoURL);
        showVideo();
    }
    
    this.restVideo = function() {
         showVideo();
    }
    
    this.fullScreen = function() {
        showFullScreen();
    }
    
    this.defaultScreen = function() {
        hideFullScreen();
    }
    
    this.stopVideo = function() {
    
      
         //CHECK IF PROGRESS BAR IS REQUIRED
        if(_oScope.isProgressBar != true) {
              _oScope.videoElement().Volume = 0;
        }else {
             _oScope.videoElement().Pause();
        }
    
    
        
    
    
    }
    
  

}