var g_gmpLibJsLoaded = false;
function gmpLoadGoogleLib() {
if(!g_gmpLibJsLoaded) {
jQuery('head').append('');
g_gmpLibJsLoaded = true;
}
}
// Maps
function gmpGoogleMap(elementId, params, additionalData) {
if(typeof(google) === 'undefined') {
gmpLoadGoogleLib();
//alert('Please check your Internet connection - we need it to load Google Maps Library from Google Server');
//return false;
}
params = params ? params : {};
additionalData = additionalData ? additionalData : {};
var defaults = {
center: new google.maps.LatLng(40.69847032728747, -73.9514422416687)
, zoom: 8
//, mapTypeId: google.maps.MapTypeId.ROADMAP
};
if(params.map_center && params.map_center.coord_x && params.map_center.coord_y) {
params.center = new google.maps.LatLng(params.map_center.coord_x, params.map_center.coord_y);
}
if(params.zoom) {
params.zoom = parseInt(params.zoom);
}
if(!GMP_DATA.isAdmin && params.zoom_type == 'zoom_level' && params.zoom_mobile && jQuery(document).width() < 768) {
params.zoom = parseInt(params.zoom_mobile);
}
if (typeof(elementId) === 'string') {
elementId = jQuery(elementId)[0];
}
this._elementId = elementId;
this._mapParams = jQuery.extend({}, defaults, params);
this._mapObj = null;
this._markers = [];
this._shapes = [];
this._heatmap = [];
this._clasterer = null;
this._clastererEnabled = false;
this._clastererMarkersGroupsStyles = [];
this._eventListeners = {};
this._layers = {};
this.mapMarkersGroups = additionalData.markerGroups ? additionalData.markerGroups : [];
this.init();
}
gmpGoogleMap.prototype.init = function() {
this._beforeInit();
this._mapObj = new google.maps.Map(this._elementId, this._mapParams);
this._afterInit();
};
gmpGoogleMap.prototype._beforeInit = function() {
if(typeof(this._mapParams.type_control) !== 'undefined') {
if(typeof(google.maps.MapTypeControlStyle[ this._mapParams.type_control ]) !== 'undefined') {
this._mapParams.mapTypeControlOptions = {
style: google.maps.MapTypeControlStyle[ this._mapParams.type_control ]
};
this._mapParams.mapTypeControl = true;
} else {
this._mapParams.mapTypeControl = false;
}
}
if(typeof(this._mapParams.zoom_control) !== 'undefined') {
if(typeof(google.maps.ZoomControlStyle[ this._mapParams.zoom_control ]) !== 'undefined') {
this._mapParams.zoomControlOptions = {
style: google.maps.ZoomControlStyle[ this._mapParams.zoom_control ]
};
this._mapParams.zoomControl = true;
} else {
this._mapParams.zoomControl = false;
}
}
if(typeof(this._mapParams.street_view_control) !== 'undefined') {
this._mapParams.streetViewControl = parseInt(this._mapParams.street_view_control) ? true : false;
}
if(typeof(this._mapParams.pan_control) !== 'undefined') {
this._mapParams.panControl = parseInt(this._mapParams.pan_control) ? true : false;
}
if(typeof(this._mapParams.overview_control) !== 'undefined') {
if(this._mapParams.overview_control !== 'none') {
this._mapParams.overviewMapControlOptions = {
opened: this._mapParams.overview_control === 'opened' ? true : false
};
this._mapParams.overviewMapControl = true;
} else {
this._mapParams.overviewMapControl = false;
}
}
if(typeof(this._mapParams.dbl_click_zoom) !== 'undefined') {
this._mapParams.disableDoubleClickZoom = parseInt(this._mapParams.dbl_click_zoom) ? false : true; // False/true in revert order - because option actually is for disabling this feature
}
if(typeof(this._mapParams.mouse_wheel_zoom) !== 'undefined') {
this._mapParams.scrollwheel = parseInt(this._mapParams.mouse_wheel_zoom) ? true : false;
}
if(typeof(this._mapParams.map_type) !== 'undefined'
&& typeof(google.maps.MapTypeId[ this._mapParams.map_type ]) !== 'undefined'
) {
this._mapParams.mapTypeId = google.maps.MapTypeId[ this._mapParams.map_type ];
}
if(typeof(this._mapParams.map_stylization_data) !== 'undefined'
&& this._mapParams.map_stylization_data
) {
this._mapParams.styles = this._mapParams.map_stylization_data;
}
jQuery(document).trigger('gmapBeforeMapInit', this);
};
gmpGoogleMap.prototype.getParams = function(){
return this._mapParams;
};
gmpGoogleMap.prototype.getParam = function(key){
return this._mapParams[ key ];
};
gmpGoogleMap.prototype.setParam = function(key, value){
this._mapParams[ key ] = value;
return this;
};
gmpGoogleMap.prototype._afterInit = function() {
if(typeof(this._mapParams.marker_clasterer) !== 'undefined' && this._mapParams.marker_clasterer) {
this.enableClasterization(this._mapParams.marker_clasterer);
}
this.applyZoomType();
if(typeof(this._mapParams.zoom_min) !== 'undefined' && typeof(this._mapParams.zoom_max) !== 'undefined') {
this._setMinZoomLevel();
this._setMaxZoomLevel();
this._fixZoomLevel();
}
this.resizeMapByHeight();
jQuery(window).bind('resize', jQuery.proxy(this.resizeMapByHeight, this));
jQuery(window).bind('orientationchange', jQuery.proxy(this.resizeMapByHeight, this));
jQuery(document).trigger('gmapAfterMapInit', this);
};
gmpGoogleMap.prototype._setMinZoomLevel = function() {
var curZoom = this.getZoom();
var minZoom = parseInt(this._mapParams.zoom_min) ? parseInt(this._mapParams.zoom_min) : null;
this.getRawMapInstance().setOptions({minZoom: minZoom});
if(curZoom < minZoom)
this.getRawMapInstance().setOptions({zoom: minZoom});
};
gmpGoogleMap.prototype._setMaxZoomLevel = function() {
var maxZoom = parseInt(this._mapParams.zoom_max) ? parseInt(this._mapParams.zoom_max) : null;
this.getRawMapInstance().setOptions({maxZoom: maxZoom});
if(this.getRawMapInstance().zoom > maxZoom)
this.getRawMapInstance().setOptions({zoom: maxZoom});
};
gmpGoogleMap.prototype._fixZoomLevel = function() {
var eventHandle = this._getEventListenerHandle('zoom_changed', 'zoomChanged');
if(!eventHandle) {
eventHandle = google.maps.event.addListener(this.getRawMapInstance(), 'zoom_changed', jQuery.proxy(function(){
var minZoom = parseInt(this.getParam('zoom_min'))
, maxZoom = parseInt(this.getParam('zoom_max'));
if (this.getZoom() < minZoom) {
this.setZoom(minZoom);
if(GMP_DATA.isAdmin && this._getEventListenerHandle('idle', 'enableClasterization'))
google.maps.event.trigger(this.getRawMapInstance(), 'idle');
}
if (this.getZoom() > maxZoom) {
this.setZoom(maxZoom);
if(GMP_DATA.isAdmin && this._getEventListenerHandle('idle', 'enableClasterization'))
google.maps.event.trigger(this.getRawMapInstance(), 'idle');
}
}, this));
this._addEventListenerHandle('zoom_changed', 'zoomChanged', eventHandle);
}
};
gmpGoogleMap.prototype.enableClasterization = function(clasterType, needTrigger) {
needTrigger = needTrigger ? needTrigger : false;
switch(clasterType) {
case 'MarkerClusterer': // Support only this one for now
var self = this;
self.setClastererMarkersGroupsStyles();
var eventHandle = google.maps.event.addListenerOnce(self.getRawMapInstance(), 'idle', function(a, b, c){
var clasterGridSize = self.getParam('marker_clasterer_grid_size')
, markerGroupsStyles = self.getClastererMarkersGroupsStyles();
// Enable clasterization
var allMapMarkers = self.getAllRawMarkers()
, allVisibleMapMarkers = []
, clasterer = self.getClasterer();
for(var i = 0; i < allMapMarkers.length; i++) {
if(allMapMarkers[i].getVisible() && !parseInt(allMapMarkers[i].params.clasterer_exclude)) {
allVisibleMapMarkers.push(allMapMarkers[i]);
}
}
if(clasterer){
clasterer.clearMarkers();
clasterer.addMarkers( allVisibleMapMarkers );
clasterer.setStyles( markerGroupsStyles );
self.setClastererGridSize(clasterGridSize);
clasterer.resetViewport();
clasterer.redraw();
} else {
clasterer = new MarkerClusterer(self.getRawMapInstance(), allVisibleMapMarkers, { styles: markerGroupsStyles, clusterClass: "cluster" });
clasterer.setCalculator(self.customClastererCalculatorFunction( markerGroupsStyles ));
self.setClasterer(clasterer);
self.setClastererGridSize(clasterGridSize);
clasterer = self.getClasterer();
}
});
this._addEventListenerHandle('idle', 'enableClasterization', eventHandle);
if(GMP_DATA.isAdmin || needTrigger) {
google.maps.event.trigger(self.getRawMapInstance(), 'idle');
}
this._clastererEnabled = true;
break;
}
};
gmpGoogleMap.prototype.disableClasterization = function() {
var eventHandle = this._getEventListenerHandle('idle', 'enableClasterization');
if(eventHandle) {
var clasterer = this.getClasterer();
if(clasterer) {
clasterer.clearMarkers();
var markers = this.getAllRawMarkers();
for(var i = 0; i < markers.length; i++) {
markers[i].setMap( this.getRawMapInstance() );
}
}
google.maps.event.removeListener( eventHandle );
google.maps.event.trigger(this.getRawMapInstance(), 'idle');
this._clastererEnabled = false;
}
};
gmpGoogleMap.prototype.customClastererCalculatorFunction = function(markerGroupsStyles) {
return function(markers, numStyles) {
var styleIndex = 1, markersGroupsStyles = markerGroupsStyles, markersGroupsIds = {}, maxCount = 0, groupId = 0, curStyle = [];
for (var i = 0; i < markers.length; i++) {
if (markers[i].marker_group_id) {
if (typeof(markersGroupsIds[markers[i].marker_group_id]) == 'undefined') {
markersGroupsIds[markers[i].marker_group_id] = 1;
} else {
markersGroupsIds[markers[i].marker_group_id]++;
}
}
}
for (var currGroupId in markersGroupsIds) {
if (markersGroupsIds[currGroupId] > maxCount) {
maxCount = markersGroupsIds[currGroupId];
groupId = currGroupId;
}
}
curStyle = jQuery.grep(markersGroupsStyles, function (e, i) {
if (e.marker_group_id == groupId) {
return e;
}
});
if (curStyle && curStyle[0])
styleIndex = markersGroupsStyles.indexOf(curStyle[0]) + 1;
return {
text: markers.length,
index: styleIndex
};
}
};
gmpGoogleMap.prototype.getClasterer = function() {
if(this._clasterer) {
return this._clasterer;
}
return false;
};
gmpGoogleMap.prototype.setClasterer = function(clasterer) {
this._clasterer = clasterer;
};
gmpGoogleMap.prototype.setMapMarkersGroups = function(groups) {
this.mapMarkersGroups = groups;
};
gmpGoogleMap.prototype.getMapMarkersGroups = function() {
return this.mapMarkersGroups;
};
gmpGoogleMap.prototype.setClastererMarkersGroupsStyles = function() {
var mapMarkersGroups = this.getMapMarkersGroups()
, markersGroupsStyles = this.getClastererMarkersGroupsStyles()
, defClasterIcon = GMP_DATA.modPath + 'gmap/img/m1.png'
, oldDefClasterIcon = 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/images/m1.png' // Prevent to use old default claster icon cdn icon because it is missing
, clasterIcon = this.getParam('marker_clasterer_icon')
, iconWidth = this.getParam('marker_clasterer_icon_width')
, iconHeight = this.getParam('marker_clasterer_icon_height');
// Set claster base icon
clasterIcon = clasterIcon && clasterIcon != oldDefClasterIcon ? clasterIcon : defClasterIcon;
iconWidth = iconWidth ? iconWidth : 53;
iconHeight = iconHeight ? iconHeight : 52;
markersGroupsStyles.push({
marker_group_id: 0
, url: clasterIcon
, width: iconWidth
, height: iconHeight
});
if(mapMarkersGroups) {
for(var i = 0; i < mapMarkersGroups.length; i++) {
var markerGroupId = mapMarkersGroups[i].id
, markerGroupClasterIcon = mapMarkersGroups[i].params.claster_icon
, markerGroupClasterIconWidth = mapMarkersGroups[i].params.claster_icon_width
, markerGroupClasterIconHeight = mapMarkersGroups[i].params.claster_icon_height;
if(markerGroupClasterIcon && markerGroupClasterIcon != clasterIcon) {
markersGroupsStyles.push({
marker_group_id: markerGroupId
, url: markerGroupClasterIcon ? markerGroupClasterIcon : defClasterIcon
, width: markerGroupClasterIconWidth ? markerGroupClasterIconWidth : 53
, height: markerGroupClasterIconHeight ? markerGroupClasterIconHeight : 52
, className: "cluster",
});
}
}
}
};
gmpGoogleMap.prototype.getClastererMarkersGroupsStyles = function() {
return this._clastererMarkersGroupsStyles;
};
gmpGoogleMap.prototype.setClastererGridSize = function(size) {
var clasterer = this.getClasterer();
size = size && parseInt(size) ? parseInt(size) : null;
if(clasterer && size) {
clasterer.setGridSize(size);
}
};
gmpGoogleMap.prototype.getClastererGridSize = function() {
var clasterer = this.getClasterer()
, clusterGridSize = null;
if(clasterer) {
clusterGridSize = clasterer.getGridSize();
}
return clusterGridSize;
};
/**
* Should trigger after added or modified markers
*/
gmpGoogleMap.prototype.markersRefresh = function() {
var clasterer = this.getClasterer();
if(this._clastererEnabled && clasterer) {
clasterer.clearMarkers();
clasterer.addMarkers( this.getAllRawMarkers() );
}
jQuery(document).trigger('gmapAfterMarkersRefresh', this);
};
gmpGoogleMap.prototype._addEventListenerHandle = function(event, code, handle) {
if(!this._eventListeners[ event ])
this._eventListeners[ event ] = {};
this._eventListeners[ event ][ code ] = handle;
};
gmpGoogleMap.prototype._getEventListenerHandle = function(event, code) {
return this._eventListeners[ event ] && this._eventListeners[ event ][ code ]
? this._eventListeners[ event ][ code ]
: false;
};
gmpGoogleMap.prototype.getRawMapInstance = function() {
return this._mapObj;
};
gmpGoogleMap.prototype.setCenter = function (lat, lng) {
if(typeof lng == 'undefined'){
this.getRawMapInstance().setCenter(lat);
}else
this.getRawMapInstance().setCenter(new google.maps.LatLng(lat, lng));
return this;
};
gmpGoogleMap.prototype.getCenter = function () {
return this.getRawMapInstance().getCenter();
};
gmpGoogleMap.prototype.setZoom = function (zoomLevel) {
this.getRawMapInstance().setZoom(parseInt(zoomLevel));
};
gmpGoogleMap.prototype.getZoom = function () {
return this.getRawMapInstance().getZoom();
};
gmpGoogleMap.prototype.getBounds = function () {
return this.getRawMapInstance().getBounds();
};
gmpGoogleMap.prototype.fitBounds = function (bounds) {
this.getRawMapInstance().fitBounds(bounds);
};
gmpGoogleMap.prototype.addMarker = function(params) {
params.clusterClass = 'cluster';
var newMarker = new gmpGoogleMarker(this, params);
this._markers.push( newMarker );
return newMarker;
};
gmpGoogleMap.prototype.addShape = function(params) {
var newShape = new gmpGoogleShape(this, params);
this._shapes.push( newShape );
return newShape;
};
gmpGoogleMap.prototype.addHeatmap = function(params) {
var heatmap = new gmpGoogleHeatmap(this, params);
this._heatmap.push( heatmap );
return heatmap;
};
gmpGoogleMap.prototype.addRouter = function(params) {
var router = new gmpGoogleRouter(this, params);
return router;
};
gmpGoogleMap.prototype.getMarkerById = function(id) {
if(this._markers && this._markers.length) {
for(var i in this._markers) {
if(this._markers[i].getId && this._markers[i].getId() == id)
return this._markers[ i ];
}
}
return false;
};
gmpGoogleMap.prototype.getShapeById = function(id) {
if(this._shapes && this._shapes.length) {
for(var i in this._shapes) {
if(this._shapes[ i ].getId() == id)
return this._shapes[ i ];
}
}
return false;
};
gmpGoogleMap.prototype.getHeatmap = function() {
if(this._heatmap && this._heatmap.length) {
// There is only one heatmap layer on the map
return this._heatmap[0];
}
return false;
};
gmpGoogleMap.prototype.removeMarker = function(id) {
var marker = this.getMarkerById( id );
if(marker) {
marker.removeFromMap();
}
};
gmpGoogleMap.prototype.removeShape = function(id) {
var shape = this.getShapeById( id );
if(shape) {
shape.removeFromMap();
}
};
gmpGoogleMap.prototype.getAllMarkers = function() {
return this._markers;
};
gmpGoogleMap.prototype.getAllShapes = function() {
return this._shapes;
};
/**
* Retrive original Map marker objects (Marker objects from Google API)
*/
gmpGoogleMap.prototype.getAllRawMarkers = function() {
var res = [];
if(this._markers && this._markers.length) {
for(var i = 0; i < this._markers.length; i++) {
res.push( this._markers[i].getRawMarkerInstance() );
}
}
return res;
};
gmpGoogleMap.prototype.setMarkersParams = function(markers) {
if(this._markers && this._markers.length) {
for(var i = 0; i < this._markers.length; i++) {
for(var j = 0; j < markers.length; j++) {
if(this._markers[i].getId() == markers[j].id) {
this._markers[i].setMarkerParams( markers[j] );
break;
}
}
}
}
};
gmpGoogleMap.prototype.get = function(key) {
return this.getRawMapInstance().get( key );
};
// Set option for RAW MAP
gmpGoogleMap.prototype.set = function(key, value) {
this.getRawMapInstance().set( key, value );
return this;
};
gmpGoogleMap.prototype.clearMarkers = function() {
if(this._markers && this._markers.length) {
for(var i = 0; i < this._markers.length; i++) {
this._markers[i].setMap( null );
}
this._markers = [];
}
};
gmpGoogleMap.prototype.clearMarkersByParam = function(param) {
if(this._markers && this._markers.length) {
for(var i = 0; i < this._markers.length; i++) {
if(this._markers[i].getMarkerParam(param)) {
this._markers[i].setMap( null );
this._markers.splice(i, 1);
this.clearMarkersByParam(param);
break;
}
}
}
};
gmpGoogleMap.prototype.clearShapes = function() {
if(this._shapes && this._shapes.length) {
for(var i = 0; i < this._shapes.length; i++) {
this._shapes[i].setMap( null );
}
this._shapes = [];
}
};
gmpGoogleMap.prototype.getViewId = function() {
return this._mapParams.view_id;
};
gmpGoogleMap.prototype.getViewHtmlId = function() {
return this._mapParams.view_html_id;
};
gmpGoogleMap.prototype.getId = function() {
return this._mapParams.id;
};
gmpGoogleMap.prototype.refresh = function() {
return google.maps.event.trigger(this.getRawMapInstance(), 'resize');
};
gmpGoogleMap.prototype.refreshWithCenter = (function(lat, lng, zoom) {
var res = google.maps.event.trigger(this.getRawMapInstance(), 'resize');
if(zoom) {
this.setZoom(zoom);
} else {
this.setZoom(this.getZoom());
}
if(lat && lng) {
this.setCenter(lat, lng);
} else {
this.setCenter(this.getCenter().lat(), this.getCenter().lng());
}
return res;
});
gmpGoogleMap.prototype.fullRefresh = function() {
this.refresh();
this.checkMarkersParams(this._markers, false);
this.setCenter( this._mapParams.center );
};
gmpGoogleMap.prototype.checkMarkersParams = function(markers, needToShow) {
if(markers && markers.length) {
for (var i = 0; i < markers.length; i++) {
var markerParams = markers[i].getMarkerParam('params')
, showDescription = parseInt(markerParams.show_description);
if(showDescription || needToShow) {
markers[i].showInfoWnd( true, showDescription );
}
}
}
};
gmpGoogleMap.prototype.resizeMapByHeight = function(e, elem, withoutAfter) {
if(!GMP_DATA.isAdmin && parseInt(this.getParam('adapt_map_to_screen_height')) && this.getRawMapInstance().map_display_mode != 'popup') {
var viewId = this.getParam('view_id')
, selectors = this.getParam('selectors')
, windowObj = jQuery(window)
, mapContainer = jQuery('#gmpMapDetailsContainer_' + viewId)
, mapContainerWrap = jQuery('#mapConElem_' + viewId)
, height;
withoutAfter = withoutAfter ? withoutAfter : (mapContainerWrap.data('rmh-without-after') ? mapContainerWrap.data('rmh-without-after') : false);
elem = elem ? elem : (mapContainerWrap.data('rmh-additional-elem') ? jQuery(mapContainerWrap.data('rmh-additional-elem')) : null);
if(!selectors || (!selectors.content_before && !selectors.content_after)) {
var mapContainerOffset = mapContainer.length ? mapContainer.offset() : false
, windowHeight = windowObj.height();
height = mapContainerOffset.top < windowHeight ? windowHeight - mapContainerOffset.top : windowHeight;
} else {
var viewportData = this.getViewportData(0, withoutAfter)
, proControlsCon = jQuery('#gmpMapProControlsCon_'+ viewId);
height = viewportData.height;
mapContainer.parents('.gmp_map_opts:first').css({
'position': 'fixed'
, 'top': viewportData.contentBeforeHeight
, 'left': '0'
, 'width': windowObj.width()
, 'height': height
, 'z-index': 1
});
if(proControlsCon.find('.gmpMarkersListCollapseShell').length) {
mapContainer.parents('.gmp_map_opts:first').css({
'overflow-x': 'hidden'
, 'overflow-y': 'auto'
});
}
jQuery(selectors.content_before).css({
'z-index': 2
});
if(!withoutAfter) {
jQuery(selectors.content_after).css({
'position': 'fixed'
, 'bottom': '0'
, 'left': '0'
, 'width': windowObj.width()
, 'z-index': 1
});
}
if(elem && elem.length) {
height -= elem.outerHeight(true);
}
}
jQuery('#gmpMapDetailsContainer_' + viewId + ', #' + this.getParam('view_html_id')).each(function () {
jQuery(this).height(height);
});
this.refresh();
}
};
gmpGoogleMap.prototype.getViewportData = function(additionalHeight, withoutAfter) {
withoutAfter = withoutAfter ? withoutAfter : false;
additionalHeight = additionalHeight ? additionalHeight : 0;
var selectors = this.getParam('selectors')
, adminBar = jQuery('#wpadminbar') // fix for pages with admin bar
, viewportData = {
height: jQuery(window).height(),
contentBeforeHeight: 0,
contentAfterHeight: 0
}
, i;
if(typeof selectors !== 'undefined' && selectors != null) {
var contentBefore = typeof selectors.content_before !== 'undefined' ? jQuery(selectors.content_before) : 0
, contentAfter = typeof selectors.content_after !== 'undefined' ? jQuery(selectors.content_after) : 0;
if(adminBar.length) {
viewportData.contentBeforeHeight += adminBar.outerHeight(true);
}
if(contentBefore.length) {
for(i = 0; i < contentBefore.length; i++) {
viewportData.contentBeforeHeight += jQuery(contentBefore[i]).outerHeight(true);
}
}
if(contentAfter.length && !withoutAfter) {
for(i = 0; i < contentAfter.length; i++) {
viewportData.contentAfterHeight += jQuery(contentAfter[i]).outerHeight(true);
}
}
}
viewportData.height = viewportData.height - viewportData.contentBeforeHeight - viewportData.contentAfterHeight - additionalHeight;
return viewportData;
};
gmpGoogleMap.prototype.applyZoomType = function() {
if(!GMP_DATA.isAdmin && this.getParam('zoom_type') == 'fit_bounds') {
var eventHandle = google.maps.event.addListenerOnce(this.getRawMapInstance(), 'tilesloaded', jQuery.proxy(this._getBoundsHandler, this));
this._addEventListenerHandle('tilesloaded', 'fitBounds', eventHandle);
}
};
gmpGoogleMap.prototype.applyZoomTypeAdmin = function() {
if(GMP_DATA.isAdmin && this.getParam('zoom_type') == 'fit_bounds') {
// Call applyZoomTypeAdmin after refresh all map objects in admin area (markers, shapes, etc.)
this._getBoundsHandler();
}
};
// Free version of method
// see pro version here - google-maps-easy-pro/add_map_options/js/core.add_map_options.js
gmpGoogleMap.prototype._getBoundsHandler = function(){
var bounds = new google.maps.LatLngBounds();
bounds = this._getMapMarkersBounds(bounds);
this._setMapBounds(bounds);
};
gmpGoogleMap.prototype._getMapMarkersBounds = function(bounds){
var markers = this.getAllMarkers();
for (var i = 0; i < markers.length; i++) {
bounds.extend(markers[i].getPosition());
}
return bounds;
};
gmpGoogleMap.prototype._setMapBounds = function(bounds){
// fit bounds only if map has more than one object
if(!bounds.getNorthEast().equals(bounds.getSouthWest())) {
this.fitBounds(bounds);
}
};
// Common functions
var g_gmpGeocoder = null;
jQuery.fn.mapSearchAutocompleateGmp = function(params) {
params = params || {};
jQuery(this).keyup(function(event){
// Ignore tab, enter, caps, end, home, arrows
if(toeInArrayGmp(event.keyCode, [9, 13, 20, 35, 36, 37, 38, 39, 40])) return;
var searchData = jQuery.trim(jQuery(this).val());
if(searchData && searchData != '') {
if(typeof(params.msgEl) === 'string') {
params.msgEl = jQuery(params.msgEl);
}
params.msgEl.showLoaderGmp();
var self = this;
jQuery(this).autocomplete(jQuery.extend({}, params.autocompleteParams, {
source: function(request, response) {
var autocomleateData = typeof(params.additionalData) != 'undefined' ? gmpAutocomleateData(params.additionalData, request.term) : []
, geocoder = gmpGetGeocoder()
, geocoderData = { 'address': searchData };
if(typeof(params.geocoderParams) != 'undefined' && params.geocoderParams) {
geocoderData = jQuery.extend({}, geocoderData, params.geocoderParams)
}
geocoder.geocode(geocoderData, function(results, status) {
params.msgEl.html('');
if(status == google.maps.GeocoderStatus.OK && results.length) {
for(var i = 0; i < results.length; i++) {
autocomleateData.push({
label: results[i].formatted_address
, lat: results[i].geometry.location.lat()
, lng: results[i].geometry.location.lng()
, category: toeLangGmp('Plases')
});
}
response(autocomleateData);
} else {
if(autocomleateData) {
response(autocomleateData);
} else {
//var notFoundMsg = toeLangGmp('Google can\'t find requested address coordinates, please try to modify search criterias.');
var notFoundMsg = toeLangGmp('Nothing was found');
if(jQuery(self).parent().find('.ui-helper-hidden-accessible').length) {
jQuery(self).parent().find('.ui-helper-hidden-accessible').html(notFoundMsg);
} else {
params.msgEl.html(notFoundMsg);
}
}
}
});
}
, select: function(event, ui) {
if(params.onSelect) {
params.onSelect(ui.item, event, ui);
}
}
}));
// Force imidiate search right after creation
jQuery(this).autocomplete('search');
}
});
};
function gmpAutocomleateData(data, needle) {
var autocomleateData = [];
for(var i = 0; i < data.length; i++) {
for(var j = 0; j < data[i].length; j++) {
if(data[i][j]) {
var label = data[i][j].label.toString().toLowerCase()
, desc = data[i][j].marker_desc != 'undefined' ? data[i][j].marker_desc : ''
, term = needle.toLowerCase();
if(label.indexOf(term) !== -1 || (desc && desc.indexOf(term) !== -1)) {
autocomleateData.push(data[i][j]);
}
}
}
}
return autocomleateData;
}
function gmpGetGeocoder() {
if(!g_gmpGeocoder) {
g_gmpGeocoder = new google.maps.Geocoder();
}
return g_gmpGeocoder;
}
function changeInfoWndType(map) {
//This is a standart google maps api class
var infowndContent = jQuery('#'+ map._elementId.id).find('.gm-style-iw')
, type = map.getParam('marker_infownd_type')
, hideInfoWndBtn = parseInt(map.getParam('marker_infownd_hide_close_btn'));
switch(type) {
case '':
if(infowndContent && infowndContent.length) {
infowndContent.each(function() {
var $this = jQuery(this)
, wndBody = $this.prev().children().last()
, wndBodyShadow = $this.prev().children(':nth-child(2)')
, wndTail = $this.prev().children(':nth-child(3)')
, wndTailShadow = $this.prev().children().first();
$this.css({
'border-radius': '0px'
});
});
}
break;
case 'rounded_edges':
if(infowndContent && infowndContent.length) {
infowndContent.each(function() {
var $this = jQuery(this)
, wndBody = $this.prev().children().last()
, wndBodyShadow = $this.prev().children(':nth-child(2)')
, wndTail = $this.prev().children(':nth-child(3)')
, wndTailShadow = $this.prev().children().first();
if(hideInfoWndBtn !== 0) {
//$this.next('div').hide();
$this.find(".gm-ui-hover-effect").hide();
}
$this.find('.gmpInfoWindowtitle').css({
'padding': '0'
, 'left': '0'
});
wndBody.css({
'border-radius': '10px'
});
wndBodyShadow.css({
'background-color': 'transparent',
'-moz-box-shadow': 'none',
'-webkit-box-shadow': 'none',
'box-shadow': 'none'
});
wndTail.children().each(function(index) {
var $this = jQuery(this)
, degrees = !index ? 'skewX(50.6deg)' : 'skewX(-50.6deg)'
, left = !index ? '-2px' : '0';
$this.css({
'height': '15px'
});
$this.children().css({
'width': '20px'
, 'left': left
, 'transform': degrees
, '-moz-box-shadow': 'none'
, '-webkit-box-shadow': 'none'
, 'box-shadow': 'none'
});
});
wndTailShadow.css({
'border-right': 'none'
, 'border-left': 'none'
, 'border-top': 'none'
, 'left': '38px'
, 'top': '74px'
});
});
}
break;
default:
break;
}
}
function changeInfoWndBgColor(map) {
g_gmpMarkerBgColorTimeoutSet = false;
var color = map.getParam('marker_infownd_bg_color');
//This is a standart google maps api class
var infowndContent = jQuery('#'+ map._elementId.id).find('.gm-style-iw'),
styleId = 'gmpInfoWindowStyle';
if(infowndContent && infowndContent.length) {
infowndContent.each(function() {
var wndBody = jQuery(this).prev().children().last()
, wndTail = jQuery(this).prev().children(':nth-child(3)').children().last();
//wndBody.css('background-color', color);
//wndTail.prev().children().last().css('background-color', color);
//wndTail.children().css('background-color', color);
infowndContent.css('background-color', color);
infowndContent.prev().children().last().css('background-color', color);
infowndContent.children().css('background-color', color);
var styleTag = jQuery('#'+styleId),
styles = '.gm-style-iw-t::after { background:'+color+' !important; }';
styles += '.gm-style .gm-style-iw-d::-webkit-scrollbar-track, .gm-style .gm-style-iw-d::-webkit-scrollbar-track-piece { background: '+color+' !important; }';
if(styleTag.length) {
styleTag.html(styles);
} else {
jQuery('').attr('id', styleId).appendTo('head');
}
});
}
}
window.gmpGoogleMap = gmpGoogleMap;