184 lines
5.5 KiB
JavaScript
184 lines
5.5 KiB
JavaScript
/*
|
|
* google maps wrapper
|
|
*/
|
|
;( function( $, window, document, undefined ) {
|
|
|
|
"use strict";
|
|
|
|
// Create the defaults once
|
|
var pluginName = "gmap",
|
|
defaults = {
|
|
mapStyle: [{"featureType":"water","elementType":"geometry","stylers":[{"color":"#e9e9e9"},{"lightness":17}]},{"featureType":"landscape","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":20}]},{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":"#ffffff"},{"lightness":17}]},{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":"#ffffff"},{"lightness":29},{"weight":0.2}]},{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":18}]},{"featureType":"road.local","elementType":"geometry","stylers":[{"color":"#ffffff"},{"lightness":16}]},{"featureType":"poi","elementType":"geometry","stylers":[{"color":"#f5f5f5"},{"lightness":21}]},{"featureType":"poi.park","elementType":"geometry","stylers":[{"color":"#dedede"},{"lightness":21}]},{"elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":"#ffffff"},{"lightness":16}]},{"elementType":"labels.text.fill","stylers":[{"saturation":36},{"color":"#333333"},{"lightness":40}]},{"elementType":"labels.icon","stylers":[{"visibility":"off"}]},{"featureType":"transit","elementType":"geometry","stylers":[{"color":"#f2f2f2"},{"lightness":19}]},{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":"#fefefe"},{"lightness":20}]},{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":"#fefefe"},{"lightness":17},{"weight":1.2}]}],
|
|
zoom: 14,
|
|
mapIcon: 'img/map-marker.png',
|
|
google: null,
|
|
tabMap: true,
|
|
nearbySearch: false
|
|
},
|
|
mapStyle,
|
|
service,
|
|
tabItem,
|
|
markers,
|
|
markersExists = false;
|
|
|
|
function Plugin ( element, options ) {
|
|
this.element = element;
|
|
|
|
this.settings = $.extend( {}, defaults, options );
|
|
this._defaults = defaults;
|
|
this._name = pluginName;
|
|
this.init();
|
|
}
|
|
|
|
$.extend( Plugin.prototype, {
|
|
map: null,
|
|
loc: null,
|
|
init: function() {
|
|
|
|
tabItem = $(this.element).attr('data-tab'),
|
|
markers = $(this.element).attr('data-markers');
|
|
|
|
if(typeof markers !== typeof undefined && markers !== false) {
|
|
markers = $.parseJSON(markers);
|
|
markersExists = true;
|
|
}
|
|
|
|
|
|
this.loc();
|
|
if(tabItem === 'false') {
|
|
this.setMap();
|
|
} else {
|
|
this.tabBnt();
|
|
};
|
|
|
|
},
|
|
setMap: function() {
|
|
this.map = new google.maps.Map(this.element, {
|
|
zoom: this.settings.zoom,
|
|
center: this.loc,
|
|
mapTypeControl: false
|
|
});
|
|
|
|
if(markersExists) {
|
|
this.setMarkers();
|
|
} else {
|
|
this.marker();
|
|
}
|
|
|
|
|
|
|
|
this.mapStyle();
|
|
if(this.settings.nearbySearch) {
|
|
this.service();
|
|
}
|
|
},
|
|
tabBnt: function() {
|
|
var parent = $(this.element).closest('.tab-pane'),
|
|
id = parent.attr('id'),
|
|
href = '#' + id,
|
|
$tab = $('a[href="'+href+'"]'),
|
|
self = this;
|
|
|
|
$tab.on('shown.bs.tab', function(e){
|
|
if(!self.map) {
|
|
self.setMap();
|
|
}
|
|
});
|
|
|
|
},
|
|
loc: function() {
|
|
var lng = $(this.element).data('lng'),
|
|
lat = $(this.element).data('lat');
|
|
|
|
this.loc = new google.maps.LatLng(lat, lng);
|
|
},
|
|
mapStyle: function() {
|
|
mapStyle = new google.maps.StyledMapType(this.settings.mapStyle);
|
|
this.map.mapTypes.set('styled_map', mapStyle);
|
|
this.map.setMapTypeId('styled_map');
|
|
},
|
|
setMarkers: function() {
|
|
for (var i = markers.length - 1; i >= 0; i--) {
|
|
new google.maps.Marker({
|
|
position: new google.maps.LatLng(markers[i].lat, markers[i].lng),
|
|
map: this.map,
|
|
icon: {
|
|
path: google.maps.SymbolPath.CIRCLE,
|
|
scale: 5,
|
|
fillColor: '#ff6c2d',
|
|
fillOpacity: 1,
|
|
strokeColor: 'white',
|
|
strokeWeight: 2
|
|
}
|
|
});
|
|
}
|
|
},
|
|
marker: function() {
|
|
new google.maps.Marker({
|
|
position: this.loc,
|
|
map: this.map,
|
|
icon: this.settings.mapIcon
|
|
});
|
|
},
|
|
service: function() {
|
|
service = new google.maps.places.PlacesService(map);
|
|
service.nearbySearch({
|
|
location: loc,
|
|
radius: 300,
|
|
type: ['store']
|
|
// this: this
|
|
}, this.processService);
|
|
},
|
|
processService: function(results, status, pagination) {
|
|
if(status !== google.maps.places.PlacesServiceStatus.OK) {
|
|
return;
|
|
} else {
|
|
self.serviceMarkers(results);
|
|
}
|
|
},
|
|
serviceMarkers: function(places) {
|
|
var bounds = new google.maps.LatLngBounds();
|
|
|
|
for (var i = 0, place; place = places[i]; i++) {
|
|
var infowindow = new google.maps.InfoWindow;
|
|
// console.log(map);
|
|
var infoMarker = new google.maps.Marker({
|
|
map: map,
|
|
icon: {
|
|
path: google.maps.SymbolPath.CIRCLE,
|
|
strokeOpacity: 0,
|
|
fillColor: '#0093d2',
|
|
fillOpacity: 0.5,
|
|
scale: 2.5
|
|
},
|
|
title: place.name,
|
|
position: place.geometry.location
|
|
});
|
|
|
|
google.maps.event.addListener(infoMarker, 'mouseover', function() {
|
|
infowindow.setContent(this.title);
|
|
infowindow.open(map, this);
|
|
});
|
|
|
|
google.maps.event.addListener(infoMarker, 'mouseout', function() {
|
|
infowindow.close(map, this);
|
|
});
|
|
|
|
bounds.extend(place.geometry.location);
|
|
}
|
|
map.fitBounds(bounds);
|
|
}
|
|
});
|
|
|
|
$.fn[ pluginName ] = function( options ) {
|
|
return this.each( function() {
|
|
if ( !$.data( this, "plugin_" + pluginName ) ) {
|
|
$.data( this, "plugin_" +
|
|
pluginName, new Plugin( this, options ) );
|
|
}
|
|
} );
|
|
};
|
|
|
|
} )( jQuery, window, document );
|
|
|