codesite-noreply at google.com
2010-May-19 23:38 UTC
[Mapstraction] [mapstraction] r80 committed - Multimap implementation passing Lint and test page.
Revision: 80 Author: dezfowler Date: Wed May 19 16:34:32 2010 Log: Multimap implementation passing Lint and test page. http://code.google.com/p/mapstraction/source/detail?r=80 Added: /trunk/source/mxn.multimap.core.js ======================================--- /dev/null +++ /trunk/source/mxn.multimap.core.js Wed May 19 16:34:32 2010 @@ -0,0 +1,459 @@ +mxn.register(''multimap'', { + +Mapstraction: { + + init: function(element, api) { + var me = this; + + if (MultimapViewer) { + if(this.debug){ + // multimap calls this print_debug function to output debug info + window.print_debug = function(strMessage){ + var dbg = document.getElementById(''debug''); + if(dbg){ + dbg.innerHTML += ''<p>MUlTIMAP: '' + strMessage + ''</p>''; + } + else { + alert(strMessage); + } + }; + } + + var map = new MultimapViewer(element); + + // Hook up our events + map.addEventHandler(''click'', function(eventType, eventTarget, arg1, arg2, arg3){ + if (arg1) { + me.clickHandler(arg1.lat, arg1.lon, me); + me.click.fire({''location'': new mxn.LatLonPoint(arg1.lat, arg1.lon)}); + } + }); + + map.addEventHandler(''changeZoom'', function(eventType, eventTarget, arg1, arg2, arg3){ + me.moveendHandler(me); + me.changeZoom.fire(); + }); + + map.addEventHandler(''endPan'', function(eventType, eventTarget, arg1, arg2, arg3){ + me.moveendHandler(me); + me.endPan.fire(); + }); + + map.addEventHandler(''openInfoBox'', function(eventType, eventTarget, arg1, arg2, arg3){ + if(arg1.mapstraction_marker) { + arg1.mapstraction_marker.openInfoBubble.fire(); + } + }); + + map.addEventHandler(''closeInfoBox'', function(eventType, eventTarget, arg1, arg2, arg3){ + if(arg1.mapstraction_marker) { + marker.closeInfoBubble.fire(); + } + }); + + this.maps[api] = map; + this.loaded[api] = true; + + } + else { + alert(api + '' map script not imported''); + } + }, + + applyOptions: function(){ + var map = this.maps[this.api]; + + if (this.options.enableScrollWheelZoom) { + map.setOptions( { ''mousewheel:wheelup'': ''zoomin'', ''mousewheel:wheeldown'': ''zoomout'' } ); + } + + if (this.options.enableDragging) { + map.setOption(''drag'', ''dragmap''); + } + else { + map.setOption(''drag'', ''''); + } + }, + + resizeTo: function(width, height){ + this.currentElement.style.width = width; + this.currentElement.style.height = height; + this.maps[this.api].resize(); + }, + + addControls: function( args ) { + var map = this.maps[this.api]; + + var pan_zoom_widget = ''MM''; + if (args.zoom && args.zoom == "small") { + pan_zoom_widget = pan_zoom_widget + "Small"; + } + if (args.pan) { + pan_zoom_widget = pan_zoom_widget + "Pan"; + } + if (args.zoom) { + pan_zoom_widget = pan_zoom_widget + "Zoom"; + } + pan_zoom_widget = pan_zoom_widget + "Widget"; + + if (pan_zoom_widget != "MMWidget") { + eval('' map.addWidget( new '' + pan_zoom_widget + ''() );''); + } + + if ( args.map_type ) { + map.addWidget( new MMMapTypeWidget() ); + } + if ( args.overview ) { + map.addWidget( new MMOverviewWidget() ); + } + }, + + addSmallControls: function() { + var map = this.maps[this.api]; + + smallPanzoomWidget = new MMSmallPanZoomWidget(); + map.addWidget( smallPanzoomWidget ); + this.addControlsArgs.pan = true; + this.addControlsArgs.zoom = ''small''; + }, + + addLargeControls: function() { + var map = this.maps[this.api]; + + panzoomWidget = new MMPanZoomWidget(); + map.addWidget( panzoomWidget ); + this.addControlsArgs.pan = true; // keep the controls in case of swap + this.addControlsArgs.zoom = ''large''; + }, + + addMapTypeControls: function() { + var map = this.maps[this.api]; + + map.addWidget( new MMMapTypeWidget() ); + }, + + setCenterAndZoom: function(point, zoom) { + var map = this.maps[this.api]; + var pt = point.toProprietary(this.api); + + // TODO: toProprietary() here? + map.goToPosition( new MMLatLon( point.lat, point.lng ), zoom ); + }, + + addMarker: function(marker, old) { + var map = this.maps[this.api]; + var pin = marker.toProprietary(this.api); + + map.addOverlay(pin); + + return pin; + }, + + removeMarker: function(marker) { + var map = this.maps[this.api]; + + map.removeOverlay(marker.proprietary_marker); + }, + + declutterMarkers: function(opts) { + var map = this.maps[this.api]; + + map.declutterGroup(opts.groupName); + }, + + addPolyline: function(polyline, old) { + var map = this.maps[this.api]; + var pl = polyline.toProprietary(this.api); + + map.addOverlay( pl ); + + return pl; + }, + + removePolyline: function(polyline) { + var map = this.maps[this.api]; + + polyline.proprietary_polyline.remove(); + }, + + getCenter: function() { + var point; + var map = this.maps[this.api]; + + var mmPt = map.getCurrentPosition(); + point = new mxn.LatLonPoint(); + point.fromProprietary(this.api, mmPt); + + return point; + }, + + setCenter: function(point, options) { + var map = this.maps[this.api]; + var pt = point.toProprietary(this.api); + if(options && options.pan) { + map.panToPosition(pt); + } + else { + map.goToPosition(pt); + } + }, + + setZoom: function(zoom) { + var map = this.maps[this.api]; + + map.setZoomFactor(zoom); + }, + + getZoom: function() { + var map = this.maps[this.api]; + var zoom; + + zoom = map.getZoomFactor(); + + return zoom; + }, + + getZoomLevelForBoundingBox: function( bbox ) { + var map = this.maps[this.api]; + // NE and SW points from the bounding box. + var ne = bbox.getNorthEast(); + var sw = bbox.getSouthWest(); + var zoom; + + var mmlocation = map.getAutoScaleLocation( [sw.toProprietary(this.api), ne.toProprietary(this.api)] ); + zoom = mmlocation.zoom_factor; + + return zoom; + }, + + setMapType: function(type) { + var map = this.maps[this.api]; + var defaultType = null; + var requiredType = null; + var typeWeWillUse = null; + + // check we can map the type + switch (type) { + case mxn.Mapstraction.ROAD: + requiredType = MM_WORLD_MAP; + break; + case mxn.Mapstraction.SATELLITE: + requiredType = MM_WORLD_AERIAL; + break; + case mxn.Mapstraction.HYBRID: + requiredType = MM_WORLD_HYBRID; + break; + } + + var availableTypes = map.getAvailableMapTypes(); + for (var i = 0; i < availableTypes.length; i++) { + if(requiredType && availableTypes[i] == requiredType) { + typeWeWillUse = requiredType; + break; + } + if(availableTypes[i] == MM_WORLD_MAP) { + defaultType = MM_WORLD_MAP; + } + } + + typeWeWillUse = typeWeWillUse || defaultType; + + if(typeWeWillUse !== null) { + map.setMapType(typeWeWillUse); + } + + }, + + getMapType: function() { + var map = this.maps[this.api]; + + type = map.getMapType(); + switch(type) { + case MM_WORLD_MAP: + return mxn.Mapstraction.ROAD; + case MM_WORLD_AERIAL: + return mxn.Mapstraction.SATELLITE; + case MM_WORLD_HYBRID: + return mxn.Mapstraction.HYBRID; + default: + return null; + } + + }, + + getBounds: function () { + var map = this.maps[this.api]; + + var mmbox = map.getMapBounds(); + sw = mmbox.getSouthWest(); + ne = mmbox.getNorthEast(); + return new mxn.BoundingBox(sw.lat, sw.lon, ne.lat, ne.lon); + }, + + setBounds: function(bounds){ + var map = this.maps[this.api]; + var sw = bounds.getSouthWest(); + var ne = bounds.getNorthEast(); + + var mmlocation = map.getAutoScaleLocation([sw.toProprietary(this.api), ne.toProprietary(this.api)]); + map.goToPosition(mmlocation.coords, mmlocation.zoom_factor); + }, + + addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) { + var map = this.maps[this.api]; + map.getContainer().appendChild(oContext.imgElm); + this.setImageOpacity(id, opacity); + this.setImagePosition(id); + var me = this; + map.addEventHandler( ''changeZoom'', function(eventType, eventTarget, arg1, arg2, arg3) { + me.setImagePosition(id); + }); + map.addEventHandler( ''drag'', function(eventType, eventTarget, arg1, arg2, arg3) { + me.setImagePosition(id); + }); + map.addEventHandler( ''endPan'', function(eventType, eventTarget, arg1, arg2, arg3) { + me.setImagePosition(id); + }); + }, + + setImagePosition: function(id, oContext) { + var map = this.maps[this.api]; + var topLeftPoint; var bottomRightPoint; + + topLeftPoint = map.geoPosToContainerPixels(new MMLatLon(oContext.latLng.top, oContext.latLng.left)); + bottomRightPoint = map.geoPosToContainerPixels(new MMLatLon(oContext.latLng.bottom, oContext.latLng.right)); + + oContext.pixels.top = topLeftPoint.y; + oContext.pixels.left = topLeftPoint.x; + oContext.pixels.bottom = bottomRightPoint.y; + oContext.pixels.right = bottomRightPoint.x; + } + + /* Not supported + 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) { + 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 MMLatLon(this.lat, this.lon); + }, + + fromProprietary: function(multimapPoint) { + this.lat = multimapPoint.lat; + this.lon = multimapPoint.lon; + } + +}, + +Marker: { + + toProprietary: function() { + //prepare our markeroptions + var mmmarkeropts = {}; + + if(this.iconUrl) { + mmmarkeropts.icon = new MMIcon(this.iconUrl); + if(this.iconSize) { + mmmarkeropts.icon.iconSize = new MMDimensions(this.iconSize[0], this.iconSize[1]); + } + else { + //mmmarkeropts.icon.iconSize = new MMDimensions(32, 32); //how to get this? + } + + if(this.iconAnchor) { + mmmarkeropts.icon.iconAnchor = new MMPoint(this.iconAnchor[0], this.iconAnchor[1]); + } + + if(this.groupName) { + mmmarkeropts.icon.groupName = this.groupName; + } + } + + if(this.labelText) { + mmmarkeropts.label = this.labelText; + } + + + var mmmarker = new MMMarkerOverlay( this.location.toProprietary(''multimap''), mmmarkeropts ); + + if(this.infoBubble) { + mmmarker.setInfoBoxContent(this.infoBubble); + } + + if(this.infoDiv) { } + + for (var key in this.attributes) { + if (this.attributes.hasOwnProperty(key)) { + mmmarker.setAttribute(key, this.attributes[key]); + } + } + + return mmmarker; + }, + + openBubble: function() { + this.proprietary_marker.openInfoBox(); + }, + + hide: function() { + this.proprietary_marker.setVisibility(false); + }, + + show: function() { + this.proprietary_marker.setVisibility(true); + } + + /* Not supported + update: function() { + // TODO: Add provider code + } + */ + +}, + +Polyline: { + + toProprietary: function() { + var mmpolyline; + var mmpoints = []; + for (var i = 0, length = this.points.length ; i < length; i++){ + mmpoints.push(this.points[i].toProprietary(''multimap'')); + } + mmpolyline = new MMPolyLineOverlay(mmpoints, this.color, this.opacity, this.width, this.closed, this.fillColor); + return mmpolyline; + } + +} + +});