function setValue(el, val) {
	el.value = val;
	if (el.getAttribute("TYPE") == "x")
		el.style.left =  val * (el.parentElement.clientWidth - el.offsetWidth);
	else
		el.style.top =  val * (el.parentElement.clientHeight - el.offsetHeight);

	eval(el.onchange.replace(/this/g, "el"))
}

function hsvToRgb(hsv) {
	var rgb = new Object();
	var i, f, p, q, t;


	if (hsv.s == 0) {
		// achromatic (grey)
		rgb.r = rgb.g = rgb.b = hsv.v;
		return rgb;
	}
	hsv.h /= 60;			// sector 0 to 5
	i = Math.floor( hsv.h );
	f = hsv.h - i;			// factorial part of h
	p = hsv.v * ( 1 - hsv.s );
	q = hsv.v * ( 1 - hsv.s * f );
	t = hsv.v * ( 1 - hsv.s * ( 1 - f ) );
	switch( i ) {
		case 0:
			rgb.r = hsv.v;
			rgb.g = t;
			rgb.b = p;
			break;
		case 1:
			rgb.r = q;
			rgb.g = hsv.v;
			rgb.b = p;
			break;
		case 2:
			rgb.r = p;
			rgb.g = hsv.v;
			rgb.b = t;
			break;
		case 3:
			rgb.r = p;
			rgb.g = q;
			rgb.b = hsv.v;
			break;
		case 4:
			rgb.r = t;
			rgb.g = p;
			rgb.b = hsv.v;
			break;
		default:		// case 5:
			rgb.r = hsv.v;
			rgb.g = p;
			rgb.b = q;
			break;
	}
	
	return rgb;
}

/*
var t = new Object();
t.h = 180;
t.s = 0.5;
t.v = 0.5;

alert(hsvToRgb(t).r)*/

function calculateRGB() {
	if (window.event.button == 1 && dragobject == null) {
		var hsv = new Object();
		var h = window.event.srcElement.offsetHeight;
		var y = window.event.offsetY;
		
		hsv.h = 360 * window.event.offsetX / window.event.srcElement.offsetWidth;
		
		if (y > h/2) {
			hsv.s = 1.0;
			hsv.v = 2 * (h - y) / h;
		}
		else {
			hsv.v = 1.0;
			hsv.s = y / (h/2);
		}
		
		var rgb = hsvToRgb(hsv);
				
		public_setColor(rgb.r, rgb.g, rgb.b);
		
	}
}

function update(el) {
	var red   = Math.round(255*redSlider.value);
	var green = Math.round(255*greenSlider.value);
	var blue  = Math.round(255*blueSlider.value);
	
	var color = "RGB(" + red + "," + green + "," + blue + ")";

	colorBox.style.backgroundColor = color;

	redLeft.style.background = "RGB(" + 0 + "," + green + "," + blue + ")";
	redRight.style.background = "RGB(" + 255 + "," + green + "," + blue + ")";
	greenLeft.style.background = "RGB(" + red + "," + 0 + "," + blue + ")";
	greenRight.style.background = "RGB(" + red + "," + 255 + "," + blue + ")";
	blueLeft.style.background = "RGB(" + red + "," + green + "," + 0 + ")";
	blueRight.style.background = "RGB(" + red + "," + green + "," + 255 + ")";
	
	redInput.value = Math.round(red);
	greenInput.value = Math.round(green);
	blueInput.value = Math.round(blue);
	
	raiseIt();
}

function updateInput(slider) {
	var v = parseInt(window.event.srcElement.value);
	
	if (!isNaN(v)) {
		setValue(slider, Math.min(256, v)/256);
		raiseIt();
	}
}

function clickOnGrad(sliderEl) {
	setValue(sliderEl, Math.min(Math.abs((event.offsetX+1)/event.srcElement.offsetWidth), 1.0));
}

function init() {
// colors set in toggle when shown
//	public_setColor(0.5, 0.5, 0.5);
//	setValueRGB(color1Box);
}

function public_setColor(r, g, b) {
	setValue(redSlider, Math.min(1.0, r));
	setValue(greenSlider, Math.min(1.0, g));
	setValue(blueSlider, Math.min(1.0, b));
	
	raiseIt();
}

function public_getColor() {
	var o = new Object();
	o.r = redSlider.value;
	o.g = greenSlider.value;
	o.b = blueSlider.value;	

	return o;
}

function raiseIt() {
	var o = new Object();
	o.r = redSlider.value;
	o.g = greenSlider.value;
	o.b = blueSlider.value;
	
	if (window.external.raiseEvent)
		window.external.raiseEvent("oncolorchange", o);
}

function toggleSlider(poObj, poWhere, poColor, poHidden) {
	if (poObj.style.visibility == 'hidden') {
		poObj.value = poColor;
		poObj.vhidden = poHidden;
		colorbyname.selectedIndex = 0;
		setValueRGB(poColor);
		poObj.style.pixelTop = poWhere.getBoundingClientRect().top + poWhere.offsetHeight + document.body.scrollTop-2;
		poObj.style.pixelLeft = poWhere.getBoundingClientRect().left + document.body.scrollLeft -2;
		poObj.style.visibility = 'visible';
	} else {
		poObj.style.visibility = 'hidden';
	}
}

function saveSliderColor(poObj, poHidden, poFrom) {
	poObj.style.backgroundColor = poFrom.style.backgroundColor;
	var red   = Math.round(255*redSlider.value);
	var green = Math.round(255*greenSlider.value);
	var blue  = Math.round(255*blueSlider.value);
	var lcVal = red + "," + green + "," + blue;
	
	poObj.value = lcVal;
	poHidden.value = lcVal;
}

function setValueRGB(poObj) {
	var lcVal = poObj.value;
	var laVal = lcVal.split(",");

	public_setColor(laVal[0]/255, laVal[1]/255, laVal[2]/255)
}

function setColorName(poSelect) {
	var lcRGB = poSelect.options[poSelect.selectedIndex].value;
	var red = "0x" + lcRGB.substr(0,2);
	var green = "0x" + lcRGB.substr(2,2);
	var blue = "0x" + lcRGB.substr(4,2);
	
	public_setColor(red/255, green/255, blue/255);
	poSelect.selectedIndex = 0;
}
