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';
 | 
						|
	}
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
});
 |