// source --> https://mz.pan.pl/wp-content/plugins/wd-google-maps/js/init_map.js?ver=1.0.73 
////////////////////////////////////////////////////////////////////////////////////////
// Events                                                                             //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Constants                                                                          //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Variables                                                                          //
////////////////////////////////////////////////////////////////////////////////////////
var gmwdmapDataOptions = [];

////////////////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor                                                           //
////////////////////////////////////////////////////////////////////////////////////////

function gmwdInitMainMap(el, excludeOverlays, key){

	gmwdmapData["main_map" + key] = new google.maps.Map(document.getElementById(el), {
		center: {lat: gmwdmapData["centerLat" + key], lng: gmwdmapData["centerLng" + key]},
		zoom: gmwdmapData["zoom" + key],
		maxZoom: gmwdmapData["maxZoom" + key],
		minZoom: gmwdmapData["minZoom" + key],
		scrollwheel: gmwdmapData["mapWhellScrolling" + key],
		draggable: gmwdmapData["mapDragable" + key],
        disableDoubleClickZoom: gmwdmapData["mapDbClickZoom" + key],
		zoomControl: gmwdmapData["enableZoomControl" + key],
		mapTypeControl: gmwdmapData["enableMapTypeControl" + key],
		scaleControl: gmwdmapData["enableScaleControl" + key],
		streetViewControl: gmwdmapData["enableStreetViewControl" + key],
		fullscreenControl: gmwdmapData["enableFullscreenControl" + key],
		rotateControl: gmwdmapData["enableRotateControl" + key],
        zoomControlOptions:{
            position: gmwdmapData["zoomControlPosition" + key]
        },
        mapTypeControlOptions:{
            position: gmwdmapData["mapTypeControlPosition" + key],
            style: gmwdmapData["mapTypeControlStyle" + key]
        },
        fullscreenControlOptions:{
            position: gmwdmapData["fullscreenControlPosition" + key]
        },
        streetViewControlOptions:{
            position: gmwdmapData["streetViewControlPosition" + key]
        },

	});
    gmwdmapData["main_map" + key].setTilt(45);
	gmwdSetMapTypeId(key);


	//themes
    jQuery("#wd-map" + key).css("border-radius", gmwdmapData["mapBorderRadius" + key] + "px");


	//layers
	gmwdSetLayers("bike", key);
	gmwdSetLayers("traffic", key);
	gmwdSetLayers("transit", key);

	if(excludeOverlays == false){
        // overlays
        gmwdSetMapMarkers(key);
        gmwdSetMapPolygons(key);
        gmwdSetMapPolylines(key);
    }

    jQuery(document).on("click",".gm-fullscreen-control",function(){
        setTimeout(function(){ 
            gmwdmapData["main_map" + key].setCenter({lat: Number(gmwdmapData["centerLat" + key]), lng: Number(gmwdmapData["centerLng" + key])});
            gmwdmapData["main_map" + key].setZoom(gmwdmapData["zoom" + key]);
        }, 300);

    });  

}

function decodeEntities(encodedString) {
  var textArea = document.createElement('textarea');
  textArea.innerHTML = encodedString;
  return textArea.value;
}

