﻿//*************************
//  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 navBgroundHist = new History();
    
    //PATH HISTORY
    var pathHist1 = new History();
    var pathHist2 = new History();
    var pathHist3 = new History();
    var pathHist4 = 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();
    var durationHist = new History();
     
    //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;};

    

    //*************************
    //  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;
     
        //VIDEO PROPERTIES 
        oTarget["Canvas.Top"] = _oScope.properties().canvasTop;
        oTarget["Canvas.Left"] = _oScope.properties().canvasLeft;
        oTarget.Width = _oScope.properties().width;
        oTarget.Height = _oScope.properties().height;
        
        //VIDEO CONTAINER PROPERTIES
        
        //NAV CONTAINER PROPERTIES
        
        
        
        //CAPTURE HISTORY;
        vidHist.addTarget(oTarget);
        vidContHist.addTarget(oTargetCont);
        navContHist.addTarget(oTargetNavCont);
        navBgroundHist.addTarget(oNavBground);
        
        //APPLY PATH HISTORY
        pathHist1.addTarget(_oScope.navProperties().paths[0]);
        pathHist2.addTarget(_oScope.navProperties().paths[1]);
        pathHist3.addTarget(_oScope.navProperties().paths[2]);
        pathHist4.addTarget(_oScope.navProperties().paths[3]);
        
        //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);
        durationHist.addTarget(_oScope.navProperties().duration);
        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;
      
    }
    
    
    //**************************
    //  FULL SCREEN FUNCTIONALITY
    //**************************
    
    function initiateFullScreenListener() {
        _control.content.onfullscreenchange = onResized;
    }
    
    function onResized() {
        var isFullScreen =  _control.content.FullScreen;

        if(isFullScreen) {
           fullScreenProperties();
         
        }else {
           defaultScreenProperties();
         }
        //EVENT CALL  
          _oScope.onFullScreenChange(isFullScreen);
    }
    
    
    //******************************************
    //  FULLSCREEN PROPERTIES
    //******************************************
    function fullScreenProperties() {
            var oMedia = _oScope.videoElement();
            var oMediaContainer = _oScope.videoHolderElement();
            var oNavContainer = _oScope.navHolderElement(); 
            var oNavBackground = _oScope.navProperties().background;
            
            var oNavProgressBase = _oScope.navProperties().progressBase;
            var oNavProgressShadow = _oScope.navProperties().progressShadow;
            var oNavBorder1 =  _oScope.navProperties().border1;
            var oNavBorder2 =  _oScope.navProperties().border1;
            
            //NAV ELEMENTS
            var oNavFullScreen = _oScope.navProperties().fullScreen;
            var oNavDuration = _oScope.navProperties().duration;
            var oNavVolume = _oScope.navProperties().volume;
            var oProgressContainer = _oScope.navProperties().progressContainer;
            
            
            //VIDEO ELEMENT PROPERTIES
            oMedia.Width = _control.content.ActualWidth;
            oMedia.Height = _control.content.ActualHeight;
            oMedia["Canvas.Top"] = 0;
            oMedia["Canvas.Left"] = 0;
            
           
            
            //VIDEO ELEMENT HOLDER PROPERTIES
            oMediaContainer.Width = _control.content.ActualWidth;
            oMediaContainer.Height = _control.content.ActualHeight;
            oMediaContainer["Canvas.Top"] = 0;
            oMediaContainer["Canvas.Left"] = 0;
            
            oProgressContainer["Canvas.Left"] = 60;
          
            //BACKGROUND PROPERTIES
            oNavBackground.Width = _control.content.ActualWidth;
            oNavBackground.Height = 30;
            
            
            //ADJUST PATH LENGTHS;
            var nLength = _oScope.navProperties().paths.length;
            for(var i = 0; i < nLength; i++ ) {
              _oScope.navProperties().paths[i].Height = 30;
            };
            
            //NAV ELEMENT POSITIONS
            oNavFullScreen["Canvas.Left"] = _control.content.ActualWidth - oNavFullScreen.Width - 5;
            oNavVolume["Canvas.Left"] = _control.content.ActualWidth - oNavFullScreen.Width - 20 - oNavVolume.Width;
            oNavDuration["Canvas.Left"]= _control.content.ActualWidth - oNavFullScreen.Width - 20 - oNavVolume.Width - 25 - oNavDuration.Width;
            
            oNavDuration["Canvas.Top"] = 3;
            oNavDuration.FontSize = 10;
            
            //Positoin dividers
            _oScope.navProperties().paths[2]["Canvas.Left"] = oNavVolume["Canvas.Left"] - 5;
            _oScope.navProperties().paths[3]["Canvas.Left"] = oNavFullScreen["Canvas.Left"] - 5;
            
            //INCREASE PROGRESS BAR SIZE
      
            
            oNavProgressBase.Width = oNavDuration["Canvas.Left"] - 100;
            oNavProgressShadow.Width = oNavDuration["Canvas.Left"] - 100;
            oNavBorder1.Width = oNavDuration["Canvas.Left"] - 100;
            oNavBorder2.Width = oNavDuration["Canvas.Left"] - 100;
          
            //NAV CONTAINER PROPERTIES
            oNavContainer.Width = _control.content.ActualWidth;
            oNavContainer.Height = 30;
            oNavContainer["Canvas.Top"] = _control.content.ActualHeight - oNavContainer.Height;
            oNavContainer["Canvas.Left"] = 0;
    }
    
    //*****************************************
    //  DEFAULT SCREEN SIZE PROPERTIES
    //*****************************************
    function defaultScreenProperties() {
           var oNavDuration = _oScope.navProperties().duration;
           oNavDuration.FontSize = 7;
           
           //RESET POS VIA HISTORY
           vidHist.reset();
           vidContHist.reset();
           navContHist.reset();
           navBgroundHist.reset();
           
           //RESET PATHS
           pathHist1.reset();
           pathHist2.reset();
           pathHist3.reset();
           pathHist4.reset();
           
           //PROGRESS BAR RESET
           progressBaseHist.reset();
           progressShadHist.reset();
           
           progressBorderHist1.reset();
           progressBorderHist2.reset();
           
           volumeHist.reset();
           fullScreenHist.reset();
           durationHist.reset();
           progressContHist.reset();
           
          
    }
    
    //******************************************
    //  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;
        
        _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() {
	
         var oMedia = _oScope.videoElement();
		 oMedia.Pause();
    }
    
  

}