// CLASS
function HsvColour (newH, newS, newV) 
{
this.H = newH;
this.S = newS;
this.V = newV;
}


// CLASS
function RgbColour (newR, newG, newB) 
{
this.R = newR;
this.G = newG;
this.B = newB;
}


function HSV_to_RGB (inHSV)
{
	var R, G, B;
	
	if (inHSV.S == 0)                       //HSV values = From 0 to 1
	{
		R = inHSV.V * 255;                      //RGB results = From 0 to 255
		G = inHSV.V * 255;
		B = inHSV.V * 255;
	}
	else
	{
		var var_h = inHSV.H * 6;
		var var_i = Math.floor(var_h);             //Or ... var_i = floor( var_h )
		var var_1 = inHSV.V * ( 1 - inHSV.S );
		var var_2 = inHSV.V * ( 1 - inHSV.S * ( var_h - var_i ) );
		var var_3 = inHSV.V * ( 1 - inHSV.S * ( 1 - ( var_h - var_i ) ) );

		if (var_i == 0) 
		{ 
			var_r = inHSV.V; 
			var_g = var_3;
			var_b = var_1;
		}
		else if (var_i == 1) 
		{ 
			var_r = var_2; 
			var_g = inHSV.V;
			var_b = var_1;
		}
		else if (var_i == 2) 
		{ 
			var_r = var_1; 
			var_g = inHSV.V; 
			var_b = var_3;
		}
		else if (var_i == 3) 
		{ 
			var_r = var_1; 
			var_g = var_2; 
			var_b = inHSV.V;
		}
		else if (var_i == 4)
		{ 
			var_r = var_3; 
			var_g = var_1; 
			var_b = inHSV.V;    
		}
		else
		{ 
			var_r = inHSV.V; 
			var_g = var_1; 
			var_b = var_2;
		}
		
		R = Math.round(var_r * 255);                  //RGB results = From 0 to 255
		G = Math.round(var_g * 255);
		B = Math.round(var_b * 255);
	}
	
	//
	// return RGB
	//
	return new RgbColour(R, G, B);
}



function RGB_to_HSV (inRGB)
{
	var newHSV = new HsvColour(0,0,0);
	
	var var_R = (inRGB.R / 255);                     //RGB values = From 0 to 255
	var var_G = (inRGB.G / 255);
	var var_B = (inRGB.B / 255);

	var var_Min = Math.min(var_R, var_G, var_B);    //Min. value of RGB
	var var_Max = Math.max(var_R, var_G, var_B);    //Max. value of RGB
	var del_Max = var_Max - var_Min;				//Delta RGB value 

	newHSV.V = var_Max;

	if ( del_Max == 0 )                     //This is a gray, no chroma...
	{
		newHSV.H = 0;                                //HSV results = From 0 to 1
		newHSV.S = 0;
	}
	else                                    //Chromatic data...
	{
		newHSV.S = del_Max / var_Max;

		var del_R = (((var_Max - var_R) / 6) + (del_Max / 2)) / del_Max;
		var del_G = (((var_Max - var_G) / 6) + (del_Max / 2)) / del_Max;
		var del_B = (((var_Max - var_B) / 6) + (del_Max / 2)) / del_Max;

		if (var_R == var_Max) newHSV.H = del_B - del_G;
		else if (var_G == var_Max) newHSV.H = (1 / 3) + del_R - del_B;
		else if (var_B == var_Max) newHSV.H = (2 / 3) + del_G - del_R;

		if (newHSV.H < 0) ; newHSV.H += 1;
		if (newHSV.H > 1) ; newHSV.H -= 1;
	}

	return newHSV;
}



function HSV_to_Html (inHSV)
{
	var newRgbColour = HSV_to_RGB(inHSV);
	return RGB_to_Html(newRgbColour);
}


function RGB_to_Html (inRGB)
{
	return Base10_to_Hexidecimal(inRGB.R) +  Base10_to_Hexidecimal(inRGB.G) +  Base10_to_Hexidecimal(inRGB.B);
}



function Base10_to_Hexidecimal (inDec)
{
	var HexDigits = new Array ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
	
	if (inDec > 254) return "ff";
	else return "" + HexDigits[Math.floor(inDec/16)] + HexDigits[Math.floor(inDec % 16)];
}


function HTML_to_RGB (htmlString)
{
	if (htmlString.length == 6)
	{
		var newRGB = new RgbColour(0,0,0);
		newRGB.R = Hexidecimal_to_Base10(htmlString.substring(0,2));
		newRGB.G = Hexidecimal_to_Base10(htmlString.substring(2,4));
		newRGB.B = Hexidecimal_to_Base10(htmlString.substring(4,6));
		
		return newRGB;	
	}
	else
	{
		// set white
		return new RgbColour(255,255,255);
	}
}


function Hexidecimal_to_Base10 (inHex)
{
	var HexDigits = new Array ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
	
	var outputInt = 0;
	
	for (i=0; i<HexDigits.length; i++)
	{
		if (inHex.charAt(0) == HexDigits[i]) outputInt = (i*16);
	}
	
	for (i=0; i<HexDigits.length; i++)
	{
		if (inHex.charAt(1) == HexDigits[i]) outputInt += i;
	}
	
	return outputInt;
}

 
 

