// wx_ajax.js version 20080503

var risingcolor = '#FF6666';
var fallingcolor = '#6666FF';
var maxcolor = '#CC0000';
var mincolor = '#CC0000';
var refresh  = '1750';

// Search all span tags and return list with class "data", "time" or "info"
function getTags() {
 var elem = document.getElementsByTagName('span');
 var lookfor = 'class';
 var arr=[];

 for (var i = 0,iarr = 0; i < elem.length; i++) {
  var att = elem[i].getAttribute(lookfor);
  if (att == 'data' || att == 'time' || att == 'info') { arr[iarr] = elem[i]; iarr++; }
 }
 return arr;
}

// Reset all tag styles to have no color override
function resetColor(usecolor) {
 var elements = getTags();
 var numelements = elements.length;

 for (var i=0; i != numelements; i++) {
  var element = elements[i];
  element.style.color = usecolor;
 }
}

// Store the current value of lastobs in "value", change color if value != lastobs
function setAjax(name,value) {
 var element = document.getElementById(name);

 if (! element) { return; }

 var lastobs = element.getAttribute("lastobs");
 element.setAttribute("lastobs",value);

 if (value > lastobs) { element.style.color = risingcolor; } else if (value < lastobs) { element.style.color = fallingcolor; }
 element.innerHTML = value;
}

