function formatDateString(dateStr) {
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const parts = dateStr.split('-');
const result = `${parts[2]}.${parts[1]}.${parts[0]}`;
return result;
} else {
const d = new Date(dateStr);
if (!isNaN(d)) {
const result = d.toLocaleDateString('it-IT', {
day: '2-digit',
month: '2-digit',
year: 'numeric'
}).replace(/\//g, '.');
return result;
}
return dateStr;
}
}
function formatTimeString(dateStr) {
if (/(AM|PM)/i.test(dateStr)) {
dateStr = "Jan 1, 1970 " + dateStr;
}
const d = new Date(dateStr);
if (!isNaN(d)) {
const formatted = d.toLocaleTimeString('it-IT', {
hour: '2-digit',
minute: '2-digit'
});
return formatted;
}
return dateStr;
}
let today = new Date();
let currentYear = today.getFullYear();
let currentMonth = today.getMonth() + 1;
function createCalendar(year, month) {
const calendarDiv = document.getElementById('calendar');
const daysOfWeek = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'];
const date = new Date(year, month - 1);
let html = '
';
// Headers
html += daysOfWeek.map(day => `
${day}
`).join('');
let firstDayIndex = (date.getDay() + 6) % 7;
let daysInMonth = new Date(year, month, 0).getDate();
// Empty cells at start
for (let i = 0; i < firstDayIndex; i++) {
html += '';
}
for (let day = 1; day <= daysInMonth; day++) {
let currentDate = new Date(year, month - 1, day);
const formattedDate = currentDate.toLocaleDateString('en-US', {
month: 'short',
day: '2-digit',
year: 'numeric'
});
let isToday = (currentDate.getDate() === today.getDate() &&
currentDate.getMonth() === today.getMonth() &&
currentDate.getFullYear() === today.getFullYear());
let todayClass = isToday ? " today" : "";
// try to match any of the possible date fields from the event
let eventObj = [...eventi, ...eventi26].find(evento => {
const evDate = evento.date || evento.startDate || evento.endDate;
return evDate === formattedDate;
});
let extraClass = eventObj ? ' has-event' : '';
const eventDateAttr = eventObj ? (eventObj.date || eventObj.startDate || eventObj.endDate || '') : '';
html += `
${day}
${eventObj ? `` : ''}
`;
}
let remainingCells = 7 - ((firstDayIndex + daysInMonth) % 7);
if (remainingCells < 7) {
for (let i = 0; i < remainingCells; i++) {
html += '';
}
}
const totalRows = Math.ceil((firstDayIndex + daysInMonth + remainingCells) / 7);
for (let i = totalRows; i < 6; i++) {
for (let j = 0; j < 7; j++) {
html += '';
}
}
html += '
';
calendarDiv.innerHTML = html;
document.getElementById('current-month').textContent = `${date.toLocaleString('it-IT', { month: 'long' }).toUpperCase()} ${year}`;
setTimeout(checkEvents, 50);
}
function changeMonth(delta) {
currentMonth += delta;
if (currentMonth < 1) {
currentMonth = 12;
currentYear--;
} else if (currentMonth > 12) {
currentMonth = 1;
currentYear++;
}
createCalendar(currentYear, currentMonth);
}
function checkEvents() {
document.querySelectorAll('.day').forEach(day => {
const calendarDateStr = day.getAttribute('calendar-date');
const calendarDate = new Date(calendarDateStr);
[...eventi, ...eventi26].forEach(evento => {
let eventStart, eventEnd;
if (evento.startDate || evento.endDate) {
eventStart = new Date(evento.startDate || evento.endDate);
eventEnd = new Date(evento.endDate || evento.startDate);
} else if (evento.date) {
eventStart = new Date(evento.date);
eventEnd = new Date(evento.date);
} else {
return;
}
if (calendarDate >= eventStart && calendarDate <= eventEnd) {
day.classList.add('has-event');
const formattedStart = formatDateString(evento.startDate || evento.date);
const formattedEnd = formatDateString(evento.endDate || evento.date);
const dateDisplay = (formattedStart === formattedEnd)
? formattedStart
: `Dal ${formattedStart} al ${formattedEnd}`;
const btn = day.querySelector('.event-dot');
if (btn) {
btn.setAttribute("data-date", dateDisplay);
} else {
day.innerHTML += ``;
}
}
});
});
}
function showEventDetails(button) {
const imageUrl = button.getAttribute('data-image');
const title = button.getAttribute('data-title');
const description = button.getAttribute('data-description');
const time = button.getAttribute('data-time');
const author = button.getAttribute('data-author');
const company = button.getAttribute('data-company');
// the event may supply a date, a datetime, or both; prefer data-date for display
const dateVal = button.getAttribute('data-date') || button.getAttribute('data-datetime') || '';
const imageContainer = document.querySelector(".event-image-container");
const dateContainer = document.querySelector(".datadescrizione");
const titleContainer = document.querySelector(".titolodescrizione");
const descriptionContainer = document.querySelector(".descrizioneoverlay");
const authorContainer = document.querySelector(".autoredescrizione");
const companyContainer = document.querySelector(".compagniadescrizione");
if (imageContainer) {
imageContainer.innerHTML = ``;
}
if (dateContainer) {
dateContainer.innerHTML = dateVal || time || '';
}
if (titleContainer) {
titleContainer.textContent = title;
}
if (descriptionContainer) {
descriptionContainer.textContent = description;
}
if (authorContainer) {
authorContainer.textContent = author;
}
if (companyContainer) {
companyContainer.textContent = company;
}
const detailsSection = button.closest('.div-eventicc')?.querySelector('.div-cdx');
if (detailsSection) {
detailsSection.classList.add('show');
}
}
const eventi = [];
const eventi26 = [];
// Check events after a short delay to see if they get populated
setTimeout(() => {
}, 1000);
// If the calendar is already rendered, re-run the event check so late-loaded CMS items show up.
if (typeof checkEvents === 'function') {
// If the DOM isn't ready yet, schedule for after it is.
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', checkEvents);
} else {
setTimeout(checkEvents, 0);
}
}
document.addEventListener("DOMContentLoaded", function () {
createCalendar(currentYear, currentMonth);
});
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('.testoStoria').forEach(function (el) {
let cleaned = el.innerHTML.replace(/ /g, ' ');
cleaned = cleaned.replace(/\s\s+/g, ' ');
el.innerHTML = cleaned.trim();
});
});
ASINART
AsinArt è un festival culturale diffuso nato per valorizzare il territorio del Golfo dell’Asinara attraverso il dialogo tra arti, paesaggio e comunità. Il progetto mette in relazione alcuni dei luoghi più significativi del nord-ovest della Sardegna – dall’Isola dell’Asinara ai centri urbani affacciati sul Golfo – trasformandoli in spazi di incontro, creatività e partecipazione. Musica, teatro, danza, poesia, letteratura e arti performative diventano strumenti per raccontare il territorio, le sue identità e le sue trasformazioni. AsinArt nasce dalla convinzione che la cultura possa essere un motore di sviluppo sociale, umano ed economico. Per questo promuove la collaborazione tra associazioni, enti pubblici, operatori culturali, artisti e comunità locali, costruendo una rete capace di generare nuove opportunità e nuove forme di partecipazione. Particolare attenzione è dedicata alla valorizzazione dei patrimoni naturali e culturali, alla sostenibilità delle iniziative, all'accessibilità degli eventi e al coinvolgimento delle nuove generazioni. Il festival favorisce inoltre l'incontro tra artisti locali, nazionali e internazionali attraverso residenze, laboratori, produzioni originali e momenti di confronto con il pubblico. AsinArt è un invito a vivere il territorio attraverso l'arte, a riscoprire luoghi conosciuti con uno sguardo nuovo e a costruire relazioni tra persone, culture e paesaggi. Un festival che mette al centro il Golfo dell’Asinara come spazio di incontro, ricerca e immaginazione condivisa.