/**
 * @package OnweerOnline StormTrack
 * @version 1.0
 * @author Benjamin Sinke
 */

var dt = new Date();
var LIVE = {
	REQUEST_INTERVAL: 4000,
	DATE: new Date(),
	LAST_UPDATE: (dt.getTime() * 1000)
}

if (!google.maps.Polygon.prototype.getBounds) {

	google.maps.Polygon.prototype.getBounds=function(){
	    var bounds = new google.maps.LatLngBounds()
	    this.getPath().forEach(function(element,index){bounds.extend(element)})
	    return bounds
	}

}

window.apiKeys = [
	'ed8ba7fe2c5fa1459abb4e9fc932ebd9',
	'1448533bec29a51ccf20ef020b2fc906',
	'c6f44ce9e4d045dca2b59890fedcb248',
	'49c10ae66672a55d2b1e1824910c0730',
	'b5d4372f24520693ae9746dd32c7b680',
];

 var plottedStorms = [];
 var plottedWarnings = [];
 var plottedChasers = [];
 var plottedWebcams = [];
 var stormLines = [];
 var plottedLines = [];
 var plottedTemperatures = [];
 var plottedWindSpeeds = [];
 var plottedRadarImages = [];
 var plottedSatteliteImages = [];
 var plottedEarthquakes = [];
 var plottedTotals = [];
 var plottedCape = [];
 var plottedProvinces = [];
 var liveLightning;

 var mapStyle = [{"featureType":"all","elementType":"labels.text.fill","stylers":[{"color":"#000000"},{"saturation":-100},{"lightness":40}]},{"featureType":"all","elementType":"labels.text.fill","stylers":[{"color":"#000000"},{"saturation":0},{"lightness":40}]},{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#000000"},{"lightness":16}]},{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"weight":1.2},{"lightness":54}]},{"featureType":"administrative","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"administrative.country","elementType":"geometry","stylers":[{"visibility":"simplified"}]},{"featureType":"administrative.neighborhood","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"administrative.land_parcel","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":25}]},{"featureType":"landscape.man_made","elementType":"all","stylers":[{"lightness":"3"}]},{"featureType":"poi","elementType":"all","stylers":[{"visibility":"off"}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":21}]},{"featureType":"road","elementType":"geometry","stylers":[{"visibility":"simplified"}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#000000"},{"lightness":17}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#000000"},{"weight":0.2},{"lightness":29}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":18}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":16}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#000000"},{"lightness":19}]},{"featureType":"water","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"water","elementType":"geometry","stylers":[{"color":"#5F9F9F"},{"lightness":-25}]},{"featureType":"road","elementType":"labels","stylers":[{"visibility":"off"}]},{"featureType":"administrative.neighborhood","elementType":"labels","stylers":[{"visibility":"on"},{"invert_lightness":false},{"lightness":0}]},{"featureType":"administrative.neighborhood","elementType":"labels.text.fill","stylers":[{"lightness":60}]},{"featureType":"administrative.locality","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"administrative.locality","elementType":"labels.text.fill","stylers":[{"lightness":80}]},{"featureType":"landscape","elementType":"labels.text.fill","stylers":[{"lightness":50}]},{"featureType":"landscape.natural","elementType":"geometry.fill","stylers":[{"lightness":10}]},{"featureType":"administrative.country","elementType":"all","stylers":[{"visibility":"on"}]},{"featureType":"administrative.country","elementType":"labels.text.fill","stylers":[{"weight":0.1},{"lightness":90}]},{"featureType":"transit.station","elementType":"geometry.fill","stylers":[{"visibility":"simplified"},{"invert_lightness":false},{"saturation":0},{"lightness":0}]}];

var stormAges = [[1,0.7], [0.5,0.4], [0.3,0.1]];
var stormZs = [3, 2, 1];
var stormIntensities = ['#00f800', '#f8e400', '#f87b00', '#f82900', '#bb00f8'];

var stormTrack = {

	initMap: function(_html) {
		window.currentMapZoomState = 7;
		window.allowStrikeLoading = true;

		function initializeSt() {
			var mapOptions = {
				//scrollwheel: false,
				zoom: 7,
				center: new google.maps.LatLng(51.913481, 5.110484),
				styles: mapStyle,
				zoomControl: true,
		        zoomControlOptions: {
		            position: google.maps.ControlPosition.LEFT_CENTER
		        },
				mapTypeControl: false,
				fullscreenControl: false,
		        streetViewControl: false,
		        streetViewControlOptions: {
		            position: google.maps.ControlPosition.LEFT_TOP
		        },
				gestureHandling: 'greedy'
			};

			window.stMap = new google.maps.Map(document.getElementById('stmap'), mapOptions);

			google.maps.event.addListener(window.stMap, 'idle', function() {
				_strikeLoadingAjax = setTimeout(function() {
					if(window.allowStrikeLoading) {
						getStrikeAjax();
					}
				}, 1000);
			});

			google.maps.event.addListener(window.stMap, 'dragstart', function() {
				window.allowStrikeLoading = true;
				if(typeof _strikeLoadingAjax != 'undefined') {
					clearTimeout(_strikeLoadingAjax);
				}
			});

			google.maps.event.addListener(window.stMap, 'zoom_changed', function() {
				if(stMap.getZoom() < window.currentMapZoomState) {
					window.allowStrikeLoading = true;
				} else {
					window.allowStrikeLoading = false;
				}

				if(typeof _strikeLoadingAjax != 'undefined') {
					clearTimeout(_strikeLoadingAjax);
				}
			});
		}

		//google.maps.event.addDomListener(document.getElementsByTagName('body'), 'load', initializeSt);
		$(document).ready(function() {
			initializeSt();

			// google.maps.event.addListener(stMap, 'zoom_changed', function() {
			//     zoomLevel = stMap.getZoom();
			//     if(typeof heatmap != 'undefined') {
			//         if(zoomLevel > 8) {
			//             heatmap.setMap(stMap);
			//         } else {
			// 			heatmap.setMap(null);
			// 		}
			//     }
			// });
		});

	},

	showTracker: function(_html) {
		var _action = _html.find('.oo-top-bar-st, .oo-menu-st');
		_action.click(function() {

			if(typeof window.stMap == 'undefined') {
				stormTrack.initMap(_html);
			}

			_html.find('#map_legend input[type=checkbox]:checked').first().click().click();

			stormTrack.plotStorms();
			stormTrack.plotNationalWeatherServiceWarnings();
			stormTrack.plotChasers();
			stormTrack.plotTemperatures();
			stormTrack.getLatestIndices();
			stormTrack.cacheIndices();
			//stormTrack.plotQuakes();
			//stormTrack.plotStormTracks();
			stormTrack.plotLiveStrikes();
			stormTrack.plotWarningCodes(_html);

			getStrikeAjax();

			if(typeof loadEstofex != "undefined") {
				loadEstofex();
			}

			// Broken, needs RWS Update

			// if(typeof loadSaltSpreaders != "undefined") {
			// 	loadSaltSpreaders();
			// }

			if(typeof loadGmapIcons != "undefined") {
				loadGmapIcons(userIcons);
			}

			refreshStorms = setInterval(function() {
				stormTrack.plotStorms();
				stormTrack.plotNationalWeatherServiceWarnings();
				stormTrack.plotChasers();
				//stormTrack.plotQuakes();
				//stormTrack.plotStormTracks();

			}, ((1000 * 60) * 5));

			refreshTemperatures = setInterval(function() {
				stormTrack.plotTemperatures();
			}, ((1000 * 60) * 10));

			_html.find('.st-container').show();
			google.maps.event.trigger(window.stMap, 'resize');
			stMap.setCenter({lat: 51.913481, lng: 5.110484});

		});

	},

	closeTracker: function(_html) {

		var _action = _html.find('.st-map-close');
		_action.click(function() {
			_html.find('.st-container').hide();
			clearInterval(refreshStorms);
			clearInterval(refreshTemperatures);
			clearInterval(liveLightning);
		});

	},

	toggleMapcontrols: function(_html) {

		var _action = _html.find('.button.apply, .cancel, .st-map-layers');
		_action.click(function() {
			_html.find('.st-map-layer-select').fadeToggle('fast');
		});
	},

	plotStorms: function(_html) {

		function addStrikeCount(event) {
			infoWindow.setOptions({
			  maxWidth: 400
			});

		  	infoWindow.setContent('<strong style="display: block; text-align: center; font-size: 18px;">'+this.stormStrikes+'</strong><br>Ontladingen tussen '+this.stormMinOccurrance+' en '+this.stormMaxOccurrance);
			infoWindow.setPosition(event.latLng);
		  	infoWindow.open(stMap);

		}

		var heatMapData = [];

		$.ajax({
			url: '/stormtrack/index.php',
			type: 'GET',
			dataType: 'JSON',
			success: function(d) {

				$.each(plottedStorms, function(k, strm) {
					strm.setMap(null);
				});

				// if(typeof heatmap != 'undefined') {
				// 	heatmap.setMap(null);
				// }

				plottedStorms = [];

				$.each(d, function(_age, _data) {

					//var map = window.stMap;

					if(_data.storms) {
						$.each(_data.storms, function(i, storm) {

							if(storm.stormIntensity > -1) {
								var polyLine = [];

								var stormBoundingBox = new google.maps.LatLngBounds();
								$.each(storm.stormBounds, function(i, bounds) {
							    var point = new google.maps.LatLng(parseFloat(bounds[0]), parseFloat(bounds[1]));
						        polyLine.push(point);
						        stormBoundingBox.extend(point);
						    });

							    var stormOutline = new google.maps.Polygon({
							        path: polyLine,
							        strokeColor: stormIntensities[storm.stormIntensity],
							        fillColor: stormIntensities[storm.stormIntensity],
							        fillOpacity: stormAges[_age][1],
							        strokeOpacity: stormAges[_age][0],
							        strokeWeight: 2,
							        zIndex: stormZs[_age],
							        stormStrikes: storm.stormStrikes,
									    stormMinOccurrance: storm.stormMinOccurrance,
									    stormMaxOccurrance: storm.stormMaxOccurrance,
											stormCenter: stormBoundingBox.getCenter(),
											stormAge: _age
							    });

							    stormOutline.setMap(window.stMap);
							    plottedStorms.push(stormOutline);

							    stormOutline.addListener('click', addStrikeCount);
								infoWindow = new google.maps.InfoWindow;

								heatMapData.push({
									location: stormBoundingBox.getCenter(),
									weight: storm.stormStrikes
								});


							    // var stormCircle = new google.maps.Circle({
								//     strokeColor: stormIntensities[storm.stormIntensity],
							    //     fillColor: stormIntensities[storm.stormIntensity],
							    //     fillOpacity: stormAges[_age][1],
							    //     strokeOpacity: stormAges[_age][0],
							    //     strokeWeight: 2,
							    //     zIndex: stormZs[_age],
							    //     center: stormBoundingBox.getCenter(),
								//     radius: (google.maps.geometry.spherical.computeDistanceBetween(stormBoundingBox.getNorthEast(), stormBoundingBox.getSouthWest()) / 4),
								//     stormStrikes: storm.stormStrikes,
								//     stormMinOccurrance: storm.stormMinOccurrance,
								//     stormMaxOccurrance: storm.stormMaxOccurrance,
								// 	stormCenter: stormBoundingBox.getCenter(),
							    // });
								//
							    // stormCircle.setMap(window.stMap);
							    // plottedStorms.push(stormCircle);
								//
							    // stormCircle.addListener('click', addStrikeCount);
								// infoWindow = new google.maps.InfoWindow;

							}

						});
					}

				});

				// heatmap = new google.maps.visualization.HeatmapLayer({
				//   data: heatMapData,
				//   radius: 200,
				//   dissipating: true
				// });

			}
		});

	},

	applyLayer: function(_html) {

		var _action = _html.find('.apply');
		_action.click(function() {

			var _what = _html.find('.st-map-layer-select input:checked').val();
			switch(_what) {
				case 'none':
					window.stMap.overlayMapTypes.clear();

					if(refreshTemperatures) {
						clearInterval(refreshTemperatures);
					}

					if(typeof refreshWindSpeeds != 'undefined') {
						clearInterval(refreshWindSpeeds);
					}

					if(typeof refreshDopplerLayer != 'undefined') {
						clearInterval(refreshDopplerLayer);
					}

					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					$.each(plottedWindSpeeds, function(i,o) {
						o.setMap(null);
					});

					$.each(plottedRadarImages, function(i,o) {
						o.setMap(null);
					});

					$.each(plottedTemperatures, function(i,o) {
						o.setMap(null);
					});

					break;

				case 'cloudLayer':
					stormTrack.plotClouds();
					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					$.each(plottedRadarImages, function(i,o) {
						o.setMap(null);
					});

					if(refreshDopplerLayer) {
						clearInterval(refreshDopplerLayer);
					}

					break;

				case 'precipLayer':
					stormTrack.plotPrecip();
					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					$.each(plottedRadarImages, function(i,o) {
						o.setMap(null);
					});

					if(refreshDopplerLayer) {
						clearInterval(refreshDopplerLayer);
					}

					break;

				case 'dopplerLayer':

					window.stMap.overlayMapTypes.clear();
					stormTrack.plotLatestDopplerEcho();
					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					refreshDopplerLayer = setInterval(function() {
						stormTrack.plotLatestDopplerEcho();
					}, ((1000 * 60) * 2));
					break;

				case 'temperatureLayer':
					stormTrack.plotTemperatures();
					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					if(refreshWindSpeeds) {
						clearInterval(refreshWindSpeeds);
					}

					$.each(plottedWindSpeeds, function(i,o) {
						o.setMap(null);
					});

					break;

				case 'windSpeedLayer':
					stormTrack.plotWindSpeeds();
					if(typeof trafficLayer != 'undefined') {
						stormTrack.clearTrafficLayer();
					}

					refreshWindSpeeds = setInterval(function() {
						stormTrack.plotWindSpeeds();
					}, ((1000 * 60) * 10));

					if(refreshTemperatures) {
						clearInterval(refreshTemperatures);
					}

					$.each(plottedTemperatures, function(i,o) {
						o.setMap(null);
					});

					break;

				case 'trafficLayer':
					stormTrack.plotTrafficLayer();

					break;


			}

		});

	},

	plotClouds: function() {

		cloudLayer = new google.maps.ImageMapType({
			getTileUrl: function(coord, zoom) {
				var normalizedCoord = getNormalizedCoord(coord, zoom);
				if (!normalizedCoord) {
			    	return null;
			  	}
			  	var bound = Math.pow(2, zoom);
			  	return 'http://tile.openweathermap.org/map/clouds/'+zoom+'/'+normalizedCoord.x+'/'+normalizedCoord.y+'.png?appid='+window.apiKeys[Math.floor((Math.random() * (apiKeys.length)))];
			},
			tileSize: new google.maps.Size(256, 256),
			maxZoom: 8,
			minZoom: 0,
			name: 'cloudLayer',
			opacity: 0.4
		});

		function getNormalizedCoord(coord, zoom) {
			var y = coord.y;
			var x = coord.x;
			var tileRange = 1 << zoom;

			if (y < 0 || y >= tileRange) {
			  return null;
			}

			if (x < 0 || x >= tileRange) {
				x = (x % tileRange + tileRange) % tileRange;
			}

			return {
				x: x,
				y: y
			};
		}

		window.stMap.overlayMapTypes.insertAt(0, cloudLayer);

	},

	plotPrecip: function() {

		precipLayer = new google.maps.ImageMapType({
			getTileUrl: function(coord, zoom) {
				var normalizedCoord = getNormalizedCoord(coord, zoom);
				if (!normalizedCoord) {
			    	return null;
			  	}
			  	var bound = Math.pow(2, zoom);
			  	return 'http://tile.openweathermap.org/map/precipitation/'+zoom+'/'+normalizedCoord.x+'/'+normalizedCoord.y+'.png?appid='+window.apiKeys[Math.floor((Math.random() * (apiKeys.length)))];
			},
			tileSize: new google.maps.Size(256, 256),
			maxZoom: 8,
			minZoom: 0,
			name: 'precipLayer',
			opacity: 0.4
		});

		function getNormalizedCoord(coord, zoom) {
			var y = coord.y;
			var x = coord.x;
			var tileRange = 1 << zoom;

			if (y < 0 || y >= tileRange) {
			  return null;
			}

			if (x < 0 || x >= tileRange) {
				x = (x % tileRange + tileRange) % tileRange;
			}

			return {
				x: x,
				y: y
			};
		}

		window.stMap.overlayMapTypes.insertAt(0, precipLayer);

	},

	plotNationalWeatherServiceWarnings: function() {

		$.each(plottedWarnings, function(i, o) {
			o.setMap(null);
		});

		function addWarningText(event) {
			 infoWindow.setOptions({
			        maxWidth: 600
			 });


		     infoWindow.setContent('<strong style="display: block; text-align: center; font-size: 18px;">'+this.warningType+'</strong><br>'+this.warningText);
			 infoWindow.setPosition(event.latLng);
		     infoWindow.open(stMap);

		}

		var warningDisplayTypes = [
			'Severe Thunderstorm Warning',
			'Tornado Warning',
			'Tornado Watch',
			'Tornado Emergency',
			'Tsunami Warning',
			'Hurricane Warning',
			'Tropical Storm Warning'
		];

	    var liveTickerWarnings = [
		  "Severe Thunderstorm Warning",
	      "Tornado Warning",
	      "Tornado Emergency",
		  "Tsunami Warning",
		  "Tropical Storm Warning",
		  "Hurricane Warning"
	    ];

		var warningDisplayColors = {
			"Severe Thunderstorm Warning":"#ffe400",
			"Tornado Warning":"#2f78ff",
			"Tornado Watch":"#2f78ff",
			"Tornado Emergency":"#2f78ff",
			"Tsunami Warning":"#FF0000",
			"Hurricane Warning":"#FF0000",
			"Tropical Storm Warning":"#2f78ff"
		};

		$.ajax({
			url: 'https://api.weather.gov/alerts/active?status=actual',
			dataType: 'JSON',
			success: function(wd) {
				var nwsWarnings = wd.features;

				$.each(nwsWarnings, function(i, nwsWarning) {
					var _this = nwsWarning;
					if(warningDisplayTypes.indexOf(_this.properties.event) > -1  && (_this.geometry && _this.geometry.type == 'Polygon')) {

						var _type = _this.properties.event;
						var warningPath = [];

						$.each(_this.geometry.coordinates, function(i, latLongArrays) {
							$.each(latLongArrays, function(i, latLong) {
								var anchorPoint = {lat: latLong[1], lng: latLong[0]};
								warningPath.push(anchorPoint);
							});
						});

						var lineSymbol = {
				          path: 'M 0,-1 0,1',
				          strokeOpacity: 1,
				          scale: 2
				        };

						var nwsPoly = new google.maps.Polygon({
					        path: warningPath,
					        strokeColor: warningDisplayColors[_type],
					        fillColor: warningDisplayColors[_type],
					        fillOpacity: 0.3,
					        strokeOpacity: 0,
					        warningType: _type,
					        warningText: _this.properties.description.split('\n').join('<br/>')
				        });

				        var nwsPolyOutline = new google.maps.Polyline({
						    strokeColor: warningDisplayColors[_type],
						    strokeOpacity: 0,
						    fillOpacity: 0,
						    icons: [{
						      icon: lineSymbol,
						      offset: '0',
						      repeat: '10px'
						    }],
						    path: warningPath,
						});

						if(window.stMap) {
						    nwsPoly.setMap(window.stMap);
						    nwsPolyOutline.setMap(window.stMap);
						    nwsPoly.addListener('click', addWarningText);
						    infoWindow = new google.maps.InfoWindow;

						    plottedWarnings.push(nwsPoly);
						    plottedWarnings.push(nwsPolyOutline);
						}

			            if(liveTickerWarnings.indexOf(_type) > -1) {
				            $.ajax({
				                url: '/stormtrack/index.php',
				                type: 'POST',
				                data: {action: 'createLivetickerEvent', event: _type, area: _this.properties.areaDesc}
				            });
			            }
					}
				});
			}
		});
	},

	plotChasers: function() {

		$.each(plottedChasers, function(i, o) {
			o.setMap(null);
		});

		function addChaserText(event) {
			infoWindow.setOptions({
			        maxWidth: 300
			});

		  infoWindow.setContent('<strong style="display: block; text-align: center; font-size: 18px;">'+this.chaseTitle+'</strong><br><strong>Door: '+this.chaseOwner+'</strong><br>Laatste update: '+this.chaseUpdate+'<br><a style="border-radius: 3px; display: block; font-weight: bold; color: #fff; text-decoration: none; font-size: 13px; height: 30px; line-height: 28px; text-align: center; background: #fdad2a; margin-top: 15px;" class="button main" target="_blank" href="'+this.chaseUrl+'">Bekijk Chasers\' LiveStream</a>');
			infoWindow.setPosition(event.latLng);
		  infoWindow.open(stMap);

		}

		$.ajax({
			url: 'https://www.onweer-online.nl/cache/chasers.json',
			type: 'POST',
			dataType: 'JSON',
			data: {action: 'getChasers'},
			success: function(chasers) {

				if(chasers) {
					$.each(chasers, function(i, chaser) {

						var chaseTrail = [];
						var chaseTrailLength = chaser.wayPoints.length;

						$.each(chaser.wayPoints, function(i, wayPoint) {
							var chaseLocation = new google.maps.LatLng(parseFloat(wayPoint.lat),parseFloat(wayPoint.lng));
							chaseTrail.push(chaseLocation);
						});

						var chaserPath = new google.maps.Polyline({
								strokeColor: "#00b4ff",
								strokeOpacity: 0.7,
								strokeWidth: 7,
								fillOpacity: 0.3,
								path: chaseTrail,
						});

						var chaserIcon = new google.maps.MarkerImage('/images/chaser-location.png?r=38902490', new google.maps.Size(30, 30), new google.maps.Point(0, 0), new google.maps.Point(15, 15));

						var pPos = new google.maps.LatLng(parseFloat(chaser.wayPoints[(chaseTrailLength - 1)].lat), parseFloat(chaser.wayPoints[(chaseTrailLength - 1)].lng));
						var marker = new google.maps.Marker({
							position: pPos,
							map: stMap,
							icon: chaserIcon,
							chaseTitle: chaser.chase_name,
							chaseUrl: chaser.chase_url,
							chaseUpdate: chaser.last_update,
							chaseOwner: chaser.user
						});

						plottedChasers.push(marker);
						plottedChasers.push(chaserPath);

						marker.addListener('click', addChaserText);
						chaserPath.addListener('click', addChaserText);
						infoWindow = new google.maps.InfoWindow;

						chaserPath.setMap(stMap);

					});
				}
			}
		})

	},

	plotStormTracks: function() {
		$.each(plottedLines, function(i, o) {
			o.setMap(null);
		});

		function rad(x) {return x*Math.PI/180;}

			$.each(plottedStorms, function(is, st) {
				var stormCenter = st.stormCenter;
				var stormAge = st.stormAge;

			  var stormRadius = {
					 strokeColor: '#FF0000',
					 strokeOpacity: 0.8,
					 strokeWeight: 2,
					 center : new google.maps.LatLng(parseFloat(stormCenter.lat()), parseFloat(stormCenter.lng())),
					 radius : 15000
			  }

			  var stormCompare = new google.maps.Circle(stormRadius);

		    $.each(plottedStorms, function(i, storm) {

					var stormPos = new google.maps.LatLng(parseFloat(storm.stormCenter.lat()), parseFloat(storm.stormCenter.lng()));

					if (google.maps.geometry.spherical.computeDistanceBetween(stormPos, stormCompare.getCenter()) <= stormCompare.getRadius() && storm.stormAge == (stormAge - 1)) {
						stormLines.push([{lat: stormCenter.lat(), lng: stormCenter.lng()}, {lat: storm.stormCenter.lat(), lng: storm.stormCenter.lng()}]);
					}
				});
			});

			$.each(stormLines, function(i, stormLine) {
				var stormPath = [];

				$.each(stormLine, function(i, stormLinePoint) {
					var stormLocation = new google.maps.LatLng(parseFloat(stormLinePoint.lat),parseFloat(stormLinePoint.lng));
					stormPath.push(stormLocation);
				});

				var stormTrack = new google.maps.Polyline({
						strokeColor: "#fff",
						strokeOpacity: 0.8,
						strokeWidth: 6,
						fillOpacity: 0.3,
						path: stormPath,
						zIndex: 100
				});

				stormTrack.setMap(window.stMap);
				plottedLines.push(stormTrack);
			});
	},

	plotWebcams: function() {

		function addCamText(event) {
			infoWindow.setOptions({
			        maxWidth: 600
			});

			if(this.webcamType == 'youtube') {
				 infoWindow.setContent('<div style="margin-left: 20px; color: #2b3050;"><strong style="display: block; font-size: 18px;">Webcam '+this.webcamTitle+'</strong><img src="http://www.onweer-online.nl/images/icon-altitude-gm-purple.png" style="width: 17px; opacity: 0.7;"> <em>Hoogte: '+this.webcamAlt+' m.</em><br><br><strong>'+this.webcamInfo+'</strong><br><br><iframe width="560" height="315" src="https://www.youtube.com/embed/'+this.webcamUrl+'" frameborder="0" allowfullscreen></iframe></div>');
			} else if(this.webcamType == 'fullscreen') {
				 infoWindow.setContent('<div style="margin-left: 20px; color: #2b3050;"><strong style="display: block; font-size: 18px;">Webcam '+this.webcamTitle+'</strong><img src="http://www.onweer-online.nl/images/icon-altitude-gm-purple.png" style="width: 17px; opacity: 0.7;"> <em>Hoogte: '+this.webcamAlt+' m.</em><br><br><strong>'+this.webcamInfo+'</strong><br><br><iframe src="'+this.webcamUrl+'" style="width: 560px; height: 300px; border: none;"></iframe></div>');
			} else {
				 infoWindow.setContent('<div style="margin-left: 20px; color: #2b3050;"><strong style="display: block; text-align: center; font-size: 18px;">Webcam '+this.webcamTitle+'</strong><img src="http://www.onweer-online.nl/images/icon-altitude-gm-purple.png" style="width: 17px; opacity: 0.7;"> <em>Hoogte: '+this.webcamAlt+' m.</em><br><br><strong>'+this.webcamInfo+'</strong><a style="padding: 0 30px; border-radius: 3px; display: block; font-weight: bold; color: #fff; text-decoration: none; font-size: 13px; height: 30px; line-height: 28px; text-align: center; background: #fdad2a; margin-top: 15px;" class="button main" target="_blank" href="'+this.webcamUrl+'">Bekijk Webcam</a></div>');
			}

			infoWindow.setPosition(event.latLng);
		  infoWindow.open(stMap);

		}

		$.ajax({
			url: '/stormtrack/index.php',
			type: 'POST',
			dataType: 'JSON',
			data: {action: 'getWebCams'},
			success: function(webcams) {
				$.each(plottedWebcams, function(i, o) {
					o.setMap(null);
				});

				$.each(webcams, function(i, webcam) {

					var chaserIcon = new google.maps.MarkerImage('/images/webcam-icon.png?r=38902490', new google.maps.Size(25, 30), new google.maps.Point(0, 0), new google.maps.Point(12, 30));

					var pPos = new google.maps.LatLng(parseFloat(webcam.lat), parseFloat(webcam.lng));
					var marker = new google.maps.Marker({
						position: pPos,
						map: stMap,
						icon: chaserIcon,
						webcamType: webcam.type,
						webcamUrl: webcam.url,
						webcamInfo: webcam.info,
						webcamTitle: webcam.naam,
						webcamAlt: webcam.alt,
						title: webcam.naam
					});

					plottedWebcams.push(marker);
					marker.addListener('click', addCamText);
				});
			}
		});
	},

	clickCamButton: function(_html) {
		var _action = _html.find('.st-map-webcams');

		_action.click(function() {
			var _this = $(this);
			if(_this.hasClass("visible")) {
				_this.text('Toon Webcams').removeClass('visible');
				$.each(plottedWebcams, function(i, o) {
					o.setMap(null);
				});
			} else {
				_this.text('Verberg Webcams').addClass('visible');
				stormTrack.plotWebcams();
			}
		});

	},

	plotTemperatures: function() {
		var createWeatherNoticesInTicker = true;

		$.ajax({
			url: 'https://www.onweer-online.nl/cache/knmiObservations.json',
			type: 'GET',
			dataType: 'JSON',
			success: function(observations) {

				$.each(plottedTemperatures, function(i, o) {
					o.setMap(null);
				});

				$.each(observations.stations, function(intStationIndex, oStation) {

					if(oStation.temperature) {
						var _markerOffset = stormTrack.getMarkerBasedOnTemperature(parseFloat(oStation.temperature));


						var _latLong = stormTrack.getLatLongForStation(oStation.station);
						var _icon = new google.maps.MarkerImage('/images/temperature_markers.png?r=3890249r3', new google.maps.Size(30, 35), new google.maps.Point(_markerOffset, 0), new google.maps.Point(15, 35));

						var _tempMarker = new MarkerWithLabel({
					        position: _latLong,
					        map: stMap,
					        labelContent: oStation.temperature,
					        labelAnchor: new google.maps.Point(15,28),
					        labelClass: "labeled-marker-inner", // the CSS class for the label
					        labelInBackground: false,
					        icon: _icon,
							clickable: false,
							title: oStation.station
					    });


						if(_tempMarker.position)
							plottedTemperatures.push(_tempMarker);

						if(createWeatherNoticesInTicker) {
							// console.log('DEBUG: Weather Notices from Ticker enabled');
							// console.log('DEBUG: Humidity - '+oStation.humidity);
							// console.log('DEBUG: Visibility - '+oStation.visibility);
							// console.log('DEBUG: Temperature - '+oStation.temperature);
							// console.log('DEBUG: Wind Speed - '+oStation.wind_stength);

							if(parseFloat(oStation.temperature) < 0 && parseFloat(oStation.humidity) > 95) {
								$.ajax({
				                  url: '/stormtrack/index.php',
				                  type: 'POST',
				                  data: {action: 'createLivetickerEvent', event: 'frostWarning', area: oStation.station}
				                });
							}

							if(oStation.visibility && parseFloat(oStation.visibility) < 201) {
								$.ajax({
				                  url: '/stormtrack/index.php',
				                  type: 'POST',
				                  data: {action: 'createLivetickerEvent', event: 'visibilityWarning', area: oStation.station}
				                });
							}
						}
					}

				});
			}
		})
	},

	plotWindSpeeds: function() {

		$.ajax({
			url: 'https://www.onweer-online.nl/cache/knmiObservations.json',
			type: 'GET',
			dataType: 'JSON',
			success: function(observations) {

				$.each(plottedWindSpeeds, function(i, o) {
					o.setMap(null);
				});

				$.each(observations.stations, function(intStationIndex, oStation) {

					if(oStation.wind_strength && !isNaN(oStation.wind_strength)) {

						var windSpeedInBft = Math.ceil(Math.pow(Math.pow((parseInt(oStation.wind_strength)/0.836),0.33),2));
						var _markerWindOffset = stormTrack.getMarkerBasedOnWindSpeed(windSpeedInBft);

						var _latLongWind = stormTrack.getLatLongForStation(oStation.station);
						if(_latLongWind) {
							var _iconWind = new google.maps.MarkerImage('/images/temperature_markers.png?r=38902490', new google.maps.Size(30, 35), new google.maps.Point(_markerWindOffset, 0), new google.maps.Point(35, 35));

							var _windMarker = new MarkerWithLabel({
						        position: _latLongWind,
						        map: stMap,
						        labelContent: windSpeedInBft,
						        labelAnchor: new google.maps.Point(35,28),
						        labelClass: "labeled-marker-inner", // the CSS class for the label
						        labelInBackground: false,
						        icon: _iconWind,
								clickable: false,
								title: oStation.station,
								zIndex: 99999
						    });

							plottedWindSpeeds.push(_windMarker);
						}
					}

				});
			}
		});
	},

	getMarkerBasedOnTemperature: function(intTemperature) {
		if(intTemperature >= 30) {
			var intMarkerOffset = (30 * 11);
		} else if(intTemperature < 30 && intTemperature >= 25) {
			var intMarkerOffset = (30 * 10);
		} else if(intTemperature < 25 && intTemperature >= 22) {
			var intMarkerOffset = (30 * 9);
		} else if(intTemperature < 22 && intTemperature >= 20) {
			var intMarkerOffset = (30 * 8);
		} else if(intTemperature < 20 && intTemperature >= 15) {
			var intMarkerOffset = (30 * 7);
		} else if(intTemperature < 15 && intTemperature >= 10) {
			var intMarkerOffset = (30 * 6);
		} else if(intTemperature < 10 && intTemperature >= 5) {
			var intMarkerOffset = (30 * 5);
		} else if(intTemperature < 5 && intTemperature >= 0) {
			var intMarkerOffset = (30 * 4);
		} else if(intTemperature < 0 && intTemperature >= -5) {
			var intMarkerOffset = (30 * 3);
		} else if(intTemperature < -5 && intTemperature >= -10) {
			var intMarkerOffset = (30 * 2);
		} else if(intTemperature < -10 && intTemperature >= -15) {
			var intMarkerOffset = (30 * 1);
		} else if(intTemperature < -15 && intTemperature >= -20) {
			var intMarkerOffset = (30 * 1);
		} else if(intTemperature < 20) {
			var intMarkerOffset = 0;
		}

		return intMarkerOffset;
	},

	getMarkerBasedOnWindSpeed: function(intWindSpeed) {
		return (30 * (intWindSpeed - 1));
	},

	getLatLongForStation: function(strStation) {
		var _stationPositions = {
			"Lauwersoog": 	new google.maps.LatLng(parseFloat(53.405366), parseFloat(6.212048)),
			"Nieuw Beerta": new google.maps.LatLng(parseFloat(53.189226), parseFloat(7.162511)),
			"Terschelling": new google.maps.LatLng(parseFloat(53.397875), parseFloat(5.346679)),
			"Vlieland": 	new google.maps.LatLng(parseFloat(53.250184), parseFloat(4.951427)),
			"Leeuwarden": 	new google.maps.LatLng(parseFloat(53.201233), parseFloat(5.799913)),
			"Stavoren": 	new google.maps.LatLng(parseFloat(52.882946), parseFloat(5.360707)),
			"Houtribdijk": 	new google.maps.LatLng(parseFloat(52.635105), parseFloat(5.414024)),
			"Eelde": 		new google.maps.LatLng(parseFloat(53.133108), parseFloat(6.564273)),
			"Hoogeveen": 	new google.maps.LatLng(parseFloat(52.728616), parseFloat(6.490100)),
			"Heino": 		new google.maps.LatLng(parseFloat(52.433881), parseFloat(6.232888)),
			"Twenthe":		new google.maps.LatLng(parseFloat(52.270385), parseFloat(6.876455)),
			"Deelen": 		new google.maps.LatLng(parseFloat(52.066719), parseFloat(5.894033)),
			"Hupsel": 		new google.maps.LatLng(parseFloat(52.081967), parseFloat(6.616657)),
			"Herwijnen": 	new google.maps.LatLng(parseFloat(51.826698), parseFloat(5.129609)),
			"Marknesse": 	new google.maps.LatLng(parseFloat(52.711559), parseFloat(5.864559)),
			"Lelystad": 	new google.maps.LatLng(parseFloat(52.518537), parseFloat(5.471422)),
			"De Bilt": 		new google.maps.LatLng(parseFloat(52.109272), parseFloat(5.180968)),
			"Cabauw":	 	new google.maps.LatLng(parseFloat(51.965344), parseFloat(4.897937)),
			"Den Helder": 	new google.maps.LatLng(parseFloat(52.956281), parseFloat(4.760797)),
			"Berkhout": 	new google.maps.LatLng(parseFloat(52.640436), parseFloat(4.998517)),
			"IJmuiden": 	new google.maps.LatLng(parseFloat(52.456954), parseFloat(4.606014)),
			"Wijk aan Zee":	new google.maps.LatLng(parseFloat(52.491691), parseFloat(4.593325)),
			"Schiphol": 	new google.maps.LatLng(parseFloat(52.310539), parseFloat(4.768274)),
			"Voorschoten": 	new google.maps.LatLng(parseFloat(52.123790), parseFloat(4.438598)),
			"Rotterdam": 	new google.maps.LatLng(parseFloat(51.924420), parseFloat(4.477733)),
			"Hoek van Holland": 	new google.maps.LatLng(parseFloat(51.980632), parseFloat(4.134185)),
			"Wilhelminadorp": 		new google.maps.LatLng(parseFloat(51.529207), parseFloat(3.896880)),
			"Vlissingen":	 		new google.maps.LatLng(parseFloat(51.453667), parseFloat(3.570912)),
			"Westdorpe": 	new google.maps.LatLng(parseFloat(51.233528), parseFloat(3.830322)),
			"Woensdrecht": 	new google.maps.LatLng(parseFloat(51.429248), parseFloat(4.304708)),
			"Gilze Rijen": 	new google.maps.LatLng(parseFloat(51.559855), parseFloat(4.909254)),
			"Volkel":		new google.maps.LatLng(parseFloat(51.642853), parseFloat(5.654604)),
			"Eindhoven":	new google.maps.LatLng(parseFloat(51.441642), parseFloat(5.469722)),
			"Ell":			new google.maps.LatLng(parseFloat(51.220148), parseFloat(5.795070)),
			"Arcen":		new google.maps.LatLng(parseFloat(51.476364), parseFloat(6.180948)),
			"Maastricht-Aachen Airport":		new google.maps.LatLng(parseFloat(50.912321), parseFloat(5.769495)),
			"Bierset":		new google.maps.LatLng(parseFloat(50.655000), parseFloat(5.450920)),
			"Buzenol":		new google.maps.LatLng(parseFloat(49.645665), parseFloat(5.595341)),
			"Chievres":		new google.maps.LatLng(parseFloat(50.585970), parseFloat(3.806090)),
			"Mont rigi":	new google.maps.LatLng(parseFloat(50.510017), parseFloat(6.076989)),
			"Diepenbeek":	new google.maps.LatLng(parseFloat(50.910830), parseFloat(5.413360)),
			"Retie":		new google.maps.LatLng(parseFloat(51.267586), parseFloat(5.084388)),
			"Ernage":		new google.maps.LatLng(parseFloat(50.593929), parseFloat(4.674160)),
			"Melle":		new google.maps.LatLng(parseFloat(51.003660), parseFloat(3.800314)),
			"Humain":		new google.maps.LatLng(parseFloat(50.204960), parseFloat(5.256710)),
			"Stabroek":		new google.maps.LatLng(parseFloat(51.335187), parseFloat(4.370312)),
			"Ukkel":		new google.maps.LatLng(parseFloat(50.802398), parseFloat(4.340670)),
			"Dourbes":		new google.maps.LatLng(parseFloat(50.091518), parseFloat(4.591190)),
			"Zeebrugge":	new google.maps.LatLng(parseFloat(51.331348), parseFloat(3.206840)),
		}

		return _stationPositions[strStation];
	},

    plotLiveStrikes: function() {
		$(".audiomsg source").prop("src", "https://www.onweer-online.nl/audio/strikeHit.mp3");
		$(".audiomsg").find("audio").load();

		var _isInitialLoad = true;
		liveLightning = setInterval(function() {
        if(typeof window.stMap != 'undefined') {
            var _viewPortBounds = window.stMap.getBounds();
        }

	   	 $.ajax({
	           url: '/strikedata/index.php',
	           type: "GET",
	           data: {loadLive: 1, lastUpdate: LIVE.LAST_UPDATE},
	           dataType: "JSON",
	           success: function(e) {
				   if(!_isInitialLoad) {
					    var strikeIcon = new google.maps.MarkerImage('/images/strike_age_new.png', new google.maps.Size(12, 12), new google.maps.Point(0, 0), new google.maps.Point(6, 6));
	       	            $.each(e.strikes, function(i, bolt) {
	   				    	var strikePosition = new google.maps.LatLng(parseFloat(bolt.latitude), parseFloat(bolt.longitude));

							if(_viewPortBounds.contains(strikePosition)) {
								setTimeout(function() {
									var strikeMarker = new google.maps.Marker({
			     						position: strikePosition,
			     						map: window.stMap,
			     						icon: strikeIcon,
										zIndex: 999999,
										animation: google.maps.Animation.DROP
			     					});

			                      	setTimeout(function() {
										strikeMarker.setMap(null);
									}, ((60 * 1000) * 5));

									if(window.allowSound) {
										if(navigator.userAgent.indexOf("Safari") < 0 || navigator.userAgent.indexOf('Chrome') > 0) {
							                var _player = $(".audiomsg").find("audio");
											_player[0].play();
										}
									}

								}, (i * 200));
							}
	       	            });
					}

					_isInitialLoad = false;
					LIVE.LAST_UPDATE = e.last_update;
	           }
	       });

	   }, LIVE.REQUEST_INTERVAL);
	},

	renderLatestSatteliteImage: function() {

		var _dateTime = new Date();

		this.bounds_ = new google.maps.LatLngBounds(new google.maps.LatLng(49.2526885111504, 0.114525396640625416), new google.maps.LatLng(55.6488199415064, 9.802344351562542));
		// this.bounds_ = new google.maps.LatLngBounds(new google.maps.LatLng(49.23, 0.5), new google.maps.LatLng(54.98, 9.85));
		this.image_ = 'https://onweer-online.nl/tools/cache/wpsat12.jpg?cb='+_dateTime.getTime();
		this.div_ = null;
		this.map_ = window.stMap;

	},

	addPrototypesToSatelliteModel: function() {
		stormTrack.renderLatestSatteliteImage.prototype = new google.maps.OverlayView();
		stormTrack.renderLatestSatteliteImage.prototype.onAdd = function() {
			var div = document.createElement('div');
	        div.style.borderStyle = 'none';
	        div.style.borderWidth = '0px';
	        div.style.position = 'absolute';
			div.style.transform = "rotate(2.9deg)";

	        var img = document.createElement('img');
	        img.src = this.image_;
	        img.style.width = '100%';
	        img.style.height = '100%';
	        img.style.position = 'absolute';
			img.style.zIndex = 9999;
	        div.appendChild(img);

	        this.div_ = div;

	        var panes = this.getPanes();
	        panes.overlayLayer.appendChild(div);
		};

		stormTrack.renderLatestSatteliteImage.prototype.draw = function() {

	        var overlayProjection = this.getProjection();

	        var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
	        var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());

	        var div = this.div_;
	        div.style.left = sw.x + 'px';
	        div.style.top = ne.y + 'px';
	        div.style.width = (ne.x - sw.x) + 'px';
	        div.style.height = (sw.y - ne.y) + 'px';
			div.style.opacity = 0.6;
			div.style.zIndex = 9999;
      	};

	    stormTrack.renderLatestSatteliteImage.prototype.onRemove = function() {
	        this.div_.parentNode.removeChild(this.div_);
	        this.div_ = null;
	    };
	},

	plotLatestSatteliteImage: function() {

		$.each(plottedSatteliteImages, function(i, o) {
			o.setMap(null);
		});

		var satteliteOverlay = new stormTrack.renderLatestSatteliteImage();
		satteliteOverlay.setMap(window.stMap);

		plottedSatteliteImages.push(satteliteOverlay);

	},

	renderLatestDopplerEcho: function() {

		var _dateTime = new Date();

		this.bounds_ = new google.maps.LatLngBounds(new google.maps.LatLng(49.2026885111504, 0.24525396640625416), new google.maps.LatLng(55.5588199415064, 9.802344351562542));
		this.image_ = 'https://onweer-online.nl/tools/cache/wpbr11.gif?cb='+_dateTime.getTime();
		this.div_ = null;
		this.map_ = window.stMap;

	},

	addPrototypesToDopplerModel: function() {
		stormTrack.renderLatestDopplerEcho.prototype = new google.maps.OverlayView();
		stormTrack.renderLatestDopplerEcho.prototype.onAdd = function() {
			var div = document.createElement('div');
	        div.style.borderStyle = 'none';
	        div.style.borderWidth = '0px';
	        div.style.position = 'absolute';
			div.style.transform = "rotate(6deg)";

	        var img = document.createElement('img');
	        img.src = this.image_;
	        img.style.width = '100%';
	        img.style.height = '100%';
	        img.style.position = 'absolute';
			img.style.zIndex = 9999;
	        div.appendChild(img);

	        this.div_ = div;

	        var panes = this.getPanes();
	        panes.overlayLayer.appendChild(div);
		};

		stormTrack.renderLatestDopplerEcho.prototype.draw = function() {

	        var overlayProjection = this.getProjection();

	        var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
	        var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());

	        var div = this.div_;
	        div.style.left = sw.x + 'px';
	        div.style.top = ne.y + 'px';
	        div.style.width = (ne.x - sw.x) + 'px';
	        div.style.height = (sw.y - ne.y) + 'px';
			div.style.opacity = 0.8;
			div.style.zIndex = 9999;
      	};

	    stormTrack.renderLatestDopplerEcho.prototype.onRemove = function() {
	        this.div_.parentNode.removeChild(this.div_);
	        this.div_ = null;
	    };
	},

	plotLatestDopplerEcho: function() {

		$.each(plottedRadarImages, function(i, o) {
			o.setMap(null);
		});

		var dopplerRadarOverlay = new stormTrack.renderLatestDopplerEcho();
		dopplerRadarOverlay.setMap(window.stMap);

		plottedRadarImages.push(dopplerRadarOverlay);

	},

	plotTrafficLayer: function() {
	    trafficLayer = new google.maps.TrafficLayer();
        trafficLayer.setMap(stMap);
	},

	clearTrafficLayer: function() {
		trafficLayer.setMap(null);
	},

	plotQuakes: function() {

		function addQuakeIntensity(event) {
			infoWindow.setOptions({
			  maxWidth: 400
			});

			infoWindow.setContent(this.infoWindowBody);
			infoWindow.setPosition(event.latLng);
			infoWindow.open(stMap);

		}

		$.ajax({
			url: 'https://cdn.knmi.nl/knmi/json/current/seismology/earthquake-events.json?'+Math.random(),
			data: {},
			type: 'GET',
			dataType: 'JSON',
			success: function(data) {
				$.each(plottedEarthquakes, function(i, o) {
					o.setMap(null);
				});

				$.each(data.events, function(i, oQuake) {

					var earthQuake = new google.maps.Circle({
						strokeColor: '#FF0000',
						fillColor: '#FF0000',
						fillOpacity: 0.5,
						strokeOpacity: 0.8,
						strokeWeight: 2,
						zIndex: oQuake.mag.replace('.', ''),
						center: new google.maps.LatLng(oQuake.lat, oQuake.lon),
						radius: Math.ceil(oQuake.mag * 1000),
						quakeIntensity: oQuake.mag,
						infoWindowBody: oQuake.body.replace('Detail page', '')
					});

					earthQuake.setMap(window.stMap)
					plottedEarthquakes.push(earthQuake);

					earthQuake.addListener('click', addQuakeIntensity);
					infoWindow = new google.maps.InfoWindow;

				});

			}
		});
	},

	cacheIndices: function() {
		setInterval(function() {
			stormTrack.getLatestIndices();
		}, ((1000 * 60) * 10));
	},

	getLatestIndices: function() {
		$.ajax({
			url: 'https://www.onweer-online.nl/cache/indices.json?'+Math.random(),
			data: {},
			type: 'GET',
			dataType: 'JSON',
			success: function(data) {
				window.indices = data;
			}
		});
	},

	plotTotalTotals: function() {
		$.each(window.plottedTotals, function(i, o) {
			o.setMap(null);
		});

		$.each(window.indices, function(i, location) {

			var _markerTotalsOffset = stormTrack.getMarkerBasedOnTotals(location.total_totals);
			var _iconTotals = new google.maps.MarkerImage('/images/indices-tt-markers.png?r=38902490', new google.maps.Size(50, 50), new google.maps.Point(_markerTotalsOffset, 0), new google.maps.Point(25, 25));

			var _totalsMarker = new MarkerWithLabel({
				position: new google.maps.LatLng(parseFloat(location.lat), parseFloat(location.lng)),
				map: stMap,
				labelContent: location.total_totals,
				labelAnchor: new google.maps.Point(15,5),
				labelClass: "labeled-marker-inner", // the CSS class for the label
				labelInBackground: false,
				icon: _iconTotals,
				clickable: false,
				title: i+ '- Total Totals: ' + location.total_totals,
				zIndex: 9999999,
				optimized: false,
			});

			plottedTotals.push(_totalsMarker);

		});
	},

	getMarkerBasedOnTotals: function(intTotals) {
		if(intTotals >= 57) {
			var intMarkerOffset = (50 * 7);
		} else if(intTotals < 57 && intTotals >= 53) {
			var intMarkerOffset = (50 * 6);
		} else if(intTotals < 53 && intTotals >= 51) {
			var intMarkerOffset = (50 * 5);
		} else if(intTotals < 51 && intTotals >= 49) {
			var intMarkerOffset = (50 * 4);
		} else if(intTotals < 49 && intTotals >= 47) {
			var intMarkerOffset = (50 * 3);
		} else if(intTotals < 47 && intTotals >= 45) {
			var intMarkerOffset = (50 * 2);
		} else if(intTotals < 45 && intTotals >= 43) {
			var intMarkerOffset = (50 * 1);
		} else if(intTotals < 43) {
			var intMarkerOffset = 0;
		}

		return intMarkerOffset;
	},

	plotCape: function() {
		$.each(window.plottedCape, function(i, o) {
			o.setMap(null);
		});

		$.each(window.indices, function(i, location) {

			var _markerCapeOffset = stormTrack.getMarkerBasedOnCape(location.cape);
			var _iconCape = new google.maps.MarkerImage('/images/indices-tt-markers.png?r=38902490', new google.maps.Size(50, 50), new google.maps.Point(_markerCapeOffset, 0), new google.maps.Point(25, 25));

			var _capeMarker = new MarkerWithLabel({
				position: new google.maps.LatLng(parseFloat(location.lat), parseFloat(location.lng)),
				map: stMap,
				labelContent: location.cape+ ' <small>J/kg</small>',
				labelAnchor: new google.maps.Point(15,15),
				labelClass: "labeled-marker-inner", // the CSS class for the label
				labelInBackground: false,
				icon: _iconCape,
				clickable: false,
				title: i+ '- Total Totals: ' + location.cape + ' J/kg',
				zIndex: 99999999,
				optimized: false,
			});

			plottedCape.push(_capeMarker);

		});
	},

	plotWarningCodes: function(_html) {

		var _provinceConversions = {
			"Drenthe": 0,
			"Flevoland": 1,
			"Friesland": 2,
			"Gelderland": 3,
			"Groningen": 4,
			"Limburg": 5,
			"Noord-Brabant": 6,
			"Noord-Holland": 7,
			"Overijssel": 8,
			"Utrecht": 9,
			"Zeeland": 10,
			"Zuid-Holland": 11
		}

		if(_html.find('[data-plottable-warning]').length) {
			_html.find('[data-plottable-warning]').each(function() {
				var _this = $(this);
				var _validFor = _this.attr('data-plot').split(',');
				var _warningLevel = _this.attr('data-warning-level');

				var _warningLevelColorConversions = {
					"l2": "#ffde00",
					"l3": "#ff8400",
					"l4": "#ff1800"
				}

				$.each(_validFor, function(i, _place) {
					$.ajax({
						url: '/stormtrack/getOutlines.php',
						type: 'POST',
						dataType: 'JSON',
						data: {
							id: _provinceConversions[_place]
						},
						success: function(d) {
							var _provincePath = [];
							$.each(d.features[0]['geometry']['coordinates'], function(i, o) {
								$.each(o, function(i, _pair) {

									if(_pair.length > 2) {
										$.each(_pair, function(i, _pair) {
											var point = new google.maps.LatLng(parseFloat(_pair[1]), parseFloat(_pair[0]));
											_provincePath.push(point);
										});
									} else {

										var point = new google.maps.LatLng(parseFloat(_pair[1]), parseFloat(_pair[0]));
										_provincePath.push(point);

									}
								});
							});

							function addWarningInfo(event) {
								infoWindow.setOptions({
								  maxWidth: 400
								});

							  infoWindow.setContent(this.warningMessage);
							  infoWindow.setPosition(event.latLng);
							  infoWindow.open(stMap);

							}

							var _province = new google.maps.Polygon({
								path: _provincePath,
								strokeColor: _warningLevelColorConversions[_warningLevel],
								fillColor: _warningLevelColorConversions[_warningLevel],
								fillOpacity: 0.4,
								strokeOpacity: 8,
								strokeWeight: 2,
								zIndex: 1,
								warningMessage: _this.find('strong').html()
							});

							_province.setMap(window.stMap);
							_province.addListener('click', addWarningInfo);
							plottedProvinces.push(_province);
						}
					});
				});
			});
		}
	},

	getMarkerBasedOnCape: function(intTotals) {
		if(intTotals >= 3500) {
			var intMarkerOffset = (50 * 7);
		} else if(intTotals < 3500 && intTotals >= 3000) {
			var intMarkerOffset = (50 * 6);
		} else if(intTotals < 3000 && intTotals >= 2500) {
			var intMarkerOffset = (50 * 5);
		} else if(intTotals < 2500 && intTotals >= 1000) {
			var intMarkerOffset = (50 * 4);
		} else if(intTotals < 1000 && intTotals >= 700) {
			var intMarkerOffset = (50 * 3);
		} else if(intTotals < 700 && intTotals >= 500) {
			var intMarkerOffset = (50 * 2);
		} else if(intTotals < 500 && intTotals >= 1) {
			var intMarkerOffset = (50 * 1);
		} else if(intTotals < 1) {
			var intMarkerOffset = 0;
		}

		return intMarkerOffset;
	},

	controlLayers: function(_html) {
		var _action = _html.find('.st-map-sidebar input');
		_action.click(function(e) {
			e.stopPropagation();

			//Reset ALL
			if(typeof estofexAreas != 'undefined') {
				$.each(window.estofexAreas, function(i, o) {
					o.setMap(null);
				});
			}

			$.each(window.plottedTemperatures, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedWindSpeeds, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedRadarImages, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedSatteliteImages, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedWebcams, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedEarthquakes, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedStorms, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedTotals, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedCape, function(i, o) {
				o.setMap(null);
			});

			$.each(window.plottedProvinces, function(i, o) {
				o.setMap(null);
			});

			if(typeof refreshStorms != 'undefined') {
				clearInterval(refreshStorms);
			}

			if(typeof refreshDopplerLayer != 'undefined') {
				clearInterval(refreshDopplerLayer);
			}

			if(typeof refreshSatteliteLayer != 'undefined') {
				clearInterval(refreshSatteliteLayer);
			}

			if(typeof refreshWindSpeeds != 'undefined') {
				clearInterval(refreshWindSpeeds);
			}

			if(typeof refreshTemperatures != 'undefined') {
				clearInterval(refreshTemperatures);
			}

			if(typeof refreshTotalTotals != 'undefined') {
				clearInterval(refreshTotalTotals);
			}

			if(typeof refreshCape != 'undefined') {
				clearInterval(refreshCape);
			}

			if(typeof trafficLayer != 'undefined' && !trafficLayer[0] && trafficLayer) {
				trafficLayer.setMap(null);
			}

			window.stMap.overlayMapTypes.clear();

			_html.find('.st-map-sidebar input[type="checkbox"]:checked').each(function() {
				var _this = $(this);

				switch(_this.attr('value')) {

					case 'stormClusterLayer':
						stormTrack.plotStorms();

						refreshStorms = setInterval(function() {
							stormTrack.plotStorms();
							stormTrack.plotNationalWeatherServiceWarnings();
							stormTrack.plotChasers();
							//stormTrack.plotQuakes();
							//stormTrack.plotStormTracks();

						}, ((1000 * 60) * 5));

						break;

					case 'cloudLayer':
						stormTrack.plotClouds();
						break;

					case 'precipLayer':
						stormTrack.plotPrecip();
						break;

					case 'dopplerLayer':
						stormTrack.plotLatestDopplerEcho();
						refreshDopplerLayer = setInterval(function() {
							stormTrack.plotLatestDopplerEcho();
						}, ((1000 * 60) * 2));
						break;

					case 'satteliteLayer':
						stormTrack.plotLatestSatteliteImage();
						refreshSatteliteLayer = setInterval(function() {
							stormTrack.plotLatestSatteliteImage();
						}, ((1000 * 60) * 2));
						break;

					case 'temperatureLayer':
						stormTrack.plotTemperatures();
						refreshTemperatures = setInterval(function() {
							stormTrack.plotTemperatures();
						}, ((1000 * 60) * 10));
						break;

					case 'windSpeedLayer':
						stormTrack.plotWindSpeeds();
						refreshWindSpeeds = setInterval(function() {
							stormTrack.plotWindSpeeds();
						}, ((1000 * 60) * 10));

						break;

					case 'trafficLayer':
						stormTrack.plotTrafficLayer();
						break;

					case 'warningLayer':
						stormTrack.plotWarningCodes(_html);
						break;

					case 'quakeLayer':
						stormTrack.plotQuakes();
						break;

					case 'webcamLayer':
						stormTrack.plotWebcams();
						break;

					case 'estofexLayer':
						if(typeof estofexAreas != 'undefined') {
							$.each(window.estofexAreas, function(i, o) {
								o.setMap(stMap);
							});
						}
						break;

					case 'totalTotals':
						stormTrack.plotTotalTotals();
						refreshTotalTotals = setInterval(function() {
							stormTrack.plotTotalTotals();
						}, ((1000 * 60) * 10));
						break;

						case 'cape':
							stormTrack.plotCape();
							refreshCape = setInterval(function() {
								stormTrack.plotCape();
							}, ((1000 * 60) * 10));
							break;

				};
			});

		});
	},

	toggleMobile: function(_html) {
		var _action = _html.find('.st-map-sidebar');
		_action.click(function() {
			var _this = $(this);
			_this.toggleClass('open');
		});
	},

	autoOpen: function(_html) {
		$(window).load(function() {
			if(location.hash) {
				var _hashParts = location.hash.split('#');
				if(_hashParts.indexOf('stormtracker') > -1) {
					_html.find('.oo-top-bar-st').click();
				}
			}
		});
	},

	init: function() {

		var _html = $('html');
		// this.initMap(_html);
		this.showTracker(_html);
		this.closeTracker(_html);
		this.toggleMapcontrols(_html);
		this.applyLayer(_html);
		this.plotNationalWeatherServiceWarnings();
		this.clickCamButton(_html);
		// this.plotLiveStrikes();
		this.addPrototypesToDopplerModel();
		this.addPrototypesToSatelliteModel();
		this.controlLayers(_html);
		this.toggleMobile(_html);
		this.autoOpen(_html);
	}
}

$(document).ready(function() {
	stormTrack.init();
});
