// Datafiles //
var inventCache = "/public/data/InventCache/";
var warnFile=inventCache+"ItemList/WeatherWarning/Valid/Now/Latest";

var layerXML=inventCache+"ItemList/Tiles/All";
var timestepsXML=inventCache+"ItemList/ObsForecast/UkData/";
var timeInfoFile = inventCache+"Item/DaylightSaving";
var nationalParkXML = inventCache+"Item/NationalParkForecast/Area/";
var mountainXML = inventCache+"Item/MountainForecast/Area/";
var mountainRiskXML = inventCache+"ItemList/MountainForecast/Latest";
var UVXML = inventCache+"Item/UVForecast/Latest";
var govData = [];
govData["Pressure"]="Pres";
govData["Weather"]="Wx";
govData["Wind"]="Wind";
govData["Temperature"]="Temp";
govData["UV"]="UV";
govData["Leisure"]="LA";
govData["Regions"]="WF";

var dataXML;
// Sesion details //
var session = false;
var  sessionCookie="";
var sessionName = "";
var currentPage="";

// Shared vars //
var tempSliderValue;
var sliders = [];
var keyLayout = {};
var lang;
var labels = {};
var map, checkLoaded;
var boundaries = new GLatLngBounds(new GLatLng(49.07,-13.49),new GLatLng(60.5,8.48));
var month_name;
var day_name;
var animIndx = 0;
var hourOffset = 0;
var feedStatus = [];
var dragOptions = {containment:'parent', cursor: 'move', stack: { group: ".ui-draggable", min: 1 }};
var fcPosn;
var optBool = false;
var params = {lat: 55.043227, lon: -2.724609, zoom: 5, layerType: "point", layer: "Regions",
			  language: "Eng", temperatureUnits: "C", speedUnits: "M", windStyle: "Wind"};		// startup view parameters, if not overridden elsewhere.  
var loadingScreenListener;
var maxFaves = 8;	// defines the max. number of locations that can be entered. 
var rememberMe;		// overridden by cookie.  Defines whether the user's last view is loaded on pageload. 
var fullScreenBool = false;
var tSTT = false;

// Layers vars //
var hideSliders = false;
var layerLoading = false;
var allLayers = { sets : [] };
var currentLayer = -2;
var stillLoading = 0;
var playTimeout=0;
var timeout=0;
var max=0;
var layerTime;
var dontstop=true;
var msie = (jQuery.browser.msie);
var msie6 = (msie && /MSIE 6\.0/i.test(window.navigator.userAgent) && !/MSIE 7\.0/i.test(window.navigator.userAgent) && !/MSIE 8\.0/i.test(window.navigator.userAgent));
var msie7 = (msie && !/MSIE 6\.0/i.test(window.navigator.userAgent) && /MSIE 7\.0/i.test(window.navigator.userAgent) && !/MSIE 8\.0/i.test(window.navigator.userAgent));
var opera = (jQuery.browser.opera);

// Points vars //
var warningsDoc, mm, tempPoint;
var keybdH,geocoder = null;
var count = 0;
var favCount = 0;
var viewCount = 0;
var selectedType = 0;
var markers = [];
var myLocArray = []; // array of locations
var myViewArray = []; // array of views
var markerArray = [];
var dupMarkerArray = []; // an array of markers that duplicate those in markerArray, used for showing an extra marker for wind gust data.  
var locNameArray = [];
var regBool = false;
var hideBool = false;
var mtt = false;
var pointsLoading = false;
var pointsDataLoading = false;
var pointsTL = false;
var uvData;
var UVDesc = [];
UVDesc["1"] = ["#4FB611", "You can safely stay outside."];
UVDesc["2"] = ["#4FB611", "You can safely stay outside."];
UVDesc["3"] = ["#F7E900", "Seek shade during midday hours,<br> cover up and wear sunscreen."];
UVDesc["4"] = ["#F7E900", "Seek shade during midday hours,<br> cover up and wear sunscreen."];
UVDesc["5"] = ["#F7E900", "Seek shade during midday hours,<br> cover up and wear sunscreen."];
UVDesc["6"] = ["#F57500", "Seek shade during midday hours,<br> cover up and wear sunscreen."];
UVDesc["7"] = ["#F57500", "Seek shade during midday hours,<br> cover up and wear sunscreen."];
UVDesc["8"] = ["#DB0020", "Avoid being outside during midday hours.<br> Shirt, sunscreen and hat essential"];
UVDesc["9"] = ["#DB0020", "Avoid being outside during midday hours.<br> Shirt, sunscreen and hat essential"];
UVDesc["10"] = ["#DB0020", "Avoid being outside during midday hours.<br> Shirt, sunscreen and hat essential"];
UVDesc["11"] = ["#AA84DE", "Avoid being outside during midday hours.<br> Shirt, sunscreen and hat essential"];

var points = {};
var polygonData = {};
var mountainsNationalParks = {};
var wxDesc = [];

// Warnings & forecasts vars //
var regMaxWarns = []; regMaxWarns.os = 0;regMaxWarns.he = 0;regMaxWarns.gr = 0;regMaxWarns.st = 0;regMaxWarns.ta = 0;regMaxWarns.dg = 0;regMaxWarns.ni = 0;regMaxWarns.wl = 0;regMaxWarns.nw = 0;regMaxWarns.ne = 0;regMaxWarns.yh = 0;regMaxWarns.wm = 0;regMaxWarns.em = 0;regMaxWarns.ee = 0;regMaxWarns.sw = 0;regMaxWarns.se = 0;
var regNames = []; 
var nationalParkRegions = "ee,ne,se,sw,wl,yh";
var mountainRegions = {
	gr: ["East Highland"],
	he: ["East Highland", "West Highland"],
	st: ["West Highland"],
	ta: ["East Highland", "West Highland"],
	nw: ["Lake District", "Peak District"],
	wl: ["Brecon Beacons", "Snowdonia"],
	em: ["Peak District"],
	wm: ["Peak District"],
	yh: ["Peak District","Yorkshire Dales"]
};
var warningsDoc;
var wLevels = [];
var wColors = ['#cf3', '#FFFF66','#FF9933', '#FF9933', '#CC0033'];

//Temp Colour array//
var tempCol = [];
tempCol['-14'] = '#5C027C'; tempCol['-13'] = '#5C027C'; tempCol['-12'] = '#0F1F97'; tempCol['-11'] = '#0F1F97'; tempCol['-10'] = '#040284'; tempCol['-9'] = '#040284'; 
tempCol['-8'] = '#0432B4'; tempCol['-7'] = '#0432B4'; tempCol['-6'] = '#0000FF'; tempCol['-5'] = '#0000FF'; tempCol['-4'] = '#047EFC'; tempCol['-3'] = '#047EFC';
tempCol['-2'] = '#04BEFC'; tempCol['-1'] = '#04BEFC'; tempCol['0'] = '#3CAE74'; tempCol['1'] = '#3CAE74'; tempCol['2'] = '#2CAA2c'; tempCol['3'] = '#2CAA2c';
tempCol['4'] = '#2CC82C'; tempCol['5'] = '#2CC82C'; tempCol['6'] = '#04E23C'; tempCol['7'] = '#04E23C'; tempCol['8'] = '#04E23C'; tempCol['9'] = '#04E23C'; 
tempCol['10'] = '#54FE04'; tempCol['11'] = '#54FE04'; tempCol['12'] = '#99FF00'; tempCol['13'] = '#99FF00'; tempCol['14'] = '#FFFF00';  tempCol['15'] = '#FFFF00'; 
tempCol['16'] = '#FFCC00'; tempCol['17'] = '#FFCC00'; tempCol['18'] = '#FF9900'; tempCol['19'] = '#FF9900'; tempCol['20'] = '#FF6600'; tempCol['21'] = '#FF6600'; 
tempCol['22'] = '#F44614'; tempCol['23'] = '#F44614'; tempCol['24'] = '#FF0000'; tempCol['25'] = '#FF0000';  tempCol['26'] = '#FC027C'; tempCol['27'] = '#FC027C'; 
tempCol['28'] = '#FC2294'; tempCol['29'] = '#FC2294'; tempCol['30'] = '#FC5EB4';  tempCol['31'] = '#FC5EB4'; tempCol['32'] = '#FC86C4'; tempCol['33'] = '#FC86C4';
tempCol['34'] = '#FCAED4'; tempCol['35'] = '#FCAED4'; tempCol['36'] = '#FED7EC'; tempCol['37'] = '#FED7EC';

// Warning messages //
var UKMarkerErrorMessage = [];
var fcErrorMessage, warningsErrorMessage, noWarningsMessage, timestepsErrorMessage, timeWarning, tileWarningMessage;

//HTML elements //
var animation, mapLayers, poweredBy, helpIcon, regTT, fcPanel;


//***************//
//** Shared JS **//
//***************//

function controlBox(type, corner, x, y, panelId) {
	this.type=type;this.corner = corner;this.x = x;this.y = y;
}
controlBox.prototype = new GControl();
controlBox.prototype.initialize = function () {
	var container = document.createElement("div");
	var controlDiv = document.createElement("div");
	container.appendChild(controlDiv); 
	controlDiv.setAttribute("id",eval((this.type)).selection[0].name);
	controlDiv.innerHTML=eval((this.type)).selection[0].html;
	map.getContainer().appendChild(container); 
	return container;
};
controlBox.prototype.getDefaultPosition = function () {
	return new GControlPosition(eval((this.corner)), new GSize(this.x,this.y));
};

function initHTMLElements() {
	// sets up HTML elements
	
	fcPanel = '<div id="textFCBox" class="cornerTB07 popup">' +
		'	<div class="forecastBar">' +
		'		<img class="crossImage" src="/public/pws/invent/lib/images/cross.png" alt="Close">' +
		'		<br class="brclear">'+
		'		<ul id="fcTabs">' +
		'			<li id="fcTabForecast"><a href="javascript:void(0)">Forecast</a></li>' +
		'			<li id="fcTabWarnings"><a href="javascript:void(0)">Warnings</a></li>' +
		'			<li id="fcTabNationalPark"><a href="javascript:void(0)">National Parks</a></li>' +
		'			<li id="fcTabMountain"><a href="javascript:void(0)">Mountains</a></li>' +
		'		</ul>' +
		'		<a id="textLink" href="../weathertext/index.html?uk">' +
		'			<img style="height:21px;float:right;" src="../lib/images/textviewIcon.gif">' +
		'		</a>' +
		'	</div>' +
		'	<div id="mainFCText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="mainWarningText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="nationalParkText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="mountainText" class="textFCBoxPanel">' +
		'	</div>' +
		'</div>';
	
	animation={"selection":[{'name':'tl2Obj',
		'html': '<div id="frameNav"><div id="leftTl"><span id="prodTitle"></span><span id="time"></span><span id="date"></span>' +
		'<div id="tlDiv"><ul id="tlContainer"></ul></div></div><div id="rightTl"><span class="playpause" id="play"></span><span id="tileLoading"></span><p id="countdown"></p></div><br class="brclear"></div>'}]};

	mapLayers={"selection":[{'name':'mapLayersObj',
		'html': '<div class="slideBox cornerTB07" id="sbmapLayers"><div class="slideTop" id="mapLayersTop"><h4>' + labels.menus.mapLayers + '</h4></div><div class="slideBottom" id="items"></div></div>' +
		'' + 
		
		'<div class="slideBox cornerTB07" id="sbFavourites"><div class="slideTop selClosed"><h4>' + labels.menus.locations + '</h4></div><div class="slideBottom slideBottomClosed">' +
		'' + 
		'<div id="addFav" class="panelForm">' +
		'<form action="#" onsubmit="showAddress(this.address.value, this.name.value); return false"><p>' + labels.locations.addressprompt + '</p><p><input type="text" style="width:155px" id="newFavouriteAddress" name="address" value="' + labels.locations.address + '"' +
		'onfocus="if (this.value == \'' + labels.locations.address +'\') this.value=\'\'" onblur="if (this.value == \'\')' +
		'{this.value=\'' + labels.locations.address + '\';} else {otherel = document.getElementById(\'newFavouriteName\'); if (otherel.value == \'\' || otherel.value == \'' + labels.locations.name + '\') {otherel.value=this.value;}}"/></p>' +
		'<p>' + labels.locations.nameprompt + '</p>' +
		'<input type="text" style="width:155px" maxlength="30" id="newFavouriteName" name="name" value="' + labels.locations.name + '"' +
		'onfocus="if (this.value == \'' + labels.locations.name + '\') this.value=\'\'" onblur="if (this.value == \'\') this.value=\'' + labels.locations.name + '\'"/>' +
		'<input type="submit" class="favIcon" name="ok" value="' + labels.general.ok + '"/><input type="submit" class="favIcon" id="backButton" value="' + labels.general.back + '" style="float:left" onclick="backFav();return false;"/></form></p></div>' +
		'<div id="favs" class="panelList"><span id="reportingTagsID"></span><span id="favShowContainer"><input id="favCb" type="checkbox" checked value="hide" onclick="if (this.checked) {for (m in myLocArray){favMM.addMarker(myLocArray[m], 5);hideBool = false;}} else {favMM.clearMarkers();hideBool = true;}"/><label for="favCb" id="hideText">' + labels.locations.show + '</label> </span><input type="submit" class="favIcon" value="' + labels.general.add + '" onclick="addFav()"/>' +
		'</div></div></div>' + 
		'' + 
		/*'<div class="slideBox cornerTB07" id="sbViews"><div class="slideTop selClosed" id="viewsTop"><h4>' + labels.menus.views + '</h4></div><div class="slideBottom slideBottomClosed" id="viewsBottom">' + 
		'' + 
		'<div id="addView" class="panelForm">' +
		'<form action="#" onsubmit="showView(this.name.value);return false;"><p>Please enter a name for this view</p><p><input type="text" style="width:155px" id="newViewName" name="name" value="Enter name for this view"' +
		'	onfocus="if (this.value == \'Enter name for this view\') this.value=\'\'" onblur="if (this.value == \'\') this.value=\'Enter name for this view\'"/></p>' +
		'	<input type="submit" class="favIcon" name="ok" value=" OK " /><input type="submit" class="favIcon" id="viewBackButton" value="' + labels.general.back + '" style="float:left" onclick="backView();return false;"/></form></div>' +
		'	<div id="views" class="panelList" style="display:none;"><span id="reportingViewsID"></span>' + 
		'		<input type="submit" value="Add current view" class="favIcon" onclick="addView();"/>' + 
		'	</div>' + 
		''	 + 
		'</div></div>' +*/
		'' + 
		'<div class="slideBox cornerTB07" id="sbTools"><div class="slideTop selClosed" id="toolsTop"><h4>' + labels.menus.tools._title + '</h4></div><div class="slideBottom slideBottomClosed" id="tools">' + 
			'<div class="listStyle tool" id="toolsBookmark" onclick="bookMark()"><span class="favText">Get URL for this map</span></div>' +
			'<div class="listStyle tool" id="toolsHide"><span class="favText">Show map full size</span></div>' +
			'<div class="listStyle tool" id="toolsPreferences" onclick="preferences();"><span class="favText">' + labels.menus.tools.preferences + '</span></div>' +
		'</div></div>'
		}]};
		
	poweredBy={"selection":[{'name':'poweredby',
		'html': '<div class="powered"><a href="http://www.metoffice.gov.uk/"><img src="/public/pws/invent/lib/images/layersBy.gif" alt="Met Office"></a></div>'}]};
		
	helpIcon={"selection":[{'name':'helpIcon',
		'html': '<img id="helpIcon" src="lib/images/helpIcon.png" title="Click for help about this weather map" alt="Help button">'}]};

	wxTextIcon={"selection":[{'name':'wxTextIcon',
		'html': '<img id="wxTextIcon" src="../lib/images/textviewImage.gif" title="View a text forecast" alt="Text forecast">'}]};

	regTT = {"selection":[{'name':'regTT',
	'html': '<div id="regTT2" class="tooltip cornerTB07" style="background-color:#000;color:#FFF;position:relative;display:none;"><nobr><label id="tTText"></label><br/><\/nobr><\/div>'}]};
}
function getMOData() {
	if (getMODataSession()===false){
		setUpLoginCtrls();
		currentPage = window.location.href;
		if (sessionCookie == ""){
			showErrorBox("login", 'If you already have a Met Office account for downloading data from Invent, please <a style="color:#7fd6e7;text-decoration:underline;" href="/public/login?goto='+currentPage+'">log in.</a><br> Otherwise, please <a style="color:#7fd6e7;text-decoration:underline;" href="/public/register/pwsdata">register</a> for the download data service.<br><br><div style="font-size:12px;">For more information, see the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/pwsdatahelp.html">Data Download help page</a> or the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/tandc.html">Terms and Conditions</a></div>');
		} else {
			showErrorBox("login", 'Please <a style="color:#7fd6e7;text-decoration:underline;" href="/public/WaveProfileManagementClient/subscribe.do?service=pwsdata">register</a> your account for the data download service before continuing. <br><br><div style="font-size:12px;">If you have recently registered for the data download facility using an existing account, you may need to logout and then login again to access the data. For more information, see the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/pwsdatahelp.html">Data Download help page</a> or the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/tandc.html">Terms and Conditions</a></div>');
		}
		return;
	}
	var leisuredropdown =  '<form name="mountainform" action="">'+
						'<label for="mountainselect"><strong>Choose area:</strong></label>'+
						'<div class="ddList">'+
						'<select name="mountainselect" id="mountainselect" title="Mountain forecasts">'+
						'<option value="MountainForecast/Area/Brecon%20Beacons/Latest">Brecon Beacons</option>'+
						'<option value="MountainForecast/Area/Snowdonia/Latest">Snowdonia</option>'+
						'<option value="MountainForecast/Area/Peak%20District/Latest">Peak District</option>'+
						'<option value="MountainForecast/Area/Lake%20District/Latest">Lake District</option>'+
						'<option value="MountainForecast/Area/East%20Highland/Latest">East Highland</option>'+
						'<option value="MountainForecast/Area/West%20Highland/Latest">West Highland</option>'+
						'<option value="MountainForecast/Area/Yorkshire%20Dales/Latest">Yorkshire Dales</option>'+
						'<option value="NationalParkForecast/Area/ne/Latest">Northumberland National Park</option>'+
						'<option value="NationalParkForecast/Area/yh/Latest">North York Moors National Park</option>'+
						'<option value="NationalParkForecast/Area/ee/Latest">Norfolk Broads</option>'+
						'<option value="NationalParkForecast/Area/se/Latest">South Downs National Park</option>'+
						'<option value="NationalParkForecast/Area/se/Latest">New Forest National Park</option>'+
						'<option value="NationalParkForecast/Area/sw/Latest">Dartmoor National Park</option>'+
						'<option value="NationalParkForecast/Area/sw/Latest">Exmoor National Park</option>'+
						'<option value="NationalParkForecast/Area/wl/Latest">Pembrokeshire Coast National Park</option>'+
						'</select>'+
						'</div>'+
						'</form>';

	if($('.databy').attr('value')==="Null"){
		showErrorBox("navbl", 'The data for the selected layer is not yet available for download<br><br>The layers with data available for download are:<br><ul style="padding-left:20px"><li>Pressure</li><li>Weather</li><li>Wind</li><li>Temperature</li><li>UV</li><li>Leisure areas</li><li>Warnings</li></ul><p style="font-size:12px;">For more information, see the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/pwsdatahelp.html">Data Download help page</a> or the Invent <a target="_blank" style="color:#7fd6e7;text-decoration:underline;" href="/public/pws/invent/tandc.html">Terms and Conditions</a></p>');
		;return;
	}
		$(document.body).append('<div id="modal" style="width:100%;height:100%;background-color:#000;opacity:0.7;z-index:9001;filter: alpha(opacity=70);left: 0px; top: 0px;"></div>');
		$(document.body).append('<iframe name="iframeName" id="moData"  frameborder="0"  vspace="0"  hspace="0"  marginwidth="0"  marginheight="0"'
				+'width="600">'
			+'</iframe>');
		frameURL = "/premium/pwsdata/index.html";	
		$('iframe#moData').attr('src', frameURL);
		
		$('iframe#moData').load(function() 
		{
			 layertype= $('.databy').attr('value');
			$('iframe#moData').contents().find('#dataType').html(layertype);
			if(layertype=="Wind"||layertype=="Weather"||layertype=="Temperature"){
				$('iframe#moData').contents().find('#dataTime').html(tlDate.toTimeString()+" "+tlDate.toDateString()).attr('value',times[animIndx]);
			}
			else if (layertype=="Pressure"){
				$('iframe#moData').contents().find('#dataTime').html(tlDate.toTimeString()+" "+tlDate.toDateString()).attr('value',layerTime);
			} else {
				$('iframe#moData').contents().find('#dataTime').html("Latest Available");
			}
			if (layertype=="Wind"||layertype=="Weather"||layertype=="Temperature"||layertype=="UV"||layertype=="Warnings"||layertype=="Pressure"){
				$('iframe#moData').contents().find('#dataArea').html("UK");
			}
			else {
				$('iframe#moData').contents().find('#dataArea').html(leisuredropdown);
			}
		});
}

function getMODataSession() {
	// read cookie Meto-Subscription looking for "|pwsdata,"
	sessionCookie = readCookie("Meto-Subscription");
	if (!sessionCookie){sessionCookie="";session=false;return false;}
	for (var i=1;i<sessionCookie.split('%7C').length;i++){
		if (sessionCookie.split('%7C')[i].split('%2C')[0] =="pwsdata"){session = true;break;} else {session = false;}
	}
	sessionName = sessionCookie.split('%7C')[0];
	return session;
}
function logout(){
	currentPage = window.location.href;
	window.location='/public/logout?goto='+currentPage;
}
function setUpLoginCtrls(){
	currentPage = window.location.href;
	if  (session){
		//LOGOUT
		$('#session').html('<span style="font-weight:bold">Welcome <span style="color:#00add0">'+sessionName+' </span> </span><a href="javascript:logout();">Log out</a>');
	} else{
		if (sessionCookie.length>0){
			//LOGOUT OF OTHER SERVICE/REGISTER FOR THIS SERVICE
			$('#session').html( '<span style="font-weight:bold">Welcome <span style="color:#00add0">'+sessionName+' </span> </span><a href="javascript:logout();">Log out</a><a target="_blank" href="/public/WaveProfileManagementClient/subscribe.do?service=pwsdata">Register for data download</a>');
		} else {
			//LOGIN/REGISTER
			$('#session').html('<a href="/public/login?goto='+currentPage+'">Log in for data download</a><a target="_blank" href="/public/register/pwsdata">Register for data download</a>');	}
	}
}

function fullScreen(setting) {
	if (setting == "on") {
		fullScreenBool = true;
		$("#topRightControls,#logoBar,#hnav,#footer,#disclaimer,#bc").fadeOut();
		$("#main,#content,#content-inner,#mapBox,#map,.width,.minwidth,.container,.content").css("height", "100%");
		$("div.content").children().filter("br.brclear").hide();
		$("body").css("padding-right", "5px");
		$("#right").css("margin-top", "5px");
	
		//IE
		if (msie6) {
			$("#main").removeClass("minwidth");
			$("#finalbr").hide();
			$(".container").css("margin-left", 0);
			$(".container").css("padding-left", 0);
			$(".minwidth").css("border", "0px solid blue");
			$(".minwidth:first-child").css("border", "0px solid green").css("margin-left", "-29px");
		}
	} else {
		fullScreenBool = false;
		//IE
		if (msie6) {
			$(".minwidth:first-child").css("border", "0px solid green").css("margin-left", "-24px");
		}
		$("#right").css("margin-top", "");
		$("body").css("padding", "0 5px");
		$("#disclaimer,#topRightControls,#logoBar,#hnav,#footer, #bc, div.content br.brclear").fadeIn(500);
		$(".width,.minwidth,.container,.content,#main,#content,#content-inner,#mapBox,#map").css("height", "");	
 	}
}

function preferences() {
	$("#content-inner").append('' + 
		'<div id="preferences" class="cornerTB07"><img class="crossImage" src="/public/pws/invent/lib/images/cross.png" alt="Close" />' + 
		'<h1>' + labels.menus.tools.preferences + '</h1>' +
		'<div class="contentContainer"><form>' + 
		'	<fieldset id="language">' +
		'		<legend>' + labels.general.language + '</legend>' + 
		'		<input type="radio" name="language" id="languageEng" value="Eng"><label for="languageEng">English</label><input type="radio" name="language" id="languageWl" value="Wl" disabled="disabled"><label for="languageWl">Cymraeg (currently not available)</label>' +
		'	</fieldset>' +
		'	<fieldset id="temperatureUnits">' +
		'		<legend>Temperature units</legend>' + 
		'		<input type="radio" name="temperatureUnits" id="temperatureUnitsC" value="C"><label for="temperatureUnitsC">&deg;C</label>' +
		'		<input type="radio" name="temperatureUnits" id="temperatureUnitsF" value="F"><label for="temperatureUnitsF">&deg;F</label>' +
		'	</fieldset>' +
		'	<fieldset id="speedUnits">' +
		'		<legend>Wind speed units</legend>' + 
		'		<input type="radio" name="speedUnits" id="speedUnitsM" value="M"><label for="speedUnitsM">' + getUnits("speed", "M") + '</label>' +
		'		<input type="radio" name="speedUnits" id="speedUnitsK" value="K"><label for="speedUnitsK">' + getUnits("speed", "K") + '</label>' +
		'		<input type="radio" name="speedUnits" id="speedUnitsN" value="N"><label for="speedUnitsN">' + getUnits("speed", "N") + '</label>' +
		'	</fieldset>' +
		'<fieldset id="windStyle">' +
		'		<legend>Wind Style</legend>' + 
		'		<input type="radio" name="windStyle" id="windStyleWind" value="Wind"><label for="windStyleP">Points</label>' +
		'		<input type="radio" name="windStyle" id="windStyleWindArrows" value="WindArrows"><label for="windStyleA">Arrows</label>' +
		'	</fieldset>' +
		'	<div class="buttonContainer">' + 
		'		<input id="preferencesOK" type="button" value="' + labels.general.ok + '"><input id="preferencesCancel" type="button" value=" ' + labels.general.cancel + ' ">' + 
		'	</div>' +
		'</form></div>' +
		'</div>');
	$("#preferences").draggable(dragOptions);
	$("#preferences").fadeIn();
	$("#preferences .crossImage,#preferencesCancel").click(function () {
		$("#preferences").fadeOut().remove();
		return false;
	});
	$("#preferencesOK").click(function () {
		savePreferences();
		selectVariableKeys();
		$("#preferences").fadeOut().remove();
		return false;
	});
	
	$("#language" + params.language).attr("checked","true");
	$("#temperatureUnits" + params.temperatureUnits).attr("checked","true");
	$("#speedUnits" + params.speedUnits).attr("checked","true");
	$("#windStyle" + params.windStyle).attr("checked","true");
}

