// Datafiles //
var showPollen = true;
var inventCache = "/public/data/InventCache/";
var warnFile = "";//inventCache + "ItemList/WeatherWarning/Valid/Now/Latest";
var layerXML=inventCache+"ItemList/Tiles/All";
var timestepsXML=inventCache+"ItemList/BestObsForecast/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 pollenXML = "/public/data/PWSCache/PollenForecast/Latest";


var govData = [];
govData["Pressure"]="Pres";
govData["Weather"]="Wx";
govData["Wind"]="Wind";
govData["Temperature"]="Temp";
govData["UV"]="UV";
govData["Leisure"]="LA";
// NSWWS mod - Removed to prevent download option for severe weather / regional forecasts 
//govData["Regions"]="WF";
var gustTest;
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 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;

// 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 isOpera = (jQuery.browser.opera);

// Points vars //
var startNum = 0;
var warningsDoc, mm, pmm, 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 pMarkerArray = [];
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 currentTSType = "";
var UVDesc = [];
UVDesc["0"] = ["red", "UV data for this site is currently unavailable."];
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 pollenRegion = [];
pollenRegion['OS'] = 'Orkney &amp; Shetland';
pollenRegion['HE'] = 'Highlands &amp; Eilean Siar';
pollenRegion['GR'] = 'Grampian';
pollenRegion['ST'] = 'Strathclyde';
pollenRegion['TA'] = 'Central, Tayside &amp; Fife';
pollenRegion['DG'] = 'SW Scotland, Lothian &amp; Borders';
pollenRegion['NI'] = 'Northern Ireland';
pollenRegion['WL'] = 'Wales';
pollenRegion['NW'] = 'North West England';
pollenRegion['NE'] = 'North East England';
pollenRegion['YH'] = 'Yorkshire &amp; Humber';
pollenRegion['WM'] = 'West Midlands';
pollenRegion['EM'] = 'East Midlands';
pollenRegion['EE'] = 'East England';
pollenRegion['SW'] = 'South West England';
pollenRegion['SE'] = 'London &amp; South East England';

var pollenArray = [];
pollenArray['OS'] = ['59.047053','-2.983704'];
pollenArray['HE'] = ['57.364657','-5.092163'];
pollenArray['GR'] = ['57.257855','-2.642211'];
pollenArray['ST'] = ['55.871818','-5.125122'];
pollenArray['TA'] = ['56.282603','-3.191528'];
pollenArray['DG'] = ['55.456641','-3.323364'];
pollenArray['NI'] = ['54.855426','-6.493836'];
pollenArray['WL'] = ['52.385211','-3.466186'];
pollenArray['NW'] = ['53.699525','-2.543334'];
pollenArray['NE'] = ['54.632094','-1.444702'];
pollenArray['YH'] = ['53.663303','-0.823974'];
pollenArray['WM'] = ['52.501955','-1.922607'];
pollenArray['EM'] = ['52.705903','-0.390014'];
pollenArray['EE'] = ['52.297953', '0.873413'];
pollenArray['SW'] = ['50.947584','-3.685913'];
pollenArray['SE'] = ['51.354173', '-0.50342'];


//REMOVED AS NO BRIEFING
//var pollenBriefing;
var pollenData;
var pollenDesc = [];
pollenDesc['Low'] = 'Low';
pollenDesc['Moderate'] = 'Moderate';
pollenDesc['High'] = 'High';
pollenDesc['Very High'] = 'Very High';
var pollenVal = [];
pollenVal['Low'] = 0;
pollenVal['Moderate'] = 1;
pollenVal['High'] = 2;
pollenVal['Very High'] = 3;
var pollenColor = [];
pollenColor[0] = "#ffff00";
pollenColor[1] = "#fbcb01";
pollenColor[2] = "#ff7300";
pollenColor[3] = "#ff0000";
var pollenDayMax = [-99,-99,-99,-99,-99,-99];
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, pollenPanel;

//Tooltips
var cX = 0; var cY = 0; var rX = 0; var rY = 0;

//***************//
//** Shared JS **//
//***************//

function paraFormat(input) {
    // convert newline chars in text to <p> and <br> tags.
    var destinationText = input;
    var re = /\n/gi;
    destinationText = destinationText.replace(re, "<br>");

    re = /<br><br>/gi;
    destinationText = destinationText.replace(re, "</p><p>");

    destinationText = "<p>" + destinationText + "</p>";

    return destinationText;
}

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", window[this.type].selection[0].name);
	controlDiv.innerHTML = window[this.type].selection[0].html;
	map.getContainer().appendChild(container); 
	return container;
};
controlBox.prototype.getDefaultPosition = function () {
	return new GControlPosition(window[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="fcTabCommentary"><a href="javascript:void(0)">Chief Forecaster\'s View</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="mainCommentaryText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="mainWarningText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="nationalParkText" class="textFCBoxPanel">' +
		'	</div>' +
		'	<div id="mountainText" class="textFCBoxPanel">' +
		'	</div>' +
		'</div>';
		
	pollenPanel = '<div id="textPollenBox" class="cornerTB07 popup">' +
		'	<div class="pollenBar title">' +
		'		<h2>Pollen Forecast</h2>'+
			//'		<br class="brclear">'+
		'	</div>' +
		'	<div id="mainPollenText" class="textPollenBoxPanel">' +
		'	</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;"><label id="tTText"></label><\/div>'}]};
}

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 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 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 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().css('z-index','999999');
	$("#" + eboxRef + " .errorBoxCross").click(function () {
		$(this).parent().fadeOut();
		return false;
	});
}

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></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=="UV"||layertype=="Feels"||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=="UV"||layertype=="Feels"||layertype=="Wind"||layertype=="Weather"||layertype=="Temperature"||layertype=="Warnings"||layertype=="Pressure"){
            $('iframe#moData').contents().find('#dataArea').html("UK");
        }
        else {
            $('iframe#moData').contents().find('#dataArea').html(leisuredropdown);
        }
    });
}

