// Based on script developped by Ken True - Saratoga-weather.org
// http://saratoga-weather.org/AJAX/WD/ajaxWDwx.js

// -- begin settings --------------------------------------------------------------------------
var flashcolor = '#00B000'; // color to flash for changed observations RGB 
var flashtime  = 1000;      // miliseconds to keep flash color on (2000 = 2 seconds);
var reloadTime = 2000;      // reload AJAX conditions every 5 seconds (= 5000 ms)
var maxupdates = 0;	        // Maxium Number of updates allowed (set to zero for unlimited)
                            // maxupdates * reloadTime / 1000 = number of seconds to update 
var clientrawFile = '/wdisplay/station1/clientraw.txt'; // location of clientraw.txt relative to this page on website
var clientrawFile2 = '/wdisplay/station2/clientraw.txt';
var ajaxLoaderInBody = false; // set to true if you have <body onload="ajaxLoader(..."
var imagedir = '/style/pictos';  // place for wind arrows, rising/falling arrows, etc.
var useunits = 'M';         // 'E'=USA(English) or 'M'=Metric
var useKnots = false;       // set to true to use wind speed in Knots (otherwise 
							              // wind in km/hr for Metric or mph for English will be used.
var useMPS   = false;       // set to true for meters/second for metric wind speeds, false= km/h
var useMPH   = false;       // set to true to force MPH for both English and Metric units
var useFeet  = false;       // set to true to force Feet for height in both English and Metric
var usehPa  = false;        // set to true to force hPa for baro in both English and Metric
var showUnits = false;      //  set to false if no units are to be displayed
var thermometer = './thermometer.php'; // script for dynamic thermometer PNG image (optional)
// -- end of settings -------------------------------------------------------------------------

// -- language settings -- you don't need to customize this area if you are using English -----

var langPauseMsg = 'Recharger la page pour afficher les données en temps réel. <br/>Affichage en pause depuis le'; // substitute this for ajaxindicator when
                             // maxupdates has been reached and updating paused.

var langMonths = new Array ( "Janvier","Février","Mars","Avril","Mai",
            "Juin","Juillet","Aout","Septembre","Octobre","Novembre","Décembre");
var langDays = new Array ( "Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun");	

var langBaroTrend = new Array (
 "Stable", "En hausse lente", "En hausse rapide", "En baisse lente", "En baisse rapide");

var langUVWords = new Array (
 "Index&nbsp;UV<br />nul", "Index&nbsp;UV<br />faible", "Index&nbsp;UV<br />mod&eacute;r&eacute;", "Index&nbsp;UV<br />&eacute;lev&eacute;",
 "Index&nbsp;UV<br />tr&egrave;s&nbsp;&eacute;lev&eacute;", /* be sure to include &nbsp; for space */
 "Index&nbsp;UV<br />extr&ecirc;me" );

var langBeaufort = new Array ( /* Beaufort 0 to 12 in array */
 "Vent calme", "Très légère brise", "Légère brise", "Petite brise", "Jolie brise", "Bonne brise",
 "Vent frais", "Grand frais", "Coup de vent", "Fort coup de vent", "Tempête",
 "Violente tempête", "Ouragan"
);

var langWindDir = new Array( /* used for alt and title tags on wind dir arrow and wind direction display */
    "N", "N-NE", "NE", "E-NE", "E", "E-SE", "SE", "S-SE", "S", "S-SO", "SO", "O-SO", "O", "O-NO", "NO", "N-NO");

var langWindCalm = 'Calme';
var langGustNone = 'Calme';
var langWindFrom = 'Vent de '; /* used on alt/title tags on wind direction arrow*/

var langBaroRising = 'En hausse +%s '; /* used for trend arrow alt/title tags .. %s marks where value will be placed */
var langBaroFalling = 'En baisse -%s ';
var langBaroPerHour = 'hPa /1heure.'; /* will be assembled as rising/falling + value + uom + perhour text */

var langThermoCurrently = 'Actuellement: '; /* used on alt/title tags for thermometer */
var langThermoMax     = 'Max: ';
var langThermoMin     = 'Min: ';

var langTempRising = 'En hausse +%s '; /* used for trend arrow alt/title tags .. %s marks where value will be placed */
var langTempFalling = 'En baisse -%s ';
var langTempLastHour = '°C /1heure.';

var langTransLookup = new Object;  // storage area for key/value for current conditions translation

var langHeatWords = new Array (
 'Unknown', 'Danger! canicule extr&ecirc;me', 'Danger! Chaleur extr&ecirc;me', 'Attention! Chaleur extreme', 'Extr&egrave;mement chaud ', 'Canicule',
 'Très chaud', 'Chaud','Assez chaud', 'Doux', 'Frais', 'Froid', 'Froid vif', 'Glacial', 'Froid extr&ecirc;me' );

var langLeaf = new Array (
  "Feuillage<br />sec", "Feuillage<br />humide", "Feuillage<br />mouill&eacute;");   

// -- end of language settings ----------------------------------------------------------

// --- 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 ie8 = false;
if (ie4 && /MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
 var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
 if (ieversion>=8) {
   ie4=false;
   ie8=true;
 }
}
var counterSecs = 0;  // for MCHALLIS counter script from weather-watch.com (adapted by K. True)
var counterSecs2 = 0;
var updates = 0;		// update counter for limit by maxupdates
var updates2 = 0;
var lastajaxtimeformat = 'unknown'; //used to reset the counter when a real update is done
var lastajaxtimeformat2 = 'unknown';
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
var uomTemp = '&deg;F';
var uomWind = ' mph';
var uomBaro = ' inHg';
var uomRain = ' in';
var uomHeight = ' ft';
var dpBaro = 1;
var dpRain = 1;

function ajax_set_units( units ) {
  useunits = units;
  if (useunits != 'E') { // set to metric
	uomTemp = '&deg;C';
	uomWind = ' km/h';
	uomBaro = ' hPa';
	uomRain = ' mm';
	uomHeight = ' m';
	dpBaro = 1;
	dpRain = 1;
  }
  if(useKnots) { uomWind = ' kts'; }
  if(useMPS)   { uomWind = ' m/s'; }
  if(useMPH)   { uomWind = ' mph'; }
  if(useFeet)  { uomHeight = ' ft'; }
  if(usehPa)  { uomBaro = ' hPa'; }
  if (! showUnits) {
	uomTemp = '';
	uomWind = '';
	uomBaro = '';
	uomRain = '';
	uomHeight = '';
  }
}

ajax_set_units(useunits);

// 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" && ! ie8) {
    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' || att == 'ajax2') {
               arr[iarr] = elem[i];
               iarr++;
          }
     }
	 return arr;
}

