// <![CDATA[
// Special thanks to: Pinto http://www.joske-online.be/ and Tom http://www.carterlake.org/
// They pioneered the basic AJAX code using WD clientraw.txt which was
// cheerfully borrowed from Tom at CarterLake.org and adapted by
// Ken True - Saratoga-weather.org  21-May-2006
// and then drastically trimmed down to use with WeatherLink by 
// Curly at ricksturf.com
// 
// Some functions will not work. See the documentation.
// -- begin settings --------------------------------------------------------------------------

var wflashDataTxt = './data5.txt'; // THE RELATIVE PATH TO THE  data5.txt FILE
var flashtime  = 1000;    // miliseconds to keep flash color on 
var flashcolor = '#333333'; // RGB color to flash for changed observations  
var reloadTime = 8000;      // reload AJAX conditions every 5 seconds (= 5000 ms)
var maxupdates = 0;	         // Maxium Number of updates allowed (set to zero for unlimited)
var maxupdater = 100;                             // maxupdates * reloadTime / 1000 = number of seconds to update
var wflashDir = '/';   // WL does not use this but it is needed.
var imagedir = './images/windicons';  // place for wind arrows, rising/falling arrows, etc.   
var useunits = 'E';         // these units are not used
var useKnots = false;       // set to true to use wind speed in Knots (otherwise 
var useMPS   = false;       // set to true for meters/second for metric wind speeds, false= km/h
var showUnits = false;       //  set to false if no units are to be displayed    
var useAMPM   = true;       // these units are not used
var showNoWind = true;      // true shows wind=0 as 'Calm' and gust=0 as 'No Wind'
var wrName   = 'wr-';       // first part of the graphic filename (followed by winddir to complete it)
var wrType   = '.gif';      // extension of the graphic filename
var wrHeight = '58';        // windrose graphic height=
var wrWidth  = '58';        // windrose graphic width=
var wrCalm   = 'wr-calm.gif';  // set to full name of graphic for calm display ('wr-calm.gif')
var aiHeight = '14';         //animated wind direction arrow height=
var aiWidth = '14';         //animated wind direction arrow width=
// -- end of settings -------------------------------------------------------------------------
var langBeaufort = new Array ( /* Beaufort 0 to 12 in array */
 "Calm", "Light air", "Light breeze", "Gentle breeze", "Moderate breeze", "Fresh breeze",
 "Strong breeze", "Near gale", "Gale", "Strong gale", "Storm",
 "Violent storm", "Hurricane"
);

var langWindDir = new Array( /* used for alt and title tags on wind dir arrow and wind direction display */
	"N", "NNE", "NE", "ENE", 
	"E", "ESE", "SE", "SSE", 
	"S", "SSW", "SW", "WSW", 
	"W", "WNW", "NW", "NNW");

var langWindCalm = 'Calm';
var langGustNone = 'none';
var langWindFrom = 'Wind from '; /* used on alt/title tags on wind direction arrow*/

// --- you don't need to customize the stuff below, the actions are controlled by the settings above.  
var ie4=document.all;
var browser = navigator.appName;
var counterSecs = 0;  // for MCHALLIS counter script from weather-watch.com (adapted by K. True)
var updates = 0;		// update counter for limit by maxupdates
var updater = 0;
var lastajaxtime = 'unknown'; //used to reset the counter when a real update is done
var doTooltip = 0;   // set to 1 to have ajaxed variable names appear as tooltips (except for graphics)
// handle setup options for units-of-measure and whether to show them at all
// note.. 
// --------------- DON'T change thise defaults ---- they are the units used
var uomTemp = '&deg;'; 	var uomTempCnvt = 0;    //       removed the space    
var uomWind = 'mph';   	var uomWindCnvt = 0;    //       removed the space  
var uomBaro = 'in';  	var uomBaroCnvt = 0;    //       removed the space & Hg    
var uomRain = 'in';    	var uomRainCnvt = 0;    //       removed the space     
var uomPerHr = '/hr';
var uomWindDir = '&deg;';