function logout(){
	currentPage = window.location.href;
	window.location='/public/logout?goto='+currentPage;
}

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 noData(text){
	map.clearOverlays();
	$('#tlContainer').empty();
	$('#frameNav').css('color','#fff');
	$("#date").empty();
	$("#date").empty();
	$("#time").empty();
	$('#map .slider').css('visibility','hidden');
	$('#rightTl').hide();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	$('#prodTitle').html(text);
}

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 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;
	if(fcPosn<0){ztest = 2;} else {ztest = 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');}
	$('#date').html(tlDate.toDateString());
	$('#time').html(tlDate.toTimeString() + (! feedStatus.time ? " UTC" : ""));
}

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() {
    var m, currentWindSpeed, currentWindGustSpeed;
	if (selectedType == 'Wind') {
		for (m in markerArray) {
        if (markerArray.hasOwnProperty(m)) {
			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 {
				currentWindSpeed = markerArray[m].windSpeed;
				if (params.speedUnits == "K") {
					currentWindSpeed = parseInt(currentWindSpeed * 1.609344, 10);
				} else if (params.speedUnits == "N") {
					currentWindSpeed = parseInt(currentWindSpeed * 0.868976242, 10);
				}
				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);

				//Gust available but does it fit the 10 units more than the mean rule?
				if (markerArray[m].windGust !== null) {
					if (( Math.round(parseInt(markerArray[m].windGust, 10))-Math.round(parseInt(markerArray[m].windSpeed, 10)))<10){gustTest=false;}else{gustTest=true;}
				}
				if (markerArray[m].windGust === null || gustTest === false) {
					// if there's no wind gust value,we hide the duplicate marker.  
					dupMarkerArray[m].tClass_ = '';
					dupMarkerArray[m].text_ = "";
					dupMarkerArray[m].ttTxt = null;
				} else {
					currentWindGustSpeed = markerArray[m].windGust;
					if (params.speedUnits == "K") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 1.609344, 10);
					} else if (params.speedUnits == "N") {
						currentWindGustSpeed = parseInt(currentWindGustSpeed * 0.868976242, 10);
					}
					
					// 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 (m in markerArray) {
            if (markerArray.hasOwnProperty(m)) {
            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_ = '';
                currentWindSpeed = markerArray[m].windSpeed;
                if (params.speedUnits == "K") {
                    currentWindSpeed = parseInt(currentWindSpeed * 1.609344, 10);
                } else if (params.speedUnits == "N") {
                    currentWindSpeed = parseInt(currentWindSpeed * 0.868976242, 10);
                }
                // 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 {
                currentWindGustSpeed = markerArray[m].windGust;
                if (params.speedUnits == "K") {
                    currentWindGustSpeed = parseInt(currentWindGustSpeed * 1.609344, 10);
                } else if (params.speedUnits == "N") {
                    currentWindGustSpeed = parseInt(currentWindGustSpeed * 0.868976242, 10);
                }
                
                // if the wind data has a wind gust value, we show the duplicate marker, by setting its class, text value and tool tip text. 
                
                if (( Math.round(parseInt(markerArray[m].windGust, 10))-Math.round(parseInt(markerArray[m].windSpeed, 10)))<10) {
                    gustTest = false;
                } else { 
                    gustTest = true;
                }
                if (gustTest) {
                    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 (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				// 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, 10);
						}
						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;
					case 'UV': 
						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>";
						break;
					case 'Feels': 
						var currentTemp = markerArray[m].Feels;
						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, 10);
						}
						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(data) {
	var sites = data;
	var gust, i, m;
	switch (selectedType) {
	case "Weather":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].Weather = null;
			}
        }
		for (i = 0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].Weather = sites[i].wt;
			}
		}
		break;
	case "Temperature":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].Temperature = null;
			}
        }
		for (i=0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].Temperature = Math.round(sites[i].t);
			}
		}
		break;

	case "Wind":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].windSpeed = null; markerArray[m].windDir = null; markerArray[m].windGust = null;
			}
        }
		for (i=0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].windSpeed = sites[i].ws;
				markerArray[id].windDir = sites[i].wd;
				gust = sites[i].wg;
				if (gust != "missing") {
					markerArray[id].windGust = gust;
				}
			}
		}
		break;
		
	case "WindArrows":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].windSpeed = null; markerArray[m].windDir = null; markerArray[m].windGust = null;
			}
        }
		for (i=0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].windSpeed = sites[i].ws;
				markerArray[id].windDir = sites[i].wd;
				gust = sites[i].wg;
				if (gust != "missing") {
					markerArray[id].windGust = gust;
				}
			}
		}
		break;		
	case "UV":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].UV = null;
			}
        }
		for (i=0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].UV = Math.round(sites[i].u);
			}
		}
		break;
	case "Feels":
		for (m in markerArray) {
			if (markerArray.hasOwnProperty(m)) {
				markerArray[m].Feels = null;
			}
        }
		for (i=0; i < sites.length; i++) {
			id = sites[i].id;
			if (markerArray[id]) {
				markerArray[id].Feels = Math.round(sites[i].f);
			}
		}
		break;
	}
	configPoints();
}

function loadUKMarkers(time,posn) {
	var obsfcFile = inventCache+"Item/BestObsForecast/UkData/"+time;
	var currentTime = new Date();
	pointsDataLoading = true;
	updateTimeline(time, selectedType, posn);
	$.ajax({
		method: "GET",
		dataType:"json",
		url: obsfcFile,
		error: function(){
			showErrorBox("marker", UKMarkerErrorMessage.start + $("#items .radiob:checked").attr("value").toLowerCase() + UKMarkerErrorMessage.middle +  UKMarkerErrorMessage.end);
			map.clearOverlays();
			pointsLoading = false;
			pointsDataLoading = false;
		},
		success: function(data) {
			plotUKMarkers(data);
			pointsDataLoading = false;
		}
	});
}

