<!--
var red = 127, green = 127, blue = 127, hex = "7F7F7F", coordX = 0, coordY = 0, hue = 160, sat = 0, lum = 120;

function RGBtoHex(red, green, blue) {
	return "" + CharCodeToHexWord(red) + CharCodeToHexWord(green) + CharCodeToHexWord(blue);
}

function RGBstring(red, green, blue) {
	return "rgb(" + red + "," + green + "," + blue + ")";
}

function adjustSat(color, sat) {
	if (color >= 127) {
		return color - Math.round(((240 - sat) / 240) * (color - 127));
	} else {
		return color + Math.round(((240 - sat) / 240) * (127 - color));
	}
}

function adjustLum(color, lum) {
	switch (true) {
		case (lum == 240): return 255;
		case (lum >= 121): return color + Math.round(((255 - color) / 120) * (120 - (240 - lum) + 1));
		case (lum == 120): return color;
		case (lum >= 1): return color - Math.round((color / 120) * ((240 - lum) + 1 - 121));
		default: return 0;
	}
}

function hexLumAdjusted() {
	return RGBtoHex(adjustLum(red, lum), adjustLum(green, lum), adjustLum(blue, lum));
}

function getColorMapX(Zred, Zgreen, Zblue) {
	var Zsat = 0, x = 0, Hleft = 0, Hright = 0;
	
	switch (true) {
		case ((Zred == Zblue) && (Zred == Zgreen)):  /* shade of pure grey */
			Zsat = 0;
			x = 256;
			break;
		case ((Zred >= Zblue) && (Zgreen >= Zblue)):
			Zsat = 240 - Math.round((Zblue / 128) * 240);
			if (Zred > Zgreen) {
				Hleft = adjustSat(0, Zsat);
				Hright = adjustSat(255, Zsat);
				x = Math.round(((Zgreen - Hleft) / (Hright - Hleft)) * 64);
			} else if (Zred == Zgreen) {
				x = 64;
			} else {
				Hleft = adjustSat(255, Zsat);
				Hright = adjustSat(0, Zsat);
				x = Math.round((1 - ((Zred - Hright) / (Hleft - Hright))) * 64) + 64;
			}
			break;
		case ((Zgreen >= Zred) && (Zblue >= Zred)):
			Zsat = 240 - Math.round((Zred / 128) * 240);
			if (Zgreen > Zblue) {
				Hleft = adjustSat(0, Zsat);
				Hright = adjustSat(255, Zsat);
				x = Math.round(((Zblue - Hleft) / (Hright - Hleft)) * 64) + 128;
			} else if (Zgreen == Zblue) {
				x = 192;
			} else {
				Hleft = adjustSat(255, Zsat);
				Hright = adjustSat(0, Zsat);
				x = Math.round((1 - ((Zgreen - Hright) / (Hleft - Hright))) * 64) + 192;
			}
			break;
		case ((Zred >= Zgreen) && (Zblue >= Zgreen)):
			Zsat = 240 - Math.round((Zgreen / 128) * 240);
			if (Zblue > Zred) {
				Hleft = adjustSat(0, Zsat);
				Hright = adjustSat(255, Zsat);
				x = Math.round(((Zred - Hleft) / (Hright - Hleft)) * 64) + 256;
			} else if (Zblue == Zred) {
				x = 320;
			} else {
				Hleft = adjustSat(255, Zsat);
				Hright = adjustSat(0, Zsat);
				x = Math.round((1 - ((Zblue - Hright) / (Hleft - Hright))) * 64) + 321;
			}
			break;
		default:
			alert('error: bad color input.');
	}
	return x;
}

function getHue(Zred, Zgreen, Zblue) {
	return Math.round(((getColorMapX(Zred, Zgreen, Zblue) + 1) / 384) * 240) - 1;
}

function getSat(Zred, Zgreen, Zblue) {
	switch (true) {
		case ((Zred == Zblue) && (Zred == Zgreen)): return 0; break;
		case ((Zred >= Zblue) && (Zgreen >= Zblue)): return 240 - Math.round((Zblue / 128) * 240); break;
		case ((Zgreen >= Zred) && (Zblue >= Zred)): return 240 - Math.round((Zred / 128) * 240); break;
		case ((Zred >= Zgreen) && (Zblue >= Zgreen)): return 240 - Math.round((Zgreen / 128) * 240); break;
		default: alert('error: bad color input.'); return 0;
	}
}