function savePreferences() {
	var forceReload = false;
	var chosenLanguage = $("input[name='language']:checked").val();
	var chosenTemperatureUnits = $("input[name='temperatureUnits']:checked").val();
	var chosenSpeedUnits = $("input[name='speedUnits']:checked").val();
	var chosenWindStyle = $("input[name='windStyle']:checked").val();
	
	if (params.language != chosenLanguage) {
		forceReload = true;
	}
	$.cookie("MOWxLang", chosenLanguage, {path: '/', expires: 365});
	$.cookie("MOWxUnits", chosenTemperatureUnits, {path: '/', expires: 365});
	$.cookie("MOWxSpeedUnits", chosenSpeedUnits, {path: '/', expires: 365});
	$.cookie("MOWxWindStyle", chosenWindStyle, {path: '/', expires: 365});
	if (forceReload) {
		window.location.reload();
	}
	if (params.temperatureUnits != chosenTemperatureUnits || params.speedUnits != chosenSpeedUnits) {
		reloadLayer();
	}
	if (params.windStyle != chosenWindStyle && (selectedType == "Wind" || selectedType == "WindArrows")) {
	$("#items .layerKey").slideUp(300);
	$("#items .layerKey").hide();
	changeLayer("point", chosenWindStyle);
	}
	params.language = chosenLanguage;
	params.temperatureUnits = chosenTemperatureUnits;
	params.speedUnits = chosenSpeedUnits;
	params.windStyle = chosenWindStyle;
}

function getStateParamsFromCookie() {
	//	if cookie exists, update params object.

	var paramsList = readCookie("lastView");
	if (paramsList) {
		var paramsArray;
		paramsArray = paramsList.split('|');

		params.lat = paramsArray[0];
		params.lon = paramsArray[1];
		params.zoom = paramsArray[2];
		params.layerType = paramsArray[3];
		params.layer = paramsArray[4];
	}
}

function getPersistentParamsFromCookie() {
	//	if cookies exist, update params object.

	var language = readCookie("MOWxLang");
	var temperatureUnits = readCookie("MOWxUnits");
	var speedUnits = readCookie("MOWxSpeedUnits");
	var windStyle = readCookie("MOWxWindStyle");
	
	if (language) {
		params.language = language;
	}
	
	if (temperatureUnits) {
		params.temperatureUnits = temperatureUnits;
	}

	if (speedUnits) {
		params.speedUnits = speedUnits;
	}
	
	if (windStyle) {
		params.windStyle = windStyle;
	}
}

function updateLastViewCookie() {
	//	update lastView cookie with details of current state.  
	var state = getPageState();

	var cookieString = "";
	cookieString += state.lat + "|" + 
		state.lon + "|" + 
		state.zoom + "|" + 
		state.layerType + "|" + 
		state.layer;
	createCookie("lastView", cookieString, 365);
}

function noData(text){
	map.clearOverlays();
	$('#tlContainer').empty();
	$('#frameNav').css('color','#fff');
	$("#date").empty();
	$("#time").empty();
	$('#map .slider').css('visibility','hidden');
	$('#rightTl').hide();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	$('#prodTitle').html(text);
}

function changeLayer(layerType, layer) {
	// loads a layer (either layer or point data)
	closeFCBox();
	$("#items .layerKey").slideUp(300);
	$("#items .layerKey").hide();
	$("#" + layerType.substring(0,1) + layer).attr("checked", "checked");
	govDataLayer = "";
	if (layerType == "point") {
		selectedType = layer;
		govDataLayer = layer;
		if (layer == "Regions") {
			pointsTL = false;
			if (feedStatus.warnings){
				build5DayTL();
			} else {
				noData(noWarningText);
				getRegData();
			}
		} else if (layer == "UV") {
			pointsTL = false;
			changeToPoints();
			loadUVXML();
			//$("#layerKeyUV").slideDown(300);
		} else if (layer == "Leisure") {
			pointsTL = false;
			getLeisureData();
			getLeisureTL();
			$("#layerKeyLeisure").slideDown(300);
		} else {
			if (pointsTL === false){
				changeToPoints();
				getTimeSteps();
				pointsTL = true;
			} else {
				loadingPoints();
				loadUKMarkers(times[animIndx],animIndx);
			}
			$("#layerKey" + layer).slideDown(300);
			if (layer == "Wind") {
				
				$("#layerKeyWindArrows").slideUp(300);
				$("#layerKeyWindPoints").slideDown(300);
				$("#layerKeyWind").slideDown(300);
				$('#windSetter2').css('background-color','#CCFF33'); 
				$('#windSetter1').css('background-color','silver');
			} 
			if(layer == "WindArrows"){
				$("#layerKeyWindArrows").slideDown(300);$("#layerKeyWind").slideDown(300);
				$("#pWind").attr("checked", "checked");
				$('#windSetter1').css('background-color','#CCFF33'); 
				$('#windSetter2').css('background-color','silver');
			}
		}
	} else if (layerType == "layer") {
		pointsTL = false;
		govDataLayer = $('#l'+layer).attr('value');
		addOverlay(layer);
		selectVariableKeys();
		$('#layerKey' + currentLayer).slideDown(300);
	}
	if (!govData[govDataLayer]){
		$('.databy').attr('value','Null');
	}else{
		if (govDataLayer=="Regions"){
			$('.databy').attr("value","Warnings");
		}else{
			$('.databy').attr("value",govDataLayer);
		}
	}
	if (session){
		if(!govData[govDataLayer]){
			$('#databyDiv').css('color','#ccc').css('backgroundColor','#444').hover(function(){$(this).css('backgroundColor','#444')},function(){$(this).css('backgroundColor','#444')}); 
		} else {
			$('#databyDiv').css('color','#fff').css('background-color','#000').hover(function(){$(this).css('backgroundColor','#444')},function(){$(this).css('backgroundColor','#000')}); 
		}
	} else {
		$('#databyDiv').hover(function(){$(this).css('backgroundColor','#444')},function(){$(this).css('backgroundColor','#444')}); 
	}
	favMM.refresh();

}

function changewindLayer(layerType, layer) {
	// Based on changelayer, loads point data for Spots or Arrows)
		loadingPoints();
		selectedType = layer;
		if (layer == "Wind") {
			$("#layerKeyWindPoints").slideDown(300);
			$("#layerKeyWindArrows").slideUp(300);
			params.windStyle = "Wind";
			$.cookie("MOWxWindStyle", "Wind", {path: '/', expires: 365});
			$('#windSetter2').css('background-color','#CCFF33'); 
			$('#windSetter1').css('background-color','silver');
		} else {
			$("#layerKey" + layer).slideDown(300);
			if(layer == "WindArrows"){$("#layerKeyWindArrows").slideDown(300);$("#layerKeyWindPoints").slideUp(300);
			params.windStyle = "WindArrows";}
			$.cookie("MOWxWindStyle", "WindArrows", {path: '/', expires: 365});
			$('#windSetter1').css('background-color','#CCFF33'); 
			$('#windSetter2').css('background-color','silver');
		}
	loadUKMarkers(times[animIndx],animIndx);
	favMM.refresh();
}

function selectVariableKeys() {
	// Finds the image element for the displayed key, and changes to a key appropriate to the chosen units: C / F, knots / mph, etc.
	var selectedItem = $("input[name='layerRb']:checked");
	if (selectedItem.val() == "Temp. Map") {
		var myid = selectedItem.attr("id").substr(1);
		$("#layerKey" + myid).html(keyLayout["Temp. Map" + params.temperatureUnits]);
	} 
}

function getQueryString(key, default_) {
	// gets any query string

	if (default_==null) default_="";
	key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
	var qs = regex.exec(window.location.href);
	if(qs == null)
		return default_;
	else
		return qs[1];
} 

function isValidLayer(layerType, layer) {
	// validates a layer and layertype
	
	if (layerType == "point") {
		if (layer == "Weather" || layer == "Wind" || layer == "Temperature" || layer == "UV" || layer == "Leisure" || layer == "Regions" ) {
			return true
		} else {
			return false
		}
	} else {
		layer = parseFloat(layer);
		if (typeof layer == "number" && layer >= 0) {
			return true
		} else {
			return false
		}
	}
}

function getPageParams() {
	// gets the URL params and sanitises them. 
	
	var lat = parseFloat(getQueryString("lat"));
	var lon = parseFloat(getQueryString("lon"));
	var zoom = parseInt(getQueryString("zoom"));
	var layerType = getQueryString("layertype");
	var layer = getQueryString("layer");
	if (typeof lat == "number" && lat >= -90  && lat <= 90 ) params.lat = lat;
	if (typeof lon == "number" && lon >= -180 && lon <= 180) params.lon = lon;
	if (typeof zoom == "number" && zoom > 0) params.zoom = zoom;
	if (layerType == "point" || layerType == "layer") {
		if (isValidLayer(layerType, layer)) {
			params.layerType = layerType;
			if (layerType == "layer") layer = parseFloat(layer);
			params.layer = layer;
		}
	}
}

function bookMark() {
	// Pops up an alert with a URL representing the current view.

	var url = getPageURL();
	showErrorBox("bookmark", "<a href=\"" + url + "\" target=\"_blank\">Open this map in a new window</a>" + "<br><input id=\"urlbox\" type=\"text\" value=\"" + url + "\">");
}

function getPageURL() {
	// Returns URL representing the current view.

	var state = getPageState();
	var lat = state.lat;
	var lon = state.lon;
	var zoom = state.zoom;
	var layerType = state.layerType;
	var layer = state.layer;

	return (window.location.href.split("?")[0] + "?lat=" + lat + "&lon=" + lon + "&zoom=" + zoom + "&layertype=" + layerType + "&layer=" + layer);
}

function getPageState() {
	// gets the current view and returns in a struct.

	var state = {};
	var current = map.getCenter();
	state.lat = current.lat();
	state.lon = current.lng();
	state.zoom = map.getZoom();
	// for point data, or a state of -2 (no layer), we use "point" layer, plus the type.  
	if (currentLayer == -1 || currentLayer == -2) {
		state.layerType = "point";
		state.layer = selectedType;
	} else {
		state.layerType = "layer";
		state.layer = currentLayer;
	}
	return state;
}

function checkBounds() {
	// checks that the user is still looking at area near the UK.  

	var C = map.getCenter();
	if (boundaries.contains(C)) {
		return;
	}
	var X = C.lng();
	var Y = C.lat();
	var AmaxX = boundaries.getNorthEast().lng();
	var AmaxY = boundaries.getNorthEast().lat();
	var AminX = boundaries.getSouthWest().lng();
	var AminY = boundaries.getSouthWest().lat();
	if (X < AminX) {X = AminX;} 
	if (X > AmaxX) {X = AmaxX;}
	if (Y < AminY) {Y = AminY;}
	if (Y > AmaxY) {Y = AmaxY;}
	map.setCenter(new GLatLng(Y,X));
}

function showErrorBox(errorType, message) {
	// creates and shows a new error box.

	var eboxRef = "errorBox" + errorType;
	$("#" + eboxRef).fadeOut();
	$("#content-inner").append('<div id="' + eboxRef + '" class="errorBox cornerTB07"><img class="errorBoxCross crossImage" src="/public/pws/invent/lib/images/cross.png" alt="Close" /><p class="errorBoxMessage">&nbsp;</p></div>');
	$("#" + eboxRef).draggable(dragOptions);
	$("#" + eboxRef + " .errorBoxMessage").html(message);
	$("#" + eboxRef).fadeIn();
	$("#" + eboxRef + " .errorBoxCross").click(function () {
		$(this).parent().fadeOut();
		return false;
	});
}

function hideErrorBox(errorType) {
	// hides and removes an error box. 

	var eboxRef = "errorBox" + errorType;
	$("#" + eboxRef).fadeOut().remove();
}

function setupTimeInfo() {
	// gets time offset (i.e. BST / GMT) info, and adds summer-time-handling functions to Date prototype.  
	var request = GXmlHttp.create();
	
	Date.prototype.toDateWithHourOffset = function () {
		this.setHours(this.getHours() + hourOffset);
		return this;
	};

	Date.prototype.toTimeString = function () {
		return ((this.getHours() < 10) ? "0" : "") + this.getHours().toString() + ((this.getMinutes() < 10) ? "0" : "") + this.getMinutes().toString();
	};

	Date.prototype.toDateString = function () {
		var month_name = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
		var day_name = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
		var monthText = month_name[this.getMonth()];
		var dayText = day_name[this.getDay()];
		return (dayText + " " + this.getDate() + " " + monthText);
	};

	feedStatus.time = false;
	var currentTime = new Date();
	request.open("GET", timeInfoFile, true);
	request.onreadystatechange = function () {
        if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					hourOffset = parseInt(request.responseText, 10);
					if (isNaN(hourOffset)) {
						throw "Time offset could not be parsed";
					}
				} else {
					throw "Time offset info file not retrieved";
				}
				feedStatus.time = true;
			}
			catch(err) {
				hourOffset = 0;
				feedStatus.time = false;
				showErrorBox("time", timeWarning);
			}
		}
	};
	request.send(null);
}

function toDateObj(oldDate) {
	var hour = oldDate.slice(11,13);
	var min = oldDate.slice(14,16);
	var ndate = oldDate.slice(8,10);
	var year = oldDate.slice(0,4);
	var monthNumber = oldDate.slice(5,7)-1;
	return new Date(year, monthNumber, ndate, hour, min);
}

function updateTimeline(dt,text,z) {
	var tempDate = toDateObj(dt);
	tlDate = tempDate.toDateWithHourOffset();
	var ztest=(fcPosn<0)?(2):fcPosn;
	if (z<ztest-1){$('#prodTitle').html("Recent "+text);$('#frameNav').css('color','#fff');}
	if (z==ztest-1){$('#prodTitle').html("Latest "+text);$('#frameNav').css('color','#fff');}
	if (z>ztest-1){$('#prodTitle').html("Forecast "+text);$('#frameNav').css('color','#cf3');}
	if (z<ztest-1 && text == "WindArrows"){$('#prodTitle').html("Recent Wind");$('#frameNav').css('color','#fff');}
	if (z==ztest-1 && text == "WindArrows"){$('#prodTitle').html("Latest Wind");$('#frameNav').css('color','#fff');}
	if (z>ztest-1 && text == "WindArrows"){$('#prodTitle').html("Forecast Wind");$('#frameNav').css('color','#cf3');}
	if (!tSTT){
		$('#date').html(tlDate.toDateString());
		$('#time').html(tlDate.toTimeString() + (! feedStatus.time ? " UTC" : ""));
	}
}

function updateInfo() {
	var temp = allLayers.sets[currentLayer];
	var dateTime = temp.data[animIndx].begin;
	var nameLayer = temp.name;
	if (temp.data[animIndx].lrpfc=="F") {$('#frameNav').css('color','#cf3');} else {$('#frameNav').css('color','#fff');}
	updateTimeline(dateTime, nameLayer,animIndx);
}

function timediff(laterdate,earlierdate) {
    var diff = laterdate.getTime() - earlierdate.getTime();
    var daysdiff = Math.floor(diff/1000/60/60/24); diff -= daysdiff*1000*60*60*24;
    var hoursdiff = Math.floor(diff/1000/60/60); diff -= hoursdiff*1000*60*60;
	var minutesdiff = Math.floor(diff/1000/60); diff -= minutesdiff*1000*60;

    return ((24 * 60 * daysdiff) + (60 * hoursdiff) + minutesdiff);
}

function isValidXML(xml) {
	// Determines if XML passed in is valid.  
	try {
		if (xml.childNodes.length === 0 || xml.childNodes[0].nodeName == "parsererror" || xml.childNodes[0].nodeName == "html") {
			return false;
		} else {
			return true;
		}
	}
	catch (err) {
		return false;
	}
}

function getUnits(type, units) {
	if (type == "speed") {
		if (units == "K") {
			return labels.units.kmh;
		} else if (units == "M") {
			return labels.units.mph;
		} else if (units == "N") {
			return labels.units.knots;
		} else  {
			return labels.units.unknown;
		}
	}
}

function configPoints() {
	if (selectedType == 'Wind') {
		for (var m in markerArray) {
			if (markerArray[m].windSpeed === null || markerArray[m].windSpeed == "missing" || markerArray[m].windDir === null || markerArray[m].windDir == "missing") {
				markerArray[m].image_ = "";
				markerArray[m].height_ = 0;
				markerArray[m].width_ = 0;
				markerArray[m].mClass_ = '';
				markerArray[m].text_= '';
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = null;
				
				//reset the corresponding duplicate marker if no windspeed can be found, else the previous values persist. 
				dupMarkerArray[m].tClass_ = '';
				dupMarkerArray[m].text_ = '';
				dupMarkerArray[m].ttTxt = null;
				dupMarkerArray[m].height_ = 0;
				dupMarkerArray[m].width_ = 0;
			} else {
				var currentWindSpeed = markerArray[m].windSpeed;
				if (params.speedUnits == "K") {
					currentWindSpeed = parseInt(currentWindSpeed * 1.609344);
				} else if (params.speedUnits == "N") {
					currentWindSpeed = parseInt(currentWindSpeed * 0.868976242);
				}
				markerArray[m].image_ = "lib/images/windSymbols/" + markerArray[m].windDir + ".gif";
				markerArray[m].height_ = 40;
				markerArray[m].width_ = 40;
				markerArray[m].tClass_ = 'windDiv';
				markerArray[m].mClass_ = '';
				markerArray[m].text_ = Math.round(currentWindSpeed);
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = markerArray[m].name+"<br>"+markerArray[m].windDir + " " + Math.round(currentWindSpeed) + " " + getUnits("speed", params.speedUnits);

				if (markerArray[m].windGust == null) {
					// if there's no wind gust value,we hide the duplicate marker.  
					dupMarkerArray[m].tClass_ = '';
					dupMarkerArray[m].text_ = "";
					dupMarkerArray[m].ttTxt = null;
				} else {
					var currentWindGustSpeed = markerArray[m].windGust;
					if (params.speedUnits == "K") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 1.609344);
					} else if (params.speedUnits == "N") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 0.868976242);
					}
					
					// if the wind data has a wind gust value, we show the duplicate marker, by setting its class, text value and tool tip text. 
					markerArray[m].ttTxt = markerArray[m].ttTxt + " gusting to " + Math.round(currentWindGustSpeed) + " " + getUnits("speed", params.speedUnits);
					dupMarkerArray[m].image_ = "";
					dupMarkerArray[m].height_ = 10;
					dupMarkerArray[m].width_ = 40;
					// if it's a northerly, we show the gust value above the wind icon, and vice versa.  
					if (markerArray[m].windDir.indexOf("N") > -1) {
						dupMarkerArray[m].tClass_ = 'windGustDivN';
					} else {
						dupMarkerArray[m].tClass_ = 'windGustDivS';
					}
					dupMarkerArray[m].mClass_ = '';
					dupMarkerArray[m].text_ = Math.round(currentWindGustSpeed);
					dupMarkerArray[m].color_ = '';
					dupMarkerArray[m].ttTxt = markerArray[m].ttTxt;
				}
			}
		}
	} else if (selectedType=="WindArrows"){
	for (var m in markerArray) {
	if (markerArray[m].windSpeed === null || markerArray[m].windSpeed == "missing" || markerArray[m].windDir === null || markerArray[m].windDir == "missing") {
				markerArray[m].image_ = "";
				markerArray[m].height_ = 0;
				markerArray[m].width_ = 0;
				markerArray[m].mClass_ = '';
				markerArray[m].text_= '';
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = null;
				
				//reset the corresponding duplicate marker if no windspeed can be found, else the previous values persist. 
				dupMarkerArray[m].tClass_ = '';
				dupMarkerArray[m].text_ = '';
				dupMarkerArray[m].ttTxt = null;
				dupMarkerArray[m].height_ = 0;
				dupMarkerArray[m].width_ = 0;
			} else {
				dupMarkerArray[m].text_ = '';
				var currentWindSpeed = markerArray[m].windSpeed;
				if (params.speedUnits == "K") {
					currentWindSpeed = parseInt(currentWindSpeed * 1.609344);
				} else if (params.speedUnits == "N") {
					currentWindSpeed = parseInt(currentWindSpeed * 0.868976242);
				}
				// if statement added, as if gusts are present the black arrow doesn't need to be displayed as a red one will
				markerArray[m].text_ = '';
				markerArray[m].image_ = "lib/images/windSymbols/arrows/" + markerArray[m].windDir + ".gif";
				if (Math.round(markerArray[m].windSpeed) == 0) {
				markerArray[m].image_ = "";
				markerArray[m].height_ = 0;
				markerArray[m].width_ = 0;
				markerArray[m].mClass_ = '';
				markerArray[m].text_= '';
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = null;
				}
				else { markerArray[m].height_ = (Math.round(markerArray[m].windSpeed)+20);
				markerArray[m].width_ = (Math.round(markerArray[m].windSpeed)+20);}
				markerArray[m].tClass_ = 'windDiv';
				markerArray[m].mClass_ = '';
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = markerArray[m].name+"<br>"+markerArray[m].windDir + " " + Math.round(currentWindSpeed) + " " + getUnits("speed", params.speedUnits); 
					}
				
					//if statment to determine if a Red Gust arrow will be displayed and properties set
				if (markerArray[m].windGust == null) {
					// if there's no wind gust value,we hide the duplicate marker.  
					dupMarkerArray[m].tClass_ = '';
					dupMarkerArray[m].text_ = '';
					dupMarkerArray[m].ttTxt = null;
				} else {
					var currentWindGustSpeed = markerArray[m].windGust;
					if (params.speedUnits == "K") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 1.609344);
					} else if (params.speedUnits == "N") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 0.868976242);
					}
					
					// if the wind data has a wind gust value, we show the duplicate marker, by setting its class, text value and tool tip text. 
					markerArray[m].ttTxt = markerArray[m].ttTxt + " gusting to " + Math.round(currentWindGustSpeed) + " " + getUnits("speed", params.speedUnits);
					markerArray[m].mClass_ = '';
					markerArray[m].color_ = '';
					markerArray[m].tClass_ = '';
					dupMarkerArray[m].tClass_ = '';
					dupMarkerArray[m].mClass_ = '';
					dupMarkerArray[m].color_ = '';
					dupMarkerArray[m].text_ = '';
					dupMarkerArray[m].ttTxt = markerArray[m].ttTxt;}
					}
				} 
	
	else {
		for (var m in markerArray) { 
			// for weather & temperature data we don't want to show the duplicate marker set, so we set them to blank.  
			dupMarkerArray[m].tClass_ = '';
			dupMarkerArray[m].text_ = "";
			dupMarkerArray[m].ttTxt = null;
			if (markerArray[m][selectedType] === null || markerArray[m][selectedType] === "missing" || isNaN(markerArray[m][selectedType])) {
				markerArray[m].image_ = "";
				markerArray[m].height_ = 0;
				markerArray[m].width_ = 0;
				markerArray[m].mClass_ = '';
				markerArray[m].text_= '';
				markerArray[m].color_ = '';
				dupMarkerArray[m].tClass_ = '';
				dupMarkerArray[m].text_ = '';
				dupMarkerArray[m].ttTxt = null;
				dupMarkerArray[m].height_ = 0;
				dupMarkerArray[m].width_ = 0;
			} else {
				switch (selectedType) {
				case 'Weather': 
					if (msie){
					markerArray[m].image_ ="../lib/images/wxsymbols/w" + markerArray[m].Weather + ".gif";
					}
					else {markerArray[m].image_ ="../lib/images/wxsymbols/w" + markerArray[m].Weather + ".png";}
					markerArray[m].ttTxt = markerArray[m].name+"<br>"+wxDesc[markerArray[m].Weather]+"<br>Click for textual/tabular view";
					markerArray[m].height_ = 35;
					markerArray[m].width_ = 35;
					markerArray[m].mClass_ = '';
					markerArray[m].text_= '';
					markerArray[m].color_ = '';break;
				case 'Temperature': 
					var currentTemp = markerArray[m].Temperature;
					if (currentTemp < -14){markerArray[m].color_ = "#5C027C"}
					else if (currentTemp > 37){markerArray[m].color_ = "#FED7EC"}
					else {markerArray[m].color_ = tempCol[currentTemp];}
					if (currentTemp < -5){markerArray[m].tClass_ = 'tempMarkerWhite';}else{markerArray[m].tClass_ = 'tempMarker';}
					
					if (params.temperatureUnits == "F") {
						currentTemp = parseInt((currentTemp * 9 / 5 + 32) + 0.5);
					}
					markerArray[m].image_ = null;
					markerArray[m].text_ = currentTemp;
					markerArray[m].mClass_ = 'mDiv';
					markerArray[m].height_ = 16;
					markerArray[m].width_ = 19 + ((markerArray[m].text_.toString().length - 1) * 3);
					markerArray[m].ttTxt = markerArray[m].name+"<br>" + currentTemp + " &deg;" + params.temperatureUnits+"<br>Click for textual/tabular view";
					break;
				}
			}
		}
	}
	mm.refresh();
	pointsLoading = false;
}

function plotUKMarkers(kml) {
	var sites = kml.getElementsByTagName("hourlyInfo");
	var gust;
	switch (selectedType) {
	case "Weather":
		for (var m in markerArray) {
			markerArray[m].Weather = null;
		}
		for (var i=0; i < sites.length; i++) {
			id = sites[i].getElementsByTagName("SiteId")[0].childNodes[0].nodeValue;
			if (markerArray[id]) {
				markerArray[id].Weather = sites[i].getElementsByTagName("WEATHER_TYPE")[0].childNodes[0].nodeValue;
			}
		}
		break;
	case "Temperature":
		for (var m in markerArray) {
			markerArray[m].Temperature = null;
		}
		for (var i=0; i < sites.length; i++) {
			id = sites[i].getElementsByTagName("SiteId")[0].childNodes[0].nodeValue;
			if (markerArray[id]) {
				markerArray[id].Temperature = Math.round(sites[i].getElementsByTagName("TEMP")[0].childNodes[0].nodeValue);
			}
		}
		break;

	case "Wind":
		for (var m in markerArray) {
			markerArray[m].windSpeed = null; markerArray[m].windDir = null; markerArray[m].windGust = null;
		}
		for (var i=0; i < sites.length; i++) {
			id = sites[i].getElementsByTagName("SiteId")[0].childNodes[0].nodeValue;
			if (markerArray[id]) {
				markerArray[id].windSpeed = sites[i].getElementsByTagName("WIND_SPEED")[0].childNodes[0].nodeValue;
				markerArray[id].windDir = sites[i].getElementsByTagName("WIND_DIR")[0].childNodes[0].nodeValue;
				gust = sites[i].getElementsByTagName("WIND_GUST")[0].childNodes[0].nodeValue;
				if (gust != "missing") {
					markerArray[id].windGust = gust;
				}
			}
		}
		break;
		
	case "WindArrows":
		for (var m in markerArray) {
			markerArray[m].windSpeed = null; markerArray[m].windDir = null; markerArray[m].windGust = null;
		}
		for (var i=0; i < sites.length; i++) {
			id = sites[i].getElementsByTagName("SiteId")[0].childNodes[0].nodeValue;
			if (markerArray[id]) {
				markerArray[id].windSpeed = sites[i].getElementsByTagName("WIND_SPEED")[0].childNodes[0].nodeValue;
				markerArray[id].windDir = sites[i].getElementsByTagName("WIND_DIR")[0].childNodes[0].nodeValue;
				gust = sites[i].getElementsByTagName("WIND_GUST")[0].childNodes[0].nodeValue;
				if (gust != "missing") {
					markerArray[id].windGust = gust;
				}
			}
		}
		break;		
	}
	configPoints();
}

