function html_r_g_b(string)
{
    var r_string = string.slice(1,3);
    var g_string = string.slice(3,5);
    var b_string = string.slice(5,7);

    return [parseInt(r_string, 16), 
            parseInt(g_string, 16), 
            parseInt(b_string, 16)];
}

function rgb_hsv(r, g, b)
{
    var h = 100, s = 0, v;
    var min = Math.min(r, Math.min(g, b));
    var max = Math.max(r, Math.max(g, b));
    var delta = max - min;

    if (delta == 0) {
        return [h, s, max / 255.0];
    }

    v = max;
    s = delta / max;
    
    if (r == max) {
        h = 0 + ((g - b) / delta);
    } else if (g == max) {
        h = 2 + ((b - r) / delta);
    } else {
        h = 4 + ((r - g) / delta);
    }

    h = h * 60;
    if (h < 0) {
        h = h + 360;
    }

    return [h, s, v / 255.0];
}

function is_dark(html_color)
{
    var rgb = html_r_g_b(html_color);
    var hsv = rgb_hsv(rgb[0], rgb[1], rgb[2]);
    var h = hsv[0], s = hsv[1], v = hsv[2];

    return ((s > 0.5 && (h < 45 || h > 205)) || v < 0.64);
}

function is_html_color(string)
{
    return string.match(/^#[A-Fa-f0-9]{6}$/);
}

function set_input_colors(input, color)
{
    input.style.background = color;
    if (is_dark(color)) {
        input.style.color = 'white';
    } else {
        input.style.color = 'black';
    }
}

function color_input_change(widget)
{
    if (is_html_color(widget.value)) {
        set_input_colors(widget, widget.value);
     }
}

function initialize_widget_colors (widget) {
    color_input_change(widget);
}

function swap_colors (id1, id2) {
    var a = document.getElementById(id1);
    var b = document.getElementById(id2);
    var tmp = a.value;
    a.value = b.value;
    b.value = tmp;
    initialize_widget_colors(a);
    initialize_widget_colors(b);
}

