//(function () {

angular.module('MobileWebLogistics')
	.service('mapFunction', function () {
		var mapFunctionServ = this;

		function decodeUrlForSearch(url, searchField) {
			var searchParam = url.split(searchField + "=")[1];
			if (searchParam.includes("&zoom")) {
				searchParam = searchParam.split("&zoom")[0];
			}
			else if (searchParam.includes("&location")) {
				searchParam = searchParam.split("&location")[0];
			}
			return decodeURIComponent(searchParam);
		}

		this.mapOnLoad = function ($scope, $location, event) {
			//if ($("#HomeButton").length==0) { alert("0");}
			//alert($("#HomeButton").length);
			//console.log("mapOnLoad");
			var home = new $scope.HomeButton({ map: $scope.map, visible: true }, "HomeButton");
			home.startup();
			$('.home').on("click touchend", function () {
				$('#mapView').trigger('click touchend'); $(this).trigger('mouseleave'); $(this).css({ backgroundColor: 'rgba(102,102,102,0.80)' });
			});
			$scope.map.graphics.enableMouseEvents();
			$scope.map.enableScrollWheelZoom();
			//$scope.toolbar = new $scope.Draw($scope.map, {showTooltips: true});
			//console.log("setFillSymbol");
			$scope.toolbar.setFillSymbol($scope.highlightSymbol);
			//console.log($scope.toolbar);
			$scope.toolbar.on("draw-end", $scope.addGraphic);
			$scope.map.on("mouse-up", $scope.showCoordinates);
			$scope.map.on("extent-change", $scope.showCoordinates);
			$scope.map.on("zoom-end", $scope.updateExtent);
			//$scope.map.on("mouse-move", $scope.showCursorCoordinates);
			if ((window.sessionStorage.getItem('rawCoords') !== null && window.sessionStorage.getItem('rawCoords') !== "undefined") && (window.sessionStorage.getItem('zoomLevel') !== null && window.sessionStorage.getItem('zoomLevel') !== "undefined")) {
				var rawCoords = window.sessionStorage.getItem('rawCoords');
				var zoomLevel = window.sessionStorage.getItem('zoomLevel');
			}
			else if ((window.sessionStorage.getItem('rawCoords') !== null && window.sessionStorage.getItem('rawCoords') !== "undefined") && (window.sessionStorage.getItem('zoomLevel') == null && window.sessionStorage.getItem('zoomLevel') == "undefined")) {
				var rawCoords = window.sessionStorage.getItem('rawCoords');
			}
			else if (window.sessionStorage.getItem('parcelID') !== null && window.sessionStorage.getItem('parcelID') !== "undefined") {
				var parcelID = window.sessionStorage.getItem('parcelID');
			}
			else {
				var rawCoords = $location.search().location;
				var zoomLevel = $location.search().zoom;
			}

			//==========this is for the calls from the county's assessment system
			// if redirectToDisclaimer is true, this variable may already be caught in the sessionStorage
			// don't reassign it again to undefined
			if (!parcelID) {
				var parcelID = $location.search().parcelID;
			}
			var parcelOwner = $location.search().ownername;
			var parcelAddr = $location.search().address;
			if (parcelID || parcelOwner || parcelAddr) {
				$scope.callFromAS = 'yes';
				var fullUrl = $location.absUrl();
			}
			if (parcelID) {
				let decodedSearch = decodeUrlForSearch(fullUrl, 'parcelID');
				$scope.searchFromAS('parcelID=' + decodedSearch);
			}
			else if (parcelOwner) {
				let decodedSearch = decodeUrlForSearch(fullUrl, 'ownername');
				$scope.searchFromAS('ownername=' + decodedSearch);
			}
			else if (parcelAddr) {
				let decodedSearch = decodeUrlForSearch(fullUrl, 'address');
				$scope.searchFromAS('address=' + decodedSearch);
			}
			//==========
			else if (rawCoords) {
				var coords = rawCoords.split("_");
				if (coords) {
					var point = new esri.geometry.Point({
						latitude: coords[1],
						longitude: coords[0]
					});
					if (zoomLevel) {
						$scope.map.centerAndZoom(point, zoomLevel);
					} else {
						$scope.map.centerAt(point);
					}

				}

			}

			$scope.basemapGallery = new $scope.BasemapGallery({
				showArcGISBasemaps: true,
				map: $scope.map
			}, "basemapGallery");
			var vgin = new esri.dijit.BasemapLayer({
				url: "https://vginmaps.vdem.virginia.gov/arcgis/rest/services/VBMP_Imagery/MostRecentImagery_WGS/MapServer"
			});
			var vginImage = new esri.dijit.Basemap({
				layers: [vgin],
				title: "VGIN Imagery",
				thumbnailUrl: "img/vgin.jpg"
			});
			$scope.basemapGallery.add(vginImage);

			if ($scope.customBasemap == 'true') { $scope.addCustomBasemap(); }


			$scope.basemapGallery.startup();
			var overviewMapDijit = new $scope.OverviewMap({
				map: $scope.map

			});
			overviewMapDijit.startup();

			$scope.basemapGallery.on("load", function () {//console.log($scope.baseMapOrder[0].length);	
				//remove basemaps if any requests
				if ($scope.removeBaseMaps[0].length > 0) {
					for (var j = 0; j < $scope.removeBaseMaps.length; j++) {
						//basemapGallery.remove("basemap_1");
						$scope.basemapGallery.remove($scope.removeBaseMaps[j]);
					}
				}
				//re-order basemap gallery if any requests
				if ($scope.baseMapOrder[0].length > 0) {
					for (var j = $scope.baseMapOrder.length - 1; j > -1; j--) {//alert("a");
						var nd = document.getElementById("galleryNode_" + $scope.baseMapOrder[j]);
						//console.log(nd);
						nd.parentElement.insertBefore(nd, nd.parentElement.childNodes[0]);

					}
				}
				//change basemap title if any requests						
				if ($scope.baseMapTitles.length > 0) {
					for (var j = 0; j < $scope.baseMapTitles.length; j++) {
						document.getElementById("galleryNode_" + $scope.baseMapTitles[j][0]).childNodes[1].childNodes[0].innerHTML = $scope.baseMapTitles[j][1];
						document.getElementById("galleryNode_" + $scope.baseMapTitles[j][0]).childNodes[1].childNodes[0].setAttribute("alt", $scope.baseMapTitles[j][1]);	//text
						document.getElementById("galleryNode_" + $scope.baseMapTitles[j][0]).childNodes[1].childNodes[0].setAttribute("title", $scope.baseMapTitles[j][1]);
						document.getElementById("galleryNode_" + $scope.baseMapTitles[j][0]).childNodes[0].childNodes[0].setAttribute("alt", $scope.baseMapTitles[j][1]);	//thumb image
						document.getElementById("galleryNode_" + $scope.baseMapTitles[j][0]).childNodes[0].childNodes[0].setAttribute("title", $scope.baseMapTitles[j][1]);
					}
				}
				//set default basemap
				$scope.basemapGallery.select($scope.defaultBasemap);

				//populate the swipe basemaps
				if ($scope.swipeTool == "true") {
					let supportedBasemaps = getSupportedBasemaps($scope);
					$scope.swipeBasemaps = [];
					for (var i = 0; i < supportedBasemaps.length; i++) {
						let currentBasemap = supportedBasemaps[i];
						let updatedTitle = false;
						$scope.swipeBasemaps[i] = {};
						for (var j = 0; j < $scope.baseMapTitles.length; j++) {
							if ($scope.baseMapTitles[j][0] == currentBasemap.id) {
								$scope.swipeBasemaps[i].title = $scope.baseMapTitles[j][1];
								currentBasemap.title = $scope.baseMapTitles[j][1];
								updatedTitle = true;
								break;
							}
						}
						if (!updatedTitle) {
							$scope.swipeBasemaps[i].title = currentBasemap.title;
						}

						if (currentBasemap.itemId !== undefined) {
							$scope.swipeBasemaps[i].itemId = currentBasemap.itemId;
							$scope.swipeBasemaps[i].urls = [];

							// get the services for each AGOL map
							var jsonUrl = "https://www.arcgis.com/sharing/rest/content/items/" + $scope.swipeBasemaps[i].itemId + "/data"
							$.ajax({
								async: false,
								url: jsonUrl,
								dataType: "json",
								success: function (data) {
									for (var k = 0; k < data.baseMap.baseMapLayers.length; k++) {
										if (data.baseMap.baseMapLayers[k].layerType == "VectorTileLayer") {
											$scope.swipeBasemaps[i].urls.push([data.baseMap.baseMapLayers[k].layerType, data.baseMap.baseMapLayers[k].styleUrl]);
										}
										else {
											$scope.swipeBasemaps[i].urls.push([data.baseMap.baseMapLayers[k].layerType, data.baseMap.baseMapLayers[k].url]);
										}
									}
								}
							})
						}
						else {
							$scope.swipeBasemaps[i].urls = []
							$scope.swipeBasemaps[i].urls.push(["ArcGISTiledMapServiceLayer", currentBasemap.layers[0].url]);
						}
					}
				}
			});

			function getSupportedBasemaps($scope) {
				let supportedBasemaps = [];
				for (let i = 0; i < $scope.basemapGallery.basemaps.length; i++) {
					let currentBasemap = $scope.basemapGallery.basemaps[i]
					if (isSupportedBasemap(currentBasemap)) {
						supportedBasemaps.push(currentBasemap);
					}
				}
				return supportedBasemaps;
			}

			function isSupportedBasemap(basemap) {
				try {
					if (!basemap.layers) {
						// AGOL basemap
						return true;
					}
					for (let i = 0; i < basemap.layers.length; i++) {
						if (basemap.layers[i].type === "WebTiledLayer") {
							return false;
						}
					}
					return true;
				}
				catch (e) {
					return false;
				}
			}

			$scope.basemapGallery.on("selection-change", function () {
				document.getElementById("baseMapCheck").checked = true;
				var lname = $("#map_layers :first-child").attr('id');
				$("#" + lname).css("opacity", $("#baseMapTransparency").val() / 100);
			});

			$("#basemapGallery").append('<img src="img/close.png" id="closeBasemapGallery" />');
			$("#closeBasemapGallery").click(function () {
				$("#basemapGallery").removeClass("active");
				$("#basemapGalleryButton").css("opacity", 0.8);
			});

			$scope.basemapGallery.on("error", function (msg) {
				console.log("basemap gallery error:  ", msg);
			});

			$("#map_root").click(function () {
				$("#basemapGallery").removeClass("active");
				$("#basemapGalleryButton").css("opacity", 0.8);
			});

			$scope.esriConfig.defaults.io.alwaysUseProxy = false;

			var buildLegend = setInterval(function () {
				clearInterval(buildLegend);
				function buildZoomToggles(layer) {
					$scope.zoomToggles.push({
						id: layer.id,
						min: layer.minScale,
						max: layer.maxScale
					});
				}

				for (var k in $scope.layersArray) {
					if ($scope.layersArray.hasOwnProperty(k)) {
						buildZoomToggles($scope.layersArray[k]);
					}

				}
				$scope.currentScale = $scope.scaleUtils.getScale($scope.map);
				if ($scope.draggableParcelIdentify == 'true') {
					$(".title").addClass('draggablePopup');
				}
			}, 1000);
		}

		this.updateVisEye = function ($scope) {
			if ($scope.map) {
				$scope.currentScale = $scope.scaleUtils.getScale($scope.map).toFixed(6);
				if ($scope.currentScale == 0) {
					var scales = { 8: 2311162.217155, 9: 1155581.108577, 10: 577790.554289, 11: 288895.277144, 12: 144447.638572, 13: 72223.819286, 14: 36111.909643, 15: 18055.954822, 16: 9027.977411, 17: 4513.988705 }
					$scope.currentScale = scales[$scope.initZoom]
				}
			}
			$scope.visbleLayers = [];
			for (var i = 0; i < $scope.checkboxList.length; i++) {   //[i][0]=lname; [i][1]=lid; [i][2]=minS; [i][3]=maxS;             
				if ($scope.currentScale && ($scope.checkboxList[i][2] != 0 && $scope.currentScale > $scope.checkboxList[i][2])
					|| ($scope.checkboxList[i][3] != 0 && $scope.currentScale < $scope.checkboxList[i][3])) {
					//alert($scope.checkboxList[i][0]) ;            
					$("#" + $scope.checkboxList[i][0] + "Check").parent().parent().css("opacity", "0.4").css("pointer-events", "none");
					$("#" + $scope.checkboxList[i][0] + "Check").attr("disabled", "disabled");
					$("#" + $scope.checkboxList[i][0] + "Check").parent().children("label").addClass("inactive");
				}
				else {    //enable
					$("#" + $scope.checkboxList[i][0] + "Check").parent().parent().css("opacity", "1").css("pointer-events", "auto");
					$("#" + $scope.checkboxList[i][0] + "Check").removeAttr("disabled");
					$("#" + $scope.checkboxList[i][0] + "Check").parent().children("label").removeClass("inactive");
				}
			}
		}

		this.initToggle = function ($scope) {

			if ($scope.initLayers[0].length > 0) {
				$scope.initLayerList = $scope.initLayers;	//initial layer names defined in config.json
			}
			else {	//initial layer names detected from layersUI.createList()
				$scope.initLayerList = $scope.initLayerNamesArray
			}
			try {
				for (var i = 0; i < $scope.initLayerList.length; i++) {
					var lname = $scope.initLayerList[i];
					$("#" + lname + "Check").parent().parent().css("opacity", "1").css("pointer-events", "auto");
					$("#" + lname + "_layer").css("visibility", "visible");
					// $("#"+lname+"_layer").css("opacity", 0.5); //****************
					$("#" + lname + "Check").checked = true;
					//console.log(lname);
					document.getElementById(lname + "Check").checked = true;
				}

				// $scope.dmsLayer.setOpacity(0.6);
				$("#map_layer1").css("opacity", $scope.initOpacity / 100);
				$("#overlayTransparency").val($scope.initOpacity);
				//for ipad search bar
				$("#ndefaultSearch").css("display", "none");
				setTimeout(function () { $scope.showMapScale(); $("#search2").prop('disabled', false); $("#ndefaultSearch").css("display", "block"); }, 20);
			}
			catch (err) {
				//alert(err.message);		
				window.location.reload();
			}

		}
	});

//})();