function loadUKMarkers(time,posn) {
	var request = GXmlHttp.create();
	var kmlFile = inventCache+"Item/ObsForecast/UkData/"+time;
	//var kmlFile = "obsfctemp.xml";
	var currentTime = new Date();
	pointsDataLoading = true;
	request.open("GET", kmlFile, true); 
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					if (! isValidXML(request.responseXML)) {
						throw "Parse error in UK marker feed";
					}
				} else {
					throw "UK marker feed not available: " + time;
				}
				plotUKMarkers(request.responseXML);
				pointsDataLoading = false;
			}
			catch(err) {
				showErrorBox("marker", UKMarkerErrorMessage.start + $("#items .radiob:checked").attr("value").toLowerCase() + UKMarkerErrorMessage.middle +  UKMarkerErrorMessage.end);
				map.clearOverlays();
				pointsLoading = false;
			}
		}
	};
	request.send(null);
	$('#frameNav').css('color','#cf3');
	updateTimeline(time, selectedType,posn);
}

function clickPointTS(){
	$('#tileLoading').css('visibility','visible');
	pointsLoading = true;
	$('[id^="tlPos"]').removeClass('current');
	$('#tlPos'+animIndx).addClass('current');
	loadUKMarkers(times[animIndx],animIndx);
	hideErrorBox("marker");
}

function inbetween () {
	if ((checkImgs()===0 || playTimeout>40) && dontstop) {
		setTimeout(function(){startAnimation();},1200);
		$('#tileLoading').css('visibility','hidden');
	} else if (dontstop) {
		playTimeout++;
		setTimeout(function(){inbetween();},500);
	} else {
		$('#tileLoading').css('visibility','hidden');
	}
}

function inbetweenPoints () {
	if (!pointsLoading && dontstop) {
		setTimeout(function(){startAnimation();},1200);
		$('#tileLoading').css('visibility','hidden');
	} else if (dontstop) {
		setTimeout(function(){inbetweenPoints();},500);
	} else {
		$('#tileLoading').css('visibility','hidden');
	}
}

function startAnimation() {
	if (currentLayer >= 0 ){
		var current = allLayers.sets[currentLayer];

		if (dontstop) {
			map.removeOverlay(current.data[animIndx].url);
			animIndx++;
			if (animIndx > current.data.length-1) {animIndx = 0;}
			map.addOverlay(current.data[animIndx].url);
		}
		$('#tileLoading').css('visibility','visible');
		playTimeout=0;
		inbetween();
		$('[id^="tlPos"]').removeClass('current');
		$('#tlPos'+animIndx).addClass('current');
		updateInfo();
	} else {
		if (dontstop) {
			animIndx++;
			if (animIndx > times.length - 1) {
				animIndx = 0;
			}
			clickPointTS();
		}
		inbetweenPoints();
	}
}
	
function stopAnimation() {
	dontstop=false;
	$('#pause').attr("id", 'play');
}

function hideTooltip(d) {
	mtt = false;
	if (d.length < 1) { 
		return;
	}
	document.getElementById(d).style.display = "none";
}

function jQEvents() {
	// sets up various JQuery event handlers. 

	$('#rightTl .playpause').toggle(function() {$('#play').attr("id", 'pause');dontstop=true;setTimeout(function(){startAnimation();}, 1000);} , function () {stopAnimation();});

	$('#mapLayersObj .slideTop').click(function () {
		$("#mapLayersObj .slideBox .slideTop").not(this).siblings().slideUp();
		$("#mapLayersObj .slideBox .slideTop").not(this).addClass("selClosed");
		$(this).siblings().slideToggle();
		$(this).toggleClass("selClosed");
		if (currentLayer > -1) {
			if ($("#mapLayersTop").hasClass("selClosed")) {
				$('#map .slider').css('visibility','hidden');
			} else {
				$('#s'+currentLayer).css('visibility','visible');
			}
		}
		return false;
	});
	$('#content-inner .popup').children().click(function () {
		// It's necessary to change the z-Index by hand, instead of via classes, because the z-Index is added 
		// back by jQuery after a drag operation, thus messing up the order of things.  
		$('#content-inner .popupSel').addClass('popup').removeClass('popupSel').css("z-Index", "9000");
		$(this).parent().removeClass('popup').addClass('popupSel').css("z-Index", "9001");
		return false;
	});
	$('#mapLayersObj').hover(function(){hideTooltip('regTT2'); optBool=true;},function(){optBool=false;});
	$('#databy').click(function(){getMOData();})
	}

function removeLoadingScreen(section) {
	// fades out the loading screen
	$("#loadingBox").fadeOut();
}

function tilesloaded(situation) {
	// triggered when GMap is loaded.  Triggers removal of the loading screen and changes to the startup layer.  
	//GEvent.removeListener(loadingScreenListener);
	clearTimeout(loadingScreenFallback);
	if (situation == "initial" || situation == "fallback") {
		removeLoadingScreen(""); 
		if (currentLayer == -2) {
			if (situation == "fallback") {
			// in the fallback situation, the user has probably got bored and clicked on 
			// something else, so we don't try and load the regions layer for him. 
			// Instead, we put a message in the timeline.  
				$('#prodTitle').html("Click on an option in the list to show weather on the map.");
				$('#prodTitle').css("color", "white");
			} else {
				if (params.layerType == "layer"){$('#l'+params.layer).click();}
				else if (params.layer == "WindArrows"){$('#pWind').click();}
				else if (params.layerType == "point" && isNaN(params.layer)){$('#p'+params.layer).click();}
				else {$('#pRegions').click();}
			}
		}
	}
	//increases zindex so that google navigation is usable when over other elements
	$('#lmc3d').css("z-Index","30");
	if (opera){
		showErrorBox("opera", operaMessage);
	}
}

function cnvrt2title(str) {
    var re = new RegExp(/^(a|about|after|an|and|at|by|for|from|in|into|nor|of|on|onto|over|the|to|up|with|within|s)$/);        
    function cnvrt() {
        if (re.test(arguments[0]) && arguments[arguments.length - 2]) {
            return arguments[0];
		} else {
            return arguments[1].toUpperCase() + arguments[2];
		}
    }
    return str.toLowerCase().replace(/\b([a-z])(\w*)\b/g, cnvrt);
}

function updateTimelineTooltip(id) {
	var dateInbound = document.getElementById(id).getAttribute("dt");
	var dateTime = toDateObj(dateInbound).toDateWithHourOffset();
	otherTime = $("#time");
	otherTime.html(dateTime.toTimeString() + (! feedStatus.time ? " UTC" : ""));
	otherTime.addClass("tooltipInProgress");
	otherDate = $("#date");
	otherDate.html(dateTime.toDateString());
	otherDate.addClass("tooltipInProgress");
}

function clearTimelineTooltip() {
	tSTT = false;
	var dateInbound = $("#tlContainer .current").attr("dt");
	var dateTime = toDateObj(dateInbound).toDateWithHourOffset();
	otherTime.removeClass("tooltipInProgress");
	otherTime.html(dateTime.toTimeString() + (! feedStatus.time ? " UTC" : ""));
	otherDate.removeClass("tooltipInProgress");
	otherDate.html(dateTime.toDateString());
}

function update5DayTLTooltip(id) {
	var dateTime = new Date(document.getElementById(id).getAttribute("dt"));
	otherDate = $("#date");
	otherDate.html(dateTime.toDateString());
	otherDate.addClass("tooltipInProgress");
}

function clear5DayTLTooltip() {
	var dateTime = new Date($("#tlContainer ."+selectedType+"current").attr("dt"));
	otherDate.removeClass("tooltipInProgress");
	otherDate.html(dateTime.toDateString());
}

function closeFCBox() {
	// closes the forecast box, if shown.  
	$('#textFCBox').fadeOut().remove();
}

function loadHelp() {
	// displays the help pane.  
	setupHelp(); // creates the help box, and sets up the various handlers on it.  
	// then displays it, etc. 
	$("#helpTabs :first a").click();
	$('#content-inner .popupSel').addClass('popup').removeClass('popupSel');
	$("#helpBox").fadeIn().removeClass('popup').addClass('popupSel');
}

function setupHelp() {
	$("#content-inner").append('' + 
		'<div id="helpBox" class="cornerTB07 popup">' +
		'	<div class="helpBar">' +
		'		<img class="crossImage" src="/public/pws/invent/lib/images/cross.png" alt="Close">' +
		'		<div class="title"><h2>Help</h2></div>'+
		'		<br class="brclear">'+
		'		<ul id="helpTabs">' +
		'			<li><a href="help/intro.txt">Welcome</a></li>' +
		'			<li><a href="help/timeline.txt">Timeline</a></li>' +
		'			<li><a href="help/locations.txt">Locations</a></li>' +
		'			<li><a href="help/layers.txt">Layers</a></li>' +
		'			<li><a href="help/tools.txt">Tools</a></li>' +
		'			<li><a href="help/faqs.txt">FAQs</a></li>' +
		'		</ul>' +
		'	</div>' +
		'	<div id="mainHelpText">' +
		'	</div>' +
		'</div>'
	);
	// sets up the help pane for use. 
	$("#helpBox .crossImage").click(function () {
		$("#helpBox").fadeOut().remove();
		return false;
	});
	$("#helpTabs li a").hover(
		function () {
			$(this).parent().addClass("hovered");
		}, 
		function () {
			$(this).parent().removeClass("hovered");
		}
	);
	$("#helpTabs li a").click(function () {
		$("#helpTabs li").removeClass("selected");
		$(this).parent().addClass("selected");
		$("#mainHelpText").html('<p style="text-align:center"><img src="lib/images/loadingSmall.gif"></p>');
		$("#mainHelpText").load($(this).attr("href"));
		return false;
	});
	var helpOptions = dragOptions;
	helpOptions.handle = '.helpBar';
	$("#helpBox").draggable(helpOptions);
}

function centerZoom(point) {
	var zoom = map.getZoom() + 2;
	if (zoom < 10) {
		map.setCenter(point, zoom);
		hideTooltip('regTT2');
	} else {
		map.setCenter(point);
	}
}

//*******TOOLTIPS*******//
var cX = 0; var cY = 0; var rX = 0; var rY = 0;
function UpdateCursorPosition(e) { cX = e.pageX; cY = e.pageY;}
function UpdateCursorPositionDocAll(e) { cX = event.clientX; cY = event.clientY;}
if (document.all) { document.onmousemove = UpdateCursorPositionDocAll; }
else { document.onmousemove = UpdateCursorPosition; }

function AssignPosition(d) {
	if (self.pageYOffset) {
		rX = self.pageXOffset;
		rY = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) {
		rX = document.documentElement.scrollLeft;
		rY = document.documentElement.scrollTop;
	} else if (document.body) {
		rX = document.body.scrollLeft;
		rY = document.body.scrollTop;
	}
	if (document.all) {
		cX += rX; 
		cY += rY;
	}
	var dTop = 0;
	if (fullScreenBool){dTop = -50}else{dTop = -210};
	d.style.left = (cX + 20) + "px";
	d.style.top = (cY + dTop) + "px";
}

function showTooltip(d) {
	if (d.length < 1) {
		return;
	}
	var dd = document.getElementById(d);
	AssignPosition(dd);
	dd.style.display = "block";
}

function ReverseContentDisplay(d) {
	if (d.length < 1) {
		return;
	}
	var dd = document.getElementById(d);
	AssignPosition(dd);
	if (dd.style.display == "none") { 
		dd.style.display = "block";
	} else { 
		dd.style.display = "none";
	}
}

function setTooltip(marker, name) {
	GEvent.addListener(marker, "click", function() {
		centerZoom(marker.getPoint());
	});
	GEvent.addListener(marker, "mouseover", function() {
		mtt = true;
		$('#tTText').html(name);
		showTooltip('regTT2'); return true;
	});        
	GEvent.addListener(marker, "mouseout", function() {
		mtt = false;
		hideTooltip('regTT2'); return true;
	});
}

//****************//
//** End Shared **//
//****************//


//***************//
//** Layers JS **//
//***************//
function checkLoad() {
	if (stillLoading>0 && timeout<200) {
		timeout++;
		setTimeout(function(){waitLoad();}, 500);
		var percent = Math.round((stillLoading/max)*99);
		$('#countdown').html(100-percent+"%");
	} else {
		$('#tileLoading').css('visibility','hidden');
		$('#countdown').css('visibility','hidden');
		$('#rightTl .playpause').css('visibility','visible');
		$('#countdown').empty();
	}
}

function checkImgs () {
	var allImgs = map.getPane(1).getElementsByTagName("img");
	count = 0;
	for (var i=0,len=allImgs.length;i<len;i++) {
		if (allImgs[i].isPending) {count++;}
	}
	return count;
}

function waitLoad () {
	stillLoading = checkImgs();
	if (max<stillLoading) {max=stillLoading;}
	checkLoad();
}

function loadingAni () {
	$('#tileLoading').css('visibility','visible');
	$('#countdown').css('visibility','visible');
	$('#rightTl .playpause').css('visibility','hidden');
	max=0;timeout=0;
	setTimeout(function(){waitLoad();}, 500);
}

function waitLoadPoints () {
	if (pointsLoading === false && pointsDataLoading === false){
		$('#tileLoading').css('visibility','hidden');
		$('#rightTl .playpause').css('visibility','visible');
	}
	else { setTimeout(function(){waitLoadPoints();}, 500);}
}

function loadingPoints () {	
	$('#tileLoading').css('visibility','visible');
	setTimeout(function(){waitLoadPoints();}, 500);
}

function buildTimeline() {
	$('#tlContainer').empty();
	var item = '';
	var tlLength = 338;
	var sumPeriods = 0;
	fcPosn = -99;
	var obTLWidth = 11;
	var thisLayer = allLayers.sets[currentLayer];
	var lenLyrs = thisLayer.data.length;
	for (var i=0;i<lenLyrs;i++) {
		if (fcPosn == -99 && thisLayer.data[i].lrpfc == "F") {
			fcPosn=i;
			break;
		}
	}
	var tlDiv = $('#tlContainer').empty();
	if (fcPosn == -99 || fcPosn === 0) {
		for (var j=0; j < lenLyrs; j++) {
			sumPeriods += parseInt(thisLayer.data[j].period, 10);
		}
		var uP = tlLength/sumPeriods;
		for (var k=0; k < lenLyrs; k++) {
			item = '<li id="tlPos'+k+'" dt="' + thisLayer.data[k].begin + '" class="timeSlot'+((fcPosn==-99)?' tlobs':'')+'"><a style="width:'+ (-1+(uP*thisLayer.data[k].period))+'px" href="javascript:updateInfo();">&nbsp;</a></li>';
			tlDiv.append(item);
		}
		animIndx = 0;
	} else {
		for (var m=0; m < lenLyrs; m++) {
			sumPeriods += parseInt(thisLayer.data[m].period, 10);
		}
		var uP2 = (tlLength - (fcPosn * obTLWidth)) / sumPeriods;
		for (var n=0; n < lenLyrs; n++) {
			item = '<li id="tlPos'+n+'" dt="' + thisLayer.data[n].begin + '" class="timeSlot'+(n<fcPosn?' tlobs':'')+'"><a style="width:'+ (n<fcPosn?obTLWidth:(uP2*thisLayer.data[n].period))+'px" href="javascript:updateInfo();">&nbsp;</a></li>';
			tlDiv.append(item);
		}
		animIndx = fcPosn-1;
	}
	layerTime = thisLayer.data[animIndx].begin;
	if (fcPosn==-99){fcPosn = lenLyrs;animIndx = fcPosn-1;}
	$('#tlPos' + animIndx).addClass('current');
    $('#tlContainer .timeSlot').click(function () {
		$('#tlContainer .timeSlot').removeClass('current');
		var clicked = (this.id);
		$('#' + clicked).addClass('current');
		map.removeOverlay(thisLayer.data[animIndx].url);
		animIndx = clicked.substring(5);
		map.addOverlay(thisLayer.data[animIndx].url);
		updateInfo();
		loadingAni();
		layerTime = thisLayer.data[animIndx].begin;
    });  
    $('#tlContainer .timeSlot').mouseover(function () {
		updateTimelineTooltip(this.id);
    });
    $('#tlContainer .timeSlot').mouseout(function () {
		clearTimelineTooltip();
    });
	$('#tlContainer .tlobs').css('border-bottom-color','#fff'); 
}

function addOverlay(id) {
	$('#map .slider').css('visibility','hidden');
	$('#rightTl').show();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
 	currentLayer = id;
	if (! $("#mapLayersTop").hasClass("selClosed")) {
		$('#s'+currentLayer).css('visibility','visible');
	}
	mm.clearMarkers();
	map.clearOverlays();
	favMM.refresh();
	buildTimeline();
	updateInfo();
	var lyr = allLayers.sets[currentLayer];
	map.getMapTypes()[0].getMaximumResolution = function () {return lyr.zoom;};
	map.setCenter(map.getCenter());
	map.addOverlay(lyr.data[animIndx].url);
	loadingAni();
}

/*
 * Opacity GControl by Klokan Petr Pridal (based on XSlider of Mike Williams)
 */
function OpacityControl( overlay,x,y,cssId,cssClass ) {
	this.overlay = overlay;
	this.x=x;this.y=y;this.cssId=cssId;this.cssClass=cssClass;
}
OpacityControl.prototype = new GControl();

// This function positions the slider to match the specified opacity
OpacityControl.prototype.setSlider = function (pos) {
	var left = Math.round((50*pos));
	this.slide.left = left;
	this.knob.style.left = left+"px";
	this.knob.style.top = "0px"; // correction001
};

// This function reads the slider and sets the overlay opacity level
OpacityControl.prototype.setOpacity = function () {
	map.clearOverlays();
	var layer = allLayers.sets[currentLayer];
	for (var k=0, len=layer.data.length; k < len; k++) {
		layer.data[k].url.getTileLayer().opacity = this.slide.left / 50;
	}
	map.addOverlay(layer.data[animIndx].url);
	favMM.refresh();
};

OpacityControl.prototype.getOpacity = function () {
	var layer = allLayers.sets[currentLayer];
	return layer.data[0].url.getTileLayer().opacity;
};

// This gets called by the API when addControl(new OpacityControl())
OpacityControl.prototype.initialize = function (map) {
	var that=this;
	this.map = map;
	this.width = 55;

	// create the background graphic as a <div> containing an image
	var container = document.createElement("div");
	container.setAttribute("id",this.cssId);
	container.setAttribute("class",this.cssClass);
	container.setAttribute("className",this.cssClass);
	container.onmouseover = function () {
		this.setAttribute("title", "Click or drag to change opacity of this layer (" + that.overlay.getTileLayer().opacity * 100 + "%)");
	};
	container.style.width= this.width + "px";
	container.style.height="15px";
	container.style.visibility="hidden";
	container.innerHTML = '<div style="height:4px;width:55px;background-color:#cf3;margin-top:7px;overflow:hidden;" ></div>';
	
	this.knob = document.createElement("div"); 
	this.knob.onmouseover = function () {
		this.setAttribute("title", "Click or drag to change opacity of this layer (" + that.overlay.getTileLayer().opacity * 100 + "%)");
	};
    this.knob.style.height="15px";
    this.knob.style.width="4px";
    this.knob.style.backgroundColor="#000";
    this.knob.style.overflow="hidden";
    this.knob.style.border="1px solid #fff";
	container.appendChild(this.knob);	
	
	this.slide=new GDraggableObject(this.knob, {container:container});
	this.slide.setDraggableCursor('pointer');
	this.slide.setDraggingCursor('pointer');
	this.container = container;

	// attach the control to the map
	map.getContainer().appendChild(container);

	// init slider
	this.setSlider( this.overlay.getTileLayer().opacity );

	// Listen for the slider being moved and set the opacity
	GEvent.addListener(this.slide, "dragend", function () {
		that.setOpacity();
	});
	GEvent.addListener(this.slide, "drag", function () {
		that.setOpacity();
	});
	GEvent.addListener(this.slide, "click", function () {
		return false;
	});
	
	// allows the slider to be clicked, rather than slid. 
	$(this.container).click(function(e){
		var posx = e.pageX - this.offsetLeft - 5;
		var factor = posx / that.width;
		if (factor<0) {factor=0;}
		if (factor>1) {factor=1;}
		that.setSlider(factor);
		that.setOpacity();
	});
	return container;
};

// Set the default position for the control
OpacityControl.prototype.getDefaultPosition = function () {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(this.x,this.y));
};

function parseLayerXML(xml) {
	var itemsDiv = $('#items').empty();
	if (feedStatus.tiles) {
		allLayers = { sets : [] };
		var yheight=88;
		map.clearOverlays();
		var layers = xml.getElementsByTagName("layer");
		for (var i=0,lLen=layers.length; i < lLen; i++) {
			var lName = layers[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
			var lZoom = layers[i].getElementsByTagName("zoom")[0].childNodes[0].nodeValue;
			var lKey = layers[i].getElementsByTagName("key")[0].childNodes[0].nodeValue;
			var lOpacity = layers[i].getElementsByTagName("opacity")[0].childNodes[0].nodeValue;
			var overlays = layers[i].getElementsByTagName("overlay");
			var oLinks = [];
			for (var j=0,oLen=overlays.length; j < oLen; j++) {
				var oType = overlays[j].getElementsByTagName("type")[0].childNodes[0].nodeValue;
				var oBegin = overlays[j].getElementsByTagName("begin")[0].childNodes[0].nodeValue;
				var oEnd = overlays[j].getElementsByTagName("end")[0].childNodes[0].nodeValue;
				var oLink = overlays[j].getElementsByTagName("link")[0].childNodes[0].nodeValue;
				var first, second, pngDat;
				if (msie) {
					if (lName=="Cloud") {
						if (oType=="O") {
							first = oLink.split('jpeg')[0];
							second = oLink.split('jpeg')[1];
							oModLink = first+'gif'+second;
							pngDat = false;
						} else {
							first = oLink.split('png')[0];
							second = oLink.split('png')[1];
							oModLink = first+'png'+second;
							pngDat = true;
						}
					} else if (lName=="Pressure") {
						first = oLink.split('png')[0];
						second = oLink.split('png')[1];
						oModLink = first+'png'+second;
						pngDat = true;		
					} else {
						first = oLink.split('png')[0];
						second = oLink.split('png')[1];
						oModLink = first+'gif'+second;
						pngDat = false;
					}
				} else {
					oModLink = oLink;
					pngDat = true;
				}
				var oTileLayer = new GTileLayer(null, null, null, {tileUrlTemplate: oModLink, isPng:pngDat, opacity:lOpacity});
				oTileLayer.opacity = lOpacity;
				oTileLayer.png = pngDat;
				oTileLayer.isPng = function () {return this.png;};
				oTileLayer.getOpacity = function () {return this.opacity;};
				var oTileLayerO = new GTileLayerOverlay(oTileLayer);
				oLinks.push({begin:oBegin, lrpfc:oType, period:1+timediff(toDateObj(oEnd),toDateObj(oBegin)), url:oTileLayerO});
			}
			allLayers.sets.push({name:lName, zoom:lZoom, data:oLinks});
			sliders[i] = new OpacityControl(oTileLayerO,10,yheight,"s"+i,"slider");
			map.addControl(sliders[i]);
			yheight = yheight + 25;
			var layersHTML = '<div class="item"><input class="radiob layerb" type="radio" name="layerRb" id="l'+i+'" value="'+lName+'" onClick="changeLayer(\'layer\', '+i+');" /><label for="l'+i+'">'+lName+'</label></div>';
			if (lKey=="Y") {
				layersHTML=layersHTML + '<div class="layerKey" id="layerKey'+i+'">' + keyLayout[lName] + '</div>';
			}
			itemsDiv.append(layersHTML);
		}
	}
	pointsHTML = '<div class="item pointsdata"><input class="radiob" type="radio" name="layerRb" id="pWeather" value="Weather" onClick="changeLayer(\'point\', \'Weather\');" /><label for="pWeather"><span>Weather</span></label></div>' +
				'<div class="item pointsdata"><input class="radiob" type="radio" name="layerRb" id="pWind" value="Wind"        onClick="changeLayer(\'point\', params.windStyle);" /><label for="pWind"><span>Wind</span></label></div>' + 
				'<div class="layerKey" id="layerKeyWind">' + keyLayout["Wind"] + '</div>' +
				'<div class="layerKey" id="layerKeyWindArrows">' + keyLayout["WindArrows"] + '</div>' +
				'<div class="layerKey" id="layerKeyWindPoints">' + keyLayout["WindPoints"] + '</div>' +
				'<div class="item pointsdata"><input class="radiob" type="radio" name="layerRb" id="pTemperature" value="Temperature" onClick="changeLayer(\'point\', \'Temperature\');" /><label for="pTemperature"><span>Temperature</span></label></div>';
	itemsDiv.append(pointsHTML);
	fcHTML = '<div class="item"><input class="radiob" type="radio" name="layerRb" id="pUV" value="UV" onClick="changeLayer(\'point\', \'UV\');" /><label for="pUV"><span>UV</span></label></div>' +
		'<div class="layerKey" id="layerKeyUV">' + keyLayout["UV"] + '</div>' +
		'<div class="item"><input class="radiob" type="radio" name="layerRb" id="pLeisure" value="Leisure" onClick="changeLayer(\'point\', \'Leisure\');regBool = true;" /><label for="pLeisure">Leisure areas</label></div>' + 
		'<div class="layerKey" id="layerKeyLeisure">' + keyLayout["Leisure"] + '</div>' +
		'<div class="item"><input class="radiob" type="radio" name="layerRb" id="pRegions" value="Regions" onClick="changeLayer(\'point\', \'Regions\');regBool = true;" /><label for="pRegions">Warnings/Forecast</label></div>' + 
		'<div class="layerKey" id="layerKey-2">' + keyLayout["Regions"] +'</div>'+
		'<div id="databyDiv" alt="Download data for the currently selected layer" title="Download data for the currently selected layer" class="item databy">Download data</div>' ; 

		itemsDiv.append(fcHTML);

	// set up the temporary opacity change buttons
	$(".opacitySetter").live("mousedown", function () {
		tempOpacityChange();
		$(this).addClass('active');
	});
	$(".opacitySetter").live("mouseup", function() {
		tempOpacityRevert();
		$(this).removeClass('active');
	});

	// round the bottom item of the menu
	$('#items div.item:last').addClass('cornerB07').css('border-bottom','none');

	//In the hover handler, we only change the state if it doesn't have the "unavailable" class.  This is set when the timesteps feed fails.
	$('#items .item').hover(
		function () {
			if (! $(this).hasClass("unavailable")) {
				$(this).css('background-color','#444');
			}
		},
		function () {
			if (! $(this).hasClass("unavailable")) {
				$(this).css('background-color','#000');
			}
		}
	);
	$(".opacitySetter").live("mouseover", 
		function() {
			$(this).addClass('hover');
		}
	)
	$(".opacitySetter").live("mouseout", 
		function() {
			tempOpacityRevert();
			$(this).removeClass('hover');
			$(this).removeClass('active');
		}
	);
	$('.databy').click(function(){getMOData();});
}

function tempOpacityChange() {
	var control = $("input[name='layerRb']:checked").attr("id").substr(1);
	tempSliderValue = sliders[control].getOpacity();
	sliders[control].setSlider(1);
	sliders[control].setOpacity();
}

function tempOpacityRevert() {
	var control = $("input[name='layerRb']:checked").attr("id").substr(1);
	if (tempSliderValue != null) {
		sliders[control].setSlider(tempSliderValue);
		sliders[control].setOpacity();
		tempSliderValue = null;
	}
}

function loadLayerXML() {
	var request = GXmlHttp.create();
	var currentTime = new Date();
	request.open("GET", layerXML, true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					if (! isValidXML(request.responseXML)) {
						throw "Parse error in tile data feed";
					}
				} else {
					throw "Tile data feed not available";
				}
				feedStatus.tiles = true;
				parseLayerXML(request.responseXML);
			}
			catch(err) {
				feedStatus.tiles = false;
				showErrorBox("tiles", tileWarningMessage);
				parseLayerXML("");
			}
		}
	};
	request.send(null);
}
//****************//
//** End Layers **//
//****************//


