// cColorTable
// creates a dynamic color table

function cColorTable()
{
    // members
    var m_colorTable;
    var m_colorRed;
    var m_colorBlue;
    var m_colorGreen;
    var m_maxNumberOfColors = 0;
    var m_numberOfColors = 0;
    
    // declarations
    this.Init = Init;
    this.GetColor = GetColor;
    this.AddColor = AddColor;
    this.ToHex = ToHex;
    this.AddRadiantTo = AddRadiantTo;
    this.GetColorTable = GetColorTable;

    // methods
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function Init(_numOfColors)
    {
        m_maxNumberOfColors =_numOfColors;
        m_colorRed = new Array(_numOfColors);
        m_colorBlue = new Array(_numOfColors);
        m_colorGreen = new Array(_numOfColors);
        m_colorTable = new Array(_numOfColors);
        
        // preset the colors
        for (var i = 0; i < m_maxNumberOfColors; i++)
        {
            m_colorTable[i] = CreateColor(0,0,0);
        }
    }
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function GetColor(_i)
    {
        return m_colorTable[_i];
    }
    
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function GetColorTable()
    {
        return m_colorTable;
    }
    
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function AddColor(_r,_g,_b)
    {
        m_colorRed[m_numberOfColors] = _r;
        m_colorBlue[m_numberOfColors] = _b
        m_colorGreen[m_numberOfColors] = _g;
        m_colorTable[m_numberOfColors] = CreateColor(_r,_g,_b);
        //document.writeln(m_numberOfColors +": <font color='"+m_colorTable[m_numberOfColors]+"'> " + m_colorTable[m_numberOfColors] + "</font><br>");
        m_numberOfColors++;
    }
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function AddRadiantTo(_r,_g,_b, _steps)
    {
        var startId = m_numberOfColors-1;
        if ( m_numberOfColors + _steps > m_maxNumberOfColors) alert("Color Array to small " + (m_numberOfColors + _steps) + "/ max:" + m_maxNumberOfColors);
        if (startId <0 )    alert("No color added yet!!");
        var redStep = (_r - m_colorRed[startId]) / (_steps-1);
        var bluStep = (_b - m_colorBlue[startId]) / (_steps-1);
        var grnStep = (_g - m_colorGreen[startId]) / (_steps-1);

        for (var i = 1; i < _steps+1; ++i)
        {
            var r = m_colorRed[startId] + i * redStep;
            var g = m_colorGreen[startId] + i * grnStep;
            var b = m_colorBlue[startId] + i * bluStep;
            AddColor(Math.round(r),Math.round(g),Math.round(b));
        }
    }
    
    /////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////
    function CreateColor(_r,_g,_b)
    {
        var col = "#";
        col += ToHex(_r).toString();
        col += ToHex(_g).toString();
        col += ToHex(_b).toString();
        return col;
    }
    
    /////////////////////////////////////////////////////////
    // Changes a int to hex (in the range 0 to 255)
    /////////////////////////////////////////////////////////
    function ToHex(n)
    {      
        if (n > 255) n = 255;
        if (n < 0) n = 0;
        var high = n / 16;
        var low = n - (high*16);
        string = Math.floor(high).toString(16).toUpperCase();
        string += Math.floor(low).toString(16).toUpperCase();
   //     document.writeln(">>>>>> n:" + n + " = " + string + "  high:" + high + "/low:" + low +"<br>");
   //     document.writeln(">>>>>>        " + Math.round(high).toString(16).toUpperCase() + "<br>");
        return string;
    }
}