function ajax_set_units( units ) {
//   Establish overall units for  script to use
//   Default is English 
//   ='M' chooses Metric  C, km/h, hPa, mm, m, km (option for m/s for wind)   This may not work with WL
//   ="W" forces pull of values from Config/Units.txt file 
if (units == 'M') { // set to metric
	uomTemp = '&deg;C'; 	uomTempCnvt = 1;
	uomWind = ' km/h';		uomWindCnvt = 1;
	if(useMPS)   { uomWind = ' m/s'; uomWindCnvt = 3;}
  }

} // end ajax_set_units()

// utility function to display UOM based on showUnits flag
function ajaxUOM ( uom ) {
	if (showUnits) { 
		return( uom );
	} else {
		return( "" );
	}
}

// utility function to display UOM based on showUnits flag
function nilWind ( v1, v2 ) {
	if (showNoWind) { 
		return( v1 );
	} else {
		return( v2 );
	}
}


function convertWind  ( rawwind ) {
  var retval = 0;
  switch (uomWindCnvt) { // convert from MPH to
	case 0 : // MPH
  		retval = rawwind * 1.0;
		break;
	case 1: // KPH
		retval = rawwind * 1.609344;
		break;
	case 2: // knots
		retval = rawwind * 0.868976242;
		break;
	case 3: // meters per second
		retval = rawwind * 0.44704;
		break;
	default:
	    retval = rawwind * 1.0;
  }
  
  return (retval.toFixed(0));     

}

// utility functions to navigate the HTML tags in the page
function get_ajax_tags ( ) {
// search all the span tags and return the list with class="ajax" in it
//
  if (ie4 && browser != "Opera") {
    var elem = document.body.getElementsByTagName('span');
	var lookfor = 'className';
  } else {
    var elem = document.getElementsByTagName('span');
	var lookfor = 'class';
  }
     var arr = new Array();
	 var iarr = 0;
     for(var i = 0; i < elem.length; i++) {
          var att = elem[i].getAttribute(lookfor);
          if(att == 'ajax') {
               arr[iarr] = elem[i];
               iarr++;
          }
     }

     return arr;
}


function set_ajax_obs( name, value ) {
// store away the current value in both the doc and the span as lastobs="value"
		var element = document.getElementById(name);
		if (! element ) { return; } // V1.04 -- don't set if missing the <span id=name> tag
		var lastobs = element.getAttribute("lastobs");
		element.setAttribute("lastobs",value);
		if (value != unescape(lastobs)) {
          element.style.color=flashcolor;
		  if ( doTooltip ) { element.setAttribute("title",'AJAX tag '+name); }
		}
		element.innerHTML =  value;
}

function set_ajax_uom( name, onoroff ) {
// this function will set an ID= to visible or hidden by setting the style="display: "
// from 'inline' or 'none'
		var element = document.getElementById(name);
		if (! element ) { return; } 
		if (onoroff) {
          element.style.display='inline';
		} else {
          element.style.display='none';
		}
}

// --- end of flash-green functions
function windDir ($winddir)
// Take wind direction value, return the
// text label based upon 16 point compass -- function by beeker425
//  see http://www.weather-watch.com/smf/index.php/topic,20097.0.html
{
   $windlabel = new Array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
   return $windlabel[Math.floor(((parseInt($winddir) + 11) / 22.5) % 16 )];
}

function windDirLang ($winddir)
// text label based upon 16 point compass -- function by beeker425
//  see http://www.weather-watch.com/smf/index.php/topic,20097.0.html
{
   return langWindDir[Math.floor(((parseInt($winddir) + 11) / 22.5) % 16 )];
}

function ajax_get_beaufort_number ( wind ) { 
// return a number for the beaufort scale based on wind mph
  if (wind < 1 ) {return("0"); }
  if (wind < 4 ) {return("1"); }
  if (wind < 8 ) {return("2"); }
  if (wind < 13 ) {return("3"); }
  if (wind < 19 ) {return("4"); }
  if (wind < 25 ) {return("5"); }
  if (wind < 32 ) {return("6"); }
  if (wind < 39 ) {return("7"); }
  if (wind < 47 ) {return("8"); }
  if (wind < 55 ) {return("9"); }
  if (wind < 64 ) {return("10"); }
  if (wind < 73 ) {return("11"); }
  if (wind >= 73 ) {return("12"); }
  return("0");
}


