mxn.register('cloudmade', { Mapstraction: { init: function(element, api) { var me = this; var cloudmade = new CM.Tiles.CloudMade.Web({key: cloudmade_key}); this.maps[api] = new CM.Map(element, cloudmade); this.loaded[api] = true; CM.Event.addListener(this.maps[api], 'click', function(location,marker) { if ( marker && marker.mapstraction_marker ) { marker.mapstraction_marker.click.fire(); } else if ( location ) { me.click.fire({'location': new mxn.LatLonPoint(location.lat(), location.lng())}); } // If the user puts their own markers directly on the map // then there is no location and this event should not fire. if ( location ) { me.clickHandler(location.lat(),location.lng(),location,me); } }); }, applyOptions: function(){ var map = this.maps[this.api]; if(this.options.enableScrollWheelZoom){ map.enableScrollWheelZoom(); } }, resizeTo: function(width, height){ this.maps[this.api].checkResize(); }, addControls: function( args ) { var map = this.maps[this.api]; var c = this.addControlsArgs; switch (c.zoom) { case 'large': this.addLargeControls(); break; case 'small': this.addSmallControls(); break; } if (c.map_type) { this.addMapTypeControls(); } if (c.scale) { map.addControl(new CM.ScaleControl()); this.addControlsArgs.scale = true; } }, addSmallControls: function() { var map = this.maps[this.api]; map.addControl(new CM.SmallMapControl()); this.addControlsArgs.zoom = 'small'; }, addLargeControls: function() { var map = this.maps[this.api]; map.addControl(new CM.LargeMapControl()); this.addControlsArgs.zoom = 'large'; }, addMapTypeControls: function() { var map = this.maps[this.api]; map.addControl(new CM.TileLayerControl()); this.addControlsArgs.map_type = true; }, dragging: function(on) { var map = this.maps[this.api]; if (on) { map.enableDragging(); } else { map.disableDragging(); } }, setCenterAndZoom: function(point, zoom) { var map = this.maps[this.api]; var pt = point.toProprietary(this.api); map.setCenter(pt, 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]; marker.proprietary_marker.closeInfoWindow(); map.removeOverlay(marker.proprietary_marker); }, removeAllMarkers: function() { // Done in mxn.core.js }, declutterMarkers: function(opts) { var map = this.maps[this.api]; // TODO: Add provider code }, 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]; map.removeOverlay(polyline.proprietary_polyline); }, 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 !== null && 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]; // NE and SW points from the bounding box. var ne = bbox.getNorthEast(); var sw = bbox.getSouthWest(); var zoom = map.getBoundsZoomLevel(new CM.LatLngBounds(sw.toProprietary(this.api), ne.toProprietary(this.api))); return zoom; }, setMapType: function(type) { var map = this.maps[this.api]; // TODO: Are there any MapTypes for Cloudmade? switch(type) { case mxn.Mapstraction.ROAD: // TODO: Add provider code break; case mxn.Mapstraction.SATELLITE: // TODO: Add provider code break; case mxn.Mapstraction.HYBRID: // TODO: Add provider code break; default: // TODO: Add provider code } }, getMapType: function() { var map = this.maps[this.api]; // TODO: Are there any MapTypes for Cloudmade? return mxn.Mapstraction.ROAD; //return mxn.Mapstraction.SATELLITE; //return mxn.Mapstraction.HYBRID; }, getBounds: function () { var map = this.maps[this.api]; var box = map.getBounds(); var sw = box.getSouthWest(); var ne = box.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(); var ne = bounds.getNorthEast(); map.zoomToBounds(new CM.LatLngBounds(sw.toProprietary(this.api), ne.toProprietary(this.api))); }, 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 }, 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() { var cll = new CM.LatLng(this.lat,this.lon); return cll; }, fromProprietary: function(point) { return new mxn.LatLonPoint(point.lat(),point.lng()); } }, Marker: { toProprietary: function() { var pt = this.location.toProprietary(this.api); var options = {}; if (this.iconUrl) { var cicon = new CM.Icon(); cicon.image = this.iconUrl; if (this.iconSize) { cicon.iconSize = new CM.Size(this.iconSize[0], this.iconSize[1]); if (this.iconAnchor) { cicon.iconAnchor = new CM.Point(this.iconAnchor[0], this.iconAnchor[1]); } } if (this.iconShadowUrl) { cicon.shadow = this.iconShadowUrl; if (this.iconShadowSize) { cicon.shadowSize = new CM.Size(this.iconShadowSize[0], this.iconShadowSize[1]); } } options.icon = cicon; } if (this.labelText) { options.title = this.labelText; } var cmarker = new CM.Marker(pt, options); if (this.infoBubble) { cmarker.bindInfoWindow(this.infoBubble); } return cmarker; }, openBubble: function() { var pin = this.proprietary_marker; pin.openInfoWindow(this.infoBubble); }, hide: function() { var pin = this.proprietary_marker; pin.hide(); }, show: function() { var pin = this.proprietary_marker; pin.show(); }, update: function() { // TODO: Add provider code } }, Polyline: { toProprietary: function() { var pts = []; var poly; for (var i = 0, length = this.points.length ; i< length; i++){ pts.push(this.points[i].toProprietary(this.api)); } if (this.closed || pts[0].equals(pts[pts.length-1])) { poly = new CM.Polygon(pts, this.color, this.width, this.opacity, this.fillColor || "#5462E3", this.opacity || "0.3"); } else { poly = new CM.Polyline(pts, this.color, this.width, this.opacity); } return poly; }, show: function() { this.proprietary_polyline.show(); }, hide: function() { this.proprietary_polyline.hide(); } } });