function gmwdSetMapMarkers(_key){
	var mapMarker;
    if(Object.keys(gmwdmapData["mapMarkers" + _key]).length > 0){
        for(var key in gmwdmapData["mapMarkers" + _key]){
            mapMarker = gmwdmapData["mapMarkers" + _key][key];
            var marker = new google.maps.Marker({
                map: gmwdmapData["main_map" + _key],
                position: {lat: Number(mapMarker.lat), lng: Number(mapMarker.lng)}
            });
            gmwdmapData["allMarkers" + _key].push(marker);

            var infoWindow;
            if(mapMarker.enable_info_window == 1){
                contentString = '';

                if(gmwdmapData["infoWindowInfo" + _key].indexOf("title") != -1){
                    contentString += '<div class="gmwd-infowindow-title">' + mapMarker.title + '</div>';
                }
                if(gmwdmapData["infoWindowInfo" + _key].indexOf("address") != -1){
                    contentString += '<div class="gmwd-infowindow-address">' +  mapMarker.address + '</div>';
                } 

                infoWindow = new google.maps.InfoWindow({
                    content: contentString,
                    disableAutoPan: false
                });
                if(mapMarker.info_window_open == 1){
                    infoWindow.open(gmwdmapData["main_map" + _key], marker);
                }
                gmwdmapData["infoWindows" + _key].push(infoWindow);
            }

            if (mapMarker.title) {
              marker.setTitle(decodeEntities(mapMarker.title));
            }

            if(mapMarker.animation == "BOUNCE"){
                marker.setAnimation(google.maps.Animation.BOUNCE)
              }
              else if(mapMarker.animation == "DROP"){
                marker.setAnimation(google.maps.Animation.DROP)
              }
              else{
                marker.setAnimation(null);
              }

            //events
            (function(overlay, row, overlayWindow, map, openEvent, overlayWindows) {

                google.maps.event.addListener(overlay, 'click', function() {
                    if(row.link_url){
                        window.open(row.link_url);
                    }
                    if(openEvent == "click"){
                        if(overlayWindow && row.enable_info_window == 1){
                            for(var j=0; j < overlayWindows.length; j++){
                                overlayWindows[j].open(null, null);
                            }
                            overlayWindow.open(map, overlay);
                        }
                    }
                });
                google.maps.event.addListener(overlay, 'mouseover', function() {
                    if(openEvent == "hover"){
                        if(overlayWindow && row.enable_info_window == 1){
                            for(var j=0; j < overlayWindows.length; j++){
                                overlayWindows[j].open(null, null);
                            }
                            overlayWindow.open(map, overlay);
                        }
                    }
                });

            }(marker, mapMarker, infoWindow, gmwdmapData["main_map" + _key], gmwdmapData["infoWindowOpenOn" + _key], gmwdmapData["infoWindows" + _key]));

        }
    }

}


function gmwdSetMapPolygons(_key){
	var mapPolygon, polygon;
    var polygonsByAreas = {};
    var polygonsAreas = [];
    if(Object.keys(gmwdmapData["mapPolygons" + _key]).length > 0){
        for(var key in gmwdmapData["mapPolygons" + _key]){
            var polygonCoord = [];
            mapPolygon = gmwdmapData["mapPolygons" + _key][key];
            polygonData = mapPolygon.data.substr(1, mapPolygon.data.length-4).split("),(");
            for(var j=0; j<polygonData.length; j++){
                var polygonMarker = polygonData[j].split(",");
                if(mapPolygon.show_markers == 1){
                    var marker = new google.maps.Marker({
                        map: gmwdmapData["main_map" + _key],
                        position: {lat: Number(polygonMarker[0]), lng: Number(polygonMarker[1]) }
                    });
                    marker.setMap(gmwdmapData["main_map" + _key]);
                    gmwdmapData["allPolygonMarkers" + _key].push(marker);
                }
                polygonCoord.push(new google.maps.LatLng( Number(polygonMarker[0]), Number(polygonMarker[1])));
            }

            polygon = new google.maps.Polygon({
                strokeWeight:Number(mapPolygon.line_width),
                strokeColor: "#" + mapPolygon.line_color,
                strokeOpacity: Number(mapPolygon.line_opacity),
                fillColor: "#" + mapPolygon.fill_color,
                fillOpacity: Number(mapPolygon.fill_opacity),
                paths: polygonCoord,
            });

            gmwdmapData["allPolygons" + _key].push(polygon);
            //polygon.setMap(gmwdmapData["main_map" + _key]);
            var polygonArea = google.maps.geometry.spherical.computeArea(polygon.getPath());
            polygonsByAreas[polygonArea] = [polygon];
            polygonsAreas.push(polygonArea);
            (function(overlay, row, map) {

                google.maps.event.addListener(overlay,"mouseover",function(){
                    if(row.title){
                        this.getMap().getDiv().setAttribute('title',row.title);
                     }
                });
                google.maps.event.addListener(overlay,"mouseout",function(){
                    this.getMap().getDiv().removeAttribute('title');
                });

            }(polygon, mapPolygon, gmwdmapData["main_map" + _key]));

        }
    }
    polygonsAreas.sort(function(a,b){return b - a});

    for(var i=0; i< polygonsAreas.length ; i++){
        polygonsByAreas[polygonsAreas[i]][0].setMap(gmwdmapData["main_map" + _key]);
        polygonsByAreas[polygonsAreas[i]][0].setOptions({zIndex: i+1});

    }

}

