jQuery(document).ready(function($){
var postId=$('#em_id_post').val();
var hasRequestedContacts=false;
var map=null;
var mapLayer=null;
var mappableDates=[];
var link=$('#ticket-button').attr('href');
if(link===undefined||link===''){
$('#ticket-button').hide();
}
if(postId){
loadSingleEventDetails();
requestBrowserLocation();
}
$('#em-show-contacts').on('click', function(){
if(hasRequestedContacts){
return;
}
hasRequestedContacts=true;
var $button=$(this);
var $results=$('#em-contact-results');
$button.prop('disabled', true).text('Caricamento contatti...');
$results.empty();
$.ajax({
type: 'POST',
url: nc.url,
data: {
action: 'em_single_event_contacts',
postid: postId,
intent: 'show',
_nonce: nc.nonce
},
success: function(response){
if(!response||response.success!==true){
$results.text('Contatti non disponibili.');
$button.hide();
return;
}
renderContacts(response.data||{});
$button.hide();
},
error: function(){
hasRequestedContacts=false;
$button.prop('disabled', false).text('Mostra contatti');
$results.text('Non e\' stato possibile caricare i contatti.');
}});
});
$('#em-show-map').on('click', function(){
var $panel=$('#em-single-map-panel');
var isHidden=$panel.prop('hidden');
$panel.prop('hidden', !isHidden);
$(this).text(isHidden ? 'Nascondi mappa':'Vedi sulla mappa');
if(isHidden){
setTimeout(function(){
renderMap();
var mapEl=document.getElementById('em-single-map');
if(mapEl){
mapEl.scrollIntoView({ behavior: 'smooth', block: 'center' });
}}, 80);
}});
$('#em-poster-open').on('click', function(){
var imageUrl=$(this).data('full-image');
var $lightbox=$('#em-poster-lightbox');
if(!imageUrl||!$lightbox.length){
return;
}
$lightbox.find('img').attr('src', imageUrl);
$lightbox.prop('hidden', false).addClass('is-open');
$('body').addClass('em-lightbox-open');
});
$('#em-poster-close, #em-poster-lightbox').on('click', function(event){
if(event.target!==this){
return;
}
closePosterLightbox();
});
$(document).on('keydown', function(event){
if(event.key==='Escape'){
closePosterLightbox();
}});
function requestBrowserLocation(){
if(!navigator.geolocation){
return;
}
navigator.geolocation.getCurrentPosition(function(position){
loadSingleEventDetails(position.coords.latitude, position.coords.longitude);
},
function(){},
{
enableHighAccuracy: false,
timeout: 7000,
maximumAge: 900000
}
);
}
function loadSingleEventDetails(lat, lng){
$.ajax({
type: 'POST',
url: nc.url,
data: {
action: 'em_single_event_details',
postid: postId,
lat: lat||'',
lng: lng||'',
_nonce: nc.nonce
},
success: function(response){
if(!response||response.success!==true){
renderEmptyState();
return;
}
renderSingleEventDetails(response.data||{});
},
error: function(){
renderEmptyState();
}});
}
function renderSingleEventDetails(data){
renderNextEvent(data.next_event||null);
renderNearestEvent(data.nearest_event||null, data.nearest_matches_next===true);
renderDateList(data.dates||[]);
prepareMap(data.dates||[]);
}
function renderNextEvent(eventData){
var $card=$('#em-next-event-card');
$card.removeClass('is-loading');
if(!eventData){
$card.addClass('is-empty');
$card.find('.em-single-event__quick-label').text('Prossimo evento');
$card.find('.em-single-event__quick-date').text('Nessuna data futura disponibile');
$card.find('.em-single-event__quick-location').text('');
return;
}
$card.removeClass('is-empty');
$card.find('.em-single-event__quick-label').text('Prossimo evento');
$card.find('.em-single-event__quick-date').text(eventData.date_label||'');
$card.find('.em-single-event__quick-location').text(eventData.location||'');
}
function renderNearestEvent(eventData, matchesNext){
var $card=$('#em-nearest-event-card');
var $summary=$('#em-single-live-summary');
$card.removeClass('is-loading');
if(!eventData||matchesNext){
$card.prop('hidden', true);
$summary.removeClass('has-nearest');
return;
}
$card.prop('hidden', false);
$summary.addClass('has-nearest');
$card.find('.em-single-event__quick-date').text(eventData.date_label||'');
$card.find('.em-single-event__quick-location').text(eventData.location||'');
if(eventData.distance!==null&&eventData.distance!==undefined){
$card.find('.em-single-event__distance').text(eventData.distance + ' km circa').show();
}else{
$card.find('.em-single-event__distance').hide();
}}
function renderDateList(dates){
var $card=$('#em-single-dates-card');
var $list=$('#em-single-date-list');
$card.find('.em-single-event__loading').remove();
$list.empty();
if(!dates.length){
$('<li/>', {
class: 'em-single-event__date-item is-empty',
text: 'Nessuna data futura disponibile.'
}).appendTo($list);
return;
}
dates.forEach(function(dateItem){
var itemClass='em-single-event__date-item' + (dateItem.promoted ? ' is-promoted':'');
var $item=$('<li/>', { class: itemClass });
$('<span/>', {
class: 'em-single-event__date-text',
text: dateItem.date_label||''
}).appendTo($item);
if(dateItem.location){
$('<span/>', {
class: 'em-single-event__location-text',
text: dateItem.location
}).appendTo($item);
}
if(dateItem.promoted){
$('<span/>', {
class: 'em-single-event__promoted-location',
text: dateItem.promoted_label||'Location in evidenza'
}).appendTo($item);
}
if(dateItem.lat&&dateItem.lng){
$('<button/>', {
type: 'button',
class: 'em-single-event__map-link',
text: 'Vedi questa location sulla mappa'
}).on('click', function(){
openMapAt(dateItem);
}).appendTo($item);
}
$item.appendTo($list);
});
}
function prepareMap(dates){
mappableDates=dates.filter(function(dateItem){
return isFiniteCoordinate(dateItem.lat)&&isFiniteCoordinate(dateItem.lng);
});
$('#em-show-map').prop('hidden', mappableDates.length===0);
if(mappableDates.length===0){
$('#em-single-map-panel').prop('hidden', true);
$('#em-show-map').text('Vedi sulla mappa');
map=null;
mapLayer=null;
}}
function openMapAt(dateItem){
var $panel=$('#em-single-map-panel');
$panel.prop('hidden', false);
$('#em-show-map').text('Nascondi mappa');
setTimeout(function(){
renderMap(dateItem);
var mapEl=document.getElementById('em-single-map');
if(mapEl){
mapEl.scrollIntoView({ behavior: 'smooth', block: 'center' });
}}, 80);
}
function renderMap(focusItem){
if(!mappableDates.length){
return;
}
if(typeof ol==='undefined'){
renderMapUnavailable();
return;
}
var source=buildMapSource(focusItem);
var features=source.getFeatures();
if(!features.length){
renderMapUnavailable();
return;
}
$('#em-single-map').find('.em-single-event__map-unavailable').remove();
if(!map){
mapLayer=new ol.layer.Vector({ source: source });
try {
map=new ol.Map({
target: 'em-single-map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
}),
mapLayer
],
view: new ol.View({
center: features[0].getGeometry().getCoordinates(),
zoom: 13
})
});
} catch (error){
renderMapUnavailable();
return;
}}else{
mapLayer.setSource(source);
}
scheduleMapResize();
var extent=source.getExtent();
if(focusItem&&isFiniteCoordinate(focusItem.lat)&&isFiniteCoordinate(focusItem.lng)){
map.getView().animate({
center: ol.proj.fromLonLat([parseFloat(focusItem.lng), parseFloat(focusItem.lat)]),
zoom: 15,
duration: 250
});
return;
}
if(features.length===1){
map.getView().setCenter(features[0].getGeometry().getCoordinates());
map.getView().setZoom(14);
}else{
map.getView().fit(extent, {
padding: [42, 42, 42, 42],
maxZoom: 14,
duration: 250
});
}}
function buildMapSource(focusItem){
var source=new ol.source.Vector();
mappableDates.forEach(function(dateItem){
var lon=parseFloat(dateItem.lng);
var lat=parseFloat(dateItem.lat);
if(!isFinite(lon)||!isFinite(lat)){
return;
}
var feature=new ol.Feature({
geometry: new ol.geom.Point(ol.proj.fromLonLat([lon, lat])),
label: dateItem.location||'',
dateLabel: dateItem.date_label||''
});
feature.setStyle(markerStyle(dateItem===focusItem));
source.addFeature(feature);
});
return source;
}
function scheduleMapResize(){
if(!map){
return;
}
map.updateSize();
window.requestAnimationFrame(function(){
if(map){
map.updateSize();
}});
setTimeout(function(){
if(map){
map.updateSize();
}}, 160);
setTimeout(function(){
if(map){
map.updateSize();
}}, 420);
}
function renderMapUnavailable(){
map=null;
mapLayer=null;
$('#em-single-map')
.empty()
.append($('<div/>', {
class: 'em-single-event__map-unavailable',
text: 'Mappa non disponibile in questo momento.'
}));
}
function markerStyle(isFocused){
return new ol.style.Style({
image: new ol.style.Circle({
radius: isFocused ? 10:8,
fill: new ol.style.Fill({ color: isFocused ? '#f5c84b':'#4d9aaa' }),
stroke: new ol.style.Stroke({ color: '#ffffff', width: 3 })
})
});
}
function isFiniteCoordinate(value){
return value!==''&&value!==null&&value!==undefined&&isFinite(parseFloat(value));
}
function renderContacts(data){
var $results=$('#em-contact-results');
$results.empty();
if(!data.email&&!data.phone){
$results.text('Contatti non disponibili.');
return;
}
if(data.email){
var $email=$('<p/>');
$('<span/>', { text: 'Email' }).appendTo($email);
$('<a/>', {
href: 'mailto:' + data.email,
text: data.email
}).appendTo($email);
$email.appendTo($results);
}
if(data.phone){
var $phone=$('<p/>');
$('<span/>', { text: 'Telefono' }).appendTo($phone);
$('<a/>', {
href: 'tel:' + (data.phone_href||data.phone),
text: data.phone
}).appendTo($phone);
$phone.appendTo($results);
}}
function renderEmptyState(){
renderNextEvent(null);
renderNearestEvent(null, true);
renderDateList([]);
prepareMap([]);
}
function closePosterLightbox(){
var $lightbox=$('#em-poster-lightbox');
$lightbox.removeClass('is-open').prop('hidden', true);
$lightbox.find('img').attr('src', '');
$('body').removeClass('em-lightbox-open');
}});