PageSourceSearch

https://weatherfile.com/js/wf/w_charts.js

js weatherfile.com collected 2026-10-02 11:22:00 UTC 73,079 bytes, 2,925 lines download raw bytes

1function _t(key, vars) {
2  return (window.WF && WF.i18n && typeof WF.i18n.t === "function") ? WF.i18n.t(key, vars) : key;
3}
4
5
6/* Data storage */
7var dataTableRows = [];
8var wsdataRows = [];
9var wddataRows = [];
10var humdataRows = [];
11var dewpointRows = [];
12var windchillRows = [];
13var bgtRows = [];
14var pressureRows = [];
15var rainfallRows = [];
16var rainfalldataRows = [];
17var tmpdataRows = [];
18var solRows = [];
19var fsaRows = [];
20var fdaRows = [];
21var twRows = [];
22var vltRows = [];
23var vlt2Rows = [];
24var d1Rows = [];
25var p1uRows = [];
26var p2u5Rows = [];
27var p10uRows = [];
28var co2Rows = [];
29var showPreviewGaugeMetersTick = 0;
30var dataTablePage = 1;
31var dataTablePageCount = 1;
32
33var windIconCanvas = document.createElement("canvas");
34
35/* Graph objects */
36var humDataStore;
37var humChart;
38var rainfallDataStore;
39var rainfallChart;
40var pressureDataStore;
41var pressureChart;
42var dewpointDataStore;
43var dewpointChart;
44var windchillDataStore;
45var windchillChart;
46var bgtDataStore;
47var bgtChart;
48var windSpeedDataStore;
49var wSpeedChart;
50var tempDataStore;
51var tempChart;
52var solDataStore;
53var solChart;
54
55var fsaDataStore;
56var fsaChart;
57var fdaDataStore;
58var fdaChart;
59var twDataStore;
60var twChart;
61var vltDataStore;
62var vltChart;
63var vlt2DataStore;
64var vlt2Chart;
65var d1DataStore;
66var d1Chart;
67
68var windDirectionDataStore;
69var windDirectionChart;
70var totalpt;
71
72var wslpresent = !1;
73var wshpresent = !1;
74var wsapresent = !1;
75
76var jpl;
77
78function initializeCharts() {
79  humDataStore = new google.visualization.DataTable();
80  humDataStore.addColumn("datetime", _t("chart.time"));
81  humDataStore.addColumn("number", _t("chart.relative_humidity_pct"));
82  humChart = new google.visualization.LineChart(
83    document.getElementById("hum_chart")
84  );
85
86  rainfallDataStore = new google.visualization.DataTable();
87  rainfallDataStore.addColumn("datetime", _t("chart.time"));
88  rainfallDataStore.addColumn("number", _t("chart.rainfall_mm"));
89  rainfallChart = new google.visualization.ColumnChart(
90    document.getElementById("rainfall_chart")
91  );
92
93  pressureDataStore = new google.visualization.DataTable();
94  pressureDataStore.addColumn("datetime", _t("chart.time"));
95  pressureDataStore.addColumn("number", _t("chart.pressure_hpa"));
96  pressureChart = new google.visualization.LineChart(
97    document.getElementById("pressure_chart")
98  );
99
100  dewpointDataStore = new google.visualization.DataTable();
101  dewpointDataStore.addColumn("datetime", _t("chart.time"));
102  dewpointDataStore.addColumn("number", thermalChartLegendLabel("dewpoint"));
103  dewpointChart = new google.visualization.LineChart(
104    document.getElementById("dewpoint_chart")
105  );
106
107  windchillDataStore = new google.visualization.DataTable();
108  windchillDataStore.addColumn("datetime", _t("chart.time"));
109  windchillDataStore.addColumn("number", thermalChartLegendLabel("wind_chill"));
110  windchillChart = new google.visualization.LineChart(
111    document.getElementById("windchill_chart")
112  );
113
114  bgtDataStore = new google.visualization.DataTable();
115  bgtDataStore.addColumn("datetime", _t("chart.time"));
116  bgtDataStore.addColumn("number", thermalChartLegendLabel("bgt"));
117  bgtChart = new google.visualization.LineChart(
118    document.getElementById("bgt_chart")
119  );
120
121  windSpeedDataStore = new google.visualization.DataTable();
122  windSpeedDataStore.addColumn("datetime", _t("chart.time"));
123  windSpeedDataStore.addColumn("number", _t("chart.wind_max"));
124  windSpeedDataStore.addColumn("number", _t("chart.wind_average"));
125  windSpeedDataStore.addColumn("number", _t("chart.wind_low"));
126  wSpeedChart = new google.visualization.LineChart(
127    document.getElementById("wspeed_chart")
128  );
129
130  tempDataStore = new google.visualization.DataTable();
131  tempDataStore.addColumn("datetime", _t("chart.time"));
132  tempDataStore.addColumn("number", thermalChartLegendLabel("temperature"));
133  tempChart = new google.visualization.LineChart(
134    document.getElementById("temperature_chart")
135  );
136
137  solDataStore = new google.visualization.DataTable();
138  solDataStore.addColumn("datetime", _t("chart.time"));
139  solDataStore.addColumn("number", _t("chart.solar_wm2"));
140  solChart = new google.visualization.LineChart(
141    document.getElementById("sol_chart")
142  );
143
144  fsaDataStore = new google.visualization.DataTable();
145  fsaDataStore.addColumn("datetime", _t("chart.time"));
146  fsaDataStore.addColumn("number", _t("chart.tidal_speed"));
147  fsaChart = new google.visualization.LineChart(
148    document.getElementById("fsa_chart")
149  );
150
151  fdaDataStore = new google.visualization.DataTable();
152  fdaDataStore.addColumn("datetime", _t("chart.time"));
153  fdaDataStore.addColumn("number", _t("chart.tidal_direction"));
154  fdaChart = new google.visualization.LineChart(
155    document.getElementById("fda_chart")
156  );
157
158  twDataStore = new google.visualization.DataTable();
159  twDataStore.addColumn("datetime", _t("chart.time"));
160  twDataStore.addColumn("number", _t("chart.water_temperature_celsius"));
161  twChart = new google.visualization.LineChart(
162    document.getElementById("tw_chart")
163  );
164
165  vltDataStore = new google.visualization.DataTable();
166  vltDataStore.addColumn("datetime", _t("chart.time"));
167  vltDataStore.addColumn("number", _t("chart.sensor_voltage"));
168  vltChart = new google.visualization.LineChart(
169    document.getElementById("vlt_chart")
170  );
171
172  vlt2DataStore = new google.visualization.DataTable();
173  vlt2DataStore.addColumn("datetime", _t("chart.time"));
174  vlt2DataStore.addColumn("number", _t("chart.wcu_voltage"));
175  vlt2Chart = new google.visualization.LineChart(
176    document.getElementById("vlt2_chart")
177  );
178
179  d1DataStore = new google.visualization.DataTable();
180  d1DataStore.addColumn("datetime", _t("chart.time"));
181  d1DataStore.addColumn("number", _t("chart.rain_bucket_mm"));
182  d1Chart = new google.visualization.ColumnChart(
183    document.getElementById("d1_chart")
184  );
185
186  windDirectionDataStore = new google.visualization.DataTable();
187  windDirectionDataStore.addColumn("datetime", _t("chart.time"));
188  windDirectionDataStore.addColumn("number", _t("chart.wind_direction_average"));
189  windDirectionChart = new google.visualization.LineChart(
190    document.getElementById("wdirection_chart")
191  );
192}
193
194$(window).resize(function () {
195  debouncedDrawCharts();
196});
197
198function debounce(func, wait, immediate) {
199  var timeout;
200  return function () {
201    var context = this,
202      args = arguments;
203    var later = function () {
204      timeout = null;
205      if (!immediate) func.apply(context, args);
206    };
207    var callNow = immediate && !timeout;
208    clearTimeout(timeout);
209    timeout = setTimeout(later, wait);
210    if (callNow) func.apply(context, args);
211  };
212}
213var debouncedWindSpeedChart = debounce(function () {
214  if (wsdataRows.length > 0) {
215  }
216}, 250);
217var debouncedWindDirectionChart = debounce(function () {
218  if (wddataRows.length > 0) {
219  }
220}, 250);
221var debouncedDrawCharts = debounce(function () {
222  drawCharts();
223}, 250);
224
225function updateCurrentWind() { }
226
227function drawCharts() {
228  console.log("Drawcharts()");
229  if (gC("wf_windspeedchart") === "on") {
230    // console.log("Windspeedcharr is on");
231    if (wsdataRows.length > 0) {
232      drawWindSpeedChart();
233    }
234  } else {
235    // console.log("Windspeedcharr is off");
236  }
237  if (gC("wf_temperaturechart") === "on") {
238    if (tmpdataRows.length > 0) {
239      drawTemperatureChart();
240    }
241  }
242  if (gC("wf_winddirectionchart") === "on") {
243    if (wddataRows.length > 0) {
244      drawWindDirectionChart();
245    }
246  }
247  if (gC("wf_humiditychart") === "on") {
248    if (humdataRows.length > 0) {
249      drawHumChart();
250    }
251  }
252  if (gC("wf_dewpointchart") === "on") {
253    if (dewpointRows.length > 0) {
254      drawDewpointChart();
255    }
256  }
257  if (gC("wf_windchillchart") === "on") {
258    if (windchillRows.length > 0) {
259      drawWindchillChart();
260    }
261  }
262  if (gC("wf_bgtchart") === "on") {
263    if (bgtRows.length > 0) {
264      drawBgtChart();
265    }
266  }
267  if (gC("wf_pressurechart") === "on") {
268    if (pressureRows.length > 0) {
269      drawPressureChart();
270    }
271  }
272  // console.log("checking rainfall");
273  // console.log(gC('wf_rainfallchart'));
274  // console.log("length of rainfall data rows"+rainfallRows.length);
275  if (gC("wf_rainfallchart") === "on") {
276    if (rainfallRows.length > 0) {
277      // console.log("There is rainfrall data so we're going to draw the rainfall chart");
278      drawRainfallChart();
279    }
280  } else {
281    // console.log("Rainfall chart switched off");
282  }
283
284  // console.log("checking solar");
285  // console.log(gC('wf_solarchart'));
286  if (gC("wf_solarchart") === "on") {
287    if (solRows.length > 0) {
288      drawSolChart();
289      // console.log("There is Solar data so we're going to draw the Solar chart");
290    }
291  } else {
292    console.log("Solar chart switched off");
293    $("#sol_chart").hide();
294  }
295
296  if (d1Rows.length > 0) {
297    drawd1Chart();
298  }
299
300  if (solRows.length > 0) {
301    drawSolChart();
302  }
303
304  if (fsaRows.length > 0) {
305    drawFsaChart();
306  }
307  if (twRows.length > 0) {
308    drawTwChart();
309  }
310  if (fdaRows.length > 0) {
311    drawFdaChart();
312  }
313
314  if (vltRows.length > 0 && wf_user_token != "PUBLIC") {
315    drawVltChart();
316  }
317
318  if (vlt2Rows.length > 0 && wf_user_token != "PUBLIC") {
319    drawVlt2Chart();
320  }
321
322  // dont draw AQ graphs
323  // if (p2u5Rows.length > 0) {
324  //         drawP1uChart();
325  // }
326  //     if (p1uRows.length > 0) {
327  //     drawP2u5Chart();
328  // }
329  //     if (p10uRows.length > 0) {
330  //     drawP10uChart();
331  // }
332  //     if (co2Rows.length > 0) {
333  //         console.log("co2 rows length = " + co2Rows.length);
334  //     drawco2Chart();
335  // }
336}
337
338function wumult(inunits) {
339  switch (inunits.toUpperCase()) {
340    case "MPH":
341      return 2.23693629;
342      break;
343    case "KTS":
344      return 1.94384449;
345      break;
346    case "KPH":
347      return 3.6;
348      break;
349    default:
350      return 1;
351  }
352}
353
354function classicGetCookie(cname) {
355  // default to cookie
356  var name = cname + "=";
357  var ca = document.cookie.split(";");
358  for (var i = 0; i < ca.length; i++) {
359    var c = ca[i];
360    while (c.charAt(0) === " ") c = c.substring(1);
361    if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
362  }
363  return "";
364}
365
366var PREFERENCE_DEFAULTS = {
367  wf_wunits: "mps",
368  wf_timezone: "LCL",
369  wf_theme: "classicblue",
370  wf_tempunits: "celsius",
371  wf_suppress_public: "false",
372  wf_windspeedchart: "on",
373  wf_winddirectionchart: "on",
374  wf_pressurechart: "on",
375  wf_temperaturechart: "on",
376  wf_dewpointchart: "on",
377  wf_windchillchart: "on",
378  wf_bgtchart: "on",
379  wf_humiditychart: "on",
380  wf_rainfallchart: "on",
381  wf_solarchart: "on",
382  wf_datatable: "on",
383  wf_custom_scale: "",
384};
385
386function preferenceDefault(cname) {
387  if (Object.prototype.hasOwnProperty.call(PREFERENCE_DEFAULTS, cname)) {
388    return PREFERENCE_DEFAULTS[cname];
389  }
390  return "";
391}
392
393function gC(cname) {
394  if (
395    window.WFConsent &&
396    typeof WFConsent.isPreferenceStorageKey === "function" &&
397    WFConsent.isPreferenceStorageKey(cname) &&
398    typeof WFConsent.shouldBlockPreferencesRead === "function" &&
399    WFConsent.shouldBlockPreferencesRead()
400  ) {
401    return preferenceDefault(cname);
402  }
403  if (localStorageTest()) {
404    var c = localStorage.getItem(cname);
405    if (c == "" || c == null || c == undefined) {
406      return classicGetCookie(cname);
407    } else {
408      return c;
409    }
410  } else {
411    return classicGetCookie(cname);
412  }
413}
414
415function sC(cname, cvalue, exdays) {
416  if (window.WFConsent && window.WFConsent.shouldBlockFunctionalWrite()) {
417    return false;
418  }
419  if (localStorageTest()) {
420    localStorage.setItem(cname, cvalue);
421  } else {
422    // default to cookie if ls is not avail
423    var d = new Date();
424    d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);
425    var expires = "expires=" + d.toUTCString();
426    document.cookie = cname + "=" + cvalue + "; " + expires;
427  }
428  return true;
429}
430
431/*
432 * function body that test if storage is available
433 * returns true if localStorage is available and false if it's not
434 */
435function localStorageTest() {
436  var test = "test";
437  try {
438    localStorage.setItem(test, test);
439    localStorage.removeItem(test);
440    return true;
441  } catch (e) {
442    return false;
443  }
444}
445
446function dataTableThermalUnitHtml() {
447  return gC("wf_tempunits") == "fhr" ? "&deg;F" : "&deg;C";
448}
449
450/** Table + chart row arrays store API °C; convert for current wf_tempunits. */
451function displayTempNumberFromCelsius(value) {
452  if (!isValid(value)) {
453    return NaN;
454  }
455  var n = parseFloat(value);
456  if (isNaN(n)) {
457    return NaN;
458  }
459  if (gC("wf_tempunits") == "fhr") {
460    return (n * 9) / 5 + 32;
461  }
462  return n;
463}
464
465function formatDataTableCelsiusCell(value) {
466  var n = displayTempNumberFromCelsius(value);
467  if (isNaN(n)) {
468    return "";
469  }
470  return n.toFixed(1);
471}
472
473function thermalRowsForDisplayChart(rows) {
474  var mapped = [];
475  for (var r = 0; r < rows.length; r++) {
476    var tm = rows[r][0];
477    var y = rows[r][1];
478    if (!isValid(y)) {
479      mapped.push([tm, null]);
480      continue;
481    }
482    var dn = displayTempNumberFromCelsius(y);
483    mapped.push([tm, isNaN(dn) ? null : dn]);
484  }
485  return mapped;
486}
487
488/** Google Charts legend text; recomputed each draw so it tracks wf_tempunits. */
489function thermalChartLegendLabel(metricKey) {
490  var fhr = gC("wf_tempunits") == "fhr";
491  return _t("chart." + metricKey + "_" + (fhr ? "fahrenheit" : "celsius"));
492}
493
494function clearCharts() {
495  // dont remove the object
496  // $("#wspeed_chart").html("&nbsp;");
497  // $("#wdirection_chart").html("&nbsp;");
498  // $("#temperature_chart").html("&nbsp;");
499  // $("#dewpoint_chart").html("&nbsp;");
500  // $("#pressure_chart").html("&nbsp;");
501  // $("#hum_chart").html("&nbsp;");
502  // $("#rainfall_chart").html("&nbsp;")
503  // $("#p1u_chart").html("&nbsp;");
504  // $("#p2u5_chart").html("&nbsp;");
505  // $("#p10u_chart").html("&nbsp;");
506  // $("#co2_chart").html("&nbsp;");
507  // clear it!
508  if (humChart) humChart.clearChart();
509  if (tempChart) tempChart.clearChart();
510  if (dewpointChart) dewpointChart.clearChart();
511  if (windchillChart) windchillChart.clearChart();
512  if (bgtChart) bgtChart.clearChart();
513  if (pressureChart) pressureChart.clearChart();
514  if (windDirectionChart) windDirectionChart.clearChart();
515  if (wSpeedChart) wSpeedChart.clearChart();
516  if (solChart) solChart.clearChart();
517  if (rainfallChart) rainfallChart.clearChart();
518  if (fsaChart) fsaChart.clearChart();
519  if (fdaChart) fdaChart.clearChart();
520  if (twChart) twChart.clearChart();
521  if (vltChart) vltChart.clearChart();
522  if (vlt2Chart) vlt2Chart.clearChart();
523  if (d1Chart) d1Chart.clearChart();
524}
525
526function tstodate(ts) {
527  var yr = parseInt(ts.substring(0, 4));
528  var mo = parseInt(ts.substring(5, 7)) - 1;
529  var dy = parseInt(ts.substring(8, 10));
530  var hr = parseInt(ts.substring(11, 13));
531  var mn = parseInt(ts.substring(14, 16));
532  var se = parseInt(ts.substring(17, 19));
533  d = new Date(yr, mo, dy, hr, mn, se);
534  return d;
535}
536
537function showLatestAverageTime() {
538  if (isValid(jpl["data"]) && jpl["data"].length > 0) {
539    var last = jpl["data"][jpl["data"].length - 1];
540    $("#averages_meters_time")
541      .text(
542        utcSecondsToTime(last["ts"]) +
543        " " +
544        todayOrYesterday(last["ts"], last["date"])
545      )
546      .css({ color: "white", "font-weight": "bold" });
547    $("#averages_meters_time").show();
548  }
549}
550
551function processAverages(loc_id, data, onComplete) {
552  dataTablePage = 1;
553  dataTableRows = [];
554  wsdataRows = [];
555  wddataRows = [];
556  humdataRows = [];
557  rainfalldataRows = [];
558  dewpointRows = [];
559  windchillRows = [];
560  bgtRows = [];
561  pressureRows = [];
562  tmpdataRows = [];
563  rainfallRows = [];
564  p1uRows = [];
565  p2u5Rows = [];
566  p10uRows = [];
567  co2Rows = [];
568  solRows = [];
569  fsaRows = [];
570  fdaRows = [];
571  twRows = [];
572  vltRows = [];
573  vlt2Rows = [];
574  d1Rows = [];
575
576  totalpt = 0;
577
578  console.log("Processing Averages into respective tables.");
579
580  jpl = JSON.parse(data);
581  if (jpl.data && jpl.data !== null) {
582    var td = jpl.data;
583    var wm = wumult(wunits);
584    var tz = gC("wf_timezone");
585    // console.log("td len:", td.length);
586    for (i = 0; i < td.length; i++) {
587      var rdate = new Date(tstodate(td[i].ts));
588
589      if (tz === "LCL") {
590        rdate = new Date(rdate - rdate.getTimezoneOffset() * 60000);
591      }
592
593      var wsl = "";
594      var wsa = "";
595      var wsh = "";
596      var wda = "";
597      var wdb = "";
598      var wda = "";
599      var wdv = "";
600      var hpa = "";
601      var hum = "";
602      var tmp = "";
603      var dew = "";
604      var wcVal = "";
605      var bgtVal = "";
606      var pt = "";
607      var fsa = "";
608      var fda = "";
609      var tw = "";
610      var vlt = "";
611      var vlt2 = "";
612      var d1 = "";
613      var p1u = "";
614      var p2u5 = "";
615      var p10u = "";
616      var co2 = "";
617      var novalue = "0";
618      var sol = "";
619
620      if (isValid(td[i].wsh) || isValid(td[i].wsa) || isValid(td[i].wsl)) {
621        if (wunits == "bft") {
622          wsh = getBeaufortFromMs(td[i].wsh);
623          // wsh = td[i].wsh ? getBeaufortFromMs(td[i].wsh) : null;
624          wsa = getBeaufortFromMs(td[i].wsa);
625          // wsl = td[i].wsl ? getBeaufortFromMs(td[i].wsl) : null;
626          wsl = getBeaufortFromMs(td[i].wsl);
627        } else {
628          wsh = td[i].wsh * wm;
629          // wsh = td[i].wsh ? td[i].wsh * wm : null;
630          wsa = td[i].wsa * wm;
631          wsl = td[i].wsl * wm;
632          // wsl = td[i].wsl ? td[i].wsl * wm : null;
633        }
634        wsdataRows.push([
635          rdate,
636          isValid(td[i].wsh) ? wsh : null,
637          isValid(td[i].wsa) ? wsa : null,
638          isValid(td[i].wsl) ? wsl : null,
639        ]);
640      }
641      if (isValid(td[i].wda)) {
642        wda = td[i].wda;
643        wddataRows.push([rdate, wda]);
644      }
645      if (isValid(td[i].wdb)) {
646        wdb = td[i].wdb;
647      }
648      if (isValid(td[i].wdv)) {
649        wdv = td[i].wdv;
650      }
651      if (isValid(td[i].hpa)) {
652        hpa = td[i].hpa;
653        pressureRows.push([rdate, hpa]);
654      }
655      if (isValid(td[i].hum) && !(currentLocation == "GBR00134")) {
656        hum = td[i].hum;
657        humdataRows.push([rdate, hum]);
658      }
659
660      if (isValid(td[i].ta) && !(currentLocation == "GBR00134")) {
661        tmp = td[i].ta;
662        tmpdataRows.push([rdate, tmp]);
663      }
664      if (isValid(td[i].td) && !(currentLocation == "GBR00134")) {
665        dew = td[i].td;
666        dewpointRows.push([rdate, dew]);
667      }
668      if (isValid(td[i].wc) && !(currentLocation == "GBR00134")) {
669        wcVal = td[i].wc;
670        windchillRows.push([rdate, wcVal]);
671      }
672      if (isValid(td[i].bgt) && !(currentLocation == "GBR00134")) {
673        bgtVal = td[i].bgt;
674        bgtRows.push([rdate, bgtVal]);
675      }
676      if (isValid(td[i].pt)) {
677        pt = td[i].pt;
678        rainfallRows.push([rdate, pt]);
679        totalpt += parseFloat(pt);
680      }
681      if (isValid(td[i].sol)) {
682        sol = td[i].sol;
683        solRows.push([rdate, sol]);
684      }
685      if (isValid(td[i].fsa)) {
686        if (wunits == "bft") {
687          fsa = getBeaufortFromMs(td[i].fsa);
688        } else {
689          fsa = td[i].fsa * wm;
690        }
691        fsaRows.push([rdate, fsa]);
692      }
693      if (isValid(td[i].fda)) {
694        fda = td[i].fda;
695        fdaRows.push([rdate, fda]);
696      }
697      if (isValid(td[i].tw)) {
698        tw = td[i].tw;
699        twRows.push([rdate, tw]);
700      }
701      if (isValid(td[i].vlt)) {
702        vlt = td[i].vlt;
703        vltRows.push([rdate, vlt]);
704      }
705      if (isValid(td[i].vlt2)) {
706        vlt2 = td[i].vlt2;
707        vlt2Rows.push([rdate, vlt2]);
708      }
709      if (isValid(td[i].d1)) {
710        d1 = td[i].d1;
711        d1Rows.push([rdate, d1]);
712      }
713      dataTableRows.push([
714        rdate,
715        wsl,
716        wsa,
717        wsh,
718        isValid(wda) ? wda : null,
719        isValid(wdb) ? wdb : null,
720        isValid(wdv) ? wdv : null,
721        tmp,
722        hpa,
723        hum,
724        dew,
725        pt,
726        sol,
727        fsa,
728        fda,
729        tw,
730        vlt,
731        d1,
732        vlt2,
733        wcVal,
734        bgtVal,
735      ]);
736    }
737  }
738  onComplete();
739}
740
741function getAverageData(loc_id, params) {
742  /* Check if charts is loaded if not wait till it is */
743
744  var formData = params;
745  if (params === "" || params === null || params === undefined) {
746    try {
747      formData =
748        (typeof gC === "function" ? gC("wf_timezone") : null) === "LCL"
749          ? { start_ts: getLocaltime_sinceMidnight() }
750          : "";
751    } catch (e) {
752      formData = "";
753    }
754  }
755
756  var cf = use_cache_flag ? server_cache_api_url : server_api_url;
757
758  var targeturl =
759    cf + "/" + server_api_version + "/loc/" + loc_id + "/averages.json";
760  $("#nodatamessage").hide();
761  $("#nolatestdatamessage").hide();
762  $("#hurstxmas").hide();
763  var onProcessDataComplete = function () {
764    // console.log("Running onProcessDataComplete");
765    showLatestAverageTime();
766    liveWind();
767    showPreviewGaugeMeters();
768    genCharts();
769  };
770  $.ajax({
771    type: "POST",
772    url: targeturl,
773    data: formData,
774    headers: {
775      "wf-tkn": wf_user_token,
776    },
777    success: function (data) {
778      processAverages(loc_id, data, onProcessDataComplete);
779    },
780  });
781}
782
783function genCharts() {
784  if (!CHARTS_LOADED) {
785    googleChartsLoaded = function () {
786      CHARTS_LOADED = true;
787      initializeCharts();
788      if (typeof setupDelayGraph === "function") {
789        setupDelayGraph();
790      }
791      genCharts();
792    };
793    google.charts.load("current", {
794      packages: ["corechart"],
795    });
796    google.charts.setOnLoadCallback(googleChartsLoaded);
797    return;
798  }
799  if (!dataTableRows.length || dataTableRows.length == 0) {
800    console.log("Showing Error msg");
801    locationHasAverages = false;
802    console.log("Current Location " + currentLocation);
803
804    if (currentLocation == "GBR00005" || currentLocation == "GBR00006") {
805      $("#nodatamessage").hide();
806      $("#dialcontainer3").hide();
807      $("#portdevelopment").show();
808      $("#hurstcorona").hide();
809    } else if (currentLocation == "GBR00002") {
810      $("#nodatamessage").hide();
811      $("#dialcontainer3").hide();
812      $("#hurstcorona").show();
813    } else {
814      $("#nodatamessage").show();
815      $("#dialcontainer3").hide();
816      $("#portdevelopment").hide();
817      $("#hurstcorona").hide();
818    }
819
820    $("#spacer").show();
821    $("#load_ads_3").show();
822    $("#averages_meters").removeClass("is-visible");
823    $("#latest_meters").removeClass("is-visible");
824    $("#meters_banner").hide();
825    $("#dialcontainer1").hide();
826    $("#dialcontainer2").hide();
827    //			$("#simplebluegauge").hide();
828    $("#wspeed_chart").hide();
829    $("#wdirection_chart").hide();
830    $("#temperature_chart").hide();
831    $("#dewpoint_chart").hide();
832    $("#windchill_chart").hide();
833    $("#bgt_chart").hide();
834    $("#pressure_chart").hide();
835    $("#hum_chart").hide();
836    $("#rainfall_chart").hide();
837    $("#p1u_chart").hide();
838    $("#p2u5_chart").hide();
839    $("#p10u_chart").hide();
840    $("#sol_chart").hide();
841    $("#fsa_chart").hide();
842    $("#fda_chart").hide();
843    $("#tw_chart").hide();
844    $("#vlt_chart").hide();
845    $("#vlt2_chart").hide();
846    $("#d1_chart").hide();
847    $("#co2_chart").hide();
848    $("#load_ads_2").hide();
849    $("#data_table").hide();
850    $("#data_table_nav").hide();
851    $("#data_table_nav_2").hide();
852
853    return;
854  } else {
855    locationHasAverages = true;
856    $("#yarmouthdevelopment").hide();
857    $("#portdevelopment").hide();
858    $("#hurstcorona").hide();
859
860    // sC("wf_theme", "classicblue");
861    if (gC("wf_theme") == "classicblue") {
862      // meters visibility is owned by latestDataCheck()
863      $("#dialcontainer1").hide();
864      $("#dialcontainer2").hide();
865      $("#dialcontainer3").hide();
866      $("#simplebluegauge").hide();
867      console.log("** Showing classicblue **");
868      //			} else if (gC("wf_theme") == "simplebluegauge") {
869      //				$("#simplebluegauge").show()
870      //				$("#averages_meters").hide()
871      //				$("#latest_meters").hide()
872      //				$("#dialcontainer1").hide()
873      //				$("#dialcontainer2").hide()
874      //				console.log("Showing simplebluegauge");
875    } else if (gC("wf_theme") == "greydials") {
876      $("#averages_meters").removeClass("is-visible");
877      $("#latest_meters").removeClass("is-visible");
878      $("#meters_banner").hide();
879      $("#dialcontainer1").show();
880
881      // Greydials second row: show when any temperature-series metric is present
882      if (
883        tmpdataRows.length === 0 &&
884        dewpointRows.length === 0 &&
885        windchillRows.length === 0 &&
886        bgtRows.length === 0
887      ) {
888        $("#dialcontainer2").hide();
889        // console.log("Hiding ... Dial Container 2 ... Temp not detected");
890        // console.log("Temperature ... " + dataTableRows[0][7]);
891      } else {
892        $("#dialcontainer2").show();
893        // console.log("Loading ... Dial Container 2 ... Temp detected");
894        // console.log("Temperature ... " + dataTableRows[0][7]);
895      }
896
897      $("#dialcontainer3").show();
898      $("#simplebluegauge").hide();
899      console.log("** Showing greydials **");
900    } else {
901      // Default is classicblue
902      // meters visibility is owned by latestDataCheck()
903      $("#dialcontainer1").hide();
904      $("#dialcontainer2").hide();
905      $("#dialcontainer3").hide();
906      $("#simplebluegauge").hide();
907      console.log("** Defaulting to classicblue **");
908    }
909
910    if (typeof latestDataCheck === "function") {
911      latestDataCheck();
912    }
913
914    $("#wspeed_chart").show();
915    $("#wdirection_chart").show();
916    if (tmpdataRows.length == 0) {
917      $("#temperature_chart").hide();
918    } else {
919      $("#temperature_chart").show();
920    }
921    if (dewpointRows.length == 0) {
922      $("#dewpoint_chart").hide();
923    } else {
924      $("#dewpoint_chart").show();
925    }
926    if (windchillRows.length == 0) {
927      $("#windchill_chart").hide();
928    } else {
929      $("#windchill_chart").show();
930    }
931    if (bgtRows.length == 0) {
932      $("#bgt_chart").hide();
933    } else {
934      $("#bgt_chart").show();
935    }
936    if (pressureRows.length == 0) {
937      $("#pressure_chart").hide();
938    } else {
939      $("#pressure_chart").show();
940    }
941    if (humdataRows.length == 0) {
942      $("#hum_chart").hide();
943    } else {
944      $("#hum_chart").show();
945    }
946
947    // console.log("Rainfall data count:" + rainfallRows.length);
948    if (rainfallRows.length == 0) {
949      $("#rainfall_chart").hide();
950      // console.log("Hide Rain Chart")
951    } else {
952      $("#rainfall_chart").show();
953      // console.log("Show Rain Chart")
954    }
955
956    // console.log("D1 data count:" + d1Rows.length);
957    if (d1Rows.length == 0) {
958      $("#d1_chart").hide();
959    } else {
960      $("#d1_chart").show();
961      // console.log("Show D1 Chart")
962    }
963
964    if (solRows.length == 0) {
965      $("#sol_chart").hide();
966      // console.log("Hide Solar Chart")
967    } else {
968      $("#sol_chart").show();
969      // console.log("Show Solar Chart")
970    }
971
972    if (fsaRows.length == 0) {
973      $("#fsa_chart").hide();
974    } else {
975      $("#fsa_chart").show();
976    }
977    if (fdaRows.length == 0) {
978      $("#fda_chart").hide();
979    } else {
980      $("#fda_chart").show();
981    }
982    if (twRows.length == 0) {
983      $("#tw_chart").hide();
984    } else {
985      $("#tw_chart").show();
986    }
987    if (vltRows.length == 0) {
988      $("#vlt_chart").hide();
989      // console.log("Hide vlt Chart")
990    } else {
991      $("#vlt_chart").show();
992      // console.log("Show vlt Chart")
993    }
994    if (vlt2Rows.length == 0) {
995      $("#vlt2_chart").hide();
996      // console.log("Hide vlt2 Chart")
997    } else {
998      $("#vlt2_chart").show();
999      // console.log("Show vlt2 Chart")
1000    }
1001
1002    // console.log("p1u length = " + p1uRows.length);
1003    // console.log("p2u5 length = " + p2u5Rows.length);
1004    // console.log("p10u length = " + p10uRows.length);
1005    // console.log("co2 length = " + co2Rows.length);
1006
1007    /* Temporarily removed due to them showing up unexpectedly */
1008    // if (p1uRows.length > 0){
1009    //     $("#p1u_chart").show();
1010    // }else{
1011    //     $("#p1u_chart").hide();
1012    // }
1013    // if (p2u5Rows.length > 0){
1014    //     $("#p2u5_chart").show();
1015    // }else{
1016    //     $("#p2u5_chart").hide();
1017    // }
1018    // if (p10uRows.length > 0){
1019    //     $("#p10u_chart").show();
1020    // }else{
1021    //     $("#p10u_chart").hide();
1022    // }
1023    // if (co2Rows.length > 0){
1024    //     $("#co2_chart").show();
1025    // }else{
1026    //     $("#co2_chart").hide();
1027    // }
1028    //    liveAds(); //$("#load_ads_2").show();
1029    $("#data_table").show();
1030    $("#data_table_nav").show();
1031    $("#spacer").show();
1032    // liveAds(); //$("#load_ads_3").show();		// Remove Kutis Ads
1033    $("#data_table_nav").show();
1034    $("#data_table_nav_2").show();
1035    drawCharts();
1036    buildDataTable();
1037    //    liveAds();
1038  }
1039}
1040
1041function dateFmt(indate) {
1042  return indate;
1043}
1044
1045function getCardinal16(angle) {
1046  cardinals = [
1047    "N",
1048    "NNE",
1049    "NE",
1050    "ENE",
1051    "E",
1052    "ESE",
1053    "SE",
1054    "SSE",
1055    "S",
1056    "SSW",
1057    "SW",
1058    "WSW",
1059    "W",
1060    "WNW",
1061    "NW",
1062    "NNW",
1063    "N",
1064  ];
1065  return cardinals[Math.round(((angle % 360) / 22.5) % 16)];
1066}
1067
1068function getCardinal(angle) {
1069  cardinals = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"];
1070  return cardinals[Math.round(((angle % 360) / 45) % 8)];
1071}
1072
1073function dataTablePrev() {
1074  // console.log("Page:" + dataTablePage);
1075
1076  dataTablePage++;
1077  if (dataTablePage > dataTablePageCount) {
1078    dataTablePage = 1;
1079  }
1080
1081  buildDataTable();
1082}
1083
1084function dataTableNext() {
1085  dataTablePage--;
1086  if (dataTablePage < 1) {
1087    dataTablePage = dataTablePageCount;
1088  }
1089  buildDataTable();
1090}
1091
1092function buildDataTable() {
1093  $("#data_table").html("");
1094  if (gC("wf_datatable") === "off") {
1095    $("#data_table_nav").hide();
1096    $("#data_table_nav_2").hide();
1097    $("#adscontainer").hide(); // Hide final ad container otherwise we get 2 x stacked ads
1098    return;
1099  }
1100  var monthNames = [
1101    "Jan",
1102    "Feb",
1103    "Mar",
1104    "Apr",
1105    "May",
1106    "Jun",
1107    "Jul",
1108    "Aug",
1109    "Sept",
1110    "Oct",
1111    "Nov",
1112    "Dec",
1113  ];
1114  var tempdatapresent = !1;
1115  var dewpointdatapresent = !1;
1116  var windchilldatapresent = !1;
1117  var bgtdatapresent = !1;
1118  var humiditydatapresent = !1;
1119  var pressuredatapresent = !1;
1120  var rainfalldatapresent = !1;
1121  var rainfalldatapresent = !1;
1122  var soldatapresent = !1;
1123  wslpresent = !1;
1124  wshpresent = !1;
1125  wsapresent = !1;
1126
1127  var wdapresent = !1;
1128  var backedpresent = !1;
1129  var veeredpresent = !1;
1130
1131  var fsadatapresent = !1;
1132  var fdadatapresent = !1;
1133  var twdatapresent = !1;
1134  var vltdatapresent = !1;
1135  var vlt2datapresent = !1;
1136  var d1datapresent = !1;
1137
1138  if (tmpdataRows.length > 0) {
1139    tempdatapresent = !0;
1140  }
1141  if (dewpointRows.length > 0) {
1142    dewpointdatapresent = !0;
1143  }
1144  if (windchillRows.length > 0) {
1145    windchilldatapresent = !0;
1146  }
1147  if (bgtRows.length > 0) {
1148    bgtdatapresent = !0;
1149  }
1150  if (humdataRows.length > 0) {
1151    humiditydatapresent = !0;
1152  }
1153  if (pressureRows.length > 0) {
1154    pressuredatapresent = !0;
1155  }
1156  if (rainfallRows.length > 0) {
1157    rainfalldatapresent = !0;
1158  }
1159  if (solRows.length > 0) {
1160    soldatapresent = !0;
1161  }
1162
1163  if (fsaRows.length > 0) {
1164    fsadatapresent = !0;
1165  }
1166  if (fdaRows.length > 0) {
1167    fdadatapresent = !0;
1168  }
1169  if (twRows.length > 0) {
1170    twdatapresent = !0;
1171  }
1172  if (vltRows.length > 0 && wf_user_token != "PUBLIC") {
1173    vltdatapresent = !0;
1174  }
1175  if (vlt2Rows.length > 0 && wf_user_token != "PUBLIC") {
1176    vlt2datapresent = !0;
1177  }
1178  if (d1Rows.length > 0) {
1179    d1datapresent = !0;
1180  }
1181  for (let i = 0; i < dataTableRows.length; i++) {
1182    if (dataTableRows[i][5] != null && isValid(dataTableRows[i][5])) {
1183      backedpresent = !0;
1184    }
1185
1186    if (dataTableRows[i][6] != null && isValid(dataTableRows[i][6])) {
1187      veeredpresent = !0;
1188    }
1189    if (dataTableRows[i][4] != null && isValid(dataTableRows[i][4])) {
1190      wdapresent = !0;
1191    }
1192
1193    if (dataTableRows[i][1] != null && isValid(dataTableRows[i][1])) {
1194      wslpresent = !0;
1195    }
1196    if (dataTableRows[i][3] != null && isValid(dataTableRows[i][3])) {
1197      wshpresent = !0;
1198    }
1199    if (dataTableRows[i][2] != null && isValid(dataTableRows[i][2])) {
1200      wsapresent = !0;
1201    }
1202  }
1203  var thermalUnitHdr = dataTableThermalUnitHtml();
1204  var tablestr =
1205    "<div style='overflow-x: scroll !important;'><table class='basic-table'>\n";
1206  tablestr = tablestr + "\t<tr>\n";
1207  tablestr =
1208    tablestr +
1209    "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.date") + "</td>\n";
1210  tablestr =
1211    tablestr +
1212    "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.time") + "</td>\n";
1213  if (wslpresent) {
1214    tablestr =
1215      tablestr +
1216      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.wind_low") + "</td>\n";
1217  }
1218  if (wsapresent) {
1219    tablestr =
1220      tablestr +
1221      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.wind_avg") + "</td>\n";
1222  }
1223  if (wshpresent) {
1224    tablestr =
1225      tablestr +
1226      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.wind_max") + "</td>\n";
1227  }
1228  if (wdapresent) {
1229    tablestr =
1230      tablestr +
1231      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.avg_direction") + "</td>\n";
1232  }
1233  if (backedpresent) {
1234    tablestr =
1235      tablestr +
1236      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.backed") + "</td>\n";
1237  }
1238  if (veeredpresent) {
1239    tablestr =
1240      tablestr +
1241      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.veered") + "</td>\n";
1242  }
1243  if (tempdatapresent) {
1244    tablestr =
1245      tablestr +
1246      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.amb_temp") + "<br />" +
1247      thermalUnitHdr +
1248      "</td>\n";
1249  }
1250  if (dewpointdatapresent) {
1251    tablestr =
1252      tablestr +
1253      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.dewpoint") + "<br />" +
1254      thermalUnitHdr +
1255      "</td>\n";
1256  }
1257  if (windchilldatapresent) {
1258    tablestr =
1259      tablestr +
1260      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.wind_chill") + "<br />" +
1261      thermalUnitHdr +
1262      "</td>\n";
1263  }
1264  if (bgtdatapresent) {
1265    tablestr =
1266      tablestr +
1267      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.bgt") + "<br />" +
1268      thermalUnitHdr +
1269      "</td>\n";
1270  }
1271  if (humiditydatapresent) {
1272    tablestr =
1273      tablestr +
1274      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.rh") + "<br />%</td>\n";
1275  }
1276  if (pressuredatapresent) {
1277    tablestr =
1278      tablestr +
1279      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.pressure") + "<br />hPa</td>\n";
1280  }
1281  if (rainfalldatapresent) {
1282    tablestr =
1283      tablestr +
1284      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.rainfall") + "<br />mm</td>\n";
1285  }
1286  if (d1datapresent) {
1287    tablestr =
1288      tablestr +
1289      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("metric.rain_bucket") + "<br />mm</td>\n";
1290  }
1291  if (soldatapresent) {
1292    tablestr =
1293      tablestr +
1294      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("gauge.solar") + "<br />W/m²</td>\n";
1295  }
1296  if (fsadatapresent) {
1297    tablestr =
1298      tablestr +
1299      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.tidal_speed") + "<br /></td>\n";
1300  }
1301  if (fdadatapresent) {
1302    tablestr =
1303      tablestr +
1304      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.tidal_direction") + "<br /></td>\n";
1305  }
1306  if (twdatapresent) {
1307    ta
1307blestr =
1308      tablestr +
1309      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("metric.water_temperature") + "<br />" +
1310      thermalUnitHdr +
1311      "</td>\n";
1312  }
1313  if (vltdatapresent) {
1314    tablestr =
1315      tablestr +
1316      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.sensor_voltage") + "<br /></td>\n";
1317  }
1318  if (vlt2datapresent) {
1319    tablestr =
1320      tablestr +
1321      "\t\t<td style='font-weight:bold; font-size:12px; text-align:center;'>" + _t("chart.wcu_voltage") + "<br /></td>\n";
1322  }
1323  tablestr = tablestr + "\t</tr>\n";
1324  var varflip = !0;
1325  dataTablePageCount = Math.floor(dataTableRows.length / 144);
1326  if (dataTableRows.length % 144 !== 0) {
1327    dataTablePageCount++;
1328  }
1329  var dataTableRowIdx = dataTableRows.length - (dataTablePage - 1) * 144 - 1;
1330  var dataTableRowEnd = dataTableRows.length - dataTablePage * 144;
1331  if (dataTableRowEnd < 0) {
1332    dataTableRowEnd = 0;
1333  }
1334  $("#data_table_nav_prev").show();
1335  $("#data_table_nav_next").show();
1336
1337  $("#data_table_nav_prev_bottom").show();
1338  $("#data_table_nav_next_bottom").show();
1339
1340  if (dataTablePage === dataTablePageCount) {
1341    $("#data_table_nav_prev").hide();
1342    $("#data_table_nav_prev_bottom").hide();
1343  }
1344  if (dataTablePage === 1) {
1345    $("#data_table_nav_next").hide();
1346    $("#data_table_mid").hide();
1347
1348    $("#data_table_nav_next_bottom").hide();
1349    $("#data_table_mid_bottom").hide();
1350  }
1351
1352  if (dataTablePageCount != 1) {
1353    $("#data_table_mid").show();
1354
1355    $("#data_table_mid_bottom").show();
1356  }
1357
1358  //	console.log("Data Table Row Count = " + dataTableRows.length);
1359  //	console.log("Page Num = " + dataTablePage);
1360  //	console.log("Page Count = " + dataTablePageCount);
1361  //	console.log("DataTableRowIdx = "+dataTableRowIdx);
1362  //	console.log("DataTableRowEnd = "+dataTableRowEnd);
1363
1364  // Calculate the total rainfall for the time period suggested
1365  var totalrainfall;
1366  totalrainfall = 0;
1367
1368  var totald1;
1369  totald1 = 0;
1370
1371  for (i = dataTableRowIdx; i >= dataTableRowEnd; i--) {
1372    tablestr = tablestr + "\t<tr bgcolor='";
1373    if (varflip) {
1374      tablestr = tablestr + "#fdfdfd'";
1375    } else {
1376      tablestr = tablestr + "#e6eeff'";
1377    }
1378    varflip = !varflip;
1379    tablestr = tablestr + ">\n";
1380    tablestr =
1381      tablestr + "\t\t<td style='font-size:12px; text-align:center;' nowrap>";
1382    var date = new Date(dataTableRows[i][0]);
1383    var day = date.getDate();
1384    var monthIndex = date.getMonth();
1385    //var year = date.getFullYear();
1386
1387    /*
1388    var wsl = Math.round(parseInt(dataTableRows[i][1]));
1389    var wsa = Math.round(parseInt(dataTableRows[i][2]));
1390    var wsh = Math.round(parseInt(dataTableRows[i][3]));
1391    var wda = Math.round(parseInt(dataTableRows[i][4]));
1392    var wdb = Math.round(parseInt(dataTableRows[i][5]));
1393    var wdv = Math.round(parseInt(dataTableRows[i][6]));
1394    */
1395
1396    // Data fix by PR / 21st May 2018 / Data from Blue Banner didn't match data table
1397    var wsl = Math.round(dataTableRows[i][1]);
1398    var wsa = Math.round(dataTableRows[i][2]);
1399    var wsh = Math.round(dataTableRows[i][3]);
1400    var wda = Math.round(dataTableRows[i][4]);
1401    var wdb = Math.round(dataTableRows[i][5]);
1402    var wdv = Math.round(dataTableRows[i][6]);
1403
1404    var imgnum = Math.round(
1405      parseInt(dataTableRows[i][4]) - (parseInt(dataTableRows[i][4]) % 5)
1406    ).toString();
1407
1408    tablestr = tablestr + day + " " + monthNames[monthIndex];
1409    tablestr = tablestr + "</td>\n";
1410    tablestr = tablestr + "\t\t<td style='font-size:12px; text-align:center;'>";
1411    tablestr =
1412      tablestr +
1413      ("00" + date.getHours()).substr(-2, 2) +
1414      ":" +
1415      ("00" + date.getMinutes()).substr(-2, 2);
1416    tablestr = tablestr + "</td>\n";
1417    // wind icons
1418    if (wslpresent && isValid(dataTableRows[i][1])) {
1419      tablestr =
1420        tablestr +
1421        "\t\t<td align='center' style='font-size:11px; background-size: 35px 35px; background-repeat: no-repeat; background-position: top center;";
1422      tablestr =
1423        tablestr +
1424        "  background-image: url(" +
1425        generateWindIcon(dataTableRows[i][4], wsl) +
1426        ");' title='" +
1427        wsl +
1428        " " +
1429        wunits +
1430        " (Backed " +
1431        dataTableRows[i][5] +
1432        " Veered " +
1433        dataTableRows[i][5] +
1434        "'>";
1435      tablestr = tablestr + "<span style='color:#fff;'></span></td>\n";
1436    } else if (wslpresent) {
1437      tablestr = tablestr + "		<td/>";
1438    }
1439    if (wsapresent && isValid(dataTableRows[i][2])) {
1440      tablestr =
1441        tablestr +
1442        "\t\t<td align='center' style='font-size:11px; background-size: 35px 35px; background-repeat: no-repeat; background-position: top center;";
1443      tablestr =
1444        tablestr +
1445        "  background-image: url(" +
1446        generateWindIcon(dataTableRows[i][4], wsa) +
1447        ");' title='" +
1448        wsa +
1449        " " +
1450        wunits +
1451        " (Backed " +
1452        dataTableRows[i][5] +
1453        " Veered " +
1454        dataTableRows[i][5] +
1455        "'>";
1456      tablestr = tablestr + "<span style='color:#fff;'></span></td>\n";
1457    } else if (wsapresent) {
1458      tablestr = tablestr + "		<td/>";
1459    }
1460    if (wshpresent && isValid(dataTableRows[i][3])) {
1461      tablestr =
1462        tablestr +
1463        "\t\t<td align='center' style='font-size:11px; font-style:bold; background-size: 35px 35px; background-repeat: no-repeat; background-position: top center;";
1464      tablestr =
1465        tablestr +
1466        "  background-image: url(" +
1467        generateWindIcon(dataTableRows[i][4], wsh) +
1468        ");' title='" +
1469        wsh +
1470        " " +
1471        wunits +
1472        " (Backed " +
1473        dataTableRows[i][5] +
1474        " Veered " +
1475        dataTableRows[i][5] +
1476        "'>";
1477      tablestr = tablestr + "<span style='color:#fff;'></span></td>\n";
1478    } else if (wshpresent) {
1479      tablestr = tablestr + "		<td/>";
1480    }
1481    if (wdapresent && isValid(dataTableRows[i][4])) {
1482      tablestr =
1483        tablestr + "\t\t<td style='font-size:12px; text-align:center;'>";
1484      tablestr =
1485        tablestr + getCardinal(wda) + "&nbsp;&nbsp;&nbsp;(" + wda + "&deg;)";
1486      tablestr = tablestr + "</td>\n";
1487    } else if (wdapresent) {
1488      tablestr = tablestr + "		<td/>";
1489    }
1490    if (backedpresent && isValid(dataTableRows[i][5])) {
1491      tablestr =
1492        tablestr + "\t\t<td style='font-size:12px; text-align:center;'>";
1493      tablestr = tablestr + wdb + "&deg;";
1494      tablestr = tablestr + "</td>\n";
1495    } else if (backedpresent) {
1496      tablestr = tablestr + "		<td/>";
1497    }
1498    if (veeredpresent && isValid(dataTableRows[i][6])) {
1499      tablestr =
1500        tablestr + "\t\t<td style='font-size:12px; text-align:center;'>";
1501      tablestr = tablestr + wdv + "&deg;";
1502      tablestr = tablestr + "</td>\n";
1503    } else if (veeredpresent) {
1504      tablestr = tablestr + "		<td/>";
1505    }
1506
1507    if (tempdatapresent) {
1508      tablestr =
1509        tablestr +
1510        "<td style='font-size:12px; text-align:center;'>" +
1511        formatDataTableCelsiusCell(dataTableRows[i][7]) +
1512        "</td>";
1513    }
1514    if (dewpointdatapresent) {
1515      tablestr =
1516        tablestr +
1517        "<td style='font-size:12px; text-align:center;'>" +
1518        formatDataTableCelsiusCell(dataTableRows[i][10]) +
1519        "</td>";
1520    }
1521    if (windchilldatapresent) {
1522      tablestr =
1523        tablestr +
1524        "<td style='font-size:12px; text-align:center;'>" +
1525        formatDataTableCelsiusCell(dataTableRows[i][19]) +
1526        "</td>";
1527    }
1528    if (bgtdatapresent) {
1529      tablestr =
1530        tablestr +
1531        "<td style='font-size:12px; text-align:center;'>" +
1532        formatDataTableCelsiusCell(dataTableRows[i][20]) +
1533        "</td>";
1534    }
1535    if (humiditydatapresent) {
1536      tablestr =
1537        tablestr +
1538        "<td style='font-size:12px; text-align:center;'>" +
1539        dataTableRows[i][9] +
1540        "</td>";
1541    }
1542    if (pressuredatapresent) {
1543      tablestr =
1544        tablestr +
1545        "<td style='font-size:12px; text-align:center;'>" +
1546        dataTableRows[i][8] +
1547        "</td>";
1548    }
1549    if (rainfalldatapresent) {
1550      tablestr =
1551        tablestr +
1552        "<td style='font-size:12px; text-align:center;'>" +
1553        dataTableRows[i][11] +
1554        "</td>";
1555      totalrainfall += parseFloat(dataTableRows[i][11]);
1556    }
1557    if (d1datapresent) {
1558      tablestr =
1559        tablestr +
1560        "<td style='font-size:12px; text-align:center;'>" +
1561        dataTableRows[i][17] +
1562        "</td>";
1563      totald1 += parseFloat(dataTableRows[i][17]);
1564      // console.log("DATA FEED: " + totald1)
1565    }
1566    if (soldatapresent) {
1567      tablestr =
1568        tablestr +
1569        "<td style='font-size:12px; text-align:center;'>" +
1570        dataTableRows[i][12] +
1571        "</td>";
1572    }
1573    if (fsadatapresent) {
1574      tablestr =
1575        tablestr +
1576        "<td style='font-size:12px; text-align:center;'>" +
1577        dataTableRows[i][13].toFixed(3) +
1578        "</td>";
1579    }
1580    if (fdadatapresent) {
1581      tablestr =
1582        tablestr +
1583        "<td style='font-size:12px; text-align:center;'>" +
1584        dataTableRows[i][14] +
1585        "</td>";
1586    }
1587    if (twdatapresent) {
1588      tablestr =
1589        tablestr +
1590        "<td style='font-size:12px; text-align:center;'>" +
1591        formatDataTableCelsiusCell(dataTableRows[i][15]) +
1592        "</td>";
1593    }
1594    if (vltdatapresent) {
1595      tablestr =
1596        tablestr +
1597        "<td style='font-size:12px; text-align:center;'>" +
1598        dataTableRows[i][16] +
1599        "</td>";
1600    }
1601    if (vlt2datapresent) {
1602      tablestr =
1603        tablestr +
1604        "<td style='font-size:12px; text-align:center;'>" +
1605        dataTableRows[i][18] +
1606        "</td>";
1607    }
1608    tablestr = tablestr + "\t</tr>";
1609  }
1610  tablestr = tablestr + "</table></div>";
1611  // console.log("Total PT: " + totalpt.toFixed(0) + "mm");
1612  $("#rainfalltotal").html(totalpt.toFixed(0));
1613  // console.log("Total D1: " + totald1.toFixed(0) + "mm");
1614  $("#d1total").html(totald1.toFixed(0));
1615  $("#data_table").html(tablestr);
1616  tablestr = null;
1617}
1618
1619function generateWindIcon(wda, wsa) {
1620  windIconCanvas.height = 40;
1621  windIconCanvas.width = 40;
1622  windIconCanvas
1623    .getContext("2d")
1624    .clearRect(0, 0, windIconCanvas.width, windIconCanvas.height);
1625  updateDirectionMarker(windIconCanvas, wda, wsa, "#000071", !isValid(wda)); // draws marker
1626  return windIconCanvas.toDataURL();
1627}
1628
1629function drawHumChart() {
1630  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
1631  if (humdataRows.length < 144) {
1632    dformat = "HH:mm";
1633  }
1634  if (humdataRows.length > 145 || humdataRows.length < 288) {
1635    dformat = "d MMM HH:mm";
1636  }
1637  humDataStore.removeRows(0, humDataStore.getNumberOfRows());
1638  humDataStore.addRows(humdataRows);
1639  var options = {
1640    interpolateNulls: "false",
1641    chartArea: {
1642      width: "85%",
1643      height: "73%",
1644    },
1645    width: "100%",
1646    height: "300",
1647    hAxis: {
1648      gridlines: {
1649        color: "#ddd",
1650        count: 10,
1651      },
1652      format: dformat,
1653      textStyle: {
1654        fontName: "Open Sans",
1655        fontSize: 11,
1656      },
1657      titleTextStyle: {
1658        color: "#ddd",
1659      },
1660    },
1661    vAxis: {
1662      format: "0",
1663      gridlines: {
1664        color: "#eee",
1665        count: 6,
1666      },
1667      viewWindow: {
1668        min: 0,
1669        max: 100,
1670      },
1671      textStyle: {
1672        fontName: "Open Sans",
1673        fontSize: 11,
1674      },
1675    },
1676    legend: {
1677      position: "top",
1678      textStyle: {
1679        fontName: "Open Sans",
1680        fontSize: 12,
1681      },
1682      alignment: "center",
1683    },
1684    colors: ["5ec390"],
1685  };
1686  humChart.draw(humDataStore, options);
1687}
1688
1689function drawRainfallChart() {
1690  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
1691  if (rainfallRows.length < 144) {
1692    dformat = "HH:mm";
1693  }
1694  if (rainfallRows.length > 145 || rainfallRows.length < 288) {
1695    dformat = "d MMM HH:mm";
1696  }
1697  rainfallDataStore.removeRows(0, rainfallDataStore.getNumberOfRows());
1698  rainfallDataStore.addRows(rainfallRows);
1699  var options = {
1700    interpolateNulls: "false",
1701    chartArea: {
1702      width: "85%",
1703      height: "73%",
1704    },
1705    width: "100%",
1706    height: "300",
1707    hAxis: {
1708      gridlines: {
1709        color: "#ddd",
1710        count: 10,
1711      },
1712      format: dformat,
1713      textStyle: {
1714        fontName: "Open Sans",
1715        fontSize: 11,
1716      },
1717      titleTextStyle: {
1718        color: "#ddd",
1719      },
1720    },
1721    vAxis: {
1722      gridlines: {
1723        color: "#eee",
1724        count: 6,
1725      },
1726      viewWindow: {
1727        min: 0,
1728      },
1729      textStyle: {
1730        fontName: "Open Sans",
1731        fontSize: 11,
1732      },
1733    },
1734    legend: {
1735      position: "top",
1736      textStyle: {
1737        fontName: "Open Sans",
1738        fontSize: 12,
1739      },
1740      alignment: "center",
1741    },
1742    colors: ["00a9f0"],
1743  };
1744  rainfallChart.draw(rainfallDataStore, options);
1745}
1746
1747function drawd1Chart() {
1748  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
1749  if (d1Rows.length < 144) {
1750    dformat = "HH:mm";
1751  }
1752  if (d1Rows.length > 145 || d1Rows.length < 288) {
1753    dformat = "d MMM HH:mm";
1754  }
1755  d1DataStore.removeRows(0, d1DataStore.getNumberOfRows());
1756  d1DataStore.addRows(d1Rows);
1757  var options = {
1758    interpolateNulls: "false",
1759    chartArea: {
1760      width: "85%",
1761      height: "73%",
1762    },
1763    width: "100%",
1764    height: "300",
1765    hAxis: {
1766      gridlines: {
1767        color: "#ddd",
1768        count: 10,
1769      },
1770      format: dformat,
1771      textStyle: {
1772        fontName: "Open Sans",
1773        fontSize: 11,
1774      },
1775      titleTextStyle: {
1776        color: "#ddd",
1777      },
1778    },
1779    vAxis: {
1780      gridlines: {
1781        color: "#eee",
1782        count: 6,
1783      },
1784      viewWindow: {
1785        min: 0,
1786      },
1787      textStyle: {
1788        fontName: "Open Sans",
1789        fontSize: 11,
1790      },
1791    },
1792    legend: {
1793      position: "top",
1794      textStyle: {
1795        fontName: "Open Sans",
1796        fontSize: 12,
1797      },
1798      alignment: "center",
1799    },
1800    colors: ["00a9f0"],
1801  };
1802  d1Chart.draw(d1DataStore, options);
1803}
1804
1805function drawPressureChart() {
1806  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
1807  if (pressureRows.length < 144) {
1808    dformat = "HH:mm";
1809  }
1810  if (pressureRows.length > 145 || pressureRows.length < 288) {
1811    dformat = "d MMM HH:mm";
1812  }
1813  pressureDataStore.removeRows(0, pressureDataStore.getNumberOfRows());
1814  pressureDataStore.addRows(pressureRows);
1815
1816  var minpressure = 950;
1817  var maxpressure = 1040;
1818
1819  if (gC("wf_custom_scale") !== "") {
1820    var customscale = JSON.parse(gC("wf_custom_scale"));
1821    if (
1822      customscale.minpressure !== "" &&
1823      customscale.minpressure !== undefined &&
1824      !isNaN(parseInt(customscale.minpressure))
1825    ) {
1826      minpressure = customscale.minpressure;
1827    }
1828    if (
1829      customscale.maxpressure !== "" &&
1830      customscale.maxpressure !== undefined &&
1831      !isNaN(parseInt(customscale.minpressure))
1832    ) {
1833      maxpressure = customscale.maxpressure;
1834    }
1835  }
1836
1837  var options = {
1838    interpolateNulls: "false",
1839    chartArea: {
1840      width: "85%",
1841      height: "73%",
1842    },
1843    width: "100%",
1844    height: "300",
1845    hAxis: {
1846      gridlines: {
1847        color: "#ddd",
1848        count: 10,
1849      },
1850      format: dformat,
1851      textStyle: {
1852        fontName: "Open Sans",
1853        fontSize: 11,
1854      },
1855      titleTextStyle: {
1856        color: "#ddd",
1857      },
1858    },
1859    vAxis: {
1860      gridlines: {
1861        color: "#eee",
1862        count: 6,
1863      },
1864      viewWindow: {
1865        min: minpressure,
1866        max: maxpressure,
1867      },
1868      textStyle: {
1869        fontName: "Open Sans",
1870        fontSize: 11,
1871      },
1872    },
1873    legend: {
1874      position: "top",
1875      textStyle: {
1876        fontName: "Open Sans",
1877        fontSize: 12,
1878      },
1879      alignment: "center",
1880    },
1881    colors: ["orange"],
1882  };
1883  pressureChart.draw(pressureDataStore, options);
1884}
1885
1886function drawDewpointChart() {
1887  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
1888  if (dewpointRows.length < 144) {
1889    dformat = "HH:mm";
1890  }
1891  if (dewpointRows.length > 145 || dewpointRows.length < 288) {
1892    dformat = "d MMM HH:mm";
1893  }
1894  dewpointDataStore.removeRows(0, dewpointDataStore.getNumberOfRows());
1895  dewpointDataStore.setColumnLabel(
1896    1,
1897    thermalChartLegendLabel("dewpoint")
1898  );
1899  dewpointDataStore.addRows(thermalRowsForDisplayChart(dewpointRows));
1900  var options = {
1901    interpolateNulls: "false",
1902    chartArea: {
1903      width: "85%",
1904      height: "73%",
1905    },
1906    width: "100%",
1907    height: "300",
1908    hAxis: {
1909      gridlines: {
1910        color: "#ddd",
1911        count: 10,
1912      },
1913      format: dformat,
1914      textStyle: {
1915        fontName: "Open Sans",
1916        fontSize: 11,
1917      },
1918      titleTextStyle: {
1919        color: "#ddd",
1920      },
1921    },
1922    vAxis: {
1923      format: "0.0",
1924      gridlines: {
1925        color: "#eee",
1926        count: 6,
1927      },
1928      textStyle: {
1929        fontName: "Open Sans",
1930        fontSize: 11,
1931      },
1932    },
1933    legend: {
1934      position: "top",
1935      textStyle: {
1936        fontName: "Open Sans",
1937        fontSize: 12,
1938      },
1939      alignment: "center",
1940    },
1941    colors: ["#ee09d6"],
1942  };
1943  dewpointChart.draw(dewpointDataStore, options);
1944}
1945
1946function drawWindchillChart() {
1947  var dformat = "d MMM";
1948  if (windchillRows.length < 144) {
1949    dformat = "HH:mm";
1950  }
1951  if (windchillRows.length > 145 || windchillRows.length < 288) {
1952    dformat = "d MMM HH:mm";
1953  }
1954  windchillDataStore.removeRows(0, windchillDataStore.getNumberOfRows());
1955  windchillDataStore.setColumnLabel(
1956    1,
1957    thermalChartLegendLabel("wind_chill")
1958  );
1959  windchillDataStore.addRows(thermalRowsForDisplayChart(windchillRows));
1960  var options = {
1961    interpolateNulls: "false",
1962    chartArea: {
1963      width: "85%",
1964      height: "73%",
1965    },
1966    width: "100%",
1967    height: "300",
1968    hAxis: {
1969      gridlines: {
1970        color: "#ddd",
1971        count: 10,
1972      },
1973      format: dformat,
1974      textStyle: {
1975        fontName: "Open Sans",
1976        fontSize: 11,
1977      },
1978      titleTextStyle: {
1979        color: "#ddd",
1980      },
1981    },
1982    vAxis: {
1983      format: "0.0",
1984      gridlines: {
1985        color: "#eee",
1986        count: 6,
1987      },
1988      textStyle: {
1989        fontName: "Open Sans",
1990        fontSize: 11,
1991      },
1992    },
1993    legend: {
1994      position: "top",
1995      textStyle: {
1996        fontName: "Open Sans",
1997        fontSize: 12,
1998      },
1999      alignment: "center",
2000    },
2001    colors: ["#0891b2"],
2002  };
2003  windchillChart.draw(windchillDataStore, options);
2004}
2005
2006function drawBgtChart() {
2007  var dformat = "d MMM";
2008  if (bgtRows.length < 144) {
2009    dformat = "HH:mm";
2010  }
2011  if (bgtRows.length > 145 || bgtRows.length < 288) {
2012    dformat = "d MMM HH:mm";
2013  }
2014  bgtDataStore.removeRows(0, bgtDataStore.getNumberOfRows());
2015  bgtDataStore.setColumnLabel(1, thermalChartLegendLabel("bgt"));
2016  bgtDataStore.addRows(thermalRowsForDisplayChart(bgtRows));
2017  var options = {
2018    interpolateNulls: "false",
2019    chartArea: {
2020      width: "85%",
2021      height: "73%",
2022    },
2023    width: "100%",
2024    height: "300",
2025    hAxis: {
2026      gridlines: {
2027        color: "#ddd",
2028        count: 10,
2029      },
2030      format: dformat,
2031      textStyle: {
2032        fontName: "Open Sans",
2033        fontSize: 11,
2034      },
2035      titleTextStyle: {
2036        color: "#ddd",
2037      },
2038    },
2039    vAxis: {
2040      format: "0.0",
2041      gridlines: {
2042        color: "#eee",
2043        count: 6,
2044      },
2045      textStyle: {
2046        fontName: "Open Sans",
2047        fontSize: 11,
2048      },
2049    },
2050    legend: {
2051      position: "top",
2052      textStyle: {
2053        fontName: "Open Sans",
2054        fontSize: 12,
2055      },
2056      alignment: "center",
2057    },
2058    colors: ["#c2410c"],
2059  };
2060  bgtChart.draw(bgtDataStore, options);
2061}
2062
2063function drawP1uChart() {
2064  console.log("P1u");
2065  // var dformat = "MMM d HH:mm";
2066  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2067  if (p1uRows.length < 144) {
2068    dformat = "HH:mm";
2069  }
2070
2071  var dewpointDataStore = new google.visualization.DataTable();
2072  dewpointDataStore.addColumn("datetime", _t("chart.time"));
2073  dewpointDataStore.addColumn("number", _t("chart.pm1"));
2074  dewpointDataStore.addRows(p1uRows);
2075  var options = {
2076    interpolateNulls: "false",
2077    chartArea: {
2078      width: "85%",
2079      height: "73%",
2080    },
2081    width: "100%",
2082    height: "300",
2083    hAxis: {
2084      gridlines: {
2085        color: "#ddd",
2086        count: 10,
2087      },
2088      format: dformat,
2089      textStyle: {
2090        fontName: "Open Sans",
2091        fontSize: 11,
2092      },
2093      titleTextStyle: {
2094        color: "#ddd",
2095      },
2096    },
2097    vAxis: {
2098      gridlines: {
2099        color: "#eee",
2100        count: 6,
2101      },
2102      textStyle: {
2103        fontName: "Open Sans",
2104        fontSize: 11,
2105      },
2106    },
2107    legend: {
2108      position: "top",
2109      textStyle: {
2110        fontName: "Open Sans",
2111        fontSize: 12,
2112      },
2113      alignment: "center",
2114    },
2115    colors: ["#ee09d6"],
2116  };
2117  var chart = new google.visualization.LineChart(
2118    document.getElementById("p1u_chart")
2119  );
2120  chart.draw(dewpointDataStore, options);
2121}
2122
2123function drawP2u5Chart() {
2124  console.log("P2u5");
2125  // var dformat = "MMM d HH:mm";
2126  var dformat = "HH:mm"; // Simplify axis as requested by RPR 08.03.17
2127  if (p2u5Rows.length < 144) {
2128    dformat = "HH:mm";
2129  }
2130
2131  var dewpointDataStore = new google.visualization.DataTable();
2132  dewpointDataStore.addColumn("datetime", _t("chart.time"));
2133  dewpointDataStore.addColumn("number", _t("chart.pm25"));
2134  dewpointDataStore.addRows(p2u5Rows);
2135  var options = {
2136    interpolateNulls: "false",
2137    chartArea: {
2138      width: "85%",
2139      height: "73%",
2140    },
2141    width: "100%",
2142    height: "300",
2143    hAxis: {
2144      gridlines: {
2145        color: "#ddd",
2146        count: 10,
2147      },
2148      format: dformat,
2149      textStyle: {
2150        fontName: "Open Sans",
2151        fontSize: 11,
2152      },
2153      titleTextStyle: {
2154        color: "#ddd",
2155      },
2156    },
2157    vAxis: {
2158      gridlines: {
2159        color: "#eee",
2160        count: 6,
2161      },
2162      textStyle: {
2163        fontName: "Open Sans",
2164        fontSize: 11,
2165      },
2166    },
2167    legend: {
2168      position: "top",
2169      textStyle: {
2170        fontName: "Open Sans",
2171        fontSize: 12,
2172      },
2173      alignment: "center",
2174    },
2175    colors: ["#ee05ff"],
2176  };
2177  var chart = new google.visualization.LineChart(
2178    document.getElementById("p2u5_chart")
2179  );
2180  chart.draw(dewpointDataStore, options);
2181}
2182
2183function drawP10uChart() {
2184  console.log("P10u");
2185  // var dformat = "MMM d HH:mm";
2186  var dformat = "HH:mm"; // Simplify axis as requested by RPR 08.03.17
2187  if (p10uRows.length < 144) {
2188    dformat = "HH:mm";
2189  }
2190
2191  var dewpointDataStore = new google.visualization.DataTable();
2192  dewpointDataStore.addColumn("datetime", _t("chart.time"));
2193  dewpointDataStore.addColumn("number", _t("chart.pm10"));
2194  dewpointDataStore.addRows(p10uRows);
2195  var options = {
2196    interpolateNulls: "false",
2197    chartArea: {
2198      width: "85%",
2199      height: "73%",
2200    },
2201    width: "100%",
2202    height: "300",
2203    hAxis: {
2204      gridlines: {
2205        color: "#ddd",
2206        count: 10,
2207      },
2208      format: dformat,
2209      textStyle: {
2210        fontName: "Open Sans",
2211        fontSize: 11,
2212      },
2213      titleTextStyle: {
2214        color: "#ddd",
2215      },
2216    },
2217    vAxis: {
2218      gridlines: {
2219        color: "#eee",
2220        count: 6,
2221      },
2222      textStyle: {
2223        fontName: "Open Sans",
2224        fontSize: 11,
2225      },
2226    },
2227    legend: {
2228      position: "top",
2229      textStyle: {
2230        fontName: "Open Sans",
2231        fontSize: 12,
2232      },
2233      alignment: "center",
2234    },
2235    colors: ["#1105ff"],
2236  };
2237  var chart = new google.visualization.LineChart(
2238    document.getElementById("p10u_chart")
2239  );
2240  chart.draw(dewpointDataStore, options);
2241}
2242
2243function drawco2Chart() {
2244  console.log("co2");
2245  // var dformat = "MMM d HH:mm";
2246  var dformat = "HH:mm"; // Simplify axis as requested by RPR 08.03.17
2247  if (co2Rows.length < 144) {
2248    dformat = "HH:mm";
2249  }
2250
2251  var dewpointDataStore = new google.visualization.DataTable();
2252  dewpointDataStore.addColumn("datetime", _t("chart.time"));
2253  dewpointDataStore.addColumn("number", _t("chart.co2"));
2254  dewpointDataStore.addRows(co2Rows);
2255  var options = {
2256    interpolateNulls: "false",
2257    chartArea: {
2258      width: "85%",
2259      height: "73%",
2260    },
2261    width: "100%",
2262    height: "300",
2263    hAxis: {
2264      gridlines: {
2265        color: "#ddd",
2266        count: 10,
2267      },
2268      format: dformat,
2269      textStyle: {
2270        fontName: "Open Sans",
2271        fontSize: 11,
2272      },
2273      titleTextStyle: {
2274        color: "#ddd",
2275      },
2276    },
2277    vAxis: {
2278      gridlines: {
2279        color: "#eee",
2280        count: 6,
2281      },
2282      textStyle: {
2283        fontName: "Open Sans",
2284        fontSize: 11,
2285      },
2286    },
2287    legend: {
2288      position: "top",
2289      textStyle: {
2290        fontName: "Open Sans",
2291        fontSize: 12,
2292      },
2293      alignment: "center",
2294    },
2295    colors: ["#1105ff"],
2296  };
2297  var chart = new google.visualization.LineChart(
2298    document.getElementById("co2_chart")
2299  );
2300  chart.draw(dewpointDataStore, options);
2301}
2302
2303function drawWindSpeedChart() {
2304  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2305  if (wsdataRows.length < 144) {
2306    dformat = "HH:mm";
2307  }
2308  if (wsdataRows.length > 145 || wsdataRows.length < 288) {
2309    dformat = "d MMM HH:mm";
2310  }
2311  windSpeedDataStore.setColumnLabel(0, _t("chart.time"));
2312  windSpeedDataStore.setColumnLabel(1, _t("chart.wind_max"));
2313  windSpeedDataStore.setColumnLabel(2, _t("chart.wind_average"));
2314  windSpeedDataStore.setColumnLabel(3, _t("chart.wind_low"));
2315  windSpeedDataStore.removeRows(0, windSpeedDataStore.getNumberOfRows());
2316  windSpeedDataStore.addRows(wsdataRows);
2317  wsdataRows.forEach((value) => {
2318    if (isValid(value[1])) wshpresent = !0;
2319    if (isValid(value[2])) wsapresent = !0;
2320    if (isValid(value[3])) wslpresent = !0;
2321  });
2322
2323  var options = {
2324    interpolateNulls: true,
2325    chartArea: {
2326      width: "85%",
2327      height: "73%",
2328    },
2329    width: "100%",
2330    height: "300",
2331    hAxis: {
2332      gridlines: {
2333        color: "#ddd",
2334        count: 10,
2335      },
2336      format: dformat,
2337      textStyle: {
2338        fontName: "Open Sans",
2339        fontSize: 11,
2340      },
2341      titleTextStyle: {
2342        color: "#ddd",
2343      },
2344    },
2345    vAxis: {
2346      format: "0.0",
2347      viewWindow: {
2348        min: 0,
2349      },
2350      gridlines: {
2351        color: "#eee",
2352        count: 7,
2353      },
2354      textStyle: {
2355        fontName: "Open Sans",
2356        fontSize: 11,
2357      },
2358    },
2359    legend: {
2360      position: "top",
2361      textStyle: {
2362        fontName: "Open Sans",
2363        fontSize: 11,
2364      },
2365      alignment: "center",
2366    },
2367    colors: ["red", "#009", "#ddd"],
2368    series: {
2369      0: {
2370        visibleInLegend: wshpresent,
2371      },
2372      1: {
2373        visibleInLegend: wsapresent,
2374      },
2375      2: {
2376        visibleInLegend: wslpresent,
2377      },
2378    },
2379  };
2380  $("#wspeed_chart").show();
2381  wSpeedChart.draw(windSpeedDataStore, options);
2382}
2383
2384function drawFsaChart() {
2385  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2386  if (fsaRows.length < 144) {
2387    dformat = "HH:mm";
2388  }
2389  fsaDataStore.removeRows(0, fsaDataStore.getNumberOfRows());
2390  fsaDataStore.addRows(fsaRows);
2391
2392  var options = {
2393    interpolateNulls: "false",
2394    chartArea: {
2395      width: "85%",
2396      height: "73%",
2397    },
2398    width: "100%",
2399    height: "300",
2400    hAxis: {
2401      gridlines: {
2402        color: "#ddd",
2403        count: 10,
2404      },
2405      format: dformat,
2406      textStyle: {
2407        fontName: "Open Sans",
2408        fontSize: 11,
2409      },
2410      titleTextStyle: {
2411        color: "#ddd",
2412      },
2413    },
2414    vAxis: {
2415      format: "0.00",
2416      viewWindow: {
2417        min: 0,
2418      },
2419      gridlines: {
2420        color: "#eee",
2421        count: 7,
2422      },
2423      textStyle: {
2424        fontName: "Open Sans",
2425        fontSize: 11,
2426      },
2427    },
2428    legend: {
2429      position: "top",
2430      textStyle: {
2431        fontName: "Open Sans",
2432        fontSize: 11,
2433      },
2434      alignment: "center",
2435    },
2436    colors: ["#215dbc"],
2437  };
2438  fsaChart.draw(fsaDataStore, options);
2439}
2440
2441function drawVltChart() {
2442  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2443  if (vltRows.length < 144) {
2444    dformat = "HH:mm";
2445  }
2446  vltDataStore.removeRows(0, vltDataStore.getNumberOfRows());
2447  vltDataStore.addRows(vltRows);
2448  var options = {
2449    interpolateNulls: "false",
2450    chartArea: {
2451      width: "85%",
2452      height: "73%",
2453    },
2454    width: "100%",
2455    height: "300",
2456    hAxis: {
2457      gridlines: {
2458        color: "#ddd",
2459        count: 10,
2460      },
2461      format: dformat,
2462      textStyle: {
2463        fontName: "Open Sans",
2464        fontSize: 11,
2465      },
2466      titleTextStyle: {
2467        color: "#ddd",
2468      },
2469    },
2470    vAxis: {
2471      format: "0.0",
2472      viewWindow: {
2473        min: 0,
2474      },
2475      gridlines: {
2476        color: "#eee",
2477        count: 7,
2478      },
2479      textStyle: {
2480        fontName: "Open Sans",
2481        fontSize: 11,
2482      },
2483    },
2484    legend: {
2485      position: "top",
2486      textStyle: {
2487        fontName: "Open Sans",
2488        fontSize: 11,
2489      },
2490      alignment: "center",
2491    },
2492    colors: ["#215dbc"],
2493  };
2494  vltChart.draw(vltDataStore, options);
2495}
2496
2497function drawVlt2Chart() {
2498  var dformat = "d MMM"; // Added on 5th August 2021
2499  if (vlt2Rows.length < 144) {
2500    dformat = "HH:mm";
2501  }
2502  vlt2DataStore.removeRows(0, vlt2DataStore.getNumberOfRows());
2503  vlt2DataStore.addRows(vlt2Rows);
2504  var options = {
2505    interpolateNulls: "false",
2506    chartArea: {
2507      width: "85%",
2508      height: "73%",
2509    },
2510    width: "100%",
2511    height: "300",
2512    hAxis: {
2513      gridlines: {
2514        color: "#ddd",
2515        count: 10,
2516      },
2517      format: dformat,
2518      textStyle: {
2519        fontName: "Open Sans",
2520        fontSize: 11,
2521      },
2522      titleTextStyle: {
2523        color: "#ddd",
2524      },
2525    },
2526    vAxis: {
2527      format: "0.0",
2528      viewWindow: {
2529        min: 0,
2530      },
2531      gridlines: {
2532        color: "#eee",
2533        count: 7,
2534      },
2535      textStyle: {
2536        fontName: "Open Sans",
2537        fontSize: 11,
2538      },
2539    },
2540    legend: {
2541      position: "top",
2542      textStyle: {
2543        fontName: "Open Sans",
2544        fontSize: 11,
2545      },
2546      alignment: "center",
2547    },
2548    colors: ["#215dbc"],
2549  };
2550  vlt2Chart.draw(vlt2DataStore, options);
2551}
2552
2553function drawFdaChart() {
2554  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2555  if (fdaRows.length < 144) {
2556    dformat = "HH:mm";
2557  }
2558  fdaDataStore.removeRows(0, fdaDataStore.getNumberOfRows());
2559  fdaDataStore.addRows(fdaRows);
2560  var options = {
2561    interpolateNulls: "false",
2562    chartArea: {
2563      width: "85%",
2564      height: "73%",
2565    },
2566    lineWidth: 0, // pseudo scatter graph by setting lineWidth to zero, just shows datapoints
2567    width: "100%",
2568    height: "300",
2569    colors: ["purple"],
2570    pointSize: 0.5,
2571    hAxis: {
2572      gridlines: {
2573        color: "#ddd",
2574        count: 10,
2575      },
2576      format: dformat,
2577      textStyle: {
2578        fontName: "Open Sans",
2579        fontSize: 11,
2580      },
2581      titleTextStyle: {
2582        color: "#ddd",
2583      },
2584    },
2585    vAxis: {
2586      format: "0",
2587      viewWindowMode: "explicit",
2588      viewWindow: {
2589        max: 0,
2590        min: 360,
2591      },
2592      gridlines: {
2593        color: "#eee",
2594        count: 10,
2595      },
2596      textStyle: {
2597        fontName: "Open Sans",
2598        fontSize: 11,
2599      },
2600      ticks: [
2601        {
2602          v: 0,
2603          f: "N",
2604        },
2605        {
2606          v: 45,
2607          f: "NE",
2608        },
2609        {
2610          v: 90,
2611          f: "E",
2612        },
2613        {
2614          v: 135,
2615          f: "SE",
2616        },
2617        {
2618          v: 180,
2619          f: "S",
2620        },
2621        {
2622          v: 225,
2623          f: "SW",
2624        },
2625        {
2626          v: 270,
2627          f: "W",
2628        },
2629        {
2630          v: 315,
2631          f: "NW",
2632        },
2633        {
2634          v: 360,
2635          f: "N",
2636        },
2637      ],
2638    },
2639    legend: {
2640      position: "top",
2641      textStyle: {
2642        fontName: "Open Sans",
2643        fontSize: 11,
2644      },
2645      alignment: "center",
2646    },
2647  };
2648  fdaChart.draw(fdaDataStore, options);
2649}
2650
2651function drawTwChart() {
2652  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2653  if (twRows.length < 144) {
2654    dformat = "HH:mm";
2655  }
2656  twDataStore.removeRows(0, twDataStore.getNumberOfRows());
2657  twDataStore.addRows(twRows);
2658  var options = {
2659    interpolateNulls: "false",
2660    chartArea: {
2661      width: "85%",
2662      height: "73%",
2663    },
2664    width: "100%",
2665    height: "300",
2666    hAxis: {
2667      gridlines: {
2668        color: "#ddd",
2669        count: 10,
2670      },
2671      format: dformat,
2672      textStyle: {
2673        fontName: "Open Sans",
2674        fontSize: 11,
2675      },
2676      titleTextStyle: {
2677        color: "#ddd",
2678      },
2679    },
2680    vAxis: {
2681      format: "0.00",
2682      gridlines: {
2683        color: "#eee",
2684        count: 6,
2685      },
2686      textStyle: {
2687        fontName: "Open Sans",
2688        fontSize: 11,
2689      },
2690    },
2691    legend: {
2692      position: "top",
2693      textStyle: {
2694        fontName: "Open Sans",
2695        fontSize: 12,
2696      },
2697      alignment: "center",
2698    },
2699    colors: ["#97b267"],
2700  };
2701  twChart.draw(twDataStore, options);
2702}
2703
2704function drawTemperatureChart() {
2705  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2706  if (tmpdataRows.length < 144) {
2707    dformat = "HH:mm";
2708  }
2709  if (tmpdataRows.length > 145 || tmpdataRows.length < 288) {
2710    dformat = "d MMM HH:mm";
2711  }
2712  tempDataStore.removeRows(0, tempDataStore.getNumberOfRows());
2713  tempDataStore.setColumnLabel(
2714    1,
2715    thermalChartLegendLabel("temperature")
2716  );
2717  tempDataStore.addRows(thermalRowsForDisplayChart(tmpdataRows));
2718  var options = {
2719    interpolateNulls: "false",
2720    chartArea: {
2721      width: "85%",
2722      height: "73%",
2723    },
2724    width: "100%",
2725    height: "300",
2726    hAxis: {
2727      gridlines: {
2728        color: "#ddd",
2729        count: 10,
2730      },
2731      format: dformat,
2732      textStyle: {
2733        fontName: "Open Sans",
2734        fontSize: 11,
2735      },
2736      titleTextStyle: {
2737        color: "#ddd",
2738      },
2739    },
2740    vAxis: {
2741      format: "0.0",
2742      gridlines: {
2743        color: "#eee",
2744        count: 6,
2745      },
2746      textStyle: {
2747        fontName: "Open Sans",
2748        fontSize: 11,
2749      },
2750    },
2751    legend: {
2752      position: "top",
2753      textStyle: {
2754        fontName: "Open Sans",
2755        fontSize: 12,
2756      },
2757      alignment: "center",
2758    },
2759    colors: ["#97b267"],
2760  };
2761  tempChart.draw(tempDataStore, options);
2762}
2763
2764function drawSolChart() {
2765  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2766  if (solRows.length < 144) {
2767    dformat = "HH:mm";
2768  }
2769  if (solRows.length > 145 || solRows.length < 288) {
2770    dformat = "d MMM HH:mm";
2771  }
2772  solDataStore.removeRows(0, solDataStore.getNumberOfRows());
2773  solDataStore.addRows(solRows);
2774  var options = {
2775    interpolateNulls: "false",
2776    chartArea: {
2777      width: "85%",
2778      height: "73%",
2779    },
2780    width: "100%",
2781    height: "300",
2782    hAxis: {
2783      gridlines: {
2784        color: "#ddd",
2785        count: 10,
2786      },
2787      format: dformat,
2788      textStyle: {
2789        fontName: "Open Sans",
2790        fontSize: 11,
2791      },
2792      titleTextStyle: {
2793        color: "#ddd",
2794      },
2795    },
2796    vAxis: {
2797      gridlines: {
2798        color: "#eee",
2799        count: 6,
2800      },
2801      textStyle: {
2802        fontName: "Open Sans",
2803        fontSize: 11,
2804      },
2805    },
2806    legend: {
2807      position: "top",
2808      textStyle: {
2809        fontName: "Open Sans",
2810        fontSize: 12,
2811      },
2812      alignment: "center",
2813    },
2814    colors: ["#FDB813"],
2815  };
2816  solChart.draw(solDataStore, options);
2817}
2818
2819function drawWindDirectionChart() {
2820  var dformat = "d MMM"; // Simplify axis as requested by RPR 08.03.17
2821  if (wddataRows.length < 144) {
2822    dformat = "HH:mm";
2823  }
2824  if (wddataRows.length > 145 || wddataRows.length < 288) {
2825    dformat = "d MMM HH:mm";
2826  }
2827  windDirectionDataStore.removeRows(
2828    0,
2829    windDirectionDataStore.getNumberOfRows()
2830  );
2831  windDirectionDataStore.addRows(wddataRows);
2832  var options = {
2833    interpolateNulls: false,
2834    chartArea: {
2835      width: "85%",
2836      height: "73%",
2837    },
2838    width: "100%",
2839    height: "300",
2840    colors: ["purple"],
2841    hAxis: {
2842      gridlines: {
2843        color: "#ddd",
2844        count: 10,
2845      },
2846      format: dformat,
2847      textStyle: {
2848        fontName: "Open Sans",
2849        fontSize: 11,
2850      },
2851      titleTextStyle: {
2852        color: "#ddd",
2853      },
2854    },
2855    vAxis: {
2856      format: "0",
2857      viewWindowMode: "explicit",
2858      viewWindow: {
2859        max: 0,
2860        min: 360,
2861      },
2862      gridlines: {
2863        color: "#eee",
2864        count: 10,
2865      },
2866      textStyle: {
2867        fontName: "Open Sans",
2868        fontSize: 11,
2869      },
2870      ticks: [
2871        {
2872          v: 0,
2873          f: "N",
2874        },
2875        {
2876          v: 45,
2877          f: "NE",
2878        },
2879        {
2880          v: 90,
2881          f: "E",
2882        },
2883        {
2884          v: 135,
2885          f: "SE",
2886        },
2887        {
2888          v: 180,
2889          f: "S",
2890        },
2891        {
2892          v: 225,
2893          f: "SW",
2894        },
2895        {
2896          v: 270,
2897          f: "W",
2898        },
2899        {
2900          v: 315,
2901          f: "NW",
2902        },
2903        {
2904          v: 360,
2905          f: "N",
2906        },
2907      ],
2908    },
2909    legend: {
2910      position: "top",
2911      textStyle: {
2912        fontName: "Open Sans",
2913        fontSize: 11,
2914      },
2915      alignment: "center",
2916    },
2917  };
2918  windDirectionChart.draw(windDirectionDataStore, options);
2919}
2920
2921// Add custom messages for particular location via if
2922
2923if (window.WF && WF.i18n && WF.i18n.onChange) {
2924  WF.i18n.onChange(function () { try { if (typeof drawCharts === "function") drawCharts(); } catch (e) {} });
2925}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.