function reset_ajax_color( usecolor ) {
// reset all the <span class="ajax"...> styles to have no color override
      var elements = get_ajax_tags();
	  var numelements = elements.length;
	  for (var index=0;index!=numelements;index++) {
         var element = elements[index];
	     element.style.color=usecolor; 
      }
}

function set_ajax_obs( name, value ) {
// store away the current value in both the doc and the span as lastobs="value"
// change color if value != lastobs 
		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; // moved inside to fix flashing issue (Jim at jcweather.us)
		}
}

function set_ajax_obs2( name, value ) {
// store away the current value in both the doc and the span as lastobs="value"
// change color if value != lastobs  
		var element = document.getElementById(name);
		if (! element ) { return; } // V1.04 -- don't set if missing the <span id=name> tag
		var lastobs = element.getAttribute("lastobs2");
		element.setAttribute("lastobs2",value);
		if (value != unescape(lastobs)) {
          element.style.color=flashcolor;
		  if ( doTooltip ) { element.setAttribute("title",'AJAX2 tag '+name); }
		  element.innerHTML =  value; // moved inside to fix flashing issue (Jim at jcweather.us)
		}
}

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 windDirLang ($winddir)
// Take wind direction value, return the text label based upon 16 point compass
{
   return langWindDir[Math.floor(((parseInt($winddir) + 11) / 22.5) % 16 )];
} 

// utility functions to handle conversions from clientraw data to desired units-of-measure
function convertTemp ( rawtemp ) {
	if (useunits == 'E') { // convert C to F
		return( (1.8 * rawtemp) + 32.0);
	} else {  // leave as C
		return (rawtemp * 1.0);
	}
}

function convertWind  ( rawwind ) {
	if (useKnots) { return(rawwind * 1.0); } //force usage of knots for speed
	if (useunits == 'E' || useMPH ) { // convert knots to mph
		return(rawwind * 1.1507794);
	} else {  
	    if (useMPS) { // convert knots to m/s
		  return (rawwind * 0.514444444);
		} else { // convert knots to km/hr
		  return (rawwind * 1.852);
		}
	}
}

function convertBaro ( rawpress ) {
	if (! usehPa && useunits == 'E') { // convert hPa to inHg
	   return (rawpress  / 33.86388158);
	} else {
	   return (rawpress * 1.0); // leave in hPa
	}
}

function convertRain ( rawrain ) {
	if (useunits == 'E') { // convert mm to inches
	   return (rawrain * .0393700787);
	} else {
	   return (rawrain * 1.0); // leave in mm
	}
}

function convertUv ( rawuv ) {
	if (rawuv == '0.0') {
	   return (Math.round(rawuv * 1.0).toFixed(0));
	} else {
	   return (Math.round(rawuv * 1.0).toFixed(1));
	}
}

function convertLeaf ( rawpleaf ) { //Specif LLC
	   return (Math.round(rawpleaf * 1.0).toFixed(0));
}

function convertWindDir ( winddir ) //Specif LLC
{
   return (Math.round(winddir * 1.0).toFixed(0));
} 

function ajax_get_beaufort ( wind ) { 
// return a number for the beaufort scale based on wind knots (native WD format)
  if (wind < 1 ) {return("0 Beaufort - Calme"); }
  if (wind < 4 ) {return("1 Beaufort - Très légère brise"); }
  if (wind < 7 ) {return("2 Beaufort - Légère brise"); }
  if (wind < 11 ) {return("3 Beaufort - Petite brise"); }
  if (wind < 17 ) {return("4 Beaufort - Jolie brise"); }
  if (wind < 22 ) {return("5 Beaufort - Bonne brise"); }
  if (wind < 28 ) {return("6 Beaufort - Vent frais"); }
  if (wind < 34 ) {return("7 Beaufort - Grand frais"); }
  if (wind < 41 ) {return("8 Beaufort - Coup de vent"); }
  if (wind < 48 ) {return("9 Beaufort - Fort coup de vent"); }
  if (wind < 56 ) {return("10 Beaufort - Tempête"); }
  if (wind < 64 ) {return("11 Beaufort - Violente tempête"); }
  if (wind >= 64 ) {return("12 Beaufort - Ouragan"); }
  return("unknown " + wind);
}

function ajax_get_barotrend(btrnd) { // routine from Anole's wxsticker PHP (adapted to JS by Ken True)
   if ((btrnd >= -0.7) && (btrnd <= 0.7)) { return("Stable"); }
   if ((btrnd > 0.7) && (btrnd < 2.0)) { return("En légère hausse"); }
   if (btrnd >= 2.0) { return("En hausse rapide"); }
   if ((btrnd < -0.7) && (btrnd > -2.0)) { return("En légère baisse"); }
   if (btrnd <= -2.0) { return("En baisse rapide"); }
  return(btrnd);
}

function ajax_getUVrange ( uv ) { // code simplified by FourOhFour on wxforum.net
   var uvword = "Unspec.";
   if (uv <= 0) {
       uvword = langUVWords[0];
   } else if (uv < 3) {
       uvword = langUVWords[1];
   } else if (uv < 6) {
       uvword = langUVWords[2];
   } else if (uv < 8) {
       uvword = langUVWords[3];
   } else if (uv < 11) {
       uvword = langUVWords[4];
   } else {
       uvword = langUVWords[5];
   }
   return uvword;
} // end ajax_getUVrange function

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
	msg = 'Pas de variation sur /1heure.';
    image = "<img src=\"" + imagedir + "/steady.gif\" alt=\"" + msg + 
	"\" title=\""+ msg + 
	"\" width=\"12\" height=\"12\" style=\"border: 0; margin: 1px 3px;\" />";
  } 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=\"12\" height=\"12\" 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=\"12\" height=\"12\" style=\"border: 0; margin: 1px 3px;\" />";   
  }
   if (Legend) {
       return (diff + Legend + image);
	} else {
	   return image;
	}
} // end genarrow function

function ajax_genarrow_min( 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
	msg = 'Pas de variation sur /1heure.';
    image = "<img src=\"" + imagedir + "/steady.gif\" alt=\"" + msg + 
	"\" title=\""+ msg + 
	"\" width=\"8\" height=\"8\" style=\"border: 0; margin: 1px 3px;\" />";
  } 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=\"8\" 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=\"8\" height=\"8\" style=\"border: 0; margin: 1px 3px;\" />";   
  }
   if (Legend) {
       return (diff + Legend + image);
	} else {
	   return image;
	}
} // end genarrow function