function coordsOffset(event, element) {
	var offsetX = 0, offsetY = 0;
	var obj = document.getElementById(element);
	while (obj.offsetParent) {
		offsetX += obj.offsetLeft;
		offsetY += obj.offsetTop;
		obj = obj.offsetParent;
	}
	if (MSIE || Opera) {
		coordX = event.x - 1;
		coordY = event.y - 1;
	} else {
		coordX = event.pageX - offsetX - 1;
		coordY = event.pageY - offsetY - 1;
	}
//	alert("coordX: " + coordX + "\r\ncoordY: " + coordY);
}

function setCross() {
	moveCross(getColorMapX(red, green, blue), 240 - sat);
}

function moveCross(x, y) {
	moveElement('crosshair', x - 9, y - 9);
}

function setArrows() {
	var intY = (240 - lum) - 8 + (MSIE || Opera ? 3 : 0);
	moveElement('arrow1', null, intY);
	moveElement('arrow2', null, intY);
}

function clickPreset(finalhex, basehex, luminosity) {
	red = HexWordToCharCode(basehex.substr(0, 2));
	green = HexWordToCharCode(basehex.substr(2, 2));
	blue = HexWordToCharCode(basehex.substr(4, 2));
	hue = getHue(red, green, blue);
	sat = getSat(red, green, blue);
	lum = parseInt(luminosity);
	setCross();
	setArrows();
	drawLumGradient();
	displayValues(finalhex, '');
}

function clickColorMap(event) {
	coordsOffset(event, 'img-colormap');
	if ((coordX < 0) || (coordX > 383) || (coordY < 0) || (coordY > 240)) { return; }
	moveCross(coordX, coordY);
	switch (true) {
		case (coordX < 64): red = 255; green = coordX * 4; blue = 0; break;
		case (coordX < 128): red = 255 - ((coordX - 64) * 4); green = 255; blue = 0; break;
		case (coordX < 192): red = 0; green = 255; blue = (coordX - 128) * 4; break;
		case (coordX < 256): red = 0; green = 255 - ((coordX - 192) * 4); blue = 255; break;
		case (coordX < 320): red = (coordX - 256) * 4; green = 0; blue = 255; break;
		default: red = 255; green = 0; blue = 255 - ((coordX - 320) * 4);
	}
	hue = Math.round(((coordX + 1) / 384) * 240) - 1;
	sat = 240 - coordY;
	red = adjustSat(red, sat);
	green = adjustSat(green, sat);
	blue = adjustSat(blue, sat);
	drawLumGradient();
	displayValues(hexLumAdjusted(), '');
}

function clickLumGradient(event) {
	coordsOffset(event, 'lumgradient');
	if ((coordY < 0) || (coordY > 240)) { return; }
	lum = (240 - coordY);
	setArrows();
	displayValues(hexLumAdjusted(), '');
}

function drawLumGradient() {
	var i, Zred, Zgreen, Zblue;
	var levels = new Array;
	for (i = 0; i <= 24; i++) {
		Zred = red + Math.round(((255 - red) / 24) * (24 - i));
		Zgreen = green + Math.round(((255 - green) / 24) * (24 - i));
		Zblue = blue + Math.round(((255 - blue) / 24) * (24 - i));
		levels[i] = RGBstring(Zred, Zgreen, Zblue);
	}
	levels[24] = RGBstring(red, green, blue);
	for (i = 0; i <= 24; i++) {
		Zred = red - Math.round((red / 24) * i);
		Zgreen = green - Math.round((green / 24) * i);
		Zblue = blue - Math.round((blue / 24) * i);
		levels[24 + i] = RGBstring(Zred, Zgreen, Zblue);
	}
	for (i = 0; i <= 48; i++) {
		document.getElementById('bright' + i).style.background = levels[i];
	}
}

function displayValues(hex, attribute) {
	document.getElementById('val-red').value = HexWordToCharCode(hex.substr(0, 2));
	document.getElementById('val-green').value = HexWordToCharCode(hex.substr(2, 2));
	document.getElementById('val-blue').value = HexWordToCharCode(hex.substr(4, 2));
	document.getElementById('val-hex').value = hex;
	document.getElementById('color').style.background = "#" + hex;
	
	if (attribute != 'hue') { document.getElementById('val-hue').value = hue; }
	if (attribute != 'sat') { document.getElementById('val-sat').value = sat; }
	if (attribute != 'lum') { document.getElementById('val-lum').value = lum; }
}

