/* Functions */ function openNewTabWithHTML(htmlContent) { const newTab = window.open("", "_blank"); newTab.document.write(htmlContent); newTab.document.close(); }; function fetchUrlContent(url, callback) { fetch(url) .then(response => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.text(); }) .then(data => callback(null, data)) .catch(error => { console.error('Fetch error: ', error); callback(error, ""); }); }; function formatDate(dateStr) { return new Date(dateStr).toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"; } function formatDateReadable(dateStr) { return new Date(dateStr).toDateString(); } function jsonToIcal(data) { if (!data.start || !data.end || !data.title || !data.id) { alert("Required fields missing from input data."); throw new Error("Required fields missing from input data."); } let icalStr = 'BEGIN:VCALENDAR\nVERSION:1.0\nPRODID:-//42Cal//\n'; icalStr += 'BEGIN:VEVENT\n'; icalStr += `UID:${data.id}\n`; icalStr += `SUMMARY:${data.title}\n`; icalStr += `DESCRIPTION:${`DURATION: ${data.duration}\\n\\n` + data.description.trim()}\n`; icalStr += `LOCATION:${data.location}\n`; icalStr += `DTSTART:${formatDate(data.start)}\n`; icalStr += `DTEND:${formatDate(data.end)}\n`; icalStr += 'END:VEVENT\n'; icalStr += 'END:VCALENDAR'; return icalStr; }; function addExtraData(event, callback) { let kind = 'events'; if (event.kind === 'exam') { kind = 'exams'; } fetchUrlContent(`https://profile.intra.42.fr/${kind}/${event.id}`, (error, data) => { if (error) { alert('Error2: ' + error); console.log('Error2: ' + error); callback(); } else { parser = new DOMParser(); doc = parser.parseFromString(data, "text/html"); const description = doc.querySelector('.notification-text').textContent; const duration = doc.querySelector('.icon-clock')?.parentElement.children[2].textContent; const _location = doc.querySelector('.icon-location')?.parentElement.children[1].textContent; if (description) event.description = description; else event.description = 'Could not fetch description'; if (duration) event.duration = duration; else event.duration = 'Could not fetch duration'; if (_location) event.location = _location; else event.location = 'Could not fetch location'; callback(event) } }); } function eventsToHtml(events) { let htmlString = '