// function to add colored heatColorWord by Mike Challis
function heatColor(temp,WindChill,Humidex) {
  var hcWord = langHeatWords[0];
 if (temp > 32 && Humidex > 29) {
  if (Humidex > 54) { return ('<span style="border: solid 1px; color: white; background-color: #BA1928;">&nbsp;'+langHeatWords[1]+'&nbsp;</span>'); }
  if (Humidex > 45) { return ('<span style="border: solid 1px; color: white; background-color: #E02538;">&nbsp;'+langHeatWords[2]+'&nbsp;</span>'); }
  if (Humidex > 39) { return ('<span style="border: solid 1px; color: black; background-color: #E178A1;">&nbsp;'+langHeatWords[4]+'&nbsp;</span>'); }
  if (Humidex > 29) { return ('<span style="border: solid 1px; color: white; background-color: #CC6633;">&nbsp;'+langHeatWords[6]+'&nbsp;</span>'); }
 } else if (WindChill < 16 ) {
  if (WindChill < -18) { return ('<span style="border: solid 1px; color: black; background-color: #91ACFF;">&nbsp;'+langHeatWords[13]+'&nbsp;</span>'); }
  if (WindChill < -9)  { return ('<span style="border: solid 1px; color: white; background-color: #806AF9;">&nbsp;'+langHeatWords[12]+'&nbsp;</span>'); }
  if (WindChill < -1)  { return ('<span style="border: solid 1px; color: white; background-color: #3366FF;">&nbsp;'+langHeatWords[11]+'&nbsp;</span>'); }
  if (WindChill < 8)   { return ('<span style="border: solid 1px; color: white; background-color: #6699FF;">&nbsp;'+langHeatWords[10]+'&nbsp;</span>'); }
  if (WindChill < 16)  { return ('<span style="border: solid 1px; color: black; background-color: #89B2EA;">&nbsp;'+langHeatWords[9]+'&nbsp;</span>'); }
 }  else if (WindChill >= 16 && temp <= 32) {
  if (temp < 26) { return ('<span style="border: solid 1px; color: black; background-color: #C6EF8C;">&nbsp;'+langHeatWords[8]+'&nbsp;</span>'); }
  if (temp <= 32) { return ('<span style="border: solid 1px; color: black; background-color: #CC9933;">&nbsp;'+langHeatWords[7]+'&nbsp;</span>'); }
  }
  return hcWord;
}

// Mike Challis' counter function (adapted by Ken True)
function ajax_countup() {
 var element = document.getElementById("ajaxcounter");
 if (element) {
  element.innerHTML = counterSecs;
  counterSecs++;
 }
}

function ajax2_countup() {
 var element = document.getElementById("ajax2counter");
 if (element) {
  element.innerHTML = counterSecs2;
  counterSecs2++;
 }
}

function ucFirst ( str ) {
   return str.substr(0,1).toUpperCase() + str.substr(1,str.length);
}

function ajaxRequest () {
	/* find the handler for AJAX based on availability of the request object */
	try { var request = new XMLHttpRequest() /* non IE browser (or IE8 native) */ }
	catch(e1) {
		try { request = ActiveXObject("Msxml2.XMLHTTP") /* try IE6+ */ }
		catch(e2) {
			try { request = ActiveXObject("Microsoft.XMLHTTP") /* try IE5 */}
			catch(e3) // no Ajax support
			{ request = false; alert('Sorry.. AJAX updates are not available for your browser.') }
		}
	}
	if (! request) { maxupdates = 1; }
	return request;
}

function ajax_getLeafRange ( leaf ) { //Specif LLC
   var leafword = "Unspec.";
   if (leaf <= 1) {
       leafword = langLeaf[0];
   } else if (leaf < 8) {
       leafword = langLeaf[1];
   } else {
       leafword = langLeaf[2];
   }
   return leafword;
} 

