
function hexToRgb(hex_string, default_)
{
    if (default_ == undefined) {
        default_ = null;
    }

    if (hex_string.substr(0, 1) == '#') {
        hex_string = hex_string.substr(1);
    }
    
    var r;
    var g;
    var b;
    if (hex_string.length == 3) {
        r = hex_string.substr(0, 1);
        r += r;
        g = hex_string.substr(1, 1);
        g += g;
        b = hex_string.substr(2, 1);
        b += b;
    }
    else if (hex_string.length == 6) {
        r = hex_string.substr(0, 2);
        g = hex_string.substr(2, 2);
        b = hex_string.substr(4, 2);
    }
    else {
        return default_;
    }
    
    r = parseInt(r, 16);
    g = parseInt(g, 16);
    b = parseInt(b, 16);
    if (isNaN(r) || isNaN(g) || isNaN(b)) {
        return default_;
    }
    else
    {
        //return {r: r / 255, g: g / 255, b: b / 255};
        return {red: r, green: g, blue: b};
    }
}

function rgbToHex(r, g, b, includeHash)
{
    //r = Math.round(r * 255);
    //g = Math.round(g * 255);
    //b = Math.round(b * 255);
    
    if (includeHash == undefined) {
        includeHash = true;
    }
    
    r = r.toString(16);
    if (r.length == 1) {
        r = '0' + r;
    }
    g = g.toString(16);
    if (g.length == 1) {
        g = '0' + g;
    }
    b = b.toString(16);
    if (b.length == 1) {
        b = '0' + b;
    }
    return ((includeHash ? '#' : '') + r + g + b).toUpperCase();
}

function RGBtoHSB(RGB) {
    var R = RGB.red;
    var G = RGB.green;
    var B = RGB.blue;
    var largest = Math.max(R, Math.max(G, B));
    var lowest = Math.min(R, Math.min(G, B));
    var delta = largest - lowest;
    var HSB = new Array(3);
    HSB.hue = 0;
    HSB.saturation = 0;
    HSB.brightness = largest / 255;
    if (largest == 0 || delta == 0) return HSB;
    HSB.saturation = delta / largest;
    if (R == largest) HSB.hue = (G - B) / delta;
    else if (G == largest) HSB.hue = 2 + (B - R) / delta;
    else HSB.hue = 4 + (R - G) / delta;
    HSB.hue *= 60;
    if (HSB.hue < 0) HSB.hue += 360;
    else if (HSB.hue > 360) HSB.hue -= 360;
    return HSB;
  }

  function HSBtoRGB(HSB) {
    var R, G, B;
    if (HSB.saturation == 0) R = G = B = HSB.brightness;
    else {
      var h = HSB.hue / 60;
      var i = Math.floor(h);
      var f = h - i;
      var a = HSB.brightness * (1 - HSB.saturation);
      var b = HSB.brightness * (1 - HSB.saturation * f);
      var c = HSB.brightness * (1 - HSB.saturation * (1 - f));
      switch(i) {
        case 0: R = HSB.brightness; G = c; B = a; break;
        case 1: R = b; G = HSB.brightness; B = a; break;
        case 2: R = a; G = HSB.brightness; B = c; break;
        case 3: R = a; G = b; B = HSB.brightness; break;
        case 4: R = c; G = a; B = HSB.brightness; break;
        case 5: R = HSB.brightness; G = a; B = b; break;
      }
    }
    var RGB = new Array(3);
    RGB.red = Math.round(R * 255);
    RGB.green = Math.round(G * 255);
    RGB.blue = Math.round(B * 255);
    return RGB;
  }
