var realtime_location2="http://www.cliftonweather.co.uk/wxs_realtime.txt";
var realtime_location="http://www.cliftonweather.co.uk/realtime.txt";
var realtime_location_extras="http://www.cliftonweather.co.uk/realtime2.txt";
var windlabel = new Array("N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
var update_seconds=5;
var lastWind = 0;
var lastWindArr = "";
var windArray = [];
//var decl = (23.45 * Math.sin((parseInt(Jday) + 285) * (360/365) * 0.0174532925) * 0.0174532925);
//var latitude = 52.03399;
//var lat = latitude * 0.0174532925;
//var	radianfactor = 3.14159265/180;
var errC = "Error count: 0, Last error: ---";
var eCnt = 0;

$.ajaxSetup({timeout: 10000, async: false, dataType: "text", error: function(request, error){eCnt++;} });
 
function fcol(p){
	var pcol;
	pcol = parseFloat(p).toFixed(1) + "°C";
	if (p <= 0){pcol = pcol.fontcolor('Blue');}
	return pcol;
}

var roundOff = function (value){value = Math.round(10*value)/10; return value;}

// Remove leading zero
var leadingZero = function (str){if(str.length > 1 && str.substring(0,1) == '0'){str = str.substring(1,str.length);} return str;}

function setDecimal(value, places){
	if (value < 0) {sign = "-"} else {sign = ""}
	value = Math.abs(value) 
	factor = Math.pow(10, places)
	valInt = Math.round(value * factor)
	if (places == 0 && valInt == 0) {sign = ""}
	if (places == 0) {return sign + valInt}
	valStr = valInt.toString(10)
	len = valStr.length
	radix = len - places - 1
    	radShift = 0
    	if (radix < 0) {radShift = -radix, radix = 0}
    	for (i = 0; i < radShift; i++) {valStr = "0" + valStr}
 	intStr = valStr.substring(0, radix + 1)
	decStr = valStr.substring(radix + 1, len + radShift)
	valStr = sign + intStr + "." + decStr
	return valStr
}

function sunTime(xt){ 	
	var solar_noon = (timeDec(rise) + timeDec(set) + 12)/2; 
	suntime = (solar_noon - timeDec(leadingZero(xt)));
	return suntime;
}

function timeDec(tm){ 
	dtm = tm.split(":"); 
	dtm = parseInt(dtm[0]) + parseInt(dtm[1])/60;
	return dtm;
}
			
function solarAltitude(){ 
	sin_alt = (Math.cos(lat) * Math.cos(decl) * Math.cos(hour)) + (Math.sin(lat) * Math.sin(decl)); 
	altitude_angle = roundOff(Math.asin(sin_alt) * 57.2957795); 
	return altitude_angle;
}

// ---------------------------------------------------------------------------------------------------------------

setInterval('getlivedata()', update_seconds*1000); 

function getlivedata() {
	var file = "1";

// read realtime.txt file and parse it using a space

	var d = new Date(); 
	var realdata = $.ajax({url: realtime_location + "?" + d.getTime(), async: false, dataType: "html" }).responseText;
	var realdataextras = $.ajax({url: realtime_location_extras + "?" + d.getTime(), async: false, dataType: "html" }).responseText;

	if (realdata.indexOf(realtime_location) == -1 ) {    
		var rawdata=realdata.split(' ');
		var rawdataextras=realdataextras.split(',');
 
// Check to see if there are any values
		window.test = rawdata[2]*rawdataextras[8];
		if (window.test && !isNaN(window.test)){
			if(realtime_location == realtime_location2){realtime_location="http://www.cliftonweather.co.uk/realtime.txt"; file="2";}
// Set all IDs to their values
			var tarr = "&darr;"
			if (rawdata[25] > 0) {tarr = "&uarr;"} else
			if (rawdata[25] < 0) {tarr = "&darr;"}

			if (rawdata[2] == rawdata[26] || rawdata[2] == rawdata[28] ){
				$("#temp").html("*" + fcol(rawdata[2])+" "+tarr);
			}else{
 				$("#temp").html(fcol(rawdata[2])+" "+tarr);
 			}
			$("#dew").html(fcol(rawdata[4]));
 			$("#hum").html(rawdata[3]+"%");
 			$("#heatindex").html(fcol(rawdata[41]));
 			$("#humidex").html(fcol(rawdata[42]));
 			$("#windchill").html(fcol(rawdata[24]));

			$("#rainrate").html(rawdata[8]+" mm/hr");
			$("#raintoday").html(rawdata[9]+" mm ("+setDecimal(rawdata[9]/25.4,2)+" in)");
			$("#rainhour").html(rawdata[47]+" mm");
			$("#rmonth").html(rawdata[19]+" mm ("+setDecimal(rawdata[19]/25.4,2)+" in)");
			$("#ryear").html(rawdata[20]+" mm ("+setDecimal(rawdata[20]/25.4,2)+" in)");
			$("#ryesterday").html(rawdata[21]+" mm");
			
			$("#grassT").html((roundOff(rawdataextras[0]-0.5))+"&deg;C");
			$("#grassMin").html((fcol(rawdataextras[2]-0.5))+" @ "+rawdataextras[3]);
			$("#soilT").html(rawdataextras[1]+"&deg;C");
			$("#meanT").html(fcol(rawdataextras[17])); 
			$("#yesterdayT").html(rawdataextras[18]+"&deg;C");
			$("#maxTd").html(fcol(rawdataextras[4])+" @ "+rawdataextras[5]);
			$("#minTd").html(fcol(rawdataextras[6])+" @ "+rawdataextras[7]);
			$("#maxHum").html(rawdataextras[8]+"% @ "+rawdataextras[9]);
			$("#minHum").html(rawdataextras[10]+"% @ "+rawdataextras[11]);
			$("#maxSrad").html(rawdataextras[15]+" W/m<sup>2</sup> @ "+rawdataextras[16]);
			$("#lastRain").html(rawdataextras[21]+" days ago");
 			$("#meanWS").html(rawdataextras[19]+" @ "+rawdataextras[20]+" mph");
 			if (rawdataextras[20] == 0) {$("#meanWS").html("Calm");}
			
			$("#windlatest").html(rawdata[11]+" @ "+roundOff(rawdata[6])+" mph");
			if (rawdata[6] == 0) {$("#windlatest").html("Calm");}
 			$("#wind10min").html((windlabel[Math.floor(((parseInt(rawdata[46]) + 11) / 22.5) % 16 )])+ " @ "+rawdata[5]+" mph");
 			if (rawdata[5] == 0) {$("#wind10min").html("Calm");}
				
			windArray.unshift(rawdata[6]);
			if (windArray.length > 60/update_seconds){xx = windArray.pop();}	
				
			$("#windavMax").html(rawdata[30]+" mph");	
			$("#windmean").html(rawdata[5]+" mph");
			$("#windgust_10min").html(roundOff(rawdata[40])+" mph");
			$("#windgust").html(roundOff(rawdata[32])+" mph @ "+rawdata[33]);
			$("#winddir").html(rawdata[7]+"&deg; "+rawdata[11]);
			$("#wchill").html(rawdata[24]+" &deg;"+rawdata[14]);
			$("#presstrend").html(rawdata[18]+" "+rawdata[15]+"/hr");
 
			$("#today-temphigh").html(fcol(rawdata[26])+" @ "+ rawdata[27]);
			$("#today-templow").html(fcol(rawdata[28])+" @ "+ rawdata[29]);
			$("#today-avgtemp").html(fcol((((rawdata[26]*1)+(rawdata[28]*1))/2).toFixed(1)));
			$("#inside-temp").html(rawdata[22]+"&deg;C");
			$("#today-windgust").html(rawdata[32]+" mph @ "+ rawdata[33]);
			$("#today-windavg").html(rawdata[30]+" mph @ "+ rawdata[31]);
 
			$("#solarRad").html(rawdata[45]+" W/m<sup>2</sup>");
			$("#UV").html(rawdata[43]);
			$("#Obs_date").html("Near live data from Clifton Weather, last updated:- "+rawdata[0]+" @ "+rawdata[1]);
			$("#Obs_time").html("<font color=\"silver\">Current Weather @ "+rawdata[1]+" on "+rawdata[0] + "</font>");

 //   Solar functions
			var maxRad = rawdata[56];
			var currRad = rawdata[45];
			$("#SRadpc").html((Math.round((parseInt(currRad))/(maxRad)*100))+"%");

//   Snow Probability
			var sProb = "0%";
			var snowProb = ["+80%","70%","60%","50%","40%","30%","20%","10%"];
			sp = Math.ceil((rawdata[2]*1) + (rawdata[4]*1));
			if (sp < 0) {sp=0}
			if (sp <= 7) {sProb = snowProb[sp];}
			$("#sProb").html(sProb); 
			
// Wet Bulb
			tmin = Math.min(rawdata[4], rawdata[2]);
    	tmax = Math.max(rawdata[4], rawdata[2]);
			vapor_pressure = 6.112 * Math.pow(10, (7.5 * rawdata[4]) / (237.7 + (rawdata[4]*1)));
			while (true){
				tcur = (tmax + tmin) / 2
				vpcur = 6.112 * Math.pow(10, (7.5 * tcur) / (237.7 + tcur))
				peq = 0.00066 * (1+0.00155 * tcur) * rawdata[10] * (rawdata[2] - tcur)
				diff = peq - vpcur + vapor_pressure
				if (Math.abs(diff) < 0.01) break
				if (diff < 0) tmax = tcur
				else tmin = tcur
			}
			$("#wetbulb").html(fcol(tcur.toFixed(1)));  

// Compute Cloud Base Height 
			CBH_m = 125*((rawdata[2]*1) - (rawdata[4]*1));
			if(CBH_m < 0) CBH_m = 0;	// stop negative values
			$("#cloudB").html(CBH_m.toFixed(0)+" m ("+setDecimal(CBH_m*3.28,0)+" ft)");

// ------- Freeze / Snow Height ------------------------------ (Experimental unproven !)
// Height Above Sea Level that temp drops to zero C

			var freezingL = rawdata[2]/0.0098;
			if (CBH_m <= freezingL){freezingL = (rawdata[2] - CBH_m*0.0098)/0.0054 + CBH_m*1}		
			freezingL = freezingL + 42
	
			var snowL = tcur/0.0098;
			if (CBH_m<=freezingL){snowL = ((tcur - CBH_m*0.0098)/0.0054)+CBH_m*1}	
			snowL = snowL + 42
		
			var sleetL = (tcur-1)/0.0098;
			if (CBH_m<=freezingL){sleetL = ((rawdata[4] - CBH_m*0.0098)/0.0054)+CBH_m*1}	
			sleetL = sleetL + 42	
			
			$("#freezingL").html(freezingL.toFixed(0)+" m");
			$("#snowL").html(snowL.toFixed(0)+" m");
			$("#sleetL").html(sleetL.toFixed(0)+" m");

 // Set Forecast Image
			var fcastimage = rawdata[48];
			$("#forecastimage").html("<img src=\""+"images/wIcon_"+(fcastimage)+".png\"/>");

 // Calculate the forecast
			var forecasttext = ["unknown!","Settled & fine","Fine weather","Becoming fine","Fine\, becoming less settled","Fine\, possible showers","Fairly fine\, improving","Fairly fine\, possible showers early","Fairly fine\, showery later","Showery early\, improving","Changeable\, mending","Fairly fine\, showers likely","Rather unsettled clearing later","Unsettled\, probably improving","Showery\, bright intervals","Showery\, becoming less settled","Changeable\, some precipitation","Unsettled\, short fine intervals","Unsettled\, precipitation later","Unsettled\, some precipitation","Mostly very unsettled","Occasional precipitation\, worsening","Precipitation at times\, very unsettled","Precipitation at frequent intervals","Precipitation\, very unsettled","Stormy\, may improve","Stormy\, much precipitation"]
			if(rawdata[48]=="---"){rawdata[48]=0;}
			$("#forecast").html(forecasttext[rawdata[48]]);
			
 // Calculate the Beaufort desc
			var beaufort = ["Calm","Light Air","Light Breeze","Gentle Breeze","Moderate breeze","Fresh breeze","Strong breeze","Near gale","Gale","Strong Gale","Storm","Violent Storm","Hurricane"];
			beau = "F" + rawdata[12]
			$("#beaufortd").html(beau + " - " + beaufort[rawdata[12]]);

 //  Wind rose
			var rosedir = 'http://www.cliftonweather.co.uk/images/' 
			val_org = rawdata[7];
			if(rawdata[7] == 360){val_org = 0;} // used in math to determine array[x]
			val = windlabel[Math.floor(((parseInt(val_org) + 11) / 22.5) % 16 )]; 
			if (rawdata[6] > 0) {
				$("#windRose").html("<img src=" + rosedir + "wr2-" +  val + ".gif>");
				} else {
				$("#windRose").html("<img src=" + rosedir + "wr2-calm.gif>");
			} 

// ------ Weather Icon ----------
		
			var maxradposs = rawdata[56]*1;
			var imgloc1 = "<img src=http://www.cliftonweather.co.uk/images/";
			var imgloc2 = ".png border=0>";
			var skycon = "";
			if (currRad <= maxradposs*.40) {skycon = "wIcon_20";}	
			if (currRad > maxradposs*.40) {skycon = "wIcon_27";}
			if (currRad > maxradposs*.55) {skycon = "wIcon_10";}
			if (currRad > maxradposs*.67) {skycon = "wIcon_4";}
			if (currRad > maxradposs*.78) {skycon = "wIcon_3";}
			if (currRad > maxradposs*.90) {skycon = "wIcon_2";}
			if (currRad > maxradposs) {skycon = "wIcon_1";}
//			if (currRad == 0 && solarAltitude() < -5) {skycon = ""}	
			if (rawdata[8] > 0 && currRad > maxradposs*.55) {skycon = "wIcon_5"}
			if (rawdata[8] > 3 && currRad > maxradposs*.55) {skycon = "wIcon_8"}
			if (rawdata[8] > 6 && currRad > maxradposs*.55) {skycon = "wIcon_12"}
			if (rawdata[8] > 0 && currRad < maxradposs*.55) {skycon = "wIcon_19"}
			if (rawdata[8] > 1 && currRad < maxradposs*.55) {skycon = "wIcon_16"}
			if (rawdata[8] > 5 && currRad < maxradposs*.55) {skycon = "wIcon_21"}
			if (rawdata[8] > 10 && currRad < maxradposs*.55) {skycon = "wIcon_28"}
			if (rawdata[8] > 0 && sProb >=50) {skycon = "sleet"}
			if (rawdata[8] > 0 && sProb >=75) {skycon = "snow"}
			skycon = imgloc1 + skycon + imgloc2;
			if (maxRad == 0){skycon = ""}	
			if (rawdata[8] > 15) {skycon = "*Heavy Rain*";}
			if (rawdata[8] > 50) {skycon = imgloc1 + "warning" + imgloc2 + "<br>Torrential Rain";}				
			if (rawdata[5] > 24) {skycon = "*High Winds*";}
			if (rawdata[5] > 37) {skycon = imgloc1 + "warning" + imgloc2 + "<br>Gale force Winds";}
			var fog = 0;
			if (currRad <= maxradposs*.70){fog = 1;}
			if (currRad <= maxradposs*.60){fog = 2;}	
			if (currRad <= maxradposs*.55){fog = 3;}
			if (fog > 0 && CBH_m < 80 && rawdata[3] > 95 && rawdata[5] <= 3.0 && rawdata[10] > 1012 && rawdata[47] == 0 && rawdata[25] < 1.5) {
				skycon = imgloc1 + "fog" + fog + imgloc2; 
				if (rawdata[2] < 0) {skycon = "*Freezing Fog*";} 
			}
			$("#skyIcon").html("<div onclick=\"javascript:alert(errC);\">"+skycon+"</div>"); 

// Pressure Trendtext
			var langBaroTrend = new Array ( "Steady", "Rising", "Rising Rapidly", "Falling", "Falling Rapidly");
			var pressure_trend_text;
			weather_trend = rawdata[18] * 3; 
			if ((weather_trend >= -0.7) && (weather_trend <= 0.7)) {pressure_trend_text = langBaroTrend[0];} // steady
			if ((weather_trend > 0.7) && (weather_trend < 2.0 )) {pressure_trend_text = langBaroTrend[1];}	// rising
			if (weather_trend >= 2.0) {pressure_trend_text = langBaroTrend[2];}	// rising rapidly
			if ((weather_trend < -0.7) && (weather_trend > -2.0)) {pressure_trend_text = langBaroTrend[3];}	// falling
			if (weather_trend <= -2.0) {pressure_trend_text = langBaroTrend[4];}	// falling rapidly
			$("#press_trend").html(rawdata[10]+" "+rawdata[15]+"&nbsp;&&nbsp;"+pressure_trend_text);


		}else{ // error handler for no data
			realtime_location = realtime_location2
		}
	} 
}

