/* Copyright (c) 2006 Yahoo! Inc. All rights reserved. */

YAHOO.util.Color = new function() {
    
    // Adapted from http://www.easyrgb.com/math.html
    // hsv values = 0 - 1
    // rgb values 0 - 255
    this.hsv2rgb = function (h, s, v) {
        var r, g, b;
        if ( s == 0 ) {
           r = v * 255;
           g = v * 255;
           b = v * 255;
        } else {

           // h must be < 1
           var var_h = h * 6;
           if ( var_h == 6 ) {
               var_h = 0;
           }

           //Or ... var_i = floor( var_h )
           var var_i = Math.floor( var_h );
           var var_1 = v * ( 1 - s );
           var var_2 = v * ( 1 - s * ( var_h - var_i ) );
           var var_3 = v * ( 1 - s * ( 1 - ( var_h - var_i ) ) );

           if ( var_i == 0 ) { 
               var_r = v; 
               var_g = var_3; 
               var_b = var_1;
           } else if ( var_i == 1 ) { 
               var_r = var_2;
               var_g = v;
               var_b = var_1;
           } else if ( var_i == 2 ) {
               var_r = var_1;
               var_g = v;
               var_b = var_3
           } else if ( var_i == 3 ) {
               var_r = var_1;
               var_g = var_2;
               var_b = v;
           } else if ( var_i == 4 ) {
               var_r = var_3;
               var_g = var_1;
               var_b = v;
           } else { 
               var_r = v;
               var_g = var_1;
               var_b = var_2;
           }

           r = var_r * 255;                  //rgb results = 0 ÷ 255
           g = var_g * 255;
           b = var_b * 255;

           }
        return [Math.round(r), Math.round(g), Math.round(b)];
    };

    this.rgb2hex = function (r,g,b) {
        return this.toHex(r) + this.toHex(g) + this.toHex(b);
    };

    this.hexchars = "0123456789ABCDEF";

    this.toHex = function(n) {
        n = n || 0;
        n = parseInt(n, 10);
        if (isNaN(n)) n = 0;
        n = Math.round(Math.min(Math.max(0, n), 255));

        return this.hexchars.charAt((n - n % 16) / 16) + this.hexchars.charAt(n % 16);
    };

    this.toDec = function(hexchar) {
        return this.hexchars.indexOf(hexchar.toUpperCase());
    };

    this.hex2rgb = function(str) { 
        var rgb = [];
        rgb[0] = (this.toDec(str.substr(0, 1)) * 16) + this.toDec(str.substr(1, 1));
        rgb[1] = (this.toDec(str.substr(2, 1)) * 16) + this.toDec(str.substr(3, 1));
        rgb[2] = (this.toDec(str.substr(4, 1)) * 16) + this.toDec(str.substr(5, 1));
        // gLogger.debug("hex2rgb: " + str + ", " + rgb.toString());
        return rgb;
    };

    this.isValidRGB = function(a) { 
        if ((!a[0] && a[0] !=0) || isNaN(a[0]) || a[0] < 0 || a[0] > 255) return false;
        if ((!a[1] && a[1] !=0) || isNaN(a[1]) || a[1] < 0 || a[1] > 255) return false;
        if ((!a[2] && a[2] !=0) || isNaN(a[2]) || a[2] < 0 || a[2] > 255) return false;

        return true;
    };

    // own
    //------------------------------ >>>

    // hexval -> 'ff0066'
    this.isValidHex = function(hexval) { 
        if(!hexval || hexval.length!=6) return false;
        var rgb = this.hex2rgb(hexval);
        var boo = this.isValidRGB(rgb);
        return boo;
    };

    // hexvalsharp -> '#ff0066'
    this.isValidHexSharp = function(hexvalsharp) { 
        if(!hexvalsharp || hexvalsharp.length!=7) return false;
        var char = hexvalsharp.substr(0, 1);
        if(char!='#') return false;
        hexval = hexvalsharp.substr(1, 6);
        var rgb = this.hex2rgb(hexval);
        var boo = this.isValidRGB(rgb);
        return boo;
    };

    // colorstr -> 'black'
    this.isValidColorStr = function(colorstr) { 
        var hexvalsharp = this.ColorStr_to_HexSharp(colorstr);
        var boo = this.isValidHexSharp(hexvalsharp);
        return boo;
    };

    // colorstr -> 'black'
    this.ColorStr_to_HexSharp = function(colorstr) { 

        var arr_str = Array();
        var arr_hex = Array();
        arr_str[1]   = 'black';                arr_hex[1]   = '#000000';
        arr_str[2]   = 'maroon';               arr_hex[2]   = '#800000';
        arr_str[3]   = 'green';                arr_hex[3]   = '#008000';
        arr_str[4]   = 'olive';                arr_hex[4]   = '#808000';
        arr_str[5]   = 'navy';                 arr_hex[5]   = '#000080';
        arr_str[6]   = 'purple';               arr_hex[6]   = '#800080';
        arr_str[7]   = 'teal';                 arr_hex[7]   = '#008080';
        arr_str[8]   = 'gray';                 arr_hex[8]   = '#808080';
        arr_str[9]   = 'silver';               arr_hex[9]   = '#C0C0C0';
        arr_str[10]  = 'red';                  arr_hex[10]  = '#FF0000';
        arr_str[11]  = 'lime';                 arr_hex[11]  = '#00FF00';
        arr_str[12]  = 'yellow';               arr_hex[12]  = '#FFFF00';
        arr_str[13]  = 'blue';                 arr_hex[13]  = '#0000FF';
        arr_str[14]  = 'fuchsia';              arr_hex[14]  = '#FF00FF';
        arr_str[15]  = 'aqua';                 arr_hex[15]  = '#00FFFF';
        arr_str[16]  = 'white';                arr_hex[16]  = '#FFFFFF'; 
        arr_str[17]  = 'aliceblue';            arr_hex[17]  = '#F0F8FF';
        arr_str[18]  = 'antiquewhite';         arr_hex[18]  = '#FAEBD7';
        arr_str[19]  = 'aquamarine';           arr_hex[19]  = '#7FFFD4';
        arr_str[20]  = 'azure';                arr_hex[20]  = '#F0FFFF';
        arr_str[21]  = 'beige';                arr_hex[21]  = '#F5F5DC';
        arr_str[22]  = 'blueviolet';           arr_hex[22]  = '#8A2BE2';
        arr_str[23]  = 'brown';                arr_hex[23]  = '#A52A2A';
        arr_str[24]  = 'burlywood';            arr_hex[24]  = '#DEB887';
        arr_str[25]  = 'cadetblue';            arr_hex[25]  = '#5F9EA0';
        arr_str[26]  = 'chartreuse';           arr_hex[26]  = '#7FFF00';
        arr_str[27]  = 'chocolate';            arr_hex[27]  = '#D2691E';
        arr_str[28]  = 'coral';                arr_hex[28]  = '#FF7F50';
        arr_str[29]  = 'cornflowerblue';       arr_hex[29]  = '#6495ED';
        arr_str[30]  = 'cornsilk';             arr_hex[30]  = '#FFF8DC';
        arr_str[31]  = 'crimson';              arr_hex[31]  = '#DC143C';
        arr_str[32]  = 'darkblue';             arr_hex[32]  = '#00008B'; 
        arr_str[33]  = 'darkcyan';             arr_hex[33]  = '#008B8B';
        arr_str[34]  = 'darkgoldenrod';        arr_hex[34]  = '#B8860B';
        arr_str[35]  = 'darkgray';             arr_hex[35]  = '#A9A9A9';
        arr_str[36]  = 'darkgreen';            arr_hex[36]  = '#006400';
        arr_str[37]  = 'darkkhaki';            arr_hex[37]  = '#BDB76B';
        arr_str[38]  = 'darkmagenta';          arr_hex[38]  = '#8B008B';
        arr_str[39]  = 'darkolivegreen';       arr_hex[39]  = '#556B2F';
        arr_str[40]  = 'darkorange';           arr_hex[40]  = '#FF8C00';
        arr_str[41]  = 'darkorchid';           arr_hex[41]  = '#9932CC';
        arr_str[42]  = 'darkred';              arr_hex[42]  = '#8B0000';
        arr_str[43]  = 'darksalmon';           arr_hex[43]  = '#E9967A';
        arr_str[44]  = 'darkseagreen';         arr_hex[44]  = '#8FBC8F';
        arr_str[45]  = 'darkslateblue';        arr_hex[45]  = '#483D8B';
        arr_str[46]  = 'darkslategray';        arr_hex[46]  = '#2F4F4F';
        arr_str[47]  = 'darkturquoise';        arr_hex[47]  = '#00CED1';
        arr_str[48]  = 'darkviolet';           arr_hex[48]  = '#9400D3';
        arr_str[49]  = 'deeppink';             arr_hex[49]  = '#FF1493';
        arr_str[50]  = 'deepskyblue';          arr_hex[50]  = '#00BFFF';
        arr_str[51]  = 'dimgray';              arr_hex[51]  = '#696969';
        arr_str[52]  = 'dodgerblue';           arr_hex[52]  = '#1E90FF';
        arr_str[53]  = 'firebrick';            arr_hex[53]  = '#B22222';
        arr_str[54]  = 'floralwhite';          arr_hex[54]  = '#FFFAF0';
        arr_str[55]  = 'forestgreen';          arr_hex[55]  = '#228B22';
        arr_str[56]  = 'gainsboro';            arr_hex[56]  = '#DCDCDC';
        arr_str[57]  = 'ghostwhite';           arr_hex[57]  = '#F8F8FF';
        arr_str[58]  = 'gold';                 arr_hex[58]  = '#FFD700';
        arr_str[59]  = 'goldenrod';            arr_hex[59]  = '#DAA520';
        arr_str[60]  = 'greenyellow';          arr_hex[60]  = '#ADFF2F';
        arr_str[61]  = 'honeydew';             arr_hex[61]  = '#F0FFF0';
        arr_str[62]  = 'hotpink';              arr_hex[62]  = '#FF69B4';
        arr_str[63]  = 'indianred';            arr_hex[63]  = '#CD5C5C';
        arr_str[64]  = 'indigo';               arr_hex[64]  = '#4B0082';
        arr_str[65]  = 'ivory';                arr_hex[65]  = '#FFFFF0';
        arr_str[66]  = 'khaki';                arr_hex[66]  = '#F0E68C';
        arr_str[67]  = 'lavender';             arr_hex[67]  = '#E6E6FA';
        arr_str[68]  = 'lavenderblush';        arr_hex[68]  = '#FFF0F5';
        arr_str[69]  = 'lawngreen';            arr_hex[69]  = '#7CFC00';
        arr_str[70]  = 'lemonchiffon';         arr_hex[70]  = '#FFFACD';
        arr_str[71]  = 'lightblue';            arr_hex[71]  = '#ADD8E6';
        arr_str[72]  = 'lightcoral';           arr_hex[72]  = '#F08080';
        arr_str[73]  = 'lightcyan';            arr_hex[73]  = '#E0FFFF';
        arr_str[74]  = 'lightgoldenrodyellow'; arr_hex[74]  = '#FAFAD2';
        arr_str[75]  = 'lightgreen';           arr_hex[75]  = '#90EE90';
        arr_str[76]  = 'lightgrey';            arr_hex[76]  = '#D3D3D3';
        arr_str[77]  = 'lightpink';            arr_hex[77]  = '#FFB6C1';
        arr_str[78]  = 'lightsalmon';          arr_hex[78]  = '#FFA07A';
        arr_str[79]  = 'lightseagreen';        arr_hex[79]  = '#20B2AA';
        arr_str[80]  = 'lightskyblue';         arr_hex[80]  = '#87CEFA';
        arr_str[81]  = 'lightslategray';       arr_hex[81]  = '#778899';
        arr_str[82]  = 'lightsteelblue';       arr_hex[82]  = '#B0C4DE';
        arr_str[83]  = 'lightyellow';          arr_hex[83]  = '#FFFFE0';
        arr_str[84]  = 'limegreen';            arr_hex[84]  = '#32CD32';
        arr_str[85]  = 'linen';                arr_hex[85]  = '#FAF0E6';
        arr_str[86]  = 'mediumaquamarine';     arr_hex[86]  = '#66CDAA';
        arr_str[87]  = 'mediumblue';           arr_hex[87]  = '#0000CD';
        arr_str[88]  = 'mediumorchid';         arr_hex[88]  = '#BA55D3';
        arr_str[89]  = 'mediumpurple';         arr_hex[89]  = '#9370DB';
        arr_str[90]  = 'mediumseagreen';       arr_hex[90]  = '#3CB371';
        arr_str[91]  = 'mediumslateblue';      arr_hex[91]  = '#7B68EE';
        arr_str[92]  = 'mediumspringgreen';    arr_hex[92]  = '#00FA9A';
        arr_str[93]  = 'mediumturquoise';      arr_hex[93]  = '#48D1CC';
        arr_str[94]  = 'mediumvioletred';      arr_hex[94]  = '#C71585';
        arr_str[95]  = 'midnightblue';         arr_hex[95]  = '#191970';
        arr_str[96]  = 'mintcream';            arr_hex[96]  = '#F5FFFA';
        arr_str[97]  = 'mistyrose';            arr_hex[97]  = '#FFE4E1';
        arr_str[98]  = 'moccasin';             arr_hex[98]  = '#FFE4B5';
        arr_str[99]  = 'navajowhite';          arr_hex[99]  = '#FFDEAD';
        arr_str[100] = 'oldlace';              arr_hex[100] = '#FDF5E6';
        arr_str[101] = 'olivedrab';            arr_hex[101] = '#6B8E23';
        arr_str[102] = 'orange';               arr_hex[102] = '#FFA500';
        arr_str[103] = 'orangered';            arr_hex[103] = '#FF4500';
        arr_str[104] = 'orchid';               arr_hex[104] = '#DA70D6';
        arr_str[105] = 'palegoldenrod';        arr_hex[105] = '#EEE8AA';
        arr_str[106] = 'palegreen';            arr_hex[106] = '#98FB98';
        arr_str[107] = 'paleturquoise';        arr_hex[107] = '#AFEEEE';
        arr_str[108] = 'palevioletred';        arr_hex[108] = '#DB7093';
        arr_str[109] = 'papayawhip';           arr_hex[109] = '#FFEFD5';
        arr_str[110] = 'peachpuff';            arr_hex[110] = '#FFDAB9';
        arr_str[111] = 'peru';                 arr_hex[111] = '#CD853F';
        arr_str[112] = 'pink';                 arr_hex[112] = '#FFC0CB';
        arr_str[113] = 'plum';                 arr_hex[113] = '#DDA0DD';
        arr_str[114] = 'powderblue';           arr_hex[114] = '#B0E0E6';
        arr_str[115] = 'rosybrown';            arr_hex[115] = '#BC8F8F';
        arr_str[116] = 'royalblue';            arr_hex[116] = '#4169E1';
        arr_str[117] = 'saddlebrown';          arr_hex[117] = '#8B4513';
        arr_str[118] = 'salmon';               arr_hex[118] = '#FA8072';
        arr_str[119] = 'sandybrown';           arr_hex[119] = '#F4A460';
        arr_str[120] = 'seagreen';             arr_hex[120] = '#2E8B57';
        arr_str[121] = 'seashell';             arr_hex[121] = '#FFF5EE';
        arr_str[122] = 'sienna';               arr_hex[122] = '#A0522D';
        arr_str[123] = 'skyblue';              arr_hex[123] = '#87CEEB';
        arr_str[124] = 'slateblue';            arr_hex[124] = '#6A5ACD';
        arr_str[125] = 'slategray';            arr_hex[125] = '#708090';
        arr_str[126] = 'snow';                 arr_hex[126] = '#FFFAFA';
        arr_str[127] = 'springgreen';          arr_hex[127] = '#00FF7F';
        arr_str[128] = 'steelblue';            arr_hex[128] = '#4682B4';
        arr_str[129] = 'tan';                  arr_hex[129] = '#D2B48C';
        arr_str[130] = 'thistle';              arr_hex[130] = '#D8BFD8';
        arr_str[131] = 'tomato';               arr_hex[131] = '#FF6347';
        arr_str[132] = 'turquoise';            arr_hex[132] = '#40E0D0';
        arr_str[133] = 'violet';               arr_hex[133] = '#EE82EE';
        arr_str[134] = 'wheat';                arr_hex[134] = '#F5DEB3';
        arr_str[135] = 'whitesmoke';           arr_hex[135] = '#F5F5F5';
        arr_str[136] = 'yellowgreen';          arr_hex[136] = '#9ACD32';

        colorstr = colorstr.toLowerCase();

        var ret = false;
        for(i=1; i<=136; i++) {
            if(arr_str[i]==colorstr) {
                ret = arr_hex[i];
            }
        }

        return ret;
    };

    this.rgb2hsv = function(xxx) {

        var R = xxx[0];
        var G = xxx[1];
        var B = xxx[2];

        R = ( R / 255 );
        G = ( G / 255 );
        B = ( B / 255 );
        var H = 0;
        var S = 0;
        var V = 0;

        MAX = Math.max(R,G,B);
        MIN = Math.min(R,G,B);

        if (MAX == MIN)
            return [0,0,Math.round(MAX * 100)];

        if (MAX == 0)
            return[0,0,0];

        S = (MAX-MIN) * 100 / MAX ;
        V = MAX * 100;

        if (MAX == R && G>=B)
            H = 60 * (G-B)/(MAX-MIN);

        if (MAX == R && G<B)
            H = 60 * (G-B)/(MAX-MIN) + 360;

        if (MAX == G)
            H = 60 * (B-R)/(MAX-MIN) + 120;

        if (MAX == B)
            H = 60 * (R-G)/(MAX-MIN) + 240;

        return [Math.round(H),Math.round(S),Math.round(V)];
    };
    //------------------------------ <<<
}