function gmwdSetMapPolylines(_key){
	var mapPolyline, polyline;
	if(Object.keys(gmwdmapData["mapPolylines" + _key]).length > 0){
        for(var key in gmwdmapData["mapPolylines" + _key]){
            var polylineCoord = [];
            mapPolyline = gmwdmapData["mapPolylines" + _key][key];
            polylineData = mapPolyline.data.substr(1, mapPolyline.data.length-4).split("),(");
            for(var j=0; j<polylineData.length; j++){
                var polylineMarker = polylineData[j].split(",");
                if(mapPolyline.show_markers == 1){
                    var marker = new google.maps.Marker({
                        map: gmwdmapData["main_map" + _key],
                        position: {lat: Number(polylineMarker[0]), lng: Number(polylineMarker[1]) }
                    });
                    gmwdmapData["allPolylineMarkers" + _key].push(marker);
                    marker.setMap(gmwdmapData["main_map" + _key]);
                }
                polylineCoord.push(new google.maps.LatLng( Number(polylineMarker[0]), Number(polylineMarker[1])));
            }

            polyline = new google.maps.Polyline({
                strokeWeight:Number(mapPolyline.line_width),
                strokeColor: "#" + mapPolyline.line_color,
                strokeOpacity: Number(mapPolyline.line_opacity),
                path: polylineCoord,
                geodesic: true,
            });
            gmwdmapData["allPolylines" + _key].push(polyline);
            polyline.setMap(gmwdmapData["main_map" + _key]);

            (function(overlay, row, map) {
                google.maps.event.addListener(overlay,"mouseover",function(){
                    if(row.title){
                        this.getMap().getDiv().setAttribute('title',row.title);
                     }
                });
                google.maps.event.addListener(overlay,"mouseout",function(){
                    this.getMap().getDiv().removeAttribute('title');
                });

            }(polyline,  mapPolyline, gmwdmapData["main_map" + _key]));


        }
    }

}


////////////////////////////////////////////////////////////////////////////////////////
// Public Methods                                                                     //
////////////////////////////////////////////////////////////////////////////////////////


function gmwdSetMapTypeId(key){
	switch(gmwdmapData["mapType" + key]){
		case "0" :
			gmwdmapData["main_map" + key].setMapTypeId(google.maps.MapTypeId.ROADMAP);
			break;
		case "1" :
			gmwdmapData["main_map" + key].setMapTypeId(google.maps.MapTypeId.SATELLITE);
			break;
		case "2":
			gmwdmapData["main_map" + key].setMapTypeId(google.maps.MapTypeId.HYBRID);
			break;
		case "3":
			gmwdmapData["main_map" + key].setMapTypeId(google.maps.MapTypeId.TERRAIN);
			break;
	}
}


