// INIT:
function init() {
	enter_color(document.mixer.enter);
}
// UPDATE DISPLAY:
function update_sample(sample, color) {
	sample.style.backgroundColor = '#'+color;
}
// UPDATE SELECT BOXES:
function set_selectbox(box, first_char) {
	for(var i=0; i<box.options.length; i++) {
		if(box.options[i].value.substring(0,1)==first_char) { box.options[i].selected=true; break; }
	}
}
function update_selectboxes() {
	var mixer = document.mixer;
	var c = mixer.enter.value;
	var c_1 = c.substring(0,1); var c_2 = c.substring(2,3); var c_3 = c.substring(4,5);
	set_selectbox(mixer.c_1,c_1); set_selectbox(mixer.c_2,c_2); set_selectbox(mixer.c_3,c_3);
}
// PROCESS INPUT:
function enter_color(source) { //(action initiated by textfield!)
	sample = document.mixer.sample;
	if(valid_color(source.value)) { set_uppercase(source); update_selectboxes(); get_close_colors(source.value); }
	else if(source.value.length==6) { source.value=sample.style.backgroundColor.substring(1); }
}
function submit_action() { //(action initiated by button or select box!)
	var mixer = document.mixer;
	var field = mixer.enter;
	if(!valid_color(field.value) || field.value.length<6) { field.value='000000'; update_selectboxes(); }
	var color = mixer.c_1.value + mixer.c_2.value + mixer.c_3.value;
	field.value = color;
	get_close_colors(color);
}
// 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) {
	if(r<0) r=0; else if(r>255) r=255;//(CHECK REQUIRED here, may be too low/high!!)
	if(g<0) g=0; else if(g>255) g=255;
	if(b<0) b=0; else if(b>255) b=255;
	var c1,c2,c3,c4,c5,c6;
	c1 = get_hex(Math.floor(r/16)); c2 = get_hex(Math.floor(r%16));
	c3 = get_hex(Math.floor(g/16)); c4 = get_hex(Math.floor(g%16));
	c5 = get_hex(Math.floor(b/16)); c6 = get_hex(Math.floor(b%16));
	return c1+c2+c3+c4+c5+c6;
}
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;
}
function web_safe(r,g,b) {
	var tmp;//(holds remainder of modulus)
	tmp=r%51; if(tmp>25){tmp=r+51-tmp;} else {tmp=r-tmp;}
	var c1 = get_hex( rounded(tmp/17) );
	tmp=g%51; if(tmp>25){tmp=g+51-tmp;} else {tmp=g-tmp;}
	var c2 = get_hex( rounded(tmp/17) );
	tmp=b%51; if(tmp>25){tmp=b+51-tmp;} else {tmp=b-tmp;}
	var c3 = get_hex( rounded(tmp/17) );
	return c1+c1+c2+c2+c3+c3;
}
function websafe_component(value, diff) {
	var tmp = value%51;
	if(diff==0) { if(tmp>25){return value*1+51-tmp;}else{return value-tmp;} } //(just requesting a rounded [web-safe] value)
	else if(tmp==0) { return value*1 + 51*diff; } //(val itself is web-safe, just add/subtract 51!)
	else if(diff<0) { return value - tmp; } //(we want a lower color value)
	else { return value*1 + 51 - tmp; }
}
// CALCULATE OUTPUT:
function get_close_colors(color) {
	var mixer = document.mixer;
	update_sample(mixer.sample,color);
	var websafe = mixer.websafe.checked;
	var r,g,b;
	r=hex_to_dec(color,0); g=hex_to_dec(color,2); b=hex_to_dec(color,4);
	var c1,c2,c3,c4,c5,c6;
	var rM,rP,gM,gP,bM,bP;
	if(websafe) {
		r=websafe_component(r,0); g=websafe_component(g,0); b=websafe_component(b,0);
		rM=websafe_component(r,-1); rP=websafe_component(r, 1);
		gM=websafe_component(g,-1); gP=websafe_component(g, 1);
		bM=websafe_component(b,-1); bP=websafe_component(b, 1);
		c1=dec_to_hex(rM, g, b); c2=dec_to_hex(rP, g, b);
		c3=dec_to_hex( r,gM, b); c4=dec_to_hex( r,gP, b);
		c5=dec_to_hex( r, g,bM); c6=dec_to_hex( r, g,bP);
	}
	else {
		rM=r-17; rP=r+17; gM=g-17; gP=g+17; bM=b-17; bP=b+17;
		c1=dec_to_hex(rM, g, b); c2=dec_to_hex(rP, g, b);
		c3=dec_to_hex( r,gM, b); c4=dec_to_hex( r,gP, b);
		c5=dec_to_hex( r, g,bM); c6=dec_to_hex( r, g,bP);
	}
	update_sample(mixer.s1,c1); mixer.r1.value=c1;
	update_sample(mixer.s2,c2); mixer.r2.value=c2;
	update_sample(mixer.s3,c3); mixer.r3.value=c3;
	update_sample(mixer.s4,c4); mixer.r4.value=c4;
	update_sample(mixer.s5,c5); mixer.r5.value=c5;
	update_sample(mixer.s6,c6); mixer.r6.value=c6;
}
