<!DOCTYPE html>
<html lang="en"><head>
<meta charset="utf-8">
<title>ColdFusion HeatColor UDF Demo</title>
<link rel="STYLESHEET" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.32.0/css/theme.blue.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.tablesorter/2.32.0/js/jquery.tablesorter.min.js"></script>
<script>
$(function(){
	$('#myTable').tablesorter();
});
</script>
<!--- 2024-09-24 ColdFusion HeatColor UDF Demo
GIST: https://gist.github.com/JamoCA/3220867aaa5e56917221c07d0dadfdd4
BLOG: https://dev.to/gamesover/heatcolor-udf-based-on-jquery-library-d5c
TWEET: https://x.com/gamesover/status/1839035629218443300
--->
</head>

<body>

	<h1>ColdFusion HeatColor UDF Demo</h1>

	<p>Inspired by the <a href="https://github.com/joshuanathanson/jquery-heatcolor">jQuery-heatcolor</a> library.</p>

	<cfscript>
	public string function heatColor(numeric num, numeric minVal=1, numeric maxVal=100, string colorStyle="greentored", numeric lightness=0, boolean reverseOrder=false) output=false hint="Generates heat colors based on min, max & current values" {
		local.x = 0;
		local.shft = 0;
		local.position = 0;
		if (arguments.reverseOrder){
			local.x = arguments.minVal;
			arguments.minVal = arguments.maxVal;
			arguments.maxVal = local.x;
		}
		arguments.lightness = (arguments.lightness gte 0 && arguments.lightness lt 1) ? arguments.lightness : 0;
		local.position = (arguments.num - arguments.minVal) / (arguments.maxVal - arguments.minVal);
		if (arguments.colorStyle eq 'roygbiv') {
			local.shft = 0.5*local.position + 1.7*(1-local.position);
		} else {
			local.shft = local.position + 0.2 + 5.5*(1-local.position);
		}
		local.x = local.shft + local.position * (2*pi());
		if (arguments.colorStyle neq 'roygbiv') local.x = local.x * -1;
		local.r = int((cos(local.x) + 1) * 128);
		local.r = ucase(formatbasen(int(local.r + arguments.lightness * (256 - local.r)),16));
		if (len(local.r) eq 1) local.r = "0" & local.r;
		local.g = int((cos(local.x+pi()/2) + 1) * 128);
		local.g = ucase(formatbasen(int(local.g + arguments.lightness * (256 - local.g)),16));
		if (len(local.g) eq 1) local.g = "0" & local.g;
		local.b = int((cos(local.x+pi()) + 1) * 128);
		local.b = ucase(formatbasen(int(local.b + arguments.lightness * (256 - local.b)),16));
		if (len(local.b) eq 1) local.b = "0" & local.b;
		return '##' & local.r & local.g & local.b;
	}

	// pre-configuration
	colorStyle = "greentored"; // Use "greentored" or "roygbiv"
	lightness = 0;
	reverseOrder = false;

	</cfscript>


	<table id="myTable" class="tablesorter-blue">
		<thead>
			<tr><th>Row</th><th>Count</th><th>Sum</th><th>Avg</th></tr>
		</thead>
		<tbody>
			<cfoutput>
				<cfloop from="1" to="15" index="thisRow">
					<cfset C = randrange(20,300)>
					<cfset S = randrange(200,3000)>
					<cfset A = numberformat((S/C)*100, "999.00")>
					<tr>
						<td>#ThisRow#</td>
						<td style="background-color:#heatColor(C, 20, 300, colorStyle, lightness, reverseOrder)#">#C#</td>
						<td style="background-color:#heatColor(S, 200, 3000, colorStyle, lightness, reverseOrder)#">#S#</td>
						<td style="background-color:#heatColor(A, 100, 15000, colorStyle, lightness, reverseOrder)#">#A#</td>
					</tr>
				</cfloop>
			</cfoutput>
		</tbody>
	</table>

</body>
</html>