	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);
	}

	function TemperatureToRGB(x,lower,upper) 
	{
		if (x < lower)
			x = lower;
		if (x > upper)
			x = upper;
		var w = (x - lower) / (upper - lower);
		return scaleToRGB(w) 
	}