/**
  * Print a list of events
  *
  * This performs the same function as print_events_table(), but formats the output differently.
  *
  * @param int $startjd
  * @param int $endjd
  * @param string $events
  * @param bool $only_living
  * @param string $sort_by
  *
  * @return string
  */
 public static function eventsList($startjd, $endjd, $events = 'BIRT MARR DEAT', $only_living = false, $sort_by = 'anniv')
 {
     global $WT_TREE;
     // Did we have any output?  Did we skip anything?
     $output = 0;
     $filter = 0;
     $filtered_events = array();
     $html = '';
     foreach (FunctionsDb::getEventsList($startjd, $endjd, $events, $WT_TREE) as $fact) {
         $record = $fact->getParent();
         //-- only living people ?
         if ($only_living) {
             if ($record instanceof Individual && $record->isDead()) {
                 $filter++;
                 continue;
             }
             if ($record instanceof Family) {
                 $husb = $record->getHusband();
                 if (is_null($husb) || $husb->isDead()) {
                     $filter++;
                     continue;
                 }
                 $wife = $record->getWife();
                 if (is_null($wife) || $wife->isDead()) {
                     $filter++;
                     continue;
                 }
             }
         }
         $output++;
         $filtered_events[] = $fact;
     }
     // Now we've filtered the list, we can sort by event, if required
     switch ($sort_by) {
         case 'anniv':
             // Data is already sorted by anniversary date
             break;
         case 'alpha':
             uasort($filtered_events, function (Fact $x, Fact $y) {
                 return GedcomRecord::compare($x->getParent(), $y->getParent());
             });
             break;
     }
     foreach ($filtered_events as $fact) {
         $record = $fact->getParent();
         $html .= '<a href="' . $record->getHtmlUrl() . '" class="list_item name2">' . $record->getFullName() . '</a>';
         if ($record instanceof Individual) {
             $html .= $record->getSexImage();
         }
         $html .= '<br><div class="indent">';
         $html .= $fact->getLabel() . ' — ' . $fact->getDate()->display(true);
         if ($fact->anniv) {
             $html .= ' (' . I18N::translate('%s year anniversary', I18N::number($fact->anniv)) . ')';
         }
         if (!$fact->getPlace()->isEmpty()) {
             $html .= ' — <a href="' . $fact->getPlace()->getURL() . '">' . $fact->getPlace()->getFullName() . '</a>';
         }
         $html .= '</div>';
     }
     // Print a final summary message about restricted/filtered facts
     $summary = '';
     if ($endjd == WT_CLIENT_JD) {
         // We're dealing with the Today’s Events block
         if ($output == 0) {
             if ($filter == 0) {
                 $summary = I18N::translate('No events exist for today.');
             } else {
                 $summary = I18N::translate('No events for living individuals exist for today.');
             }
         }
     } else {
         // We're dealing with the Upcoming Events block
         if ($output == 0) {
             if ($filter == 0) {
                 if ($endjd == $startjd) {
                     $summary = I18N::translate('No events exist for tomorrow.');
                 } else {
                     // I18N: translation for %s==1 is unused; it is translated separately as “tomorrow”
                     $summary = I18N::plural('No events exist for the next %s day.', 'No events exist for the next %s days.', $endjd - $startjd + 1, I18N::number($endjd - $startjd + 1));
                 }
             } else {
                 if ($endjd == $startjd) {
                     $summary = I18N::translate('No events for living individuals exist for tomorrow.');
                 } else {
                     // I18N: translation for %s==1 is unused; it is translated separately as “tomorrow”
                     $summary = I18N::plural('No events for living people exist for the next %s day.', 'No events for living people exist for the next %s days.', $endjd - $startjd + 1, I18N::number($endjd - $startjd + 1));
                 }
             }
         }
     }
     if ($summary) {
         $html .= "<b>" . $summary . "</b>";
     }
     return $html;
 }