123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- mxn.register('google', {
- Mapstraction: {
-
- init: function(element,api) {
- var me = this;
- if (GMap2) {
- if (GBrowserIsCompatible()) {
- this.maps[api] = new GMap2(element);
- GEvent.addListener(this.maps[api], 'click', function(marker,location) {
-
- if ( marker && marker.mapstraction_marker ) {
- marker.mapstraction_marker.click.fire();
- }
- else if ( location ) {
- me.click.fire({'location': new mxn.LatLonPoint(location.y, location.x)});
- }
-
- // If the user puts their own Google markers directly on the map
- // then there is no location and this event should not fire.
- if ( location ) {
- me.clickHandler(location.y,location.x,location,me);
- }
- });
- GEvent.addListener(this.maps[api], 'moveend', function() {
- me.moveendHandler(me);
- me.endPan.fire();
- });
-
- GEvent.addListener(this.maps[api], 'zoomend', function() {
- me.changeZoom.fire();
- });
-
- this.loaded[api] = true;
- me.load.fire();
- }
- else {
- alert('browser not compatible with Google Maps');
- }
- }
- else {
- alert(api + ' map script not imported');
- }
- },
-
- applyOptions: function(){
- var map = this.maps[this.api];
-
- if(this.options.enableScrollWheelZoom){
- map.enableContinuousZoom();
- map.enableScrollWheelZoom();
- }
-
- if (this.options.enableDragging) {
- map.enableDragging();
- } else {
- map.disableDragging();
- }
-
- },
- resizeTo: function(width, height){
- this.currentElement.style.width = width;
- this.currentElement.style.height = height;
- this.maps[this.api].checkResize();
- },
- addControls: function( args ) {
- var map = this.maps[this.api];
-
- // remove old controls
- if (this.controls) {
- while ((ctl = this.controls.pop())) {
- // Google specific method
- map.removeControl(ctl);
- }
- } else {
- this.controls = [];
- }
- c = this.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) {
- this.controls.unshift(new GScaleControl());
- map.addControl(this.controls[0]);
- this.addControlsArgs.scale = true;
- }
-
- if (args.overview) {
- c.unshift(new GOverviewMapControl());
- map.addControl(c[0]);
- this.addControlsArgs.overview = true;
- }
- if (args.map_type) {
- this.addMapTypeControls();
- }
- },
- addSmallControls: function() {
- var map = this.maps[this.api];
- this.controls.unshift(new GSmallMapControl());
- map.addControl(this.controls[0]);
- this.addControlsArgs.zoom = 'small';
- this.addControlsArgs.pan = true;
- },
- addLargeControls: function() {
- var map = this.maps[this.api];
- this.controls.unshift(new GLargeMapControl());
- map.addControl(this.controls[0]);
- this.addControlsArgs.zoom = 'large';
- this.addControlsArgs.pan = true;
- },
- addMapTypeControls: function() {
- var map = this.maps[this.api];
- this.controls.unshift(new GMapTypeControl());
- map.addControl(this.controls[0]);
- this.addControlsArgs.map_type = true;
- },
- 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 gpin = marker.toProprietary(this.api);
- map.addOverlay(gpin);
-
- GEvent.addListener(gpin, 'infowindowopen', function() {
- marker.openInfoBubble.fire();
- });
- GEvent.addListener(gpin, 'infowindowclose', function() {
- marker.closeInfoBubble.fire();
- });
- return gpin;
- },
- removeMarker: function(marker) {
- var map = this.maps[this.api];
- map.removeOverlay(marker.proprietary_marker);
- },
- removeAllMarkers: function() {
- var map = this.maps[this.api];
- // FIXME: got a feeling this doesn't only delete markers
- map.clearOverlays();
- },
-
- declutterMarkers: function(opts) {
- throw 'Not implemented';
- },
- addPolyline: function(polyline, old) {
- var map = this.maps[this.api];
- gpolyline = polyline.toProprietary(this.api);
- map.addOverlay(gpolyline);
- return gpolyline;
- },
- 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();
- var point = new mxn.LatLonPoint(pt.lat(),pt.lng());
- return point;
- },
- 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];
- // NE and SW points from the bounding box.
- var ne = bbox.getNorthEast();
- var sw = bbox.getSouthWest();
- var gbox = new GLatLngBounds( sw.toProprietary(this.api), ne.toProprietary(this.api) );
- var zoom = map.getBoundsZoomLevel( gbox );
- return zoom;
- },
- setMapType: function(type) {
- var map = this.maps[this.api];
- switch(type) {
- case mxn.Mapstraction.ROAD:
- map.setMapType(G_NORMAL_MAP);
- break;
- case mxn.Mapstraction.SATELLITE:
- map.setMapType(G_SATELLITE_MAP);
- break;
- case mxn.Mapstraction.HYBRID:
- map.setMapType(G_HYBRID_MAP);
- break;
- default:
- map.setMapType(type || G_NORMAL_MAP);
- }
- },
- getMapType: function() {
- var map = this.maps[this.api];
- var type = map.getCurrentMapType();
- switch(type) {
- case G_NORMAL_MAP:
- return mxn.Mapstraction.ROAD;
- case G_SATELLITE_MAP:
- return mxn.Mapstraction.SATELLITE;
- case G_HYBRID_MAP:
- return mxn.Mapstraction.HYBRID;
- default:
- return null;
- }
- },
- getBounds: function () {
- var map = this.maps[this.api];
- var ne, sw, nw, se;
- var gbox = map.getBounds();
- sw = gbox.getSouthWest();
- ne = gbox.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();
- var gbounds = new GLatLngBounds(new GLatLng(sw.lat,sw.lon),new GLatLng(ne.lat,ne.lon));
- map.setCenter(gbounds.getCenter(), map.getBoundsZoomLevel(gbounds));
- },
- addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) {
- var map = this.maps[this.api];
- map.getPane(G_MAP_MAP_PANE).appendChild(oContext.imgElm);
- this.setImageOpacity(id, opacity);
- this.setImagePosition(id);
- GEvent.bind(map, "zoomend", this, function() {
- this.setImagePosition(id);
- });
- GEvent.bind(map, "moveend", this, function() {
- this.setImagePosition(id);
- });
- },
- setImagePosition: function(id, oContext) {
- var map = this.maps[this.api];
- var topLeftPoint; var bottomRightPoint;
- topLeftPoint = map.fromLatLngToDivPixel( new GLatLng(oContext.latLng.top, oContext.latLng.left) );
- bottomRightPoint = map.fromLatLngToDivPixel( new GLatLng(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;
- },
-
- addOverlay: function(url, autoCenterAndZoom) {
- var map = this.maps[this.api];
- var geoXML = new GGeoXml(url);
- map.addOverlay(geoXML, function() {
- if(autoCenterAndZoom) {
- geoXML.gotoDefaultViewport(map);
- }
- });
- },
- addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, max_zoom, map_type) {
- var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, "copyleft");
- var copyrightCollection = new GCopyrightCollection(copyright_text);
- copyrightCollection.addCopyright(copyright);
- var tilelayers = [];
- tilelayers[0] = new GTileLayer(copyrightCollection, min_zoom, max_zoom);
- tilelayers[0].isPng = function() {
- return true;
- };
- tilelayers[0].getOpacity = function() {
- return opacity;
- };
- tilelayers[0].getTileUrl = function (a, b) {
- url = tile_url;
- url = url.replace(/\{Z\}/g,b);
- url = url.replace(/\{X\}/g,a.x);
- url = url.replace(/\{Y\}/g,a.y);
- return url;
- };
- if(map_type) {
- var tileLayerOverlay = new GMapType(tilelayers, new GMercatorProjection(19), copyright_text, {
- errorMessage:"More "+copyright_text+" tiles coming soon"
- });
- this.maps[this.api].addMapType(tileLayerOverlay);
- } else {
- tileLayerOverlay = new GTileLayerOverlay(tilelayers[0]);
- this.maps[this.api].addOverlay(tileLayerOverlay);
- }
- this.tileLayers.push( [tile_url, tileLayerOverlay, true] );
- return tileLayerOverlay;
- },
- toggleTileLayer: function(tile_url) {
- for (var f=0; f<this.tileLayers.length; f++) {
- if(this.tileLayers[f][0] == tile_url) {
- if(this.tileLayers[f][2]) {
- this.maps[this.api].removeOverlay(this.tileLayers[f][1]);
- this.tileLayers[f][2] = false;
- }
- else {
- this.maps[this.api].addOverlay(this.tileLayers[f][1]);
- this.tileLayers[f][2] = true;
- }
- }
- }
- },
- getPixelRatio: function() {
- var map = this.maps[this.api];
- var projection = G_NORMAL_MAP.getProjection();
- var centerPoint = map.getCenter();
- var zoom = map.getZoom();
- var centerPixel = projection.fromLatLngToPixel(centerPoint, zoom);
- // distance is the distance in metres for 5 pixels (3-4-5 triangle)
- var distancePoint = projection.fromPixelToLatLng(new GPoint(centerPixel.x + 3, centerPixel.y + 4), zoom);
- //*1000(km to m), /5 (pythag), *2 (radius to diameter)
- return 10000/distancePoint.distanceFrom(centerPoint);
-
- },
-
- mousePosition: function(element) {
- var locDisp = document.getElementById(element);
- if (locDisp !== null) {
- var map = this.maps[this.api];
- GEvent.addListener(map, 'mousemove', function (point) {
- var loc = point.lat().toFixed(4) + ' / ' + point.lng().toFixed(4);
- locDisp.innerHTML = loc;
- });
- locDisp.innerHTML = '0.0000 / 0.0000';
- }
- }
- },
- LatLonPoint: {
-
- toProprietary: function() {
- return new GLatLng(this.lat,this.lon);
- },
- fromProprietary: function(googlePoint) {
- this.lat = googlePoint.lat();
- this.lon = googlePoint.lng();
- }
-
- },
- Marker: {
-
- toProprietary: function() {
- var infoBubble, event_action, infoDiv, div;
- var options = {};
- if(this.labelText){
- options.title = this.labelText;
- }
- if(this.iconUrl){
- var icon = new GIcon(G_DEFAULT_ICON, this.iconUrl);
- icon.printImage = icon.mozPrintImage = icon.image;
- if(this.iconSize) {
- icon.iconSize = new GSize(this.iconSize[0], this.iconSize[1]);
- var anchor;
- if(this.iconAnchor) {
- anchor = new GPoint(this.iconAnchor[0], this.iconAnchor[1]);
- }
- else {
- // FIXME: hard-coding the anchor point
- anchor = new GPoint(this.iconSize[0]/2, this.iconSize[1]/2);
- }
- icon.iconAnchor = anchor;
- }
- if(typeof(this.iconShadowUrl) != 'undefined') {
- icon.shadow = this.iconShadowUrl;
- if(this.iconShadowSize) {
- icon.shadowSize = new GSize(this.iconShadowSize[0], this.iconShadowSize[1]);
- }
- } else { // turn off shadow
- icon.shadow = '';
- icon.shadowSize = '';
- }
- if(this.transparent) {
- icon.transparent = this.transparent;
- }
- if(this.imageMap) {
- icon.imageMap = this.imageMap;
- }
- options.icon = icon;
- }
- if(this.draggable){
- options.draggable = this.draggable;
- }
- var gmarker = new GMarker( this.location.toProprietary('google'),options);
-
- if(this.infoBubble){
- infoBubble = this.infoBubble;
- if(this.hover) {
- event_action = "mouseover";
- }
- else {
- event_action = "click";
- }
- GEvent.addListener(gmarker, event_action, function() {
- gmarker.openInfoWindowHtml(infoBubble, {
- maxWidth: 100
- });
- });
- }
- if(this.hoverIconUrl){
- GEvent.addListener(gmarker, "mouseover", function() {
- gmarker.setImage(this.hoverIconUrl);
- });
- GEvent.addListener(gmarker, "mouseout", function() {
- gmarker.setImage(this.iconUrl);
- });
- }
- if(this.infoDiv){
- infoDiv = this.infoDiv;
- div = this.div;
- if(this.hover) {
- event_action = "mouseover";
- }
- else {
- event_action = "click";
- }
- GEvent.addListener(gmarker, event_action, function() {
- document.getElementById(div).innerHTML = infoDiv;
- });
- }
- return gmarker;
- },
- openBubble: function() {
- var gpin = this.proprietary_marker;
- gpin.openInfoWindowHtml(this.infoBubble);
- },
- hide: function() {
- this.proprietary_marker.hide();
- },
- show: function() {
- this.proprietary_marker.show();
- },
- update: function() {
- point = new mxn.LatLonPoint();
- point.fromGoogle(this.proprietary_marker.getPoint());
- this.location = point;
- }
-
- },
- Polyline: {
- toProprietary: function() {
- var gpoints = [];
- for (var i = 0, length = this.points.length ; i< length; i++){
- gpoints.push(this.points[i].toProprietary('google'));
- }
- if (this.closed || gpoints[0].equals(gpoints[length-1])) {
- return new GPolygon(gpoints, this.color, this.width, this.opacity, this.fillColor || "#5462E3", this.opacity || "0.3");
- } else {
- return new GPolyline(gpoints, this.color, this.width, this.opacity);
- }
- },
-
- show: function() {
- throw 'Not implemented';
- },
- hide: function() {
- throw 'Not implemented';
- }
- }
- });
|