function gmwdSetLayers(type, key){
	switch(type){
		case "bike" :
			if(gmwdmapData["enableBykeLayer" + key] == 1){
				 gmwdmapDataOptions["bikeLayer" + key] = new google.maps.BicyclingLayer();
				 gmwdmapDataOptions["bikeLayer" + key].setMap(gmwdmapData["main_map" + key]);
			 }
			 else{
				if(gmwdmapDataOptions["bikeLayer" + key]){
					gmwdmapDataOptions["bikeLayer" + key].setMap(null);
				}
			 }
			 break;
		case "traffic" :
			if(gmwdmapData["enableTrafficLayer" + key] == 1){
				gmwdmapDataOptions["trafficLayer" + key] = new google.maps.TrafficLayer();
				gmwdmapDataOptions["trafficLayer" + key].setMap(gmwdmapData["main_map" + key]);
			 }
			 else{
				if(gmwdmapDataOptions["trafficLayer" + key]){
					gmwdmapDataOptions["trafficLayer" + key].setMap(null);
				}
			 }
			 break;
		case "transit" :
			if(gmwdmapData["enableTransitLayer" + key] == 1){
				gmwdmapDataOptions["transitLayer" + key] = new google.maps.TransitLayer();
				gmwdmapDataOptions["transitLayer" + key].setMap(gmwdmapData["main_map" + key]);
			 }
			 else{
				if(gmwdmapDataOptions["transitLayer" + key]){
					gmwdmapDataOptions["transitLayer" + key].setMap(null);
				}
			 }
			 break;
	}
}






////////////////////////////////////////////////////////////////////////////////////////
// Getters & Setters                                                                  //
////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////
// Private Methods                                                                    //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Listeners                                                                          //
////////////////////////////////////////////////////////////////////////////////////////;
// source --> https://mz.pan.pl/wp-content/plugins/wd-google-maps/js/frontend_main.js?ver=1.0.73 
////////////////////////////////////////////////////////////////////////////////////////
// Events                                                                             //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Constants                                                                          //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Variables                                                                          //
////////////////////////////////////////////////////////////////////////////////////////
var frontendData = [];
var cnterLat, cnterLng;
var ajaxData = {};
 
////////////////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor                                                           //
////////////////////////////////////////////////////////////////////////////////////////

