/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
/* coca::convert.js                                                         */
/* 'The DHTML Color Calculator' javascript source                           */
/* Copyright (c) 2002 Sebastian Böthin <boethin@math.fu-berlin.de>          */
/*                                                                          */
/* Permission to use, copy, and distribute for non-commercial purposes,     */
/* is hereby granted without fee, providing that the above copyright        */ 
/* notice appear in all copies and that both the copyright notice and       */
/* this permission notice appear in supporting documentation.               */
/*                                                                          */
/* This software is provided "as is" without any expressed or implied       */
/* warranty. The author shall not be liable for any damages suffered by     */
/* users of this software. USE AT YOUR OWN RISK.                            */
/*                                                                          */
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

// color conversion library

// ---------------------------------------------------------------------------
//
// using integer ranges:
//   hue: 0 .. 360
//   saturation, brightness: 0 .. 100
//   red, green, blue, cyan, magenta, yellow: 0 .. 255
// hextriplet: '#000000' .. '#ffffff'
//
// ---------------------------------------------------------------------------

// ---------------------------------------------------------------------------
// rgb <====> hsb
function rgb2hsb(v) {
	var max = Math.max(Math.max(v[0], v[1]), v[2]);
	var min = Math.min(Math.min(v[0], v[1]), v[2]);
	var brightness = Math.round(max*20/51);
	if (min == max) return new Array(0, 0, brightness);
	var saturation = Math.round((1 - min/max)*100);
	var d = max - min;
	var hue = Math.round((
		max == v[0] ? 6 + (v[1] - v[2])/d :
		max == v[1] ? 2 + (v[2] - v[0])/d :
		4 + (v[0] - v[1])/d
	)*60) % 360;
	return new Array(hue, saturation, brightness);
}

function hsb2rgb(v) {
	var max = Math.round(v[2]*51/20);
	var min = Math.round(max*(1 - v[1]/100));
	if (min == max) return new Array(max, max, max);
	var d = max - min;
	var h6 = v[0]/60;
	if (h6 <= 1) return new Array(max, Math.round(min + h6*d), min);
	if (h6 <= 2) return new Array(Math.round(min - (h6 - 2)*d), max, min);
	if (h6 <= 3) return new Array(min, max, Math.round(min + (h6 - 2)*d));
	if (h6 <= 4) return new Array(min, Math.round(min - (h6 - 4)*d), max);
	if (h6 <= 5) return new Array(Math.round(min + (h6 - 4)*d), min, max);
	return new Array(max, min, Math.round(min - (h6 - 6)*d));
}

// ---------------------------------------------------------------------------
// rgb <====> hex

function validhex(h) {
	if (h.length != 7 || h.charAt(0) != '#') return null;
	return h;
}

function rgb2hex(v) {
	rh = parseInt(v[0]).toString(16); if(rh.length < 2) rh = '0'+rh;
	gh = parseInt(v[1]).toString(16); if(gh.length < 2) gh = '0'+gh;
	bh = parseInt(v[2]).toString(16); if(bh.length < 2) bh = '0'+bh;
	return '#'+rh+gh+bh;
}

function hex2rgb(h) {
	//if (h.length != 7 || h.charAt(0) != '#') return null;
	if (!validhex(h)) return null;
	var r = parseInt(h.substr(1,2), 16);
	var g = parseInt(h.substr(3,2), 16);
	var b = parseInt(h.substr(5,2), 16);
	if (isNaN(r) || isNaN(g) || isNaN(b)) return null;
	return new Array(r, g, b);
}

// ---------------------------------------------------------------------------
// utilities

function merge(a, b, f) {
	if (f == 0) return b;
	if (a == b) return a;
	return Math.round(a + f/(f + 1)*(b - a));
}

function mergecolors(h1, h2, f) {
	if (f == 0) return h2;
	var c1 = hex2rgb(h1);
	var c2 = hex2rgb(h2);
	return rgb2hex(new Array(
	merge(c1[0], c2[0], f),	merge(c1[1], c2[1], f), merge(c1[2], c2[2], f)));
}

function invertcolor(v) {
	return new Array(255 - v[0], 255 - v[1], 255 - v[2])
}

