#!/usr/bin/perl

require "../cgi-lib.pl";
ReadParse(*params);
print "Content-Type: text/html\n\n";
if($params{r} =~ /\d/ &&
   $params{g} =~ /\d/ &&
   $params{b} =~ /\d/) {
    ($base_h,$base_s,$base_v) = get_hsv($params{r},$params{g},$params{b});
    ($base_r,$base_g,$base_b) = ($params{r},$params{g},$params{b});
} elsif($params{h} =~ /\d/ &&
	$params{s} =~ /\d/ &&
	$params{v} =~ /\d/){
    ($base_h,$base_s,$base_v) = ($params{h},$params{s},$params{v});
    ($base_r,$base_g,$base_b) = get_rgb($params{h},$params{s},$params{v});
}
($base_h,$base_s,$base_v) = normalize_hsv($base_h,$base_s,$base_v);

print "<form>\n";
print "RGB:\n";
print "<input type=text size=3 name=r value=\"$params{r}\">";
print "<input type=text size=3 name=g value=\"$params{g}\">";
print "<input type=text size=3 name=b value=\"$params{b}\">";
print "<input type=submit value=\"View\">\n";
print "</form>\n";

print "<table cellspacing=1>\n";
for($s=0;$s<=100;$s+=10) {
    print "<tr>\n";
    for($v=0;$v<=100;$v+=10) {
	print "<td bgcolor=#";
	my($r,$g,$b) = get_rgb($base_h,$s,$v);
	($r,$g,$b) = normalize_rgb($r,$g,$b);
	print sprintf("%02X%02X%02X",$r,$g,$b);
	if(abs($base_s-$s) <= 5 && abs($base_v-$v) <= 5) {
	    print " style=\"border-left: 1pt solid #FF0000; border-right: 1pt solid #FF0000; border-top: 1pt solid #FF0000; border-bottom: 1pt solid #FF0000;\"";
	}
	print "><img src=\"/images/spacer.gif\" width=16 height=16></td>\n";
	#print ">$base_h,$s,$v => $r,$g,$b</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";

sub normalize_hsv {
    my($h,$s,$v) = @_;
    while($h < 0) { $h+=360; }
    if($h >= 360) { $h = $h % 360; }
    $s = 100 if($s > 100);
    $s = 0 if($s < 0);
    $v = 100 if($v > 100);
    $v = 0 if($v < 0);
    return($h,$s,$v);
}

sub normalize_rgb {
    my($r,$g,$b) = @_;
    $r = round($r);
    $r = 255 if($r > 255);
    $r = 0 if($r < 0);
    $g = round($g);
    $g = 255 if($g > 255);
    $g = 0 if($g < 0);
    $b = round($b);
    $b = 255 if($b > 255);
    $b = 0 if($b < 0);
    return($r,$g,$b);
}

sub get_hsv {
    my($r,$g,$b) = @_;
    my($h,$s,$v,$max,$min);
    $r = $r/255;
    $g = $g/255;
    $b = $b/255;
    if($r >= $g && $r >= $b) {
	$max = $r;
	if($g <= $b) { $min = $g; }
	else { $min = $b; }
    } elsif($g >= $b) {
	$max = $g;
	if($r <= $b) { $min = $r; }
	else { $min = $b; }
    } else {
	$max = $b;
	if($r <= $g) { $min = $r; }
	else { $min = $g; }
    }
    if($max == $min) { $h = 0; }
    elsif($max == $r && $g >= $b) { $h = 60*(($g-$b)/($max-$min)); }
    elsif($max == $r && $g < $b) { $h = 60*(($g-$b)/($max-$min))+360; }
    elsif($max == $g) { $h = 60*(($b-$r)/($max-$min))+120; }
    else { $h = 60*(($r-$g)/($max-$min))+240; }
    if($max == 0) { $s = 0; }
    else { $s = 1 - ($min/$max); }
    $v = $max;
    $s*=100;
    $v*=100;
    return ($h,$s,$v);
}

sub get_rgb {
    my($h,$s,$v) = @_;
    my($hi,$f,$p,$q,$t,$r,$g,$b);
    $s/=100;
    $v/=100;
    $hi = (int($h/60)) % 6;
    $f = ($h/60) - $hi;
    $p = $v * (1-$s);
    $q = $v * (1-$f*$s);
    $t = $v * (1-(1-$f)*$s);
    if($hi == 0)    { $r=$v; $g=$t; $b=$p; } #p
    elsif($hi == 1) { $r=$q; $g=$v; $b=$p; } #p
    elsif($hi == 2) { $r=$p; $g=$v; $b=$t; } #t
    elsif($hi == 3) { $r=$p; $g=$q; $b=$v; } #v
    elsif($hi == 4) { $r=$t; $g=$p; $b=$v; } #v
    elsif($hi == 5) { $r=$v; $g=$p; $b=$q; } #q
    else { print "BAD VALUE! $hi<br>\n"; }
    $r*=255;
    $g*=255;
    $b*=255;
    return($r,$g,$b);
}

sub round {
    my($v) = @_;
    if(($v-(int $v)) >= 0.5) { return ((int $v)+1); }
    else { return (int $v); }
}
