/**
* @module managers/admin-manager
* @description This module manages the Admin modal.
* @requires common/view
* @requires common/model
* @requires managers/template-manager
* @requires managers/admin/adminDebugger
* @requires managers/prsonas-manager
* @requires jHammer
* @requires slider
* @requires managers/language-manager
*/
define([
"common/view",
"common/model",
"managers/template-manager",
"managers/admin/adminDebugger",
"managers/prsonas-manager",
"jHammer",
"slider",
"managers/language-manager"
],
function (view, model, template, AdminDebugger, prsonasManager)
{
// ---------------------------------------------------------------
//
// PStyles Manager
//
// ---------------------------------------------------------------
var Admin = function ()
{
console.log(" * <admin>");
window.tEvent.eventStr.EVENT_ADMIN_GOT_MANIFEST = "EVENT_ADMIN_GOT_MANIFEST";
window.tEvent.eventStr.EVENT_ADMIN_LOGIN_SUBMIT = "EVENT_ADMIN_LOGIN_SUBMIT";
window.tEvent.eventStr.EVENT_ADMIN = "EVENT_ADMIN";
this.oView = view;
this.oModel = model;
this.oDxpTemplates = template;
this.oAdminDebugger = AdminDebugger;
this.oPrsonas = prsonasManager;
this.ui = {
pageClass : ".js-admin-panel",
triggerBtn : ".js-admin-trigger",
keypad : ".js-admin-keypad",
passwordInput : ".admin-panel__login .js-form-input",
errorMessage : ".admin-panel__login .js-input-error",
inputSliders : ".admin-panel__page .js-input-slider",
saveCharacter : ".js-admin-char-save",
resetCharacter : ".js-admin-char-reset",
nextStepBtn : ".js-next-step",
prevStepBtn : ".js-prev-step",
checkbox : ".js-admin-checkbox",
cameraControlBtn : ".js-admin-camera-control",
multiplierInput : ".js-admin-multiplier",
licenseStatus : ".js-license-status",
loginSubmit : ".js-btn-submit",
camBtn : ".js-admin-cam-btn",
adminContainer : ".js-admin-panel-container",
adminTabs : ".js-admin-tabs",
adminTab : ".js-admin-tab",
adminBtn : ".js-admin-btn",
minimizeBtn : ".js-minimize",
maxModal : ".js-max-modal",
closeModal : ".js-close-modal"
};
this.def = {
TEMPLATE_ID : "m-admin-core",
TEMPLATE_PAGE_ID : "m-admin-core_",
TEMPLATE_DEBUGGER : "m-admin-debugger",
CLASS_ACTIVE : "is-active",
CLASS_DISABLE : "is-disabled",
CLASS_INCOMPLETE : "is-incomplete",
CLASS_ERROR : "is-error",
CLASS_MINIMIZED : "is-minimized",
PAGE_CAMERA : "2",
PAGE_AUDIO : "1",
PAGE_CHAR : "3",
PAGE_DEBUGGER_PRSONAS : "debugger-prsonas",
PAGE_DEBUGGER_EMAIL : "debugger-email",
PAGE_DEBUGGER_SONAR : "debugger-sonar",
PAGE_DEBUGGER_INFO : "debugger-info",
MODAL_DEBUGGER : "m-admin-debugger",
MODAL_CORE : "m-admin-core",
TEMPLATE_LICENSE_WARNING : "partial-license-warning"
};
this.manifest = -1;
this.testMode = -1;
this.config = {
multiplier: 1
};
this.init();
};
Admin.prototype =
{
// ______________________________________________________________
// init
/**
* init
* @description Initializes class
* @fires assignListeners()
* @memberOf module:managers/admin-manager
* @instance
*/
init: function()
{
this.oAdminDebugger = new this.oAdminDebugger(this);
this.assignListeners();
},
// ______________________________________________________________
// assignListeners
/**
* assignListeners
* @description Assigns listeners to events used in this class.
* @memberOf module:managers/admin-manager
* @instance
*/
assignListeners: function()
{
var self = this;
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();
}
// admin trigger
var adminTriggerCount = 0;
var adminTriggerTimeout;
$(this.ui.triggerBtn).hammer().on("click", function(evt){
adminTriggerCount++;
clearTimeout(adminTriggerTimeout);
adminTriggerTimeout = setTimeout(function(){ adminTriggerCount = 0; }, 1500);
console.log(" * <admin> trigger tap #" + adminTriggerCount);
if (adminTriggerCount > 4){
adminTriggerCount = 0;
if ($("#error-panel").css("display") === "block"){
self.setState(false);
console.log(" * <admin> trigger turning admin off");
clearTimeout(adminTriggerTimeout);
} else {
if ($(self.ui.licenseStatus).length === 0){
self.setState(true);
}
console.log(" * <admin> trigger turning admin on");
clearTimeout(adminTriggerTimeout);
}
}
});
// keypad click
$("body").hammer().on("click", this.ui.keypad,function(evt){
var $target = $(evt.target);
var key = $target.attr("data-id");
self.onKeypadClick(key);
});
// reset character
$("body").hammer().on("click", this.ui.resetCharacter,function(evt){
self.onResetCharacter();
});
// next step
$("body").hammer().on("click", this.ui.nextStepBtn,function(evt){
var $target = $(evt.target);
var id = $target.attr("data-id");
self.onNextStep(id);
});
// prev step
$("body").hammer().on("click", this.ui.prevStepBtn,function(evt){
var $target = $(evt.target);
var id = $target.attr("data-id");
self.onPrevStep(id);
});
// checkboxes
$("body").hammer().on("click", this.ui.checkbox,function(evt){
var $target = $(evt.target);
var id = $target.attr("data-id");
var checkState = $target.prop("checked");
if (id !== "test-mode"){
self.onCheckboxUpdate(id, checkState);
}
});
$("body").hammer().on("click", this.ui.pageClass + " " + this.ui.loginSubmit, function(evt){
self.onLoginSubmit();
});
// camera control btn
$("body").hammer().on("click", this.ui.cameraControlBtn,function(evt){
var $target = $(evt.target);
var id = $target.attr("data-id");
self.onCameraControlBtn(id);
});
$("body").hammer().on("click", this.ui.camBtn,function(evt){
var $target = $(evt.target);
var id = $target.attr("data-id");
self.onCamerBtn(id);
});
// tab
$("body").hammer().on("click", this.ui.adminTab,function(evt){
var id = $(this).attr("data-id");
self.onClickTab(id);
});
// btn
$("body").hammer().on("click", this.ui.adminBtn,function(evt){
var id = $(this).attr("data-id");
self.onClickBtn($(this), id);
});
// login submit
window.tEvent.addListener(window.tEvent.eventStr.EVENT_ADMIN_LOGIN_SUBMIT, function(evt, data) {
self.onLoginSubmit();
});
// login submit
window.tEvent.addListener(window.tEvent.eventStr.EVENT_ADMIN, function(evt, data) {
if ($(self.ui.licenseStatus).length === 0){
self.setState(true);
} else {
window.oModal.load({
id: "admin-error",
content : "<div style='text-align: center;font-size: 27px;padding-top: 90px;font-style: italic;'><p>Admin access requires the manifest.</p><p>No manifest found.</p></div>",
modalSource: "primary",
css:
{
"width" : "460px",
"height" : "390px",
"margin-top" : "-200px"
}
});
}
});
// minimize
$("body").hammer().on("click", this.ui.minimizeBtn,function(evt){
self.onMinimize();
});
// close Modal
$("body").hammer().on("click", this.ui.closeModal,function(evt){
self.onMinModalControl("close");
});
// max Modal
$("body").hammer().on("click", this.ui.maxModal,function(evt){
self.onMinModalControl("max");
});
},
// --------------------------------------------------------------
// HELPERS
// --------------------------------------------------------------
/**
* setState
* @param {Boolean} state - On/Off
* @descriptionTurn on or off admin
* @memberOf module:managers/admin-manager
* @instance
*/
setState: function(state) {
this.killMinimizer();
if (state) {
window.oModal.load({
id : this.def.TEMPLATE_ID,
modalSource : "alt",
content : window.oDxpTemplates[this.def.TEMPLATE_ID](),
backdrop : 'static',
css : {
width : "90%",
height : "90%",
"margin-top" : "0px"
}
});
} else {
this.ui.$container.css("display", "none");
}
},
// ______________________________________________________________
// getManifest
/**
* getManifest
* @param {Function} callback - Callback
* @description Loads the SDK manifest
* @fires onGotManifest()
* @memberOf module:managers/admin-manager
* @instance
*/
getManifest: function(callback) {
var self = this;
this.oPrsonas.avatar.getManifest(function(data){
self.onGotManifest(data);
});
this.oPrsonas.sdk.subscribe(this.oPrsonas.avatar.eventTypes["GET_MANIFEST"], function(evt) {
self.onGotManifest(data);
});
},
// ______________________________________________________________
// initSliders
/**
* initSliders
* @description Initializes admin slider controls
* @fires updateManifest()
* @memberOf module:managers/admin-manager
* @instance
*/
initSliders: function() {
var self = this;
var finalVal;
$(this.ui.inputSliders).each(function(){
$(this).slider().on("slide", function(ev){
// update interface value
var command = $(ev.target).attr("data-command");
var id = $(ev.target).attr("data-id");
var divideBy = $(ev.target).attr("data-divide-by");
$(".js-" + id + "--val").html(ev.value);
finalVal = Number(ev.value);
// divide num if applicable
if (typeof divideBy !== "undefined"){
finalVal = finalVal / Number(divideBy);
}
// update manifest value
self.updateManifest(command + id, finalVal);
});
});
},
// ______________________________________________________________
// updateManifest
/**
* updateManifest
* @description Updates manifest
* @param {String} id - ID of property to updated
* @param {String} value - value of property to updated
* @fires oPrsonas.sendKey()
* @memberOf module:managers/admin-manager
* @instance
*/
updateManifest: function(id, value) {
window.oPrsonas.sendKey(id + ":" + value, true);
},
// ______________________________________________________________
// killMinimizer
/**
* killMinimizer
* @description Kills admin minified state
* @memberOf module:managers/admin-manager
* @instance
*/
killMinimizer: function() {
$("#modal-alt").removeClass(this.def.CLASS_MINIMIZED);
$(".js-min-modal").remove();
},
// --------------------------------------------------------------
// EVENTS
// --------------------------------------------------------------
// ______________________________________________________________
// onGotManifest
/**
* onGotManifest
* @description Got the SDK manifest
* @param {JSON} manifest - SDK Manifest JSON
* @fires EVENT_ADMIN_GOT_MANIFEST
* @memberOf module:managers/admin-manager
* @instance
*/
onGotManifest: function(manifest) {
var self = this;
if (manifest.value === "Y") {
this.manifest = JSON.parse(manifest.manifest);
window.tEvent.fire(window.tEvent.eventStr.EVENT_ADMIN_GOT_MANIFEST, this.manifest);
}
},
// ______________________________________________________________
// onMinimize
/**
* onMinimize
* @description Sets admin minified state
* @memberOf module:managers/admin-manager
* @instance
*/
onMinimize: function() {
$("body").append(window.oDxpTemplates.minimize_modal());
$("#modal-alt").addClass(this.def.CLASS_MINIMIZED);
},
// ______________________________________________________________
// onMinModalControl
/**
* onMinModalControl
* @description Minified controller
* @param {String} action - [close, max]
* @memberOf module:managers/admin-manager
* @instance
*/
onMinModalControl: function(action) {
var modalInstance;
this.killMinimizer();
switch(action){
case "close":
window.oModal.close(true);
break;
case "max":
// fix positioning bug
if (typeof window.oModal.modals[this.def.MODAL_DEBUGGER] !== "undefined"){
modalInstance = window.oModal.modals[this.def.MODAL_DEBUGGER];
}
if (typeof window.oModal.modals[this.def.MODAL_CORE] !== "undefined"){
modalInstance = window.oModal.modals[this.def.MODAL_CORE];
}
modalInstance.positionModal();
break;
}
},
// ______________________________________________________________
// onCamerBtn
onCamerBtn: function(id) {
console.log(" * <admin.onCamerBtn> ", id);
},
// ______________________________________________________________
// onCameraControlBtn
/**
* onCameraControlBtn
* @description Value modifier controller
* @param {String} id - [DecreaseModifier, IncreaseModifier]
* @fires oPrsonas.sendKey()
* @memberOf module:managers/admin-manager
* @instance
*/
onCameraControlBtn: function(id) {
console.log(" * <admin.onCameraControlBtn> ", id);
switch(id){
case "DecreaseModifier":
var val = Number($(this.ui.multiplierInput).text());
val--;
if (val < 1){
return;
}
$(this.ui.multiplierInput).html(val);
break;
case "IncreaseModifier":
var val = Number($(this.ui.multiplierInput).text());
val++;
$(this.ui.multiplierInput).html(val);
break;
}
// store it
this.config.multiplier = val;
window.oPrsonas.sendKey("CAMERA=" + id, true);
},
// ______________________________________________________________
// onQuitApp
/**
* onQuitApp
* @description Quits application
* @fires oPrsonas.app.close()
* @memberOf module:managers/admin-manager
* @instance
*/
onQuitApp: function() {
console.log(" * <admin.onQuitApp> ");
window.oPrsonas.app.close(true);
},
// ______________________________________________________________
// onCheckboxUpdate
onCheckboxUpdate: function(id, state) {
console.log(" * <admin.onCheckboxUpdate> " + id + ": " + state);
},
// ______________________________________________________________
// onNextStep
onNextStep: function(id) {
console.log(" * <admin.onNextStep> " + id);
},
// ______________________________________________________________
// onPrevStep
onPrevStep: function(id) {
console.log(" * <admin.onPrevStep> " + id);
},
// ______________________________________________________________
// onResetCharacter
/**
* onResetCharacter
* @description Resets avatar prior to saved updates
* @fires oPrsonas.sendKey()
* @memberOf module:managers/admin-manager
* @instance
*/
onResetCharacter: function() {
console.log(" * <admin.onResetCharacter> ");
window.oPrsonas.sendKey("SCENE=RESETCHARACTER", true);
},
// ______________________________________________________________
// onSaveCharacter
/**
* onSaveCharacter
* @description Saves avatar changes
* @fires oPrsonas.sendKey()
* @memberOf module:managers/admin-manager
* @instance
*/
onSaveCharacter: function() {
console.log(" * <admin.onSaveCharacter> ");
window.oPrsonas.sendKey("SCENE=SAVECHARACTER");
},
// ______________________________________________________________
// onJsonLoaded
/**
* onJsonLoaded
* @description Project JSON is loaded
* @fires getManifest()
* @memberOf module:managers/admin-manager
* @instance
*/
onJsonLoaded: function() {
var self = this;
this.getManifest();
},
// ______________________________________________________________
// onKeypadClick
/**
* onKeypadClick
* @description Handles admin keypad interaction
* @memberOf module:managers/admin-manager
* @instance
*/
onKeypadClick: function(key) {
$(this.ui.errorMessage).css("display", "none");
var inputVal = $(this.ui.passwordInput).val();
if (key === "X"){
$(this.ui.passwordInput).val(inputVal.slice(0, -1));
} else {
$(this.ui.passwordInput).val(inputVal + key);
}
},
// ______________________________________________________________
// onPageLoad
/**
* onPageLoad
* @description Displays admin
* @param {String} pageNum - Page number
* @param {Object} xtraData - Additional data for template
* @memberOf module:managers/admin-manager
* @instance
*/
onPageLoad: function(pageNum, xtraData) {
var self = this;
var templateObj = window.helpers.clone(self.manifest);
templateObj._config = this.config;
templateObj._jConfig = window.oModel.jConfig;
// xtra data
if (typeof xtraData === "undefined"){
xtraData = {};
}
templateObj._xtra = xtraData;
$(self.ui.adminContainer).html( window.oDxpTemplates[self.def.TEMPLATE_PAGE_ID + pageNum](templateObj) );
},
// ______________________________________________________________
// onLoginSubmit
/**
* onLoginSubmit
* @description Login submission
* @param {String} key - Key press
* @memberOf module:managers/admin-manager
* @instance
*/
onLoginSubmit: function(key) {
var inputVal = $(this.ui.passwordInput).val();
$(this.ui.errorMessage).css("display", "none");
console.log(" * <admin.onLoginSubmit> " + inputVal);
if (inputVal === window.oModel.jConfig.prsonas.adminPassword){
$(this.ui.adminTabs).removeClass(this.def.CLASS_DISABLE);
this.onPageLoad(this.def.PAGE_AUDIO);
} else {
$(this.ui.errorMessage).css("display", "block");
}
},
// ______________________________________________________________
// onClickTab
/**
* onClickTab
* @description Handles admin tab selection
* @memberOf module:managers/admin-manager
* @instance
*/
onClickTab: function(id) {
var self = this;
// go to selected tab
switch(id){
case "camera":
self.onPageLoad(self.def.PAGE_CAMERA);
break;
case "email":
self.onPageLoad(self.def.PAGE_DEBUGGER_EMAIL, {
testMode: self.testMode
});
break;
case "prsonas":
self.onPageLoad(self.def.PAGE_DEBUGGER_PRSONAS);
break;
case "info":
self.onPageLoad(self.def.PAGE_DEBUGGER_INFO, this.oAdminDebugger.savedValues);
break;
}
//set active state
$(this.ui.adminTab).each(function(){
$(this).removeClass(self.def.CLASS_ACTIVE);
});
$(this.ui.adminTab + "[data-id='" + id + "']").addClass(self.def.CLASS_ACTIVE);
},
// ______________________________________________________________
// onClickBtn
/**
* onClickBtn
* @description Handles admin main button clicks
* @param {JqueryObject} $target - Jquery object of button pressed
* @param {String} id - ID of button clicked
* @memberOf module:managers/admin-manager
* @instance
*/
onClickBtn: function($target, id) {
switch(id){
case "comms":
this.oAdminDebugger.onOpenDebugger();
break;
case "console":
window.oDebugger.setState(true);
break;
case "quit":
this.onQuitApp();
break;
case "unit":
this.setState(true);
$(this.ui.adminTabs).removeClass(this.def.CLASS_DISABLE);
this.onPageLoad("1");
break;
}
}
};
/**
* @global
*/
var oAdmin = new Admin();
return (oAdmin);
});