// Main AJAX loop
function ajaxLoader(url) {
 var wd=[], alarm, c, degc, i, m, milb, react, risk, s, ssi, title, trend;
 var dir=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];
 var pwr=[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768];

 if (document.getElementById) { var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(url); }

 if (x) { x.onreadystatechange = function() {
  if (x.readyState == 4 && x.status == 200) {

   // Parse wx_data.txt
   for (i=0; i <= 81; i++) { wd[i] = x.responseText.split('|')[i]; }

   // Abort if data error
   if (! wd[9]) { return; }

   // Wind Direction, Speed, Beaufort, Average & Gusts
   setAjax("wdir","<img src=pix/" + wd[2] + ".png width=\"135\" height=\"135\" \">");
   setAjax("wspd",wd[0]);
   setAjax("buft",wd[1]);
   setAjax("wavg","Avg: " + wd[3]);
   setAjax("wgst","Gust: " + wd[4]);

   // Dominant Winds
   var dwtx = "";
   for (i=0; i < 16; i++) { if (wd[5] & pwr[i]) { dwtx = dwtx + "<div id=\"dominant_wind\"><img src=\"pix/_" + dir[i] + ".png\" width=\"135\" height=\"135\"></div>"; }}
   setAjax("dwin",dwtx);

   // Temperature
   c = (wd[6]-32)/1.8; degc = c.toFixed(1);
   if (wd[77] & 1) { trend = "RR"; } else if (wd[78] & 1) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 1) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("temp","<img src=pix/" + trend + ".png width=\"13\" height=\"13\" title=\"Temperature: " + wd[6] + "&deg; F | " + degc + "&deg; C\">" + wd[6] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">") ;

   // Humidity
   if (wd[77] & 2) { trend = "RR"; } else if (wd[78] & 2) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 2) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("humd","<img src=pix/" + trend + ".png width=\"13\" height=\"13\">" + wd[7] + "%<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Dew Point
   c = (wd[8]-32)/1.8; degc = c.toFixed(1);
   if (degc >= 23.9) { react = "| Oppressive"; } else if (degc >= 21.1) { react = "| Tropical"; } else if (degc >= 18.3) { react = "| Sticky"; } else if (degc >= 15.6) { react = "| Humid"; } else if (degc >= 13.8) { react = "| Comfortable"; } else if (degc >= 10) { react = "| Refreshing"; } else { react = ""; }
   if (wd[77] & 4) { trend = "RR"; } else if (wd[78] & 4) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 4) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("dpnt","<img src=pix/" + trend + ".png width=\"13\" height=\"13\" title=\"Dew Point: " + wd[8] + "&deg; F | " + degc + "&deg; C " + react + "\">" + wd[8] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Barometric Pressure & Trends
   m = wd[9] * 33.86388;  milb=m.toFixed(1);
   if (wd[81] & 8) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("btrd","<img src=pix/" + wd[10] + ".png width=\"13\" height=\"13\" title=\"Barometer: " + wd[9] + "&quot; | " + milb + " mb and " + wd[11] + "\">" + wd[9] + "\"<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");
   setAjax("brtt",wd[11]);

   // Heat Index/SSI/WBGT
   s = (1.98 * (wd[6] - (0.55 - 0.0055 * (wd[7])) * (wd[6] - 58)) - 56.83); ssi = s.toFixed(1);
   var wbgt = wd[12] * 0.4876 + 39.986;
   if (wbgt >= 90) { risk = "Black Flag"; } else if (wbgt >= 88) { risk = "Red Flag"; } else if (wbgt >= 85) { risk = "Yellow Flag"; } else if (wbgt >= 80) { risk = "Green Flag"; } else { risk = "White Flag"; }
   if (wd[12] != "-- --") { title = "Summer Simmer Index: " + ssi + "&deg; | WBGT: " + risk; } else { title = ""; }
   if (wd[77] & 16) { trend = "RR"; } else if (wd[78] & 16) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 16) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("hidx","<img src=pix/" + trend + ".png width=\"13\" height=\"13\" title=\"" + title + "\">" + wd[12] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Wind Chill
   if (wd[77] & 32) { trend = "RR"; } else if (wd[78] & 32) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 32) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("wchl","<img src=pix/" + trend + ".png width=\"13\" height=\"13\">" + wd[13] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Daily Rainfall
   title = "Daily rainfall: " + wd[14] + "&quot; | Last 15 mins: " + wd[15] + "&quot; | Last hour: " + wd[16] + "&quot; | Last 24 hours: " + wd[17] + "&quot;";
   if (wd[77] & 64) { trend = "RR"; } else { trend = "NA"; }
   if (wd[81] & 64) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("rain","<img src=pix/" + trend + ".png width=\"13\" height=\"13\" title=\"" + title + "\">" + wd[14] + "\"<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Rainfall Rate/Umbrella
   if (wd[15] > 0) { trend = "UM"; title = "title = \"It's raining!\""; } else { trend = "NA"; title = ""; }
   if (wd[81] & 128) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("rrat","<img src=pix/" + trend + ".png width=\"13\" height=\"13\"" + title + ">" + wd[18] + "\"<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // MTD Rainfall
   setAjax("rnmo",wd[19] + "\"");

   // YTD Rainfall
   setAjax("rnyr",wd[20] + "\"");

   // Storm Rainfall & Start Date
   setAjax("strn",wd[22] + "\"");
   setAjax("stst",wd[21]);

   // Indoor Tmp
   if (wd[77] & 128) { trend = "RR"; } else if (wd[78] & 128) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 256) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("itmp","<img src=pix/" + trend + ".png width=\"13\" height=\"13\">" + wd[23] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Indoor Hum
   if (wd[77] & 256) { trend = "RR"; } else if (wd[78] & 256) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 512) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("ihum","<img src=pix/" + trend + ".png width=\"13\" height=\"13\">" + wd[24] + "%<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Indoor Dew
   if (wd[77] & 512) { trend = "RR"; } else if (wd[78] & 512) { trend = "FR"; } else { trend = "NA"; }
   if (wd[81] & 1024) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("idpt","<img src=pix/" + trend + ".png width=\"13\" height=\"13\">" + wd[25] + "&deg;<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");

   // Forecast Icon
   if (wd[28] == 0) { setAjax("fico","<img src=pix/forecast" + wd[26] + ".png width=\"59\" height=\"51\" title=\"" + wd[27] + "\">"); }
   else if (wd[26] == 0) { setAjax("fico","<img src=pix/forecast" + wd[28] + ".png width=\"59\" height=\"51\" title=\"" + wd[29] + "\">"); }
   else { setAjax("fico","<img src=pix/forecast" + wd[26] + ".png width=\"59\" height=\"51\" title=\"" + wd[27] + "\"><img src=pix/forecast" + wd[28] + ".png width=\"59\" height=\"51\" title=\"" + wd[29] + "\">"); }

   // Forecast Rule
   if (wd[31] > 0) { wd[30] = wd[30] + "&nbsp; Calculated daily snowfall: " + wd[31] + "&quot;"; }
   setAjax("fcst",wd[30]);

   // Max Wind Speed, Direction, Time & Daily Wind Run
   if (wd[81] & 2048) { alarm = "BL"; } else { alarm = "NA"; }
   setAjax("mwdr","<img src=pix/" + wd[33] + ".png width=\"135\" height=\"135\" \">");
   setAjax("mwsd","<img src=pix/NA.png width=\"13\" height=\"13\">" + wd[32] + "<img src=pix/" + alarm + ".png width=\"13\" height=\"13\">");
   setAjax("mwtm",wd[34]);
   setAjax("dwrn","Run: " + wd[35]);

   // Max Temperature & Time
   if (wd[79] & 1) { wd[36] = "<font color=\"" + maxcolor + "\">" + wd[36] + "</font>"; }
   setAjax("mtmp",wd[36] + "&deg;");
   setAjax("mttm",wd[37]);

   // Max Humdity & Time
   if (wd[79] & 2) { wd[38] = "<font color=\"" + maxcolor + "\">" + wd[38] + "</font>"; }
   setAjax("mhum",wd[38] + "%");
   setAjax("mhtm",wd[39]);

   // Max Dew Point & Time
   if (wd[79] & 4) { wd[40] = "<font color=\"" + maxcolor + "\">" + wd[40] + "</font>"; }
   setAjax("mdpt",wd[40] + "&deg;");
   setAjax("mdtm",wd[41]);

   // Max Barometer & Time
   if (wd[79] & 8) { wd[42] = "<font color=\"" + maxcolor + "\">" + wd[42] + "</font>"; }
   setAjax("mbar",wd[42] + "\"");
   setAjax("mbtm",wd[43]);

   // Max Heat Index & Time
   if (wd[79] & 16) { wd[44] = "<font color=\"" + maxcolor + "\">" + wd[44] + "</font>"; }
   setAjax("mhid",wd[44] + "&deg;");
   setAjax("mhit",wd[45]);

   // Max Indoor Tmp & Time
   if (wd[79] & 64) { wd[46] = "<font color=\"" + maxcolor + "\">" + wd[46] + "</font>"; }
   setAjax("mitp",wd[46] + "&deg;");
   setAjax("mitt",wd[47]);

   // Max Indoor Hum & Time
   if (wd[79] & 128) { wd[48] = "<font color=\"" + maxcolor + "\">" + wd[48] + "</font>"; }
   setAjax("mihm",wd[48] + "%");
   setAjax("miht",wd[49]);

   // Max Indoor Dew & Time
   if (wd[79] & 256) { wd[50] = "<font color=\"" + maxcolor + "\">" + wd[50] + "</font>"; }
   setAjax("midp",wd[50] + "&deg;");
   setAjax("midt",wd[51]);

   // Max Rainfall Rate & Time
   setAjax("mrfr",wd[52] + "\"");
   setAjax("mrrt",wd[53]);

   // Min Temperature & Time
   if (wd[80] & 1) { wd[54] = "<font color=\"" + mincolor + "\">" + wd[54] + "</font>"; }
   setAjax("ntmp",wd[54] + "&deg;");
   setAjax("nttm",wd[55]);

   // Min Humdity & Time
   if (wd[80] & 2) { wd[56] = "<font color=\"" + mincolor + "\">" + wd[56] + "</font>"; }
   setAjax("nhum",wd[56] + "%");
   setAjax("nhtm",wd[57]);

   // Min Dew Point & Time
   if (wd[80] & 4) { wd[58] = "<font color=\"" + mincolor + "\">" + wd[58] + "</font>"; }
   setAjax("ndpt",wd[58] + "&deg;");
   setAjax("ndtm",wd[59]);

   // Min Barometer & Time
   if (wd[80] & 8) { wd[60] = "<font color=\"" + mincolor + "\">" + wd[60] + "</font>"; }
   setAjax("nbar",wd[60] + "\"");
   setAjax("nbtm",wd[61]);

   // Min Wind Chill & Time
   if (wd[80] & 32) { wd[62] = "<font color=\"" + mincolor + "\">" + wd[62] + "</font>"; }
   setAjax("nwcl",wd[62] + "&deg;");
   setAjax("nwct",wd[63]);

   // Min Indoor Tmp & Time
   if (wd[80] & 64) { wd[64] = "<font color=\"" + mincolor + "\">" + wd[64] + "</font>"; }
   setAjax("nitp",wd[64] + "&deg;");
   setAjax("nitt",wd[65]);

   // Min Indoor Hum & Time
   if (wd[80] & 128) { wd[66] = "<font color=\"" + mincolor + "\">" + wd[66] + "</font>"; }
   setAjax("nihm",wd[66] + "%");
   setAjax("niht",wd[67]);

   // Min Indoor Dew & Time
   if (wd[80] & 256) { wd[68] = "<font color=\"" + mincolor + "\">" + wd[68] + "</font>"; }
   setAjax("nidp",wd[68] + "&deg;");
   setAjax("nidt",wd[69]);

   // System Time
   setAjax("sytm",wd[70]);

   // Sunrise
   setAjax("sris",wd[72]);

   // Sunset
   setAjax("sset",wd[73]);

   // Moon Phase
   setAjax("mico","<img src=pix/moon" + wd[74] + ".png width=\"30\" height=\"30\" title=\"" + wd[75] + "\">");
   setAjax("pomt",wd[75]);

   // Heating/Cooling Degree Days
   if (wd[76] > 0) { setAjax("hcdt","Heating Degree Days"); } else { setAjax("hcdt","Cooling Degree Days"); wd[76] = wd[76] * -1; }
   setAjax("hcda",wd[76]);

   // Weather Comments
   if (wd[71] == "") { setAjax("wxcm","Weather Almanac"); } else { setAjax("wxcm","<font color=\"red\" size=\"-2\">" + wd[71] + "</font>"); }
  }
 };
 x.open("GET",url,true);
 x.send(null);

 // Change text back to default color
 setTimeout("resetColor('')",refresh);

 // Get new data after refresh
 setTimeout("ajaxLoader('wx_data.txt')",refresh);
 }
}