function closeFCBox() {
	// closes the forecast box, if shown.  
	$('#textFCBox').fadeOut().remove();
}

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 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 checkImgs () {
	var allImgs = map.getPane(1).getElementsByTagName("img");
    var i;
	count = 0;
	for (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 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() {
	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 buildTimeline() {
	$('#tlContainer').empty();
	var item = '';
	var tlLength = 518;
	var sumPeriods = 0;
	fcPosn = -99;
	var obTLWidth = 15;
	var thisLayer = allLayers.sets[currentLayer];
	var lenLyrs = thisLayer.data.length;
    var i;
	for (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();
	pmm.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();
}

function hideTooltip(d) {
	mtt = false;
	if (d.length < 1) { 
		return;
	}
	document.getElementById(d).style.display = "none";
}

function AssignPosition(d,marker) {
	//console.log($('#map').offset().left);
	//console.log($('#map').offset().top);
	//console.log($('#map').height());
	//console.log($('#map').width());
	if (marker != null) {
		var mapLeft = ($('#map').offset().left);
		var mapTop = ($('#map').offset().top);
		var mapHeight = ($('#map').height());
		var mapWidth = ($('#map').width());
		var point = map.fromLatLngToContainerPixel(marker.latlng);	
		var nudge = 2;
		
		if (point.y + $(d).height() > mapHeight) {
			point.y = mapHeight - $(d).height()-(marker.height_/2)-nudge; 
		}
		//if (point.x + $(d).width() > mapWidth) {
		//	point.y = point.y - $(d).width()-14; 
		//}
		
		d.style.left = (point.x + (marker.width_/2) + nudge) + "px";
		d.style.top = (point.y + (marker.height_/2) + nudge) + "px";
	} else {	
		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 = -100;
		} else {
			dTop = -200;
		}
	
		d.style.left = (cX + 20) + "px";
		d.style.top = (cY + dTop) + "px";
	}

}

function showTooltip(d,marker) {
	if (d.length < 1) {
		return;
	}
	var dd = document.getElementById(d);
	AssignPosition(dd,marker);
	dd.style.display = "block";
}

function displayRegionForecast(reg) {
	if (typeof(reg) == "object" && reg.constructor == (new Array).constructor) {
		for (var i in reg) {
            if (reg.hasOwnProperty(i)) {
                loadSingleRegionScript(reg[i]);
            }
		}
	} else {
		loadSingleRegionScript(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;
	});
	$('#fcTabCommentary').click(function () {
		$("#mainCommentaryText").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 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 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 processMountains(reg) {
	for (var i in mountainRegions[reg]) {
    if (mountainRegions[reg].hasOwnProperty(i)) {
		getMountainData(mountainRegions[reg][i]);
    }
	}
	$('#textLink').attr('href','../weathertext/index.html?'+reg);	
}

function displayRegionWarnings(reg) {
	if (typeof(reg) == "object" && reg.constructor == (new Array).constructor) {
		for (var i in reg) {
        if (reg.hasOwnProperty(i)) {
			displaySingleRegionWarnings(reg[i]);
        }
		}
	} else {
		displaySingleRegionWarnings(reg);
	}
}

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);
    var commentary;

	// 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) {
        commentary = MetOffice.forecasterCommentary.getByRegion(p.reg, function(result){
            $("#mainCommentaryText").html("<h2>Chief Forecaster's View: " + MetOffice.region.getById(p.reg).n +"</h2").append((result.length > 0 ? result : "<p>The forecasters have not issued a commentary for this region.</p>"));
        });

		displayRegionForecast(p.reg);
		$('#fcTabForecast').show();
		//if (p.color != "#cf3" && p.color != "#ccc") {		// There should be no warnings tab to click so...
		//	$('#fcTabWarnings').click();
		//} else {
			$('#fcTabForecast').click();
		//}
	} else if (isNationalPark) {
		$('#fcTabNationalPark').click();
	} else if (isMountain) {
		$('#fcTabMountain').click();
	}
}

function plotPolygons(sourceData, layerType) {
	polygonData = []; 
	map.clearOverlays();
	mm.clearMarkers();
	pmm.clearMarkers();
	for (var i in sourceData){
    if (sourceData.hasOwnProperty(i)) {
		polygonData[i] = new GPolygon.fromEncoded({
				polylines: [{
				points: sourceData[i].points,
				levels: sourceData[i].levels,
				color: "#222",
				opacity: 0.6,
				weight: 1,
				numLevels: 4,
				zoomFactor: 16
			}],
			fill: false,		// was true, set to false to show only the region outlines
			outline: true,
			color: "#cf3",
			opacity: 0.7
		});
		var id = i;
		polygonData[i].reg = sourceData[i].reg;
		polygonData[i].name = i;
		polygonData[i].warnText = "";
		// don't put any additional message in the tooltip
		// 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 getRegData() {
	plotPolygons(points, "regions");
}

function colourPolygons(riskData) {
	var forecasts = riskData.getElementsByTagName("MountainForecast");
	var forecast, risk, area, flen, colour, f;
	for (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 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 checkForCFV() {
	var commentary = MetOffice.forecasterCommentary.getRegionsWithCommentary( function(regions) { 
		if (regions != "") {
			var html = "<b>Chief Forecaster's View</b> <br/> Currently in force for locations in the following regions:";
			html += "<select onchange='window.location = this.options[this.selectedIndex].value'><option value=''>Please select a region</option>";
			for (var r in regions) {
				if (regions[r] != "uk"){
					html += "<option value='/public/pws/invent/weathertext/index.html?"+regions[r]+"'>"+(MetOffice.region.getById(regions[r])).n+"</option>";
				}
			}
			html += "</select>";
			showErrorBox("CFV", html);
		}
	});
}

function getLeisureData() {
	plotPolygons(mountainsNationalParks, "leisure");
	colourLeisureData();
}

function reAddMarkers(){

	for (var m in markerArray){
    if (markerArray.hasOwnProperty(m)) {
		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 changeToPoints() {
	pmm.clearMarkers();
	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 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 getLeisureTL() {
	getBasicTL();
	$('#prodTitle').html("Click on the map areas to get mountain and national park forecasts."); 
}

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 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 hideErrorBox(errorType) {
	// hides and removes an error box. 

	var eboxRef = "errorBox" + errorType;
	$("#" + eboxRef).fadeOut().remove();
}

function clickPointTS(){
	$('#tileLoading').css('visibility','visible');
	pointsLoading = true;
	$('[id^="tlPos"]').removeClass('current');
	$('#tlPos'+animIndx).addClass('current');
	changeDataTimeType($('#tlPos'+animIndx).attr("typeName"));
	//MASSIVE HACK TO FIX IE TIMELINE NOT UPDATING PROBLEM
	if (msie){$('#frameNav').css("display","none");$('#frameNav').css("display","block");}
	loadUKMarkers(times[animIndx],animIndx);
	hideErrorBox("marker");
}

function sortByObs(a,b) {
	 return b.o - a.o;
}

function changeDataTimeType(type) {
	if (type != currentTSType) {
		mm.clearMarkers();
		var list;
		if (type == "o") { 
			list = MetOffice.locations.obsList;
		} else {
			list = MetOffice.locations.list;
			list.sort(sortByObs);
		}
		for (var l = 0, leno = MetOffice.locations.obsList.length; l < leno; l ++) {
			if (list[l].s == "1" && list[l].o == "1") {
				if (markerArray[list[l].i]) {
					markerArray[list[l].i].zoommin = list[l].z;
				}
			}
		}
		reAddMarkers();
	}
	currentTSType = type;
}

function getTimeSteps() {
	var timeList, ct, tlLength = 518, y = 0, forecastOnly, tsLength, startAt, item, startAtType = "o", timeType = "";
	fcPosn = -99
	try {
		$('#tlContainer').empty();
		$("#date").empty();
		$("#time").empty();
		$("#prodTitle").empty();
		timeList = kmlDoc.getElementsByTagName("TimeSteps")[0].childNodes[0].nodeValue;
		times = timeList.split(",");
		
		//build timeline
		ct = kmlDoc.getElementsByTagName("time")[0].getAttribute("creation");
		$('#tlContainer').empty();
		for (var i = 0, len = times.length; i < len; i++){
			if (timediff(toDateObj(ct), toDateObj(times[y])) > 0 && times[y] !== "") {
				y++;
			} else {
				break;
			}
		}
		fcPosn = y;
		//Note: currently slicing array to restrict the timesteps
		if (times.length > y+11) {
			times = times.slice(0,y+11);
		}
		//////////////////////////////////////////////////////
		forecastOnly = (selectedType == "UV" || selectedType == "Feels")?true:false;
		if (forecastOnly) {
			tsLength = (tlLength / (times.length - y)) - 1;
			startNum = y;
			animIndx = y;
			startAt = y;
			startAtType = "f";
		} else {
			tsLength = (tlLength / times.length) - 1;
			animIndx = fcPosn -1;
			startAt = y-1;
			startNum = 0;
			startAtType = "o";
		}
		
		for (var i = startNum, len = times.length; i < len; i++){
		if (fcPosn>i) {timeType = "o";} else {timeType = "f";}
			item = '<li id="tlPos'+i+'" typeName="'+timeType+'"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
		}
		changeDataTimeType(startAtType);
		loadUKMarkers(times[startAt],startAt);
		$('#tlPos'+(startAt)).addClass('current');
		$('#tlContainer .timeSlot').click(function () {
			$('#rightTl .playpause').css('visibility','hidden');
			changeDataTimeType($(this).attr("typeName"));
			loadingPoints();
			animIndx = (this.id).substring(5);
			clickPointTS();
			return false;
		});  
		$('#tlContainer .timeSlot').mouseover(function () {
			updateTimelineTooltip(this.id);
		});
		$('#tlContainer .timeSlot').mouseout(function () {
			clearTimelineTooltip();
		});
	} catch (err){
		pointsUnavailable();
	}
}

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 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 getWarningsForDate(id){
	for (var p in points) {
    if (points.hasOwnProperty(p)) {
		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";
    var i;
	
	// empty timeline
	$('#tlContainer').empty();
	
	//get initial date	
	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
	temp = new Date(tlDate);
	for (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 (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("Regional Forecast");		// Did read "Forecast Warnings" before warnings data removed
		getWarningsForDate("tlPos0");
		$('#tlPos'+(0)).css("background-color", wColors[wLevels[0]]);
		currentLayer = -2;
	}
	$('#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 == "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 formatForecast(val) {
	var forecastString = '';
	$(val).contents().each(function() {
		if ($(this).is('para') && $(this).text() != ''){
			forecastString += $(this).text() + " ";
		}		
	});
	var returnString = '<p style="color:#ccc; width:200px;">' + forecastString + '</p>';
	return returnString;	
}


function createPollenMarkers(data){
	pMarkerArray = [];
	pmm.clearMarkers();
	//REMOVED AS NO BRIEFING
	//pollenBriefing = data.getElementsByTagName("briefing")[0].childNodes[0].nodeValue;
	var pRegions = [];
	//pRegions = data.getElementsByTagName("region");
	pRegions = $(data).find('region');
	//create initial markers
	for (var p = 0, lenp = pRegions.length;p<lenp;p++){
		//var name = pRegions[p].getAttribute("name");
		var id = $(pRegions[p]).attr('id');


		if (id != '') {
		//var point = new GLatLng(parseFloat(pollenArray[name][0]), parseFloat(pollenArray[name][1]));
		var point = new GLatLng(parseFloat(pollenArray[id][0]), parseFloat(pollenArray[id][1]));
		var pMarker = new MarkerLight(point);
		//pMarker.name = name;
		pMarker.name = pollenRegion[id];
		

		pMarker.days = [];

		var pDays = [];
		pDays = $(pRegions[p]).contents('day');
		for (var d = 0, lend = pDays.length; d<lend; d++){
				
			pMarker.days[d] = {pollenLevel:$(pDays[d]).attr('level'),
							   regionName:pMarker.name,
							   pollenType:'Tree',
							   pollenDesc: formatForecast($(pDays[0]))};
		}
		getMaxPollenDay(pMarker.days);
		pMarker.ttTxt = pMarker.name;
		//click event
		GEvent.addListener(pMarker, "click", function () {
			//does nothing currently
		});
		//mouse over event
		GEvent.addListener(pMarker,"mouseover", function () {
			$('#tTText').html(this.ttTxt);
			showTooltip('regTT2',this); return true;
		});     
		//mouse out event
		GEvent.addListener(pMarker,"mouseout", function () {
			hideTooltip('regTT2'); return true;
		});
		pMarker.height_ = 25;
		pMarker.width_ = 25;
		//add marker to marker array and marker manager
		pMarkerArray[pMarker.name] = pMarker;
		pmm.addMarker(pMarker, 5);
		}
	}
}

function loadPollenXML() {
	var request = GXmlHttp.create();
	request.open("GET", pollenXML, true);
	request.onreadystatechange = function () {
		if (request.readyState == 4) {
			try {
				if (request.status == 200) {
					feedStatus.pollen = true;
					pollenData = request.responseXML;
					createPollenMarkers(request.responseXML);
					buildPollenTL();

				} else {
					throw "Pollen data feed not available";
				}

			}
			catch(err) {
				//console.log(err);
				feedStatus.pollen = false;
				showErrorBox("pollen", pollenWarningMessage);
				if (feedStatus.pollen === false) {
					$('#pPollen').parent().addClass("unavailable");
					$('#pPollen').parent().attr("title", "Pollen information is not available");
					$('#pPollen').attr("disabled","disabled");
					$('#pPollen').click(function () {return false;}).mouseover(function () {return false;});
				}
				noData(pollenWarningMessage);
			}
		}
	};
	request.send(null);
}

function changeLayer(layerType, layer) {

	map.clearOverlays();
	// loads a layer (either layer or point data)
	closeFCBox();
	$("#textPollenBox").hide();
	$("#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 == "Leisure") {
			pointsTL = false;
			getLeisureData();
			getLeisureTL();
			$("#layerKeyLeisure").slideDown(300);
		} else if (layer == "Pollen") {

			map.clearOverlays();
			mm.clearMarkers();
			map.setZoom(5);

			pointsTL = false;
			loadPollenXML();
			$("#layerKeyPollen").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 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 reloadLayer () {
	var state = getPageState();
	changeLayer(state.layerType, state.layer);
}

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 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 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 createCookie(name,value,days) {
    var expires;
	if (days) {
		var date=new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		expires = "; expires=" + date.toGMTString();
	} else {
		expires = "";
	}
	document.cookie = name + "=" + value + expires + "; path=/";
}

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 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 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" || (layer == "Pollen" && showPollen == true)) {
			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"), 10);
	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 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 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 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 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);
	};

    Date.prototype.setISO8601 = function (string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));

        var offset = 0;
        var date = new Date(d[1], 0, 1);

        if (d[3]) { date.setMonth(d[3] - 1); }
        if (d[5]) { date.setDate(d[5]); }
        if (d[7]) { date.setHours(d[7]); }
        if (d[8]) { date.setMinutes(d[8]); }
        if (d[10]) { date.setSeconds(d[10]); }
        if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }

        var time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };

    Date.prototype.componentDateFormat = function () {
        var date = this;
        var month_name;
        month_name = ["January","February","March","April","May","June","July","August","September","October","November","December"];
        month_name = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
        var returnValue = (date.getDate() < 10 ? "0" : "") + date.getDate() + " " + month_name[date.getMonth()] + " " + date.getFullYear() + ", " + (date.getHours() < 10 ? "0" : "") + date.getHours() + ":" + (date.getMinutes() < 9 ? "0" : "") + date.getMinutes();
        return returnValue;
    };

	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 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 = startNum;
			}
			clickPointTS();
		}
		inbetweenPoints();
	}
}
	
function stopAnimation() {
	dontstop=false;
	$('#pause').attr("id", 'play');
}

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();}
			}
			//$('#pRegions').click();
		}
	}
	//increases zindex so that google navigation is usable when over other elements
	$('#lmc3d').css("z-Index","30");
	if (isOpera){
		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 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/' + (showPollen ? "layersPollen.txt" : "layersNoPollen.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 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 centerZoom(point) {
	var zoom = map.getZoom() + 2;
	if (zoom < 10) {
		map.setCenter(point, zoom);
		hideTooltip('regTT2');
	} else {
		map.setCenter(point);
	}
}

//*******TOOLTIPS*******//
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 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',this); 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();
	}
}

/*
 * 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 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 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 = [];
            var oTileLayerO;
			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;};
				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>'+
				'<div class="item pointsdata"><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="item pointsdata"><input class="radiob" type="radio" name="layerRb" id="pFeels" value="Feels" onClick="changeLayer(\'point\', \'Feels\');" /><label for="pFeels"><span>Feels Like Temp.</span></label></div>';
	itemsDiv.append(pointsHTML);
    fcHTML = '<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">Regional Forecasts</label></div>' +
        '<div class="layerKey" id="layerKey-2">' + keyLayout["Regions"] +'</div>' +
        (showPollen ? '<div class="item"><input class="radiob" type="radio" name="layerRb" id="pPollen" value="Pollen" onClick="changeLayer(\'point\', \'Pollen\');regBool = true;" /><label for="pPollen">Pollen Forecast</label></div>' : '') +
        (showPollen ? '<div class="layerKey" id="layerKeyPollen">' + keyLayout["Pollen"] +'</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 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 = "";
    var i;

	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 (i=0, len2=titles.length; i<len2; i++) {tText.push("<h2>"+titles[i].childNodes[0].nodeValue+"</h2>");}
		for (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 (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 createPollenPanel() {
	$("#content-inner").append(pollenPanel);
	//$("#textPollenBox .textPollenBoxPanel").hide();
	$('#content-inner .popupSel').addClass('popup').removeClass('popupSel');
	$('#textPollenBox').fadeIn().removeClass('popup').addClass('popupSel');
	var pollenDragOPtions = dragOptions;
	pollenDragOPtions.handle = '.pollenBar';
	$("#textPollenBox").draggable(pollenDragOPtions);
	//$("#mainPollenText").html("<span id='pollenValidity' style='font-weight:bold;'></span><br><p>"+pollenBriefing+"</p><span id='pollenBottomText' style='font-weight:bold;'></span>");
	//$("#mainPollenText").html("<span id='pollenValidity' style='font-weight:bold;'></span><br><p>Pollen Briefing not provided with this current xml data.</p><span id='pollenBottomText' style='font-weight:bold;'></span>");
}

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 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 parseNationalParkXML(nationalParkDoc, reg) {
	var parks, park, p, plen, sections, section, slen, s, paras, para, rlen, r, title, content = "";
	parks = nationalParkDoc.getElementsByTagName("PWSScript");
	for (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 (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 (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 getAntecedentRainfall(mfc) {
    var arText = '';
    try {
        var rainGauges = mfc.find("RainGauges RainGauge");
        if (rainGauges.length === 0) {
            throw("No rain gauge data found"); 
        }
        arText += "<h3>Recent rainfall</h3>";
        rainGauges.each(function() {
            var rainGauge = $(this);
            var readingDate = new Date();
			readingDate.setISO8601(rainGauge.attr("measurementDate"));
            arText += "<h5><span>Location:</span> " + rainGauge.find("Site").text() + " " + rainGauge.find("Location").text() + "</h5>";
            arText += "<h5><span>Altitude:</span> " + rainGauge.find("Altitude").text() + "m</h5>";
            
            arText += "<p>Rainfall measured at " + readingDate.componentDateFormat() + "</p>";
            readings = rainGauge.find("Text");
            if (readings.length) {
                arText += "<ul>";
                readings.each(function() {
                    arText += "<li>Last " + $(this).attr("hours") + " hours: " + $(this).text() + "mm";
                });
                arText += "</ul>";
            }
            arText += "<p class=\"caveat\">Rainfall data provided by the Environment Agency. The Met Office is not responsible for content provided by third parties and may remove this data without warning.</p>";
        });
    }
    catch (e) {
        arText = '<!-- there was an error creating the antecedent rainfall block -->';
    }
    return arText;
}

function parseMountainXML(mountainDoc) {
	var report, overview, content = "", element, risk, comment, firstTime = true, h;
	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>";
    content = content + "<th>Hazard</th><th>Risk</th><th class=\"explanation\">Explanation</th>";
    content = content + "</tr></thead><tbody>";
	hlen = hazards.length;
	for (h = 0; h < hlen; h++) {
		hazard = hazards[h];
		element = hazard.getElementsByTagName("Element");

		comment = hazard.getElementsByTagName("Comments");
		risk = hazard.getElementsByTagName("Risk");
		riskText = risk[0].childNodes[0].nodeValue;
		riskClass = riskText.split(' ').join('').toLowerCase();

        content = content + "<tr>";
		content = content + "<td class=\"" + riskClass + "\" nowrap>" + element[0].childNodes[0].nodeValue + "</td>";
		content = content + "<td class=\"risk " + riskClass + "\" nowrap>" + riskText + "</td>";
		content = content + "<td class=\"explanation\">" + ((comment[0].childNodes.length > 0) ? comment[0].childNodes[0].nodeValue : "&nbsp;") + "</td>";
        content = content + "</tr>";
	}

    content = content + "</tbody></table>";

    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.";
    
    var mfc = $(mountainDoc);
    
    // Add ground conditions text if applicable
    var gcText = mfc.find("GroundConditions Text").text();
    if (gcText !== '') {
        content += "<h3>Ground conditions</h3>" + paraFormat(gcText);
    }
    var gcImages = mfc.find("GroundConditions Image");
    if (gcImages.length) {
        content += "<h4>Expected conditions</h4><div id=\"overviewImages\">";
        gcImages.each(function() {
            image = $(this);
            content += "<div class=\"gcimagecontainer\"><img class=\"expectedconditions\" src=\"" + image.attr("src") + "\" width=\"200\" title=\"" + image.attr("title") + "\"/><div>" + image.attr("title") + " <a target=\"_blank\" href=\"" + image.attr("href") + "\">More details...</a></div></div>";  
        });
        content += "</div>";
    }
 
    // add antecedent rainfall text if applicable
    var arText = getAntecedentRainfall(mfc);
    content += arText;

	$("#mountainText").append(content);
}

function calcWarnLevel(r,e) {
	var col;
	if (parseInt(e,10) === 0) {if (r<40) {col=0;} else if (r>39&&r<60) {col=1;} else if (r>59) {col=3;}}
	if (parseInt(e,10) === 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 sortByWarnings(a,b){
	var x = a.split(" ")[5];
	var y = b.split(" ")[5];
	return ((x<y)? -1 : 1);
}

function displaySingleRegionWarnings(reg) {
	var warningSort = []; //Array for sorting warnings by severity
	var content = "";
    var i, j;
	if (feedStatus.warnings) {
		var regions = warningsDoc.getElementsByTagName("region");
		var found = 0;
		for (i=0, len=regions.length; i < len; i++) {
			content = "";
			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');
				//EMERGENCY=FLASH
				if (warnCat==="EMERGENCY"){warnCat="FLASH";}
				var warnStart = regions[i].parentNode.getAttribute('valid_from');
				var warnEnd = regions[i].parentNode.getAttribute('valid_to');
				var warnIssue = regions[i].parentNode.getAttribute('issue_time');
                var warnText;
				if (regions[i].parentNode.getElementsByTagName('warning_text')[0].hasChildNodes()) {
					warnText="";
					var tempwarnText = regions[i].parentNode.getElementsByTagName('warning_text')[0].childNodes;
					for (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 (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>';
				warningSort.push(content);
			}
		}
	}
	warningSort = warningSort.sort(sortByWarnings).reverse();
	var regChoice = regNames[reg];
	if (! feedStatus.warnings) {
		content = "<p>" + warningsErrorMessage + "</p>";
	} else if (found === 0) {
		content = "<p>" + noWarningsMessage+regChoice + ".</p>";
	}
	$("#mainWarningText").html("");
	for (i = 0; i < warningSort.length; i++) {
		$("#mainWarningText").append(warningSort[i]);
	}
	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);
	}
    $("#mainWarningText").append(content);
}

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',this); return true;
	});        
	GEvent.addListener(marker,"mouseout", function () {
		hideTooltip('regTT2'); return true;
	});
	return marker;
}

function addMarkers(data) {
	mm.clearMarkers();
    pmm.clearMarkers();
	var m, point, name, id, val, zoommin, zoommax = "", marker, type, markers = data;
    for (var i=0, len = markers.length; i < len; i++) {
        m = markers[i];
		if (m.s == 1){
			point = new GLatLng(parseFloat(m.l), parseFloat(m.g));
			name = m.n;
			id = m.i;
			val = m.r;
			zoommin = m.z;
			type = m.o;
			marker = createMarker(point, name, id);
			mm.addMarker(marker, zoommin, zoommax);
			markerArray[id] = marker;
			markerArray[id].zoommin = zoommin;
			markerArray[id].zoommax = zoommax;
			markerArray[id].type = type;
			// as well the markers, we create a duplicate set that we use to show gust data as well as wind data.  
			var dupPoint = point;
			var dupMarker = createMarker(dupPoint, name, id);
			mm.addMarker(dupMarker, zoommin, zoommax);
			dupMarkerArray[id] = dupMarker;
			dupMarkerArray[id].zoommin = zoommin;
			dupMarkerArray[id].zoommax = zoommax;
		}
	}
	mm.refresh();
	pmm.refresh();
}

function getWarnings() {
	return false;
	var request = GXmlHttp.create();
	var currentTime = new Date();
	request.open("GET", warnFile, 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() {
	MetOffice.locations.getLocList(function(){
		MetOffice.locations.getObsList(function(){
			addMarkers(MetOffice.locations.list);
		});
	});
}

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), parseInt(zoom, 10));
}

function showTags() {
	var out = '';
	for (var x in myLocArray) {
    if (myLocArray.hasOwnProperty(x)) {
		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) {
    if (myViewArray.hasOwnProperty(x)) {
		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 favCookie() {
	var cookieString = "";
	for (var l in myLocArray) {
    if (myLocArray.hasOwnProperty(l)) {
		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) {
    if (myViewArray.hasOwnProperty(l)) {
        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) {
        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 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 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 (myLocArray.hasOwnProperty(x)) {
		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 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 (myViewArray.hasOwnProperty(x)) {
		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 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 getMaxPollenDay(days){
	for (i=0,lenDays=days.length;i<lenDays;i++){
		if(pollenVal[days[i].pollenLevel]>pollenDayMax[i]){pollenDayMax[i]=pollenVal[days[i].pollenLevel];}
	}
}

function changePollenMarkers(day){
	var tooltipText;
	for (var i in pMarkerArray) {
		if (pMarkerArray.hasOwnProperty(i)) {
			tooltipText = pMarkerArray[i].days[day];
			
			pMarkerArray[i].image_ ="/public/pws/invent/lib/images/pollensymbols/"+tooltipText.pollenLevel+".gif";			
			// var pToolTip = {};
			// pToolTip;
			pMarkerArray[i].ttTxt = tooltipText.regionName+"<br><span style='color:"+pollenColor[pollenVal[tooltipText.pollenLevel]]+";'>"+pollenDesc[tooltipText.pollenLevel]+"</span>"
			+tooltipText.pollenDesc;
		}
    }
	pmm.refresh();

}

function buildPollenTL(){
	//local variables 
	for (var w=0,lenw=pollenDayMax.length;w<lenw;w++){
		if (pollenDayMax[w] == -99){break;}
	}
	var lastPollenDay = w;
	var tlDate;
	var tlLength = 340;
	var tsLength;
	var tlCol = "#cf3";
    var i;
	
	// empty timeline
	$('#tlContainer').empty();
	
	var issues = $(pollenData).find('issue');
	tlDate = $(issues[0]).attr('at');
	times = []; //clear times array
	
	var pIssueDate = toDateObj(tlDate);
	var temp = toDateObj(tlDate), removedDays = 0;
	
	for (i=0;i<lastPollenDay;i++){
		var today = new Date();
		today.setHours(0,0,0,0);
		if (new Date(temp)<today){
			removedDays ++;
		}else{
			times.push(new Date(temp)); //add date to times array
		}
		temp.setDate(temp.getDate()+1);	
	}
	
	//Temp date
	pIssueDate = pIssueDate.toTimeString() + " " + pIssueDate.toDateString();
	tsLength = (tlLength / times.length) - 1;
	//create timeline
	//create timesteps
	for (i=0; i < times.length; i++) {
		tlCol = "#cf3"; //get border bottom colour
		tlCol = pollenColor[pollenDayMax[i+removedDays]];
		var item = '<li id="tlPos'+(i+removedDays)+'" 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);
	}
	$('#tlPos0').css("background-color", pollenColor[pollenDayMax[0]]);		

	//update timeline details
	$('#layerKey'+currentLayer).slideUp(300);
	$('#items .layerKey').hide();
	$('#frameNav').css('color','#cf3');
	$("#date").html(times[0].toDateString());
	$("#time").empty();
	$('#tlPos'+removedDays).addClass(selectedType+'current');
	$('#map .slider').css('visibility','hidden');
	$('#rightTl').hide();
	if ($('#rightTl .playpause').attr("id")=="pause"){$('#rightTl .playpause').click();}
	
		currentLayer = -1;
		$('#prodTitle').html("Forecast Pollen").css("color","#cf3");
		$("#layerKeyPollen").slideDown(300);

	map.getMapTypes()[0].getMaximumResolution = function () {return 5;};
	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');
		changePollenMarkers(animIndx);
		//$('#tlPos'+animIndx).css("background-color", "#cf3");
		$('#tlPos'+animIndx).css("background-color", pollenColor[pollenDayMax[animIndx]]);		
		return false;
    });  
	//add timestep mouseover handling
    $('#tlContainer .timeSlot').mouseover(function () {
		update5DayTLTooltip(this.id);
    });
	//add timestep mouseout handling
    $('#tlContainer .timeSlot').mouseout(function () {
		clear5DayTLTooltip();
    });
	$('#tlPos'+removedDays).click();
	changePollenMarkers(removedDays);

}

function getFavs() {
	var favs = readCookie("favC");
	if (favs) {
		favArray = favs.substring(1).split('$');
		var name, lat, lng, point, x;
		for (x in favArray) {
        if (favArray.hasOwnProperty(x)) {
			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) {
        if (viewArray.hasOwnProperty(x)) {
			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) {
    if (myLocArray.hasOwnProperty(x)) {
		favMM.addMarker(myLocArray[x], 0);
		favCount++;
	}
    }
	favMM.refresh();
	favCookie();
}

//****************//
//** End Points **//
//****************//

//****************//
//** Initialize **//
//****************//
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.gmap) {
		clearInterval(checkLoaded);
		tilesloaded("initial");
	}
}