function gmwdReadyFunction(key){
    // serach box
    if(gmwdmapData["enableSerchBox" + key] == 1){
        initSerachBox(key);
    }
    // geolocate user 
    if(gmwdmapData["geolocateUser" + key] == 1){     
        geoLocateUser(key);
    }

	//store locator
	if(gmwdmapData["enableStoreLocatior" + key] == 1 && gmwdmapData["widget" + key] == 0){
    
        jQuery(".gmwd_my_location_store_locator" + key).click(function(){
			var input = jQuery("#gmwd_store_locator_address"  + key);	
            getMyLocation(input);
		});
        
		var input = /** @type {!HTMLInputElement} */(
		  document.getElementById('gmwd_store_locator_address' + key));

		var autocomplete = new google.maps.places.Autocomplete(input);
		autocomplete.bindTo('bounds', gmwdmapData["main_map" + key]);
		
		/*autocomplete.addListener('place_changed', function() {
			var place = autocomplete.getPlace();
			if (!place.geometry) {
				window.alert("Autocomplete's returned place contains no geometry");
				return;
			}           
			cnterLat = place.geometry.location.lat(); 
			cnterLng = place.geometry.location.lng();
		});*/
			
		jQuery("#gmwd_store_locator_search" + key).click(function(){
            if(jQuery(".gmwd_store_locator_address" + key).val() == ""){
                alert("Please set location.");
                return false;
            }
			if(gmwdmapDataOptions["storeLocatorCircle" + key]){
				gmwdmapDataOptions["storeLocatorCircle" + key].setMap(null);
			}
			if(gmwdmapData["storeLocatorDistanceIn" + key] == "km"){
				var radius = Number(jQuery("#gmwd_store_locator_radius" + key + " :selected").val())*1000;
			}
			else if(gmwdmapData["storeLocatorDistanceIn" + key] == "mile"){
				var radius = Number(jQuery("#gmwd_store_locator_radius" + key + " :selected").val())*1609.34;
			}
            
            var geocoder = new google.maps.Geocoder();
            geocoder.geocode({
                "address": jQuery(".gmwd_store_locator_address" + key).val()
            }, function(results) {
                cnterLat = results[0].geometry.location.lat();             
                cnterLng = results[0].geometry.location.lng();  

                gmwdmapData["ajaxData" + key]["map_id"] = gmwdmapData["mapId" + key];
                gmwdmapData["ajaxData" + key]["page"] = "map";
                gmwdmapData["ajaxData" + key]["action"] = "get_ajax_store_loactor";
                gmwdmapData["ajaxData" + key]["task"] = "get_ajax_store_loactor";
                gmwdmapData["ajaxData" + key]["radius"] = Number(jQuery("#gmwd_store_locator_radius" + key + " :selected").val());
                gmwdmapData["ajaxData" + key]["lat"] = cnterLat;
                gmwdmapData["ajaxData" + key]["lng"] = cnterLng;
                gmwdmapData["ajaxData" + key]["distance_in"] = gmwdmapData["storeLocatorDistanceIn" + key];
                gmwdmapData["ajaxData" + key]["categories"] = [];
     
                jQuery.post(ajaxURL, gmwdmapData["ajaxData" + key], function (response){
         
                    gmwdmapData["mapMarkers" + key] = JSON.parse(response);
                    for(var i=0; i<gmwdmapData["allMarkers" + key].length; i++){
                        gmwdmapData["allMarkers" + key][i].setMap(null);
                    }
                    gmwdmapData["allMarkers" + key] = [];
                    gmwdSetMapMarkers(key);
                    if(gmwdmapData["markerListInsideMap" + key] == 1){
                        gmwdMarkerListInsideMap(key, gmwdmapData["mapMarkers" + key]); 
                    }
                });

                gmwdmapDataOptions["storeLocatorCircle" + key] = new google.maps.Circle({
                    strokeWeight: 2,
                    strokeColor: "#000000",
                    strokeOpacity: 0.6,
                    fillColor: "#7FDF16",
                    fillOpacity: 0.3,
                    center: {lat : cnterLat, lng: cnterLng},
                    radius: radius
                });
                
                gmwdmapDataOptions["storeLocatorCircle" + key].setMap(gmwdmapData["main_map" + key]);     
               
                gmwdmapData["main_map" + key].setCenter({lat : cnterLat, lng: cnterLng});                
                gmwdmapData["main_map" + key].setZoom(Number(gmwdmapData["zoom" + key]));                
            });
   
			return false;	
		
		});
		
		jQuery("#gmwd_store_locator_reset" + key).click(function(){
			if(gmwdmapDataOptions["storeLocatorCircle" + key]){
				gmwdmapDataOptions["storeLocatorCircle" + key].setMap(null);
			}
			gmwdmapData["ajaxData" + key] = {};
			gmwdmapData["ajaxData" + key]["map_id"] = gmwdmapData["mapId" + key];
			gmwdmapData["ajaxData" + key]["page"] = "map";
			gmwdmapData["ajaxData" + key]["action"] = "get_ajax_markers";
			gmwdmapData["ajaxData" + key]["task"] = "get_ajax_markers";
            
			jQuery.post(ajaxURL, gmwdmapData["ajaxData" + key], function (data){
				gmwdmapData["mapMarkers" + key] = JSON.parse(data);
				for(var i=0; i<gmwdmapData["allMarkers" + key].length; i++){
					gmwdmapData["allMarkers" + key][i].setMap(null);
				}
				gmwdmapData["allMarkers" + key] = [];
				gmwdSetMapMarkers(key);

			});
			           
			jQuery("#gmwd_store_locator_address" + key).val("");
			return false;	
		});		
	
	}
}	
////////////////////////////////////////////////////////////////////////////////////////
// Public Methods                                                                     //
////////////////////////////////////////////////////////////////////////////////////////

