// --------------------------------------------------------------------
// Color v2.0 - color hex/ascii conversation
//
// Author
// Christian Mueller <pille@hbr1.com>
//
// Copyright
// This module is free software. You may distribute under the terms of
// either the GNU General Public License or the Artistic License.
//
// Have a nice time
// --------------------------------------------------------------------

var HBT = new Array(
  '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0A', '0B',
  '0C', '0D', '0E', '0F', '10', '11', '12', '13', '14', '15', '16', '17',
  '18', '19', '1A', '1B', '1C', '1D', '1E', '1F', '20', '21', '22', '23',
  '24', '25', '26', '27', '28', '29', '2A', '2B', '2C', '2D', '2E', '2F',
  '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3A', '3B',
  '3C', '3D', '3E', '3F', '40', '41', '42', '43', '44', '45', '46', '47',
  '48', '49', '4A', '4B', '4C', '4D', '4E', '4F', '50', '51', '52', '53',
  '54', '55', '56', '57', '58', '59', '5A', '5B', '5C', '5D', '5E', '5F',
  '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6A', '6B',
  '6C', '6D', '6E', '6F', '70', '71', '72', '73', '74', '75', '76', '77',
  '78', '79', '7A', '7B', '7C', '7D', '7E', '7F', '80', '81', '82', '83',
  '84', '85', '86', '87', '88', '89', '8A', '8B', '8C', '8D', '8E', '8F',
  '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9A', '9B',
  '9C', '9D', '9E', '9F', 'A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7',
  'A8', 'A9', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'B0', 'B1', 'B2', 'B3',
  'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF',
  'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9', 'CA', 'CB',
  'CC', 'CD', 'CE', 'CF', 'D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7',
  'D8', 'D9', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'E0', 'E1', 'E2', 'E3',
  'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'EA', 'EB', 'EC', 'ED', 'EE', 'EF',
  'F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'FA', 'FB',
  'FC', 'FD', 'FE', 'FF'
);

function Color( s ) {
  this.VERSION = '2.01';
//public
  this.FromString = FS;
  this.FromNumber = FN;
  this.AsString = AS;     // : Html compatible Hex-String
  this.AsNumber = AN;     // : Number value
  this.Multiply = MUL;    // : new Color
  this.Invert = INV;      // : new Color
//private
  this.RGBC = RGBC;
  this.CRGB = CRGB;
//initializing
  this.FromString( s );

  function FS( s ) {
    if( s && s.length >= 6 ) {
      var p = 0;
      if( s[0] == '#' ) p ++;
      this.H = s.substr( p, 6 ).toUpperCase();
    }
    else this.H = 'FFFFFF';
    this.Hr =
    	this.H.substr( 4, 2 ) +
    	this.H.substr( 2, 2 ) +
    	this.H.substr( 0, 2 );
    this.A = parseInt( '0x' + this.Hr );
    this.R = this.A & 0xFF;
    this.G = this.A >> 8 & 0xFF;
    this.B = this.A >> 16 & 0xFF;
  }
  
  function FN( n ) {
    this.A = isNaN( n ) ? 0 : n;
    this.R = this.A & 0xFF;
    this.G = this.A >> 8 & 0xFF;
    this.B = this.A >> 16 & 0xFF;
  }
  
  function AS() {
    var hR = HBT[this.R];
    var hG = HBT[this.G];
    var hB = HBT[this.B];
    this.H = hR + hG + hB;
    this.Hr = hB + hG + hR;
    return this.H;
  }
  
  function AN() {
    return this.A;
  }
  
  function MUL( f ) { // : new Color
    var r = MulRGB( this.R, f );
    var g = MulRGB( this.G, f );
    var b = MulRGB( this.B, f );
    var c = new Color();
    c.FromNumber( r + ( g << 8 ) + ( b << 16 ) );
    return c;
  }
  
  function INV() { // : new Color
    var r = 0xFF - this.R;
    var g = 0xFF - this.B;
    var b = 0xFF - this.G;
    var c = new Color();
    c.FromNumber( r + ( g << 8 ) + ( b << 16 ) );
    return c;
  }
  
  function RGBC() {
    this.A = this.R + ( this.G << 8 ) + ( this.B << 16 );
  }
  
  function CRGB() {
    this.R = this.A & 0xFF;
    this.G = this.A >> 8 & 0xFF;
    this.B = this.A >> 16 & 0xFF;
  }
  
  function MulRGB( v, f ) {
    if( v ) {
      var c = parseInt( v * f );
      if( c > 0xFF )
        return 0xFF
      if( c < 0 )
        return 0;
      return c;
    }
    return ( f <= 1 ? 0 : ( parseInt( 10 * f ) & 0xFF ) );
  }
  
}
