<html> <header> <title>Evénements à venir</title> </header> <body style="font-family: helvetica; line-height: 24px; font-size: 16px;"> <?php require 'settings.php'; if ($password && (!isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_PW'] != $password)) { header('WWW-Authenticate: Basic realm="bbn"'); header('HTTP/1.0 401 Unauthorized'); die('<p>Access denied.</p></body></html>'); } /*function ics2json($input) { $id = 0; $root = array(); $curr = root; input.split("\r\n").forEach(l => { var key = l.split(":")[0].split(";")[0]; var val = l.split(":")[1]; if (key == "BEGIN") { if (curr[val]) { val += "_" + (id++); } curr[val] = { parent: curr }; curr = curr[val]; } else if (key == "END") { var parent = curr.parent; delete curr.parent; curr = parent; } else { curr[key] = key.startsWith("DT") ? dt(val) : val; } }); root.VCALENDAR.VEVENTS = []; Object.keys(root.VCALENDAR) .filter(k => (k == "VEVENT" || k.startsWith("VEVENT_"))) .forEach(k => { root.VCALENDAR.VEVENTS.push(root.VCALENDAR[k]); delete root.VCALENDAR[k]; }); return root.VCALENDAR; }*/ // Get ics file $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_USERPWD, $user . ':' . $password); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); $result = curl_exec($curl); if (!$result) { die('<p>Error while getting ics file from caldav server.</p></body></html>'); } curl_close($curl); // port "showresult" js function: $recent = 7; if (isset($_GET['recent'])) { $recent = $_GET['recent']; } $recentonly = isset($_GET['recentonly']); echo '<h1>Evénements à venir</h1>'; ?> </body> </html> <!-- old --> <div id="content">Récupération du calendrier...</div> <script type="text/javascript"> function dt(s) { var formatted = s.substr(0,4) + "-" + s.substr(4,2) + "-" + s.substr(6,2); if (s.length > 8) { formatted += "T" + s.substr(9,2) + ":" + s.substr(11,2) + ":" + s.substr(13,2); } return new Date(formatted); } function formatdate(d) { return d.toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: "full", timeStyle: "short" }); } function showresult() { if (xhr.status == 200) { var params = new URLSearchParams(window.location.search); var recent = parseInt(params.get("recent")); if (isNaN(recent)) { recent = 7; } var recentonly = params.get("recentonly"); var html = "<h1>Evénements à venir</h1>"; html += `<h3>${formatdate(new Date)}</h3>`; html += `<div>En gras: modifié les ${recent} derniers jours</div>`; var weblink = params.get("weblink"); if (weblink) { html += `<div><a target="_blank" href="${weblink}">Lien vers calendrier web</a></div>`; } var o = ics2json(xhr.responseText); var lastmodified = new Date(); lastmodified.setDate(lastmodified.getDate() - recent); var group = {}; o.VEVENTS .filter(e => e.DTSTART >= (new Date) && (!recentonly || e.DTSTAMP >= lastmodified)) .sort( (a,b) => a.DTSTART - b.DTSTART) .forEach(e => { var formatteddate = formatdate(e.DTSTART); var splitdate = formatteddate.split(" "); var year = splitdate[3]; var month = splitdate[2]; if (!group[year]) { html += `<h2>${year}</h2>`; group[year] = {}; } if (!group[year][month]) { html += `<h3>${month}</h3>`; group[year][month] = true; } var line = `<li title="modifié le ${formatdate(e.DTSTAMP)}"> ${formatteddate}: ${e.SUMMARY}`; if (e.DTSTAMP >= lastmodified) { line = `<b>${line}</b>`; } html += line; }); content.innerHTML = html; } } var password = localStorage.getItem("icspassword"); if (!password) { password = prompt("password:"); localStorage.setItem("icspassword", password); } var xhr = new XMLHttpRequest(); xhr.onload = showresult; xhr.open("POST", "ics.php"); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.send("password=" + password); </script>