// ------------------------------------------------------------------------------------------
//  main function.. read clientraw.txt and format <span class="ajax" id="ajax..."></span> areas
// ------------------------------------------------------------------------------------------
function ajaxLoader(url) {
  var x = new ajaxRequest();  
  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 clientraw = x.responseText.split(' ');
	// now make sure we got the entire clientraw.txt  -- thanks to Johnnywx
	// valid clientraw.txt has '12345' at start and '!!' at end of record
	var wdpattern=/\d+\.\d+.*!!/; // looks for '!!nn.nn!!' version string 
	// If we have a valid clientraw file AND updates is < maxupdates
	if(clientraw[0] == '12345' && wdpattern.test(x.responseText) && 
	    ( updates <= maxupdates || maxupdates > 0  ) ) {
		if (maxupdates > 0 ) {updates++; } // increment counter if needed

		//Temperature
		var temp = convertTemp(clientraw[4]); 
		set_ajax_obs("ajaxtemp", temp.toFixed(1) + uomTemp); 
		set_ajax_obs("ajaxtempb", temp.toFixed(1) + uomTemp);//Specif LLC accueil
		set_ajax_obs("ajaxtempNoU", temp.toFixed(1));
		set_ajax_obs("ajaxbigtemp",temp.toFixed(0) + uomTemp);
		var templast = convertTemp(clientraw[90]);
		var temparrow = ajax_genarrow(temp, templast, '', 
			 langTempRising+uomTemp+langTempLastHour,
			 langTempFalling+uomTemp+langTempLastHour,1)
		var temparrowmin = ajax_genarrow_min(temp, templast, '', 
			 langTempRising+uomTemp+langTempLastHour,
			 langTempFalling+uomTemp+langTempLastHour,1)		
		set_ajax_obs("ajaxtemparrow",temparrow);
		set_ajax_obs("ajaxtemparrowb",temparrowmin);//Specif LLC accueil		   
	    var temprate = temp - templast;
		temprate = temprate.toFixed(1);
		if (temprate > 0.0) { temprate = '+' + temprate;} // add '+' for positive rates
		set_ajax_obs("ajaxtemprate",temprate + uomTemp);
		var tempmax = convertTemp(clientraw[46]);
		set_ajax_obs("ajaxtempmax",tempmax.toFixed(1) + uomTemp);
		var tempmin = convertTemp(clientraw[47]);
		set_ajax_obs("ajaxtempmin",tempmin.toFixed(1) + uomTemp);		
		var thermometerstr = langThermoCurrently +  + temp.toFixed(1) + uomTemp + 
		  ", " + langThermoMax + tempmax.toFixed(1) + uomTemp +
		  ", " + langThermoMin + tempmin.toFixed(1) + uomTemp;
		set_ajax_obs("ajaxthermometer",
			"<img src=\"" + thermometer + "?t=" + temp.toFixed(1) + "\" " +
				"width=\"54\" height=\"170\" " +
				"alt=\"" + thermometerstr + "\" " +
				"title=\"" + thermometerstr + "\" />" );
				
		//Humidity ...
		var humidity = clientraw[5];
		set_ajax_obs("ajaxhumidity",humidity);
		set_ajax_obs("ajaxhumidityb",humidity);//Specif LLC accueil

		set_ajax_obs("ajaxhumiditymin",clientraw[164]);

		set_ajax_obs("ajaxhumiditymax",clientraw[163]);    	
		
		//Dewpoint ...
		var dew = convertTemp(clientraw[72]);
		set_ajax_obs("ajaxdew",dew.toFixed(1) + uomTemp);
		var dewmin = convertTemp(clientraw[139]);
		set_ajax_obs("ajaxdewmin",dewmin.toFixed(1) + uomTemp);
		var dewmax = convertTemp(clientraw[138]);
		set_ajax_obs("ajaxdewmax",dewmax.toFixed(1) + uomTemp);

		// Humidex
		var humidex = convertTemp(clientraw[45]);
		set_ajax_obs("ajaxhumidex",humidex.toFixed(1) + uomTemp);
		var humidexmin = convertTemp(clientraw[76]);
		set_ajax_obs("ajaxhumidexmin",humidexmin.toFixed(1) + uomTemp);
		var humidexmax = convertTemp(clientraw[75]);
		set_ajax_obs("ajaxhumidexmax",humidexmax.toFixed(1) + uomTemp);

		//  WindChill
		var windchill = convertTemp(clientraw[44]);
		set_ajax_obs("ajaxwindchill",windchill.toFixed(1) + uomTemp);
		var windchillmin = convertTemp(clientraw[78]);
		set_ajax_obs("ajaxwindchillmin",windchillmin.toFixed(1) + uomTemp);
		var windchillmax = convertTemp(clientraw[77]);
		set_ajax_obs("ajaxwindchillmax",windchillmax.toFixed(1) + uomTemp);

		// Heat Index
		var heatidx = convertTemp(clientraw[112]);
		set_ajax_obs("ajaxheatidx",heatidx.toFixed(1) + uomTemp);
		var heatidxmin = convertTemp(clientraw[111]);
		set_ajax_obs("ajaxheatidxmin",heatidxmin.toFixed(1) + uomTemp);
		var heatidxmax = convertTemp(clientraw[110]);
		set_ajax_obs("ajaxheatidxmax",heatidxmax.toFixed(1) + uomTemp);

		// FeelsLike
		temp = clientraw[4]; // note.. temp in C
        if (temp <= 16.0 ) {
		  feelslike = clientraw[44]; //use WindChill
		} else if (temp >=27.0) {
		  feelslike = clientraw[45]; //use Humidex
		} else {
		  feelslike = temp;   // use temperature
		}
		var feelslike  = Math.round(convertTemp(feelslike));
        set_ajax_obs("ajaxfeelslike",feelslike + uomTemp);

		// # mike challis added heatColorWord feature
		var heatColorWord = heatColor(clientraw[4],clientraw[44],clientraw[45]);
		set_ajax_obs("ajaxheatcolorword",heatColorWord);
		
		// Apparent temperature
		var apparenttemp = convertTemp(clientraw[130]);
		set_ajax_obs("ajaxapparenttemp",apparenttemp.toFixed(1) + uomTemp);
		var apparenttempmin = convertTemp(clientraw[136]);
		set_ajax_obs("ajaxapparenttempmin",apparenttempmin.toFixed(1) + uomTemp);
		var apparenttempmax = convertTemp(clientraw[137]);
		set_ajax_obs("ajaxapparenttempmax",apparenttempmax.toFixed(1) + uomTemp);
		
		//Pressure...
		var pressure = convertBaro(clientraw[6]);
		set_ajax_obs("ajaxbaro",pressure.toFixed(dpBaro) + uomBaro);
		set_ajax_obs("ajaxbarob",pressure.toFixed(dpBaro) + uomBaro);//Specif LLC accueil
		set_ajax_obs("ajaxbaroNoU",pressure.toFixed(dpBaro));
		var pressuretrend = convertBaro(clientraw[50]);
		pressuretrend = pressuretrend.toFixed(dpBaro+1);
		if (pressuretrend > 0.0) {pressuretrend = '+' + pressuretrend; } // add '+' to rate
		set_ajax_obs("ajaxbarotrend",pressuretrend + uomBaro);
		set_ajax_obs("ajaxbaroarrow",
		   ajax_genarrow_min(pressure, pressure-pressuretrend, '', 
			 langBaroRising+uomBaro+langBaroPerHour,
			 langBaroFalling+uomBaro+langBaroPerHour,1)
			 );	
		var barotrendtext = ajax_get_barotrend(clientraw[50]);
		set_ajax_obs("ajaxbarotrendtext",barotrendtext);
		var pressuremin = convertBaro(clientraw[132]);
		set_ajax_obs("ajaxbaromin",pressuremin.toFixed(dpBaro) + uomBaro);
		var pressuremax = convertBaro(clientraw[131]);
		set_ajax_obs("ajaxbaromax",pressuremax.toFixed(dpBaro) + uomBaro);

    //Wind gust
		var gust    = convertWind(clientraw[140]);
		var maxgust = convertWind(clientraw[71]);
		if (maxgust > 0.0 ) {
		  set_ajax_obs("ajaxmaxgust",maxgust.toFixed(0) + uomWind);
		} else {
		  set_ajax_obs("ajaxmaxgust",'0');
		}
	  //Specif LLC
		var heust1 = clientraw[29];
    var minst1 = clientraw[30];
    var windmaxgusthtime = clientraw[134];
    windmaxgusthtimem = windmaxgusthtime.split(':')[1];
    windmaxgusthtimeh = windmaxgusthtime.split(':')[0];
		if (heust1 != windmaxgusthtimeh) {
		     windmaxgusthtimem = windmaxgusthtimem-60;
		     var diff1 = minst1 - windmaxgusthtimem ;
	       set_ajax_obs("ajaxwindmaxgusthtime",', il y a ' + diff1 + ' min.');
    } else {
         var diff1 = minst1 - windmaxgusthtimem ;
	       set_ajax_obs("ajaxwindmaxgusthtime",', il y a ' + diff1 + ' min.');
	  }//Fin specif LLC    
		
		//Vent
		var wind = convertWind(clientraw[2]);
		var beaufort = ajax_get_beaufort(clientraw[158]);
		set_ajax_obs("ajaxbeaufort",beaufort);

    //Vent moyen / 1 min.
		var windavg1mn = convertWind(clientraw[1]);
		set_ajax_obs("ajaxwindavg1mn",windavg1mn.toFixed(0) + uomWind);

    //Vent moyen /10 min.
		var windavg10mn = convertWind(clientraw[158]);
		set_ajax_obs("ajaxwindavg10mn",windavg10mn.toFixed(1) + uomWind);

		var windavground10mn = convertWind(clientraw[158]);//Specif LLC
		set_ajax_obs("ajaxwindavground10mn",windavground10mn.toFixed(0) + uomWind);

    //WIND DIRECTION ...
    var valdir = convertWindDir(clientraw[3]);
    var valdiravg10mn = convertWindDir(clientraw[117]);	    
    if (valdir == 360 && valdiravg10mn > 60 && valdiravg10mn < 300) {//Specif LLC  Pb anémo
  	    valdir = valdiravg10mn;
    }    
    var val = windDirLang(valdir);
    var valavg10mn = windDirLang(clientraw[117]);   	
       if (wind > 70.0) {//Specif LLC 
    set_ajax_obs("ajaxwindcolor",'#FF0000');          
		set_ajax_obs("ajaxwind",'<span style="color: red;">&nbsp;'+wind.toFixed(0)+'&nbsp;</span>');
		set_ajax_obs("ajaxwindb",'<span style="color: red;">&nbsp;'+wind.toFixed(0)+'&nbsp;</span>');//Specif LLC accueil		
		set_ajax_uom("ajaxwinduom",true);
	   } else if (wind > 0.0) {
	  set_ajax_obs("ajaxwindcolor",'#485A6D');                             
		set_ajax_obs("ajaxwind",wind.toFixed(0) + uomWind);
		set_ajax_obs("ajaxwindb",wind.toFixed(0) + uomWind);//Specif LLC accueil		
		set_ajax_uom("ajaxwinduom",true);
	   } else {	   
		set_ajax_obs("ajaxwind",0);
    set_ajax_obs("ajaxwindb",0);//Specif LLC accueil	
	   }	   
		var windmaxgust = convertWind(clientraw[71]);
		set_ajax_obs("ajaxwindmaxgust",windmaxgust.toFixed(1) + uomWind); 
    var windmaxgusth = convertWind(clientraw[133]);
    var diffwindmaxgust = windmaxgust - windmaxgusth;//Specif LLC
    if (diffwindmaxgust < 1 || (windmaxgust < windmaxgusth)){
	      set_ajax_obs("ajaxwindmaxgusth",windmaxgust.toFixed(0) + uomWind);
	      windmaxgusth = windmaxgust;
    } else {
	      set_ajax_obs("ajaxwindmaxgusth",windmaxgusth.toFixed(0) + uomWind);
	  }             	   
	  if (gust > 0.0) { 
		  var diffwindgust = windmaxgusth - gust;//Specif LLC        	 
      if (diffwindgust < 1 || (windmaxgusth < gust)) {
  	      set_ajax_obs("ajaxgust",windmaxgusth.toFixed(0) + uomWind);
      } else {
  	      set_ajax_obs("ajaxgust",gust.toFixed(0) + uomWind);
  	  }  
		  set_ajax_uom("ajaxgustuom",true);
	  } else {
  		set_ajax_obs("ajaxgust",0);   
  		set_ajax_uom("ajaxgustuom",false);
	  }  	   
   	   if (gust > 0.0 || wind > 0.0) {
 		set_ajax_obs("ajaxwindicon","<img src=\"" + imagedir + "/" +  val + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + val + "\" /> ");
 		set_ajax_obs("ajaxwindiconb","<img src=\"" + imagedir + "/" +  val + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + val + "\" /> ");//Specif LLC accueil			
 		set_ajax_obs("ajaxwindiconwr","<img src=\"" + imagedir + "/wr-" +  val + ".gif\" width=\"58\" height=\"58\" alt=\"Direction : " + 
		val + "\" title=\"Direction : " + val + "\" /> ");
		set_ajax_obs("ajaxwinddir",val);
		set_ajax_obs("ajaxwinddirb",val);//Specif LLC accueil
		set_ajax_obs("ajaxwindavg10mnicon","<img src=\"" + imagedir + "/" +  valavg10mn + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + valavg10mn + "\" /> ");//Avg 10min		
    set_ajax_obs("ajaxwindavg10mndir",valavg10mn);//Avg 10min		
	   } else {
 		set_ajax_obs("ajaxwindicon","");
 		set_ajax_obs("ajaxwindiconb","");//Specif LLC accueil	
		set_ajax_obs("ajaxwinddir","");
		set_ajax_obs("ajaxwinddirb","");//Specif LLC accueil
		set_ajax_obs("ajaxwindavg10mnicon","");//Avg 10min			
		set_ajax_obs("ajaxwindavg10mndir","");//Avg 10min	
    }
    var windmaxavg = convertWind(clientraw[113]);
		set_ajax_obs("ajaxwindmaxavg",windmaxavg.toFixed(1) + uomWind);         
		var windmaxgusttime = clientraw[135];
		windmaxgusttime = windmaxgusttime.toLowerCase();
		windmaxgusttime = windmaxgusttime.replace( "_" , "");
		set_ajax_obs("ajaxwindmaxgusttime",windmaxgusttime);

		//  Solar Radiation
		var solar    = clientraw[127] * 1.0;
		set_ajax_obs("ajaxsolar",solar.toFixed(0));
        var solarpct = clientraw[34];
		set_ajax_obs("ajaxsolarpct",solarpct);
		
		// UV Index		
		var uv = convertUv(clientraw[79]);
		set_ajax_obs("ajaxuv",uv) ;
 		var uvword = ajax_getUVrange(uv);
		set_ajax_obs("ajaxuvword",uvword);

		//Rain ...
		var rain = convertRain(clientraw[7]);
		set_ajax_obs("ajaxrain",rain.toFixed(dpRain) + uomRain);
		set_ajax_obs("ajaxrainNoU",rain.toFixed(dpRain));
		var rainydy = convertRain(clientraw[19]);
		set_ajax_obs("ajaxrainydy",rainydy.toFixed(dpRain)+ uomRain);
		var rainmo = convertRain(clientraw[8]);
		set_ajax_obs("ajaxrainmo",rainmo.toFixed(dpRain) + uomRain);
		var rainyr = convertRain(clientraw[9]);
		set_ajax_obs("ajaxrainyr",rainyr.toFixed(dpRain) + uomRain);
		var rainratehr = convertRain(clientraw[10]) * 60; // make per hour rate.
		var rainratemax = convertRain(clientraw[11]) * 60; // make per hour rate		
		if (rainratehr == 0) { //Specif LLC
	       set_ajax_obs("ajaxrainratehr","---");
	       set_ajax_obs("ajaxrainratemax","");
    } else {
	       set_ajax_obs("ajaxrainratehr",rainratehr.toFixed(1) + uomRain + ' mm/h');
	       set_ajax_obs("ajaxrainratemax",rainratemax.toFixed(1) + uomRain + ' mm/h');
	  }
		// Provides Date String Objects in the form of
		// ntime = HH:MM                as in 17:24
		// ndate = Mon DD, YYYY         as in Nov 14, 2007
		// tday  = 3 letter Abr of Day  as in Wed
		// All combined you could end up with   Mon Nov 14, 2007
		// Uses clientraw elements:
		// Hour 29  Min 30  Day 35  Month 36  Year 141
		// Added 2007-11-14 by Kevin Reed TNETWeather.com
		//======================================================================
		var ntime = clientraw[29] + ":" + clientraw[30];
		var ndate = langMonths[ clientraw[36] -1 ].substring(0,3) + " " + clientraw[35] + " " + clientraw[141];
		var ndate2 = clientraw[35] + "-" +langMonths[ clientraw[36] -1 ].substring(0,3) + "-" +  clientraw[141];
		var myDate = new Date( langMonths[ clientraw[36] - 1 ] + " " + clientraw[35] + ", " + clientraw[141] );
		var tday = langDays[myDate.getDay()];
		set_ajax_obs("ajaxndate", ndate );
		set_ajax_obs("ajaxndate2",ndate2);
		set_ajax_obs("ajaxntime", ntime );
		set_ajax_obs("ajaxntimess", ntime + ":" + clientraw[31]);
		set_ajax_obs("ajaxdname", tday );
		// current date and time of observation in clientraw.txt
		var ajaxtimeformat = clientraw[32];
		var ajaxdateformat = clientraw[74];
		ajaxtimeformat = ajaxtimeformat.split('-')[1];
		ajaxtimeformat = ajaxtimeformat.replace( "_" , "");
		ajaxtimeformat = ajaxtimeformat.toLowerCase();
		set_ajax_obs("ajaxdatetime",ajaxdateformat + " " +ajaxtimeformat);
		set_ajax_obs("ajaxdate",ajaxdateformat);
		set_ajax_obs("ajaxtime",ajaxtimeformat);		
  	if (lastajaxtimeformat != ajaxtimeformat) {
			counterSecs = 0;                      // reset timer
			lastajaxtimeformat = ajaxtimeformat; // remember this time
		}
		
		// now ensure that the indicator flashes on every AJAX fetch
        var element = document.getElementById("ajaxindicator");
		if (element) {
          element.style.color = flashcolor;
		}
		if (maxupdates > 0 && updates > maxupdates-1) { /* chg indicator to pause message */
			set_ajax_obs("ajaxindicator",langPauseMsg);
		}
 	  } // END if(clientraw[0] = '12345' and '!!' at end) 

	 } // END if (x.readyState == 4 && x.status == 200)

    } // END try

   	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);

