{# @var this \Pimcore\Templating\PhpEngine #}
{# @var view \Pimcore\Templating\PhpEngine #}
{# @var app \Pimcore\Templating\GlobalVariables #}
{# @var $this->product \AppBundle\Model\DefaultProduct #}
{% extends 'layouts/layout_b2c.html.twig' %}
{% block content %}
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBY5eieFHCE5EhZ_-AtWU124rpenVg7BJE&libraries=geometry,places&callback=initMap&v=weekly®ion=IT&language=it" defer></script>
<section class="shops-container d-flex justify-content-center flex-wrap">
<div class="shops-search" id="shops-search">
<div class="inner">
<h2>Punti vendita</h2>
<div id="form_shops">
<div class="input-group">
<input type="text" class="searchbar form-control" id="search_shops_map" type="text" name="address" placeholder="Inserire città o CAP" />
<div class="searchbutton input-group-append">
<button class="btn" type="button" id="button_shops"><img src="/mecstore/b2c/assets/images/custom_icons/search-icon.svg" alt="search"></button>
<button class="btn" type="button restore_search" id="restore_search">X</button>
</div>
</div>
<div class="geolocal">
<span class="geolocalize">USA LA GEOLOCALIZZAZIONE</span>
<span class="geolocalize_error">Attiva la geolocalizzazione nel browser</span>
</div>
<div id="shops_list" class="shops_list" style="height:600px; overflow-y:scroll;">
</div>
</div>
</div>
</div>
<div class="shops_map" id="shops_map" >
</div>
</section>
<script>
const urlParams = new URLSearchParams(window.location.search);
const latSent = urlParams.get('user_lat');
const lngSent = urlParams.get('user_lng');
window.dataLayer = window.dataLayer || [];
let map;
let markers = [];
let infoWindows = [];
let markerLinks = [];
let watch;
function geocodeLatLng(geocoder, coords, type) {
const latlng = {
lat: parseFloat(coords.latitude),
lng: parseFloat(coords.longitude),
};
geocoder.geocode({ location: latlng }, (results, status) => {
if (status === "OK") {
if (results[0]) {
window.dataLayer.push({
'event': type,
'search_term': results[0].formatted_address || 'geolocalization'
});
} else {
console.log("No results found");
}
} else {
console.log("Geocoder failed due to: " + status);
}
});
}
function initMap(coords) {
/* Posizione di Default */
let default_location = new google.maps.LatLng(45.9584803,12.6411075);
let geocoder = new google.maps.Geocoder();
/* Mappa */
map = new google.maps.Map(document.getElementById('shops_map'), {
center: default_location,
zoom: 8
});
let activeInfoWindow;
fetch('/b2c/partners')
.then((response) => response.json())
.then((data) => {
data.forEach(function (val, i){
// Marker
let marker = new google.maps.Marker({
map: map,
title: val.name,
position: new google.maps.LatLng(val.luogoLat, val.luogoLon),
icon: { scaledSize: { width: 26, height: 43 }, url: "/mecstore/b2c/assets/images/custom_icons/marker_map.png" }
});
markers.push(marker);
// InfoWindow
let infoWindow = new google.maps.InfoWindow({
content: `
<div class="info-window ">
<div class="">
<strong class="info-window-name">`+val.name+`</strong><br/>
`+val.indirizzo+`, `+val.cap+`, `+val.comune+` (`+val.provincia+`)<br/>
</div>
<div class="">
Tel. `+val.tel+`<br />
${val.email ? 'Email: <a href="mailto:'+val.email+'" target="_blank">'+val.email+'<br />' : ''}
</div>
<a href="b2c_shop?pagename=`+val.pagename+`" class="" style="padding-top: 5px; text-align: right; width: 100%; display: inline-block;">Vedi scheda ></a>
</div>`
});
infoWindows.push(infoWindow);
let markerLink = `
<div class="shop" data-alphabet='`+val.name+`' data-marker="marker_`+i+`" >
<div class="shop_data">
<div class="info">
<p>
<span class="shop_name">`+val.name+`</span><br>
`+val.indirizzo+`, `+val.cap+`, `+val.comune+` (`+val.provincia+`)<br>
</p>
<a class="shop_openmap">vedi su mappa</a>
</div>
<div class="contacts">
<i class="fa-phone fas"></i> `+val.tel+`<br />
${val.email ? 'Email: <a href="mailto:'+val.email+'" target="_blank">'+val.email+'<br />' : ''}
</div>
</div>
<div class="d-flex justify-content-end">
<a href="b2c_shop?pagename=`+val.pagename+`" class="shop_link"><span>Vedi scheda</span></a>
</div>
</div>
`;
markerLinks.push(markerLink);
});
markers.forEach(function (ele, i) {
let shop = document.getElementById('shops_list');
// Creo la lista
shop.innerHTML += markerLinks[i];
// Apertura InfoWindow
ele.addListener('click', function() {
if (activeInfoWindow) {
activeInfoWindow.close();
}
infoWindows[i].open(map, this);
activeInfoWindow = infoWindows[i];
});
});
$('.shop_openmap').each(function(i, e) {
$(e).click(function(i) {
return function(e) {
google.maps.event.trigger(markers[i], 'click');
}
}(i));
});
shopsSortByAlphabet();
// autocomplete punti vendita
let autocomplete = new google.maps.places.Autocomplete(document.getElementById('search_shops_map'));
// Marker Posizione Utente
let user_place_marker = new google.maps.Marker({ map: map });
// Search functions
if ("geolocation" in navigator) {
$('.geolocalize').css('display', 'block');
$('.geolocalize').click(function () {
initGeo();
});
}
function success(p) {
$('.geolocalize_error').hide();
$('.geolocalize').hide();
//navigator.geolocation.clearWatch(watch);
}
function error() {
$('.geolocalize_error').css('display', 'block');
restore_button.click();
return;
}
function initGeo() {
$('.geolocalize_error').hide();
if ("geolocation" in navigator) {
watch = navigator.geolocation.getCurrentPosition(success, error);
}
}
document.getElementById("search_shops_map").addEventListener('focus', function () {
document.getElementById('button_shops').style.display = 'block';
document.getElementById('restore_search').style.display = 'none';
});
let search_button = document.getElementById('button_shops');
search_button.addEventListener('click', function (event) {
event.stopPropagation();
searchByPosition();
});
if (coords) {
searchByPosition(null, coords, null, null)
}
if (latSent || lngSent){
searchByPosition(null,null,latSent,lngSent)
}
function searchByPosition(e, p, lt, ln) {
if (document.getElementById('search_shops_map').value == '' && !p) {
if(lt || ln){
var user_lat = parseFloat(lt);
var user_lng = parseFloat(ln);
/* Calcolo Distanze */
markers.forEach(function (ele, i) {
let distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(user_lat, user_lng), ele.position);
//console.log('distance: '+distance);
var float_distance = parseFloat((distance /1000 ).toFixed(1) );
//console.log('float_distance: '+float_distance);
if (float_distance> 30.0 || isNaN(float_distance)) {
ele.setMap(null);
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'none';
document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
} else {
ele.setMap(map);
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
}
});
shopsSortByDistance();
// Inserisco l'utente
var pan = {user_lat, user_lng};
map.panTo(pan);
map.setZoom(10);
} else {
document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
user_place_marker.setMap(null);
}
} else {
document.getElementById('button_shops').style.display = 'none';
document.getElementById('restore_search').style.display = 'block';
var user_place = p ? undefined : autocomplete.getPlace();
if (p) {
geocodeLatLng(geocoder, p, 'button_shops');
} else {
window.dataLayer.push({
'event': 'button_shops',
'search_term': document.getElementById('search_shops_map').value
});
}
if (!p && "geolocation" in navigator) {
$('.geolocalize').css('display', 'block');
}
if (user_place || p) {
if(user_place.geometry.location.lat() || user_place.geometry.location.lng()){
if (p) {
document.getElementById("search_shops_map").value = "";
document.getElementById("search_shops_map").placeholder = "Geolocalizzazione attiva, inserisci indirizzo per una nuova ricerca";
var newPos = { lat: p.latitude, lng: p.longitude };
}
var user_lat = p ? p.latitude : user_place.geometry.location.lat();
var user_lng = p ? p.longitude : user_place.geometry.location.lng();
/* Calcolo Distanze */
markers.forEach(function (ele, i) {
let distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(user_lat, user_lng), ele.position);
console.log('distance: '+distance);
var float_distance = parseFloat((distance /1000 ).toFixed(1) );
console.log('float_distance: '+float_distance);
if (float_distance> 30.0 || isNaN(float_distance)) {
ele.setMap(null);
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'none';
document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
} else {
ele.setMap(map);
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
document.querySelector('[data-marker="marker_'+i+'"]').dataset.distance = float_distance;
}
});
shopsSortByDistance();
// Inserisco l'utente
var pan = newPos || user_place.geometry.location;
map.panTo(pan);
map.setZoom(10);
} else {
document.getElementById('error').innerHTML= 'Non sono stati trovati punti vendita in questa zona.';
document.getElementById('error').style.display = 'block';
}
} else {
document.getElementById("search_shops_map").value = "";
document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
user_place_marker.setMap(null);
// Rimetto tutti i punti sulla mappa e sulla lista
markers.forEach(function (ele, i) {
ele.setMap(map);
ele.setPosition(ele.position );
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
});
}
}
}
/* restore search function */
let restore_button = document.getElementById('restore_search');
restore_button.addEventListener('click', function (event) {
event.stopPropagation();
restoreShops();
});
function restoreShops() {
document.getElementById('button_shops').style.display = 'block';
document.getElementById('restore_search').style.display = 'none';
document.getElementById('search_shops_map').value = "";
document.getElementById("search_shops_map").placeholder = "Inserisci un indirizzo";
user_place_marker.setMap(null);
map.panTo(default_location);
map.setZoom(8);
if ("geolocation" in navigator) {
$('.geolocalize').css('display', 'block');
}
// Rimetto tutti i punti sulla mappa e sulla lista
markers.forEach(function (ele, i) {
ele.setMap(map);
ele.setPosition(ele.position );
document.querySelector('[data-marker="marker_'+i+'"]').style.display = 'flex';
});
shopsSortByAlphabet();
}
});
}
/* sort functions */
function shopsSortByDistance() {
var wrapper = document.getElementById('shops_list');
var elements = [...document.getElementById('shops_list').querySelectorAll('.shop')];
elements.sort(function (a, b) {
return +parseFloat(a.dataset.distance) - +parseFloat(b.dataset.distance);
console.log('a.dataset.distance: '+a.dataset.distance);
console.log('b.dataset.distance: '+b.dataset.distance);
});
elements.forEach(function (el) {
wrapper.appendChild(el);
});
};
function shopsSortByAlphabet() {
var wrapper = document.getElementById('shops_list');
var elements = [...document.getElementById('shops_list').querySelectorAll('.shop')];
console.log('elements: '+elements[0].dataset.alphabet);
elements.sort(function (a, b) {
return a.dataset.alphabet.localeCompare(b.dataset.alphabet);
});
elements.forEach(function (el) {
wrapper.appendChild(el);
});
};
</script>
<!-- End .container -->
<!-- margin -->
<!-- End .container -->
<!-- margin -->
{% endblock %}