function gmwdSearch(fieldName, values, key ){
    gmwdmapData["ajaxData" + key]["page"] = "map";
    gmwdmapData["ajaxData" + key][fieldName] = values;
    gmwdmapData["ajaxData" + key]["map_id"] = gmwdmapData["mapId" + key];   
    gmwdmapData["ajaxData" + key]["action"] = "get_ajax_markers";
    gmwdmapData["ajaxData" + key]["task"] = "get_ajax_markers";
     
    jQuery.post(ajaxURL, gmwdmapData["ajaxData" + key], function (data){
        gmwdmapData["mapMarkers" + key] = JSON.parse(data);              
        for(var i=0; i<gmwdmapData["allMarkers" + key].length; i++){
            gmwdmapData["allMarkers" + key][i].setMap(null);
        }
        gmwdmapData["allMarkers" + key] = [];
        gmwdSetMapMarkers(key);

    });        

}


function geoLocateUser(key){
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {      
          var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
          var marker = new google.maps.Marker({
                map: gmwdmapData["main_map" + key],
                position: latlng,
                icon: GMWD_URL + '/images/geoloc.png'
          });
          var geocoder = new google.maps.Geocoder();
            geocoder.geocode({"latLng":latlng},function(data,status){	 
                if(status == google.maps.GeocoderStatus.OK){	            
                    var address = data[1].formatted_address; 
                    
                    gmwdmapData["main_map" + key].setCenter(latlng);
                    gmwdmapData["main_map" + key].setZoom(13);
                    var infoWindow = new google.maps.InfoWindow({map: gmwdmapData["main_map" + key]});		
                    infoWindow.setPosition(latlng);
                    var contentString = address; 
                    if(gmwdmapData["enableDirections" + key] == 1 ){
                        contentString += "<br> <a href='javascript:void(0)' data-lat='" + position.coords.latitude + "' data-lng='" +Number(position.coords.longitude) + "' data-address='" + address + "' class='gmwd_direction' onclick='showDirectionsBox(this);' data-key='" + key + "'>Get Directions</a>";
                    }
                    infoWindow.setContent(contentString);
                }
           });
	
        }, function() {
          alert('Error: Your browser doesn\'t support geolocation.');
        });
    } 
    else {
        // Browser doesn't support Geolocation
        alert('Error: Your browser doesn\'t support geolocation.');
    }
}
function getMyLocation(input){
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            var geocoder = new google.maps.Geocoder();
            geocoder.geocode({"latLng":latlng},function(data,status){	 
                if(status == google.maps.GeocoderStatus.OK){	            
                    var address = data[1].formatted_address; 
                    input.val(address);
                    cnterLat = data[1].geometry.location.lat(); 
                    cnterLng = data[1].geometry.location.lng();                    
                }
            });
        });
    }
  else{
      alert("Browser doesn't support Geolocation.");
  }	   

}

function initSerachBox(key){
    var input = document.createElement("input");
    input.id = "gmwd_serach_box" + key;
    input.type = "text";
    input.style.cssText = "width:400px;";
    input.setAttribute("onkeypress", "if(event.keyCode == 13) return false;") ;
    input.setAttribute("class", "gmwd_serach_box") ;
    
    searchBox = new google.maps.places.SearchBox(input);
    gmwdmapData["main_map" + key].controls[gmwdmapData["serchBoxPosition" + key]].push(input);
    
    gmwdmapData["main_map" + key].addListener('bounds_changed', function() {
        searchBox.setBounds( gmwdmapData["main_map" + key].getBounds());
    });
 
    searchBox.addListener('places_changed', function() {
        var places = searchBox.getPlaces();
        var bounds = new google.maps.LatLngBounds();
        places.forEach(function(place) {
            if (place.geometry.viewport) {
                // Only geocodes have viewport.
                bounds.union(place.geometry.viewport);
            } else {
                bounds.extend(place.geometry.location);
            }
        });
         gmwdmapData["main_map" + key].fitBounds(bounds);
    });

}
////////////////////////////////////////////////////////////////////////////////////////
// Getters & Setters                                                                  //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Private Methods                                                                    //
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Listeners                                                                          //
////////////////////////////////////////////////////////////////////////////////////////;