/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */

// The following class is responsible for listening for keydown events.

var Montage = require("montage/core/core").Montage;
var Component = require("montage/ui/component").Component;

// Put the keyboard constants in the global scope.
var Keyboard = exports.Keyboard = {
    BACKSPACE:8,
    TAB:9,
    ENTER:13,
    SHIFT:16,
    ALT:18,
    DELETE:46,
    LEFT:37,
    UP:38,
    RIGHT:39,
    DOWN:40,
    ESCAPE: 27,
    SPACE: 32,

    A:65,
    B:66,
    C:67,
    D:68,
    E:69,
    F:70,
    G:71,
    H:72,
    I:73,
    J:74,
    K:75,
    L:76,
    M:77,
    N:78,
    O:79,
    P:80,
    Q:81,
    R:82,
    S:83,
    T:84,
    U:85,
    V:86,
    W:87,
    X:88,
    Y:89,
    Z:90,
    PLUS:187,
    MINUS:189
};

exports.KeyboardMediator = Montage.create(Component, {

    deserializedFromTemplate: {
        value: function() {
            this.eventManager.addEventListener("appLoaded", this, false);
        }
    },

    handleAppLoaded: {
        value: function() {
            document.addEventListener("keydown", this, false);
            document.addEventListener("keyup", this, false);

            this.addEventListener("change@appModel.livePreview", this.handleLivePreview, false);
        }
    },

    handleLivePreview: {
        value: function() {
            if(this.appModel.livePreview) {
                document.removeEventListener("keydown", this, false);
                document.removeEventListener("keyup", this, false);
            } else {
                document.addEventListener("keydown", this, false);
                document.addEventListener("keyup", this, false);
            }
        }
    },

    handleKeydown: {
        value: function(evt) {

            //keyboard controls for html design view
            if((!!this.application.ninja.documentController.activeDocument) && (this.application.ninja.documentController.activeDocument.currentView === "design")){

                // Don't do anything if an input or other control is focused
                if(document.activeElement.nodeName !== "BODY") {
                    return;
                }

                // Disable defaults for the Arrow Keys
                if((evt.keyCode == Keyboard.LEFT) || (evt.keyCode == Keyboard.RIGHT) || (evt.keyCode == Keyboard.UP) || (evt.keyCode == Keyboard.DOWN)) {
                    evt.preventDefault();
                }

                // Check DELETE OR BACKSPACE
                if((evt.keyCode == Keyboard.BACKSPACE) || (evt.keyCode == Keyboard.DELETE)) {
                    evt.stopImmediatePropagation();
                    evt.preventDefault();
                    NJevent("deleting");
                    return;
                }


                // Shortcut for Selection Tool is V
                if(evt.keyCode === Keyboard.V) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[0]});
                    return;
                }

                // Shortcut for Tag Tool is D
                if(evt.keyCode === Keyboard.D){
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[4]});
                    return;
                }

                // Shortcut for Rotate Tool is W
                if(evt.keyCode === Keyboard.W){
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[2]});
                    return;
                }

                // Shortcut for Translate Tool is G
                if(evt.keyCode === Keyboard.G){
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[3]});
                    return;
                }

                // shortcut for Pen tool is P
                if (evt.keyCode === Keyboard.P){
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[5]});
                    return;
                }

                // Shortcut for Rectangle Tool is R
                // unless the user is pressing the command key.
                // If the user is pressing the command key, they want to refresh the browser.
                if((evt.keyCode === Keyboard.R) && !evt.metaKey) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[7]});
                    this.application.ninja.handleSelectSubTool({"detail": this.application.ninja.toolsData.defaultToolsData[7].subtools[1]});
                    return;
                }

                // Shortcut for Oval Tool is O
                if(evt.keyCode === Keyboard.O) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[7]});
                    this.application.ninja.handleSelectSubTool({"detail": this.application.ninja.toolsData.defaultToolsData[7].subtools[0]});
                    return;
                }

                // Shortcut for Line Tool is L
                if(evt.keyCode === Keyboard.L ) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[7]});
                    this.application.ninja.handleSelectSubTool({"detail": this.application.ninja.toolsData.defaultToolsData[7].subtools[2]});
                    return;
                }

                // Rotate Stage Tool is M
                if(evt.keyCode === Keyboard.M ) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[13]});
                    return;
                }

                // Hand tool
                if(evt.keyCode === Keyboard.H ) {
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[14]});
                    return;
                }

                // Zoom tool
                if((evt.keyCode === Keyboard.Z) && !(evt.ctrlKey || evt.metaKey) && !evt.shiftKey) {//ctrl or shift key not press with Z
                    evt.preventDefault();
                    this.application.ninja.handleSelectTool({"detail": this.application.ninja.toolsData.defaultToolsData[15]});
                    return;
                }

                // Check if cmd+a/ctrl+a for Select All
                if((evt.keyCode == Keyboard.A) && (evt.ctrlKey || evt.metaKey)) {
                    NJevent("selectAll");
                    return;
                }

                if(evt.keyCode === Keyboard.ESCAPE){//ESC key
                    //console.log("ESC key pressed");
                    if(this.application.ninja.toolsData) this.application.ninja.toolsData.selectedToolInstance.HandleEscape(evt);
                    //menuViewManagerModule.MenuViewManager.closeMenu("mainMenuBar");
                }


                if((evt.keyCode == Keyboard.ENTER) && (evt.ctrlKey || evt.metaKey)) {
                    this.application.ninja.executeChromePreview();
                    return;
                }

                if(this.application.ninja.toolsData) this.application.ninja.toolsData.selectedToolInstance.HandleKeyPress(evt);

            }

            // Check if cmd+z/ctrl+z for Undo (Windows/Mac)
            if ((evt.keyCode == Keyboard.Z) && (evt.ctrlKey || evt.metaKey) && !evt.shiftKey) {
                NJevent("executeUndo");
                //menuViewManagerModule.MenuViewManager.closeMenu("mainMenuBar");
                return;
            }

            // Check if cmd+s/ctrl+s for Save (Windows/Mac)
            if ((evt.keyCode == Keyboard.S) && (evt.ctrlKey || evt.metaKey) && !evt.shiftKey) {
                try{
                    NJevent("executeSave");
                }
                catch(e){
                    console.warn("Unable to save");
                    console.log(e.stack);
                }
                evt.preventDefault();
                return;
            }

            // Check if cmd+shift+z for Redo (Mac)
            if ((evt.keyCode == Keyboard.Z) && evt.metaKey && evt.shiftKey) {
                NJevent("executeRedo");
                //menuViewManagerModule.MenuViewManager.closeMenu("mainMenuBar");
                return;
            }

            // Check if ctrl+y for Redo (Windows)
            if ((evt.keyCode == Keyboard.Y) && evt.ctrlKey) {
                NJevent("executeRedo");
                //menuViewManagerModule.MenuViewManager.closeMenu("mainMenuBar");
                return;
            }


        }
    },

    handleKeyup: {
        value: function(evt) {
             //keyboard controls for html design view
            if((!!this.application.ninja.documentController.activeDocument) && (this.application.ninja.documentController.activeDocument.currentView === "design")){
                if(document.activeElement.nodeName !== "BODY") {
                    // Don't do anything if an input or other control is focused
                    return;
                }

                if(this.application.ninja.toolsData) this.application.ninja.toolsData.selectedToolInstance.HandleKeyUp(evt);
            }
        }
    },
    
    _handleKeydown: {
        value: function(evt) {

            // Check if cmd-shift-+/ctrl-shift-+ for toggling snapping
            if(evt.shiftKey && (evt.ctrlKey || evt.metaKey) && (evt.keyCode === 187))
            {
                MainMenuModule.MenuActionManager.toggleSnapping("snap", !DocumentManagerModule.DocumentManager.activeDocument.snapping);
                evt.preventDefault();
                return;
            }

            if(evt.keyCode === Keyboard.PLUS && (evt.metaKey||evt.ctrlKey)) {
                evt.preventDefault();
                this._toolsList.action("zoomIn", evt);
                return;
            }

           if(evt.keyCode === Keyboard.MINUS && (evt.metaKey || evt.ctrlKey)) {
                evt.preventDefault();
                this._toolsList.action("zoomOut", evt);
                return;
            }

         }
    }
});