var Hue = 100;
var Saturation=15;        //■彩度。指定できる値は0-100。0にすると無彩色(灰色系)のまま変化なし。
var Brightness=100;       //■明度。指定できる値は0-100。0にすると常に黒

//HSB→RGB 表記. 計算は HSBtoRGB(hue,sat,bri);
function torgb(hue,sat,bri){
	var da = document.all;
	var df = document.forms.colors;
	if(!hue && df.hsb_0){ hue = df.hsb_0.value; }
	if(!sat && df.hsb_1){ sat = df.hsb_1.value; }
	if(!bri && df.hsb_2){ bri = df.hsb_2.value; }
	hue=Number(hue); sat=Number(sat); bri=Number(bri); 
	var rgb = HSBtoRGB(hue,sat,bri);
	var cs = new Array();
	for (var i=0; i<=2; i++){
//		if(0<=rgb[i] && rgb[i]<=255){}else{ rgb[i]=255; }
		cs[i] = Math.round(rgb[i]);
//		df('rgb_'+i).value = cs[i];
	}
	df.rgb_0.value = cs[0];
	df.rgb_1.value = cs[1];
	df.rgb_2.value = cs[2];
	df.hsb.value = hue+','+sat+','+bri;
	df.rgb10.value = cs[0]+','+cs[1]+','+cs[2];
	valuergb16(df,da,'#'+format16(cs[0])+format16(cs[1])+format16(cs[2]));
}


//RGB→HSB 表記. 計算は RGBtoHSB(red,gre,blu);
function tohsb(red,gre,blu){
	var da = document.all;
	var df = document.forms.colors;
	if(!red && df.rgb_0){ red = df.rgb_0.value; }
	if(!gre && df.rgb_1){ gre = df.rgb_1.value; }
	if(!blu && df.rgb_2){ blu = df.rgb_2.value; }
	red=Number(red); gre=Number(gre); blu=Number(blu); 
	var hsv = RGBtoHSB(red,gre,blu);
	var cs = new Array();
	for (var i=0; i<=2; i++){
//		if(0<=hsv[i] && hsv[i]<=255){}else{ hsv[i]=255; }
		cs[i] = Math.round(hsv[i]);
//		df('hsb_'+i).value = cs[i];
	}
	df.hsb_0.value = cs[0];
	df.hsb_1.value = cs[1];
	df.hsb_2.value = cs[2];
	df.hsb.value = cs[0]+','+cs[1]+','+cs[2];
	df.rgb10.value = red+','+gre+','+blu;
	valuergb16(df,da,'#'+format16(red)+format16(gre)+format16(blu));
}


// RGB16に表記
function valuergb16(df,da,c16){
	df.rgb16.value = c16;
	df.tc0.style.color = c16;
	df.tb0.style.background = c16;
	df.tcf.style.color = c16;
	df.tbf.style.background = c16;
	df.tc8.style.color = c16;
	df.tb8.style.background = c16;
	df.tc8.style.background = df.tcg.value;
	df.tb8.style.color = df.tbg.value;
}


// RGB16→RGB10 表記. 値は 000000～ffffff
function to10rgb(str){
	var df = document.forms.colors;
	var ns = new Array();
	if(!str && df.rgb16){ str=df.rgb16.value }
	str = str.replace(/[^0-9a-fA-F]/g,'');
	for(var i=0; i<=2; i++){
		ns[i] = str.substr(i*2,2);
		if(!ns[i]){ ns[i]='00'; }
		ns[i] = Number(parseInt(ns[i],16).toString(10));
//		if(0<=ns[i] && ns[i]<=255){}else{ ns[i]=255; }
//		df('rgb_'+i).value = ns[i];
	}
	df.rgb_0.value = ns[0];
	df.rgb_1.value = ns[1];
	df.rgb_2.value = ns[2];
	tohsb(ns[0],ns[1],ns[2]);
	df.rgb10.value = ns[0]+','+ns[1]+','+ns[2];
}




//HSB→RGB 計算. 値は0～255.
function HSBtoRGB(h,s,v){
	var r,g,b;
	if(s==0){
		r=v; g=v; b=v;
	}else{
		var max,min,dif;
		h*=360/255;	//360°
		max=v;
		dif=v*s/255;	//s=(dif/max)*255
		min=v-dif;  //min=max-dif

		if(h<60){
			r=max;	b=min;	g=h*dif/60+min;
		}else if(h<120){
			g=max;	b=min;	r=-(h-120)*dif/60+min;
		}else if(h<180){
			g=max;	r=min;	b= (h-120)*dif/60+min;
		}else if(h<240){
			b=max;	r=min;	g=-(h-240)*dif/60+min;
		}else if(h<300){
			b=max;	g=min;	r= (h-240)*dif/60+min;
		}else if(h<=360){
			r=max;	g=min;	b=-(h-360)*dif/60+min;
		}else{r=0;g=0;b=0;}
	}
	return(new Array(r,g,b));
}


//RGB→HSB 計算. 値は0～255.
function RGBtoHSB(r,g,b){
	var max,min,dif,h,s,v;

	// max
	if(r>=g && r>=b){
		max=r;
	}else if(g>=b){
		max=g;
	}else{
		max=b;
	}

	// min
	if(r<=g && r<=b){
		min=r;
	}else if(g<=b){
		min=g;
	}else{
		min=b;
	}

	// 0,0,0
	if(max<=0){ return(new Array(0,0,0)); }

	// difference
	dif=max-min;

	//Hue:
	if(max>min){
		if(g==max){
			h=(b-r)/dif*60+120;
		}else if(b==max){
			h=(r-g)/dif*60+240;
		}else if(b>g){
			h=(g-b)/dif*60+360;
		}else{
			h=(g-b)/dif*60;
		}
		if(h<0){
			h=h+360;
		}
	}else{ h=0; }
	h*=255/360;

	//Saturation:
	s=(dif/max)*255;

	//Value:
	v=max;

	return(new Array(h,s,v));
}


//10→16進法二桁
function format16(n){
	n = Number(n).toString(16);
	if(n.length<2){ n='0'+n; }
	return(n);
}