function userChangeHue() {
	var Zhue = document.getElementById('val-hue').value;
	if (Zhue < 0) { Zhue = 0; document.getElementById('val-hue').value = 0; }
	if (Zhue > 239) { Zhue = 239; document.getElementById('val-hue').value = 239; }
	hue = Zhue;
	userChange();
}

function userChangeSat() {
	var Zsat = document.getElementById('val-sat').value;
	if (Zsat < 0) { Zsat = 0; document.getElementById('val-sat').value = 0; }
	if (Zsat > 240) { Zsat = 240; document.getElementById('val-sat').value = 240; }
	sat = Zsat;
	userChange();
}

function userChangeLum() {
	var Zlum = document.getElementById('val-lum').value;
	if (Zlum < 0) { Zlum = 0; document.getElementById('val-lum').value = 0; }
	if (Zlum > 240) { Zlum = 240; document.getElementById('val-lum').value = 240; }
	lum = Zlum;
	setArrows();
	userChange();
}

function userChange(attribute) {
	switch (attribute) {
		case "hue": hue = filterUserNum('val-hue', 0, 239); break;
		case "sat": sat = filterUserNum('val-sat', 0, 240); break;
		case "lum": lum = filterUserNum('val-lum', 0, 240); setArrows(); break;
		case "red":
			red = filterUserNum('val-red', 0, 255);
			// need to adjust lum and other colors here;
			hue = getHue(red, green, blue);
			break;
		case "green":
			green = filterUserNum('val-green', 0, 255);
			// need to adjust lum and other colors here;
			hue = getHue(red, green, blue);
			break;
		case "blue":
			blue = filterUserNum('val-blue', 0, 255);
			// need to adjust lum and other colors here;
			hue = getHue(red, green, blue);
			break;
		default: alert('I\'m busy!');
	}
	
	var coordX = Math.round((hue / 240) * 384);
	switch (true) {
		case (coordX < 64): red = 255; green = coordX * 4; blue = 0; break;
		case (coordX < 128): red = 255 - ((coordX - 64) * 4); green = 255; blue = 0; break;
		case (coordX < 192): red = 0; green = 255; blue = (coordX - 128) * 4; break;
		case (coordX < 256): red = 0; green = 255 - ((coordX - 192) * 4); blue = 255; break;
		case (coordX < 320): red = (coordX - 256) * 4; green = 0; blue = 255; break;
		default: red = 255; green = 0; blue = 255 - ((coordX - 320) * 4);
	}
	red = adjustSat(red, sat);
	green = adjustSat(green, sat);
	blue = adjustSat(blue, sat);
	moveCross(coordX, 240 - sat);
	drawLumGradient();
	displayValues(hexLumAdjusted(), attribute);
}

function filterUserNum(element, loVal, hiVal) {
	var Zvalue = document.getElementById(element).value;
	if (Zvalue == '') { return 0; }
	if (isNaN(Zvalue)) {
		var myRegExp = new RegExp("[^0-9]", "g");
		Zvalue = Zvalue.replace(myRegExp, "");
		document.getElementById(element).value = Zvalue;
	}
	switch (true) {
		case ((Zvalue < loVal) || (Zvalue > hiVal)):
			Zvalue = (Zvalue < loVal) ? loVal : hiVal;
			document.getElementById(element).value = Zvalue;
			break;
		case ((Zvalue.length > 1) && (Zvalue.charAt(0) == "0")):
			Zvalue = Zvalue.substr(1, Zvalue.length - 1);
			document.getElementById(element).value = Zvalue;
			break;
	}
	return Zvalue;
}

function nudgeUserNum(element, attribute, direction, min, max) {
	var Zvalue = parseInt(document.getElementById(element).value);
	if (isNaN(Zvalue)) {
		Zvalue = 0;
		if (direction == 'down') { document.getElementById(element).value = 0; }
	}
	if ((direction == 'up') && (Zvalue < max)) {
		document.getElementById(element).value = Zvalue + 1;
		userChange(attribute);
	} else if ((direction == 'down') && (Zvalue > min)) {
		document.getElementById(element).value = Zvalue - 1;
		userChange(attribute);
	}
}

// -->
