211 lines
5.4 KiB
JavaScript
211 lines
5.4 KiB
JavaScript
|
GMaps.prototype.createMarker = function(options) {
|
||
|
if (options.lat == undefined && options.lng == undefined && options.position == undefined) {
|
||
|
throw 'No latitude or longitude defined.';
|
||
|
}
|
||
|
|
||
|
var self = this,
|
||
|
details = options.details,
|
||
|
fences = options.fences,
|
||
|
outside = options.outside,
|
||
|
base_options = {
|
||
|
position: new google.maps.LatLng(options.lat, options.lng),
|
||
|
map: null
|
||
|
},
|
||
|
marker_options = extend_object(base_options, options);
|
||
|
|
||
|
delete marker_options.lat;
|
||
|
delete marker_options.lng;
|
||
|
delete marker_options.fences;
|
||
|
delete marker_options.outside;
|
||
|
|
||
|
var marker = new google.maps.Marker(marker_options);
|
||
|
|
||
|
marker.fences = fences;
|
||
|
|
||
|
if (options.infoWindow) {
|
||
|
marker.infoWindow = new google.maps.InfoWindow(options.infoWindow);
|
||
|
|
||
|
var info_window_events = ['closeclick', 'content_changed', 'domready', 'position_changed', 'zindex_changed'];
|
||
|
|
||
|
for (var ev = 0; ev < info_window_events.length; ev++) {
|
||
|
(function(object, name) {
|
||
|
if (options.infoWindow[name]) {
|
||
|
google.maps.event.addListener(object, name, function(e){
|
||
|
options.infoWindow[name].apply(this, [e]);
|
||
|
});
|
||
|
}
|
||
|
})(marker.infoWindow, info_window_events[ev]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var marker_events = ['animation_changed', 'clickable_changed', 'cursor_changed', 'draggable_changed', 'flat_changed', 'icon_changed', 'position_changed', 'shadow_changed', 'shape_changed', 'title_changed', 'visible_changed', 'zindex_changed'];
|
||
|
|
||
|
var marker_events_with_mouse = ['dblclick', 'drag', 'dragend', 'dragstart', 'mousedown', 'mouseout', 'mouseover', 'mouseup'];
|
||
|
|
||
|
for (var ev = 0; ev < marker_events.length; ev++) {
|
||
|
(function(object, name) {
|
||
|
if (options[name]) {
|
||
|
google.maps.event.addListener(object, name, function(){
|
||
|
options[name].apply(this, [this]);
|
||
|
});
|
||
|
}
|
||
|
})(marker, marker_events[ev]);
|
||
|
}
|
||
|
|
||
|
for (var ev = 0; ev < marker_events_with_mouse.length; ev++) {
|
||
|
(function(map, object, name) {
|
||
|
if (options[name]) {
|
||
|
google.maps.event.addListener(object, name, function(me){
|
||
|
if(!me.pixel){
|
||
|
me.pixel = map.getProjection().fromLatLngToPoint(me.latLng)
|
||
|
}
|
||
|
|
||
|
options[name].apply(this, [me]);
|
||
|
});
|
||
|
}
|
||
|
})(this.map, marker, marker_events_with_mouse[ev]);
|
||
|
}
|
||
|
|
||
|
google.maps.event.addListener(marker, 'click', function() {
|
||
|
this.details = details;
|
||
|
|
||
|
if (options.click) {
|
||
|
options.click.apply(this, [this]);
|
||
|
}
|
||
|
|
||
|
if (marker.infoWindow) {
|
||
|
self.hideInfoWindows();
|
||
|
marker.infoWindow.open(self.map, marker);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
google.maps.event.addListener(marker, 'rightclick', function(e) {
|
||
|
e.marker = this;
|
||
|
|
||
|
if (options.rightclick) {
|
||
|
options.rightclick.apply(this, [e]);
|
||
|
}
|
||
|
|
||
|
if (window.context_menu[self.el.id]['marker'] != undefined) {
|
||
|
self.buildContextMenu('marker', e);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (marker.fences) {
|
||
|
google.maps.event.addListener(marker, 'dragend', function() {
|
||
|
self.checkMarkerGeofence(marker, function(m, f) {
|
||
|
outside(m, f);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return marker;
|
||
|
};
|
||
|
|
||
|
GMaps.prototype.addMarker = function(options) {
|
||
|
var marker;
|
||
|
if(options.hasOwnProperty('gm_accessors_')) {
|
||
|
// Native google.maps.Marker object
|
||
|
marker = options;
|
||
|
}
|
||
|
else {
|
||
|
if ((options.hasOwnProperty('lat') && options.hasOwnProperty('lng')) || options.position) {
|
||
|
marker = this.createMarker(options);
|
||
|
}
|
||
|
else {
|
||
|
throw 'No latitude or longitude defined.';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
marker.setMap(this.map);
|
||
|
|
||
|
if(this.markerClusterer) {
|
||
|
this.markerClusterer.addMarker(marker);
|
||
|
}
|
||
|
|
||
|
this.markers.push(marker);
|
||
|
|
||
|
GMaps.fire('marker_added', marker, this);
|
||
|
|
||
|
return marker;
|
||
|
};
|
||
|
|
||
|
GMaps.prototype.addMarkers = function(array) {
|
||
|
for (var i = 0, marker; marker=array[i]; i++) {
|
||
|
this.addMarker(marker);
|
||
|
}
|
||
|
|
||
|
return this.markers;
|
||
|
};
|
||
|
|
||
|
GMaps.prototype.hideInfoWindows = function() {
|
||
|
for (var i = 0, marker; marker = this.markers[i]; i++){
|
||
|
if (marker.infoWindow) {
|
||
|
marker.infoWindow.close();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
GMaps.prototype.removeMarker = function(marker) {
|
||
|
for (var i = 0; i < this.markers.length; i++) {
|
||
|
if (this.markers[i] === marker) {
|
||
|
this.markers[i].setMap(null);
|
||
|
this.markers.splice(i, 1);
|
||
|
|
||
|
if(this.markerClusterer) {
|
||
|
this.markerClusterer.removeMarker(marker);
|
||
|
}
|
||
|
|
||
|
GMaps.fire('marker_removed', marker, this);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return marker;
|
||
|
};
|
||
|
|
||
|
GMaps.prototype.removeMarkers = function (collection) {
|
||
|
var new_markers = [];
|
||
|
|
||
|
if (typeof collection == 'undefined') {
|
||
|
for (var i = 0; i < this.markers.length; i++) {
|
||
|
var marker = this.markers[i];
|
||
|
marker.setMap(null);
|
||
|
|
||
|
if(this.markerClusterer) {
|
||
|
this.markerClusterer.removeMarker(marker);
|
||
|
}
|
||
|
|
||
|
GMaps.fire('marker_removed', marker, this);
|
||
|
}
|
||
|
|
||
|
this.markers = new_markers;
|
||
|
}
|
||
|
else {
|
||
|
for (var i = 0; i < collection.length; i++) {
|
||
|
var index = this.markers.indexOf(collection[i]);
|
||
|
|
||
|
if (index > -1) {
|
||
|
var marker = this.markers[index];
|
||
|
marker.setMap(null);
|
||
|
|
||
|
if(this.markerClusterer) {
|
||
|
this.markerClusterer.removeMarker(marker);
|
||
|
}
|
||
|
|
||
|
GMaps.fire('marker_removed', marker, this);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (var i = 0; i < this.markers.length; i++) {
|
||
|
var marker = this.markers[i];
|
||
|
if (marker.getMap() != null) {
|
||
|
new_markers.push(marker);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.markers = new_markers;
|
||
|
}
|
||
|
};
|