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);
 | |
| 
 | |
|       GMaps.fire('marker_removed', marker, this);
 | |
|     }
 | |
| 
 | |
|     if(this.markerClusterer && this.markerClusterer.clearMarkers) {
 | |
|       this.markerClusterer.clearMarkers();
 | |
|     }
 | |
| 
 | |
|     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;
 | |
|   }
 | |
| };
 |