function ajax_genarrow( nowTemp, yesterTemp, Legend, textUP, textDN, numDp) {
// generate an <img> tag with alt= and title= for rising/falling values	
  var diff = nowTemp.toFixed(3) - yesterTemp.toFixed(3);
  var absDiff = Math.abs(diff);
  var diffStr = '' + diff.toFixed(numDp);  // sprintf("%01.0f",$diff);
  var absDiffStr = '' + absDiff.toFixed(numDp); // sprintf("%01.0f",$absDiff);
  var image = '';
  var msg = '';
  
  if (diff == 0) {
 // no change
    image = '&nbsp;'; 
  } else if (diff > 0) {
// today is greater 
//    msg = textUP + " by " + diff.toFixed(1); // sprintf($textDN,$absDiff); 
	msg = textUP.replace(/\%s/,absDiffStr);
    image = "<img src=\"" + imagedir + "/rising.gif\" alt=\"" + msg + 
	"\" title=\""+ msg + 
	"\" width=\"7\" height=\"8\" style=\"border: 0; margin: 1px 3px;\" />";
  } else {
// today is lesser
    msg = textDN.replace(/\%s/,absDiffStr); // sprintf($textDN,$absDiff); 
//	msg = textDN.replace(/\%s/,absDiffStr);
    image = "<img src=\"" + imagedir + "/falling.gif\" alt=\"" + msg + 
	"\" title=\""+ msg + 
	"\" width=\"7\" height=\"8\" style=\"border: 0; margin: 1px 3px;\" />";
   
  }

   if (Legend) {
       return (diff + Legend + image);
	} else {
	   return image;
	}
} // end genarrow function

function ajax_format_time(rawtime) {
// convert 24hr time to 12hr time (for updated time only)
	if (! useAMPM ) {
		return(rawtime); // keep it as 24hr time
	}
	
	var hms = rawtime.split(":");
	var amOrPm = "am";
	if (hms[0] > 11) {amOrPm = "pm";}
	if (hms[0] > 12) {hms[0] = hms[0] - 12;}
	if (hms[0] == 0) {hms[0] = 12;}
	return(hms[0] + ":" + hms[1] + ":" + hms[2] + amOrPm);
}
// Mike Challis' counter function (adapted by Ken True)
//
function ajax_countup() {
 element = document.getElementById("ajaxcounter");
 if (element) {
  element.innerHTML = counterSecs;
  counterSecs++;
 }
}

