"use strict"; (function($, _) { var isNotEmptyString = function(str) { if (_.isString(str)) { return str.trim().length; } return 0; }; var init = function($mapWrapper){ var maxZoom = 16, $mapCanvas = $mapWrapper.find('.fw-map-canvas'), mapCanvasOY = isNaN(parseInt($mapWrapper.data('map-height'))) ? parseInt($mapCanvas.width() * 0.66) : parseInt($mapWrapper.data('map-height')), locations = $mapWrapper.data('locations'), mapType = $mapWrapper.data('map-type'), mapStyle = $mapWrapper.data('map-style'), mapPin = $mapWrapper.data('map-pin'), initial_zoom = parseInt($mapWrapper.data('initial-zoom')), disableScroll = ($mapWrapper.data('disable-scrolling') ? true : false), mapOptions = { center: ( 'undefined' !== locations && locations.length) ? calculateCenter(locations) : new google.maps.LatLng(-34, 150), mapTypeId: google.maps.MapTypeId[mapType], scrollwheel: disableScroll, zoom: initial_zoom, styles: mapStyle }, markerBounds = new google.maps.LatLngBounds(), map = new google.maps.Map($mapCanvas.get(0), mapOptions); if ('undefined' !== locations && locations.length) { locations.forEach(function(location){ var gMapsCoords = new google.maps.LatLng(location.coordinates.lat, location.coordinates.lng); var icon = ''; if (isNotEmptyString(location.thumb)) { icon = location.thumb; } else { icon = mapPin.url; } var marker = new google.maps.Marker({ position: gMapsCoords, map: map, icon: icon }); markerBounds.extend(gMapsCoords); //set content InfoWindow template if ( isNotEmptyString(location.description) || isNotEmptyString(location.title) || isNotEmptyString(location.url) ) { var template = _.template( "<% function isNotEmptyString(str) { if (_.isString(str)) { return str.trim().length;} return 0; } %>" + "
" + "
" + "<% if ( isNotEmptyString(location.url) || isNotEmptyString(location.title) ) { %>" + "" + "<% } %>" + "<% if ( isNotEmptyString(location.description) ) { %>"+ "
" + "<%= location.description %>" + "
" + "<% } %>" + "
" + "
"); var infowindow = new google.maps.InfoWindow({ content: template({location: location}) }); google.maps.event.addListener(marker, 'click', function() { infowindow.open(map,marker); }); } }); } //change "zoom" map.fitBounds(markerBounds); //change zoom to max zoom var listener = google.maps.event.addListenerOnce(map, 'zoom_changed', function() { if (map.getZoom() > maxZoom) map.setZoom(maxZoom); google.maps.event.removeListener(listener); }); $mapCanvas.height(mapCanvasOY); $mapCanvas.data('map', map); }; var calculateCenter = function(locations) { var Lng,Hyp,Lat, total = locations.length, X = 0, Y = 0, Z = 0; locations.forEach(function(location){ var lat = location.coordinates.lat * Math.PI / 180, lng = location.coordinates.lng * Math.PI / 180, x = Math.cos(lat) * Math.cos(lng), y = Math.cos(lat) * Math.sin(lng), z = Math.sin(lat); X += x; Y += y; Z += z; }); X /= total; Y /= total; Z /= total; Lng = Math.atan2(Y, X); Hyp = Math.sqrt(X * X + Y * Y); Lat = Math.atan2(Z, Hyp); return { lng: (Lng * 180 / Math.PI), lat: (Lat * 180 / Math.PI) }; }; $(document).ready(function(){ $('.fw-map').each(function(){ init($(this)); }); }); }(jQuery, _));