//**************//
//** Warnings **//
//**************//

function parseRegXML(doc, reg) {
	var tags = ["day1to2","day3to5","day6to15"];
	var text = [];
	var regChoice;
	var scriptString = "";

	for (var j=0,len=tags.length;j<len; j++) {
		var tText = [];
		var pText = [];
		var script = doc.getElementsByTagName(tags[j])[0];
		titles = script.getElementsByTagName('Title');
		paras = script.getElementsByTagName('para');
		for (var i=0, len2=titles.length; i<len2; i++) {tText.push("<h2>"+titles[i].childNodes[0].nodeValue+"</h2>");}
		for (var i=0, len3=paras.length; i<len3; i++) {pText.push("<p>"+paras[i].childNodes[0].nodeValue+"</p>");}
		text.push({section: tags[j], tits : tText, pits : pText});
	}
	for (var i=0,len4=text.length; i<len4; i++) {
		scriptString += "<div id='" + text[i].section + "'>";
		for (j=0; j < text[i].tits.length; j++) {scriptString += text[i].tits[j] +  text[i].pits[j];}
		scriptString += "</div>";
	}
	regChoice = doc.getElementsByTagName('REGION')[0].getAttribute('longName');
	$("#mainFCText").append('<div class="body">'+scriptString+'</div>');
	$('#textLink').attr('href','../weathertext/index.html?'+reg);
}

function createForecastPanel() {
	$("#content-inner").append(fcPanel);
	$("#textFCBox .textFCBoxPanel").hide();
	$('#content-inner .popupSel').addClass('popup').removeClass('popupSel');
	$('#textFCBox').fadeIn().removeClass('popup').addClass('popupSel');
	var fcDragOPtions = dragOptions;
	fcDragOPtions.handle = '.forecastBar';
	$("#textFCBox").draggable(fcDragOPtions);
	$("#fcTabs li a").hover(function () {$(this).parent().addClass("hovered");}, function () {$(this).parent().removeClass("hovered");});
	$('#fcTabs li').click(function () {
		$("#fcTabs li").removeClass("selected");
		$(this).addClass("selected");
		$("#textFCBox .textFCBoxPanel").hide();
		return false;
	});
	$('#fcTabForecast').click(function () {
		$("#mainFCText").show();
		return false;
	});
	$('#fcTabWarnings').click(function () {
		$("#mainWarningText").show();
		return false;
	});
	$('#fcTabNationalPark').click(function () {
		$("#nationalParkText").show();
		return false;
	});
	$('#fcTabMountain').click(function () {
		$("#mountainText").show();
		return false;
	}); 
	$('#textFCBox .crossImage').click(function () {
		closeFCBox();
		return false;
	});
}
	
function displayRegionForecast(reg) {
	if (typeof(reg) == "object" && reg.constructor == (new Array).constructor) {
		for (var i in reg) {
			loadSingleRegionScript(reg[i]);
		}
	} else {
		loadSingleRegionScript(reg);
	}
}

function loadSingleRegionScript(reg) {
	var request = GXmlHttp.create();
	var regFile = inventCache+"Item/RegionalForecast/Area/"+reg+"/Latest";
	request.open("GET", regFile, true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					var regDoc = request.responseXML; 
					if (! isValidXML(regDoc)) {
						throw "Parse error in regional script feed";
					}
					parseRegXML(regDoc, reg);
				} else {
					throw "Regional script feed not available";
				}
			}
			catch(err) {
				showErrorBox("regionalscript", fcErrorMessage);
				$("#mainFCText").append("<h2>Forecast not available</h2>");
				$("#mainFCText").append(fcErrorMessage);
			}
		}
	};
	request.send(null);
}

function getNationalParkData(reg) {
	var request = GXmlHttp.create();
	request.open("GET", nationalParkXML + reg + "/Latest", true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					var nationalParkDoc = request.responseXML; 
					if (! isValidXML(nationalParkDoc)) {
						throw "National park forecast feed not valid";
					}
					parseNationalParkXML(nationalParkDoc, reg);
				} else {
					throw "National park forecast feed not available";
				}
			}
			catch(err) {
				showErrorBox("nationalPark", nationalParkErrorMessage);
				$("#nationalParkText").append("<h2>Forecast not available</h2>");
				$('#nationalParkText').append(fcErrorMessage);
			}
		}
	};
	request.send(null);
}

function parseNationalParkXML(nationalParkDoc, reg) {
	var parks, park, plen, sections, section, slen, paras, para, rlen, title, content = "";
	parks = nationalParkDoc.getElementsByTagName("PWSScript");
	for (var p = 0; plen = parks.length, p < plen; p++) {
		park = parks[p];
		content = content + "<div class='title'><h2>" + park.getAttribute("regionName") + " forecast</h2></div><div class='body'><p>Issued at " + simpleDTG(park.getAttribute("IssueTime")) + "</p>";
		sections = park.getElementsByTagName("Section");
		for (var s = 0; slen = sections.length, s < slen; s++) {
			section = sections[s];
			title = section.getElementsByTagName("Title");
			content = content + "<h3>" + title[0].childNodes[0].nodeValue + "</h3>";
			paras = section.getElementsByTagName("para");
			for (var r = 0; rlen = paras.length, r < rlen; r++) {
				para = paras[r];
				content = content + ("<p>" + para.childNodes[0].nodeValue + "</p>");
			}
		}
		content = content + "</div>";
	}
	$("#nationalParkText").append(content);
	$('#textLink').attr('href','../weathertext/index.html?'+reg);
}

function processMountains(reg) {
	for (var i in mountainRegions[reg]) {
		getMountainData(mountainRegions[reg][i]);
	}
	$('#textLink').attr('href','../weathertext/index.html?'+reg);	
}

function getMountainData(name) {
	var request = GXmlHttp.create();
		request.open("GET", mountainXML + name + "/Latest", true);
		request.onreadystatechange = function () {
			if (request.readyState == 4) {
				try {
					if (request.status == 200) {
						var mountainDoc = request.responseXML; 
						if (! isValidXML(mountainDoc)) {
							throw "Mountain forecast feed not valid";
						}
						parseMountainXML(mountainDoc);
					} else {
						throw "Mountain forecast feed not available";
					}
				}
				catch(err) {
					showErrorBox("mountain", mountainErrorMessage);
					$('#mountainText').html(fcErrorMessage);
				}
			}
		};
		request.send(null);
}

function parseMountainXML(mountainDoc) {
	var report, overview, content = "", element, risk, comment, firstTime = true;
	report = mountainDoc.getElementsByTagName("report")[0];
	locationName = report.getElementsByTagName("location")[0].childNodes[0].nodeValue;
	hazards = report.getElementsByTagName("Hazard");
	overview = report.getElementsByTagName("Overview");
	
	content = content + "<div class='title'><h2>" + locationName + " forecast</h2></div>" + 
		"<div class='body'><p>Issued at " + simpleDTG(report.getAttribute("creation-time")) + "</p>" +
		"<h3>Overview</h3><p>" + overview[0].childNodes[0].nodeValue + "</p>";
	
	content = content + "<h3>Hazards</h3><table cellspacing=\"0\" cellpadding=\"0\"><thead><tr>";
	hlen = hazards.length;
	for (var h = 0; h < hlen; h++) {
		hazard = hazards[h];
		element = hazard.getElementsByTagName("Element");
		content = content + "<th>" + element[0].childNodes[0].nodeValue + "</th>";
	}
	content = content + "</tr></thead><tbody><tr>";
	for (var h = 0; h < hlen; h++) {
		hazard = hazards[h];
		risk = hazard.getElementsByTagName("Risk");
		riskText = risk[0].childNodes[0].nodeValue;
		riskClass = riskText.split(' ').join('').toLowerCase();
		content = content + "<td class=\"" + riskClass + "\">" + riskText + "</td>";
	}
	content = content + "</tr></tbody></table>";
	for (var h = 0; h < hlen; h++) {
		hazard = hazards[h];
		comment = hazard.getElementsByTagName("Comments");
		if (comment[0].childNodes.length > 0) {
			if (firstTime) {
				firstTime = false;
				content = content + "<h4>Notes</h4>";
			}
			content = content + "<p>" + comment[0].childNodes[0].nodeValue + "</p>";
		} 
	}
	var shortName = locationName.replace(/ /g,'').toLowerCase();
	$('#textLink').attr('href','../weathertext/index.html?'+shortName);
	content = content + "A <a href=\"../weathertext/index.html?" + shortName + "\">comprehensive forecast for " + locationName + " <img src=\"lib/images/nav_right_green_bb.gif\"></a> is available.";
	$("#mountainText").append(content);
}

function calcWarnLevel(r,e) {
	var col;
	if (e == 0) {if (r<40) {col=0;} else if (r>39&&r<60) {col=1;} else if (r>59) {col=3;}}
	if (e == 1) {if (r<20) {col=0;} else if (r>19&&r<40) {col=1;} else if (r>39&&r<60) {col=2;} else if (r>59) {col=4;}}

	return col;
}

function getUAsForDate(time){
	//variables
	var warnTime = new Date(time);
	var warnArray = [];
	var warnAreas = [];
	var warnTest = warningsDoc.getElementsByTagName('warning');
	//compare selected date to warnings valid from/to in order to get warnings for just that date.
	for (var w=0, len3 = warnTest.length; w < len3; w++){
		var validF = toDateObj((warnTest[w].getAttribute('valid_from')).substring(0,10));
		var validT = toDateObj((warnTest[w].getAttribute('valid_to').substring(0,10))+"T23:59");
		if (warnTime >= validF && warnTime <= validT){
			warnArray.push(warnTest[w]);}
	}
	if (warnArray){
		for (var n=0, lenn = warnArray.length; n<lenn; n++){
			var warnTemp = [];
			warnTemp = warnArray[n].getElementsByTagName('ua');
			for (var m=0, lenm = warnTemp.length; m<lenm; m++){
				warnAreas.push(warnTemp[m]);
			}
		}
	}
	return warnAreas;
}

function headerWarn(xml) {
	var maxWarn = 0;
	var hdWarnImg = "";
	
	//possibly make this next section generic
	var tlDate;
	var wTimes = [];
	var areas = [];
	var tags = warningsDoc.getElementsByTagName("warnings")[0];
	var warnsTime = (tags.getAttribute('creation').substring(0,10));
	tlDate = warnsTime;
	
	//get 5 dates
	tlDate = toDateObj(tlDate);
	wTimes = [];
	var temp = new Date(tlDate);
	for (var i=1;i<6;i++){
		wTimes.push(new Date(temp));
		temp.setDate(tlDate.getDate()+i);
	}
	for (var t=0, len1=wTimes.length; t < len1; t++){
		areas = getUAsForDate(wTimes[t]);
		var dayMax = 0;
		for (var a=0, len2=areas.length; a < len2; a++) {
			risk = areas[a].getAttribute('risk'); 
			risk = risk.substring(0, risk.length - 1);
			extreme = areas[a].getAttribute('extreme');
			warnLevel = calcWarnLevel(risk,extreme);
			if (warnLevel > dayMax) {dayMax = warnLevel;}
			
		}
		if (dayMax > maxWarn) {maxWarn = dayMax;}
		wLevels.push(dayMax);
	}/*
	switch (maxWarn) {
		case 0:	hdWarnImg = "/public/pws/invent/lib/images/spacer.gif"; break; //Green
		case 1:	hdWarnImg = "/public/pws/invent/lib/images/hdwarn/yellowadvisory.gif"; break;
		case 2:	hdWarnImg = "/public/pws/invent/lib/images/hdwarn/orangeadvisory.gif"; break;
		case 3:	hdWarnImg = "/public/pws/invent/lib/images/hdwarn/orangewarning.gif"; break;
		case 4:	hdWarnImg = "/public/pws/invent/lib/images/hdwarn/redwarning.gif"; break;
		default: alert("error");
	}
	$('#headerWarn').attr('src',hdWarnImg);*/
}

function getRegMaxWarns(time) {
	var parentReg;
	var warnAreas = [];
	warnAreas = getUAsForDate(time);
	for (var j=0, len2 = warnAreas.length; j < len2; j++) {
		var n = warnAreas[j].getAttribute('name');
	    var r = warnAreas[j].getAttribute('risk'); r = r.substring(0,r.length - 1);
	    var e = warnAreas[j].getAttribute('extreme');						
		var c = parseFloat(r) + (1000 * parseFloat(e));
		parentReg = warnAreas[j].parentNode.getAttribute('name').toLowerCase();
		if (regMaxWarns[parentReg] < c) {regMaxWarns[parentReg] = c;}
		var UALev = calcWarnLevel(r,e);
		if (points[n]){
			switch(UALev){
				case 0: break;
				case 1: if (points[n].warnCol == "#cf3"){points[n].warnCol = "#FFFF66";} break;
				case 2: if (points[n].warnCol == "#cf3" || points[n].warnCol == "#FFFF66"){points[n].warnCol = "#FF9933";} break;
				case 3: if (points[n].warnCol == "#cf3" || points[n].warnCol == "#FFFF66"){points[n].warnCol = "#FF9933";} break;
				case 4: if (points[n].warnCol == "#cf3" || points[n].warnCol == "#FFFF66" || points[n].warnCol == "#FF9933"){points[n].warnCol = "#CC0033";} break;
			}
		}
	}
	for (var k=0, lenk = regMaxWarns.length; k< lenk; k++) {
		regMaxWarns[k]=calcWarnLevel(regMaxWarns[k] % 1000, (regMaxWarns[k] - regMaxWarns[k] % 1000) / 1000);
	}
}

function simpleDTG(dt) {
	var dateObj = toDateObj(dt);
	var ntime = dt.slice(11,13) + dt.slice(14,16);
	return ntime+' '+day_name[dateObj.getDay()]+" "+dateObj.getDate()+" "+month_name[dateObj.getMonth()];
}

function displayRegionWarnings(reg) {
	if (typeof(reg) == "object" && reg.constructor == (new Array).constructor) {
		for (var i in reg) {
			displaySingleRegionWarnings(reg[i]);
		}
	} else {
		displaySingleRegionWarnings(reg);
	}
}

function displaySingleRegionWarnings(reg) {
	if (feedStatus.warnings) {
		var regions = warningsDoc.getElementsByTagName("region");
		var found = 0;
		var content = "";
		for (var i=0, len=regions.length; i < len; i++) {
			if (reg.toUpperCase() == regions[i].getAttribute('name') || reg == 'uk') {
				found++;
				var warnTypeArray = regions[i].parentNode.getElementsByTagName('element');
				var warnType = warnTypeArray[0].childNodes[0].nodeValue;
				for (var k = 1, len3 = warnTypeArray.length; k < len3; k++){
					warnType += " & "+(warnTypeArray[k].childNodes[0].nodeValue).toString();
				}
				var warnCat = regions[i].parentNode.getAttribute('type');
				var warnStart = regions[i].parentNode.getAttribute('valid_from');
				var warnEnd = regions[i].parentNode.getAttribute('valid_to');
				var warnIssue = regions[i].parentNode.getAttribute('issue_time');
				if (regions[i].parentNode.getElementsByTagName('warning_text')[0].hasChildNodes()) {
					var warnText="";
					var tempwarnText = regions[i].parentNode.getElementsByTagName('warning_text')[0].childNodes;
					for (var j=0,lenWarnText = tempwarnText.length;j<lenWarnText;j++){
						if (tempwarnText[j].nodeValue != null){
							warnText = warnText + tempwarnText[j].nodeValue;
						}
						else{warnText = warnText + "<br/>"}
					}
				} else {
					warnText="No detail";
				}
				var warnAreas = [];
				var maxRiskExt = 0;
				var regionRisk;
				var regionExt;
				warnAreas = regions[i].getElementsByTagName('ua');
				content += '<table class="warning" cellspacing="0" cellpadding="0"><tr><td class="warningType"><h2>';
				content += warnCat + ' : '+warnType + '</h2></td><td colspan="2" class="warningValidity" nowrap="nowrap">' + simpleDTG(warnStart) + ' to ' + simpleDTG(warnEnd) + '</td>';
				content += '</tr><tr><td colspan="2" class="warningText"><p>' + warnText + '</p>';
				content += '<p class="issued">Issued at: ' + simpleDTG(warnIssue) +'</p></td><td class="warningSuppInfo" nowrap="nowrap"><h2>Areas affected:</h2><ul>';
				for (var j=0,len2=warnAreas.length; j < len2; j++) {
					var r = warnAreas[j].getAttribute('risk'); r = r.substring(0, r.length - 1);
					var e = warnAreas[j].getAttribute('extreme');
					if ((r + (1000 * e)) > maxRiskExt) {
						maxRiskExt = (parseFloat(r) + (1000 * parseFloat(e)));
						regionRisk = r;
						regionExt = e;
					}
					r = (r<100)?(r.toString() + "%"):'';

					content += '<li>'+warnAreas[j].getAttribute('name')+' '+r+'</li>';
				}
				//maxRisk is risk +(100*extreme) and can be used to colour cat/type box!!!!!
				content += '</ul></td></tr><tr class="filler"><td></td><td></td><td></td></tr></table>';
			}
		}
	}
	var regChoice = regNames[reg];
	if (! feedStatus.warnings) {
		content = "<p>" + warningsErrorMessage + "</p>";
	} else if (found === 0) {
		content = "<p>"+noWarningsMessage+regChoice+".</p>";
	}
	$("#mainWarningText").append(content);
	var jqtext = $('#textFCBox .forecastBar .title').html();
	if (jqtext==null) {
		$('#textFCBox .forecastBar .crossImage').after('<div class="title"><h2>'+regChoice+'</h2></div>');
	} else {
		$('#textFCBox .forecastBar .title h2').append(', '+regChoice);
	}
}

function getImage(type,val) {
	var icon;
	if (type == "loc") {
		icon = "lib/images/pointLocation.png";
	} else if (type == "star") {
		icon = "lib/images/starPoint.png";
	}
	return icon;
}

function createMarker(point, name, siteId) {
	var marker = (new MarkerLight(point));
	marker.name = name.toUpperCase();
	marker.ttTxt = marker.name;
	marker.id = siteId;
	GEvent.addListener(marker, "click", function () {
		var answer = confirm("View text and tabulated view of weather for "+marker.name);
		if (answer){
			window.location="/public/pws/invent/weathertext/index.html?"+(marker.id);
		}
		else{}
	});
	GEvent.addListener(marker,"mouseover", function () {
		$('#tTText').html(this.ttTxt);
		showTooltip('regTT2'); return true;
	});        
	GEvent.addListener(marker,"mouseout", function () {
		hideTooltip('regTT2'); return true;
	});
	return marker;
}

function addMarkers(xml) {
	mm.clearMarkers();
	markers = xml.getElementsByTagName("m");
  	for (var i=0, len = markers.length; i < len; i++) {
		var m = markers[i];
		var point = new GLatLng(parseFloat(m.getAttribute("lat")), parseFloat(m.getAttribute("lng")));
		var name = m.getAttribute("lb");
		var id = m.getAttribute("id");
		var val = m.getAttribute("val");
		var zoommin = m.getAttribute("min");
		var zoommax = m.getAttribute("max");
		var type = m.getAttribute("type");
		var marker = createMarker(point, name, id);
		mm.addMarker(marker, zoommin, zoommax);
		markerArray[id] = marker;
		markerArray[id].zoommin = zoommin;
		markerArray[id].zoommax = zoommax;
		// as well the markers, we create a duplicate set that we use to show gust data as well as wind data.  
		var dupPoint = new GLatLng(parseFloat(m.getAttribute("lat")), parseFloat(m.getAttribute("lng")));
		var dupMarker = createMarker(dupPoint, name, id);
		mm.addMarker(dupMarker, zoommin, zoommax);
		dupMarkerArray[id] = dupMarker;
		dupMarkerArray[id].zoommin = zoommin;
		dupMarkerArray[id].zoommax = zoommax;
	}
	mm.refresh();
}

function reAddMarkers(){
	for (var m in markerArray){
		mm.addMarker(markerArray[m], markerArray[m].zoommin, markerArray[m].zoommax);
		markerArray[m].image_ = "";
		markerArray[m].height_ = 0;
		markerArray[m].width_ = 0;
		markerArray[m].mClass_ = '';
		markerArray[m].text_= '';
		markerArray[m].color_ = '';
		markerArray[m].ttTxt = null;
		mm.addMarker(dupMarkerArray[m], dupMarkerArray[m].zoommin, dupMarkerArray[m].zoommax);
		dupMarkerArray[m].tClass_ = '';
		dupMarkerArray[m].text_ = '';
		dupMarkerArray[m].ttTxt = null;
		dupMarkerArray[m].height_ = 0;
		dupMarkerArray[m].width_ = 0;
	}
	mm.refresh();
}

function polygonClick(layerType, p){
	var isNationalPark = (layerType == "leisure" && mountainsNationalParks[p.name].type == "nationalPark");
	var isRegion = (layerType == "regions");
	var isMountain = (layerType == "leisure" && mountainsNationalParks[p.name].type == "mountain");

	var hasNationalPark = (nationalParkRegions.indexOf(p.reg) > -1 && !isMountain);
	var hasMountain = (mountainRegions[p.reg] != undefined && !isNationalPark);

	// Create a container for the forecasts, etc. 
	closeFCBox();
	createForecastPanel();

	// add appropriate forecasts, warnings, plus mountains and/or national parks.
	displayRegionWarnings(p.reg);

	$('#fcTabForecast').hide();
	if (isNationalPark || hasNationalPark) {
		$("#fcTabNationalPark").show();
		getNationalParkData(p.reg);
	} else {
		$("#fcTabNationalPark").hide();
	}

	if (isMountain || hasMountain) {
		$("#fcTabMountain").show();
		if (isMountain) { 
			getMountainData(p.name);
		} else {
			processMountains(p.reg);
		}
	} else {
		$("#fcTabMountain").hide();
	}
	// finally, click the appropriate tab on the interface
	if (isRegion) {
		displayRegionForecast(p.reg);
		$('#fcTabForecast').show();
		if (p.color != "#cf3" && p.color != "#ccc") {
			$('#fcTabWarnings').click();
		} else {
			$('#fcTabForecast').click();
		}
	} else if (isNationalPark) {
		$('#fcTabNationalPark').click();
	} else if (isMountain) {
		$('#fcTabMountain').click();
	}
}

function getRegData() {
	plotPolygons(points, "regions");
}

function getLeisureData() {
	plotPolygons(mountainsNationalParks, "leisure");
	colourLeisureData();
}

function colourLeisureData() {
	var request = GXmlHttp.create();
	request.open("GET", mountainRiskXML, true);
	request.onreadystatechange = function() {
        if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					var riskData = GXml.parse(request.responseText);
					if (isValidXML(riskData)) {
						colourPolygons(riskData);
					} else {
						throw "Parse error in mountain area risk colouration feed";
					}
				} else {
					throw "Mountain area risk colouration data not available";
				}
			}
			catch(err) {
				showErrorBox("mountainrisk", mountainRiskErrorMessage);
			}
		}
	};
	request.send(null);
}

function colourPolygons(riskData) {
	var forecasts = riskData.getElementsByTagName("MountainForecast");
	var forecast, risk, area, flen, colour;
	for (var f = 0; flen = forecasts.length, f < flen; f++) {
		forecast = forecasts[f];
		area = forecast.getElementsByTagName("Area")[0].childNodes[0].nodeValue;
		risk = forecast.getElementsByTagName("Risk")[0].childNodes[0].nodeValue;
		switch (risk) {
			case "High" : colour = "#CC0033"; polygonData[area].warnText = "Weather hazards: High risk"; break;
			case "Medium" : colour = "#FF9933"; polygonData[area].warnText = "Weather hazards: Medium risk"; break;
			case "Low" : colour = "#FFFF66"; polygonData[area].warnText = "Weather hazards: Low risk"; break;
			case "No Risk" : colour = "#FFFFFF"; polygonData[area].warnText = "Weather hazards: No risk"; break;
			default: colour = "#000000"; polygonData[area].warnText = ""; break;
		}
		polygonData[area].setFillStyle({color: colour});
	}
}

function plotPolygons(sourceData, layerType) {
	polygonData = []; 
	map.clearOverlays();
	mm.clearMarkers();
	for (var i in sourceData){
		polygonData[i] = new GPolygon.fromEncoded({
				polylines: [{
				points: sourceData[i].points,
				levels: sourceData[i].levels,
				color: "#555",
				opacity: 0.3,
				weight: 1,
				numLevels: 4,
				zoomFactor: 16
			}],
			fill: true,
			outline: true,
			color: sourceData[i].warnCol,
			opacity: 0.7
		});
		var id = i;
		polygonData[i].reg = sourceData[i].reg;
		polygonData[i].name = i;
		polygonData[i].warnText = "";
		if (layerType == "regions"){
			switch(polygonData[i].color){
				case "#cf3" : polygonData[i].warnText = "No severe weather for this area"; break;
				case "#FFFF66" : polygonData[i].warnText = "Warning status: Be aware"; break;
				case "#FF9933" : polygonData[i].warnText = "Warning status: Be prepared"; break;
				case "#CC0033" : polygonData[i].warnText = "Warning status: Take action"; break;
				default: polygonData[i].warnText = "";
			}
		}
		GEvent.addListener(polygonData[i], "click", function() {
			polygonClick(layerType, this);
			return false;
		});	       
		GEvent.addListener(polygonData[i],"mousemove", function() {
			if (mtt == false&&optBool == false) {
			
				$('#tTText').html(this.name + ((layerType=="regions")?"<BR>"+regNames[this.reg]:"") +((this.warnText)?"<br><label style='color:"+this.color+"'>"+this.warnText:"")+ "</label><br>Click to view more information");
				showTooltip('regTT2'); return true;
			}
		});    
		GEvent.addListener(polygonData[i],"mouseout", function() {
			if (mtt == false&&optBool == false){
			hideTooltip('regTT2'); return true;}
		});
		map.addOverlay(polygonData[i]);
	}
}

function getWarnings() {
	var request = GXmlHttp.create();
	var currentTime = new Date();
	request.open("GET",
	warnFile
	//"lib/xml/warnings.xml"
	, true);
	request.onreadystatechange = function() {
        if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					warningsDoc = GXml.parse(request.responseText);
					if (isValidXML(warningsDoc)) {
						headerWarn(warningsDoc);
					} else {
						throw "Parse error in XML warnings feed";
					}
					feedStatus.warnings = true;
				} else {
					throw "Weather warnings feed not available";
				}
			}
			catch(err) {
				feedStatus.warnings = false;
				showErrorBox("warnings", warningsErrorMessage);
			}
		}
	};
	request.send(null);
}

