Source: managers/admin-manager.js

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