forked from GNUsocial/gnu-social
		
	
		
			
	
	
		
			444 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			444 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | mxn.register('googlev3', {	 | ||
|  | 
 | ||
|  | Mapstraction: { | ||
|  | 	 | ||
|  | 	init: function(element, api){		 | ||
|  | 	    var me = this;          | ||
|  |             if ( google && google.maps ){ | ||
|  |                 // by default no controls and road map
 | ||
|  |                 var myOptions = { | ||
|  | 		    		disableDefaultUI: true, | ||
|  |                     mapTypeId: google.maps.MapTypeId.ROADMAP | ||
|  |                 }; | ||
|  |                 var map = new google.maps.Map(element, myOptions); | ||
|  |                  | ||
|  |                 // deal with click
 | ||
|  |                 google.maps.event.addListener(map, 'click', function(location){ | ||
|  | 				me.clickHandler(location.latLng.lat(),location.latLng.lng(),location,me); | ||
|  |                 }); | ||
|  | 
 | ||
|  |                 // deal with zoom change
 | ||
|  |                 google.maps.event.addListener(map, 'zoom_changed', function(){ | ||
|  |                     me.changeZoom.fire(); | ||
|  | 		}); | ||
|  |                 // deal with map movement
 | ||
|  | 		google.maps.event.addListener(map, 'dragend', function(){ | ||
|  |                     me.moveendHandler(me); | ||
|  |                     me.endPan.fire(); | ||
|  | 		}); | ||
|  |                 this.maps[api] = map; | ||
|  |                 this.loaded[api] = true; | ||
|  |                 me.load.fire(); | ||
|  | 	    } | ||
|  |             else { | ||
|  |                 alert(api + ' map script not imported'); | ||
|  |             } | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	applyOptions: function(){ | ||
|  | 	    var map = this.maps[this.api]; | ||
|  | 	    var myOptions = []; | ||
|  |             if (this.options.enableDragging) { | ||
|  | 		myOptions.draggable = true; | ||
|  |             }  | ||
|  |             if (this.options.enableScrollWheelZoom){ | ||
|  | 		myOptions.scrollwheel = true; | ||
|  |             }  | ||
|  | 	    map.setOptions(myOptions); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	resizeTo: function(width, height){	 | ||
|  |             this.currentElement.style.width = width; | ||
|  |             this.currentElement.style.height = height; | ||
|  |             var map = this.maps[this.api]; | ||
|  |             google.maps.event.trigger(map,'resize'); | ||
|  |   	}, | ||
|  | 
 | ||
|  | 	addControls: function( args ) { | ||
|  | 	    var map = this.maps[this.api];	 | ||
|  |             // remove old controls
 | ||
|  | 
 | ||
|  |             // Google has a combined zoom and pan control.
 | ||
|  |             if (args.zoom || args.pan) { | ||
|  |                 if (args.zoom == 'large'){  | ||
|  |                     this.addLargeControls(); | ||
|  |                 } else {  | ||
|  |                     this.addSmallControls(); | ||
|  |                 } | ||
|  |             } | ||
|  |             if (args.scale){ | ||
|  |                 var myOptions = { | ||
|  |                     scaleControl:true, | ||
|  | 		    scaleControlOptions: {style:google.maps.ScaleControlStyle.DEFAULT}                 | ||
|  |                 }; | ||
|  |                 map.setOptions(myOptions); | ||
|  |                 this.addControlsArgs.scale = true; | ||
|  |             } | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addSmallControls: function() { | ||
|  |             var map = this.maps[this.api]; | ||
|  |             var myOptions = { | ||
|  |             	navigationControl: true, | ||
|  |             	navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL} | ||
|  |             }; | ||
|  |             map.setOptions(myOptions); | ||
|  | 
 | ||
|  |             this.addControlsArgs.pan = false; | ||
|  |             this.addControlsArgs.scale = false;                         | ||
|  |             this.addControlsArgs.zoom = 'small'; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addLargeControls: function() { | ||
|  | 	    var map = this.maps[this.api]; | ||
|  |             var myOptions = { | ||
|  |                 navigationControl:true, | ||
|  | 		navigationControlOptions: {style:google.maps.NavigationControlStyle.DEFAULT} | ||
|  |             }; | ||
|  |             map.setOptions(myOptions); | ||
|  |             this.addControlsArgs.pan = true; | ||
|  |             this.addControlsArgs.zoom = 'large'; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addMapTypeControls: function() { | ||
|  | 	    var map = this.maps[this.api]; | ||
|  |             var myOptions = { | ||
|  |                 mapTypeControl: true, | ||
|  |                 mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DEFAULT} | ||
|  |             }; | ||
|  |             map.setOptions(myOptions); | ||
|  | 	    this.addControlsArgs.map_type = true; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setCenterAndZoom: function(point, zoom) {  | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		var pt = point.toProprietary(this.api); | ||
|  | 		map.setCenter(pt); | ||
|  |                 map.setZoom(zoom); | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	addMarker: function(marker, old) { | ||
|  | 	       return marker.toProprietary(this.api);		 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	removeMarker: function(marker) { | ||
|  |                 // doesn't really remove them, just hides them
 | ||
|  |                 marker.hide(); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	removeAllMarkers: function() { | ||
|  | 		var map = this.maps[this.api];		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	declutterMarkers: function(opts) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addPolyline: function(polyline, old) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		return polyline.toProprietary(this.api); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	removePolyline: function(polyline) { | ||
|  | 		var map = this.maps[this.api];		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  |         | ||
|  | 	getCenter: function() { | ||
|  | 		var map = this.maps[this.api]; | ||
|  |                 var pt = map.getCenter(); | ||
|  |                 return new mxn.LatLonPoint(pt.lat(),pt.lng()); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setCenter: function(point, options) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		var pt = point.toProprietary(this.api); | ||
|  | 		if(options && options.pan) {  | ||
|  |                     map.panTo(pt); | ||
|  | 		} | ||
|  | 		else {  | ||
|  |                     map.setCenter(pt); | ||
|  | 		} | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setZoom: function(zoom) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		map.setZoom(zoom); | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	getZoom: function() { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		return map.getZoom(); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	getZoomLevelForBoundingBox: function( bbox ) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		var sw = bbox.getSouthWest().toProprietary(this.api); | ||
|  | 		var ne = bbox.getNorthEast().toProprietary(this.api); | ||
|  | 		var gLatLngBounds = new google.maps.LatLngBounds(sw, ne); | ||
|  | 		map.fitBounds(gLatLngBounds); | ||
|  |                 return map.getZoom(); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setMapType: function(type) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		switch(type) { | ||
|  | 			case mxn.Mapstraction.ROAD: | ||
|  |                             map.setMapTypeId(google.maps.MapTypeId.ROADMAP); | ||
|  | 			    break; | ||
|  | 			case mxn.Mapstraction.SATELLITE: | ||
|  |                             map.setMapTypeId(google.maps.MapTypeId.SATELLITE); | ||
|  | 			    break; | ||
|  | 			case mxn.Mapstraction.HYBRID: | ||
|  |                             map.setMapTypeId(google.maps.MapTypeId.HYBRID); | ||
|  | 			    break; | ||
|  | 			default: | ||
|  |                             map.setMapTypeId(google.maps.MapTypeId.ROADMAP); | ||
|  | 		}	  | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	getMapType: function() { | ||
|  |             var map = this.maps[this.api]; | ||
|  |             var type = map.getMapTypeId(); | ||
|  |                 switch(type) { | ||
|  |                         case google.maps.MapTypeId.ROADMAP: | ||
|  |                                 return mxn.Mapstraction.ROAD; | ||
|  |                         case google.maps.MapTypeId.SATELLITE: | ||
|  |                                 return mxn.Mapstraction.SATELLITE; | ||
|  |                         case google.maps.MapTypeId.HYBRID: | ||
|  |                                 return mxn.Mapstraction.HYBRID; | ||
|  |                         //case google.maps.MapTypeId.TERRAIN:
 | ||
|  |                         //        return something;
 | ||
|  |                         default: | ||
|  |                                 return null; | ||
|  |                 } | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	getBounds: function () { | ||
|  | 	    var map = this.maps[this.api]; | ||
|  | 	    var gLatLngBounds = map.getBounds();	 | ||
|  |             var sw = gLatLngBounds.getSouthWest(); | ||
|  |             var ne = gLatLngBounds.getNorthEast(); | ||
|  |             return new mxn.BoundingBox(sw.lat(), sw.lng(), ne.lat(), ne.lng()); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setBounds: function(bounds){ | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		var sw = bounds.getSouthWest().toProprietary(this.api); | ||
|  | 		var ne = bounds.getNorthEast().toProprietary(this.api); | ||
|  | 		var gLatLngBounds = new google.maps.LatLngBounds(sw, ne); | ||
|  | 		map.fitBounds(gLatLngBounds); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	setImagePosition: function(id, oContext) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		var topLeftPoint; var bottomRightPoint; | ||
|  | 
 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 
 | ||
|  | 		//oContext.pixels.top = ...;
 | ||
|  | 		//oContext.pixels.left = ...;
 | ||
|  | 		//oContext.pixels.bottom = ...;
 | ||
|  | 		//oContext.pixels.right = ...;
 | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	addOverlay: function(url, autoCenterAndZoom) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 		 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, max_zoom, map_type) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	toggleTileLayer: function(tile_url) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 		 | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	getPixelRatio: function() { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 
 | ||
|  | 		// TODO: Add provider code	
 | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	mousePosition: function(element) { | ||
|  | 		var map = this.maps[this.api]; | ||
|  | 
 | ||
|  | 		// TODO: Add provider code	
 | ||
|  | 	} | ||
|  | }, | ||
|  | 
 | ||
|  | LatLonPoint: { | ||
|  | 	 | ||
|  | 	toProprietary: function() { | ||
|  |             return new google.maps.LatLng(this.lat, this.lon); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	fromProprietary: function(googlePoint) { | ||
|  | 		this.lat = googlePoint.lat(); | ||
|  | 		this.lon = googlePoint.lng(); | ||
|  | 	} | ||
|  | 	 | ||
|  | }, | ||
|  | 
 | ||
|  | Marker: { | ||
|  | 	 | ||
|  | 	toProprietary: function() { | ||
|  | 		var options = {}; | ||
|  | 
 | ||
|  |                 // do we have an Anchor?
 | ||
|  |                 var ax = 0;  // anchor x 
 | ||
|  | 		var ay = 0;  // anchor y
 | ||
|  | 
 | ||
|  | 		if (this.iconAnchor) { | ||
|  |                     ax = this.iconAnchor[0]; | ||
|  |                     ay = this.iconAnchor[1]; | ||
|  |                 } | ||
|  |                 var gAnchorPoint = new google.maps.Point(ax,ay); | ||
|  | 
 | ||
|  | 		if (this.iconUrl) { | ||
|  |  		    options.icon = new google.maps.MarkerImage( | ||
|  | 			this.iconUrl, | ||
|  |                         new google.maps.Size(this.iconSize[0], | ||
|  | 					     this.iconSize[1]), | ||
|  |                         new google.maps.Point(0,0), | ||
|  |                         gAnchorPoint | ||
|  |                     ); | ||
|  | 
 | ||
|  |                     // do we have a Shadow?
 | ||
|  | 		    if (this.iconShadowUrl) { | ||
|  |   			if (this.iconShadowSize) { | ||
|  |                             var x = this.iconShadowSize[0]; | ||
|  |                             var y = this.iconShadowSize[1]; | ||
|  |   			    options.shadow = new google.maps.MarkerImage( | ||
|  | 				this.iconShadowUrl, | ||
|  |                                 new google.maps.Size(x,y), | ||
|  |                                 new google.maps.Point(0,0), | ||
|  |                                 gAnchorPoint  | ||
|  | 			    ); | ||
|  | 			} | ||
|  |                         else { | ||
|  |   			    options.shadow = new google.maps.MarkerImage(this.iconShadowUrl); | ||
|  | 			} | ||
|  | 		    } | ||
|  | 		} | ||
|  | 		if (this.draggable){ | ||
|  | 		    options.draggable = this.draggable; | ||
|  | 		} | ||
|  | 		if (this.labelText){ | ||
|  | 		    options.title =  this.labelText; | ||
|  | 		} | ||
|  | 		if (this.imageMap){ | ||
|  |                     options.shape = { | ||
|  |                         coord: this.imageMap, | ||
|  |                         type: 'poly' | ||
|  | 		    }; | ||
|  |                 } | ||
|  | 		 | ||
|  | 		options.position = this.location.toProprietary(this.api); | ||
|  | 		options.map = this.map; | ||
|  | 
 | ||
|  | 		var marker = new google.maps.Marker(options); | ||
|  | 
 | ||
|  | 		if (this.infoBubble){ | ||
|  | 		    var infowindow = new google.maps.InfoWindow({ | ||
|  |         	        content: this.infoBubble | ||
|  | 		    }); | ||
|  | 
 | ||
|  |                     var event_action = "click"; | ||
|  | 		    if (this.hover) { | ||
|  | 		        event_action = "mouseover"; | ||
|  | 		    } | ||
|  | 		    google.maps.event.addListener(marker, event_action, function() { infowindow.open(this.map,marker); }); | ||
|  | 		} | ||
|  | 
 | ||
|  |                 if (this.hoverIconUrl){ | ||
|  |                     var gSize = new google.maps.Size(this.iconSize[0], | ||
|  | 			                            this.iconSize[1]); | ||
|  |                     var zerozero = new google.maps.Point(0,0); | ||
|  |  		    var hIcon = new google.maps.MarkerImage( | ||
|  | 			this.hoverIconUrl, | ||
|  |                         gSize, | ||
|  |                         zerozero, | ||
|  |                         gAnchorPoint | ||
|  |                     ); | ||
|  |  		    var Icon = new google.maps.MarkerImage( | ||
|  | 			this.iconUrl, | ||
|  | 			gSize, | ||
|  |                         zerozero, | ||
|  |                         gAnchorPoint | ||
|  |                     ); | ||
|  |                     google.maps.event.addListener( | ||
|  |                         marker,  | ||
|  |                         "mouseover",  | ||
|  |                         function(){  | ||
|  |                             marker.setIcon(hIcon);  | ||
|  |                         } | ||
|  |                     ); | ||
|  |                     google.maps.event.addListener( | ||
|  |                         marker,  | ||
|  |                         "mouseout",  | ||
|  |                         function(){ marker.setIcon(Icon); } | ||
|  |                     ); | ||
|  |                 } | ||
|  | 
 | ||
|  | 		google.maps.event.addListener(marker, 'click', function() { | ||
|  | 			marker.mapstraction_marker.click.fire(); | ||
|  | 		}); | ||
|  | 		 | ||
|  | 		return marker; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	openBubble: function() { | ||
|  | 		var infowindow = new google.maps.InfoWindow({ | ||
|  |        		content: this.infoBubble | ||
|  | 	    }); | ||
|  | 	    infowindow.open(this.map,this.proprietary_marker); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	hide: function() { | ||
|  | 	    this.proprietary_marker.setOptions({visible:false}); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	show: function() { | ||
|  | 	    this.proprietary_marker.setOptions({visible:true}); | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	update: function() { | ||
|  | 		// TODO: Add provider code
 | ||
|  | 	} | ||
|  | 	 | ||
|  | }, | ||
|  | 
 | ||
|  | Polyline: { | ||
|  | 
 | ||
|  | 	toProprietary: function() { | ||
|  |             throw 'Not implemented'; | ||
|  | 	}, | ||
|  | 	 | ||
|  | 	show: function() { | ||
|  |             throw 'Not implemented'; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	hide: function() { | ||
|  |             throw 'Not implemented'; | ||
|  | 	} | ||
|  | 	 | ||
|  | } | ||
|  | 
 | ||
|  | }); |