/
utils.js
161 lines (137 loc) · 3.86 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// From http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
(function($)
{
$.QueryString = (function(a) {
if (a == "") return {};
let b = {};
for (let i = 0; i < a.length; ++i)
{
const p=a[i].split('=');
if (p.length != 2) continue;
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
return b;
})(window.location.search.substr(1).split('&'))
})(jQuery);
/**
* Log text including the calling function name
* @param level Override to print Nth function name in stack
*/
function fun(text, level)
{
if (text == null)
text = "";
let func = arguments.callee.caller;
while (func && level > 1) {
func = func.arguments.callee.caller;
level--;
}
const name = func?.name || "?";
console.log("PURP::" + name + ": " + text)
}
// Like fun(), but log JSON objects
function funj(j, varname) {
let string = "";
if (varname)
string = varname + "=";
string += JSON.stringify(j);
fun(string, 2);
}
function log(text)
{
// Log to console
console.log(text);
// Log to our div
let elem = $("#log");
if (elem) {
let dateStr = new Date().toISOString();
elem.append(`[${dateStr}] ${text}<br/>`);
// Scroll to bottom
let dom = elem[0];
if (dom) {
dom.scrollTop = dom.scrollHeight;
}
}
}
function logj(o)
{
log(JSON.stringify(o));
}
function computeLatLonBox(lat, lon, box_meters)
{
const r_earth = 6371008; // mean radius according to IUGG
const pi = Math.PI;
let delta = box_meters / 2;
let nwlat = lat + (delta / r_earth) * (180 / pi);
let selat = lat - (delta / r_earth) * (180 / pi);
let nwlon = lon - (delta / r_earth) * (180 / pi) / Math.cos(lat * pi/180);
let selon = lon + (delta / r_earth) * (180 / pi) / Math.cos(lat * pi/180);
return {
nwlat: nwlat,
selat: selat,
nwlon: nwlon,
selon: selon,
}
}
function run_delayed(delay, func)
{
log(`Running with ${delay} ms delay: ${func}`);
setTimeout(func, delay);
}
// From https://stackoverflow.com/a/48805273/1457258
/**
* Calculates the haversine distance between point A, and B.
* @param {number[]} latlngA [lat, lng] point A
* @param {number[]} latlngB [lat, lng] point B
* @param {boolean} isMiles If we are using miles, else km.
*/
function haversineDistance([lat1, lon1], [lat2, lon2], isMiles = false)
{
const toRadian = angle => (Math.PI / 180) * angle;
const distance = (a, b) => (Math.PI / 180) * (a - b);
const RADIUS_OF_EARTH_IN_KM = 6371;
const dLat = distance(lat2, lat1);
const dLon = distance(lon2, lon1);
lat1 = toRadian(lat1);
lat2 = toRadian(lat2);
// Haversine Formula
const a =
Math.pow(Math.sin(dLat / 2), 2) +
Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);
const c = 2 * Math.asin(Math.sqrt(a));
let finalDistance = RADIUS_OF_EARTH_IN_KM * c;
if (isMiles) {
finalDistance /= 1.60934;
}
return finalDistance;
}
function none(v)
{
return v === null || v === undefined;
}
function fahrenheitToColor(temp)
{
// Our temp range is 0(cold)..120(hot) fahrenheit
// Our hue range is 300(cold)..0(hot)
temp = Math.max(0, Math.min(100, temp));
let hue = 300 - (300 * ( temp / 100 ));
return tinycolor({ h: hue, s: 1, l: .7 }).toHexString();
}
var __log_counter = 0;
const __log_counter_max = 100;
function log(...args)
{
__log_counter++;
if (__log_counter >= __log_counter_max) {
if (__log_counter == __log_counter_max) {
console.log("PURP: Too many logs, stopping");
}
return;
}
console.log(`PURP: ${args}`);
}
const SECOND = 1000;
const MINUTE = 60 * SECOND;
const HOUR = 60 * MINUTE;
const DAY = 24 * HOUR;
const WEEK = 7 * DAY;