//******************//
//** End Warnings **//
//******************//


//***************//
//** Points JS **//
//***************//
function getData() {
	GDownloadUrl("/public/pws/invent/lib/xml/data.xml", function (data, responseCode) {
		dataXML = GXml.parse(data);
		addMarkers(dataXML);
	});
}

function newCenterZoom(lat, lng) {
	var zoom = map.getZoom() + 2;
	point = new GLatLng(lat, lng);
	if (zoom < 10) {
		map.setCenter(point, zoom);
		hideTooltip('regTT2');
	} else {
		map.setCenter(point);
	}
}


function checkPostcode(address) {
	if (!(isNaN(address.charAt(2)))||!(isNaN(address.charAt(1)))) {
		return address.replace(/ /g,'');
	} else {
		return address;
	}
}

function gotoView(x) {
	// jumps to a user's chosen view

	var lat = myViewArray[x].lat;
	var lon = myViewArray[x].lon;
	var zoom = myViewArray[x].zoom;
	var layerType = myViewArray[x].layerType;
	var layer = myViewArray[x].layer;

	changeLayer(layerType, layer);
	map.setCenter(new GLatLng(lat, lon), eval(zoom));
}

function showTags() {
	var out = '';
	for (var x in myLocArray) {
		lat = myLocArray[x].getPoint().lat();
		lng = myLocArray[x].getPoint().lng();
		displayName = cnvrt2title(x);
		if (displayName.length > 15) {
			displayName = displayName.substring(0, 12) + "...";
		}

		out += '<div class="listStyle favsList" onClick="javascript:newCenterZoom(' + lat + "," + lng + ')"><img class="starIcon" src="lib/images/starBlack.png">';
		out += '<input name="sReportingTagList[]" type="hidden" value="' + x +'"> ';		
		out += '<span class="favText">' + displayName + "</span>";
		out += '<a href="javascript:removeTag(\'' + x +'\')"'; 
		out += 'onClick="if(confirm(\'Are you sure you want to delete this item?\')) return true; else return false;">';
		out += '<img class="deleteIcon" src="/public/pws/invent/lib/images/cross.gif"></a></div> ';
	}

	document.getElementById('reportingTagsID').innerHTML = out;
	$('#tools .listStyle').hover(function () {$(this).css('background-color','#444');},function () {$(this).css('background-color','#000');});
}

function showViews() {
	// lists the user's favourite views. 

	var out = '';
	for (var x in myViewArray) {
		displayName = cnvrt2title(myViewArray[x].name);
		if (displayName.length > 17) {
			displayName = displayName.substring(0, 14) + "...";
		}

		out += '<div class="listStyle" onClick="javascript:gotoView(' + x + ');"><img class="starIcon" src="lib/images/camera.png">';
		out += '<input name="sReportingTagList[]" type="hidden" value="' + x +'"> ';		
		out += '<span class="favText">' + displayName + "</span>";
		out += '<a href="javascript:removeView(' + x +')"'; 
		out += 'onClick="if(confirm(\'Are you sure you want to delete this view?\')) return true; else return false;">';
		out += '<img class="deleteIcon" src="/public/pws/invent/lib/images/cross.gif"></a></div> ';
	}

	document.getElementById('reportingViewsID').innerHTML = out;
	$('#tools .listStyle').hover(function () {$(this).css('background-color','#444');},function () {$(this).css('background-color','#000');});
}


function createCookie(name,value,days) {
	if (days) {
		var date=new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		var expires="; expires=" + date.toGMTString();
	} else {
		expires="";
	}
	document.cookie = name + "=" + value + expires + "; path=/";
}

function favCookie() {
	var cookieString = "";
	for (var l in myLocArray) {
		cookieString += "$" + l + "|" + myLocArray[l].getPoint().lat() + "|" + myLocArray[l].getPoint().lng();
	}
	createCookie("favC", cookieString, 365);
}

function viewCookie() {
	// creates a cookie containing the user's favourite views. 
	
	var cookieString = "";
	for (var l in myViewArray) {
		cookieString += "$" + 
			myViewArray[l].name + "|" + 
			myViewArray[l].lat + "|" + 
			myViewArray[l].lon + "|" + 
			myViewArray[l].zoom + "|" + 
			myViewArray[l].layerType + "|" + 
			myViewArray[l].layer;
	}
	createCookie("viewC", cookieString, 365);
}

function favMarker(locName, tempPoint) {
	map.setCenter(tempPoint, 8);
	var marker = (new MarkerLight(tempPoint, {image: getImage("star")}));
	marker.height_ = 18; marker.width_ = 18;
	marker.tooltip = '<div class="tooltip cornerTB07" style="background-color:#000;color:#FFF;"><nobr>'+locName+'<br/><\/nobr><\/div>';
	setTooltip(marker, locName);
	myLocArray[locName] = marker;
	if (hideBool === false){
		favMM.addMarker(marker, 5);
		favMM.refresh();
	}
	favCount++;
	favCookie();
}

function viewMarker(locName) {
	// creates a view and stores into the view array, and the user's views cookie. 
	
	var marker = {};
	var state = getPageState();
	marker.lat = state.lat;
	marker.lon = state.lon;
	marker.zoom = state.zoom;
	marker.layerType = state.layerType;
	marker.layer = state.layer;
	marker.name = locName;

	myViewArray.push(marker);
	viewCount++;
	viewCookie();
}

function restrictLocation(myfield, e) {
	var restriction = /[A-Z,0-9,a-z,\s,\-,\&,\',\.,\!,\,]/mg;
	if (!e) var e = window.event
	if (e.keyCode) code = e.keyCode;
	else if (e.which) code = e.which;
	var character = String.fromCharCode(code);

	if (e.ctrlKey || code == 8 || code == 35 || code == 36 || (!e.shiftKey && (code == 37 || code == 39) )) {
		return true;
	} else {
		if (character.match(restriction)) {
			return true;
		} else {
			return false;
		}
	}
}

function showAddress(address, locName) {
	var re = /^[A-Z,a-z]+[\s,A-Z,a-z,0-9,\,,\.,\',\!,\&,\-]+$/;
	if (locName == "Name your location") {locName = address;};
	for (var x in myLocArray) {
		if (locName.toLowerCase() == x.toLowerCase()) {
			alert("You already have a location with this name. Please choose a different one.");
			return;
		}
	}
	if (! address.match(re)) {
		alert("That address or place is not valid.  Please use letters, numbers and .,'!& characters only.");
		return;
	}
	geocoder.getLocations(checkPostcode(address) + ", uk", function(response) {
		processAddresses(response, locName);
	});
}

function processAddresses(response, locName) {
	if (! response || response.Status.code != 200) {
		alert("That address could not be found.  Please try a different search.");
		return;
	}
	var alen = response.Placemark.length;
	if (alen == 10) {
		alert("Too many matches were found.  Please enter more of the address or place.");
		return;
	}
	var a;
	var addressesFound = false;
	var thisPlace, thisCountry;
	var results = [];
	var result;
	for (a = 0; a < alen; a++) {
		thisPlace = response.Placemark[a];
		if (thisPlace.AddressDetails.Country) {
			thisCountry = thisPlace.AddressDetails.Country;
			if (thisCountry.CountryNameCode == "GB") {
				addressesFound = true;
				result = {};
				result.address = thisPlace.address;
				result.lat = thisPlace.Point.coordinates[1];
				result.lon = thisPlace.Point.coordinates[0];
				results.push(result);
			}
		}
	}
	if (!addressesFound) {
		alert("That address could not be found in the UK.");
		return;
	}
	$("#content-inner").append('<div id="geoLookupResultsCover">&nbsp;</div>');
	$("#content-inner").append("" + 
		'<div id="geoLookupResults" class="cornerTB07"><img class="crossImage" src="/public/pws/invent/lib/images/cross.png" alt="Close" />' + 
		'<h1>Search results</h1><p>Select your location from the following choices:</p><div id="geoLookupResultsListContainer"><ol id="geoLookupResultsList"></ol></div><div id="buttonContainer"></div>' +
		'</div>'
	);
	$("#geoLookupResults .crossImage,#geoLookupResultsCover").click(function () {
		$("#geoLookupResults").fadeOut().remove();
		$("#geoLookupResultsCover").fadeOut().remove();
		return false;
	});
	alen = results.length;
	for (a = 0; a < alen; a++) {
		$("#geoLookupResultsList").append("<li><a href=\"javascript:pickAddress('" + locName + "', " + results[a].lat + ", " + results[a].lon + ")\">" + results[a].address + "</a></li>")
	}
}

function pickAddress(locName, lat, lon) {
	var point = new GLatLng(lat, lon);
	favMarker(locName, point);
	showTags();
	$("#geoLookupResults .crossImage").click();
	$('#addFav').fadeOut(600, function (){
		$('#favs').fadeIn(600);
	});
	$("#newFavouriteAddress").attr("value","Enter postcode/place");
	$("#newFavouriteName").attr("value","Name your location");
}

function showView(locName) {
	// checks to see that a view can be added. 

	var ok = true;
	var len;
	
	locName = escape(locName).toLowerCase();
	if (locName == "enter%20name%20for%20this%20view") {locName = "Your view";};
	for (var x in myViewArray) {
		if (locName == myViewArray[x].name.toLowerCase()) {
			alert("You already have a view with this name. Please choose a different one");
			ok = false;
		}
	}
	if (ok === true) {
		viewMarker(locName);
		showViews();
		$('#addView').fadeOut(600, function (){
			$('#views').fadeIn(600);
		});
		$("#newViewName").attr("value","Enter name for this view");
	}
}

function removeTag(tag) {
	favMM.removeMarker(myLocArray[tag]);
	delete myLocArray[tag];

	favCount--;
	favCookie();
	showTags();
	if (favCount == 0) {
		$('#favs').fadeOut(600, function (){
			$('#addFav').fadeIn(600);
		});
	}
}

function removeView(view) {
	// removes a view from the view array, and from the user's views cookie.

	delete myViewArray[view];

	viewCount--;
	viewCookie();
	showViews();
	if (viewCount == 0) {
		$('#views').fadeOut(600, function (){
			$('#addView').fadeIn(600);
		});
	}
}

function addFav() {
	if (favCount < maxFaves) {	
		$('#favs').fadeOut(600, function () {
			$('#addFav').fadeIn(600);
		});
	} else {
		alert("Sorry. You cannot have more than " + maxFaves + " locations at one time. Delete unwanted locations by clicking the cross next to their names");
	}
}

function addView() {
	// checks that there is room for a view.  
	
	if (viewCount < maxFaves) {	
		$('#views').fadeOut(600, function () {
			$('#addView').fadeIn(600);
		});
	} else {
		alert("Sorry. You cannot have more than " + maxFaves + " views at one time. Delete unwanted views by clicking the cross next to their names");
	}
}

function backFav() {
	// goes back from the locations form to the list.
	$('#addFav').fadeOut(600, function (){
		$('#favs').fadeIn(600);
	});
}

function backView() {
	// goes back from the views form to the list.

	$('#addView').fadeOut(600, function (){
		$('#views').fadeIn(600);
	});
}

function changeToPoints() {
	if (mm.getMarkerCount(5) === 0) {
		map.clearOverlays();
		reAddMarkers();
	}
	loadingPoints();
	$('#rightTl .playpause').css('visibility','hidden');
	pointsLoading = true;
	$('#map .slider').css('visibility','hidden');
	$('#tlContainer').empty();
	$('#rightTl').show();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	currentLayer = -1;
	map.getMapTypes()[0].getMaximumResolution = function () {return 9;};
	map.setCenter(map.getCenter());
	favMM.refresh();
}

function getLeisureTL() {
	getBasicTL();
	$('#prodTitle').html("Click on the map areas to get mountain and national park forecasts."); 
}

function getBasicTL() {
	$('#map .slider').css('visibility','hidden');
	$('#tlContainer').empty();
	$('#rightTl').hide();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	$('#time').replaceWith("<span id='time'></span>");
	$('#date').replaceWith("<span id='date'></span>");
	$('#frameNav').css('color','#fff');
	currentLayer = -2;
	map.getMapTypes()[0].getMaximumResolution = function () {return 9;};
	map.setCenter(map.getCenter());
	favMM.refresh();
}

function getTimeSteps() {
	try {
		$('#tlContainer').empty();
		$("#date").empty();
		$("#time").empty();
		$("#prodTitle").empty();
		var timeList = kmlDoc.getElementsByTagName("TimeSteps")[0].childNodes[0].nodeValue;
		fcPosn = -99;
		times = timeList.split(",");

		//build timeline
		var ct = kmlDoc.getElementsByTagName("time")[0].getAttribute("creation");
		var newCt = toDateObj(ct);
		var tlLength = 340;
		var tsLength = (tlLength / times.length) - 1;
			$('#tlContainer').empty();
		var y = 0;
		for (var i=0, len = times.length;i<len;i++){
		if (timediff(newCt, toDateObj(times[y])) > 0 && times[y] !== "") {
			y++;
		}else{break;}
		}
		fcPosn = y; 
		animIndx = fcPosn -1;
		for (var i=0; i < times.length; i++) {
			var item = '<li id="tlPos'+i+'" dt="' + times[i]+ '" class="timeSlot'+((fcPosn>i)?' tlobs':'')+'"><a style="width:'+ tsLength +'px" href="javascript:void(0);">&nbsp;</a></li>';
			$('#tlContainer').append(item);
		//remove play button
		//load frame 0
		}
		loadUKMarkers(times[y-1],y-1);
		$('#tlPos'+(y-1)).addClass('current');
		$('#tlContainer .timeSlot').click(function () {
			$('#rightTl .playpause').css('visibility','hidden');
			loadingPoints();
			animIndx = (this.id).substring(5);
			clickPointTS();
			return false;
		});  
		$('#tlContainer .timeSlot').mouseover(function () {
			updateTimelineTooltip(this.id);
		});
		$('#tlContainer .timeSlot').mouseout(function () {
			clearTimelineTooltip();
		});
	} catch (err){
		alert("An error occurred when trying to create the time line. This may be because some of the data is currently unavailable");
		pointsUnavailable();
	}
}

function loadTimeStepsXML() {
	var request = GXmlHttp.create();
	var currentTime = new Date();
	request.open("GET", timestepsXML, true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					kmlDoc = request.responseXML;
					if (! isValidXML(kmlDoc)) {
						throw "Parse error in timesteps feed";
					}
					feedStatus.timesteps = true;
				} else {
					throw "Timesteps feed not available";
				}
			}
			catch(err) {
				feedStatus.timesteps = false;
				showErrorBox("timesteps", timestepsErrorMessage);
				if (feedStatus.timesteps === false) {
					pointsUnavailable();
				}
			}					
		}
	};
	request.send(null);
}

function pointsUnavailable(){
	$('#items .pointsdata').addClass("unavailable");
	$('#items .pointsdata').each(function (i) {
		$(this).andSelf().attr("title", $(this).find(":radio").attr("value") + " information is not available");
	});
	$('#items .pointsdata').click(function () {return false;}).mouseover(function () {return false;});
	$("#items .pointsdata").find(":radio").attr("disabled","disabled");
}

function setUVMarkers(indx){
	var sites = uvData.getElementsByTagName("UV");
	var uvValues;
	var uvTTText = 0;
		for (var m in markerArray) {
			markerArray[m].UV = null;
			dupMarkerArray[m].tClass_ = '';
			dupMarkerArray[m].text_ = "";
			dupMarkerArray[m].ttTxt = null;
		}
		for (var i=0; i < sites.length; i++) {
			id = sites[i].getAttribute("id");
			if (markerArray[id]) {
				uvValues = sites[i].getElementsByTagName("values")[0].childNodes[0].nodeValue;
				uvArray = uvValues.split(" ");
				markerArray[id].UV = uvArray[indx];
			}
		}
		for (var m in markerArray){
		if (markerArray[m].UV == null || markerArray[m].UV == "missing") {
				markerArray[m].image_ = "";
				markerArray[m].height_ = 0;
				markerArray[m].width_ = 0;
				markerArray[m].mClass_ = '';
				markerArray[m].text_= '';
				markerArray[m].color_ = '';
				markerArray[m].ttTxt = '';
			}
			else {
				markerArray[m].image_ = "http://www.metoffice.gov.uk/lib/images/symbols/triangle_"+markerArray[m].UV+".gif";
				markerArray[m].height_ = 40;
				markerArray[m].width_ = 40;
				markerArray[m].tClass_ = '';
				markerArray[m].mClass_ = '';
				markerArray[m].text_ = '';
				markerArray[m].color_ = '';
				if (markerArray[m].UV >= 11){uvTTText = 11}else{uvTTText = markerArray[m].UV}
				markerArray[m].ttTxt = markerArray[m].name+"<br>" + "UV index " + markerArray[m].UV + "<br><label style='color:" + UVDesc[uvTTText][0]+"'>"+UVDesc[uvTTText][1]+"</label>";
			}
		}
		mm.refresh();	
		
}

function getWarningsForDate(id){
	for (var p in points) {
		points[p].warnCol = "#cf3";
	}
	var dateTime = document.getElementById(id).getAttribute("dt");
	getRegMaxWarns(dateTime);
	getRegData();
}

function build5DayTL(){
	//local variables 
	var tlDate;
	var temp;
	var tlLength = 340;
	var tsLength;
	var tlCol = "#cf3";
	
	// empty timeline
	$('#tlContainer').empty();
	
	//get initial date	
	if (selectedType == "UV"){ //get UV initial date
		tlDate = (uvData.getElementsByTagName("uvData")[0].getAttribute("date"));
	}
	else if (selectedType == "Regions"){ //get warnings creation time						
		var tags = warningsDoc.getElementsByTagName("warnings")[0];
		var warnsTime = (tags.getAttribute('creation').substring(0,10));
		tlDate = warnsTime;
	}
	//get 5 dates 
	tlDate = toDateObj(tlDate); //convert to a date object
	times = []; //clear times array
	var temp = new Date(tlDate);
	for (var i=0;i<5;i++){
		times.push(new Date(temp)); //add date to times array
		temp.setDate(temp.getDate()+1);
	}
	tsLength = (tlLength / times.length) - 1;
	//create timeline
	
	//create timesteps
	for (var i=0; i < times.length; i++) {
		if (selectedType == "Regions"){tlCol = wColors[wLevels[i]]} else {tlCol = "#cf3"} //get border bottom colour
		var item = '<li id="tlPos'+i+'" dt="' + times[i]+ '" class="timeSlot" style="border-color: #000 #000 '+tlCol+'"><a style="width:'+ tsLength +'px" href="javascript:void(0);">&nbsp;</a></li>';
		$('#tlContainer').append(item);
	}
	
	//update timeline details
	$('#layerKey'+currentLayer).slideUp(300);
	$('#items .layerKey').hide();
	$('#frameNav').css('color','#cf3');
	$("#date").html(times[0].toDateString());
	$("#time").empty();
	$('#tlPos'+(0)).addClass(selectedType+'current');
	$('#map .slider').css('visibility','hidden');
	$('#rightTl').hide();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	if (selectedType == "Regions"){
		$('#prodTitle').html("Forecast Warnings");
		getWarningsForDate("tlPos0");
		$('#tlPos'+(0)).css("background-color", wColors[wLevels[0]]);
		currentLayer = -2;
	} else {
		currentLayer = -1;
		$('#prodTitle').html("Forecast UV");
		$('#tlPos0').css("background-color", "#cf3");
		$("#layerKeyUV").slideDown(300);
	}
	$('#layerKey'+currentLayer).slideDown(300);
	map.getMapTypes()[0].getMaximumResolution = function () {return 9;};
	map.setCenter(map.getCenter());
	
	
	//add timestep click handling
	$('#tlContainer .timeSlot').click(function () {
		//$('.playpause').css('visibility','hidden');
		//loadingPoints();
		animIndx = (this.id).substring(5);
		$('[id^="tlPos"]').removeClass(selectedType+'current');
		$('[id^="tlPos"]').css('background-color', '#909090');
		$('#tlPos'+animIndx).addClass(selectedType+'current');
		
		if (selectedType == "UV"){
			setUVMarkers(animIndx);
			$('#tlPos'+animIndx).css("background-color", "#cf3");
		}
		if (selectedType == "Regions"){
			getWarningsForDate(this.id);
			$('#tlPos'+animIndx).css("background-color", wColors[wLevels[animIndx]]);
		}
		return false;
    });  
	//add timestep mouseover handling
    $('#tlContainer .timeSlot').mouseover(function () {
		update5DayTLTooltip(this.id);
    });
	//add timestep mouseout handling
    $('#tlContainer .timeSlot').mouseout(function () {
		clear5DayTLTooltip();
    });
}

function loadUVXML() {
	var request = GXmlHttp.create();
	request.open("GET", UVXML, true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					if (! isValidXML(request.responseXML)) {
						throw "Parse error in UV data feed";
					}
					feedStatus.uv = true;
				} else {
					throw "UV data feed not available";
				}
				//feedStatus.tiles = true;
				uvData = request.responseXML;
				build5DayTL();
				setUVMarkers(0)
			}
			catch(err) {
				feedStatus.uv = false;
				showErrorBox("uv", uvWarningMessage);
				if (feedStatus.uv === false) {
					$('#pUV').parent().addClass("unavailable");
					$('#pUV').parent().attr("title", "UV information is not available");
					$('#pUV').attr("disabled","disabled");
					$('#pUV').click(function () {return false;}).mouseover(function () {return false;});
				}
				noData(uvWarningMessage);
			}
		}
	};
	request.send(null);
}

function readCookie(name) {
	var nameEQ=name+"=";var ca=document.cookie.split(';');
	for (var i=0; i < ca.length; i++) {
		var c=ca[i];
		while (c.charAt(0)==' ') {
			c=c.substring(1, c.length);
		}
		if (c.indexOf(nameEQ) === 0) {
			return c.substring(nameEQ.length, c.length);
		}
	}
	return null;
}

function getFavs() {
	var favs = readCookie("favC");
	if (favs) {
		favArray = favs.substring(1).split('$');
		var name, lat, lng, point, x;
		for (var x in favArray) {
			name = favArray[x].split('|')[0];
			lat = favArray[x].split('|')[1];
			lng = favArray[x].split('|')[2];
			point = new GLatLng(lat, lng);
			//favMarker(name, point);
			var marker = (new MarkerLight(point, {image: "lib/images/starPoint.png", height:18, width:18}));
			setTooltip(marker, name);
			myLocArray[name] = marker;
		}
		$('#addFav').hide();
		$('#nameFav').hide();
		$('#favs').show();
		showTags();
	}
}

function getViews() {
	// breaks down a cookie into an array of views. 

	var views = readCookie("viewC");
	var marker;
	if (views) {
		var viewArray = views.substring(1).split('$');
		var name, lat, lon, zoom, layerType, layer;
		for (var x in viewArray) {
			marker = {};
			marker.name = viewArray[x].split('|')[0];
			marker.lat = viewArray[x].split('|')[1];
			marker.lon = viewArray[x].split('|')[2];
			marker.zoom = viewArray[x].split('|')[3];
			marker.layerType = viewArray[x].split('|')[4];
			marker.layer = viewArray[x].split('|')[5];
			myViewArray.push(marker);
			viewCount++;
		}
		$('#addView').hide();
		$('#views').show();
		showViews();
	}
}

function addExFavs() {
	for (var x in myLocArray) {
		favMM.addMarker(myLocArray[x], 0);
		favCount++;
	}
	favMM.refresh();
	favCookie();
}

//****************//
//** End Points **//
//****************//

//****************//
//** Initialize **//
//****************//
function reloadLayer () {
	var state = getPageState();
	changeLayer(state.layerType, state.layer);
}

function setupToolsMenu() {
	$('#tools .tool:last').addClass('cornerB07').css('border-bottom','none');

	$("#toolsHide").toggle(function () {
		fullScreen("on");
		$("#toolsHide span").html("Show map normal size");
	}, function () {
		fullScreen("off");
		$("#toolsHide span").html("Show map full size");
	});
	
	//Change background colour of tools menu items to grey on hover
	$('#tools .tool').hover(
		function () {
				$(this).css('background-color','#444');
		},
		function () {
				$(this).css('background-color','#000');
		}
	);
}

function refreshData () {
	map.clearOverlays();
	setupTimeInfo();
	loadLayerXML();
	getWarnings();
	addExFavs();
	loadTimeStepsXML();
}

function loadedYet () {
	if (checkLoaded > 20) {}
	if (feedStatus.time && feedStatus.tiles && feedStatus.timesteps && feedStatus.warnings && feedStatus.gmap) {
		clearInterval(checkLoaded);
		tilesloaded("initial");
	}
}

function initialize() {
	feedStatus.gmap = false;
	checkLoaded = setInterval(loadedYet,500);
	//rememberMe = readCookie("rememberMe");
	//if (rememberMe == "true") {
		// if the user wants to be remembered, we get the page params from the user's preference cookie. 
		getStateParamsFromCookie();
	//}
	getPersistentParamsFromCookie();
	getPageParams();	// in any case though, we overwrite with any URL parameters.  
	getLabels();		// load multi-language stuff
	initHTMLElements();
		
	if (GBrowserIsCompatible()) {
		$("#loadingBox").draggable(dragOptions);
		map = new GMap2(document.getElementById("map"));
		GEvent.addListener(map, 'tilesloaded', function () {
			feedStatus.gmap = true;
		});
		//loadingScreenListener = GEvent.addListener(map, 'tilesloaded', function () {tilesloaded("initial");});
		GEvent.addListener(map,'move',function () {checkBounds();});
		GEvent.addListener(map,'moveend',function () {
			loadingAni();
//			updateLastViewCookie(); // updates the last view cookie when the map changes (zoom, layers, position, but not vector layers?!)
		});
		map.setCenter(new GLatLng(params.lat, params.lon), eval(params.zoom));	// updates the map center / zoom according to cookie or page params.  
		map.addMapType(G_PHYSICAL_MAP);map.removeMapType(G_HYBRID_MAP);map.removeMapType(G_SATELLITE_MAP);map.removeMapType(G_NORMAL_MAP); 
		map.getMapTypes()[0].getMinimumResolution = function () {return 5;};
		map.addControl(new GLargeMapControl3D());
		map.enableScrollWheelZoom();
		keybdH = new GKeyboardHandler(map);
		map.addControl(new controlBox("wxTextIcon","G_ANCHOR_TOP_RIGHT",466,16));
		map.addControl(new controlBox("helpIcon","G_ANCHOR_TOP_RIGHT",420,14));
		map.addControl(new controlBox("mapLayers","G_ANCHOR_TOP_RIGHT",5,60));
		map.addControl(new controlBox("animation","G_ANCHOR_TOP_RIGHT",5,5));
		map.addControl(new controlBox("poweredBy","G_ANCHOR_BOTTOM_LEFT",72,2));
		map.addControl(new controlBox("regTT", "G_ANCHOR_TOP_LEFT",0,0)); 
		geocoder = new GClientGeocoder();
		mm = new MarkerManager(map, {trackMarkers:true});
		favMM = new MarkerManager(map, {trackMarkers:true});
		getData();
		getFavs();
		refreshData();
		//getViews();
		jQEvents();
		setupToolsMenu();
	}
	loadingScreenFallback = setTimeout(function(){tilesloaded('fallback');}, 20000);
	$('#loadingBoxCross').click(function () {$("#loadingBox").fadeOut();return false;});
	$("#helpIcon").click(function () {loadHelp();return false;});
	$("#wxTextIcon").click(function () {window.location = '../weathertext/index.html?uk';});

	// Add the ability to select text in locations boxes, as removed by GMap.  
	$("input[name='address']").parents().css("-moz-user-select", "");

	if (!msie) {
		document.getElementById("newFavouriteAddress").onkeypress = function(e) {
			return restrictLocation(this, e);
		};
		document.getElementById("newFavouriteName").onkeypress = function(e) {
			return restrictLocation(this, e);
		};
	}
	getMODataSession();
	setUpLoginCtrls();
}

