Source: managers/connection-manager.js

/**
 * @module managers/connection-manager
 * @description This module manages connection states and their associated text/icon indicators
 * @requires managers/admin-manager
 * @requires managers/managers/prsonas-manager
 */
define([
    "managers/admin-manager",
    "managers/prsonas-manager"
], 

function (admin, prsonas)
{

    // ---------------------------------------------------------------
    //
    // CONNECTION MANAGER
    //
    // ---------------------------------------------------------------

    var Connection = function ()
    {
        console.log(" * <connection>");

        window.tEvent.eventStr.EVENT_INDICATOR_UPDATE = "EVENT_INDICATOR_UPDATE";
        window.tEvent.eventStr.EVENT_TOGGLE_CONNECTION_INDICATORS = "EVENT_TOGGLE_CONNECTION_INDICATORS";
     
        this.oAdmin = admin;
        this.oPrsonas = prsonas;

        this.ui = {
            unitStatus       : ".js-license-status",
            internetStatus   : ".js-internet-status",
            microphoneStatus : ".js-microphone-status",
            speechStatus     : ".js-speech-status",
            indicators       : ".js-indicators",
            indicator        : ".js-indicator",
            modal            : ".js-modal-body"
        };


        this.def = {
            TEMPLATE_LICENSE_WARNING    : "partial-license-warning",
            TEMPLATE_INTERNET_WARNING   : "partial-internet-warning",
            TEMPLATE_MICROPHONE_WARNING : "partial-microphone-warning",
            TEMPLATE_SPEECH_WARNING     : "partial-speech-warning",            
            TEMPLATE_ICON_INDICATORS    : "partial-icon-indicators",            
            CLASS_DISABLED              : "is-disabled"
        };

        this.jConfig = -1;

        this.internetCheckInterval     = -1;
        this.speechStatusCheckInterval = -1;

        this.status = {
            unit       : false,
            internet   : false,
            speech     : false,
            microphone : false
        };

        this.init();
    };

    Connection.prototype =
    {    
       
        // ______________________________________________________________
        //                                                           init
        /**
            * init
            * @description Initializes class
            * @fires assignListeners()
            * @memberOf module:managers/admin-manager
            * @instance
        */
        init: function()
        {   
            this.assignListeners();            
        },


        // ______________________________________________________________
        //                                                assignListeners
        /** 
        * assignListeners
        * @description Assigns listeners to events used in this class.
        * @listens  EVENT_MODEL_READY
        * @listens  EVENT_TOGGLE_CONNECTION_INDICATORS
        * @memberOf module:managers/connection-manager
        * @instance
        */
        assignListeners: function()
        {           
            var self = this;         

            // page is loaded, check for anchor and scroll to anchor
            if (typeof window.oModel === "undefined" || window.oModel.jConfig === -1){
                window.tEvent.addListener("EVENT_MODEL_READY", function(evt, data)
                {
                    // clean up for new page
                    self.onJsonLoaded(); 
                });                
            } else {
                self.onJsonLoaded(); 
            }

            window.tEvent.addListener("EVENT_TOGGLE_CONNECTION_INDICATORS", function(evt) {
                self.onToggleIndicators();
            });


            // WEBSOCKET_CONNECTED event
            this.oPrsonas.sdk.subscribe(this.oPrsonas.sdk.eventTypes["WEBSOCKET_CONNECTED"], function(evt) {
                self.setUnitConnection(true);
            });

            // WEBSOCKET_DISCONNECTED event
            this.oPrsonas.sdk.subscribe(this.oPrsonas.sdk.eventTypes["WEBSOCKET_DISCONNECTED"], function(evt) {
                self.setUnitConnection(false);
            });

        },

        


        // --------------------------------------------------------------
        // HELPERS
        // --------------------------------------------------------------
        
        // ______________________________________________________________
        //                                               showVersionModal
        /** 
        * showVersionModal
        * @description Displays version modal
        * @memberOf module:managers/connection-manager
        * @instance
        */
        showVersionModal: function() { 

            var self = this;

            window.oModal.load(
            {
                id: "modal_version",
                modalSource: "alt",
                content :  window.oDxpTemplates.partial_version({
                    custom: this.jConfig.services.versioning
                }),                
                css:
                {
                    "width"      : "460px",
                    "height"     : "375px"
                } 
            });

            setTimeout(function(){ 
                // close modal if open
                if ($(self.ui.modal + "[data-id='modal_version']").parents(".modal-container").css("display") === "block"){
                    if (typeof window.oModal.modals["modal_version"] !== "undefined"){
                        window.oModal.modals["modal_version"].close();
                    }                    
                }                
            }, 8000);

        },


        // ______________________________________________________________
        //                                              setUnitConnection
        /** 
        * setUnitConnection
        * @description Handle unit connectivity status
        * @fires EVENT_INDICATOR_UPDATE
        * @memberOf module:managers/connection-manager
        * @instance
        */
        setUnitConnection: function(state){
            var self = this;
            var message = window.oModel.jConfig.indicators.messages.unit;

            this.status.unit = state;

            if(state){
                message = "";
                $("main").removeClass(this.def.CLASS_DISABLE);
                $(this.ui.unitStatus).remove();
                $(this.ui.indicator + "[data-id='unit']").attr("data-status", "on");
            } else {
                $("main").addClass(this.def.CLASS_DISABLE);
                $(this.ui.indicator + "[data-id='unit']").attr("data-status", "off");

                if (window.oModel.jConfig.indicators.enableVerboseMessages){ 
                    if ($(self.ui.unitStatus).length === 0){
                        $("body").append( window.oDxpTemplates[this.def.TEMPLATE_LICENSE_WARNING](message) );
                    }
                }
            }

            window.tEvent.fire(window.tEvent.eventStr.EVENT_INDICATOR_UPDATE, {
                id: "unit",
                status: $(this.ui.indicator + "[data-id='unit']").attr("data-status")
            });


        },

        // ______________________________________________________________
        //                                      showInternetAccessWarning
        /** 
        * showInternetAccessWarning
        * @description Display internet access warning text
        * @fires EVENT_INDICATOR_UPDATE
        * @memberOf module:managers/connection-manager
        * @instance
        */
        showInternetAccessWarning: function(show){  

            var self = this;
            var message = window.oModel.jConfig.indicators.messages.internet;
            var lang = $("body").attr("data-lang");
            var modalMsg = window.oLang.jLangConfig.languageCopy.dxp_no_internet_modal[lang];

            if(typeof show === 'undefined' || typeof show === null){
                show = true;
            }

            this.status.internet = show;

            if(show){
                message = "";
                $(this.ui.internetStatus).remove();
                $(this.ui.indicator + "[data-id='internet']").attr("data-status", "on");

                if (typeof window.oModal.modals["no_internet"] !== "undefined") {
                    window.oModal.modals["no_internet"].close();
                }
            } else {
                $(this.ui.indicator + "[data-id='internet']").attr("data-status", "off");
                if (window.oModel.jConfig.indicators.enableVerboseMessages){
                    if ($(self.ui.internetStatus).length === 0){
                        $("body").append( window.oDxpTemplates[this.def.TEMPLATE_INTERNET_WARNING](message) );
                    }
                }

                if (typeof window.oModal.modals["no_internet"] === "undefined") {
                    window.oModal.load({
                        id: "no_internet",
                        content : "<div style='text-align: center;font-size: 27px;padding-top: 62px; font-weight:bold;'>" + modalMsg + "</div>",
                        modalSource: "primary",
                        close: false, 
                        css:
                        {
                            "width"      : "650px",
                            "height"     : "310px",
                            "margin-top" : "-200px"
                        } 
                    });                   
                }

            }

            window.tEvent.fire(window.tEvent.eventStr.EVENT_INDICATOR_UPDATE, {
                id: "internet",
                status: $(this.ui.indicator + "[data-id='internet']").attr("data-status")
            });


        },
        
        // ______________________________________________________________
        //                                               internetInterval
        /** 
        * internetInterval
        * @description Checks for internet service in intervals
        * @fires internetStatusCheck()
        * @memberOf module:managers/connection-manager
        * @instance
        */
        internetInterval: function(){            
            var prsonasConfig = window.oModel.jConfig.prsonas;            
            var self = this;

            clearInterval(this.internetCheckInterval);

            this.internetCheckInterval = setInterval(function() {
                self.internetStatusCheck();
            }, prsonasConfig.timers.internetStatusCheckInterval);

            self.internetStatusCheck();

        },

        // ______________________________________________________________
        //                                            internetStatusCheck
        /** 
        * internetStatusCheck
        * @description Checks the status of the internet
        * @fires showInternetAccessWarning()
        * @memberOf module:managers/connection-manager
        * @instance
        */
        internetStatusCheck: function() { 


            var self = this;

            this.oPrsonas.sdk.isOnLine(function(status){
                var isInternet = false;
                if (status.value === "Y"){
                    isInternet = true;
                }
                self.showInternetAccessWarning(isInternet);
            });

        }, 


        // ______________________________________________________________
        //                                                unitStatusCheck
        /** 
        * unitStatusCheck
        * @description Checks the connection status of the unit
        * @memberOf module:managers/connection-manager
        * @instance
        */
        unitStatusCheck: function() { 

            var unitStatus = this.oPrsonas.avatar.isConnected();
            this.setUnitConnection(unitStatus);

        }, 



        // ______________________________________________________________
        //                                               speechInterval
        /** 
        * speechInterval
        * @description Checks for speech in progress in intervals
        * @fires showSpeechAccessWarning()
        * @memberOf module:managers/connection-manager
        * @instance
        */
        speechInterval: function(){            
            var prsonasConfig = window.oModel.jConfig.prsonas;            
            var self = this;

            clearInterval(this.speechCheckInterval);

            this.speechCheckInterval = setInterval(function() {
                self.showSpeechAccessWarning();
            }, prsonasConfig.timers.speechStatusCheckInterval);

            self.showSpeechAccessWarning();

        },

        // ______________________________________________________________
        //                                        showSpeechAccessWarning
        /** 
        * showSpeechAccessWarning
        * @description Display speech state warning text
        * @fires EVENT_INDICATOR_UPDATE
        * @memberOf module:managers/connection-manager
        * @instance
        */
        showSpeechAccessWarning: function(){  

            var self = this;
            var message = window.oModel.jConfig.indicators.messages.speech;

            var show = this.status.speech = window.oPrsonas.avatar.isSpeaking();

            if(show){
                message = "";
                $(this.ui.speechStatus).remove();
                $(this.ui.indicator + "[data-id='speech']").attr("data-status", "on");
            } else {
                $(this.ui.indicator + "[data-id='speech']").attr("data-status", "off");

                if (window.oModel.jConfig.indicators.enableVerboseMessages){ 
                    if ($(self.ui.speechStatus).length === 0){
                        $("body").append( window.oDxpTemplates[this.def.TEMPLATE_SPEECH_WARNING](message) );
                    }
                }
            }

            window.tEvent.fire(window.tEvent.eventStr.EVENT_INDICATOR_UPDATE, {
                id: "speech",
                status: $(this.ui.indicator + "[data-id='speech']").attr("data-status")
            });

        },


        // ______________________________________________________________
        //                                    showMicrophoneAccessWarning
        /** 
        * showMicrophoneAccessWarning
        * @description Display microphone access warning text
        * @param {Boolean} show - Show or hide
        * @fires EVENT_INDICATOR_UPDATE
        * @memberOf module:managers/connection-manager
        * @instance
        */
        showMicrophoneAccessWarning: function(show){  
            var self = this;
            var message = window.oModel.jConfig.indicators.messages.microphone;

            if(typeof show === 'undefined' || typeof show === null){
                show = true;
            }

            this.status.microphone = show;

            if(show){
                message = "";
                $(this.ui.microphoneStatus).remove();
                $(this.ui.indicator + "[data-id='microphone']").attr("data-status", "on");
            } else {
                $(this.ui.indicator + "[data-id='microphone']").attr("data-status", "off");
                if (window.oModel.jConfig.indicators.enableVerboseMessages){ 
                    if ($(self.ui.microphoneStatus).length === 0){
                        $("body").append( window.oDxpTemplates[this.def.TEMPLATE_MICROPHONE_WARNING](message) );
                    } 
                }             
            }

            window.tEvent.fire(window.tEvent.eventStr.EVENT_INDICATOR_UPDATE, {
                id: "microphone",
                status: $(this.ui.indicator + "[data-id='microphone']").attr("data-status")
            });

        },

        // ______________________________________________________________
        //                                                 microphonePing
        /** 
        * showMicrophoneAccessWarning
        * @description Tests for microphone accessibility
        * @fires showMicrophoneAccessWarning()
        * @fires showSpeechAccessWarning()
        * @memberOf module:managers/connection-manager
        * @instance
        */
        microphonePing: function(){            
            var self = this;              
            var state = this.oPrsonas.avatar.isAvatarSpeaking;

            this.showMicrophoneAccessWarning(state);  
            this.showSpeechAccessWarning(state);   
        },

      
        // ______________________________________________________________
        //                                                 showIndicators
        /** 
        * showIndicators
        * @description Show icon indicators
        * @memberOf module:managers/connection-manager
        * @instance
        */
        showIndicators:function(){

            $("body").append( window.oDxpTemplates[this.def.TEMPLATE_ICON_INDICATORS]() );


            if (window.oModel.jConfig.indicators.showPersistantIndicators){
                $(this.ui.indicators).removeClass(this.def.CLASS_DISABLED);
            } else {
                $(this.ui.indicators).addClass(this.def.CLASS_DISABLED);
            }
        },
        

        // ______________________________________________________________
        //                                                      getStatus
        /** 
        * getStatus
        * @description Getter for status'
        * @param {String} id - ID for the status requested
        * @returns {Boolean} Status
        * @memberOf module:managers/connection-manager
        * @instance
        */
        getStatus:function(id){ 
            var status = -1;

            if (typeof this.status[id] !== "undefined"){
                status = this.status[id];
            }
            
            return status;
        },

        // --------------------------------------------------------------
        // EVENTS
        // --------------------------------------------------------------
        
        // ______________________________________________________________
        //                                             onToggleIndicators
        /** 
        * onToggleIndicators
        * @description Toggle icon indicator panel
        * @param {Boolean} show - Show or hide
        * @memberOf module:managers/connection-manager
        * @instance
        */
        onToggleIndicators:function(show){
            if ($(this.ui.indicators).hasClass(this.def.CLASS_DISABLED)){
                $(this.ui.indicators).removeClass(this.def.CLASS_DISABLED);
            } else {
                $(this.ui.indicators).addClass(this.def.CLASS_DISABLED);
            }
        },


        // ______________________________________________________________
        //                                               onStatusReceived
        onStatusReceived: function(data) {   
            
        },

        

        // ______________________________________________________________
        //                                                   onJsonLoaded
        /** 
        * onJsonLoaded
        * @description Got project JSON 
        * @fires showIndicators()
        * @fires internetStatusCheck()
        * @fires showMicrophoneAccessWarning()
        * @fires showVersionModal()
        * @memberOf module:managers/connection-manager
        * @instance
        */
        onJsonLoaded: function() {   
            var self = this;

            // set jConfig data
            this.jConfig = window.oModel.jConfig;

            this.showIndicators();

            this.internetInterval();
            this.unitStatusCheck();
            this.showMicrophoneAccessWarning(false);
            this.speechInterval();

            this.showVersionModal();
        }

    };

    /** 
    * @global 
    */
    window.oConnection = new Connection();
   
});