function hls_2_rgb(h,l,s) {
	if (s == 0.0) { rgb = new Array( 255 * l, 255 * l, 255 * l ); }
	else {
		if (l <= 0.5) { m2 = l * (1.0 + s); }
		else { m2 = l + s - (l * s); }
		m1 = 2.0 * l - m2;
		rgb = new Array(_hls_2_rgb(m1, m2, h + 1.0 / 3), _hls_2_rgb(m1, m2, h), _hls_2_rgb(m1, m2, h - 1.0 / 3))
		}
	return rgb;
	}
function _hls_2_rgb(m1, m2, hue) {
	m = m1;
	if (1 < hue) { hue = hue - 1; }
	if (hue < 0) { hue = hue + 1; }
	if (hue < 2.0/3) { m = m1 + (m2 - m1) * (2.0/3 - hue) * 6.0; }
	if (hue < 0.5) { m = m2; }
	if (hue < 1.0/6) { m = m1 + (m2 - m1) * hue * 6.0; }
	return m * 255;
	}
function _rgb_2_hex(R, G, B) {
	var n = Math.round(B); 
	n += Math.round(G) << 8;
	n += Math.round(R) << 16;
	return _dec_2_hex(n);
	}
function _dec_2_hex(num) {
	var i = 0; var j = 20;
	var str = "#";
	while(0 <= j) {
		i = (num >> j)%16;
		if(10 <= i) str += String.fromCharCode(i+87)
		else str += i;
		j -= 4;
		}
	return str;
	}
function _hex_2_rgb(hex) {
	hex = hex.toUpperCase();
	if (hex.charAt(0) == "#") { hex = hex.substring(1,hex.length); }
	var rgb = new Array(3);
	rgb.r = hex.substring(0,2);
	rgb.g = hex.substring(2,4);
	rgb.b = hex.substring(4,6);
	rgb.r = parseInt(rgb.r,16);
	rgb.g = parseInt(rgb.g,16);
	rgb.b = parseInt(rgb.b,16);
	if(isNaN(rgb.r)) rgb.r = 0;
	if(isNaN(rgb.g)) rgb.g = 0;
	if(isNaN(rgb.b)) rgb.b = 0;
	return rgb;
	}

function _rgb_2_hls(r, g, b) {
	r /= 255.0;
	g /= 255.0;
	b /= 255.0;
	var hls = new Array(3);
	maxc = _max(r, g, b);
	minc = _min(r, g, b);
	hls.l = (minc+maxc)/2.0
	hls.h = 0; hls.s = 0
	if (minc == maxc) return hls;
	if (hls.l <= 0.5) hls.s = (maxc-minc) / (maxc+minc)
	else hls.s = (maxc-minc) / (2.0-maxc-minc);
	rc = (maxc-r) / (maxc-minc);
	gc = (maxc-g) / (maxc-minc);
	bc = (maxc-b) / (maxc-minc);
	if (r == maxc) hls.h = bc-gc;
	else if (g == maxc) hls.h = 2.0+rc-bc;
	else hls.h = 4.0+gc-rc;
	hls.h = 360*hls.h/6.0;
	if (hls.h<0) hls.h += 360;
	if (360<=hls.h) hls.h -= 360;
	return hls;
	}

function _min() {
	var min = 255;
	for (var i = 0; i < arguments.length; i++) {
	if (arguments[i] < min) min = arguments[i];
	} return min; }
	
function _max() {
	var max = 0;
	for (var i = 0; i < arguments.length; i++) {
	if (max < arguments[i]) max = arguments[i];
	} return max; }