window.onunload = function() {
	updateLastViewCookie();
	
	// if the cookie doesn't exist, we ask if they want to persist their last position.  
//	if (rememberMe == null) {
//		rememberMe = true;
		//createCookie("rememberMe", rememberMe, 365);
	//}
	GUnload();
};

function getLabels() {
	var opacitySetterHTML = '<div class="opacitySetterContainer"><div class="opacitySetter">Hold</div>Colours accurate only  at 100% opacity</div>';
	var WindSetterHTML = '<div id="windSetter2" onclick="changewindLayer(\'point\', \'Wind\');" class="windSetter">Points</div><div  id="windSetter1" onclick="changewindLayer(\'point\', \'WindArrows\');" class="windSetter">Arrows</div>';
	
	fcErrorMessage = "<em>Please note:</em> This forecast may have been issued, but it has not been possible to retrieve the forecast to show you.";
	nationalParkErrorMessage = fcErrorMessage;
	mountainErrorMessage = fcErrorMessage;
	mountainRiskErrorMessage = "<em>Please note:</em> Mountain risk data may be available in mountain area forecasts, but could not be retrieved to colour the map.";
	warningsErrorMessage = "<em>Please note:</em> Weather warnings may have been issued, but it has not been possible to retrieve any to show on this map.";
	noWarningsMessage = "No warnings or advisories are in force for ";
	timestepsErrorMessage = "<em>Please note:</em> Weather, wind and temperature data is currently not available.";
	timeWarning = "<em>Please note:</em> Times are currently being shown in UTC, instead of local time.";
	UKMarkerErrorMessage.start = "The ";
	UKMarkerErrorMessage.middle = " data for the selected date and time ";
	UKMarkerErrorMessage.end = " is not currently available.  You can try choosing another time on the timeline or a different kind of observation.";
	tileWarningMessage = "<em>Please note:</em> Some weather map layers that are normally available could not be retrieved and displayed.";
	uvWarningMessage = "<em>Please note:</em> UV data could not be retrieved at this time. Please try again later.";
	noWarningText = "Warning data is currently unavailable. Click an area to view regional weather data.";
	operaMessage = "Please Note: Google maps does not currently support Opera (your current browser) and therefore you may encounter some problems whilst using our map based applications.";

	labels = {
		menus: {
			mapLayers: "Layers",
			locations: "Locations",
			views: "Views",
			tools: {
				_title: "Tools",
				preferences: "Preferences"
			}
		},
		general: {
			language: "Language",
			cancel: "Cancel",
			ok: "OK",
			back: "Back",
			add: "Add"
		},
		units: {
			mph: "m.p.h.",
			kmh: "km/h",
			knots: "knots",
			unknown: ""
		},
		locations: {
			addressprompt: "Please enter a UK postcode/place name",
			address: "Enter postcode/place",
			name: "Name your location",
			nameprompt: "Please choose a name for your location",
			show: "Show"
		}
	};

	month_name = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	day_name = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];

	wxDesc["0"]="Clear sky (night)";
	wxDesc["8"]="Low-level cloud";
	wxDesc["16"]="Sleet shower (night)";
	wxDesc["24"]="Light snow";
	wxDesc["1"]="Sunny";
	wxDesc["9"]="Light rain shower (night)";
	wxDesc["17"]="Sleet shower (day)";
	wxDesc["25"]="Heavy snow hower (night)";
	wxDesc["2"]="Partly cloudy (night)";
	wxDesc["10"]="Light rain shower (day)";
	wxDesc["18"]="Sleet";
	wxDesc["26"]="Heavy snow shower (day)";
	wxDesc["3"]="Sunny intervals";
	wxDesc["11"]="Drizzle";
	wxDesc["19"]="Hail shower (night)";
	wxDesc["27"]="Heavy snow";
	wxDesc["4"]="Dust";
	wxDesc["12"]="Light rain";
	wxDesc["20"]="Hail shower (day)";
	wxDesc["28"]="Thundery shower (night)";
	wxDesc["5"]="Mist";
	wxDesc["13"]="Heavy rain shower (night)";
	wxDesc["21"]="Hail";
	wxDesc["29"]="Thundery shower (day)";
	wxDesc["6"]="Fog";
	wxDesc["14"]="Heavy rain shower (day)";
	wxDesc["22"]="Light snow shower (night)";
	wxDesc["30"]="Thunder storm";
	wxDesc["33"]="Haze";
	wxDesc["15"]="Heavy rain";
	wxDesc["23"]="Light snow shower (day)";
	wxDesc["31"]="Tropical storm";
	wxDesc["7"]="Medium-level cloud";	

	points["Wrexham"] = {id:1,points: "qazaI|uaPkjM``a@pyMjd`@wI~al@w~Io}Y}p@klZ{aUfmEezJgn_@|cA}bOxiWyyGfqA}eThhPbhM",levels:"PPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Portsmouth"] = {id:2,points: "m~euHnruE{k@w}I{`AzjMcs@_mQ|wKdk@auFtsL",levels:"PPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Essex"] = {id:3,points: "}z`{HoeKslAo`PqyKqjCmo[rqSwrO{_ZddDi`f@i`Cg{u@zdW}aSzVq_r@lsC_oo@~oKdcVex@{_HlaA~gAsOkaBrlBoWut@yiFe|@`hBfn@}}AaeAnBfQioCzvIzrIzhHbme@qwFeuBaAaIwDvAqt@aq@hMzcAff@yQxFhFsvE|_OdrS`dXpx@bl^zqG_}HgpGwph@rdTb`Hu_Chrc@njDca\\lhE~nPxiG}xGdO`ge@nBlbV_pDf|d@a{K|jP`hDnp\\e{MjkOs`Su`M",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Lincolnshire"] = {id:4,points: "}vzaIsoDp}C{|[hmPeaEs`DuvJxuLfuQtBrgF|`BvqG{Tl`D`yKnmQ`dCvqyAi`D}rAcuFw~Hs_Insl@kej@p`UczEveDgbGkeMqa@ks@ge@cx@seEvcBatPhjEy`IetQek@bnTosg@r}BmuKyjJ~j@ehUftI|_@agBsz]ydJqlK}tAfdOidLqye@ruH}lSbbNloCvyHokNgrPsb\\nqGwq[dtw@kod@loQraBxve@fe|@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["NE Lincolnshire"] = {id:5,points: "e{weIyQhsAqbBfrPrb\\wyHnkNcbNmoCsuH|lSm|C_dPjiRadg@",levels:"PPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Moray"] = {id:6,points: "}qm{IhyqTsZ~j[k}Nqel@ihVpbGibQ}bTg`M|zUxwCrse@m~d@z`K{kQwbqAvrJ{ghBxyItn@lyNuh^jhEh}}@|eH|fHddAsqK`oE`kL|iDyqLppR~xD`fC~xj@jfNji[zbLkjB~|Bfnf@",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"gr"}; 
	points["Bournemouth"] = {id:7,points: "cittHt~|Idc@}pCpbCjqXywAt]exHrdBfiFwcX",levels:"PPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Oxfordshire"] = {id:8,points: "iyhyHxhmDpfFdxIgaBfaPchPdax@nqFb_q@jh@bpBwvK|fPctSy[ajQbmEidZimMoyLfwChGkvZclTu|HJ}hViaLegDd}LydOz{@|gMjaT}nFchFov_@|vAwbKheTp{F|qIs_Hr[faQhkH{nBtlLiwl@fwHi}@hmBjgMndUczHf}Fwf@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Torfaen"] = {id:10,points: "}sbzH~qfQ`x@z_QyjEuh@olEf}Fg|Eyz@sbMxnDpjCquPxkZgoPvGj|E",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Gwynedd"] = {id:11,points: "kgnbI`kaZcxEaiOixNij@wk@wgDprDm@avEsm@s}I_oR{eD_nAeiDo_N`gA_eFgeCuaOxhEghLbeTpuQhuQu|G`~Jks`@mbK_te@ddDaw]jiVl|CbkFneSt}Vv_BbiD`hg@`{Ul_VnPz`B~cBtkWspLhaKerUkrVkwNrzZ{tBwgGmqLz{FcgD{iOthDxh~@v_VdeZqfHvvMtkDzb_@iif@_s_A",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Blackburn with Darwen"] = {id:12,points: "wxpfIhzmMpyFtjZwpU|kIepF_bPjgUstS",levels:"PPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["Aberdeenshire"] = {id:14,points: "sx}}Ipr|Ib{@mt@xtu@xgu@mjCdyh@dyMc`CjrHpxSzpCezt@poj@jz[`dT~ld@asD`nd@cuXxvLm_Mrdg@hpDhgd@ntLjgFwyFp__@dpIjdP_~Jv{rAslZocIouBy{KrZ_k[_}Bgnf@{bLjjBkfNki[afC_yj@qpR_yD}iDxqLaoEakLedArqK}eH}fHkhEi}}@myNth^yyIun@knEel{Cr{O}|a@trToeE",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"gr"}; 
	points["Northumberland"] = {id:16,points: "_txoIrkfH~}SseIbT|ln@bh_@rvU`_MxkQc~EbwOrjNvw{@}wKdmRjlEno]ixJ~hFwyGcvJmfGp}IkyT_nUguStvf@elQovNgtAg_F}aCqxAmq\\i{mAux^bib@cx@o{Ryd`@}_f@||_@_{d@jsPqhj@trVmnGddGnkHbrg@_kT",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Derbyshire"] = {id:17,points: "crrcIdnhFnkCxuWhmw@ezIeVdmFjn@hrA~Tpd@|``@|lu@wrEpdSovRoxVgjPvvs@{pT{gR}}WnqJovI~m`@gj^dkIawSahI}iJmhNbkBiaP~ea@cgl@jxDdgFd]_rrAlvWoP",levels:"PPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Poole"] = {id:18,points: "ezqtHx}rJxwAu]q{BfeWg`KmuBxjBojOdxHsdB",levels:"PPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Wiltshire"] = {id:19,points: "axqwHlwhIbid@_tPznL`uCkeE~a`Ax}F|p[seYxxj@e|HxvBcbWavR}_MniEczBz~KihOmuHcmJ~gBy}FwqJ{yHn~DajQ_ak@~`@sms@v~Sf}MzmJckDalBozl@kh@cpBfee@c{OvwNljFprEp`]",levels:"PPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Swindon"] = {id:0,points: "gamyHtwwH`lBnzl@{mJbkDw~Sg}MijCg}RbtSx[vvK}fP",levels:"PPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Blackpool"] = {id:22,points: "wpigIjteQjkBzeMskR_z@f_O{jK",levels:"PPPP", warnCol:"#ccc", reg:"nw"}; 
	points["Peterborough"] = {id:23,points: "sez_Inec@d`KnwSe`MbzVuq@faOulImOadCwqyA|bLerBn`Dn_a@",levels:"PPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Renfrewshire"] = {id:24,points: "eoysIbftYbpB|gAn`Jfpa@fk@r{R_pPvlP~q@kxUalPcqBTsqXl|F}wP`mHolC",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Warwickshire"] = {id:25,points: "es|}H|ooFlrOvbRhaLdgDK|hVblTt|HiGjvZ{}Gg{GckMf~ZmjJr}d@ikZqyNgaJsv@qiGwwsAmhHxtCfeCv_i@_r\\jtTebAgeZciPeqJnxPqsDb_f@qeeAfzFwcDpmD|sPfqAw}IdbKpsC",levels:"PPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["E Riding of Yorkshire"] = {id:26,points: "gcefI_w[ogEzqq@gzP~pXibOl_MthQhcSeyA|eh@d`JpbMtwFdy^c{Bngc@_jArgIamHk`f@}hE`rLyeXqqGoaIkIezJgNwjBgen@gh_@gzr@~eBydg@h`G_rYvoFvyVbxLnsAbcmA{xdA",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Southampton"] = {id:27,points: "cetuHb_bGdxBjjFcnHz{TqkD_|LnaJgjN",levels:"PPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Highland"] = {id:28,points: "c~v|Ivajc@jrEkrEruB}}r@lTirB`sB_vn@efL`nRtaBndn@arGsgKgxA~{A_[g`GjdA`iBlBceAiw@_gLg_Aa]vEkhG_uLeeQfrKpmTws@`jOgwCkcGet@taCf_Fhmg@wte@dpDf}@_ib@_aPnd\\_lJizDgXe|UwmHdrZefTdFci@cpXppRutNsyLkdCemGroM{xG_kFx_Mqh\\kaJe_Hr~CucNwmIvlDp}Ekfg@}oC`cJicEisHobV~kv@v_Akv]wjM{Iyv@ypJ}nSn}]vJochAwhEtjRU{@]p@cmLlvJm}Jm}Fd}Ew|VucFbjQy_FeqNwwFn}P_uYmeVhiKymc@weGa~GjrPoh^iqKwoRxuDesPzmIl`EksSsdtA|tHuhU{fLoxn@r~Cipw@aeNre@jnD{xcAdkWjySzcGocO`xShrJxntAxvnDgnB~oMrzCyvNjcL|`AkUhpb@pxDibEyrEshkApu`@tuf@yDrdK_eH}nDx`Mbjq@_z@eos@`tS`cQxoNvh`A~z@qao@guSiuVowFqwx@l~d@{`KywCsse@f`M{zUhbQzbTjhVqbGh}Npel@nuBx{KrlZpcI`vCrygAv|Ydfs@qcExiNt{T|~LvfBroWt`KkpP`{OrmzAuwEa|DfjDxfEukMqmBgeAxzn@i|L{q_@idAtlPwqYsrYrxaArdoBi|EpxOwxDq`EpdAp`_@_mLp{Qc~Nsup@zwDjnk@k|Ibip@a~Iqx|A_{GjhUs}G{_e@oc@haq@_rBm}Lk`C|~HadP{|LttAa`~@u}Lziw@{`Kct\\deDq|]meH|rd@sDsMcuHe`CrpNbn`@||Qz|c@|vNxkSvfLfx@h}GxkSgvDzqGwag@jz`AucAk~VglOkwd@g\\x|BseFazE~iAn{JuuEhvGysLdwPg}DwyP{nNzgR~~L|iQejPnuf@}tRutKn_O{_[iu_@rtH|tTiu_@wiCo_PmjXf_HwtKauV`uVeu\\fu\\?|iH~iJe_DajKt`HgfEfyAodBiik@coWd{i@h}Dx}BxpQvsGduLcm@{vZaKotK",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"he"}; 
	points["Halton"] = {id:29,points: "_nkdIfk|N|`@~cXsdHklKbbEkoNp_AvwA",levels:"PPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["S Lanarkshire"] = {id:30,points: "irlrI`epTt{e@mlChpVto]iy\\zr^wyBtk^opDruFasK}aLpi@|ur@gtIomHepLl~LioTeEapIqxAfUwgWtoR}|c@m~Gcba@dy@y`t@hoLkxLzvPjdX",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["W Sussex"] = {id:31,points: "mk}vHgdAzmXftEk@jmObhQvbDxs@f|Pr{HsaA`pJfnmBf}GhZugJtpXqxHqhTooAnhWwza@qzEkrKm`[muNgtoBxgDqzf@bwDrnB",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["S Yorkshire"] = {id:32,points: "ma~dIbtxEzvQpjOe]~qrAkxDegF_fa@bgl@uxOwjl@deEscv@s|GwrMybFuob@b{Bogc@blYbvLjqQtfb@",levels:"PPPPPPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Powys"] = {id:33,points: "csx`Ij{lQxgd@lqUifGg}VbjIopA~rNfvl@bfQmzu@ltLxhJf|@shK|pEjbW|cMvsHpo@gvHrlD`pLrg[_qM`fRajDjlLp|U|fCvy\\jWjwCahDf`T|pKbr\\}`Cd}@_wAprf@q~o@yb^gjPr~Roq[}pGeoGxtF}{Dq}OkmQ`dUyqKwnF|kD|_NscMt~D{y@fsOa{Um_VciDahg@u}Vw_BckFoeSsuD}_TvI_bl@x|QjfBjqNiaf@}o@|xJ",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Plymouth"] = {id:34,points: "qfnrHpyuWbmEt|M}iGakGfkDrhOqwJoGuvCcfIx_LsjK",levels:"PPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Shetland Islands"] = {id:35,points: "ygdpJdf{EfcSs`j@b|H`fIflr@huKccOx|SpmHfhQjuJypI`m@baKr{JwqDumBzeMrzYmU_yJzbVoyUjKu`GkqDorb@}kMvlJliLjoHp|R_{FrpOisGizIavCfkh@icOhnFh}Ea`_@cX_gDc{Hc`JmsJaaGkmMzN|P|ta@snLkmR~dDgkH_rOgpKq{A_pSwkSaud@}`Tghk@viCwx[hqg@rsC~oI`wSxcJj`]~kBtqQ",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"os"}; 
	points["Inverclyde"] = {id:36,points: "iiktIpvg[|LkvB`lPbqB_r@jxUm|CxlZodPkrL|yDqmc@",levels:"PPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Cheshire"] = {id:37,points: "mcscI`haLhbZfzm@`{Hs]h~Hdr\\ceF|se@gqA|eTyiWxyG}cA|bOk`JobGwpJjfSmaIteNhP~_@ovByxExq@am[vH}dd@}`@_dXq_AwwAq~Kiu_@~_K}`s@ccHyqVfj^ekIpaDxk]",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["W Yorkshire"] = {id:38,points: "imlfIh{sF`sCykCr|GvrMeeErcv@txOvjl@ckBhaPgk[dtZnIr|Qi_Gf|CuyW{yWiySusQ|yIeafA_vGoco@ttB}_HnvLnnJvaUajFnkGmwUr|In`J",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Worcestershire"] = {id:40,points: "y{g~H|anJjkZnyNljJq}d@zpJxuQp{@ksD|nAwz@rhDdzj@_cAheA?@fYruCiyFj}M~pIbQlxD|qYetIl}HgvTki@u}EbuP}bJw|HgdBvsPipGspCpvGhta@izGepDq}At{Ju_@ylG_zN{qg@gaK_qUdtBilXfyDik}@`lE`eDdaJrv@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Ceredigion"] = {id:41,points: "k}x|Hnkw[akEkqC_k^qg}A_zs@_`]qrCs{ToP{`Bzy@gsOrcMu~D}kD}_NxqKvnFjmQadU|{Dp}OdoGytFnq[|pGjkOxg}CsfDb`]",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Clackmannanshire"] = {id:42,points: "}tyuIf|bUfpFpNpqIhtTyxDvmKvs@viByhEn{La{KmaKtAatp@lcDr{H",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Reading"] = {id:43,points: "k~~xHhiwDvkAtlJkaGflEfaBgaPjrAuW",levels:"PPPPP", warnCol:"#ccc", reg:"se"}; 
	points["N Lanarkshire"] = {id:44,points: "utmsIzzyUl~Gbba@uoR||c@ktH_|CsrBpuQgaGmwSooKfyNa|BwyXfaYybd@dmAsaVrxRvcE",levels:"PPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["E Dunbartonshire"] = {id:45,points: "eqmtI`}yWfaGlwSc|Brzf@krHx}BgaFswo@noKgyN",levels:"PPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Durham"] = {id:46,points: "uyxlI|geG`fHtbFxoErtLh{B}m@uhD`um@`~NtyAjcOj~n@mRvkj@syMxo@a~\\b`b@ipS{wFsjNww{@b~EcwOa_MwkQvU_ik@``E}aPt{LgqA_zJ_p[faYoaNh`F~nM",levels:"PPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Leicestershire"] = {id:47,points: "c{o_Ih|~CtgVrliAc_f@peeAoxPpsDcz@vxA}``@}lu@kdA{wBdVemFz}NmfGieDyfm@sd^glh@hej@q`UpyFlw]bnV}Bz}Ls}Sjy@tyS",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Stockton-on-Tees"] = {id:48,points: "yailIfazGyoEstLnaCkeb@z`GwUffBnpOvlIy~HraC|dg@{mRdk@i{B|m@",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Co Derry"] = {id:49,points: "gvaoIfphk@jsAo}h@sc[oaNeOkix@rvJcsRreKnsE|fw@{{Wb}Ro}@dvIjum@{hT~lVlKrjZsgOgoI~f@nnc@_xXjxx@oyLwGohHoxY",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["Co Fermanagh"] = {id:51,points: "w{hlIzd~m@tiIww_@v|UfnQdO_kp@vzQk|b@rvTg_G|{Cn|RpsNboE}oHrq@|fJrnDct@b}k@yrO~nZ{r@zx`@u_NvwAgi`@xdz@wk[ib}A",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["Hertfordshire"] = {id:52,points: "ccp{Hqr`@pyKpjCrlAn`Pr`St`MjzNzr~A}fY`kIgbTznd@d_Bmod@ufHsye@mcGj_EsmKlEq@_uWiuRubSl|JyaFupGwzQf{ImnPlo[sqS",levels:"PPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["W Midlands"] = {id:53,points: "qh{~HpqwGpiGvwsAalEaeDgyDhk}@ohMbgDizHakKukEriNylG{oIseEyzi@t}M_|JeQaoO~q\\ktTgeCw_i@lhHytC",levels:"PPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Cumbria"] = {id:54,points: "sw}mI|obS_hCibHytFv~EjV_kh@sz@nhJguG_mMu|Jkh@a{Iyye@evNsu^fuSuvf@jyT~mUlfGq}IvyGbvJhxJ_iFklEoo]|wKemRhpSzwF`~\\c`b@ryMyo@ljB~_XfdOpdNphEkzJ~dOxaB`{AdlYtwHhynA`vHdq\\qnOdgAzr[nbVmuGjzPyzG}^ivA~xB_wKqeLpvGhjXib}@x}|@}teAmjm@qdAe_S",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["Co Tyrone"] = {id:55,points: "krwlIzinf@f|Eo}Jb`OntBxmKnwf@pw`@jfm@oqPvy^vvNnu]wzQj|b@eO~jp@w|UgnQuiIvw_@isPbpj@iuFsogA{jg@{q\\~wXkxx@_g@onc@rgOfoImKsjZzhT_mVevIkum@",levels:"PPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["Rutland"] = {id:56,points: "igm`I~v|Ah`D|rAnoUtui@{}Lr}ScnV|BqyFmw]r_Iosl@buFv~H",levels:"PPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Buckinghamshire"] = {id:57,points: "m~pyH`n_B|nGia@fHjgGol@dnTg~IdqHm`@rQeQzK~}Bvr[`n@xfJodUbzHimBkgMgwHh}@ulLhwl@ikHznBs[gaQ}qIr_HieTq{F}vAvbK{eJqgMpqEoj`@|zLysi@vvJlrHbbOk_\\e_Blod@fbT{nd@|fYakIn~J__@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Darlington"] = {id:58,points: "gxnkIhj|G{vJvwl@a~NuyAthDaum@zmRek@j}AdcD",levels:"PPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["S Ayrshire"] = {id:59,points: "mt`rIhjq[upA_yEgwEqzIdvGeub@tfOdlOpjJklGh}AnbZ~kPgp\\|zYjtCf}I`lf@tgKoyDy{Ahow@rjLpxUqa_As|d@svTsre@kcJaiD}}IdbK",levels:"PPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Dumfries + Galloway"] = {id:60,points: "amjnIxecZrk@uCvrGatHz_FduHxmJemSdbTzrCm_b@j}~Aj`LboSpe`@ipRs}DfhSerKum@wpb@|}j@urPwwAgkBqtL~qPwpEnlAk`Ms`OfdHsjLqxUx{Aiow@ugKnyDg}Ialf@tsByeI}}]_`Tt`Aufc@i~Ty~CmvE{oMklB}{DvyBuk^hy\\{r^ipVuo]ikEq~d@|jBipLthNf~MmfD_bSzlSiaa@yiAaf[~da@}`H`{Izye@t|Jhh@|vAza\\_CoIjBhIRDnt@~jJm_AdcAgr@{|@xx@npAtnAudAsuAhnK~u@jqFmVjnFyrB|qCpXh`Cdm@ji@y]baBbd@a|AiEaDj@iCqn@ae@yEg~AdfCnmE~PxcIsfL|{NxaJihBmAp@lTfhA_RyiAdgSbp@osBfjm@a@rGj@oHbfLwn@pwIri^mqAdvNobIcHcgAifB{Qid@wYra@gKbB{^enAyl@~aBtlAyRjBjGzGoJrl@tAtl@fyAlY`LlhLjbEc|AtrKwbPzjGzaB`eXewOxhUuAeK}h@zO",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"dg"}; 
	points["Aberdeen"] = {id:61,points: "oyw{IrjqKxeJvqC{pCdzt@krHqxSeyMb`CljCeyh@dlLtC",levels:"PPPPPPP", warnCol:"#ccc", reg:"gr"}; 
	points["Shropshire"] = {id:62,points: "gxv~HzouM~yN|qg@}lPlim@x~GrkRcfQlzu@_sNgvl@cjInpAhfGf}Vygd@mqU|o@}xJkqNhaf@y|QkfBqyMkd`@jjMa`a@ihPchMbeF}se@i~Her\\l`QlcQyj@_|PxwOjgF~uPxko@rwVcdk@{sWshKdp@}rJv`N}wNhkGjkPv{LgdLjcQ`pFfaK~pU",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Southend-on-Sea"] = {id:63,points: "}mnyHckuCumAx{ZeOage@z}AfjI",levels:"PPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Medway"] = {id:64,points: "mysxHyg{Bv{IvnEydAjjf@}yLimPsxF~~D}Zycr@dhKlkf@jo@msU",levels:"PPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["E Renfrewshire"] = {id:65,points: "q}nsIrw_YlQkxBhoTdEawLziv@uhC~oDo`Jgpa@n_FmvU",levels:"PPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Dundee"] = {id:66,points: "_zrwIfhoPjXdob@qt@fiFok@m~o@tgA~cE",levels:"PPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Co Armagh"] = {id:67,points: "_t`lIz`ff@jkJk{L`sDciMxaPbrUtzu@_gTlmMrx`AguZfnBkpEr}]k}UvrKqw`@kfm@ymKowf@",levels:"PPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["N Ayrshire"] = {id:68,points: "k~irIvt_[fwEpzIydL`hX}kF|lNxdEb{v@dfIpiBzdEeoMjfDbzFhxLuaGgt@r~j@cv\\`lO}nR_uShzAssOdlJujKquD{eu@gtCfcGyaKmeH_vU|sEl|CylZ~oPwlPgk@s{RthC_pDnwMjfTlWmo[pbLnmR",levels:"PPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Merthyr Tydfil"] = {id:69,points: "kpizHpobStwBdnB}yUheZu{IecA`hDg`TztWaoF",levels:"PPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Flintshire"] = {id:71,points: "opldIjzvSyuEeeF|tZ}jcAwoGdrOba@adMvpJkfSj`JnbGdzJfn_@y}n@rws@",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Wokingham"] = {id:73,points: "s}vxHxf{CleIf_Fk}@~`\\{vHftAecCtWwkAulJkrAtWqfFexIg}Fvf@an@yfJlfSajGp`FbH",levels:"PPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["E Ayrshire"] = {id:74,points: "_llqIxeoWlvEzoMh~Tx~Cu`Atfc@|}]~_TusBxeI}zYktC_lPfp\\i}AobZqjJjlGufOelOevGdub@qbLomRmWlo[owMkfT`wL{iv@dpLm~LftInmHqi@}ur@`sK|aLnpDsuFjlB|{D",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["E Sussex"] = {id:76,points: "utnuHwq}Bf}XnnjAu|Jtfy@ER}~AwiCoj@fzDatKpkPchQwbDj@kmO{mXgtEcwDsnBoPslCrzBowt@z{e@mlfBzfIttg@",levels:"PPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Slough"] = {id:77,points: "gehyHbtfBgHkgGv~CryBaMf{A}tDt_Vnl@enT",levels:"PPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Orkney Islands"] = {id:78,points: "mfsgJh{lN`yK`kx@b`Ma{UxrMzpV}jCxpLzhGgsFfcWrbSqdNf}JwkApzAj`@x{IxoKx|Q}mWdjo@maWwmL}yY_kGk`F_lj@wxRubc@{wId`_@{{Hszd@gd@cjkBjpy@hme@",levels:"PPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"os"}; 
	points["Blaenau Gwent"] = {id:80,points: "mqtzHrk}Qf|Exz@miTx~d@}fCwy\\npCapCrbMynD",levels:"PPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["W Lothian"] = {id:81,points: "ydjtI~h|Sd{SkpEbmHl`Ney@x`t@sxRwcEemAraV{{Rijm@{|@ibNlmAkrP~bLfQ",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"dg"}; 
	points["Herefordshire"] = {id:82,points: "_nm|HnirMhGt~QfeUe_IxxLr`h@slChqLzjAxvBcvDxxFo{Uljw@sg[~pMslDapLqo@fvH}cMwsH}pEkbWg|@rhKmtLyhJy~GskR|lPoim@t_@xlGp}Au{JhzGdpDqvGita@hpGrpCfdBwsP|bJv|Ht}EcuPfvTji@xz@ziG",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Fife"] = {id:83,points: "{mbvIlvpOt_Cfvy@ntXve^fbJ~ii@u{Lt`cAqqIitT{tFcy_AitHaeEooHjeVwbNq`XmhRcqtAljPb{M~_N{d{@fqKz`X",levels:"PPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Glasgow"] = {id:84,points: "e|xsItdyX`pIpxAmQjxBo_FlvUcpB}gAamHnlCymEoaAb|Bszf@rrBquQjtH~{CgUvgW",levels:"PPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["Tyne + Wear"] = {id:86,points: "cf}mIdmgGzgBwq@~yJ~o[u{LfqAa`E|aPwU~hk@ah_@uvUeT}ln@|tJsoJp}Dl_X_jDsjXjdY_{G",levels:"PPPPPPPPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Eilean Siar"] = {id:87,points: "kiccJr|rd@p}Udji@gsEoon@|uG~wCpk@~el@pvMwhChfHbyr@sdDk|l@jaKmhDrAtcL|r@aoNf~FrnD{Xhdd@d}Ai~WvbM|lP_wM~}e@rlTsoMmaBxfZl~LwfL{k@zoWbuSjaSo_BxfD~eUxxRzffBfoX|q`Ax_tAyv}Akoi@uag@coGqrPiy@ipJlp[aoGy|Is{F{c\\ixQozr@qgEt{Iy_N_cOy{W||ZyzBqmc@{~N|qZo}Ja|UwmHn~D}y@atZmeKabScwc@{gpBhfKseJz`Kl`Ih_Do_J",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"he"}; 
	points["Falkirk"] = {id:88,points: "kywtIlm|Tz{Rhjm@gaYxbd@ulF{ij@y_C|~E}gA_vAws@wiBrbRgtW`Ooo^z|@hbN",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Luton"] = {id:89,points: "spr{H|~cAgeDlo\\e}AaoVlcGk_E",levels:"PPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Midlothian"] = {id:90,points: "om~sIhf|P`iHmrPdeTdyu@{yP|jJyjCx|b@oaTsau@|wK{l]",levels:"PPPPPPP", warnCol:"#ccc", reg:"dg"}; 
	points["Merseyside"] = {id:92,points: "}uxeIrtqQnaJkbf@}bF_gU|pMe`]{h@vrRbdLbsAmfBbtI`pIxhM`bAluAmaH`l\\k~F|yEnpI}yEjpKwbJsl@||Z`qAxpEeyO|oQopIax_@_ySjuMkj\\s_\\br]rgP",levels:"PPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["Dorset"] = {id:93,points: "q`rtH|mrICItRpSeu@dvA|i@`o@uk@hb@ec@|pCgiFvcXyjBnjOf`KluB|gGreJy~Bc}I~vDzdDiLyaS~vOjG__Ght{AzjCxgDtgB}|Bq^vlBrmBrgCszIbiPm|Av}HtfJ{~S_lUriq@_jB~jd@imEuA}oEe{K_nDvoLwjJs_aA}oUc~KnlBmlg@}uR}kBreYyxj@y}F}p[bqJ}n[vjLfzF|xV_~]|jAxdHEAHJ",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Denbighshire"] = {id:95,points: "{|dbIz`wRv~In}YruD|_TkiVm|CqjRntDgFzkUsqNcnZgkOnaMqqKssCeqFyn[xuEdeFx}n@sws@zaUgmE|p@jlZ",levels:"PPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Angus"] = {id:97,points: "{v}xIj~|M~nUliP`aSpne@{|@ziSnk@l~o@ghJluVygPi}VlxAtdNwoIq|A{iM~lf@__\\|wBepIkdPvyFq__@otLkgFipDigd@l_Msdg@buXyvL`sDand@tyGxjS`l@m{Pd}B`gA}Bf@dCa@",levels:"PPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Warrington"] = {id:98,points: "y{{dIxwbNtl@szHp~Khu_@cbEjoN}q@btBirCcPcdLesAzh@wrR}xEsuNhpOooB",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["Telford + Wrekin"] = {id:99,points: "af_aIryeMj{C_zAep@|rJzsWrhKswVbdk@_vPyko@pnL{yO",levels:"PPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Hartlepool"] = {id:100,points: "efxlIpugF`uKtn@oaCjeb@afHubFi`F_oMxsFkaN",levels:"PPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Surrey"] = {id:101,points: "stlwHgcHp~Gg]nPrlCygDpzf@luNftoBeGjWw_BrK?Gw~StnPetB}iSs_Sx~D{gI_aTg~K{vQg_CwfH`Mg{ArwMmnd@l|KrlAggI{rO`fQsqVicIszOj~GiuNdiSkP",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Cambridgeshire"] = {id:102,points: "wwi}HkmqArtPfjBedDh`f@vrOz_Zi{IlnPvpGvzQm|JxaFkgJioAyac@|t}@q`Jb~DmaP{c]{yTdlMd`MczVe`KqwSm`Dm_a@_cLdrBayKomQzTm`D}`BwqGuBsgFv_j@q_FlrB}l^zyLckJt_C|zHnlWokXanApo[zvIrcBh`B{p`@vtLrjQ",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Thurrock"] = {id:103,points: "orlyH_ieBhTgvBtb@pvOt^~{A~wF~f@pbAruMmiCr`FfiApbGcqDfwLez@wuBk~KgfO~oDg|d@reCc}A",levels:"PPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Redcar + Cleveland"] = {id:104,points: "ivnlIft|ExjN__cAz{Lf{I}hAdbz@awMvmIs]}RagJgyJ",levels:"PPPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Bedfordshire"] = {id:105,points: "q{z|H`l]huRtbSp@~tWrmKmEd}A`oVfeDmo\\tfHrye@cbOj_\\wvJmrHyoN~bBkbKkaNenO`|MgkOyfJ~eCyxLiyK{pMxac@{t}@jgJfoA",levels:"PPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Hampshire"] = {id:106,points: "oxcuHta_GbiSz|p@g}CfgW}xV~}]wjLgzFcqJ|n[jeE_b`A{nLauCcid@~sPqrEq`]wwNmjFepEm`cBj}@}`\\vaCyaKr_Sy~DdtB|iSv~SunPv_BkKdGkWjrKl`[vza@pzEoy@txPbs@~lQd_@tlJtzKqyEsySvvj@exBkjFoaJfjNpkD~{LpaUud_@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["N Somerset"] = {id:107,points: "}nzxHpxaOhnDivHhnIb_MwnFd{EhmKrOh}Af{x@caPmlAo~Pkzx@beJahH",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Derby"] = {id:108,points: "e}waIxysGg^l~VivMkhLzrFauPtaG~~E",levels:"PPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Stirling"] = {id:111,points: "gmiuIrqkVx_C}~EtlFzij@`|BvyXfaFrwo@wmP`jMynC~}VomUl~Qk~VueF_oH~ge@icSazj@ggMc_r@p~LaaMoiDmm_@bfF}gE~m@peS|bX`|Ef|XaunA`{KlaKxhEo{L|gA~uA",levels:"PPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["Middlesbrough"] = {id:113,points: "soblIlbiF`wMwmIu`AnkOwlIx~HgfBopOr]|R",levels:"PPPPPP", warnCol:"#ccc", reg:"ne"}; 
	points["Suffolk"] = {id:114,points: "{jh~HkrfIjwj@j~P|fObjj@hlMzhGgzRti_@pfNovVwS|gk@{Vp_r@{dW|aSh`Cf{u@stPgjBwtLsjQi`Bzp`@{vIqcB`nAso[mlWnkXw_C{zHchEoan@lpNaiO`kDwtyAwqUcgg@zr@m|h@mtDqkHk|G`_Hf`@igS~ui@~tK",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["Caerphilly"] = {id:115,points: "ufgzHdiwQxjEth@hyLrbEmVdjWu~P`|MuwBenB{tW`oFkWkwCliTy~d@nlEg}F",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Co Antrim"] = {id:116,points: "opkmIjhpf@_gw@z{WseKosEsvJbsRokI_kf@zoIofoA~fYsq@zzAg_Qj}KnfD~ja@way@rkf@~ok@ghEssIftIo{AjmNbyc@sq@rcy@bGraCkkJj{Lc`OotBg|En}Jc}Rn}@",levels:"PPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["Scottish Borders"] = {id:117,points: "qn|sIjssKf{GgrFxd`@|_f@bx@n{Rtx^cib@lq\\h{mA|aCnxAftAh_FdlQnvNdvNru^_ea@|`HxiA~e[{lSjaa@lfD~aSshNg~MakBhpLjkEp~d@u{e@llC{vPmdXioLlxLcmHm`NiZy_DxjCy|b@zyP}jJeeTeyu@w{@ydp@ceOmyFxhDkbPmsJwuRjaPcdx@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"dg"}; 
	points["Windsor + Maidenhead"] = {id:118,points: "q|_yHjjnBf~KzvQ{dHzt@`jB}wGegIvfJb`DvuTmfS`jG_~Bwr[rr@o^f~IeqH|tDu_Vf_CvfH",levels:"PPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Gloucestershire"] = {id:119,points: "o~{{Hrb`IhdZhmM`jQcmEhjCf}Raa@rms@bjQ~`k@chRbfp@p~LtdQg`@duFsyBoAmee@qfByxLs`h@geUd_IiGu~Qyz@{iGdtIm}HmxD}qY_qIcQhyFk}MgYquC~bAmeAshDezj@}nAvz@q{@jsD{pJyuQbkMg~Zx}Gf{GpyLgwC",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Kingston upon Hull"] = {id:120,points: "yx_gIvn_AdwCz`PuhQicShbOm_MypAzaP",levels:"PPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Brighton + Hove"] = {id:121,points: "w_euHptGnj@gzDb_BbiCgnDhwa@s{HraAys@g|P`tKqkP",levels:"PPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Carmarthenshire"] = {id:122,points: "utnzHt~zWlyApmn@{wT~aHtlIhqr@e`Our@}aDlg^{cAatL{}Jpq@sdHyhk@yaOj~KkkOyg}CfjPs~Rp~o@xb^rpBhbW~oNrt[",levels:"PPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Torbay"] = {id:123,points: "c{~rHphqT`gOemD{uIxqVu`OeiVdjIwpDhDhvI",levels:"PPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Nottinghamshire"] = {id:124,points: "gracI|dmCreEwcBxgAnlBfbGjeMdzEweDrd^flh@heDxfm@{}NlfGimw@dzIokCyuWmvWnP{vQqjOkqQufb@~hHsbZnsg@s}Bdk@cnTz`IdtQ~sPijE",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Nottingham"] = {id:50,points: "apcbIvnxEdmG`_SkkOjvDusEsoKzqMyeL",levels:"PPPPP", warnCol:"#ccc", reg:"em"}; 
	points["Conwy"] = {id:125,points: "_hccI~arWceTquQyhEfhLioEsgb@}nJb}I`bDeegApqKrsCfkOoaMrqNbnZfF{kUpjRotDedD`w]lbK~se@a~Jjs`@iuQt|G",levels:"PPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Perth + Kinross"] = {id:126,points: "m__xIbyqRfhJmuVpt@giFvePbav@vuCciNvbNp`XnoHkeVhtH`eEztFby_AgpFqNmcDs{HuA`tp@g|X`unA}bXa|E_n@qeScfF|gEniDlm_@q~L`aMfgMb_r@_|MneLmoCu{YmdG~fLu`KjpPwfBsoWu{T}~LncEyiNu|Ygfs@avCsygA~}Jw{rA~~[}wBziM_mf@voIp|AmxAudNxgPh}V",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ta"}; 
	points["W Berkshire"] = {id:127,points: "mmxxHh~aEzvHgtAdpEj`cBgee@b{OoqFc_q@bhPeax@jaGglEdcCuW",levels:"PPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Milton Keynes"] = {id:128,points: "stt|HnjaCxoN_cB}zLxsi@ceEoxF}rIdsHklLyoh@dnOa|MjbKjaN",levels:"PPPPPPPP", warnCol:"#ccc", reg:"se"}; 
	points["Norfolk"] = {id:129,points: "wufbIkhjD]wHzkNmtkBve_@ass@d`c@wkFg`@hgSj|Ga_HltDpkH{r@l|h@vqUbgg@akDvtyAmpN`iObhEnan@{yL`kJkrB|l^y_j@p_FwuLeuQfeEudTmke@up_@hcAibEqU}eE_x@`vAfRslD~^xHyn@_hJpd@ng@qCkaCaCbqAoh@c{B`d@gcFzfAd@g}AuyD}Ef~@gMa~OlNfkBxSm`EfaBzBqN}uC",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ee"}; 
	points["N Yorkshire"] = {id:130,points: "qysiIljpAfh_@fzr@vjBfen@}vKvlY~bNpp^~eS{xUkTyja@xeXpqG|hEarL`mHj`f@~iAsgIxbFtob@asCxkCs|Io`JokGlwUwaU`jFovLonJutB|_H~uGnco@}yIdafAhyStsQ_bu@phdB{mRihS_{AelYaeOyaBqhEjzJgdOqdNmjB_`XlRwkj@kcOk~n@zvJwwl@k}AecDsaC}dg@t`AokO|hAebz@{{Lg{I`fUucs@rv`@ykWfxUc}b@_fBxdg@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Argyll + Bute"] = {id:131,points: "qoppIz~ua@cNo_@bNjc@?{BjnBxyLahB~fGcrhA}zW{xTmp_@xmEbvSsmIbxIqfV_qRhlCr|UeoXyyVzdQhy[klm@{oh@fsI|bU_pScjH}}BkuO~q@zkUpnMxjIeuHrFhbP`wBfkqAlz|@fsb@xu}@eni@l~FlgIj|b@ia^qkNwdm@smq@u`f@k`iB{|FyoMuoAs`RqpAliJqxQw}QhxBiyf@miBhgGyqDdpd@ajBkyBe{AqjB_jDjnDvhHpdOxfOtiV?t}P`~J}yExpEpaZzkJtvpB_yQ}pCsuBing@yjXeeg@p~Dbwk@_~LjtRupG{kJeyOv`f@bgMjgIluDhx[`}Xh{p@egK|yEgsb@}`aBhyMia^_lH{wa@tjZiz~@dyOix[yjJelPqoLmpQc[woGvqBdfEzcDwgDqx@w`AwOyrL}yBrgLsgLkzQtbAq`n@|`HclBpfD~}AieOakwAldG_gLloCt{Y~{MoeLhcS`zj@~nH_he@j~VteFnmUm~Qh|Nv`KbaJihIsoG`~n@o{QfdCxaStqCenBvaKplEkaI~ySrzLisWxz]j}]on`@l}KwyLp~D|}LazCha^cxYjzUtgLcfD}hOjnYgph@aiW`mVpz]gxEn~Il}`@q_DtfPgiRv|Xtu_@l|Km|C`w\\pzV~pKepJbkIha`@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"st"}; 
	points["W Dunbartonshire"] = {id:133,points: "{zktIt_zZubAvqGcaJhhIi|Nw`KxnC_~VvmPajMjrHy}BxmEnaAm|F|wPe_@brN",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"st"};
	points["Pembrokeshire"] = {id:136,points: "{mk|H~ui]qzR{{u@`kEjqCrfDc`]xaOk~KrdHxhk@z}Jqq@zcA`tL|aDmg^d`Otr@taO`|NxyI~|h@gyOlye@clBid_@msChxf@dlGhiAchJzfNq`Myo\\w_Qvjh@q|Kexk@edKo`AzuDogS",levels:"PPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Northamptonshire"] = {id:137,points: "msa~Hj}uBfkOxfJjlLxoh@|rIesHbeEnxFqqEnj`@zeJpgMbhFnv_@kaT|nF{{@}gMe}LxdOmrOwbRebKqsCgqAv}IqmD}sPgzFvcDugVsliAky@uySooUuui@tlIlOtq@gaOzyTelMlaPzc]p`Jc~DhyKzpM_fCxxL",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"em"}; 
	points["E Lothian"] = {id:138,points: "g}ztInquNlaBajC`@rDZq@}@aCzhI}lc@lsJvuRyhDjbPbeOlyFv{@xdp@aiHlrP}wKzl]ih@ir@ar@kf@gwUutr@x|Hiqm@",levels:"PPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"dg"}; 
	points["Rhondda Cynon Taff"] = {id:139,points: "}nsyHdh~RrfGheKwUfk^inBqaB{xLex@mtGlvPk}Mh`BiaEf{A}pKcr\\t{IdcA|yUieZt~Pa|M`HneF",levels:"PPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["Co Down"] = {id:140,points: "woukIzate@rq@scy@kmNcyc@gtIn{Agr@_}`Abz[kxKve@gaFbv]buLgiLb~OkwDkeHc_R~jCkmIvnWzpF~~HreFcrUkH~|Iz_B_XnZsgEzYzpAb`Ew[{TggCjkOzmJns@gsBgT{TrN_`AotBwbN~qBkk@{fAgfAvaL}wDzxGdcOjbB`Iku@dwEjbBwj@rhBzvC__DfoDrq@foXkxFgJbsa@naNztNro_@oxOrcj@{Jvj@szu@~fT{aPcrU_sDbiMcGsaC",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"ni"}; 
	points["Staffordshire"] = {id:141,points: "}a``Ifw`IdbAfeZdQ`oOu}M~{JreExzi@xlGzoItkEsiNhzH`kKnhMcgDetBhlXkcQapFw{LfdLikGkkPw`N|wNk{C~yAqnLzyOywOkgFxj@~{Pm`QmcQa{Hr]ibZgzm@qaDyk]nvI_n`@|}WoqJzpTzgRfjPwvs@nvRnxVvrEqdSbz@wxAbiPdqJ",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Stoke-on-Trent"] = {id:39,points: "arlbIt|vKjrGn{PwkNrtCk_H~lEk~B{uJbxRghP",levels:"PPPPPP", warnCol:"#ccc", reg:"wm"}; 
	points["Neath Port Talbot"] = {id:142,points: "ykwyHlqdVuhIpoFtMpqIooIyvFkmQhkNspBibW~vAqrf@fcImyCj}Mi`BLhfRpwSa_@lUftSq}En}E",levels:"PPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
	points["N Lincolnshire"] = {id:143,points: "}`kfIhugDuwFey^adFyvnAbxMaqPl|C~cPhdLrye@~tAidOvdJplK`gBrz]itI}_@}j@dhUluKxjJ_iHrbZclYcvL",levels:"PPPPPPPPPPPPPP", warnCol:"#ccc", reg:"yh"}; 
	points["Lancashire"] = {id:144,points: "iv{fI~dgLh_Gg|CtdLpcWDJyb@bdAycHngPkgUrtSdpF~aPvpU}kIzlCpwa@djOp`G|bF~fUoaJjbf@er]sgPgsIcq^gxCnir@kkB{eMg_OzjKqwGjGyvG}{f@uyKnnNcgR}zX_eHldNuwHiynAzmRhhS~au@qhdBtyWzyW",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
	points["S Gloucestershire"] = {id:146,points: "a`gyH|dbMbmJ_hBc^nql@oqDeaBe`Ozp^q}Js~Gq~LudQbhRcfp@zyHo~Dx}FvqJ",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
	points["Bracknell Forest"] = {id:147,points: "ec|xHbxbCzdH{t@zgI~`TwaCxaKmeIg_Fq`FcHc`DwuTdgIwfJajB|wG",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"se"}; 

//	if (params.language == "Eng") {
		points["Swansea"] = {id:15,points: "iwkzHv|nVnoIxvF`bJ~qPxIx}~@y~Gzr@}zNqzm@_pNst[jmQikN",levels:"PPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Newport"] = {id:13,points: "m_yyHzdmPl}CwiFreIp~q@eeHx{DiyLsbEax@{_QwGk|EqoBaiVdjEsaEraF|{I",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Cardiff"] = {id:96,points: "cbhyHh}~QvxGjxL}}Jxv\\sfGieKaHoeFlVejWdeHy{Dfw@rbE",levels:"PPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Vale of Glamorgan"] = {id:79,points: "mzyxHtbjR`pF|ul@o|Ojdm@evGgc[vUgk^|}Jyv\\|lD_sA",levels:"PPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Bridgend"] = {id:72,points: "kmoyHdxfThnBpaBdvGfc[keL|rVmUgtSqwS`_@MifRltGmvPzxLdx@",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Isle of Anglesey"] = {id:135,points: "yutcIjguYr|FvkL_aU`vTkpFlm[bj@y}\\_qR`rDg|Dgh\\ppA}_Z|jWygOqqBi__@b|IfxJ`sFl}Rb{DfbBrpFpvOaf@trExdDu{@or@fbPgzJ}~F",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Monmouthshire"] = {id:112,points: "c_czHdrgOpyBnApbJld]m}CviFsaF}{IejEraEpoB`iVykZfoPqjCpuPopC`pCklLq|UafR`jDn{Umjw@bvDyxF??yjAyvBplCiqLnee@pfB",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Devon"] = {id:9,points: "efytHxl_QhmEtAdyVrznAquM`zSzxLkrGvmQdoOt`OdiVzuIyqVdua@bwh@qzZvcnAcmEu|My_LrjKtvCbfIu_DdnEciBfbGa|F}wJawMluW{nd@jpMklCr}TwjMydMqcK|zEdB|pPmiQ}{BubAc__AkmThlKshJ{yJ}lEsu|AhrQbaU~fOg{m@nhG||BysB}tc@djOgzq@nlJ{uCyxBcnP`xOi}Q~mDwoL|oEd{K",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Cornwall & Isles of Scilly"] = {id:109,points: "edtrHtdtXftKk|EdcEhqIgqI~w^pwErfgAv~TfiH~nP`bx@nzMurFzoPb~WmzVloXclFht[l}LvhUmf@b`Y{cTeiFgaDurm@y`]qxu@uoJse@owFasSolSca@}oHk_n@axb@}rl@ou[weBeB}pPpcK}zEvjMxdMjlCs}Tznd@kpM`wMmuW`|F|wJbiBgbGdkFdh@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Somerset"] = {id:75,points: "miawH`_iMd|HyvB|uR|kBolBllg@|oUb~KvjJr_aAaxOh}QxxBbnPolJzuCejOfzq@xsB|tc@ohG}|B_gOf{m@irQcaUp~Hgb}@g_F{ajAlbEdfEqnF_lI_eStgFllDkdGi}Ag{x@~xB{_u@wtDyyZ|_MoiEbbW`vR",levels:"PPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Isle of Wight"] = {id:91, points: "_vztH~t_GrwDd~EtjAvtLpvBlpLpLrsFjpEzwFnWmpLreE{gLvcJe_WlD}nDqyBywQ}`Jc~EyxAeeImnBowDm{Ax{DiyBfjBsxA~aOktCtvKgx@bdI", levels: "BAAAABA?ABAAABAAAAB", warnCol:"#ccc", reg:"se"}; 
		points["York"] = {id:20,points: "kidhId{sDnaIjIjTxja@_fSzxU_cNqp^|vKwlYdzJfN",levels:"PPPPPPP", warnCol:"#ccc", reg:"yh"}; 
		points["Leicester"] = {id:21,points: "}vg`Ij`kEddJ~zSuoI`hKecJcnJd`F_gSnmB}l@",levels:"PPPPPP", warnCol:"#ccc", reg:"em"}; 
		points["Kent"] = {id:85,points: "k~cxH_cfG~iMqlJl`QlwCjjVrgjAnvTl_ColArfV{{e@llfBszBnwt@q~Gf]eiSjP{tc@kfa@zeDeaJydA}_GhzAa|@`k@scJyiA}{MrxF__E|yLhmPxdAkjf@w{IwnEb_@elNk~E~jBkWgeEjtL{mDtfBehZy{FoekBlqLxiS",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
		points["Gtr Manchester"] = {id:94,points: "iileIj~bK`wS`hIbcHxqV_`K|`s@ul@rzHipOnoB|xEruN}pMd`]ejOq`G{lCqwa@qyFujZxcHogPrb@odAudLqcWoIs|Qfk[etZ|iJlhN",levels:"PPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
		points["Gtr London"] = {id:110,points: "oykyHkf^|aHjw|Ac}AgjhBztc@jfa@k~GhuNhcIrzOafQrqVfgIzrOm|KslAswMlnd@w~CsyB}nGha@o~J~^kzN{r~Ad{MkkOahDop\\`{K}jPj~KffOwmA~~L",levels:"PPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
		points["Bristol"] = {id:145,points: "qcbyHfliNnqDdaBlpFxqJinDhvHceJ`hHunKobAd`O{p^",levels:"PPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Bath + NE Somerset"] = {id:132,points: "wwaxHhmwM_yBz_u@imKsOvnFe{EinIc_MmpFyqJb^oql@hhOluHbzB{~KvtDxyZ",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Edinburgh"] = {id:70,points: "woltIz`yQhh@hr@naTrau@hZx_De{SjpE_cLgQ~dHg|bA`r@jf@",levels:"PPPPPPPP", warnCol:"#ccc", reg:"dg"}; 
//	}

	regNames.os = "Orkney & Shetland"; 
	regNames.he = "Highlands & Eilean Siar"; 
	regNames.gr = "Grampian";
	regNames.st = "Strathclyde";
	regNames.ta = "Central Tayside & Fife";
	regNames.ta = "Central Tayside & Fife";
	regNames.dg = "SW Scotland, Lothian Borders";
	regNames.ni = "Northern Ireland";
	regNames.nw = "North West England";
	regNames.ne = "North East England";
	regNames.yh = "Yorkshire & Humber";
	regNames.wm = "West Midlands";
	regNames.em = "East Midlands";
	regNames.ee = "East of England";
	regNames.sw = "Southwest England";
	regNames.se = "London & South East England";
	regNames.uk = "United Kingdom";
	regNames.wl = "Wales";

	mountainsNationalParks["Norfolk Broads"] = {type: "nationalPark", points: "adw`IujmGx}TpnBbt^s_NnIo{p@oj]}sH_m\\pcL}sEl|Ss{BdzRllNttL", levels: "BBBBBBABB", warnCol: "#6b8c19", reg: "ee"};
	mountainsNationalParks["Northumberland National Park"] = {type: "nationalPark", points: "mjgrIbcsLlz[ujDj_Mbdf@zcHxpN~uEsxJnsFesO|kIngJ``JeP|jBtfQtqOblLvmIclLczDslq@ax\\csOuaMbwBzbE_iR_kMwza@qoKfnc@u_M}hRaoUrxJ{sLbo\\", levels: "BBABABAAABBBABBBBBBB", warnCol: "#6b8c19", reg: "ne"};
	mountainsNationalParks["New Forest National Park"] = {type: "nationalPark", points: "wn`vHtvmI`|OdeIb}OybHtT_wXzuAywQfu@_{KwmFucA}xG}eBexF|aO{aEtfQuxHxtAyInyCtjArjDfj@~lEujAdwB", levels: "BBBA@B@BAABAAAB", warnCol: "#6b8c19", reg: "se"};
	mountainsNationalParks["South Downs National Park"] = {type: "nationalPark", points: "ymttHqen@mtR|qbA}lErxJtTn`Gn`BrqG|kC~aOuTdsOmlDltm@mbFvr{@woLrdkAyrVogJqTywQzjBogJrkDdPj_@ypNieQuqGwIonMhaFscAljAeeI}yPoyC`dOy{Dh_@_pUxoOmjZbdKco\\yIojZm_@mmj@lnI_{KhmFo|SdcG}vXvqM_hA", levels: "BABA@AB?ABBAAABBAABBBAAB@BA@BB", warnCol: "#6b8c19", reg: "se"};
	mountainsNationalParks["Exmoor National Park"] = {type: "nationalPark",   points: "ilpwHpusWvt@miI|YbyAruCw_CjDssFnw@guCpTqlCrnFc`EzrBfCvIslCj_@m{Bv{DquEvd@ivIlg@ykJtw@_rIoLwfFrhCuoHa}@kvIwzAen@_ZgsDwvEmT_b@gsDiz@uhEpTmiIsw@}pC{zBtcAkhC~jFxIbgHihCdwB_pB`bDko@x{Dmo@hqEcz@oT{Y_fBmo@j_Awt@txJtAhhC`uAxdGs\\j}A_j@xkJaz@vrMko@vaBrwAlyCcOzyE~i@fsDeW~sHx|@jfDtd@zeMk@hh@r^nMtCho@zNwC", levels: "BAAAA@AAA@AB?@AABAAAA@AABAAAAA@AAAABAA@@AAAAAAA@AA@B", warnCol: "#6b8c19", reg: "sw"};
	mountainsNationalParks["Dartmoor National Park"] = {type: "nationalPark",   points: "y~~rHdsrW`xC}nDvsAgsD|oCkfDlx@gjB{TcyAzTeuC_|A}wFstBadCyTeuCw|Bm}A{dC{i@okAuaBq|BePcp@qnBkkAqwDcnAor@sfBc`EgrCzKevAppA_p@vv@sj@{i@sL_fBlDm}AgkAgqE_p@vXavAiCyiCvXyz@dn@onBfsDkhArlCur@`bDmj@zKem@xv@pLhjBmWnpAn}@`kFaRvdGmDruEwg@a]wmAvfFlDx{DcGduCzo@tjD{Ij}Avz@fuCtxAfjBpzDvhEtvBha@lu@dn@?fn@nj@rcAjsAvX`Rxv@jb@taBfiBrlCpyB}i@zIse@sLwXrLk_AhiBk_AzeAse@pu@nTt_@fC~\\se@|g@ztAbnAePv}@wXlm@m{Bzr@wXxTse@`{@{K|r@dn@pWnr@jx@ia@p`AqpAuj@gjB?se@vhAka@sLk}AyhAk_A_j@{G|@cX", levels: "BAAABAAAABAAAA@AABA@AA@AAA@BAA@AABAAA@AAA@AAAB@AAAAAA?ABA@@A@A@AAA@AA@AA@ABA@AAA@AB", warnCol: "#6b8c19", reg: "sw"};
	mountainsNationalParks["Pembrokeshire Coast National Park"] = {type: "nationalPark", points: "yj_}Hp`t[ecBvfFdpJdaKphBr|HfhCor@pIjkHenAhhCvxAflA~mBtxJqxB`{@k~@~zKpsAx{DrmCdPpxBha@n~@fzGzxAx{D`d@`bDzmCtxJh~AhvIzgGnr@w^wmInYirVdxF_mEn}H?z^vmI~sA|wFzsB`{@?lkHpnCs|Hn~EquEysEsqGkDkoFt~BdPz~@~eBv~BujDlyC}lEfdBzi@ftC{zVcdHkyN|~@onMadEqjOg~H{tAgyBaiGsnBor@uah@l}AqsArcAey@rnBcy@`bDgi@tjDc~AglAm}Cor@uwDsGgcBrG{{AagB", levels: "BAAABAAAAAAA@AAA@ABBAABBAAABABABAA?ABBAABAABBAA@BAA@AB", warnCol: "#6b8c19", reg: "wl"};
	mountainsNationalParks["North York Moors National Park"] = {type: "nationalPark", points: "{kvkIxsvEtyO~eB|z@~vXxxFluPpqd@}}[skCyeXefKu_NiwBmfg@ryFytAgcBstWhaCyeX}aMufQ}dUtfQihIrfQyqI|d_@i~CdzRvsHxbHwdAxl[", levels: "BBABBAABAABBBABAAB", warnCol: "#6b8c19", reg: "yh"};
	mountainsNationalParks["Yorkshire Dales"] = {type: "mountain", points: "mgvjI`e`NjsIbsOzsIidPppKhoFf{KstWdlT}}[uoA_tH`qL_wXm{Fs_NfbCelL{yA}zKmhKb~EgjDoyCktObhYaaNmq]s{EogJsiIrb^esDja@}hIirV}z@nyCzlBhvI{tChoFi|IrfQpfE~hRw`CxbHxxA~oUpzJxtA~pE~zK_mB~lE~p@n`G", levels: "BBBBABABAABABBABBABAA@BAABBAAB", warnCol: "#888", reg: "yh"};
	mountainsNationalParks["Snowdonia"] = {type: "mountain", points: "kya`IhpeXlkK{~I}|Aq_YuoE_bOkxG}pC_bBd~EqsFapJrvBkhCmqBqqR_s@{eMawNytAwmFwXm{BapJkmF}~Io`ChhCsm@|eM}mE~sHerK?xw@lgJwsD?scSl`RkuBvfF_vF`bDuaJdPwhHvXfIn`GnmDrcApuFzaZ|jB~eBrgE_fBdwEfzGnyCia@sSfaKvcS|vXtkGgzG|tCawMiIwfFwpBy{D`|AgsDfyDvXd{Bd~EeDp|HzuH}pCzwFv_CjdKsxJppCq|Hv{Bka@dcGvtLfrIdcD", levels: "BBABAABAAB@BABAABABAAAB@BAABAAABABAAAABAABABAABAB", warnCol: "#888", reg: "wl"};
	mountainsNationalParks["Brecon Beacons"] = {type: "mountain", points: "yrr{HxfiWxhCoyCrfAl}AfaAc{@jy@se@lq@_mEsQse@bl@ifD}kA}wF~{@}i@pYkfDrA{rBjaAowDt~@_fB_dAslCe\\}pCpYeuCx^uhEdd@?fyAkmGjqAm{Bdd@ixHsIglAr~AquEqYy}CiaB{i@qY{rBz^{rBe\\adC{kB{yEkaAor@qYezGyhDujD~{@uoHgLo`Gna@ucAxf@qnB~{@{yEeTeuCtv@}wF|cBihCvv@dPjiA_fBnnCiCrYnr@zf@a]uAytAlqAqG}F}i@eiD{i@hLc{@{f@opAukDj}Ao~BhjBeiBiCciBpnB}cAnr@giAesDtv@khCrIopAmi@ka@qcC{rBocCnTc\\taBqsBmTqpC`{@zNl{Bg~AtcAseDnwD_gHvoHk~@j_AesB_hAmuC~nDws@nr@bTtaBpbDzrBl{AflAj{A~lE`\\j}AgDb{@by@taB|c@{KhxCj}AxmCvaBpv@nyCiDnyCgD`bDavB`{@{s@|uGdy@deI~c@p|Hm~@xbHlYx{Dtf@rnBgq@bnKocB|eBgxCh_LnQrlCxs@byA`sCiC|pApnBfkC|pCf~ApwD`d@`iGxVb`EfnBjmGrkAhcBzNeM", levels: "BAA@BA@AAA@A@AAA@AAAA@ABAAAAAAAAAAB@@AABAAAAAAABAAABAAA@BA@A@BAAAAAA@?AA@BA@AA@AAA@AB?AAA@AA@AAABAAA@AA@AAAB", warnCol: "#888", reg: "wl"};
	mountainsNationalParks["West Highland"] = {type: "mountain", points: "whusIhq|_@cvqAczjE}dYi|i@yfMjvIezJ|zKwsIt{Zq`~Cr{Za|jBi|i@euDt_NqfIr_Ns{NhvIkeI}vXgc@i`]}aQ_al@qgn@h|i@csWznyC`gaA|hRfgArwg@rt^tcAb}FrmTxmSgnc@bbPfxv@xbuA|j_Aqfv@fppAlzz@fl}Av{i@s}gAphOqoaApkd@soaAfyXroaAhwqAfxv@n`Rswg@qfS{byAzog@khCptjAtcAq`H}nr@", levels: "BABAABBBAABAABBBBBBBBBBBBABBBBBBABB", warnCol: "#888", reg: ["he", "st", "ta"]};
	mountainsNationalParks["East Highland"] = {type: "mountain", points: "yh|wI|j_X~gZ}p_BuepBy~lEa`Th`]qhV}d_@{yp@r_NwwDhnc@srCpg{AxhAfdwBp}Tpst@lzbDc~E", levels: "BBBBBBAABBB", warnCol: "#888", reg: ["gr", "he", "ta"]};
	mountainsNationalParks["Lake District"] = {type: "mountain", points: "yoziIrqkSoyN`wMceA{i@kjKfzG_tA_mEukJjkHeaJ_fBmcD~lEoeCghNerDb{@chDciGowFnr@{bDq|H{sC~eBe~EgzGva@_tHmdA{i@kdAouPrf@w_Ck_A_mEc}Anr@ua@_tHhdAa{@p}CawMjeEm}AhxAl}AvlDwmIp_A{i@ya@u_NjbBybHhgBabDyWkhC|qDm`G~eEsGvz@~eBplBcwBtxAm}AbqGa{@xiA~eBruEzi@zlBnr@zwDldE~dAbeIbbEk}AbfCsGdhB|wFlvEsGpxDelAlwBb~ElrBldEeg@rjDaNx{DaN|pCmwBpnB?fzGfeAb{@g`At_CqsDd~E`DjyNeeAd~Ebv@nyCkkCl}AjfCx{Dbl@v_C|cGhvI", levels: "BAAAAAABBAAAAABAAAAAABAAAAABAAAABAA@ABAAAABAAAAB@BA@AAAAAAAAABAAB", warnCol: "#888", reg: "nw"};
	mountainsNationalParks["Peak District"] = {type: "mountain", points: "expdIhnsK~_OhhChcD_mE`xDtqGvtGka@lyCirVxhIsxJfkGirVhIonMs{KogJmqAi}LcmNjhCapB{pN{eSztAwsOhvIqoBbaVmpIhvIatFczRckEx{Dr]tfQa{H|zKnpAx~TjrGjhCr}N{bHb|Hd~Ede[chYdbEhhC?hvIe|Ior@uwD~lEalEnnM", levels: "BAAABAABAABBBABABBAABABABBABBAB", warnCol: "#888", reg: ["nw", "em", "wm", "yh"]};
	
	keyLayout["Temp. Map"] = '';
	keyLayout["Rainfall"] = '' +
		'<div class="keyContainer">' +
		'<div style="float:right;">' + 
		'<span style="background-color:#fc9804;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 4 - 8<br>' + 
		'<span style="background-color:#fb0404;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 8 - 16<br>' + 
		'<span style="background-color:#fb04fc;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 16 - 32<br>' + 
		'<span style="background-color:#e2fcfc;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> > 32<br>' + 
		'</div>' +
		'<div style="float:left;">' + 
		'<span style="background-color:#0404fb;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 0.01 - 0.5<br>' + 
		'<span style="background-color:#3366fc;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 0.5 - 1<br>' + 
		'<span style="background-color:#808003;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 1 - 2<br>' + 
		'<span style="background-color:#fbca04;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> 2 - 4<br>' + 
		'</div>' +
		'<div style="clear:both;">Rainfall in mm / hour</div>' + 
		opacitySetterHTML + 
		'</div>' +
		'';
	keyLayout["Leisure"] = '' +
		'<div class="keyContainer">' +
		'<h3>Mountain weather hazards <a href="http://www.metoffice.gov.uk/loutdoor/mountainsafety/about.html" title="Risk of specific mountain weather hazards.  See mountain forecast for more details.">?</a></h3>' + 
		'<span style="background-color:Crimson;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> High weather risk<br>' + 
		'<span style="background-color:DarkOrange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Medium weather risk<br>' + 
		'<span style="background-color:yellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Low weather risk<br>' + 
		'<span style="background-color:white;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> No weather risk<br>' + 
		'<hr>' + 
		'<span style="background-color:#6b8c19;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> National park<br>' + 
		'</div>' +
		'';
	keyLayout["Temp. MapF"] = '' + 
		'<div class="keyContainer">' + ((msie) ? '<div style="clear:both;margin-top:-4px;">&nbsp;</div>' : '') +
		'<div class="tempMapKeyItem"><div style="background-color:Indigo;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>7</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Navy;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>10</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DarkBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>14</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:MediumBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>18</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Blue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>21</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DodgerBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>25</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Cyan;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>28</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:SeaGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>32</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:ForestGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>36</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>39</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>43</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>46</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Lime;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>50</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:GreenYellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>54</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Yellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>57</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Gold;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>61</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Orange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>64</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DarkOrange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>68</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:OrangeRed;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>72</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Red;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>75</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF0483;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>79</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DeepPink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>82</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF38a4;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>86</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:HotPink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>90</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Pink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>93</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#ffe0eb;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>97</span></div>' + 
		'<div style="clear:both;margin-top:-4px;">&deg; Fahrenheit</div>' +
		opacitySetterHTML + 
		'</div>' +
		'';
	keyLayout["Temp. MapC"] = '' +
		'<div class="keyContainer">' + ((msie) ? '<div style="clear:both;margin-top:-4px;">&nbsp;</div>' : '') +
		'<div class="tempMapKeyItem"><div style="background-color:Indigo;" class="keyItem"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></div><span>-14</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Navy;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-12</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DarkBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-10</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:MediumBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-8</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Blue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-6</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DodgerBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-4</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Cyan;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-2</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:SeaGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>0</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:ForestGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>2</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>4</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>6</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:LimeGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>8</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Lime;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>10</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:GreenYellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>12</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Yellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>14</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Gold;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>16</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Orange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>18</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DarkOrange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>20</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:OrangeRed;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>22</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Red;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>24</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF0483;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>26</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:DeepPink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>28</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF38a4;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>30</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:HotPink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>32</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:Pink;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>34</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#ffe0eb;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>36</span></div>' + 
		'<div style="clear:both;margin-top:-4px;">&deg; Celsius</div>' +
		opacitySetterHTML + 
		'</div>' +
		'';
	keyLayout["Regions"] = '' +
		'<div class="keyContainer">' +
		'<span style="background-color:#cf3;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> No severe weather<br>' + 
		'<span style="background-color:#FFFF66;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Be aware<br>' + 
		'<span style="background-color:#FF9933;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Be prepared<br>' + 
		'<span style="background-color:#CC0033;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Take action<br>' + 
		'</div>' +
		'';
		
	keyLayout["WindArrows"] = '' +
		'<div class="keyContainerWind">' +
		'<img src="lib/images/windSymbols/arrows/key.gif" height=30 width=66 style="float: left; margin: 0 5px 0 0;">Arrow size relative to wind speed<br><br><br>Hover over for more detail' +
		'</div>' +
		'';	
	keyLayout["WindPoints"] = '' +
		'<div class="keyContainerWind">' +
		'<img src="lib/images/windSymbols/arrows/pkey.gif" style="float: left; margin: 0 5px 0 0;">Wind direction and speed<br><br><br>Max gust speed observed/forecast<br>' +
		'</div>' +
		'';	
	keyLayout["Wind"] = '' +
		'<div class="keyContainerWind">' +
		WindSetterHTML +
		'Select wind style' +
		'</div>' +
		'';	
	keyLayout["UV"] = '' +
		'<div class="keyContainer">' +
		'<span style="background-color:SeaGreen;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Low exposure<br>' + 
		'<span style="background-color:yellow;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Moderate exposure<br>' + 
		'<span style="background-color:DarkOrange;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> High exposure<br>' + 
		'<span style="background-color:Crimson;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Very high exposure<br>' + 
		'<span style="background-color:SlateBlue;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</span> Extreme exposure<br>' + 
		'</div>' +
		'';
	 
	// any Welsh data is set up on top of the English stuff, except the points, which are set up in one or the other.  
/*	if (params.language == "Wl") {
		points["Abertawe"] = {id:15,points: "iwkzHv|nVnoIxvF`bJ~qPxIx}~@y~Gzr@}zNqzm@_pNst[jmQikN",levels:"PPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Casnewydd"] = {id:13,points: "m_yyHzdmPl}CwiFreIp~q@eeHx{DiyLsbEax@{_QwGk|EqoBaiVdjEsaEraF|{I",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Caerdydd"] = {id:96,points: "cbhyHh}~QvxGjxL}}Jxv\\sfGieKaHoeFlVejWdeHy{Dfw@rbE",levels:"PPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Bro Morgannwg"] = {id:79,points: "mzyxHtbjR`pF|ul@o|Ojdm@evGgc[vUgk^|}Jyv\\|lD_sA",levels:"PPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Pen-y-bont"] = {id:72,points: "kmoyHdxfThnBpaBdvGfc[keL|rVmUgtSqwS`_@MifRltGmvPzxLdx@",levels:"PPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Ynys Mon"] = {id:135,points: "yutcIjguYr|FvkL_aU`vTkpFlm[bj@y}\\_qR`rDg|Dgh\\ppA}_Z|jWygOqqBi__@b|IfxJ`sFl}Rb{DfbBrpFpvOaf@trExdDu{@or@fbPgzJ}~F",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Sir Fynwy"] = {id:112,points: "c_czHdrgOpyBnApbJld]m}CviFsaF}{IejEraEpoB`iVykZfoPqjCpuPopC`pCklLq|UafR`jDn{Umjw@bvDyxF??yjAyvBplCiqLnee@pfB",levels:"PPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"wl"}; 
		points["Dyfnaint"] = {id:9,points: "efytHxl_QhmEtAdyVrznAquM`zSzxLkrGvmQdoOt`OdiVzuIyqVdua@bwh@qzZvcnAcmEu|My_LrjKtvCbfIu_DdnEciBfbGa|F}wJawMluW{nd@jpMklCr}TwjMydMqcK|zEdB|pPmiQ}{BubAc__AkmThlKshJ{yJ}lEsu|AhrQbaU~fOg{m@nhG||BysB}tc@djOgzq@nlJ{uCyxBcnP`xOi}Q~mDwoL|oEd{K",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Cernyw & Isles of Scilly"] = {id:109,points: "edtrHtdtXftKk|EdcEhqIgqI~w^pwErfgAv~TfiH~nP`bx@nzMurFzoPb~WmzVloXclFht[l}LvhUmf@b`Y{cTeiFgaDurm@y`]qxu@uoJse@owFasSolSca@}oHk_n@axb@}rl@ou[weBeB}pPpcK}zEvjMxdMjlCs}Tznd@kpM`wMmuW`|F|wJbiBgbGdkFdh@",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Gwlad-yr-haf"] = {id:75,points: "miawH`_iMd|HyvB|uR|kBolBllg@|oUb~KvjJr_aAaxOh}QxxBbnPolJzuCejOfzq@xsB|tc@ohG}|B_gOf{m@irQcaUp~Hgb}@g_F{ajAlbEdfEqnF_lI_eStgFllDkdGi}Ag{x@~xB{_u@wtDyyZ|_MoiEbbW`vR",levels:"PPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Ynys Wyth"] = {id:91, points: "_vztH~t_GrwDd~EtjAvtLpvBlpLpLrsFjpEzwFnWmpLreE{gLvcJe_WlD}nDqyBywQ}`Jc~EyxAeeImnBowDm{Ax{DiyBfjBsxA~aOktCtvKgx@bdI", levels: "BAAAABA?ABAAABAAAAB", warnCol:"#ccc", reg:"se"};
		points["Efrog"] = {id:20,points: "kidhId{sDnaIjIjTxja@_fSzxU_cNqp^|vKwlYdzJfN",levels:"PPPPPPP", warnCol:"#ccc", reg:"yh"}; 
		points["Caerlyr"] = {id:21,points: "}vg`Ij`kEddJ~zSuoI`hKecJcnJd`F_gSnmB}l@",levels:"PPPPPP", warnCol:"#ccc", reg:"em"}; 
		points["Caint"] = {id:85,points: "k~cxH_cfG~iMqlJl`QlwCjjVrgjAnvTl_ColArfV{{e@llfBszBnwt@q~Gf]eiSjP{tc@kfa@zeDeaJydA}_GhzAa|@`k@scJyiA}{MrxF__E|yLhmPxdAkjf@w{IwnEb_@elNk~E~jBkWgeEjtL{mDtfBehZy{FoekBlqLxiS",levels:"PPPPPPPPPPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
		points["Manceinion"] = {id:94,points: "iileIj~bK`wS`hIbcHxqV_`K|`s@ul@rzHipOnoB|xEruN}pMd`]ejOq`G{lCqwa@qyFujZxcHogPrb@odAudLqcWoIs|Qfk[etZ|iJlhN",levels:"PPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"nw"}; 
		points["Llundain"] = {id:110,points: "oykyHkf^|aHjw|Ac}AgjhBztc@jfa@k~GhuNhcIrzOafQrqVfgIzrOm|KslAswMlnd@w~CsyB}nGha@o~J~^kzN{r~Ad{MkkOahDop\\`{K}jPj~KffOwmA~~L",levels:"PPPPPPPPPPPPPPPPPPP", warnCol:"#ccc", reg:"se"}; 
		points["Bryste"] = {id:145,points: "qcbyHfliNnqDdaBlpFxqJinDhvHceJ`hHunKobAd`O{p^",levels:"PPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Caerfaddon + NE Somerset"] = {id:132,points: "wwaxHhmwM_yBz_u@imKsOvnFe{EinIc_MmpFyqJb^oql@hhOluHbzB{~KvtDxyZ",levels:"PPPPPPPPPP", warnCol:"#ccc", reg:"sw"}; 
		points["Caeredin"] = {id:70,points: "woltIz`yQhh@hr@naTrau@hZx_De{SjpE_cLgQ~dHg|bA`r@jf@",levels:"PPPPPPPP", warnCol:"#ccc", reg:"dg"}; 

		regNames.wl = "Cymru";
		regNames.os = "Ynysoedd Erch & Shetland"; 
		regNames.ni = "Gogledd Iwerddon";
		regNames.st = "Ystrad Clud";

		labels = {
			menus: {
				mapLayers: "Caenennau",
				locations: "Lleoedd",
				views: "Golygfeydd",
				tools: {
					_title: "Offerynnau",
					preferences: "Blaenoriaethau"
				}
			},
			general: {
				language: "Iaith",
				cancel: "Cancel",
				ok: "O'r gorau",
				back: "Back",
				add: "Add"
			},
			units: {
				mph: "m.p.h.",
				kmh: "km/h",
				knots: "knots",
				unknown: ""
			},
			locations: {
				addressprompt: "Please enter a UK postcode/place name",
				address: "Enter postcode/place",
				name: "Name your location",
				nameprompt: "Please choose a name for your location",
				show: "Show"
			}
		};
		wxDesc["0"]="Nen glir (nos)";
		wxDesc["8"]="Cymylau lefel isel";
		wxDesc["16"]="Cawod o eirlaw (nos)";
		wxDesc["24"]="Eira ysgafn";
		wxDesc["1"]="Heulog";
		wxDesc["9"]="Cawod ysgafn o law (nos)";
		wxDesc["17"]="Cawod o eirlaw (dydd)";
		wxDesc["25"]="Cawod drom o eira (nos)";
		wxDesc["2"]="Rhannol gymylog (nos)";
		wxDesc["10"]="Cawod ysgafn o law (dydd)";
		wxDesc["18"]="Eirlaw";
		wxDesc["26"]="Cawod drom o eira (dydd)";
		wxDesc["3"]="Cyfnodau heulog";
		wxDesc["11"]="Glaw m&acirc;n";
		wxDesc["19"]="Cawod o gesair (nos)";
		wxDesc["27"]="Eira trwm";
		wxDesc["4"]="Llwch";
		wxDesc["12"]="Glaw ysgafn";
		wxDesc["20"]="Cawod o gesair (dydd)";
		wxDesc["28"]="Cawod daranllyd (nos)";
		wxDesc["5"]="Tarth";
		wxDesc["13"]="Cawod drom o law (nos)";
		wxDesc["21"]="Cesair";
		wxDesc["29"]="Cawod daranllyd (dydd)";
		wxDesc["6"]="Niwl ";
		wxDesc["14"]="Cawod drom o law (dydd)";
		wxDesc["22"]="Cawod ysgafn o eira (nos)";
		wxDesc["30"]="Storm fellt a tharanau";
		wxDesc["33"]="Tawch";
		wxDesc["15"]="Glaw trwm";
		wxDesc["23"]="Cawod ysgafn o eira (dydd)";
		wxDesc["31"]="Storm drofannol";
		wxDesc["7"]="Cymylau lefel ganol";
	}
*/
}