function Adjust( colour , factor , brightness  )
{
	var	gamma=0.8;
	var	result;

	// Error check
	if (colour == 0.0) 
		return 0;
	// deterine the colour intensity
	result = 255.0 * Math.pow( colour*factor*brightness , gamma );
	// return colour level
	return result;
}



function NanometerToRGB(nanoMetres , Brightness)
{
	var	Red = 0.0;
	var Green = 0.0;
	var Blue = 0.0;
	var	Factor = 0.0;

	// Check brightness limits
	if ( Brightness > 1.0 ) 
		Brightness = 1.0;
	if ( Brightness < 0.0 ) 
		Brightness = 0.0;

	if ( (nanoMetres >= 380.0) && (nanoMetres <= 439.0) )
		{
		// Ultra-violet to blue
		Red  = -(nanoMetres - 440.0) / (440.0 - 380.0);
		Blue = 1.0;
		}
	else if ( (nanoMetres >= 440.0) && (nanoMetres <= 489.0) )
		{
		// Blue to cyan
		Green  = (nanoMetres - 440.0) / (490.0 - 440.0);
		Blue = 1.0;
		}
	else if ( (nanoMetres >= 490.0) && (nanoMetres <= 509.0) )
		{
		// Cyan to green
		Green = 1.0;
		Blue  = -(nanoMetres - 510.0) / (510.0 - 490.0);
		}
	else if ( (nanoMetres >= 510.0) && (nanoMetres <= 579.0) )
		{
		// Green to yellow-orange
		Green = 1.0;
		Red  = (nanoMetres - 510.0) / (580.0 - 510.0);
		}
	else if ( (nanoMetres >= 580.0) && (nanoMetres <= 644.0) )
		{
		// Yellow-orange to full red
		Red = 1.0;
		Green  = -(nanoMetres - 645.0) / (645.0 - 580.0);
		}
	else if ( nanoMetres >= 645.0 )
		{
		Red = 1.0;
		Green  = 0.0;
		}


	// Condition RGB according to limits of vision
	if ( (nanoMetres >= 380.0) && (nanoMetres <= 419.0) )	
		Factor = 0.3 + 0.7 * (nanoMetres - 380.0) / (420.0 - 380.0); 
	else if ( (nanoMetres >= 420.0) && (nanoMetres <= 700.0) )	
		Factor = 1.0;
	else if ( (nanoMetres >= 701.0) && (nanoMetres <= 780.0) )	
		Factor = 0.3 + 0.7 * (780.0 - nanoMetres) / (780.0 - 700.0); 
	else if ( nanoMetres >= 780.0 )
		Factor = 0.0;

	Red = Math.floor(Adjust(Red, Factor, Brightness));
	Green = Math.floor(Adjust(Green, Factor, Brightness));
	Blue = Math.floor(Adjust(Blue, Factor, Brightness));
	
	//HTML: colour is #RRGGBB with RR etc in Hex
	
	var r = "#";
	if(Red < 16)
		r += "0";
	r += Red.toString(16);

	if(Green < 16)
		r += "0";
	r += Green.toString(16);

	if(Blue < 16)
		r += "0";
	r += Blue.toString(16);

	return r; 

}

//pass in a number between 0 and 1 to get a colour between Violet and Red
function scaleToRGB(w) 
{
	return NanometerToRGB(Math.round(380.0 + (w * (645.0 - 380.0))), 1.0);
}
