PageSourceSearch

https://theartssociety.org/sites/all/modules/custom/ip_geoloc/js/ip_geoloc_gmap_multi_loc.js?tlvm4t

js theartssociety.org collected 2026-09-24 20:55:42 UTC 9,258 bytes, 218 lines download raw bytes

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.