/*global define*/

/**
 * Plot palette. Defines colors for various plot lines.
 */
define(
    function () {
        'use strict';

        // Prepare different forms of the palette, since we wish to
        // describe colors in several ways (as RGB 0-255, as
        // RGB 0.0-1.0, or as stylesheet-appropriate #-prefixed colors).
        var integerPalette = [
            [ 0x20, 0xB2, 0xAA ],
            [ 0x9A, 0xCD, 0x32 ],
            [ 0xFF, 0x8C, 0x00 ],
            [ 0xD2, 0xB4, 0x8C ],
            [ 0x40, 0xE0, 0xD0 ],
            [ 0x41, 0x69, 0xFF ],
            [ 0xFF, 0xD7, 0x00 ],
            [ 0x6A, 0x5A, 0xCD ],
            [ 0xEE, 0x82, 0xEE ],
            [ 0xCC, 0x99, 0x66 ],
            [ 0x99, 0xCC, 0xCC ],
            [ 0x66, 0xCC, 0x33 ],
            [ 0xFF, 0xCC, 0x00 ],
            [ 0xFF, 0x66, 0x33 ],
            [ 0xCC, 0x66, 0xFF ],
            [ 0xFF, 0x00, 0x66 ],
            [ 0xFF, 0xFF, 0x00 ],
            [ 0x80, 0x00, 0x80 ],
            [ 0x00, 0x86, 0x8B ],
            [ 0x00, 0x8A, 0x00 ],
            [ 0xFF, 0x00, 0x00 ],
            [ 0x00, 0x00, 0xFF ],
            [ 0xF5, 0xDE, 0xB3 ],
            [ 0xBC, 0x8F, 0x8F ],
            [ 0x46, 0x82, 0xB4 ],
            [ 0xFF, 0xAF, 0xAF ],
            [ 0x43, 0xCD, 0x80 ],
            [ 0xCD, 0xC1, 0xC5 ],
            [ 0xA0, 0x52, 0x2D ],
            [ 0x64, 0x95, 0xED ]
        ], stringPalette = integerPalette.map(function (arr) {
            // Convert to # notation for use in styles
            return '#' + arr.map(function (c) {
                return (c < 16 ? '0' : '') + c.toString(16);
            }).join('');
        }), floatPalette = integerPalette.map(function (arr) {
            return arr.map(function (c) {
                return c / 255.0;
            }).concat([1]); // RGBA
        });

        /**
         * PlotPalette allows a consistent set of colors to be retrieved
         * by index, in various color formats. All PlotPalette methods are
         * static, so there is no need for a constructor call; using
         * this will simply return PlotPalette itself.
         * @constructor
         */
        function PlotPalette() {
            return PlotPalette;
        }

        /**
         * Look up a color in the plot's palette, by index.
         * This will be returned as a three element array of RGB
         * values, as integers in the range of 0-255.
         * @param {number} i the index of the color to look up
         * @return {number[]} the color, as integer RGB values
         */
        PlotPalette.getIntegerColor = function (i) {
            return integerPalette[Math.floor(i) % integerPalette.length];
        };


        /**
         * Look up a color in the plot's palette, by index.
         * This will be returned as a three element array of RGB
         * values, in the range of 0.0-1.0.
         *
         * This format is present specifically to support use with
         * WebGL, which expects colors of that form.
         *
         * @param {number} i the index of the color to look up
         * @return {number[]} the color, as floating-point RGB values
         */
        PlotPalette.getFloatColor = function (i) {
            return floatPalette[Math.floor(i) % floatPalette.length];
        };


        /**
         * Look up a color in the plot's palette, by index.
         * This will be returned as a string using #-prefixed
         * six-digit RGB hex notation (e.g. #FF0000)
         * See http://www.w3.org/TR/css3-color/#rgb-color.
         *
         * This format is useful for representing colors in in-line
         * styles.
         *
         * @param {number} i the index of the color to look up
         * @return {string} the color, as a style-friendly string
         */
        PlotPalette.getStringColor = function (i) {
            return stringPalette[Math.floor(i) % stringPalette.length];
        };

        return PlotPalette;

    }
);