NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name GC Flood Alerts // @version 0.1.1 // @author JRI // @oujs:author JRI // @namespace inge.org.uk/userscripts // @description Show flood alerts for England and Wales on the Geocaching.com map // @license MIT License; http://www.opensource.org/licenses/mit-license.php // @copyright 2014, James Inge (http://geo.inge.org.uk/) // @attribution Environment Agency (http://apps.environment-agency.gov.uk/flood/142151.aspx) // @include https://www.geocaching.com/map/* // @exclude https://www.geocaching.com/map/MapPreferences.aspx* // @grant none // @icon https://raw.githubusercontent.com/JRInge/userscripts/master/GCFloodAlert/GC_Flood_Alert_Icon48.png // @icon64 https://raw.githubusercontent.com/JRInge/userscripts/master/GCFloodAlert/GC_Flood_Alert_Icon64.png // @updateURL http://geo.inge.org.uk/userscripts/GC_Flood_Alerts.meta.js // @downloadURL https://openuserjs.org/install/JRI/GC_Flood_Alerts.user.js // ==/UserScript== /*jslint browser: true, devel: true, bitwise: true, nomen: true, plusplus: true, indent: 2 */ /*jshint multistr: true */ /*global L, MapSettings */ (function () { "use strict"; function payload() { if (window.L === undefined) { console.error("GC Flood Alerts requires Leaflet Maps to be enabled."); return; } L.FloodLayer = L.TileLayer.extend({ tile2quad: function (x, y, z) { var i, digit, mask, quad = ""; for (i = z; i > 0; i--) { digit = 0; mask = 1 << (i - 1); if ((x & mask) !== 0) { digit += 1; } if ((y & mask) !== 0) { digit += 2; } quad = quad + digit; } return quad; }, getTileUrl: function (tilePoint) { return L.Util.template(this._url, L.extend({ q: this.tile2quad(tilePoint.x, tilePoint.y, this._getZoomForUrl()), z: this._getZoomForUrl() }, this.options)); } }); L.FloodControl = L.Control.extend({ _enabled: false, _floodIcon: "", getUpdate: function () { var s = document.createElement("script"); s.setAttribute("type", "text/javascript"); s.src = "https://eafloodalertsblob.blob.core.windows.net/currentfloodalerts/floodalerts.js?callback=allFloodAlerts&_=" + new Date().getTime(); s.id = "gc-floods-jsonp"; document.getElementsByTagName("head")[0].appendChild(s); }, onAdd: function (map) { this._container = L.DomUtil.create("div", "gc-flood-control leaflet-control"); this._floodLayer = new L.FloodLayer("", {alt: "Flood Alerts", name: "floods", maxZoom: 13, minZoom: 3, opacity: 0.6, overlay: true}); this._map = map; this._markers = L.layerGroup(); this._container.innerHTML = "<a title='Flood Alerts' class='gc-flood-control-lnk'></a>"; this._container.addEventListener("click", this.toggleFloodAlerts()); window.allFloodAlerts = (function (context) { var that = context; return function (json) { var i, marker, severity, icons = [ L.icon({iconUrl: that._floodIcon, iconSize: [32, 32], iconAnchor: [16, 16], className: "gc-flood-icon gc-flood-sev0"}), L.icon({iconUrl: that._floodIcon, iconSize: [32, 32], iconAnchor: [16, 16], className: "gc-flood-icon gc-flood-sev1"}), L.icon({iconUrl: that._floodIcon, iconSize: [32, 32], iconAnchor: [16, 16], className: "gc-flood-icon gc-flood-sev2"}), L.icon({iconUrl: that._floodIcon, iconSize: [32, 32], iconAnchor: [16, 16], className: "gc-flood-icon gc-flood-sev3"}), L.icon({iconUrl: that._floodIcon, iconSize: [32, 32], iconAnchor: [16, 16], className: "gc-flood-icon gc-flood-sev4"}) ], severities = ["Unknown severity", "Severe Flood Warning", "Flood Warning", "Flood Alert", "Warning no longer in force"]; if (json.tileSetData && json.tileSetData.TileHandlerURL) { if (that._map.hasLayer(that._floodLayer)) { that._map.removeLayer(that._floodLayer); } that._floodLayer.setUrl(json.tileSetData.TileHandlerURL.replace(/\{zoomdepth\}/, "{z}").replace(/\{quadkey\}/, "{q}")); that._floodLayer.options.attribution = "<a href='http://www.environment-agency.gov.uk/homeandleisure/floods/142151.aspx'>Environment Agency flood warnings feed</a> @ " + new Date(json.timestampUTC).toLocaleTimeString(); that._map.addLayer(that._floodLayer); that._floodLayer.bringToFront(); } if (json.floodAlerts) { if (that._map.hasLayer(that._markers)) { that._map.removeLayer(that._markers); that._markers.clearLayers(); } for (i = 0; i < json.floodAlerts.length; i++) { severity = json.floodAlerts[i].Severity; if (severity > 5 || severity < 1) { severity = 0; } marker = L.marker(L.latLng(json.floodAlerts[i].Center.Latitude, json.floodAlerts[i].Center.Longitude), {className: "gc-flood-icon gc-flood-sev" + severity, icon: icons[severity], title: json.floodAlerts[i].AreaDescription}); marker.bindPopup("<div class='gc-flood-popup'><a href='http://www.environment-agency.gov.uk/homeandleisure/floods/34681.aspx?area=" + json.floodAlerts[i].AreaCode + "' target='_blank'><h4>" + severities[severity] + ": " + json.floodAlerts[i].AreaDescription + "</h4></a><div>" + json.floodAlerts[i].MessageEnglish + "</div><div class='gc-flood-updated'>Updated " + json.floodAlerts[i].FormattedTimePassed + ".</div></div>"); that._markers.addLayer(marker); } that._markers.addTo(that._map); } document.getElementsByTagName("head")[0].removeChild(document.getElementById("gc-floods-jsonp")); }; }(this)); return this._container; }, onRemove: function (map) { window.allFloodAlerts = function () {}; if (map.hasLayer(that._floodLayer)) { map.removeLayer(that._floodLayer); } if (map.hasLayer(that._markers)) { map.removeLayer(that._markers); } this._container.removeEventListener("click", this.toggleFloodAlerts()); window.clearInterval(this._timer); }, options: {position: "topright"}, toggleFloodAlerts: function () { var that = this, en_bounds = L.latLngBounds([[49.871159, -6.379880], [55.811741, 1.768960]]); return function () { if (that._map.hasLayer(that._floodLayer)) { that._map.removeLayer(that._floodLayer); } if (that._map.hasLayer(that._markers)) { that._map.removeLayer(that._markers); } if (that._enabled) { that._enabled = false; window.clearInterval(that._timer); L.DomUtil.removeClass(that._container, "gc-flood-active"); } else { if (en_bounds.contains(that._map.getCenter())) { that._enabled = true; that.getUpdate(); that._timer = window.setInterval(that.getUpdate, 600000); L.DomUtil.addClass(that._container, "gc-flood-active"); } else { alert("Environment Agency Flood Warning information is only available in England and Wales"); } } return false; }; } }); function loadControl() { if (window.MapSettings && MapSettings.Map) { MapSettings.Map.addControl(new L.FloodControl()); } else { window.setTimeout(loadControl, 1000); } } loadControl(); } var floodIcon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOwSURBVFiFxZdriJVVFIbfc5zMnEonRctRusCY2AUMM%2FKHhVEoBEVIUOqUJGKlU0hYjHT5YQoVYSBCJFHRxSjI0vozEGmpRMgcmsLL2JRUDNrNRtBJj%2Bfpx3oPZ%2FflONOZObbgY%2B%2F17rX3er%2B11177%2B3IA%2Bh8lP4i53ZLWSOocFAOqk73ApYCA84G3q1yHagjsB8YAOWAW0ADkgQ%2FOBoHjwLXAOKBg7FfgJmAk8GWtCSwG6oGvMvhR4CqgEThSKwJv2X5jH%2BOdwGjggVoQ%2BBMYD9wIlM5g9wkwDGgbagIrvHChP0NgFXAZsS1DQmAPcA7w6EAWJBK1CVg2VARuAyYAPRn8M2AuMB3YlhlrI47m9sES2GybdzP4UeIoXuJ2NPBbxmY%2BEYlj1RLoBa4AbrX%2BDTAZ2AG0em4b8JH7zwAdwFNuDxFF6rFqCawGziUqH8RJaCJCK%2BB640VgqrE8UaJ%2F8tjLRPJm60a%2FBH4kCs6TGXwPsNT4HwneDbwIrHS%2FLCUTnflfCSwk9jWbeNXIp%2FazaaAE9hFhW2X9CHA3cDvwcWJXAO4iku3rBH8DuIWIRrkszyFqQ%2B9ACDQD5wGHrS%2Bmsr8jgO%2BJzJ5iXMQ9UALaiVuyzni5FhSMr%2B2PQCfx9sutt9vmBuA59%2B8EnnD%2FTaDF%2FVeB2Xa0i7g166gk5HzgAuJ09Engfk%2F6wfrjttlChO9y68McgZJJjyOqpYB5nrvV%2BmrrXcBwYElfBA7YeXOCtQIvJfpu4Gbb7EzwAjCDyJOuBF8HPJvoLSbfcToCi4jwfUvt5DCxDQuyBLqIt78jM6EHWAM8wr%2Fr%2FW6iyj3PP%2Fe1lyjdLcT1fCozr5nYikMpgSXu78oYz6GS6QI%2BN%2F4zcGGCz6LyndCSmbMhs%2BZ7JLkhopSOIep%2BKl94%2FGqiiOSJD5IicJ%2FH3qdyIl4HDhKRnE7s8yRgLHAC%2BIu4sHocgYnASSWO7rXjV%2BxolPEdxh%2B23uh2ofFu4s4YYYcCXvNY%2BdJqIE7JdcBJ4ooX8GFe0lb%2FIjS6HSnpd0njJW2UNNP4WkkrFD8z8yStM36xpC2SpkpCUqukBR57WtJDknKSpkjaLKlO0iiPHxTwoNlcA%2FxCbeUYUbDq7fOFHPCOpHvMqF7SIkkzJE2W1CTpovRHSlJJ0qnk6UsvSvpOUkFSu599HpOkaZI25QAkdUhaL2mnpP2STiROhyeLVvMj2yBpkqSJbq%2BUNNdbojKBVIqSDph9sQqHUkSy7LD%2BTIanI3BW5W90vu3kmpSPOgAAAABJRU5ErkJggg%3D%3D", css = ".gc-flood-active { border: 2px solid #63F; }\ .gc-flood-control { background-color: #fff; width: 36px; height: 36px; border-radius: 7px; box-shadow: 0 1px 7px rgba(0, 0, 0, 0.4); }\ .gc-flood-control a { display: block; width: 32px; height: 32px; margin: 2px; background: #777 no-repeat 50% 50% url(" + floodIcon + "); border-radius: 6px; }\ .gc-flood-icon { border: 1px solid #999; border-radius: 6px; }\ .gc-flood-sev1 { background-color: #f00; }\ .gc-flood-sev2 { background-color: #fa0; }\ .gc-flood-sev3 { background-color: #bc0; }\ .gc-flood-sev4 { background-color: #888; }\ .gc-flood-popup h4 { font-weight: bold; }\ .gc-flood-updated { font-style: italic; }", s = document.createElement("script"), c = document.createElement("style"); s.setAttribute("type", "text/javascript"); s.innerHTML = "(" + payload.toString() + ")(); if (window.L && L.FloodControl) { L.FloodControl.prototype._floodIcon = '" + floodIcon + "';}"; document.getElementsByTagName("head")[0].appendChild(s); c.setAttribute("type", "text/css"); c.innerHTML = css; document.getElementsByTagName("head")[0].appendChild(c); }());