Something went wrong on our end
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
index.php 12.07 KiB
<?php
header("Content-Type: text/html; charset=utf-8");
date_default_timezone_set('Europe/Berlin');
require "assets/class.iCalReader.php";
// Import ical from vibe
$ical = new ICal("https://portal.idiv.de/ssf/ical/basic.ics?bi=393&ui=129&pd=3e9b30bdd88198e05046f1cc6acbe5e4b85f2158&v=1");
$events = $ical->events();
$dateToday = strtotime(date("Ymd"));
$date14d = strtotime("+14 days");
$eventsShown = 9;
// New array with upcoming events
$eventsUpcoming = array();
// Sorting events
function sortEvents($a, $b) {
$datetime1 = strtotime($a["DTSTART"]);
$datetime2 = strtotime($b["DTSTART"]);
return $datetime1 - $datetime2;
}
// Sort the array
usort($events, "sortEvents");
foreach ($events as $event) {
$eventStart = $ical->iCalDateToUnixTimestamp($event["DTSTART"]);
$eventEnd = $ical->iCalDateToUnixTimestamp($event["DTEND"]);
$eventEnd = dateEndCheck($eventStart, $event["DURATION"], $eventEnd);
if ($eventStart < $dateToday && $eventEnd >= $dateToday) {
array_push($eventsUpcoming, $event);
}
if ($eventStart >= $dateToday && $eventStart <= $date14d) {
array_push($eventsUpcoming, $event);
}
}
if (count($eventsUpcoming) < $eventsShown) {
foreach ($events as $event) {
$eventStart = $ical->iCalDateToUnixTimestamp($event["DTSTART"]);
if (count($eventsUpcoming) < $eventsShown && $eventStart > $date14d) {
array_push($eventsUpcoming, $event);
}
}
}
function durationParser($eventDuration) {
$durationElement = array("D" => "0", "H" => "0", "M" => "0");
// Make array from $eventDuration
$eventDuration = str_replace(array("P", "D", "T", "H"), array("", "D|", "", "H|"), $eventDuration);
$eventDuration = rtrim($eventDuration, "|");
$eventDuration = explode("|", $eventDuration);
//Parse duration
for ($i=0; $i < count($eventDuration); $i++) {
if (substr($eventDuration[$i], -1) == "D") {
$durationElement["D"] = substr($eventDuration[$i], 0, -1);
} elseif (substr($eventDuration[$i], -1) == "H") {
$durationElement["H"] = substr($eventDuration[$i], 0, -1);
} elseif (substr($eventDuration[$i], -1) == "M") {
$durationElement["M"] = substr($eventDuration[$i], 0, -1);
}
}
return $durationElement;
}
function dateEndCheck($eventStart, $eventDuration, $eventEnd) {
if ($eventDuration) {
$durationElement = durationParser($eventDuration);
$str2time = "+".$durationElement["D"]." days ".$durationElement["H"]." hours ".$durationElement["M"]." minutes";
$eventEnd = strtotime($str2time, $eventStart);
return $eventEnd;
} else { return $eventEnd; }
}
function dateParser($eventStart, $eventDuration, $eventEnd) {
$startD = date("j", $eventStart);
$startM = date("M", $eventStart);
$startY = date("Y", $eventStart);
$EndD = date("j", strtotime("-1 day", $eventEnd));
$EndM = date("M", $eventEnd);
$EndY = date("Y", $eventEnd);
// Events with duration
if ($eventDuration) {
$durationElement = durationParser($eventDuration);
$str2time = "+".$durationElement["D"]." days ".$durationElement["H"]." hours ".$durationElement["M"]." minutes";
$eventEnd = strtotime($str2time, $eventStart);
$EndD = date("j", $eventEnd);
$EndM = date("M", $eventEnd);
$EndY = date("Y", $eventEnd);
if ($startY == $EndY && $startM == $EndM && $startD == $EndD) { echo date("j F Y, G:i", $eventStart)."–".date("G:i", $eventEnd); }
else { echo date("j F Y, G:i", $eventStart)." —<br />".date("j F Y, G:i", $eventEnd); }
// All-day events
} elseif ($startY == $EndY) {
if ($startM == $EndM && $startD != $EndD) { echo date("j", $eventStart)."–".date("j F Y", strtotime("-1 day", $eventEnd)); }
elseif ($startD == $EndD) { echo date("j F Y", strtotime("-1 day", $eventEnd)); }
else { echo date("j F", $eventStart)."–".date("j F Y", strtotime("-1 day", $eventEnd)); }
echo ", all-day";
} else { echo date("j F Y", $eventStart)."–".date("j F Y", strtotime("-1 day", $eventEnd)).", all-day"; }
}
// Config image slides
$folderPath = "slides/";
$file = glob($folderPath . '*.{[jJ][pP][eE][gG],[jJ][pP][gG],[pP][nN][gG],[gG][iI][fF]}', GLOB_BRACE);
$countFile = 0;
if ($file != false)
{
$countFile = count($file);
//get slide settings from filename
for ($i=0; $i < count($file); $i++) {
$path_parts = pathinfo($file[$i]);
//store settings of each slide in nested array
$slideSettings[] = explode("-", $path_parts["filename"]);
}
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta http-equiv="refresh" content="600" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="assets/jquery.js"></script>
<title>iDiv event screen</title>
</head>
<body>
<header>
<div class="header-content">
<div><div id="logo"></div></div>
<div class="pagination-wrapper"></div>
<div id="clock">
<span id="date"> </span>, <span id="time"> </span>
</div>
<!-- <div class="gradient-timer"></div> -->
</div>
</header>
<?php
// check if there are any events in array
if (count($eventsUpcoming) > 0) {
?>
<div class="calWrapper">
<div class="horizontalList">
<ul class="eventList">
<?php foreach ($eventsUpcoming as $event) {
$eventStart = $ical->iCalDateToUnixTimestamp($event["DTSTART"]);
$eventDuration = $event["DURATION"];
$eventEnd = $ical->iCalDateToUnixTimestamp($event["DTEND"]);
?>
<li>
<div class="eventWrapper">
<div>
<p class="eventDateLocation"><i class="icn icn-cal">Date: </i><?php dateParser($eventStart, $eventDuration, $eventEnd)?> <i class="icn icn-pin">Location: </i><?=str_replace("\,", ",", $event["LOCATION"]);?></p>
<h2 class="eventTitle"><?=$event["SUMMARY"];?></h2>
</div>
</div>
</li>
<?php } ?>
</ul>
</div>
</div>
<?php } ?>
<ul class="sliderWrapper">
<?php
for ($x = 1; $x <= $countFile; $x++) {
$path_parts = pathinfo($file[$x-1]);
$basename = $path_parts["basename"];
?>
<li class="sliderElement" data-duration="<?=$slideSettings[$x-1][1]?>" style="background-image: url(slides/<?=$basename?>);" id="slide-<?=$x?>">
</li>
<?php } ?>
</ul>
<script type="text/javascript">
const eventTime = 10000; // Display time for an individual calendar slide
const slideTime = 15000; // Display time for individual image slides
const eventLength = $('.eventList li').length; // Length of all event items in calendar list
const eventsVisible = 3; // Amount of events that are displayed on an individual slide
const eventSteps = Math.ceil(eventLength / eventsVisible - 1); // Number of slide changes for calendar events
const eventStepsLast = eventSteps + 1;
// Amount of slider elements
const sliderElemtentLength = $('.sliderElement').length; // Length of all image slides in list
var i = 1;
// Group events
var loopId = 1;
var groupId = 1;
var itemId = 1;
groupCalendarEvents( itemId, groupId, loopId );
function groupCalendarEvents( itemId, groupId, loopId ) {
$('.eventList > li:nth-child(' + itemId + ')').addClass('eventGroup-' + groupId);
// var groupId = groupId;
var checkSum = loopId / eventsVisible;
if(checkSum == 1) {
// $('.eventList > li.eventGroup-' + groupId).wrap('<div />');
groupId++;
loopId = 1;
} else { loopId++; }
itemId++;
(itemId <= eventLength ? groupCalendarEvents ( itemId, groupId, loopId ) : '');
}
function calendarLoop(i) {
setPagination();
gradientDuration(eventTime);
// Hide image slider slider AND show calendar slider
$('.sliderWrapper').removeClass('active').addClass('hidden');
$('.calWrapper').removeClass('hidden').addClass('active');
if($('.calWrapper > div').hasClass('verticalList')) {
var offsetBase = -101;
$('.eventList li').css('width', 100 / eventsVisible + '%');
} else {
var offsetBase = -100;
$('.eventList li').css('height', 100 / eventsVisible + '%');
}
// ($('.calWrapper > div').hasClass('horizontalList') ? offsetBase = -109.65);
if ( eventSteps > 0 && i <= eventSteps ) {
setTimeout( function () {
var offsetCurrent = i * offsetBase;
($('.calWrapper > div').hasClass('verticalList') ? $('.eventList').css('left', offsetCurrent + '%') : $('.eventList').css('top', offsetCurrent + '%'));
i++;
calendarLoop(i);
(i == eventStepsLast ? setTimeout( function () { sliderLoop() }, eventTime) : '');
}, eventTime);
}
}
// Create loop with image slides
function sliderLoop() {
var e = i - 1;
var a = sliderElemtentLength;
gradientDuration(slideTime);
// Hide Calendar slider AND show image slider
$('.calWrapper').removeClass('active').addClass('hidden');
$('.sliderElement').removeClass('active');
$('.sliderWrapper').removeClass('hidden').addClass('active');
setPagination();
setTimeout( function () {
$('.eventList').css('left', '0');
$('.eventList').css('top', '0');
}, slideTime );
//Get slide duration from slide settings
var slideDuration = $('#slide-' + i).attr('data-duration');
slideDuration = slideDuration * 100;
$('#slide-' + e).removeClass('active').addClass('hidden');
$('#slide-' + i).removeClass('hidden').addClass('active');
setTimeout( function () {
i++;
(i <= a ? sliderLoop() : '');
if (i == a) {
setTimeout( function () {
<?php
// check if there are any events in array
if (count($eventsUpcoming) > 0) { echo 'calendarLoop(1);'; }
elseif (count($countFile) > 0) { echo 'sliderLoop()'; }
?>
// calendarLoop(1);
i = 1;
}, slideTime );
}
}, slideTime );
}
// Create pagination
function setPagination() {
// Check if pagination has already been created
if ($('.pagination li').length === 0) {
// Create pagination list
$('.pagination-wrapper').append('<ul class="pagination"></ul>');
var slideLength = Math.ceil($('.eventList li').length / eventsVisible) + $('.sliderWrapper li').length;
for (var p = 0; p < slideLength; p++) {
$('.pagination').append('<li id="pagination-' + p + '"> </li>');
}
// Fill first item
$('.pagination > li:first-child').addClass('filled');
// Check if last item is filled
} else if ($('.pagination > li:last-child').hasClass('filled')) {
$(".pagination li.filled").removeClass('filled');
$('.pagination > li:first-child').addClass('filled');
} else {
// Get ID of filled item, clear it and fill to next on
var pageNext = parseInt($(".pagination li.filled").attr('id').replace('pagination-','')) + 1;
$(".pagination li.filled").removeClass('filled');
$(".pagination li#pagination-" + pageNext).addClass('filled');
}
}
//Set current time
function setTime() {
const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ];
var d = new Date();
var month = monthNames[d.getMonth()];
var day = d.getDate();
var h = d.getHours();
var m = d.getMinutes();
// var s = d.getSeconds();
var date = day + ' ' + (month<10 ? '0' : '') + month + ' ' + d.getFullYear();
// var time = (h<10 ? '0' : '') + h + ":" + (m<10 ? '0' : '') + m + ':' + (s<10 ? '0' : '') + s;
var time = (h<10 ? '0' : '') + h + ":" + (m<10 ? '0' : '') + m;
$('#date').text(date);
$('#time').text(time);
}
function gradientDuration(time) {
var duration = time / 1000;
$('.gradient-timer').css('animation-duration', duration + 's');
}
<?php
// check if there are any events in array
if (count($eventsUpcoming) > 0) { echo 'calendarLoop(1);'; }
elseif (count($countFile) > 0) { echo 'sliderLoop()'; }
?>
setTime();
setInterval(function(){ setTime() }, 1000);
</script>
</body>
</html>