1(function ($) { 2 3 Drupal.behaviors.addGMapMultiLocation = { 4 attach: function (context, settings) { 5 6 if (typeof(google) !== 'object') { 7 // When not connected to Internet. 8 return; 9 } 10 // Create map as a global, see [#1954876]. 11 // As we can have multiple maps on the same page, maps is an array. 12 maps = []; 13 mapBounds = []; 14 var imageExt = '.png'; 15 var infoWindow = new google.maps.InfoWindow(); 16 17 $(settings, context).each(function() { 18 19 for (var m in settings) { 20 21 if (isNaN(m)) { 22 continue; 23 } 24 var divId = settings[m].ip_geoloc_multi_location_map_div; 25 var mapDiv = document.getElementById(divId); 26 if (!mapDiv) { 27 continue; 28 } 29 var mapOptions = settings[m].ip_geoloc_multi_location_map_options; 30 if (!mapOptions) { 31 alert(Drupal.t('IPGV&M: syntax error in Google map options.')); 32 } 33 maps[m] = new google.maps.Map(mapDiv, mapOptions); 34 // A map must have a type, a zoom and a center or nothing will show. 35 if (!maps[m].getMapTypeId()) { 36 maps[m].setMapTypeId(google.maps.MapTypeId.ROADMAP); 37 } 38 if (!maps[m].getZoom()) { 39 maps[m].setZoom(1); 40 } 41 // Check for the special non-Google fixed-center option we provide. 42 if (mapOptions.centerLat && mapOptions.centerLng) { 43 maps[m].setCenter(new google.maps.LatLng(mapOptions.centerLat, mapOptions.centerLng)); 44 } 45 var locations = ip_geoloc_locations[divId]; 46 var visitorMarker = settings[m].ip_geoloc_multi_location_visitor_marker; 47 var centerOption = settings[m].ip_geoloc_multi_location_center_option; 48 var use_gps = settings[m].ip_geoloc_multi_location_visitor_location_gps; 49 var markerDirname = settings[m].ip_geoloc_multi_location_marker_directory; 50 var markerWidth = settings[m].ip_geoloc_multi_location_marker_width; 51 var markerHeight = settings[m].ip_geoloc_multi_location_marker_height; 52 var markerAnchor = settings[m].ip_geoloc_multi_location_marker_anchor; 53 var markerColor = settings[m].ip_geoloc_multi_location_marker_default_color; 54 55 var defaultPinImage = !markerColor ? null : new google.maps.MarkerImage( 56 markerDirname + '/' + markerColor + imageExt, 57 new google.maps.Size(markerWidth, markerHeight), 58 // Origin 59 new google.maps.Point(0, 0), 60 // Anchor 61 new google.maps.Point((markerWidth / 2), markerAnchor), 62 // scaledSize 63 new google.maps.Size(markerWidth, markerHeight)); 64 65 var center = null; 66 mapBounds[m] = new google.maps.LatLngBounds(); 67 for (var key in locations) { 68 var br = locations[key].balloon_text.indexOf('<br/>'); 69 var mouseOverText = (br > 0) ? locations[key].balloon_text.substring(0, br) : locations[key].balloon_text.trim(); 70 // Strip out HTML tags. 71 try { 72 // Add <span> to make sure there are tags. 73 mouseOverText = jQuery('<span>' + mouseOverText + '</span>').text(); 74 } 75 catch(err) { } 76 if (mouseOverText.length === 0) { 77 mouseOverText = Drupal.t('Location #@i', { '@i': parseInt(key) + 1}); 78 } 79 80 var position = new google.maps.LatLng(locations[key].latitude, locations[key].longitude); 81 mapBounds[m].extend(position); 82 if (!center && centerOption === 1 /* center on 1st location */) { 83 maps[m].setCenter(position); 84 center = position; 85 } 86 var pinImage = defaultPinImage; 87 if (locations[key].marker_color) { 88 pinImage = new google.maps.MarkerImage( 89 markerDirname + '/' + locations[key].marker_color + imageExt, 90 new google.maps.Size(markerWidth, markerHeight), 91 // Origin 92 new google.maps.Point(0, 0), 93 // Anchor 94 new google.maps.Point((markerWidth / 2), markerAnchor), 95 // scaledSize 96 new google.maps.Size(markerWidth, markerHeight)); 97 } 98 var marker = new google.maps.Marker({ 99 map: maps[m], icon: pinImage, /*shadow: shadowImage,*/ 100 position: position, title: mouseOverText, optimized: false 101 }); 102 103 var balloonText = '<div class="balloon">' + locations[key].balloon_text + '</div>'; 104 addMarkerBalloon(maps[m], marker, balloonText); 105 106 if (locations[key].open) { 107 infoWindow = new google.maps.InfoWindow({content: balloonText, maxWidth: 200}); 108 infoWindow.open(maps[m], marker); 109 } 110 } 111 if (centerOption === 3 && locations.length > 0) { 112 // Auto-box: ensure that all markers are visible on the initial map. 113 maps[m].fitBounds(mapBounds[m]); 114 //maps[m].panToBounds(mapBounds[m]); 115 } 116 117 if (visitorMarker || centerOption === 2 /* center on visitor */ || centerOption === 6 /* auto-box incl. visitor*/) { 118 // Retrieve visitor's location, fall back on supplied location, if not found. 119 if (use_gps && navigator.geolocation) { 120 navigator.geolocation.getCurrentPosition(handleMapCe
120nterAndVisitorMarker1, handlePositionError, {enableHighAccuracy: true}); 121 } 122 else { 123 // No HTML5 retrieval: use supplied visitor lat/lng. 124 var latLng = settings[m].ip_geoloc_multi_location_center_latlng; 125 if (latLng) { 126 handleMapCenterAndVisitorMarker2(latLng[0], latLng[1]); 127 } 128 } 129 } 130 } 131 }); 132 133 function handleMapCenterAndVisitorMarker1(visitorPosition) { 134 handleMapCenterAndVisitorMarker2(visitorPosition.coords.latitude, visitorPosition.coords.longitude); 135 } 136 137 // Center all maps and add the special visitor marker on all maps too. 138 function handleMapCenterAndVisitorMarker2(latitude, longitude) { 139 var visitorPosition = new google.maps.LatLng(latitude, longitude); 140 for (var m in maps) { 141 if (isNaN(m)) continue; 142 if (settings[m].ip_geoloc_multi_location_visitor_marker) { 143 var p = '(' + latitude + ', ' + longitude + ')'; 144 showSpecialMarker(m, visitorPosition, Drupal.t('Your approximate location') + "\n" + p); 145 } 146 if (settings[m].ip_geoloc_multi_location_center_option === 2) { 147 maps[m].setCenter(visitorPosition); 148 } 149 else if (settings[m].ip_geoloc_multi_location_center_option === 6) { 150 // Autobox including visitor location. 151 mapBounds[m].extend(visitorPosition); 152 maps[m].fitBounds(mapBounds[m]); 153 } 154 } 155 } 156 157 function addMarkerBalloon(map, marker, infoText) { 158 google.maps.event.addListener(marker, 'click', function(event) { 159 if (infoWindow) { 160 infoWindow.close(); 161 } 162 infoWindow.setOptions({ 163 content: infoText, 164 // See [#1777664]. 165 maxWidth: 200 166 }); 167 infoWindow.open(map, marker); 168 }); 169 } 170 171 function showSpecialMarker(m, position, mouseOverText) { 172 var specialMarker; 173 var visitorMarker = settings[m].ip_geoloc_multi_location_visitor_marker; 174 if (visitorMarker === true) { 175 specialMarker = new google.maps.Marker({ map: maps[m], position: position, title: mouseOverText }); 176 } 177 else { 178 // Interpret value of visitorMarker as the marker RGB color, for 179 // instance "00FF00" is bright green. 180 var pinColor = visitorMarker; 181 // Use a standard character like "x", or for a dot use "%E2%80%A2". 182 var pinChar = "%E2%80%A2"; 183 // Black. 184 var textColor = "000000"; 185 // Note: cannot use https: here... 186 var pinImage = new google.maps.MarkerImage("//chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + pinCh
186ar + "|" + pinColor + "|" + textColor, 187 new google.maps.Size(21, 34), new google.maps.Point(0, 0), new google.maps.Point(10, 34)); 188 specialMarker = new google.maps.Marker({ 189 map: maps[m], 190 position: position, 191 zIndex: 9999, 192 title: mouseOverText, 193 icon: pinImage 194 //shadow: shadowImage 195 }); 196 } 197 addMarkerBalloon(maps[m], specialMarker, mouseOverText); 198 } 199 200 // Fall back on IP address lookup, for instance when user declined to share location. 201 function handlePositionError(error) { 202 var latLng = settings[0].ip_geoloc_multi_location_center_latlng; 203 if (latLng) { 204 handleMapCenterAndVisitorMarker2(latLng[0], latLng[1]); 205 } 206 else { 207 for (var m in maps) { 208 // If centering involving the visitor location was requested, but we 209 // don't have one, then auto-box the remaining markers. 210 if (settings[m].ip_geoloc_multi_location_center_option === 2 || settings[m].ip_geoloc_multi_location_center_option === 6) { 211 maps[m].fitBounds(mapBounds[m]); 212 } 213 } 214 } 215 } 216 } 217 }; 218})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.