/**
* @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();
});