/* This notice must be untouched at all times.

rgbcolor.js    v. 2.00		03-09-2006

Copyright (c) 2006 Clear Voice Systems Ltd. All rights reserved.

Provides RGBColor class.

*/
 
rgbcolor = new RGBColor();

function RGBColor()
{
    // array of color definition objects
    this.color_defs = [
        {
            re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
            example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
            process: function (bits){
                return [
                    parseInt(bits[1]),
                    parseInt(bits[2]),
                    parseInt(bits[3])
                ];
            }
        },
        {
            re: /^(\w{2})(\w{2})(\w{2})$/,
            example: ['#00ff00', '336699'],
            process: function (bits){
                return [
                    parseInt(bits[1], 16),
                    parseInt(bits[2], 16),
                    parseInt(bits[3], 16)
                ];
            }
        },
        {
            re: /^(\w{1})(\w{1})(\w{1})$/,
            example: ['#fb0', 'f0f'],
            process: function (bits){
                return [
                    parseInt(bits[1] + bits[1], 16),
                    parseInt(bits[2] + bits[2], 16),
                    parseInt(bits[3] + bits[3], 16)
                ];
            }
        }
    ];

	this.parse_colordef = function (color_string) {
      // strip any leading #
      if (color_string.charAt(0) == '#') { // remove # if any
        color_string = color_string.substr(1,6);
      }

      color_string = color_string.replace(/ /g,'');
      color_string = color_string.toLowerCase();

      // search through the definitions to find a match
      for (var i = 0; i < this.color_defs.length; i++) {
          var re = this.color_defs[i].re;
          var processor = this.color_defs[i].process;
          var bits = re.exec(color_string);
          if (bits) {
              channels = processor(bits);
              this.r = channels[0];
              this.g = channels[1];
              this.b = channels[2];
              this.ok = true;
          }

      }
	}

    // validate/cleanup values
    this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
    this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
    this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);

    // some getters
    this.toRGB = function (CSScolor) {
		this.parse_colordef(CSScolor);
        return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
    }
	
    this.toHex = function (CSScolor) {
		this.parse_colordef(CSScolor);
        var r = this.r.toString(16);
        var g = this.g.toString(16);
        var b = this.b.toString(16);
        if (r.length == 1) r = '0' + r;
        if (g.length == 1) g = '0' + g;
        if (b.length == 1) b = '0' + b;
        return '#' + r + g + b;
    }

}

