ip_geoloc-2.0.0-alpha0/js/ip_geoloc_gmap_multi_loc.js

js/ip_geoloc_gmap_multi_loc.js
(function ($, Drupal) {

  Drupal.behaviors.addGMapMultiLocation = {
    attach: function (context, settings) {

      var locations     = settings.ip_geoloc_locations;
      var mapOptions    = settings.ip_geoloc_multi_location_map_options;
      var centerOption  = settings.ip_geoloc_multi_location_center_option;
      var visitorMarker = settings.ip_geoloc_multi_location_visitor_marker;
      var use_gps       = settings.ip_geoloc_multi_location_visitor_location_gps;
      var markerDirname = settings.ip_geoloc_multi_location_marker_directory;
      var markerWidth   = settings.ip_geoloc_multi_location_marker_width;
      var markerHeight  = settings.ip_geoloc_multi_location_marker_height;
      var markerAnchor  = settings.ip_geoloc_multi_location_marker_anchor;
      var markerColor   = settings.ip_geoloc_multi_location_marker_default_color;
      var imageExt      = '.png';

      if (!mapOptions) {
        alert(Drupal.t('Syntax error in map options.'));
      }
      if (typeof(google) != 'object') {
        // When not connected to Internet.
        return;
      }
      var mapDiv = document.getElementById(settings.ip_geoloc_multi_location_map_div);
      // Create map as a global, see [#1954876]
      map = new google.maps.Map(mapDiv, mapOptions);

      // A map must have a type, a zoom and a center or nothing will show.
      if (!map.getMapTypeId()) {
        map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
      }
      if (!map.getZoom()) {
        map.setZoom(1);
      }

      if (centerOption != 1 || locations.length == 0) {
        // If no center override option was specified or as a fallback where
        // the user declines to share their location, we set the center based
        // on the mapOptions. Without a center there won't be a map!
        map.setCenter(new google.maps.LatLng(
          mapOptions.centerLat ? mapOptions.centerLat : 0,
          mapOptions.centerLng ? mapOptions.centerLng : 0));
      }

      if (visitorMarker || centerOption == 2) {
        // Retrieve visitor's location, fall back on supplied location, if not found.
        if (use_gps) {
          // Center the map on the user's current location
          if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(handleMapCenterAndVisitorMarker1, handlePositionError, {enableHighAccuracy: true});
          }
          else if (typeof(geo_position_js) == 'object' && geo_position_js.init()) {
            // Use the unified API.
            geo_position_js.getCurrentPosition(handleMapCenterAndVisitorMarker1, handlePositionError, {enableHighAccuracy: true});
          }
        }
        else {
          // Use supplied visitor lat/lng to center and set marker.
          var latLng = settings.ip_geoloc_multi_location_center_latlng;
          if (latLng) {
            handleMapCenterAndVisitorMarker2(latLng[0], latLng[1]);
          }
        }
      }

      var defaultPinImage = !markerColor || markerColor == '<none>'? null : new google.maps.MarkerImage(
        markerDirname + '/' + markerColor + imageExt,
        new google.maps.Size(markerWidth, markerHeight),
        // Origin.
        new google.maps.Point(0, 0),
        // Anchor.
        new google.maps.Point((markerWidth / 2), markerAnchor));
      var shadowImage = null;

      var i = 1;
      var balloonTexts = [];
      var center = null;
      for (var key in locations) {
        var mouseOverText = Drupal.t('Location #@i', { '@i': i++ });
        var position = new google.maps.LatLng(locations[key].latitude, locations[key].longitude);
        if (!center && centerOption == 1) {
          // If requested center map on the first location, if any.
          map.setCenter(position);
          center = position;
        }
        var pinImage = defaultPinImage;
        if (locations[key].marker_color) {
          pinImage = new google.maps.MarkerImage(
            markerDirname + '/' + locations[key].marker_color + imageExt,
            new google.maps.Size(markerWidth, markerHeight),
            // Origin.
            new google.maps.Point(0, 0),
            // Anchor.
            new google.maps.Point((markerWidth / 2), markerAnchor));
        }
        marker = new google.maps.Marker({ map: map, icon: pinImage, shadow: shadowImage, position: position, title: mouseOverText });

        // Funny index is because listener callback only gives us position.
        balloonTexts['LL' + position] = '<div class="balloon">' + locations[key].balloon_text + '</div>';
        google.maps.event.addListener(marker, 'click', function(event) {
          new google.maps.InfoWindow({
            content: balloonTexts['LL' + event.latLng],
            position: event.latLng,
            // See [#1777664].
            maxWidth: 200
          }).open(map);
        });
      }

      function handleMapCenterAndVisitorMarker1(visitorPosition) {
        handleMapCenterAndVisitorMarker2(visitorPosition.coords.latitude, visitorPosition.coords.longitude);
      }

      function handleMapCenterAndVisitorMarker2(latitude, longitude) {
        var visitorPosition = new google.maps.LatLng(latitude, longitude);
        if (centerOption == 2) {
          map.setCenter(visitorPosition);
        }
        if (visitorMarker) {
          showSpecialMarker(visitorPosition, Drupal.t('Your retrieved position (' + latitude + ', ' + longitude + ')'));
        }
      }

      function showSpecialMarker(position, text) {
        if (visitorMarker == true) {
          specialMarker = new google.maps.Marker({ map: map, position: position, title: text });
        }
        else {
          // Interpret value of visitorMarker as the marker color.
          // eg "00FF00" for bright green.
          var pinColor = visitorMarker;
          // use character like "x", for a dot use "%E2%80%A2".
          var pinChar = "%E2%80%A2";
          // Black.
          var textColor = "000000";
          // Note: cannot use https: here...
          var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + pinChar + "|" + pinColor + "|" + textColor,
            new google.maps.Size(21, 34), new google.maps.Point(0, 0), new google.maps.Point(10, 34));
          specialMarker = new google.maps.Marker({ map: map, icon: pinImage, shadow: shadowImage, position: position, title: text });
        }
        google.maps.event.addListener(specialMarker, 'click',  function(event) {
          new google.maps.InfoWindow({
            content: text,
            position: event.latLng
          }).open(map);
        });
      }

      // Fall back on IP address lookup, for instance when user declined to share location (error 1)
      function handlePositionError(error) {
        //alert(Drupal.t('IPGV&M multi-location map: getCurrentPosition() returned error !code', {'!code': error.code}));
        var latLng = settings.ip_geoloc_multi_location_center_latlng;
        if (latLng) {
          handleMapCenterAndVisitorMarker2(latLng[0], latLng[1]);
        }
      }
    }
  }
})(jQuery, Drupal);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc