component = {
	getAreaCode: function(lat, lon, region) {
		if (region == "ni") {
			return "ni"
		} else if (lat > 58.5) {
			return "os"
		} else if (lat > 55.5) {
			return "ngb" 
		} else if (lat > 52.5) {
			return "cgb"
		} else {
			return "sgb"
		}
	},
	formatImageSource: function(src, area, format) {
		var result = src.replace("{area}", area).replace("{format}", format);
		return result;
	},
	getQueryString: function(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 unescape(qs[1]);
	},
	getWxLabels: function() {
		var wxDesc = [];
		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";
		return wxDesc;
	},
	toDateObj: function(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;
		var newDate = new Date(year, monthNumber, ndate, hour, min);

		return newDate;
	}, 
	getUAsForDate: function(time, xml){
		//variables
		var warnTime = new Date(time);
		var warnArray = [];
		var warnAreas = [];
		var warnTest = xml.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 = component.toDateObj((warnTest[w].getAttribute('valid_from')).substring(0,10));
			var validT = component.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;
	}, 
	calcWarnLevel: function(r,e) {
		var col;
		if (e == 0) {if (r<40) {col=0;} else if (r>39&&r<60) {col=1;} else if (r>59) {col=3;}}
		if (e == 1) {if (r<20) {col=0;} else if (r>19&&r<40) {col=1;} else if (r>39&&r<60) {col=2;} else if (r>59) {col=4;}}

		return col;
	}, 
	getMaxWarning: function(xml) {
		var maxWarn = 0;
		var hdWarnImg = "";
		
		//possibly make this next section generic
		var tlDate;
		var times = [];
		var areas = [];
		var tags = xml.getElementsByTagName("warnings")[0];
		var warnsTime = (tags.getAttribute('creation').substring(0,10));
		tlDate = warnsTime;
		
		//get 5 dates
		tlDate = component.toDateObj(tlDate);
		times = [];
		var temp = new Date(tlDate);
		for (var i=1;i<6;i++){
			times.push(new Date(temp));
			temp.setDate(tlDate.getDate()+i);
		}
		for (var t=0, len1=times.length; t < len1; t++){
			areas = component.getUAsForDate(times[t], xml);
			var dayMax = 0;
			for (var a=0, len2=areas.length; a < len2; a++) {
				var risk = areas[a].getAttribute('risk'); 
				risk = risk.substring(0, risk.length - 1);
				var extreme = areas[a].getAttribute('extreme');
				var warnLevel = component.calcWarnLevel(risk,extreme);
				if (warnLevel > dayMax) {dayMax = warnLevel;}
				
			}
			if (dayMax > maxWarn) {maxWarn = dayMax;}
//			wLevels.push(dayMax);
		}
		return maxWarn
	}, 
	displayHeaderWarning: function(language, warningLabels) {
		if (warningLabels == undefined) {
			warningLabels = ["No UK Weather Warnings/Advisories have been issued", "UK Weather Advisories have been issued", "UK Weather Advisories have been issued", "UK Weather Warnings have been issued", "UK Weather Warnings have been issued"];
		}
		if (language == undefined) {
			language = "en";
		}
		// Default the link to indicate that no warnings are issued so can click through anyway
		// Language should be set so can use labels. collection
		$("#nswwsComponentWarningsLink").attr("title", labels.weather.warnings[0]);
		$.ajax({
			url: "/public/data/PWSCache/Warnings/MostSevere/All", 
			method: "GET",
			success: function(xml) {
				// The feed has been read so fill the table with green icons before finding which to change
				var weatherTypes = [ "Rain", "Wind", "Snow", "Ice", "Fog" ];
				for ( var i = 0; i < weatherTypes.length; i++ ) {
					$("#nswwsComponentWarningImg" + weatherTypes[i]).attr('src','/public/pws/lib/images/hdwarn/' + 
									weatherTypes[i].toLowerCase() + '-green.gif');
					$("#nswwsComponentWarningImg" + weatherTypes[i]).attr('title', 'No ' + component.strCapitalise(labels.weatherType[weatherTypes[i]]) + ' Warning');
					$("#nswwsComponentWarningImg" + weatherTypes[i]).attr('alt', 'No ' + component.strCapitalise(labels.weatherType[weatherTypes[i]]) + ' Warning'); 
				}
				// Select the Warning elements and apply the appropriate icon and style
				$(xml).find('Warning').each(function() {
					var $thisWarning = $(this);
					var thisWeatherType = $thisWarning.attr('type');
					var thisWeatherHighest = $thisWarning.attr('highest');
					var thisWeatherLevel = $thisWarning.attr('kind').toLowerCase();
					var thisTitle = component.strCapitalise(thisWeatherHighest) + ' ' + component.strCapitalise(thisWeatherLevel) + ' of ' + component.strCapitalise(thisWeatherType);
					var thisIcon = '#nswwsComponentWarningImg' + component.strCapitalise(thisWeatherType);
					$(thisIcon).attr('src', '/public/pws/lib/images/hdwarn/' + 
													thisWeatherType.toLowerCase() + '-' + thisWeatherHighest.toLowerCase() + '.gif');
					$(thisIcon).attr('title', thisTitle);
					$(thisIcon).attr('alt', thisTitle);
					// Change the link title to show that warnings have been issued using the messages based on old 0-4 ratings
					$("#nswwsComponentWarningsLink").attr("title", labels.weather.warnings[4]);
				})
			},
			error: function() {
				$("#nswwsComponentWarningsLink").attr("title", "Warning data could not be retrieved");
			},
			timeout: 15000,
			cache: true
		});
	},     
	strCapitalise: function(inStr) {
		// Capitalise the input string
		var _str = new String();
		try {
			_str = inStr;
			if (_str.length) {
				_str = _str.substring(0,1).toUpperCase() + _str.substring(1).toLowerCase();
			} else {
				_str = "";
			}
			return _str;
		}
		catch (err) {
			return inStr;
		}
	},
	paraFormat: function(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;
    }
	
}

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);
    }

    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

Date.prototype.componentDateFormat = function (monthLabels) {
	var date = this;
    var monthName = function(month) {
        months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
        if (typeof(monthLabels) == "undefined") {
            return months[month];
        } else {
            return monthLabels[months[month]];
        }
    }
	var returnValue = (date.getDate() < 10 ? "0" : "") + date.getDate() + " " + monthName(date.getMonth()) + " " + date.getFullYear() + ", " + (date.getHours() < 10 ? "0" : "") + date.getHours() + ":" + (date.getMinutes() < 9 ? "0" : "") + date.getMinutes();
	return returnValue;
}

