/* <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> */

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

//var snapManager = ("js/helper-classes/3D/snap-manager").SnapManager;

exports.toolBase = Montage.create(Component, {
    options: { value: null },

    /**
     * This property will make the stageManager return null when false
     * or the Stage / PasteBoard when true
     */
    _canOperateOnStage: { value: false },

    _downPoint: { value: { "x": null, "y": null } },
    _upPoint:   { value: { "x": null, "y": null } },

    downPoint: {
        get: function() { return this._downPoint; },
        set: function(value) { this._downPoint = value; }
    },

    upPoint: {
        get: function() { return this._upPoint; },
        set: function(value) { this._upPoint = value; }
    },

    // Need to keep track of current mouse position for KEY modifiers event which do not have mouse coordinates.
    _currentX: {value: 0, writable: true},
    _currentY: {value: 0, writable: true},

    /**
     * This function is for specifying custom feedback routine
     * upon mouse over.
     * For example, the drawing tools will add a glow when mousing
     * over existing canvas elements to signal to the user that
     * the drawing operation will act on the targeted canvas.
     */
    _showFeedbackOnMouseMove : { value: null },

    _canDraw:   { value: true },
    _isDrawing: { value: false },
    _hasDraw:   { value: false },
    _isSpace:   { value: false },
    _escape:    { value: false },


    HandleLeftButtonUp:     { value : function () {} },
    HandleRightButtonDown:  { value : function () {} },
    HandleRightButtonUp:    { value : function () {} },
    HandleMouseMove:        { value : function () {} },

    HandleKeyPress:     { value : function () {} },
    HandleKeyUp:        { value : function () {} },
    HandleDoubleClick:  { value : function () {} },
    HandleShiftKeyDown: { value : function () {} },
    HandleShiftKeyUp:   { value : function () {} },
    HandleAltKeyDown:   { value : function () {} },
    HandleAltKeyUp:     { value : function () {} },
    
    HandleSpaceDown:    { value: function() { this._isSpace = true; } },
    HandleSpaceUp:      { value: function() { this._isSpace = false; } },

    HandleEscape:       { value: function(event) {} },

    /**
     *  If wasSelected, configure the tool by:
     *  2) adding custom feedback
     *  3) drawing handles
     *  If wasSelected is false, clean up after the tool by:
     *  1) removing custom feedback
     */
    _configure: {
        value: function(selected) {
            this.Configure(selected);
        }
    },

    Configure: { value: function (wasSelected) {} },

    doSelection: {
        value: function(event) {

            if(this._canOperateOnStage) {
                if(event.shiftKey) {
                    this.application.ninja.selectionController.shiftSelectElement(this.application.ninja.stage.GetElement(event));
                } else {
                    this.application.ninja.selectionController.selectElement(this.application.ninja.stage.GetElement(event));
                }
            }

            // TODO - Code used to know if this is a GL Canvas container --> Move this to the selectionManager?
            /*
            if(selectedObject.Ninja && selectedObject.Ninja.GLWorld) {
                selectedObject.Ninja.GLWorld.getShapeFromPoint(event.layerX - selectedObject.left, event.layerY - selectedObject.top);
            }
            */

        }
    },

    zoomIn:{
        value:function(event){
            var upperBoundary ,previousZoomValue;

            previousZoomValue = this.application.Ninja._documentBarRef.zoomFactor ;
            upperBoundary = previousZoomValue *1.2 ;
            
            if(upperBoundary > 2000)
                this.application.Ninja._documentBarRef.zoomFactor = 2000;
            else
                this.application.Ninja._documentBarRef.zoomFactor*= 1.2;

        }
    },

    zoomOut:{
        value:function(){
            var lowerBoundary ,previousZoomValue;
            
            previousZoomValue = this.application.Ninja._documentBarRef.zoomFactor ;
            lowerBoundary = previousZoomValue/1.2 ;

            if(lowerBoundary < 25)
                this.application.Ninja._documentBarRef.zoomFactor = 25;
            else
                this.application.Ninja._documentBarRef.zoomFactor/= 1.2;
        }
    },

    UpdateSelection: {
        value : function (shouldDispatchEvent) {
            if(shouldDispatchEvent) {
//                documentControllerModule.DocumentController.DispatchElementChangedEvent(selectionManagerModule.selectionManager.selectedItems, []);
            } else {
//                if(!selectionManagerModule.selectionManager.isDocument) {
//                    stageManagerModule.stageManager.drawSelectionRec(true);
//                    drawLayoutModule.drawLayout.redrawDocument();
//                }
//                else
//                {
//                    stageManagerModule.stageManager.drawSelectionRec(true);
//                    drawLayoutModule.drawLayout.redrawDocument();
//                }
            }

//            if (drawUtils.isDrawingGrid())
//            {
//			    snapManager.updateWorkingPlaneFromView();
//            }
        }
    },

    // Should be an array of handles for each tool.
    // The array should contain ToolHandle objects that define
    // dimensions, cursor, functionality
    // For example, the Selection Tool holds the 8 resize handles in this order because this
    // is the order we retrieve a rectangle's points using viewUtils:
    // 0  7  6
    // 1     5
    // 2  3  4
    _handles: {
        value:null,
        writable: true
    },

//    InitHandles: {
//        value: function () {
//            this.DrawHandles();
//        }
//    },

    // Used for figuring what the tool should do.
    // For example, if the handle mode is 5, the tool should resize the element to the right
    _handleMode: {
        value:null,
        writable: true
    },

    DrawHandles: {
        value: function () {
            // Tool should override this method if it implements handles
        }
    }

});