// source --> https://aguasol24.com/wp-content/themes/apushome/js/maps/jquery-google-map-custom.js?ver=1.2 
/*!
 * jQuery Google Map
 *
 * @author Pragmatic Mates, http://pragmaticmates.com
 * @version 1.2
 * @license GPL 2
 * @link https://github.com/PragmaticMates/jquery-google-map
 */


(function ($) {
	var settings;
	var element;
	var map;
	var markers = new Array();
	var markerCluster;
	var clustersOnMap = new Array();
	var clusterListener;

	var methods = {
		init: function (options) {
			element = $(this);
			var defaults = $.extend({
				geolocation: false,
				styles: null,
				zoom: 14,
				markers: [],
				infowindow: {
					borderBottomSpacing: 6,
					height: 150,
					width: 340,
                    offsetX: -21,
                    offsetY: -21
				},
				marker: {
					height: 40,
					width: 40
				},
				cluster: {
					height: 40,
					width: 40,
					gridSize: 40
				}
			});

			settings = $.extend({}, defaults, options);

			loadMap();

			if (options.callback) {
				options.callback();
			}

			return $(this);
		},

		removeMarkers: function () {
			for (i = 0; i < markers.length; i++) {
				markers[i].infobox.close();
				markers[i].marker.close();
				markers[i].setMap(null);
			}

			markerCluster.clearMarkers();

			$.each(clustersOnMap, function (index, cluster) {
				cluster.cluster.close();
			});

			clusterListener.remove();
		},

		addMarkers: function (options) {
			markers = new Array();
			settings.locations = options.locations;
			settings.contents = options.contents;
			settings.types = options.types;
			settings.markers = options.markers;

			renderElements();

			if (settings.center === undefined) {
				if ( settings.markers.length > 1 ) {
		            var bound = new google.maps.LatLngBounds();
		            for (var i in settings.markers) {
		                bound.extend(new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude));
		            }
		            map.fitBounds(bound);
	            } else {
		        	for (var i in settings.markers) {
		                map.setCenter( new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude) );
		            }
		        }
	        }
		}
	}

	$.fn.google_map = function (method) {
		if (methods[method]) {
			return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exist on Aviators Map');
		}
	};

	function loadMap() {
		var mapOptions = {
			zoom: settings.zoom,
			styles: settings.styles,
			mapTypeId: google.maps.MapTypeId.ROADMAP,
			scrollwheel: false,
			draggable: true,
			mapTypeControl: false,
			panControl: false,
			zoomControl: true,
			zoomControlOptions: {
				style: google.maps.ZoomControlStyle.SMALL,
				position: google.maps.ControlPosition.LEFT_BOTTOM
			}
		};

        if (settings.center !== undefined) {
            mapOptions.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude);
        }

		map = new google.maps.Map($(element)[0], mapOptions);

		if (settings.geolocation) {
			if (navigator.geolocation) {
				browserSupportFlag = true;
				navigator.geolocation.getCurrentPosition(function (position) {
					initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
					map.setCenter(initialLocation);
				}, function () {
					map.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude);
				});
			} else {
				browserSupportFlag = false;
				map.center = new google.maps.LatLng(settings.center.latitude, settings.center.longitude);
			}
		}

        if (settings.center === undefined) {
        	if ( settings.markers.length > 1 ) {
	            var bound = new google.maps.LatLngBounds();
	            for (var i in settings.markers) {
	                bound.extend(new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude));
	            }
	            map.fitBounds(bound);
	        } else {
	        	for (var i in settings.markers) {
	                map.setCenter( new google.maps.LatLng(settings.markers[i].latitude, settings.markers[i].longitude) );
	            }
	        }
        }

		google.maps.event.addListener(map, 'zoom_changed', function () {
            $.each(markers, function (index, marker) {
                if (marker.infobox !== undefined) {
                    marker.infobox.close();
                    marker.infobox.isOpen = false;
                }
            });
		});

		renderElements();
		clickClusterOnMap();
	}

	function isClusterOnMap(clustersOnMap, cluster) {
		if (cluster === undefined) {
			return false;
		}

		if (clustersOnMap.length == 0) {
			return false;
		}

		var val = false;

		$.each(clustersOnMap, function (index, cluster_on_map) {
			if (cluster_on_map.getCenter() == cluster.getCenter()) {
				val = cluster_on_map;
			}
		});

		return val;
	}

	function clickClusterOnMap() {
		$('body').on('click', '.clusterer', function(){
			var center = $(this).data('center');
			var cluster = false;
			$.each(clustersOnMap, function (index, cluster_on_map) {
				if (cluster_on_map.getCenter() == center) {
					
					cluster = cluster_on_map;
				}
			});

			if ( cluster ) {
				map.setCenter(cluster.getCenter());
				map.fitBounds(cluster.getBounds());
			}
		});
	}

	function addClusterOnMap(cluster) {
		// Hide all cluster's markers
		$.each(cluster.getMarkers(), (function () {
			if (this.marker.isHidden == false) {
				this.marker.isHidden = true;
				this.marker.close();
			}
		}));

		var newCluster = new InfoBox({
			markers: cluster.getMarkers(),
			draggable: true,
			content: '<div class="clusterer" data-center="'+cluster.getCenter()+'"><div class="clusterer-inner">' + cluster.getMarkers().length + '</div></div>',
			disableAutoPan: true,
			pixelOffset: new google.maps.Size(-21, -21),
			position: cluster.getCenter(),
			closeBoxURL: "",
			isHidden: false,
			enableEventPropagation: true,
			pane: "floatPane"
		});

		cluster.cluster = newCluster;

		cluster.markers = cluster.getMarkers();
		cluster.cluster.open(map, cluster.marker);
		clustersOnMap.push(cluster);
	}

	function renderElements() {
		$.each(settings.markers, function (index, markerObject) {
			// Create invisible markers on the map
			var args = {
				position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude),
				map: map,
			};

			if (settings.transparentMarkerImage) {
				args['icon'] = {
					url: settings.transparentMarkerImage,
					size: new google.maps.Size(settings.marker.width, settings.marker.height)
				};
			}

			var marker = new google.maps.Marker(args);

			// Create infobox for infowindow
			if (markerObject.content) {
				marker.infobox = new InfoBox({
					content: markerObject.content,
					disableAutoPan: true,
					pixelOffset: new google.maps.Size(settings.infowindow.offsetX, settings.infowindow.offsetY, settings.infowindow.offsetX, settings.infowindow.offsetY),
					position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude),
					isHidden: false,
                    closeBoxURL: "",
					pane: "floatPane",
					enableEventPropagation: false
				});

				marker.infobox.isOpen = false;
			}

 			// Create infobox for marker
			marker.marker = new InfoBox({
				draggable: true,
				content: markerObject.marker_content,
				disableAutoPan: true,
				pixelOffset: new google.maps.Size(-settings.marker.width/2, -settings.marker.height),
				position: new google.maps.LatLng(markerObject.latitude, markerObject.longitude),
				closeBoxURL: "",
				isHidden: false,
				pane: "floatPane",
				enableEventPropagation: true,
			});

			// Handle logic for opening/closing info windows
			marker.marker.isHidden = false;
			marker.marker.open(map, marker);
			markers.push(marker);

			google.maps.event.addListener(marker, 'click', function (e) {
                if (marker.infobox !== undefined) {
                    var curMarker = this;

                    $.each(markers, function (index, marker) {
                        if (marker !== curMarker) {
                            marker.infobox.close();
                            marker.infobox.isOpen = false;
                        }
                    });
                    // center marker
                    map.panTo(curMarker.getPosition());

                    if (curMarker.infobox) {
                        if (curMarker.infobox.isOpen === false) {
                            curMarker.infobox.open(map, this);
                            curMarker.infobox.isOpen = true;
                        } else {
                            curMarker.infobox.close();
                            curMarker.infobox.isOpen = false;
                        }
                    }
                }
			});
		});

		markerCluster = new MarkerClusterer(map, markers, {
            gridSize: settings.cluster.gridSize,
			styles: [
				{
					textColor: 'transparent',
					height: settings.cluster.height,
					url: settings.transparentClusterImage,
					width: settings.cluster.width
				}
			]
		});

		clustersOnMap = new Array();
		clusterListener = google.maps.event.addListener(markerCluster, 'clusteringend', function (clusterer) {
			var availableClusters = clusterer.getClusters();
			var activeClusters = new Array();

			$.each(availableClusters, function (index, cluster) {
				if (cluster.getMarkers().length > 1) {
					activeClusters.push(cluster);
				}
			});

			$.each(availableClusters, function (index, cluster) {
				if (cluster.getMarkers().length > 1) {
					var val = isClusterOnMap(clustersOnMap, cluster);

					if (val !== false) {
						val.cluster.setContent('<div class="clusterer" data-center="'+cluster.getCenter()+'"><div class="clusterer-inner">' + cluster.getMarkers().length + '</div></div>');
						val.markers = cluster.getMarkers();
						$.each(cluster.getMarkers(), (function (index, marker) {
							if (marker.marker.isHidden == false) {
								marker.marker.isHidden = true;
								marker.marker.close();
							}
						}));
					} else {
						addClusterOnMap(cluster);
					}
				} else {
					// Show all markers without the cluster
					$.each(cluster.getMarkers(), function (index, marker) {
						if (marker.marker.isHidden == true) {
							marker.marker.open(map, this);
							marker.marker.isHidden = false;
						}
					});

					// Remove old cluster
					$.each(clustersOnMap, function (index, cluster_on_map) {
						if (cluster !== undefined && cluster_on_map !== undefined) {
							if (cluster_on_map.getCenter() == cluster.getCenter()) {
								// Show all cluster's markers
								cluster_on_map.cluster.close();
								clustersOnMap.splice(index, 1);
							}
						}
					});
				}
			});

			var newClustersOnMap = new Array();

			$.each(clustersOnMap, function (index, clusterOnMap) {
				var remove = true;

				$.each(availableClusters, function (index2, availableCluster) {
					if (availableCluster.getCenter() == clusterOnMap.getCenter()) {
						remove = false;
					}
				});

				if (!remove) {
					newClustersOnMap.push(clusterOnMap);
				} else {
					clusterOnMap.cluster.close();
				}
			});
			
			clustersOnMap = newClustersOnMap;
		});
		

        $(document).on('click', '.infobox .close', function(e) {
            e.preventDefault();

            $.each(markers, function(index, marker) {
                marker.infobox.isHidden = true;
                marker.infobox.close();
            });
        });
	}
})(jQuery);
// source --> https://aguasol24.com/wp-content/themes/apushome/js/maps/script.js?ver=1.0 
var placesIDs = Array(),
        nearbyMarkers = Array(),
        markers = Array();
