From fc08a5c8803fd79d58126528fa4a593ccfb8d512 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 17 Nov 2009 23:23:13 -0500 Subject: first pass at Mapstraction plugin --- plugins/Mapstraction/js/mxn.googlev3.core.js | 443 +++++++++++++++++++++++++++ 1 file changed, 443 insertions(+) create mode 100644 plugins/Mapstraction/js/mxn.googlev3.core.js (limited to 'plugins/Mapstraction/js/mxn.googlev3.core.js') diff --git a/plugins/Mapstraction/js/mxn.googlev3.core.js b/plugins/Mapstraction/js/mxn.googlev3.core.js new file mode 100644 index 000000000..7ca07ec7f --- /dev/null +++ b/plugins/Mapstraction/js/mxn.googlev3.core.js @@ -0,0 +1,443 @@ +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'; + } + +} + +}); -- cgit v1.2.3-54-g00ecf