Skip to content
Snippets Groups Projects
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">&nbsp;</span>, <span id="time">&nbsp;</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 + '">&nbsp;</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>