jQuery( document ).ready(function($) {

    var infobox = new InfoBox({
        disableAutoPan: true, //false
        maxWidth: 275,
        alignBottom: true,
        pixelOffset: new google.maps.Size(-122, -48),
        zIndex: null,
        closeBoxMargin: "0 0 -16px -16px",
        closeBoxURL: '#',
        infoBoxClearance: new google.maps.Size(1, 1),
        isHidden: false,
        pane: "floatPane",
        enableEventPropagation: false
    });
    var propertyInfo = new InfoBox({
        disableAutoPan: false,
        maxWidth: 250,
        pixelOffset: new google.maps.Size(-72, -70),
        zIndex: null,
        boxStyle: {
            'background' : '#ffffff',
            'opacity'    : 1,
            'padding'    : '6px',
            'box-shadow' : '0 1px 2px 0 rgba(0, 0, 0, 0.12)',
            'width'      : '145px',
            'text-align' : 'center',
            'border-radius' : '4px'
        },
        closeBoxMargin: "28px 26px 0px 0px",
        closeBoxURL: "",
        infoBoxClearance: new google.maps.Size(1, 1),
        pane: "floatPane",
        enableEventPropagation: false
    });

	// map
	var ApusThemeMap = {

		init: function() {
            // google map element
            
            if ($('#widget-properties-map-wrapper').length > 0) {
                var map = $('#widget-properties-map-wrapper');
                map.mapescape();
                map.addClass('loading');
                $.ajax({
                    url: apushome_ajax.ajaxurl,
                    type:'POST',
                    dataType: 'json',
                    data:  'action=apushome_properties_map&number=' + map.data('number') + '&types=' + map.data('types') + '&contract=' + map.data('contract')
                        + '&orderby=' + map.data('statuses') + '&statuses=' + map.data('statuses') + '&locations=' + map.data('locations')
                }).done(function(markers) {
                    map.google_map({
                        geolocation: false,
                        infowindow: {
                            borderBottomSpacing: 0,
                            height: 120,
                            width: 424,
                            offsetX: 48,
                            offsetY: -87
                        },
                        zoom: 15,
                        marker: {
                            height: 56,
                            width: 56
                        },
                        cluster: {
                            height: 56,
                            width: 56,
                            gridSize: 60
                        },
                        styles: map.data('style'),
                        transparentMarkerImage: apushome_ajax.transparent_marker,
                        transparentClusterImage: apushome_ajax.transparent_marker,
                        markers: markers
                    });
                    setTimeout(function(){
                        map.removeClass('loading');
                    }, 200);
                });
            }
			
			// single property Tab Gallery map
			ApusThemeMap.initSingleTabMap();

            // single property map
            ApusThemeMap.initSingleMap();
		},
        initSingleTabMap: function() {
            if ( $('#tab-single-property-map').length > 0 ) {
                var $item = $('#tab-single-property-map');
                var lat = $item.data('latitude');
                var lng = $item.data('longitude');
                var propertyMap = null;
                var panorama = null;
                var fenway = new google.maps.LatLng(lat, lng);
                var mapOptions = {
                    center: fenway,
                    zoom: $item.data('zoom'),
                    scrollwheel: false
                };
                var panoramaOptions = {
                    position: fenway,
                    pov: {
                        heading: 34,
                        pitch: 10
                    }
                };

                $('.tabs-gallery-map .tab-google-street-view-map').click(function(){
                    if ( panorama == null ) {
                        setTimeout( function(){
                            panorama = new google.maps.StreetViewPanorama(document.getElementById('single-tab-property-street-view-map'), panoramaOptions);
                        } , 50);
                    }
                });
                if ($('.tabs-gallery-map .tab-google-map').parent().hasClass('active')) {
                    if ( propertyMap == null ) {
                        setTimeout( function(){
                            propertyMap = new google.maps.Map(document.getElementById('tab-single-property-map'), mapOptions);
                            propertyMap.setOptions({styles: $item.data('style')});
                            ApusThemeMap.addMarkers($item, propertyMap);
                            var propertyControl = new ApusThemeMap.propertyControls( propertyMap, propertyMap.getCenter() );
                        } , 50);
                    }
                }
                $('.tabs-gallery-map .tab-google-map, .tabs-content-agent .tab-google-map').click(function(){
                    if ( propertyMap == null ) {
                        setTimeout( function(){
                            propertyMap = new google.maps.Map(document.getElementById('tab-single-property-map'), mapOptions);
                            propertyMap.setOptions({styles: $item.data('style')});
                            ApusThemeMap.addMarkers($item, propertyMap);
                            var propertyControl = new ApusThemeMap.propertyControls( propertyMap, propertyMap.getCenter() );
                        } , 50);
                    }
                });
            }
        },
        initSingleMap: function() {
            if ( $('#single-property-map').length > 0 ) {
                var $item = $('#single-property-map');
                var lat = $item.data('latitude');
                var lng = $item.data('longitude');
                var propertyMap = null;
                var panorama = null;
                var fenway = new google.maps.LatLng(lat, lng);
                var mapOptions = {
                    center: fenway,
                    zoom: $item.data('zoom'),
                    scrollwheel: false
                };
                var panoramaOptions = {
                    position: fenway,
                    pov: {
                        heading: 34,
                        pitch: 10
                    }
                };

                $('.property-map-position .tab-google-street-view-map').click(function(){
                    if ( panorama == null ) {
                        setTimeout( function(){
                            panorama = new google.maps.StreetViewPanorama(document.getElementById('single-property-street-view-map'), panoramaOptions);
                        } , 50);
                    }
                });
                if ( $('.tabs-content-layout #tab-content-map-tabs').length > 0 ) {
                    $( '[href="#tab-content-map-tabs"]' ).click(function(){
                        if ( propertyMap == null ) {
                            propertyMap = new google.maps.Map(document.getElementById('single-property-map'), mapOptions);
                            propertyMap.setOptions({styles: $item.data('style')});
                            ApusThemeMap.addMarkers($item, propertyMap);
                            var propertyControl = new ApusThemeMap.propertyControls( propertyMap, propertyMap.getCenter() );
                        }
                    });
                } else {
                    propertyMap = new google.maps.Map(document.getElementById('single-property-map'), mapOptions);
                    propertyMap.setOptions({styles: $item.data('style')});
                    ApusThemeMap.addMarkers($item, propertyMap);
                    var propertyControl = new ApusThemeMap.propertyControls( propertyMap, propertyMap.getCenter() );
                }
            }
        },
        // add makers
		addMarkers: function( $item, propertyMap ) {
			var lat = $item.data('latitude');
			var lng = $item.data('longitude');
            var latlng = new google.maps.LatLng(lat, lng);
            
            var marker = new google.maps.Marker({
                position: latlng,
                map: propertyMap,
                draggable: false,
                animation: google.maps.Animation.DROP,
                icon: $item.data('icon_image')
            });

            markers.push(marker);
        },

		tooglePoints: function( place_item, position, propertyMap, propertyType, status) {
            var service = new google.maps.places.PlacesService( propertyMap );
            var bounds = propertyMap.getBounds();
            var types = new Array();
            
            types = [propertyType];

            if ( status == false ) {
                if ( nearbyMarkers[propertyType] && nearbyMarkers[propertyType].length > 0 ){
                    for ( var i=0 ; i < nearbyMarkers[propertyType].length; i++ ) {
                        nearbyMarkers[propertyType][i].setMap( null  ); 
                    }
                    nearbyMarkers[propertyType] = [];
                }
            } else {
                var placemarkers = [];
                service.nearbySearch({
                    location: position,
                    bounds: bounds,
                    radius: 2000,
                    types: types
                }, function propertyCallback( results, status ) {
                    if ( status === google.maps.places.PlacesServiceStatus.OK ) {
                        for ( var i = 0; i < results.length; i++ ) {
                            var place = results[i];
                            var marker = new google.maps.Marker({
                                map: propertyMap,
                                position: place.geometry.location,
                                icon: place_item.data('icon_image')
                            });
                            marker.setMap( propertyMap  );
                            google.maps.event.addListener(marker, 'mouseover', function() {
                                propertyInfo.setContent(place.name);
                                propertyInfo.open(propertyMap, this);
                            });
                            google.maps.event.addListener(marker, 'mouseout', function() {
                                propertyInfo.open(null,null);
                            });
                            placemarkers.push( marker );
                        }
                        nearbyMarkers[propertyType] = placemarkers;
                    }
                });
            }
        },

        propertyControls: function( propertyMap, center) {
            $('.property-search-places').each(function(){
                var self_root = $(this);
                
                $('.place-btn', self_root).click(function() {
                    var self = $(this);
                    var type = $(this).data('type');

                    if ( !$(this).hasClass('active') ) {
                        $('.place-btn', self_root).each(function(){
                            $(this).removeClass('active');
                            ApusThemeMap.tooglePoints($(this), center, propertyMap, $(this).data('type'), false);
                        });
                        $(this).addClass('active');
                        ApusThemeMap.tooglePoints(self, center, propertyMap, type, true);
                    }
                    google.maps.event.addListener(propertyMap, 'bounds_changed', function() {
                        if( self.hasClass('active') ) {
                            var newCenter = propertyMap.getCenter();
                            ApusThemeMap.tooglePoints(self, newCenter, propertyMap, type, true);
                        }
                    });
                });
            });
        }

	}

	ApusThemeMap.init();
});