function initialize() {
	//TODO: this should be done in the API really
	MetOffice.locations.getObsList(function(){});
	feedStatus.gmap = false;
	feedStatus.warnings = 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), parseInt(params.zoom, 10));	// 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_LEFT",110,16));
		map.addControl(new controlBox("helpIcon","G_ANCHOR_TOP_LEFT",160,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)); 
		GEvent.addListener(map,'zoomend',function(){hideTooltip('regTT2');}); 
		geocoder = new GClientGeocoder();
		mm = new MarkerManager(map, {trackMarkers:true});
		favMM = new MarkerManager(map, {trackMarkers:true});
		pmm = new MarkerManager(map, {trackMarkers:true});
		getData();
		getFavs();
		checkForCFV();
		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, temperature, UV and Feels like temperature data is currently unavailable.";
	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.";
	pollenWarningMessage = "<em>Please note:</em> Pollen 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.";
	noWarningText = "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 &amp; Fife";
	regNames.ta = "Central Tayside &amp; Fife";
	regNames.dg = "SW Scotland, Lothian &amp; 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:#4B001E;" class="keyItem"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></div><span>-14</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#32007F;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-12</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#000082;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-10</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#0033B4;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-8</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#0000FF;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-6</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#007EFF;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-4</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#00BEFF;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>-2</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#18D78C;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>0</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#3AAE74;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>2</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#2BAA2B;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>4</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#2BC82B;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>6</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#00FF32;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>8</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#54FF00;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>10</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#A0FF00;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>12</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FFFF00;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>14</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FFCC00;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>16</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF9900;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>18</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF6600;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>20</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF5500;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>22</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF0000;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>24</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF0080;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>26</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF2391;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>28</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF5FB2;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>30</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FF87C3;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>32</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FFAFD7;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>34</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FFD7EB;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>36</span></div>' + 
		'<div class="tempMapKeyItem"><div style="background-color:#FFFFFF;" class="keyItem">&nbsp;&nbsp;&nbsp;&nbsp;</div><span>38</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["Pollen"] = '' +
		'<div class="keyContainer"">' +
		'<div style="background-color:#ffff00;width:20px;font-size:11px;text-align:center;line-height:10px;float:left;font-weight:bold;" class="keyItem">L</div> <label style="float:left;">&nbsp;&nbsp;Low</label><br>' + 
		'<div style="background-color:#FBCB01;width:20px;font-size:11px;text-align:center;line-height:10px;float:left;font-weight:bold;" class="keyItem">M</div> <label style="float:left;">&nbsp;&nbsp;Moderate</label><br>' + 
		'<div style="background-color:#FF7300;width:20px;font-size:11px;text-align:center;line-height:10px;float:left;color:#fff;font-weight:bold;" class="keyItem">H</div> <label style="float:left;">&nbsp;&nbsp;High</label><br>' + 
		'<div style="background-color:#FF0000;width:20px;font-size:11px;text-align:center;line-height:10px;float:left;color:#fff;font-weight:bold;" class="keyItem">VH</div> <label style="float:left;">&nbsp;&nbsp;Very high</label><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";
	}
*/
}
