// CHANGE TEXTFIELD VALUES:
function set_percentage(p1,p2,p3) {
	document.mixer.p_red.value = p1; document.mixer.p_green.value = p2; document.mixer.p_blue.value = p3;
}
function set_decimal(d1,d2,d3) {
	document.mixer.d_red.value = d1; document.mixer.d_green.value = d2; document.mixer.d_blue.value = d3;
}
function set_lightness(value) {
	if(value<0)value=0; else if(value>100)value=100;
	document.mixer.lightness.value = value;
	document.mixer.darkness.value = 100-value;
}
function set_color(c) {
	document.mixer.enter.value = c;
}
// UPDATE DISPLAY:
function update_sample(color) {
	document.mixer.enter.value = color;
	document.getElementById('sample').style.backgroundColor = '#'+color;
}
function update_lightness() {
	var red, green, blue, lightness;
	red=document.mixer.d_red.value*1; green=document.mixer.d_green.value*1; blue=document.mixer.d_blue.value*1;
	lightness = rounded( (red+green+blue)/(3*255) * 100 );
	set_lightness(lightness);
}
// PROCESS INPUT:
function enter_percentage(source) {
	if(valid_percentage(source.value)) { remove_leading_zeros(source); calculate('p'); }
	else { source.value='0'; enter_percentage(source); }
}
function enter_decimal(source) {
	if(valid_decimal(source.value)) { remove_leading_zeros(source); calculate('d'); }
	else { source.value='0'; enter_decimal(source); }
}
function enter_color(source) {
	if(valid_color(source.value)) { calculate('c'); }
	else if(source.value.length==6) { source.value=document.getElementById('sample').style.backgroundColor.substring(1); enter_color(source); }
}
function enter_lightness(source, value, from_dark) {
	if(valid_percentage(value)) {
		remove_leading_zeros(source); if(from_dark){value=100-source.value;}else{value=source.value;} set_lightness(value); calculate('ln'); }
	else { source.value='0'; enter_lightness(source,'0',from_dark); }
}
// CONVERSIONS:
function get_dec(hex) {
	if(hex=='F')return 15; if(hex=='E')return 14; if(hex=='D')return 13; if(hex=='C')return 12;
	if(hex=='B')return 11; if(hex=='A')return 10; return hex;
}
function get_hex(dec) {
	if(dec==15)return 'F'; if(dec==14)return 'E'; if(dec==13)return 'D'; if(dec==12)return 'C';
	if(dec==11)return 'B'; if(dec==10)return 'A'; return ''+dec;
}
function dec_to_hex(r,g,b) {
	var r1 = get_hex(Math.floor(r/16));
	var r2 = get_hex(Math.floor(r%16));
	var g1 = get_hex(Math.floor(g/16));
	var g2 = get_hex(Math.floor(g%16));
	var b1 = get_hex(Math.floor(b/16));
	var b2 = get_hex(Math.floor(b%16));
	return r1+r2+g1+g2+b1+b2;
}
function hex_to_dec(c,start) {
	var c1 = get_dec(c.substring(start,start+1));
	var c2 = get_dec(c.substring(start+1,start+2));
	return (c1*16)+c2*1;
}
// CALCULATE OUTPUT:
function calculate(input) {
	var mixer = document.mixer;
	var color = '000000';
	set_uppercase(mixer.enter);
	if (input=='p') // color percentages
		{
			var p1=mixer.p_red.value; var p2=mixer.p_green.value; var p3=mixer.p_blue.value;
			var d1 = rounded((p1/100)*255); mixer.d_red.value = d1;
			var d2 = rounded((p2/100)*255); mixer.d_green.value = d2;
			var d3 = rounded((p3/100)*255); mixer.d_blue.value = d3;
			color = dec_to_hex(d1,d2,d3);
		}
	else
		if (input=='d') // decimal colors
		{
			var d1=mixer.d_red.value; var d2=mixer.d_green.value; var d3=mixer.d_blue.value;
			var p1 = rounded((d1/255)*100); mixer.p_red.value = p1;
			var p2 = rounded((d2/255)*100); mixer.p_green.value = p2;
			var p3 = rounded((d3/255)*100); mixer.p_blue.value = p3;
			color = dec_to_hex(d1,d2,d3);
		}
	else
		if (input=='c') // HEX color
		{
			var c = mixer.enter.value;
			var d1 = hex_to_dec(c,0); mixer.d_red.value = d1;
			var d2 = hex_to_dec(c,2); mixer.d_green.value = d2;
			var d3 = hex_to_dec(c,4); mixer.d_blue.value = d3;
			var p1 = rounded((d1/255)*100); mixer.p_red.value = p1;
			var p2 = rounded((d2/255)*100); mixer.p_green.value = p2;
			var p3 = rounded((d3/255)*100); mixer.p_blue.value = p3;
			color = c;
		}
	else
		if (input=='ln') // lightness change
		{
			var d1,d2,d3; d1=mixer.d_red.value*1; d2=mixer.d_green.value*1; d3=mixer.d_blue.value*1;
			var total = d1+d2+d3;
			var newtotal = (mixer.lightness.value/100) * (3*255);
			var added = (newtotal-total);
			var positive = (added>=0);
			var addpart=0;
			var to_go = 3; //(how many colors not yet min/max value)
			var prevent_loop=0;
			while( ((added>0 && positive)||(added<0 && !positive)) && prevent_loop<5 ) {
				addpart = rounded(added/to_go);
				if( (positive && d1<=255)||(!positive && d1>=0) ) {
					if(added<=3 && added>=1)addpart=1; else if (added>=-3 && added<=-1) addpart=-1; //(dividing the remainder)
					d1+=addpart; added-=addpart;
					if(d1<0){added+=d1; d1=0; to_go--;} else if(d1>255){added+=(d1-255); d1=255; to_go--;}
				}
				if( (positive && d2<=255)||(!positive && d2>=0) ) {
					if(added<=3 && added>=1)addpart=1; else if (added>=-3 && added<=-1) addpart=-1;
					d2+=addpart; added-=addpart;
					if(d2<0){added+=d2; d2=0; to_go--;} else if(d2>255){added+=(d2-255); d2=255; to_go--;}
				}
				if( (positive && d3<=255)||(!positive && d3>=0) ) {
					if(added<=3 && added>=1)addpart=1; else if (added>=-3 && added<=-1) addpart=-1;
					d3+=addpart; added-=addpart;
					if(d3<0){added+=d3; d3=0; to_go--;} else if(d3>255){added+=(d3-255); d3=255; to_go--;}
				}
				prevent_loop++;
			}
			mixer.d_red.value=d1; mixer.d_green.value=d2; mixer.d_blue.value=d3;
			var p1 = rounded((d1/255)*100); mixer.p_red.value = p1;
			var p2 = rounded((d2/255)*100); mixer.p_green.value = p2;
			var p3 = rounded((d3/255)*100); mixer.p_blue.value = p3;
			color = dec_to_hex(d1,d2,d3);
		}
	update_sample(color);
	if (input!='ln') { update_lightness(color); }
}