//  reset the flash colors, and restart the update unless maxupdate limit is reached

    setTimeout("reset_ajax_color('')",flashtime); // change text back to default color 

	if ( (maxupdates == 0) || (updates < maxupdates-1)) {
      setTimeout("ajaxLoader(clientrawFile + '?' + new Date().getTime())", reloadTime); // get new data 
    }
  }
} // end ajaxLoader function


function ajax2Loader(url) {
  var x = new ajaxRequest();
  
  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 clientraw = x.responseText.split(' ');
	// now make sure we got the entire clientraw.txt  -- thanks to Johnnywx
	// valid clientraw.txt has '12345' at start and '!!' at end of record
	var wdpattern=/\d+\.\d+.*!!/; // looks for '!!nn.nn!!' version string 
	// If we have a valid clientraw file AND updates is < maxupdates
	if(clientraw[0] == '12345' && wdpattern.test(x.responseText) && 
	    ( updates2 <= maxupdates || maxupdates > 0  ) ) {
		if (maxupdates > 0 ) {updates2++; } // increment counter if needed

		//Temperature
		var temp = convertTemp(clientraw[4]);
		set_ajax_obs2("ajax2temp", temp.toFixed(1) + uomTemp);
		set_ajax_obs2("ajax2tempb", temp.toFixed(1) + uomTemp);//Specif LLC accueil
		set_ajax_obs2("ajax2tempNoU", temp.toFixed(1));
		set_ajax_obs2("ajax2bigtemp",temp.toFixed(0) + uomTemp);
		var templast = convertTemp(clientraw[90]);
		var temparrow = ajax_genarrow(temp, templast, '', 
			 langTempRising+uomTemp+langTempLastHour,
			 langTempFalling+uomTemp+langTempLastHour,1)
		var temparrowmin = ajax_genarrow_min(temp, templast, '', 
			 langTempRising+uomTemp+langTempLastHour,
			 langTempFalling+uomTemp+langTempLastHour,1)		
		set_ajax_obs2("ajax2temparrow",temparrow);
		set_ajax_obs2("ajax2temparrowb",temparrowmin);//Specif LLC accueil		   
	    var temprate = temp - templast;
		temprate = temprate.toFixed(1);
		if (temprate > 0.0) { temprate = '+' + temprate;} // add '+' for positive rates
		set_ajax_obs2("ajax2temprate",temprate + uomTemp);
		var tempmax = convertTemp(clientraw[46]);
		set_ajax_obs2("ajax2tempmax",tempmax.toFixed(1) + uomTemp);
		var tempmin = convertTemp(clientraw[47]);
		set_ajax_obs2("ajax2tempmin",tempmin.toFixed(1) + uomTemp);		
		var thermometerstr = langThermoCurrently +  + temp.toFixed(1) + uomTemp + 
		  ", " + langThermoMax + tempmax.toFixed(1) + uomTemp +
		  ", " + langThermoMin + tempmin.toFixed(1) + uomTemp; 
		set_ajax_obs2("ajax2thermometer",
			"<img src=\"" + thermometer + "?t=" + temp.toFixed(1) + "\" " +
				"width=\"54\" height=\"170\" " +
				"alt=\"" + thermometerstr + "\" " +
				"title=\"" + thermometerstr + "\" />" );

		//Temperature +10 LLC
		var tempsoil = convertTemp(clientraw[14]);
    set_ajax_obs2("ajax2tempsoil", tempsoil.toFixed(0));				

		//Humidity ...
		var humidity = clientraw[5];
		set_ajax_obs2("ajax2humidity",humidity);
		set_ajax_obs2("ajax2humidityb",humidity);//Specif LLC accueil
		
		//Leaf... specif LLC
    var leaf = convertLeaf(clientraw[156]);
    set_ajax_obs2("ajax2leaf",leaf);
    var leafword = ajax_getLeafRange(leaf);
		set_ajax_obs2("ajax2leafword",leafword);		
		
		//Dewpoint ...
		var dew = convertTemp(clientraw[72]);
		set_ajax_obs2("ajax2dew",dew.toFixed(1) + uomTemp);
		var dewmin = convertTemp(clientraw[139]);
		set_ajax_obs2("ajax2dewmin",dewmin.toFixed(1) + uomTemp);
		var dewmax = convertTemp(clientraw[138]);
		set_ajax_obs2("ajax2dewmax",dewmax.toFixed(1) + uomTemp);

		// Humidex
		var humidex = convertTemp(clientraw[45]);
		set_ajax_obs2("ajax2humidex",humidex.toFixed(1) + uomTemp);
		var humidexmin = convertTemp(clientraw[76]);
		set_ajax_obs2("ajax2humidexmin",humidexmin.toFixed(1) + uomTemp);
		var humidexmax = convertTemp(clientraw[75]);
		set_ajax_obs2("ajax2humidexmax",humidexmax.toFixed(1) + uomTemp);

		//  WindChill
		var windchill = convertTemp(clientraw[44]);
		set_ajax_obs2("ajax2windchill",windchill.toFixed(1) + uomTemp);
		var windchillmin = convertTemp(clientraw[78]);
		set_ajax_obs2("ajax2windchillmin",windchillmin.toFixed(1) + uomTemp);
		var windchillmax = convertTemp(clientraw[77]);
		set_ajax_obs2("ajax2windchillmax",windchillmax.toFixed(1) + uomTemp);

		// Heat Index
		var heatidx = convertTemp(clientraw[112]);
		set_ajax_obs2("ajax2heatidx",heatidx.toFixed(1) + uomTemp);
		var heatidxmin = convertTemp(clientraw[111]);
		set_ajax_obs2("ajax2heatidxmin",heatidxmin.toFixed(1) + uomTemp);
		var heatidxmax = convertTemp(clientraw[110]);
		set_ajax_obs2("ajax2heatidxmax",heatidxmax.toFixed(1) + uomTemp);

		// FeelsLike
		temp = clientraw[4]; // note.. temp in C
        if (temp <= 16.0 ) {
		  feelslike = clientraw[44]; //use WindChill
		} else if (temp >=27.0) {
		  feelslike = clientraw[45]; //use Humidex
		} else {
		  feelslike = temp;   // use temperature
		}
		var feelslike  = Math.round(convertTemp(feelslike));
        set_ajax_obs2("ajax2feelslike",feelslike + uomTemp);

		// # mike challis added heatColorWord feature
		var heatColorWord = heatColor(clientraw[4],clientraw[44],clientraw[45]);
		set_ajax_obs2("ajax2heatcolorword",heatColorWord);
		
		// Apparent temperature
		var apparenttemp = convertTemp(clientraw[130]);
		set_ajax_obs2("ajax2apparenttemp",apparenttemp.toFixed(1) + uomTemp);
		var apparenttempmin = convertTemp(clientraw[136]);
		set_ajax_obs2("ajax2apparenttempmin",apparenttempmin.toFixed(1) + uomTemp);
		var apparenttempmax = convertTemp(clientraw[137]);
		set_ajax_obs2("ajax2apparenttempmax",apparenttempmax.toFixed(1) + uomTemp);

    //Wind gust
		var gust    = convertWind(clientraw[140]);
		var maxgust = convertWind(clientraw[71]);
		if (maxgust > 0.0 ) {
		  set_ajax_obs2("ajax2maxgust",maxgust.toFixed(0) + uomWind);
		} else {
		  set_ajax_obs2("ajax2maxgust",'0');
		}
		//Specif LLC
		var heust2 = clientraw[29];
    var minst2 = clientraw[30];
    var windmaxgusthtime = clientraw[134];
    windmaxgusthtimem = windmaxgusthtime.split(':')[1];
    windmaxgusthtimeh = windmaxgusthtime.split(':')[0];
		if (heust2 != windmaxgusthtimeh) {
		     windmaxgusthtimem = windmaxgusthtimem-60;
		     var diff2 = minst2 - windmaxgusthtimem ;
	       set_ajax_obs2("ajax2windmaxgusthtime",', il y a ' + diff2 + ' min.');
    } else {
         var diff2 = minst2 - windmaxgusthtimem ;
	       set_ajax_obs2("ajax2windmaxgusthtime",', il y a ' + diff2 + ' min.');
	  }//Fin specif LLC 		

		//Vent
		var wind = convertWind(clientraw[2]);
		var beaufort = ajax_get_beaufort(clientraw[158]);
		set_ajax_obs2("ajax2beaufort",beaufort);

    //Vent moyen / 1 min.
		var windavg1mn = convertWind(clientraw[1]);
		set_ajax_obs2("ajax2windavg1mn",windavg1mn.toFixed(0) + uomWind);

    //Vent moyen /10 min.
		var windavg10mn = convertWind(clientraw[158]);
		set_ajax_obs2("ajax2windavg10mn",windavg10mn.toFixed(1) + uomWind);

		var windavground10mn = convertWind(clientraw[158]);//Specif LLC
		set_ajax_obs2("ajax2windavground10mn",windavground10mn.toFixed(0) + uomWind);

    //WIND DIRECTION ...
    var val = windDirLang(clientraw[3]);
    var valavg10mn = windDirLang(clientraw[117]);		
       if (wind > 70.0) {//Specif LLC 
    set_ajax_obs2("ajax2windcolor",'#FF0000');          
		set_ajax_obs2("ajax2wind",'<span style="color: red;">&nbsp;'+wind.toFixed(0)+'&nbsp;</span>');
		set_ajax_obs2("ajax2windb",'<span style="color: red;">&nbsp;'+wind.toFixed(0)+'&nbsp;</span>');//Specif LLC accueil		
		set_ajax_uom("ajax2winduom",true);
	   } else if (wind > 0.0) {
	  set_ajax_obs2("ajax2windcolor",'#485A6D');                             
		set_ajax_obs2("ajax2wind",wind.toFixed(0) + uomWind);
		set_ajax_obs2("ajax2windb",wind.toFixed(0) + uomWind);//Specif LLC accueil		
		set_ajax_uom("ajax2winduom",true);
	   } else {	   
		set_ajax_obs2("ajax2wind",0);
    set_ajax_obs2("ajax2windb",0);//Specif LLC accueil	
	   }	   
		var windmaxgust = convertWind(clientraw[71]);
		set_ajax_obs2("ajax2windmaxgust",windmaxgust.toFixed(1) + uomWind); 
    var windmaxgusth = convertWind(clientraw[133]);
    var diffwindmaxgust = windmaxgust - windmaxgusth;//Specif LLC
    if (diffwindmaxgust < 1 || (windmaxgust < windmaxgusth)){
	      set_ajax_obs2("ajax2windmaxgusth",windmaxgust.toFixed(0) + uomWind);
	      windmaxgusth = windmaxgust;
    } else {
	      set_ajax_obs2("ajax2windmaxgusth",windmaxgusth.toFixed(0) + uomWind);
	  }             	   
	  if (gust > 0.0) { 
		  var diffwindgust = windmaxgusth - gust;//Specif LLC        	 
      if (diffwindgust < 1 || (windmaxgusth < gust)) {
  	      set_ajax_obs2("ajax2gust",windmaxgusth.toFixed(0) + uomWind);
      } else {
  	      set_ajax_obs2("ajax2gust",gust.toFixed(0) + uomWind);
  	  }  
		  set_ajax_uom("ajax2gustuom",true);
	  } else {
  		set_ajax_obs2("ajax2gust",0);   
  		set_ajax_uom("ajax2gustuom",false);
	  }  	   
   	   if (gust > 0.0 || wind > 0.0) {
 		set_ajax_obs2("ajax2windicon","<img src=\"" + imagedir + "/" +  val + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + val + "\" /> ");
 		set_ajax_obs2("ajax2windiconb","<img src=\"" + imagedir + "/" +  val + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + val + "\" /> ");//Specif LLC accueil			
 		set_ajax_obs2("ajax2windiconwr","<img src=\"" + imagedir + "/wr-" +  val + ".gif\" width=\"58\" height=\"58\" alt=\"Direction : " + 
		val + "\" title=\"Direction : " + val + "\" /> ");
		set_ajax_obs2("ajax2winddir",val);
		set_ajax_obs2("ajax2winddirb",val);//Specif LLC accueil
		set_ajax_obs2("ajax2windavg10mnicon","<img src=\"" + imagedir + "/" +  valavg10mn + ".gif\" width=\"16\" height=\"16\" alt=\"Direction : " + 
		val + "\" align=\"absmiddle\" title=\"Direction : " + valavg10mn + "\" /> ");//Avg 10min		
    set_ajax_obs2("ajax2windavg10mndir",valavg10mn);//Avg 10min		
	   } else {
 		set_ajax_obs2("ajax2windicon","");
 		set_ajax_obs2("ajax2windiconb","");//Specif LLC accueil	
		set_ajax_obs2("ajax2winddir","");
		set_ajax_obs2("ajax2winddirb","");//Specif LLC accueil
		set_ajax_obs2("ajax2windavg10mnicon","");//Avg 10min			
		set_ajax_obs2("ajax2windavg10mndir","");//Avg 10min	
    }
    var windmaxavg = convertWind(clientraw[113]);
		set_ajax_obs2("ajax2windmaxavg",windmaxavg.toFixed(1) + uomWind);     
		var windmaxgusttime = clientraw[135];
		windmaxgusttime = windmaxgusttime.toLowerCase();
		windmaxgusttime = windmaxgusttime.replace( "_" , "");
		set_ajax_obs2("ajax2windmaxgusttime",windmaxgusttime);

		var ntime = clientraw[29] + ":" + clientraw[30];
		var ndate = langMonths[ clientraw[36] -1 ].substring(0,3) + " " + clientraw[35] + " " + clientraw[141];
		var ndate2 = clientraw[35] + "-" +langMonths[ clientraw[36] -1 ].substring(0,3) + "-" +  clientraw[141];
		var myDate = new Date( langMonths[ clientraw[36] - 1 ] + " " + clientraw[35] + ", " + clientraw[141] );
		var tday = langDays[myDate.getDay()];
		set_ajax_obs2("ajax2ndate", ndate );
		set_ajax_obs2("ajax2ndate2",ndate2);
		set_ajax_obs2("ajax2ntime", ntime );
		set_ajax_obs2("ajax2ntimess", ntime + ":" + clientraw[31]);
		set_ajax_obs2("ajax2dname", tday );

		// current date and time of observation in clientraw.txt
		var ajaxtimeformat2 = clientraw[32];
		var ajaxdateformat = clientraw[74];
		ajaxtimeformat2 = ajaxtimeformat2.split('-')[1];
		ajaxtimeformat2 = ajaxtimeformat2.replace( "_" , "");
		ajaxtimeformat2 = ajaxtimeformat2.toLowerCase();
		set_ajax_obs2("ajax2datetime",ajaxdateformat + " " +ajaxtimeformat2);
		set_ajax_obs2("ajax2date",ajaxdateformat);
		set_ajax_obs2("ajax2time",ajaxtimeformat2);		
		if (lastajaxtimeformat2 != ajaxtimeformat2) {
			counterSecs2 = 0;                      // reset timer
			lastajaxtimeformat2 = ajaxtimeformat2; // remember this time
		}
		
		// now ensure that the indicator flashes on every AJAX fetch
        var element = document.getElementById("ajax2indicator");
		if (element) {
          element.style.color = flashcolor;
		}
		if (maxupdates > 0 && updates2 > maxupdates-1) { // chg indicator to pause message
			set_ajax_obs2("ajax2indicator",langPauseMsg);
		}
		set_ajax_obs2('ajax2updatecount',updates2);       // for test pages 
		set_ajax_obs2('ajax2maxupdatecount',maxupdates); // for test pages 

 	  } // END if(clientraw[0] = '12345' and '!!' at end)

	 } // END if (x.readyState == 4 && x.status == 200)

    } // END try

   	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);

//  reset the flash colors, and restart the update unless maxupdate limit is reached

    setTimeout("reset_ajax_color('')",flashtime); // change text back to default color 

	if ( (maxupdates == 0) || (updates2 < maxupdates-1)) {
      setTimeout("ajax2Loader(clientrawFile2 + '?' + new Date().getTime())", reloadTime); // get new data 
    }
  }
} // end ajaxLoader function 

// run the counter for seconds since update
window.setInterval("ajax_countup()", 1000); 
window.setInterval("ajax2_countup()", 1000);
// invoke when first loaded on page
if (! ajaxLoaderInBody) { ajaxLoader(clientrawFile + '?' + new Date().getTime(), reloadTime); }
if (! ajaxLoaderInBody) { ajax2Loader(clientrawFile2 + '?' + new Date().getTime(), reloadTime); }