function ajaxGetDataTxt(url) {
// read the data.txt file and set up all-time records
  if (document.getElementById) {
    var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(url);
   
  }
  if (x) { // got something back
    x.onreadystatechange = function() {
    try { if (x.readyState == 4 && x.status == 200) { // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE
      var data1 = x.responseText.split('|'); // assuming pipe-delimited format
	// now make sure we got the entire data5.txt  -- thanks to Johnnywx
	var wdpattern=/.*:/; 
	if( wdpattern.test(data1[92]) &&
		( updates <= maxupdates || maxupdates > 0  )) { // got it.. process data5.txt
		if (maxupdates > 0 ) {updates++; } // increment counter if needed     


        set_ajax_obs("ajaxinsideTemp",data1[1]+'&deg;'); 
        set_ajax_obs("ajaxhiInsideTemp",data1[2]+'&deg;'); 
        set_ajax_obs("ajaxlowInsideTemp",data1[3]+'&deg;'); 
        set_ajax_obs("ajaxhiInsideTempTime",data1[4]+'m');
        set_ajax_obs("ajaxlowInsideTempTime",data1[5]+'m');
        set_ajax_obs("ajaxhiMonthlyInsideTemp",data1[6]+'&deg;');
        set_ajax_obs("ajaxlowMonthlyInsideTemp",data1[7]+'&deg;');
        set_ajax_obs("ajaxhiYearlyInsideTemp",data1[8]+'&deg;');
        set_ajax_obs("ajaxlowYearlyInsideTemp",data1[9]+'&deg;');
        set_ajax_obs("ajaxoutsideTemp",data1[10]+'&deg;');
        set_ajax_obs("ajaxhiOutsideTemp",data1[11]+'&deg;');
        set_ajax_obs("ajaxlowOutsideTemp",data1[12]+'&deg;');
        set_ajax_obs("ajaxhiOutsideTempTime",data1[13]+'m');
        set_ajax_obs("ajaxlowOutsideTempTime",data1[14]+'m');
        set_ajax_obs("ajaxhiMonthlyOutsideTemp",data1[15]+'&deg;');
        set_ajax_obs("ajaxlowMonthlyOutsideTemp",data1[16]+'&deg;');
        set_ajax_obs("ajaxhiYearlyOutsideTemp",data1[17]+'&deg;');
        set_ajax_obs("ajaxlowYearlyOutsideTemp",data1[18]+'&deg;');
        set_ajax_obs("ajaxinsideHumidity",data1[19]+'%');
        set_ajax_obs("ajaxhiInsideHumidity",data1[20]+'%');
        set_ajax_obs("ajaxlowInsideHumidity",data1[21]+'%');
        set_ajax_obs("ajaxhiInsideHumidityTime",data1[22]+'m');
        set_ajax_obs("ajaxlowInsideHumidityTime",data1[23]+'m');
        set_ajax_obs("ajaxhiMonthlyInsideHumidity",data1[24]+'%');
        set_ajax_obs("ajaxlowMonthlyInsideHumidity",data1[25]+'%');
        set_ajax_obs("ajaxhiYearlyInsideHumidity",data1[26]+'%');
        set_ajax_obs("ajaxlowYearlyInsideHumidity",data1[27]+'%');
        set_ajax_obs("ajaxoutsideHumidity",data1[28]+'%');
        set_ajax_obs("ajaxlowHumidity",data1[29]+'%');
        set_ajax_obs("ajaxhiHumidity",data1[30]+'%');
        set_ajax_obs("ajaxlowHumTime",data1[31]+'m');
        set_ajax_obs("ajaxhiHumTime",data1[32]+'m');
        set_ajax_obs("ajaxhiMonthlyHumidity",data1[33]+'%');
        set_ajax_obs("ajaxlowMonthlyHumidity",data1[34]+'%');
        set_ajax_obs("ajaxhiYearlyHumidity",data1[35]+'%');
        set_ajax_obs("ajaxlowYearlyHumidity",data1[36]+'%');
        set_ajax_obs("ajaxbarometer",data1[37]+' in');
        set_ajax_obs("ajaxBarTrend",data1[38]);
        set_ajax_obs("ajaxlowBarometer",data1[39]+' in');        
        set_ajax_obs("ajaxhiBarometer",data1[40]+' in');
        set_ajax_obs("ajaxlowMonthlyBarometer",data1[41]+' in');
        set_ajax_obs("ajaxhiMonthlyBarometer",data1[42]+' in');
        set_ajax_obs("ajaxlowYearlyBarometer",data1[43]+' in');
        set_ajax_obs("ajaxhiYearlyBarometer",data1[44]+' in');
        set_ajax_obs("ajaxlowBarometerTime",data1[45]+'m');
        set_ajax_obs("ajaxhiBarometerTime",data1[46]+'m');
        set_ajax_obs("ajaxwindSpeed",data1[47]+' mph');
        set_ajax_obs("ajaxwind10Avg",data1[48]+' mph');
        set_ajax_obs("ajaxhiWindSpeed",data1[49]+' mph');
        set_ajax_obs("ajaxhiWindSpeedTime",data1[50]+'m');
        set_ajax_obs("ajaxhiMonthlyWindSpeed",data1[51]+' mph');
        set_ajax_obs("ajaxhiYearlyWindSpeed",data1[52]+' mph');
        set_ajax_obs("ajaxwindDir",data1[53]);
        set_ajax_obs("ajaxwindDirection",data1[54]);
        set_ajax_obs("ajaxwindChill",data1[55]+'&deg;');
        set_ajax_obs("ajaxlowWindchill",data1[56]+'&deg;');
        set_ajax_obs("ajaxlowWindchillTime",data1[57]+'m');
        set_ajax_obs("ajaxlowMonthlyWindchill",data1[58]+'&deg;');
        set_ajax_obs("ajaxlowYearlyWindchill",data1[59]+'&deg;');
        set_ajax_obs("ajaxtotalRain",data1[60]+' in');
        set_ajax_obs("ajaxdailyRain",data1[61]+' in');
        set_ajax_obs("ajaxmonthlyRain",data1[62]+' in');
        set_ajax_obs("ajaxstormRain",data1[63]+' in');
        set_ajax_obs("ajaxrainRate",data1[64]+' in');
        set_ajax_obs("ajaxhiRainRate",data1[65]+' in');
        set_ajax_obs("ajaxhiRainRateTime",data1[66]);
        set_ajax_obs("ajaxhiRainRateHour",data1[67]+' in');
        set_ajax_obs("ajaxhiMonthlyRainRate",data1[68]+' in');
        set_ajax_obs("ajaxhiYearlyRainRate",data1[69]+' in');
        set_ajax_obs("ajaxoutsideDewPt",data1[70]+'&deg;');
        set_ajax_obs("ajaxhiDewpoint",data1[71]+'&deg;');
        set_ajax_obs("ajaxlowDewpoint",data1[72]+'&deg;');
        set_ajax_obs("ajaxhiDewpointTime",data1[73]+'m');
        set_ajax_obs("ajaxlowDewpointTime",data1[74]+'m');
        set_ajax_obs("ajaxhiMonthlyDewpoint",data1[75]+'&deg;');
        set_ajax_obs("ajaxlowMonthlyDewpoint",data1[76]+'&deg;');
        set_ajax_obs("ajaxhiYearlyDewpoint",data1[77]+'&deg;');
        set_ajax_obs("ajaxlowYearlyDewpoint",data1[78]+'&deg;');
        set_ajax_obs("ajaxinsideDewPt",data1[79]+'&deg;');
        set_ajax_obs("ajaxoutsideHeatIndex",data1[80]+'&deg;');
        set_ajax_obs("ajaxhiHeatindex",data1[81]+'&deg;');
        set_ajax_obs("ajaxhiHeatindexTime",data1[82]+'m');
        set_ajax_obs("ajaxhiMonthlyHeatindex",data1[83]+'&deg;');
        set_ajax_obs("ajaxhiYearlyHeatindex",data1[84]+'&deg;');
        set_ajax_obs("ajaxinsideHeatIndex",data1[85]+'&deg;');
        set_ajax_obs("ajaxthw",data1[86]);
        set_ajax_obs("ajaxemc",data1[87]);
        set_ajax_obs("ajaxemcUnit",data1[88]);
        set_ajax_obs("ajaxairDensity",data1[89]);
        set_ajax_obs("ajaxairDensityUnit",data1[90]);
        set_ajax_obs("ajaxdate",data1[91]);
        set_ajax_obs("ajaxtime",data1[92]+'m');
        set_ajax_obs("ajaxutcTime",data1[93]+'m');
        set_ajax_obs("ajaxutcDate",data1[94]);
        set_ajax_obs("ajaxstationDate",data1[95]);
        set_ajax_obs("ajaxstationTime",data1[96]+'m');
        set_ajax_obs("ajaxStationName",data1[97]);
        set_ajax_obs("ajaxStationCity",data1[98]);
        set_ajax_obs("ajaxStationState",data1[99]);
        set_ajax_obs("ajaxStationElevation",data1[100]);
        set_ajax_obs("ajaxStationLatitude",data1[101]);
        set_ajax_obs("ajaxStationLongitude",data1[102]);
        set_ajax_obs("ajaxsunriseTime",data1[103]+'m');
        set_ajax_obs("ajaxsunsetTime",data1[104]+'m');
        set_ajax_obs("ajaxtempUnit",data1[105]);
        set_ajax_obs("ajaxhumUnit",data1[106]);
        set_ajax_obs("ajaxwindUnit",data1[107]);
        set_ajax_obs("ajaxbarUnit",data1[108]);
        set_ajax_obs("ajaxrainUnit",data1[109]);
        set_ajax_obs("ajaxrateUnit",data1[110]);
        set_ajax_obs("ajaxForecastStr",data1[111]);



		//CURRENT WIND GUST
		var gust = convertWind(data1[47]);
 
 		//CURRENT WIND SPEED
		var wind = convertWind(data1[47]);
		set_ajax_obs("ajaxwinduom",uomWind);
		set_ajax_obs("ajaxgustuom",uomWind);
		var windcardinal = windDir(data1[53]);
	    var windcardinalLang = windDirLang(data1[53]);  // for language translation
	
		if (wind >= 0.1) {
			set_ajax_obs("ajaxwind",wind+' mph');
			set_ajax_uom("ajaxwinduom",true);
		} else {
			set_ajax_obs("ajaxwind",nilWind(langWindCalm,'0'));
			set_ajax_uom("ajaxwinduom",false);
		}
	
	
		if (gust > 0.0 || wind > 0.0) {
			set_ajax_obs("ajaxwindicon","<img src=\""+imagedir+"/"+windcardinal + ".gif\" width=\""+aiWidth+"\" height=\""+aiHeight+"\" alt=\"" +   
						 langWindFrom + windcardinalLang + "\" title=\"" + 
						 langWindFrom + windcardinalLang + "\" /> ");
			set_ajax_obs("ajaxat",'&nbsp;at&nbsp;');      //                                                     
			set_ajax_obs("ajaxwindiconwr",
		                "<img src=\"" + imagedir + "/" +wrName +  windcardinal + wrType + "\" width=\""+
		                wrWidth+"\" height=\""+wrHeight+"\" alt=\"" + 
		                langWindFrom + windcardinalLang + "\" title=\"" +
						langWindFrom + windcardinalLang + "\" /> ");
			set_ajax_obs("ajaxwinddir",windcardinalLang);
		} else {
			set_ajax_obs("ajaxwindicon",nilWind(" ",
				"<img src=\""+imagedir+"/"+windcardinal + ".gif\" width=\""+aiWidth+"\" height=\""+aiHeight+"\" alt=\"" +
			    langWindFrom + windcardinalLang + "\" title=\"" + 
				langWindFrom + windcardinalLang + "\" /> "));
			set_ajax_obs("ajaxat",'');      //                                                                     
			set_ajax_obs("ajaxwinddir",nilWind('',windcardinalLang));
		    if (wrCalm != '') {
 		      set_ajax_obs("ajaxwindiconwr",
		      "<img src=\"" + imagedir + "/" + wrCalm + "\" width=\""+
		      wrWidth+"\" height=\""+wrHeight+"\" alt=\"" + 
		      langBeaufort[0] + "\" title=\"" +langBeaufort[0] + "\" /> ");
		    }

		}

		set_ajax_obs("ajaxtemp",data1[10]+'&deg;');
		set_ajax_obs("ajaxajax",'AJAX');
        set_ajax_obs("ajaxonoff",' ');
        set_ajax_obs("ajaxupdatetime",data1[92]+'m');


// --- end of processing data[n] values
      x.abort();

//      } // END if(wunits[0]

    } 

    } 

    }
      catch(e){ }  // Mike Challis added fix to fix random error: NS_ERROR_NOT_AVAILABLE

    } // END x.onreadystatechange = function() {
    x.open("GET", url, true);
    x.send(null);
    if ( (maxupdates == 0) || (updates < maxupdates-1)) {
    setTimeout("ajaxGetDataTxt(wflashDataTxt + '?' + new Date().getTime())", reloadTime); // get new data
	}
  }
 
} // end ajaxGetDataTxt function
// ---------------------------------------------------------------------------------------------
// the following runs once when this script is loaded by the browser.
// Start the countup timer
window.setInterval("ajax_countup()", 1000); // run the counter for seconds since update

ajaxGetDataTxt(wflashDataTxt + '?' + new Date().getTime());
// ---------------- end of ajaxWL.js --------------------------------
// ]]>
