/*****************************************************************************
 * Open MCT Web, Copyright (c) 2014-2015, United States Government
 * as represented by the Administrator of the National Aeronautics and Space
 * Administration. All rights reserved.
 *
 * Open MCT Web is licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 * Open MCT Web includes source code licensed under additional open source
 * licenses. See the Open Source Licenses file (LICENSES.md) included with
 * this source code distribution or the Licensing information page available
 * at runtime from the About dialog for additional information.
 *****************************************************************************/
/*global define*/

define(
    [],
    function () {
        "use strict";

        var DEFAULT_MAXIMUM = 1000,
            DEFAULT_MINIMUM = 120;

        /**
         * Controller for the splitter in Browse mode. Current implementation
         * uses many hard-coded constants; this could be generalized.
         * @memberof platform/commonUI/general
         * @constructor
         */
        function SplitPaneController() {
            this.current = 200;
            this.start = 200;
            this.assigned = false;
        }

        /**
         * Get the current position of the splitter, in pixels
         * from the left edge.
         * @returns {number} position of the splitter, in pixels
         */
        SplitPaneController.prototype.state = function (defaultState) {
            // Set the state to the desired default, if we don't have a
            // "real" current state yet.
            if (arguments.length > 0 && !this.assigned) {
                this.current = defaultState;
                this.assigned = true;
            }
            return this.current;
        };

        /**
         * Begin moving the splitter; this will note the splitter's
         * current position, which is necessary for correct
         * interpretation of deltas provided by mct-drag.
         */
        SplitPaneController.prototype.startMove = function () {
            this.start = this.current;
        };

        /**
         * Move the splitter a number of pixels to the right
         * (negative numbers move the splitter to the left.)
         * This movement is relative to the position of the
         * splitter when startMove was last invoked.
         * @param {number} delta number of pixels to move
         */
        SplitPaneController.prototype.move = function (delta, minimum, maximum) {
            // Ensure defaults for minimum/maximum
            maximum = isNaN(maximum) ? DEFAULT_MAXIMUM : maximum;
            minimum = isNaN(minimum) ? DEFAULT_MINIMUM : minimum;

            // Update current splitter state
            this.current = Math.min(
                maximum,
                Math.max(minimum, this.start + delta)
            );
        };

        return SplitPaneController;
    }
);
