Czech WMS layers

Displays layers from Czech WMS services (ČÚZK) in WME

2018-04-02 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

// ==UserScript==
// @name			Czech WMS layers
// @version			2018.04.02
// @authorCZ		petrjanik, d2-mac, MajkiiTelini
// @description		Displays layers from Czech WMS services (ČÚZK) in WME
// @include			/^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @run-at			document-end
// @namespace		https://greatest.deepsurf.us/cs/users/135686
// ==/UserScript==

(function() {
	var WMSLayersTechSource = {};

	function init(e) {
		if (e && e.user === null) {
			return;
		}
		if (typeof W === "undefined" || typeof W.loginManager === "undefined") {
			setTimeout(init, 100);
			return;
		}
		if (!W.loginManager.user) {
			W.loginManager.events.register("login", null, init);
			W.loginManager.events.register("loginStatus", null, init);
			if (!W.loginManager.user) {
				return;
			}
		}
		if (document.getElementById("layer-switcher") === null && document.getElementById("layer-switcher-group_display") === null) {
			setTimeout(init, 200);
			return;
		}
		WMSLayersTechSource.epsg900913 = new unsafeWindow.OL.Projection("EPSG:900913");
		WMSLayersTechSource.epsg4326 = new unsafeWindow.OL.Projection("EPSG:4326");
		WMSLayersTechSource.tileSizeG = new OL.Size(512,512);
		// adresy WMS služeb
		var service_wms_orto = {"type" : "WMS", "url" : "https://geoportal.cuzk.cz/WMS_ORTOFOTO_PUB/WMService.aspx?", "attribution" : "ČUZK Ortofoto", "comment" : "ČUZK ortofoto"};
		var service_wms_katastr = {"type" : "WMS", "url" : "https://services.cuzk.cz/wms/wms.asp?", "attribution" : "ČUZK Katastrální mapy", "comment" : "ČUZK katastr"};
		var service_wms_inspire = {"type" : "WMS", "url" : "https://services.cuzk.cz/wms/inspire-ad-wms.asp?", "attribution" : "ČUZK INSPIRE", "comment" : "ČUZK čísla popisná a orientační + názvy ulic"};
		var service_wms_zabaged = {"type" : "WMS_3857", "url" : "https://ags.cuzk.cz/arcgis/services/ZABAGED/MapServer/WMSServer?", "attribution" : "ČUZK ZABAGED®", "comment" : "ČUZK Doprava, Lesy, Vodní plochy"};
		//skupina vrstev v menu
		var groupTogglerWMS = addGroupToggler(false, "layer-switcher-group_wms", "WMS ČÚZK");
		//vrstvy v menu
		var layerTogglers = {};
		layerTogglers["wms_verejne"] = addLayerToggler(groupTogglerWMS, "Veřejné budovy", [addNewLayer("wms_verejne", service_wms_zabaged, "29,44,142,143")]);
		layerTogglers["wms_lesvoda"] = addLayerToggler(groupTogglerWMS, "Lesy a vodstva", [addNewLayer("wms_lesvoda", service_wms_zabaged, "0,1,2,9,53,54,55,56,57,58,113,171,172,173,174,175,176,177,178,179", 201)]);
		layerTogglers["wms_orto"] = addLayerToggler(groupTogglerWMS, "Ortofoto ČUZK", [addNewLayer("wms_orto", service_wms_orto, "GR_ORTFOTORGB", 200)]);
		layerTogglers["wms_katastr"] = addLayerToggler(groupTogglerWMS, "Katastrální mapa", [addNewLayer("wms_katastr", service_wms_katastr, "hranice_parcel,dalsi_p_mapy,RST_KN")]);
		layerTogglers["wms_budovy"] = addLayerToggler(groupTogglerWMS, "Adresní místa 1a", [addNewLayer("wms_budovy", service_wms_inspire, "AD.Addresses.Text.AddressNumber,AD.Addresses.ByPrefixNumber.TypOfBuilding.2,AD.Addresses.ByPrefixNumber.TypOfBuilding.1", 0)]);
		layerTogglers["wms_budovy_b"] = addLayerToggler(groupTogglerWMS, "Adresní místa 1b", [addNewLayer("wms_budovy_b", service_wms_inspire, "AD.Addresses.Text.AddressAreaName,AD.Addresses.Text.ThoroughfareName")]);

		addGroupVisibilityToggler();
		OrtoTimer(layerTogglers);

		if (localStorage.WMSLayers) {
			var JSONStorageOptions = JSON.parse(localStorage.WMSLayers);
			for (var key in layerTogglers) {
				if (JSONStorageOptions[key]) {
					document.getElementById(layerTogglers[key].htmlItem).click();
				}
			}
		}
		var saveWMSLayersOptions = function() {
			if (localStorage) {
				var JSONStorageOptions = {};
				for (var key in layerTogglers) {
					JSONStorageOptions[key] = document.getElementById(layerTogglers[key].htmlItem).checked;
				}
				localStorage.WMSLayers = JSON.stringify(JSONStorageOptions);
			}
		};
		window.addEventListener("beforeunload", saveWMSLayersOptions, false);
	}

	addNewLayer = function(id, service, serviceLayers, zIndex) {
		var newLayer = {};
		newLayer.uniqueName = "_" + id;
		newLayer.zIndex = (typeof zIndex === 'undefined') ? 0 : zIndex;
		switch(service.type) {
			case "WMS":
				newLayer.layer = new OL.Layer.WMS(
					id, service.url,
					{
						layers: serviceLayers ,
						transparent: "true",
						format: "image/png"
					},
					{
						tileSize: WMSLayersTechSource.tileSizeG,
						isBaseLayer: false,
						visibility: false,
						transitionEffect: "resize",
						attribution: service.attribution,
						uniqueName: newLayer.uniqueName,
					}
				);
				break;
			case "WMS_3857":
				newLayer.layer = new OL.Layer.WMS(
					id, service.url,
					{
						layers: serviceLayers ,
						transparent: "true",
						format: "image/png"
					},
					{
						tileSize: WMSLayersTechSource.tileSizeG,
						isBaseLayer: false,
						visibility: false,
						transitionEffect: "resize",
						attribution: service.attribution,
						uniqueName: newLayer.uniqueName,
						projection: new unsafeWindow.OL.Projection("EPSG:3857")
					}
				);
				break;
			default:
				newLayer.layer = null;
		}
		return newLayer;
	};

	addGroupToggler = function(isDefault, layerSwitcherGroupItemName, layerGroupVisibleName) {
		var group;
		if (isDefault === true) {
			group = document.getElementById(layerSwitcherGroupItemName).parentElement.parentElement;
		}
		else {
			var layerGroupsList = document.getElementsByClassName("list-unstyled togglers")[0];
			group = document.createElement("li");
			group.className = "group";
			var togglerContainer = document.createElement("div");
			togglerContainer.className = "controls-container main toggler";
			var checkbox = document.createElement("input");
			checkbox.className = "toggle";
			checkbox.id = layerSwitcherGroupItemName;
			checkbox.type = "checkbox";
			checkbox.checked = "true";
			var label = document.createElement("label");
			label.htmlFor = checkbox.id;
			var labelText = document.createElement("span");
			labelText.className = "label-text";
			var togglerChildrenList = document.createElement("ul");
			togglerChildrenList.className = "children";
			togglerContainer.appendChild(checkbox);
			labelText.appendChild(document.createTextNode(layerGroupVisibleName));
			label.appendChild(labelText);
			togglerContainer.appendChild(label);
			group.appendChild(togglerContainer);
			group.appendChild(togglerChildrenList);
			layerGroupsList.appendChild(group);
		}
		return group;
	};

	addLayerToggler = function(groupToggler, layerName, layerArray) {
		var layerToggler = {};
		var layerShortcut = layerName.replace(/ /g, "_").replace(".", "");
		layerToggler.htmlItem = "layer-switcher-item_" + layerShortcut;
		layerToggler.layerArray = layerArray;
		var layer_container = groupToggler.getElementsByClassName("children")[0];
		var layerGroupCheckbox = groupToggler.getElementsByClassName("controls-container main toggler")[0].getElementsByClassName("toggle")[0];
		var toggler = document.createElement("li");
		var togglerContainer = document.createElement("div");
		togglerContainer.className = "controls-container toggler";
		var checkbox = document.createElement("input");
		checkbox.type = "checkbox";
		checkbox.id = layerToggler.htmlItem;
		checkbox.className = "toggle";
		checkbox.disabled = !layerGroupCheckbox.checked;
		togglerContainer.appendChild(checkbox);
		var label = document.createElement("label");
		label.htmlFor = checkbox.id;
		var labelText2 = document.createElement("span");
		labelText2.className = "label-text";
		labelText2.appendChild(document.createTextNode(" " + layerName));
		label.appendChild(labelText2);
		togglerContainer.appendChild(label);
		toggler.appendChild(togglerContainer);
		layer_container.appendChild(toggler);
		for (var i = 0; i < layerArray.length; i++){
			checkbox.addEventListener("click", layerTogglerEventHandler(layerArray[i].layer));
			layerGroupCheckbox.addEventListener("click", layerTogglerGroupEventHandler(checkbox, layerArray[i].layer));
		}
		registerKeyShortcut("WMS " + layerName, layerKeyShortcutEventHandler(layerGroupCheckbox, checkbox), layerShortcut);
		return layerToggler;
	};

	addGroupVisibilityToggler = function() {
		var layerGroupsList = Array.filter(Array.prototype.slice.call(document.getElementsByClassName("list-unstyled togglers")[0].childNodes), function(e) {return e.nodeType == 1 && e.tagName == "LI";});
		for (i = 0; i < layerGroupsList.length; i++) {
			var togglerContainer = Array.filter(Array.prototype.slice.call(layerGroupsList[i].childNodes), function(e) {return e.nodeType == 1 && e.tagName == "DIV";})[0];
			var togglerChildrenList = Array.filter(Array.prototype.slice.call(layerGroupsList[i].childNodes), function(e) {return e.nodeType == 1 && e.tagName == "UL";})[0];
			var aControlWindow = document.createElement("a");
			aControlWindow.href = "#";
			aControlWindow.className = "fa fa-window-minimize pull-right";
			togglerContainer.appendChild(aControlWindow);
			aControlWindow.addEventListener("click", layersEventHandler(Array.filter(Array.prototype.slice.call(togglerChildrenList.childNodes), function(e) {return e.nodeType == 1 && e.tagName == "LI";})));
		}
	};

	function registerKeyShortcut(actionName, callback, keyName) {
		I18n.translations[I18n.locale].keyboard_shortcuts.groups['default'].members[keyName] = actionName;
		W.accelerators.addAction(keyName, {group: 'default'});
		W.accelerators.events.register(keyName, null, callback);
		W.accelerators._registerShortcuts({[""]: keyName});
	}

	function layerTogglerEventHandler(layer) {
		return function() {
			if (this.checked) {
				W.map.addLayer(layer);
				layer.setVisibility(this.checked);
			} else {
				layer.setVisibility(this.checked);
				W.map.removeLayer(layer);
			}
		};
	}

	function layerKeyShortcutEventHandler(groupCheckbox, checkbox) {
		return function() {
			if (!groupCheckbox.disabled) {
				checkbox.click();
			}
		};
	}

	function layerTogglerGroupEventHandler(checkbox, layer) {
		return function() {
			if (this.checked) {
				if (checkbox.checked) {
					W.map.addLayer(layer);
					layer.setVisibility(this.checked & checkbox.checked);
				}
			}
			else {
				if (checkbox.checked) {
					layer.setVisibility(this.checked & checkbox.checked);
					W.map.removeLayer(layer);
				}
			}
			checkbox.disabled = !this.checked;
		};
	}

	function layersEventHandler(childList) {
		return function () {
			if (this.className == "fa fa-window-maximize pull-right"){
				this.className = "fa fa-window-minimize pull-right";
				for (j = 0; j < childList.length; j++) {
					childList[j].style.display = "";
				}
			}
			else{
				this.className = "fa fa-window-maximize pull-right";
				for (j = 0; j < childList.length; j++) {
					childList[j].style.display = "none";
				}
			}
		};
	}

	OrtoTimer = function(layerTogglers) {
		setTimeout(function(){
			for (var key in layerTogglers) {
				for (j = 0; j < layerTogglers[key].layerArray.length; j++) {
					if (layerTogglers[key].layerArray[j].zIndex > 0) {
						var l = W.map.getLayersBy("uniqueName", layerTogglers[key].layerArray[j].uniqueName);
						if (l.length > 0) {
							l[0].setZIndex(layerTogglers[key].layerArray[j].zIndex);
						}
					}
				}
			}
			OrtoTimer(layerTogglers);
		},500);
	};

	init();
})();