diff --git a/public_html/planeObject.js b/public_html/planeObject.js
index 92ede4b..e1a01f5 100644
--- a/public_html/planeObject.js
+++ b/public_html/planeObject.js
@@ -1,5 +1,42 @@
"use strict";
+// Temporary config; this will move to config.js.
+// All color values are given as Hue (0-359) / Saturation (0-100) / Lightness (0-100)
+var ColorByAlt = {
+ // HSL for planes with unknown altitude:
+ unknown : { h: 0, s: 0, l: 40 },
+
+ // HSL for planes that are on the ground:
+ ground : { h: 120, s: 100, l: 30 },
+
+ air : {
+ // These define altitude-to-hue mappings
+ // at particular altitudes; the hue
+ // for intermediate altitudes that lie
+ // between the provided altitudes is linearly
+ // interpolated.
+ //
+ // Mappings must be provided in increasing
+ // order of altitude.
+ //
+ // Altitudes below the first entry use the
+ // hue of the first entry; altitudes above
+ // the last entry use the hue of the last
+ // entry.
+ h: [ { alt: 2000, val: 20 }, // orange
+ { alt: 10000, val: 140 }, // light green
+ { alt: 40000, val: 300 } ], // magenta
+ s: 85,
+ l: 50,
+ },
+
+ // Changes added to the color of the currently selected plane
+ selected : { h: 0, s: 0, l: +10 },
+
+ // Changes added to the color of planes that have stale position info
+ stale : { h: 0, s: 0, l: +30 }
+};
+
var PlaneSvg = "M 0,0 " +
"M 1.9565564,41.694305 C 1.7174505,40.497708 1.6419973,38.448747 " +
"1.8096508,37.70494 1.8936398,37.332056 2.0796653,36.88191 2.222907,36.70461 " +
@@ -185,22 +222,72 @@ PlaneObject.prototype.clearLines = function() {
}
};
-PlaneObject.prototype.updateIcon = function() {
- var col = MarkerColor;
-
- // If this marker is selected we should make it lighter than the rest.
- if (this.selected)
- col = SelectedColor;
-
- // If we have not seen a recent position update, change color
- if (this.seen_pos > 15)
- col = StaleColor;
-
- // If the squawk code is one of the international emergency codes,
- // match the info window alert color.
+PlaneObject.prototype.getMarkerColor = function() {
+ // Emergency squawks override everything else
if (this.squawk in SpecialSquawks)
- col = SpecialSquawks[this.squawk].markerColor;
-
+ return SpecialSquawks[this.squawk].markerColor;
+
+ var h, s, l;
+
+ if (this.altitude === null) {
+ h = ColorByAlt.unknown.h;
+ s = ColorByAlt.unknown.s;
+ l = ColorByAlt.unknown.l;
+ } else if (this.altitude === "ground") {
+ h = ColorByAlt.ground.h;
+ s = ColorByAlt.ground.s;
+ l = ColorByAlt.ground.l;
+ } else {
+ s = ColorByAlt.air.s;
+ l = ColorByAlt.air.l;
+
+ // find the pair of points the current altitude lies between,
+ // and interpolate the hue between those points
+ var hpoints = ColorByAlt.air.h;
+ h = hpoints[0].val;
+ for (var i = hpoints.length-1; i >= 0; --i) {
+ if (this.altitude > hpoints[i].alt) {
+ if (i == hpoints.length-1) {
+ h = hpoints[i].val;
+ } else {
+ h = hpoints[i].val + (hpoints[i+1].val - hpoints[i].val) * (this.altitude - hpoints[i].alt) / (hpoints[i+1].alt - hpoints[i].alt)
+ }
+ break;
+ }
+ }
+ }
+
+ // If we have not seen a recent position update, change color
+ if (this.seen_pos > 15) {
+ h += ColorByAlt.stale.h;
+ s += ColorByAlt.stale.s;
+ l += ColorByAlt.stale.l;
+ }
+
+ // If this marker is selected, change color
+ if (this.selected){
+ h += ColorByAlt.selected.h;
+ s += ColorByAlt.selected.s;
+ l += ColorByAlt.selected.l;
+ }
+
+ if (h < 0) {
+ h = (h % 360) + 360;
+ } else if (h >= 360) {
+ h = h % 360;
+ }
+
+ if (s < 5) s = 5;
+ else if (s > 95) s = 95;
+
+ if (l < 5) l = 5;
+ else if (l > 95) l = 95;
+
+ return 'hsl(' + h.toFixed(0) + ',' + s.toFixed(0) + '%,' + l.toFixed(0) + '%)'
+}
+
+PlaneObject.prototype.updateIcon = function() {
+ var col = this.getMarkerColor();
var weight = this.selected ? 2 : 1;
var rotation = (this.track === null ? 0 : this.track);