diff --git a/gmap.module b/gmap.module index 767d7cc..9442091 100644 --- a/gmap.module +++ b/gmap.module @@ -17,7 +17,7 @@ * See http://groups.google.com/group/Google-Maps-API/web/api-version-changes * for details on using other version numbers. */ -define('GMAP_API_VERSION', '2.115'); +define('GMAP_API_VERSION', '3'); /** * Get the defaults for a gmap. @@ -319,13 +319,16 @@ function _gmap_doheader() { drupal_add_js($gmap_path . '/js/poly.js'); global $language; + $file = 'api/js'; $query = array( - 'file' => 'api', 'v' => variable_get('gmap_api_version', GMAP_API_VERSION), - 'key' => gmap_get_key(), - 'hl' => $language->language, + 'language' => $language->language, + 'sensor' => 'false', ); - drupal_set_html_head(''); + if ($key = gmap_get_key()) { + $query['key'] = $key; + } + drupal_set_html_head(''); $gmap_initialized = TRUE; } @@ -1120,20 +1123,19 @@ function gmap_decimal($num) { * for a description of the possible status codes. */ function gmap_geocode($address, $tld = 'com') { - $key = gmap_get_key(); - $data = drupal_http_request('http://maps.google.' . $tld . '/maps/geo?q=' . drupal_urlencode($address) . '&output=csv&key=' . $key); - if ($data->code == 200) { + $result = drupal_http_request('https://maps.googleapis.' . $tld . '/maps/api/geocode/xml?address=' . drupal_urlencode($address) . '&sensor=false'); + $data = new SimpleXMLElement($result->data); + if ($data->status == 'OK') { $r = explode(',', $data->data); return array( - 'status' => (int)$r[0], - 'accuracy' => (int)$r[1], - 'latitude' => $r[2], - 'longitude' => $r[3], + 'status' => (string) $data->status, + 'latitude' => (float) $data->result->geometry->location->lat, + 'longitude' => (float) $data->result->geometry->location->lng, ); } - // Non 200 is G_GEO_SERVER_ERROR (500). + return array( - 'status' => 500, + 'status' => $data->status, ); } @@ -1245,7 +1247,7 @@ function gmap_keys_service() { * Retrieve the Google Maps key that is in use for the site. */ function gmap_get_key() { - $key = variable_get('googlemap_api_key', ''); + $key = variable_get('gmap_api_key', ''); if (module_exists('keys_api')) { $key = keys_api_get_key('gmap', $_SERVER['HTTP_HOST']); } diff --git a/gmap_settings_ui.inc b/gmap_settings_ui.inc index 90b5c9f..b9d5bd8 100644 --- a/gmap_settings_ui.inc +++ b/gmap_settings_ui.inc @@ -18,23 +18,23 @@ function gmap_admin_settings(&$form_state) { ); if (!module_exists('keys_api') && !module_exists('keys')) { - $form['initialization']['googlemap_api_key'] = array( + $form['initialization']['gmap_api_key'] = array( '#type' => 'textfield', - '#default_value' => variable_get('googlemap_api_key', ''), + '#default_value' => variable_get('gmap_api_key', ''), '#size' => 50, '#maxlength' => 255, ); } else { - $form['initialization']['googlemap_api_key'] = array( + $form['initialization']['gmap_api_key'] = array( '#type' => 'item', - '#title' => t('Google Maps API Key'), + '#title' => t('Your Google maps API Version 3 key'), '#value' => t('Managed by Keys.', array('@url' => url('admin/settings/keys'))), ); } - $form['initialization']['googlemap_api_key']['#title'] = t('Google Maps API Key'); - $form['initialization']['googlemap_api_key']['#description'] = t('Your personal Googlemaps API key. You must get this for each separate website at Google Map API website.'); + $form['initialization']['gmap_api_key']['#title'] = t('Google Maps API Key'); + $form['initialization']['gmap_api_key']['#description'] = t('This key is currently not required by Google. Entering a Key will allow you to track map usage in Google. If you want to use an API key, you can get one at Google Map API website.'); if (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) != FILE_DOWNLOADS_PUBLIC) { $form['initialization']['gmap_private_markerfile'] = array( diff --git a/js/address.js b/js/address.js index bb444d0..e963b48 100755 --- a/js/address.js +++ b/js/address.js @@ -13,7 +13,7 @@ Drupal.gmap.geocoder = function () { var theGeocoder; if (!theGeocoder) { - theGeocoder = new GClientGeocoder(); + theGeocoder = new google.maps.Geocoder(); } return theGeocoder; }; @@ -22,10 +22,10 @@ Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; obj.bind('geocode_pan', function (addr) { - Drupal.gmap.geocoder().getLatLng(addr, function (point) { - if (point) { - obj.vars.latitude = point.lat(); - obj.vars.longitude = point.lng(); + Drupal.gmap.geocoder().geocode({'address': addr}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + obj.vars.latitude = results[0].geometry.location.lat(); + obj.vars.longitude = results[0].geometry.location.lng(); obj.change("move", -1); } else { @@ -35,11 +35,11 @@ Drupal.gmap.addHandler('gmap', function (elem) { }); obj.bind('geocode_panzoom', function (addr) { - Drupal.gmap.geocoder().getLocations(addr, function (response) { - if (response && response.Status.code === 200) { - var place = response.Placemark[0]; - obj.vars.latitude = place.Point.coordinates[1]; - obj.vars.longitude = place.Point.coordinates[0]; + Drupal.gmap.geocoder().geocode({'address': addr}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + var place = results[0]; + obj.vars.latitude = results[0].geometry.location.lat(); + obj.vars.longitude = results[0].geometry.location.lng(); // This is, of course, temporary. @@ -67,10 +67,10 @@ Drupal.gmap.addHandler('gmap', function (elem) { obj.bind('preparemarker', function (marker) { if (marker.address && (!marker.latitude || !marker.longitude)) { - Drupal.gmap.geocoder().getLatLng(marker.address, function (point) { - if (point) { - marker.latitude = point.lat(); - marker.longitude = point.lng(); + Drupal.gmap.geocoder().geocode({'address': marker.address}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + marker.latitude = results[0].geometry.lat(); + marker.longitude = results[0].geometry.lng(); } }); } @@ -98,10 +98,10 @@ Drupal.gmap.addHandler('address', function (elem) { // This happens ASYNC!!! $(elem).change(function () { if (elem.value.length > 0) { - Drupal.gmap.geocoder().getLatLng(elem.value, function (point) { - if (point) { - obj.vars.latitude = point.lat(); - obj.vars.longitude = point.lng(); + Drupal.gmap.geocoder().geocode({'address': elem.value}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + obj.vars.latitude = results[0].geometry.location.lat(); + obj.vars.longitude = results[0].geometry.location.lng(); obj.change("move", binding); } else { @@ -138,9 +138,9 @@ Drupal.gmap.addHandler('locpick_address', function (elem) { // This happens ASYNC!!! $(elem).change(function () { if (elem.value.length > 0) { - Drupal.gmap.geocoder().getLatLng(elem.value, function (point) { - if (point) { - obj.locpick_coord = point; + Drupal.gmap.geocoder().geocode({'address': elem.value}, function (results, status) { + if (status == google.maps.GeocoderStatus.OK) { + obj.locpick_coord = results[0]; obj.change("locpickchange", binding); } else { diff --git a/js/align.js b/js/align.js index 335832b..19b3f91 100755 --- a/js/align.js +++ b/js/align.js @@ -24,7 +24,7 @@ Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; // Respond to incoming alignment changes. obj.bind("alignchange", function () { - var cont = obj.map.getContainer(); + var cont = obj.map.getDiv(); $(cont) .removeClass('gmap-left') .removeClass('gmap-center') diff --git a/js/gmap.js b/js/gmap.js index 470da5c..9736bfe 100755 --- a/js/gmap.js +++ b/js/gmap.js @@ -187,6 +187,20 @@ Drupal.gmap.map = function (v) { obj.change(name, id, userdata); }, 0); }; + + this.getMapTypeName = function(type) { + if (type == 'map' || type == 'roadmap') return 'Map'; + if (type == 'hybrid') return 'Hybrid'; + if (type == 'physical' || type == 'terrain') return 'Physical'; + if (type == 'satellite') return 'Satellite'; + }; + + this.getMapTypeId = function(type) { + if (type == 'Map' || type == 'Roadmap') return google.maps.MapTypeId.ROADMAP; + if (type == 'Hybrid') return google.maps.MapTypeId.HYBRID; + if (type == 'Physical' || type == 'Terrain') return google.maps.MapTypeId.TERRAIN; + if (type == 'Satellite') return google.maps.MapTypeId.SATELLITE; + }; }; //////////////////////////////////////// @@ -194,10 +208,8 @@ Drupal.gmap.map = function (v) { //////////////////////////////////////// Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; - var _ib = {}; - // Respond to incoming zooms _ib.zoom = obj.bind("zoom", function () { obj.map.setZoom(obj.vars.zoom); @@ -205,95 +217,94 @@ Drupal.gmap.addHandler('gmap', function (elem) { // Respond to incoming moves _ib.move = obj.bind("move", function () { - obj.map.panTo(new GLatLng(obj.vars.latitude, obj.vars.longitude)); - }); - - // Respond to incoming recenter commands. - _ib.recenter = obj.bind("recenter", function (vars) { - if (vars) { - if (vars.bounds) { - obj.vars.latitude = vars.bounds.getCenter().lat(); - obj.vars.longitude = vars.bounds.getCenter().lng(); - obj.vars.zoom = obj.map.getBoundsZoomLevel(vars.bounds); - } - else { - obj.vars.latitude = vars.latitude; - obj.vars.longitude = vars.longitude; - obj.vars.zoom = vars.zoom; - } - } - obj.map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom); - }); - - // Respond to incoming map type changes - _ib.mtc = obj.bind("maptypechange", function () { - var i; - for (i = 0; i < obj.opts.mapTypeNames.length; i++) { - if (obj.opts.mapTypeNames[i] === obj.vars.maptype) { - obj.map.setMapType(obj.opts.mapTypes[i]); - break; - } - } + obj.map.panTo(new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude)); }); // Respond to incoming width changes. _ib.width = obj.bind("widthchange", function (w) { - obj.map.getContainer().style.width = w; - obj.map.checkResize(); + obj.map.getDiv().style.width = w; + google.maps.event.trigger(obj.map); }); // Send out outgoing width changes. // N/A // Respond to incoming height changes. _ib.height = obj.bind("heightchange", function (h) { - obj.map.getContainer().style.height = h; - obj.map.checkResize(); + obj.map.getDiv().style.height = h; + google.maps.event.trigger(obj.map); }); // Send out outgoing height changes. // N/A // Respond to incoming control type changes. _ib.ctc = obj.bind("controltypechange", function () { - if (obj.currentcontrol) { - obj.map.removeControl(obj.currentcontrol); - } - if (obj.vars.controltype === 'Micro') { - obj.map.addControl(obj.currentcontrol = new GSmallZoomControl()); - } - else if (obj.vars.controltype === 'Small') { - obj.map.addControl(obj.currentcontrol = new GSmallMapControl()); + if (obj.vars.controltype === 'Small') { + obj.map.setOptions({navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL}}); } else if (obj.vars.controltype === 'Large') { - obj.map.addControl(obj.currentcontrol = new GLargeMapControl()); + obj.map.setOptions({navigationControlOptions: {style: google.maps.NavigationControlStyle.ZOOM_PAN}}); + } + else if (obj.vars.controltype === 'Android') { + obj.map.setOptions({navigationControlOptions: {style: google.maps.NavigationControlStyle.ANDROID}}); } }); // Send out outgoing control type changes. // N/A + + // Respond to incoming map type changes. + _ib.mtc = obj.bind("maptypechange", function () { + obj.map.setMapTypeId(obj.getMapTypeId(obj.vars.maptype)); + }); + // Send out outgoing map type changes. + // N/A obj.bind("bootstrap_options", function () { // Bootup options. - var opts = {}; // Object literal GMapOptions + var opts = {}; // Object literal google.maps.MapOptions obj.opts = opts; + + // Disable default UI for custom options + opts.disableDefaultUI = true; + + // Set draggable property + if (obj.vars.behavior.nodrag) { + opts.draggable = false; + } + else if (obj.vars.behavior.nokeyboard) { + opts.keyboardShortcuts = false; + } + + // Set default map type (set to road map if nothing selected) + switch (obj.vars.maptype) { + case 'Hybrid': + opts.mapTypeId = google.maps.MapTypeId.HYBRID; + break; + case 'Physical': + opts.mapTypeId = google.maps.MapTypeId.TERRAIN; + break; + case 'Satellite': + opts.mapTypeId = google.maps.MapTypeId.SATELLITE; + break; + case 'Map': + default: + opts.mapTypeId = google.maps.MapTypeId.ROADMAP; + break; + } // Null out the enabled types. - opts.mapTypes = []; - opts.mapTypeNames = []; + opts.mapTypeIds = []; // Load google map types. if (obj.vars.baselayers.Map) { - opts.mapTypes.push(G_NORMAL_MAP); - opts.mapTypeNames.push('Map'); - } - if (obj.vars.baselayers.Satellite) { - opts.mapTypes.push(G_SATELLITE_MAP); - opts.mapTypeNames.push('Satellite'); + opts.mapTypeIds.push(google.maps.MapTypeId.ROADMAP); } if (obj.vars.baselayers.Hybrid) { - opts.mapTypes.push(G_HYBRID_MAP); - opts.mapTypeNames.push('Hybrid'); + opts.mapTypeIds.push(google.maps.MapTypeId.HYBRID); } if (obj.vars.baselayers.Physical) { - opts.mapTypes.push(G_PHYSICAL_MAP); - opts.mapTypeNames.push('Physical'); + opts.mapTypeIds.push(google.maps.MapTypeId.TERRAIN); + } + if (obj.vars.baselayers.Satellite) { + opts.mapTypeIds.push(google.maps.MapTypeId.SATELLITE); } if (obj.vars.draggableCursor) { @@ -305,44 +316,64 @@ Drupal.gmap.addHandler('gmap', function (elem) { if (obj.vars.backgroundColor) { opts.backgroundColor = obj.vars.backgroundColor; } - }); - - obj.bind("boot", function () { - obj.map = new GMap2(elem, obj.opts); - }); - - obj.bind("init", function () { - var map = obj.map; // Map type control + opts.mapTypeControl = true; + opts.mapTypeControlOptions = {}; if (obj.vars.mtc === 'standard') { - map.addControl(new GMapTypeControl()); + opts.mapTypeControlOptions.style = google.maps.MapTypeControlStyle.DEFAULT; } - else if (obj.vars.mtc === 'hier') { - map.addControl(new GHierarchicalMapTypeControl()); + else if (obj.vars.mtc === 'horiz') { + opts.mapTypeControlOptions.style = google.maps.MapTypeControlStyle.HORIZONTAL_BAR; } else if (obj.vars.mtc === 'menu') { - map.addControl(new GMenuMapTypeControl()); + opts.mapTypeControlOptions.style = google.maps.MapTypeControlStyle.DROPDOWN_MENU; } - if (obj.vars.behavior.overview) { - map.addControl(new GOverviewMapControl()); + // Navigation control type + if (obj.vars.controltype !== 'None') { + opts.navigationControl = true; } - if (obj.vars.behavior.googlebar) { - map.enableGoogleBar(); + if (obj.vars.controltype === 'Small') { + opts.navigationControlOptions = {style: google.maps.NavigationControlStyle.SMALL}; } - if (obj.vars.behavior.scale) { - map.addControl(new GScaleControl()); + else if (obj.vars.controltype === 'Large') { + opts.navigationControlOptions = {style: google.maps.NavigationControlStyle.ZOOM_PAN}; } - if (obj.vars.behavior.nodrag) { - map.disableDragging(); + + // Set scale control visibility + opts.scaleControl = obj.vars.behavior.scale; + + // Scroll wheel control + if (obj.vars.behavior.nomousezoom) { + opts.scrollwheel = false; } - else if (!obj.vars.behavior.nokeyboard) { - obj._kbdhandler = new GKeyboardHandler(map); + // Disable double-click zoom + if (obj.vars.behavior.nocontzoom) { + opts.disableDoubleClickZoom = true; } + + }); + + obj.bind("boot", function () { + obj.map = new google.maps.Map(elem, obj.opts); + //console.log(obj.map); + }); + + obj.bind("init", function () { + var map = obj.map; + + // Not implemented in API v3 + // if (obj.vars.behavior.overview) { + // map.addControl(new GOverviewMapControl()); + // } + // if (obj.vars.behavior.googlebar) { + // map.enableGoogleBar(); + // } + if (obj.vars.extent) { var c = obj.vars.extent; - var extent = new GLatLngBounds(new GLatLng(c[0][0], c[0][1]), new GLatLng(c[1][0], c[1][1])); + var extent = new google.maps.LatLngBounds(new google.maps.LatLng(c[0][0], c[0][1]), new google.maps.LatLng(c[1][0], c[1][1])); obj.vars.latitude = extent.getCenter().lat(); obj.vars.longitude = extent.getCenter().lng(); obj.vars.zoom = map.getBoundsZoomLevel(extent); @@ -353,32 +384,25 @@ Drupal.gmap.addHandler('gmap', function (elem) { // hence it being a behavior. setTimeout(function () { var r = function () { - map.checkResize(); - map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom); + google.maps.event.trigger(map); + map.setCenter(new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom); }; $(elem).parents('fieldset.collapsible').children('legend').children('a').click(r); // Would be nice, but doesn't work. //$(elem).parents('fieldset.collapsible').children('.fieldset-wrapper').scroll(r); }, 0); } - map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom); - - if (!obj.vars.nocontzoom) { - map.enableDoubleClickZoom(); - map.enableContinuousZoom(); - } - if (!obj.vars.behavior.nomousezoom) { - map.enableScrollWheelZoom(); - } + map.setCenter(new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude)); + map.setZoom(obj.vars.zoom); // Send out outgoing zooms - GEvent.addListener(map, "zoomend", function (oldzoom, newzoom) { - obj.vars.zoom = newzoom; + google.maps.event.addListener(map, "zoom_changed", function () { + obj.vars.zoom = map.getZoom(); obj.change("zoom", _ib.zoom); }); // Send out outgoing moves - GEvent.addListener(map, "moveend", function () { + google.maps.event.addListener(map, "center_changed", function () { var coord = map.getCenter(); obj.vars.latitude = coord.lat(); obj.vars.longitude = coord.lng(); @@ -386,20 +410,26 @@ Drupal.gmap.addHandler('gmap', function (elem) { }); // Send out outgoing map type changes. - GEvent.addListener(map, "maptypechanged", function () { + google.maps.event.addListener(map, "maptypeid_changed", function () { // If the map isn't ready yet, ignore it. if (obj.ready) { - var type = map.getCurrentMapType(); - var i; - for (i = 0; i < obj.opts.mapTypes.length; i++) { - if (obj.opts.mapTypes[i] === type) { - obj.vars.maptype = obj.opts.mapTypeNames[i]; - } - } + obj.vars.maptype = obj.getMapTypeName(map.getMapTypeId()); obj.change("maptypechange", _ib.mtc); } }); + /* + google.maps.event.addListener(map, 'click', function(event) { + alert(Drupal.gmap.getIcon("big blue", 0)); + var marker = new google.maps.Marker({ + position: event.latLng, + map: map + }); + google.maps.event.addListener(marker, 'click', function() { + marker.setMap(null); + }); + }); + */ }); }); @@ -423,32 +453,32 @@ Drupal.gmap.addHandler('zoom', function (elem) { // Latitude widget // //////////////////////////////////////// Drupal.gmap.addHandler('latitude', function (elem) { - var obj = this; - // Respond to incoming movements. - var binding = obj.bind("move", function () { - elem.value = '' + obj.vars.latitude; - }); - // Send out outgoing movements. - $(elem).change(function () { - obj.vars.latitude = Number(this.value); - obj.change("move", binding); - }); +// var obj = this; +// // Respond to incoming movements. +// var binding = obj.bind("move", function () { +// elem.value = '' + obj.vars.latitude; +// }); +// // Send out outgoing movements. +// $(elem).change(function () { +// obj.vars.latitude = Number(this.value); +// obj.change("move", binding); +// }); }); //////////////////////////////////////// // Longitude widget // //////////////////////////////////////// Drupal.gmap.addHandler('longitude', function (elem) { - var obj = this; - // Respond to incoming movements. - var binding = obj.bind("move", function () { - elem.value = '' + obj.vars.longitude; - }); - // Send out outgoing movements. - $(elem).change(function () { - obj.vars.longitude = Number(this.value); - obj.change("move", binding); - }); +// var obj = this; +// // Respond to incoming movements. +// var binding = obj.bind("move", function () { +// elem.value = '' + obj.vars.longitude; +// }); +// // Send out outgoing movements. +// $(elem).change(function () { +// obj.vars.longitude = Number(this.value); +// obj.change("move", binding); +// }); }); //////////////////////////////////////// @@ -470,27 +500,6 @@ Drupal.gmap.addHandler('latlon', function (elem) { }); //////////////////////////////////////// -// Extent widget // -//////////////////////////////////////// -Drupal.gmap.addHandler('extent', function (elem) { - var obj = this; - // Respond to incoming extent changes. - var binding = obj.bind("move", function () { - var b = obj.map.getBounds(); - elem.value = '' + b.getSouthWest().lng() + ',' + b.getSouthWest().lat() + ',' + b.getNorthEast().lng() + ',' + b.getNorthEast().lat(); - }); - // Send out outgoing extent changes. - jQuery(elem).change(function () { - var t = this.value.split(','); - var b = new GLatLngBounds(new GLatLng(Number(t[1]), Number(t[0])), new GLatLng(Number(t[3]), Number(t[2]))); - obj.vars.latitude = b.getCenter().lat(); - obj.vars.longitude = b.getCenter().lng(); - obj.vars.zoom = obj.map.getBoundsZoomLevel(b); - obj.map.setCenter(new GLatLng(obj.vars.latitude, obj.vars.longitude), obj.vars.zoom); - }); -}); - -//////////////////////////////////////// // Maptype widget // //////////////////////////////////////// Drupal.gmap.addHandler('maptype', function (elem) { @@ -515,6 +524,7 @@ Drupal.gmap.addHandler('maptype', function (elem) { } return null; }; + //////////////////////////////////////// // Width widget // //////////////////////////////////////// @@ -558,7 +568,6 @@ Drupal.gmap.addHandler('maptype', function (elem) { $(elem).change(); }); }); - })(); // END CLOSURE //////////////////////////////////////// @@ -577,11 +586,6 @@ Drupal.gmap.addHandler('controltype', function (elem) { }); }); -// Map cleanup. -if (Drupal.jsEnabled) { - $(document).unload(GUnload); -} - Drupal.behaviors.GMap = function (context) { if (Drupal.settings && Drupal.settings['gmap_remap_widgets']) { jQuery.each(Drupal.settings['gmap_remap_widgets'], function(key, val) { diff --git a/js/gmap_marker.js b/js/gmap_marker.js index ebed9a6..9cf5d30 100755 --- a/js/gmap_marker.js +++ b/js/gmap_marker.js @@ -8,23 +8,29 @@ /*global Drupal, GMarker */ // Replace to override marker creation -Drupal.gmap.factory.marker = function (loc, opts) { - return new GMarker(loc, opts); +Drupal.gmap.factory.marker = function (opts) { + return new google.maps.Marker(opts); }; Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; obj.bind('addmarker', function (marker) { - obj.map.addOverlay(marker.marker); + if ( !obj.map.markers ) obj.map.markers = new Array(); + marker.marker.setMap(obj.map); + obj.map.markers.push( marker.marker ); }); obj.bind('delmarker', function (marker) { - obj.map.removeOverlay(marker.marker); + marker.marker.setMap(null); }); obj.bind('clearmarkers', function () { // @@@ Maybe don't nuke ALL overlays? - obj.map.clearOverlays(); + if ( obj.map.markers ) { + for(var i=0; i < obj.map.markers.length; i++){ + obj.map.markers[i].setMap(null); + } + } }); }); diff --git a/js/icon.js b/js/icon.js index 8ed808b..92d8aed 100644 --- a/js/icon.js +++ b/js/icon.js @@ -1,4 +1,3 @@ - /** * @file * GIcon manager for GMap. @@ -17,11 +16,14 @@ Drupal.gmap.getIcon = function (setname, sequence) { var othimg = ['printImage', 'mozPrintImage', 'printShadow', 'transparent']; // If no setname, return google's default icon. if (!setname) { - return G_DEFAULT_ICON; + return; } if (!this.gicons) { this.gicons = {}; } + if (!this.gshadows) { + this.gshadows = {}; + } // If no sequence, synthesise one. if (!sequence) { @@ -41,9 +43,11 @@ Drupal.gmap.getIcon = function (setname, sequence) { alert('Request for invalid marker set ' + setname + '!'); } this.gicons[setname] = []; + this.gshadows[setname] = []; var q = Drupal.gmap.icons[setname]; var p, t; for (var i = 0; i < q.sequence.length; i++) { + /* t = new GIcon(); p = Drupal.gmap.iconpath + q.path; t.image = p + q.sequence[i].f; @@ -54,6 +58,24 @@ Drupal.gmap.getIcon = function (setname, sequence) { t.iconSize = new GSize(q.sequence[i].w, q.sequence[i].h); t.iconAnchor = new GPoint(q.anchorX, q.anchorY); t.infoWindowAnchor = new GPoint(q.infoX, q.infoY); + */ + p = Drupal.gmap.iconpath + q.path; + t = new google.maps.MarkerImage(p + q.sequence[i].f, + new google.maps.Size(q.sequence[i].w, q.sequence[i].h), + null, + new google.maps.Point(q.anchorX, q.anchorY) + ); + if (q.shadow.f !== '') { + this.gshadows[setname][i] = new google.maps.MarkerImage(p + q.shadow.f, + new google.maps.Size(q.shadow.w, q.shadow.h), + null, + new google.maps.Point(q.anchorX, q.anchorY) + ); + } + else { + this.gshadows[setname][i] = null; + } + for (var j = 0; j < othimg.length; j++) { if (q[othimg[j]] !== '') { t[othimg[j]] = p + q[othimg[j]]; @@ -68,6 +90,10 @@ Drupal.gmap.getIcon = function (setname, sequence) { return this.gicons[setname][sequence % this.gicons[setname].length]; }; +Drupal.gmap.getShadow = function (setname, sequence) { + if (this.gshadows) return this.gshadows[setname][sequence % this.gicons[setname].length]; +}; + /** * JSON callback to set up the icon defs. * When doing the JSON call, the data comes back in a packed format. @@ -202,6 +228,7 @@ Drupal.gmap.addHandler('gmap', function (elem) { // Provide icons to markers. obj.bind('preparemarker', function (marker) { marker.opts.icon = Drupal.gmap.getIcon(marker.markername, marker.offset); + marker.opts.shadow = Drupal.gmap.getShadow(marker.markername, marker.offset); }); } }); diff --git a/js/locpick.js b/js/locpick.js index 8e9dd4b..c68b384 100644 --- a/js/locpick.js +++ b/js/locpick.js @@ -10,13 +10,13 @@ Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; var binding = obj.bind("locpickchange", function () { - if (obj.locpick_coord) { - GEvent.trigger(obj.map, "click", null, obj.locpick_coord); + if (obj.locpick_point && obj.locpick_coord) { + obj.locpick_point.setPosition(obj.locpick_coord); } }); obj.bind("locpickremove", function () { - obj.map.removeOverlay(obj.locpick_point); + if (obj.locpick_point) obj.locpick_point.setMap(null); obj.locpick_point = null; obj.locpick_coord = null; obj.change('locpickchange', -1); @@ -24,25 +24,31 @@ Drupal.gmap.addHandler('gmap', function (elem) { obj.bind("init", function () { if (obj.vars.behavior.locpick) { - obj.locpick_coord = new GLatLng(obj.vars.latitude, obj.vars.longitude); + obj.locpick_coord = new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude); - GEvent.addListener(obj.map, "click", function (overlay, point) { - obj.map.checkResize(); - if (!overlay) { + google.maps.event.addListener(obj.map, "click", function (event) { + google.maps.event.trigger(obj.map, "resize"); + if (event) { if (!obj.locpick_point) { - obj.map.addOverlay(obj.locpick_point = new GMarker(point, {draggable: true})); + obj.locpick_point = new google.maps.Marker({ + position: event.latLng, + map: obj.map, + draggable: true + }); + } + else { + obj.locpick_point.setPosition(event.latLng); } - obj.locpick_point.setLatLng(point); - GEvent.addListener(obj.locpick_point, 'drag', function () { - obj.locpick_coord = obj.locpick_point.getLatLng(); + google.maps.event.addListener(obj.locpick_point, 'drag', function () { + obj.locpick_coord = new google.maps.LatLng(obj.locpick_point.position.lat(), obj.locpick_point.position.lng()); obj.change('locpickchange', binding); }); - GEvent.addListener(obj.locpick_point, 'dragend', function () { - obj.locpick_coord = obj.locpick_point.getLatLng(); + google.maps.event.addListener(obj.locpick_point, 'dragend', function () { + obj.locpick_coord = new google.maps.LatLng(obj.locpick_point.position.lat(), obj.locpick_point.position.lng()); obj.change('locpickchange', binding); }); - obj.locpick_coord = point; - obj.map.panTo(point); + obj.locpick_coord = event.latLng; + obj.map.panTo(event.latLng); obj.change('locpickchange', binding); } else { @@ -70,7 +76,7 @@ Drupal.gmap.addHandler('locpick_latitude', function (elem) { obj.bind("init", function () { if (elem.value !== '') { obj.vars.latitude = Number(elem.value); - obj.locpick_coord = new GLatLng(obj.vars.latitude, obj.vars.longitude); + obj.locpick_coord = new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude); } else { obj.locpick_coord = null; @@ -90,11 +96,11 @@ Drupal.gmap.addHandler('locpick_latitude', function (elem) { $(elem).change(function () { if (elem.value !== '') { if (obj.locpick_coord) { - obj.locpick_coord = new GLatLng(Number(elem.value), obj.locpick_coord.lng()); + obj.locpick_coord = new google.maps.LatLng(Number(elem.value), obj.locpick_coord.lng()); obj.change('locpickchange', binding); } else { - obj.locpick_coord = new GLatLng(Number(elem.value), 0.0); + obj.locpick_coord = new google.maps.LatLng(Number(elem.value), 0.0); } } else { @@ -109,7 +115,7 @@ Drupal.gmap.addHandler('locpick_longitude', function (elem) { obj.bind("init", function () { if (elem.value !== '') { obj.vars.longitude = Number(elem.value); - obj.locpick_coord = new GLatLng(obj.vars.latitude, obj.vars.longitude); + obj.locpick_coord = new google.maps.LatLng(obj.vars.latitude, obj.vars.longitude); } else { obj.locpick_invalid = true; @@ -128,11 +134,11 @@ Drupal.gmap.addHandler('locpick_longitude', function (elem) { $(elem).change(function () { if (elem.value !== '') { if (obj.locpick_coord) { - obj.locpick_coord = new GLatLng(obj.locpick_coord.lat(), Number(elem.value)); + obj.locpick_coord = new google.maps.LatLng(obj.locpick_coord.lat(), Number(elem.value)); obj.change('locpickchange', binding); } else { - obj.locpick_coord = new GLatLng(0.0, Number(elem.value)); + obj.locpick_coord = new google.maps.LatLng(0.0, Number(elem.value)); } } else { diff --git a/js/marker.js b/js/marker.js index d4aa100..a09bccd 100644 --- a/js/marker.js +++ b/js/marker.js @@ -8,36 +8,40 @@ Drupal.gmap.addHandler('gmap', function (elem) { var obj = this; + + var infowindow = null; obj.bind('init', function () { if (obj.vars.behavior.autozoom) { - obj.bounds = new GLatLngBounds(); + obj.bounds = new google.maps.LatLngBounds(); } }); obj.bind('addmarker', function (marker) { - var m = Drupal.gmap.factory.marker(new GLatLng(marker.latitude, marker.longitude), marker.opts); + marker.opts.position = new google.maps.LatLng(marker.latitude, marker.longitude); + marker.opts.map = obj.map; + var m = Drupal.gmap.factory.marker(marker.opts); marker.marker = m; - GEvent.addListener(m, 'click', function () { + google.maps.event.addListener(m, 'click', function () { obj.change('clickmarker', -1, marker); }); if (obj.vars.behavior.highlight) { - GEvent.addListener(m, 'mouseover', function () { + google.maps.event.addListener(m, 'mouseover', function () { var highlightColor = '#' + obj.vars.styles.highlight_color; highlightMarker(obj.map, marker, 'hoverHighlight', highlightColor); }); - GEvent.addListener(m, 'mouseout', function () { + google.maps.event.addListener(m, 'mouseout', function () { unHighlightMarker(obj.map, marker, 'hoverHighlight'); }); } if (obj.vars.behavior.extramarkerevents) { - GEvent.addListener(m, 'mouseover', function () { + google.maps.event.addListener(m, 'mouseover', function () { obj.change('mouseovermarker', -1, marker); }); - GEvent.addListener(m, 'mouseout', function () { + google.maps.event.addListener(m, 'mouseout', function () { obj.change('mouseoutmarker', -1, marker); }); - GEvent.addListener(m, 'dblclick', function () { + google.maps.event.addListener(m, 'dblclick', function () { obj.change('dblclickmarker', -1, marker); }); } @@ -48,7 +52,7 @@ Drupal.gmap.addHandler('gmap', function (elem) { obj.deferChange('clickmarker', -1, marker); } if (obj.vars.behavior.autozoom) { - obj.bounds.extend(marker.marker.getPoint()); + obj.bounds.extend(new google.maps.LatLng(marker.latitude, marker.longitude)); } // If the highlight arg option is used in views highlight the marker. if (marker.opts.highlight == 1) { @@ -58,12 +62,17 @@ Drupal.gmap.addHandler('gmap', function (elem) { // Default marker actions. obj.bind('clickmarker', function (marker) { - // Local/stored content + // Close infowindow if open to prevent multiple windows + if (infowindow != null){ + infowindow.close(); + } + infowindow = new google.maps.InfoWindow(); if (marker.text) { - marker.marker.openInfoWindowHtml(marker.text); + infowindow.setContent(marker.text); + infowindow.open(obj.map, marker.marker); } // Info Window Query / Info Window Offset - if (marker.iwq || (obj.vars.iwq && typeof marker.iwo != 'undefined')) { + else if (marker.iwq || (obj.vars.iwq && typeof marker.iwo != 'undefined')) { var iwq, iwo; if (obj.vars.iwq) { iwq = obj.vars.iwq; @@ -79,15 +88,17 @@ Drupal.gmap.addHandler('gmap', function (elem) { var el = document.createElement('div'); // Clone the matched object, run through the clone, stripping off ids, and move the clone into the container. jQuery(iwq).eq(iwo).clone(false).find('*').removeAttr('id').appendTo(jQuery(el)); - marker.marker.openInfoWindow(el); + marker.setContent(el); + infowindow.open(obj.map, marker.marker); } // AJAX content - if (marker.rmt) { + else if (marker.rmt) { obj.rmtcache = obj.rmtcache || {}; // Cached RMT. if (obj.rmtcache[marker.rmt]) { - marker.marker.openInfoWindowHtml(obj.rmtcache[marker.rmt]); + infowindow.setContent(data); + infowindow.open(obj.map, marker.marker); } else { var uri = marker.rmt; @@ -111,13 +122,13 @@ Drupal.gmap.addHandler('gmap', function (elem) { } // Tabbed content else if (marker.tabs) { - var infoWinTabs = []; + var data = ""; + //tabs in an infowindow is no longer supported in API ver3. for (var m in marker.tabs) { - if (marker.tabs.hasOwnProperty(m)) { - infoWinTabs.push(new GInfoWindowTab(m, marker.tabs[m])); - } + data += marker.tabs[m]; } - marker.marker.openInfoWindowTabsHtml(infoWinTabs); + infowindow.setContent(data); + infowindow.open(obj.map, marker.marker); } // No content -- marker is a link else if (marker.link) { @@ -129,7 +140,14 @@ Drupal.gmap.addHandler('gmap', function (elem) { // If we are autozooming, set the map center at this time. if (obj.vars.behavior.autozoom) { if (!obj.bounds.isEmpty()) { - obj.map.setCenter(obj.bounds.getCenter(), Math.min(obj.map.getBoundsZoomLevel(obj.bounds), obj.vars.maxzoom)); + obj.map.fitBounds(obj.bounds); + var listener = google.maps.event.addListener(obj.map, "idle", function() { + if (obj.vars.maxzoom) { + var maxzoom = parseInt(obj.vars.maxzoom) + if (obj.map.getZoom() > maxzoom) obj.map.setZoom(maxzoom); + google.maps.event.removeListener(listener); + } + }); } } }); @@ -138,7 +156,7 @@ Drupal.gmap.addHandler('gmap', function (elem) { // Reset bounds if autozooming // @@@ Perhaps we should have a bounds for both markers and shapes? if (obj.vars.behavior.autozoom) { - obj.bounds = new GLatLngBounds(); + obj.bounds = new google.maps.LatLngBounds(); } }); diff --git a/js/overlay_edit.js b/js/overlay_edit.js index c054bd7..fc1083a 100755 --- a/js/overlay_edit.js +++ b/js/overlay_edit.js @@ -127,7 +127,7 @@ Drupal.gmap.addHandler('gmap', function (elem) { if (!markers[n.marker]) { markers[n.marker] = []; } - var pt = n.overlay.getLatLng(); + var pt = n.overlay.getPosition(); var ptxt = ''; if (n.html) { ptxt = ':' + n.html; @@ -157,7 +157,7 @@ Drupal.gmap.map.prototype.status = function (text) { }; // Extend markers to store type info. -GMarker.prototype.gmapMarkerData = function (data) { +google.maps.Marker.prototype.gmapMarkerData = function (data) { if (data) { this._gmapdata = data; } @@ -189,9 +189,10 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { obj._oe.featuresRef = {}; obj._oe.editing = false; obj._oe.markerseq = {}; - GEvent.addListener(obj.map, 'click', function (overlay, point) { + google.maps.event.addListener(obj.map, 'click', function (event) { var ctx, s, p; - if (overlay) { + var point = event.latLng; + if (0 && overlay) { if (obj._oe.editing) { // Work around problem where double clicking to finish a poly fires a click event. obj._oe.editing = false; @@ -208,8 +209,11 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { obj._oe.markerseq[m] = -1; } obj._oe.markerseq[m] = obj._oe.markerseq[m] + 1; - p = new GMarker(point, {icon: Drupal.gmap.getIcon(m, obj._oe.markerseq[m])}); - obj.map.addOverlay(p); + var p = new google.maps.Marker({ + position: point, + map: obj.map, + icon: Drupal.gmap.getIcon(m, obj._oe.markerseq[m]).ra + }); ctx = { 'type' : 'point', 'marker' : m, @@ -217,19 +221,19 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { }; var offset = obj._oe.features.push(ctx) - 1; obj._oe.editing = false; - GEvent.addListener(p, "click", function () { + google.maps.event.addListener(p, "click", function () { switch (obj.vars.overlay_del_mode) { case 'Remove': obj._oe.markerseq[m] = obj._oe.markerseq[m] - 1; ctx.type = 'deleted'; - obj.map.removeOverlay(p); + p.setMap(null); ctx.overlay = null; var tmpcnt = 0; // Renumber markers in set. $.each(obj._oe.features, function (i, n) { if (n.type && n.type === 'point' && n.marker === m) { var pt = n.overlay.getLatLng(); - n.overlay.setImage(Drupal.gmap.getIcon(n.marker, tmpcnt).image); + n.overlay.setImage(Drupal.gmap.getIcon(n.marker, tmpcnt).ra); tmpcnt = tmpcnt + 1; } }); @@ -254,20 +258,23 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { ctx.style = obj.vars.styles.overlayline.slice(); s = ctx.style; } - p = new GPolyline([point], '#' + s[0], Number(s[1]), s[2] / 100); - obj.map.addOverlay(p); + + var coord = [ new google.maps.LatLng(point) ]; + var p = new google.maps.Polyline({path:coord, strokeColor:"#"+s[0], strokeOpacity:s[2]/100, strokeWeight:Number(s[1])}); + p.setMap(obj.map); + ctx.overlay = p; obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1; - p.enableDrawing(); - p.enableEditing({onEvent: "mouseover"}); - p.disableEditing({onEvent: "mouseout"}); - GEvent.addListener(p, "endline", function () { + p.runEdit( true ); + google.maps.event.addListener( p, "mouseover", function(){p.runEdit( true );} ); + google.maps.event.addListener( p, "mouseout", function(){p.stopEdit();} ); + google.maps.event.addListener(p, "endline", function () { //obj._oe.editing = false; - GEvent.addListener(p, "lineupdated", function () { + google.maps.event.addListener(p, "lineupdated", function () { obj.change('mapedited', -1); }); - GEvent.addListener(p, "click", function (latlng, index) { + google.maps.event.addListener(p, "click", function (latlng, index) { if (typeof index === "number") { // Delete vertex on click. p.deleteVertex(index); @@ -298,15 +305,14 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { ctx.overlay = p; obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1; - p.enableDrawing(); - p.enableEditing({onEvent: "mouseover"}); - p.disableEditing({onEvent: "mouseout"}); - GEvent.addListener(p, "endline", function () { + google.maps.event.addListener( p, "mouseover", function(){p.runEdit( true );} ); + google.maps.event.addListener( p, "mouseout", function(){p.stopEdit();} ); + google.maps.event.addListener(p, "endline", function () { //obj._oe.editing = false; - GEvent.addListener(p, "lineupdated", function () { + google.maps.event.addListener(p, "lineupdated", function () { obj.change('mapedited', -1); }); - GEvent.addListener(p, "click", function (latlng, index) { + google.maps.event.addListener(p, "click", function (latlng, index) { if (typeof index === "number") { p.deleteVertex(index); } @@ -327,7 +333,7 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { // @@@ Translate obj.status("Drawing circle. Click a point on the rim to place."); - var handle = GEvent.addListener(obj.map, 'click', function (overlay, point) { + var handle = google.maps.event.addListener(obj.map, 'click', function (overlay, point) { if (point) { var ctx = { 'type' : 'circle', @@ -347,7 +353,7 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { obj.map.addOverlay(p); ctx.overlay = p; obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1; - GEvent.addListener(p, "click", function () { + google.maps.event.addListener(p, "click", function () { switch (obj.vars.overlay_del_mode) { case 'Remove': ctx.type = 'deleted'; @@ -365,7 +371,7 @@ Drupal.gmap.addHandler('overlayedit', function (elem) { // @@@ Uh, do cleanup I suppose.. } obj._oe.editing = false; - GEvent.removeListener(handle); + google.maps.event.removeListener(handle); obj.change('mapedited', -1); }); break;