<?php
// Taubenfreundschaft.de - Startseite
declare(strict_types=1);

date_default_timezone_set('Europe/Berlin');
function renderShareBox(string $url, string $title): string {
    $urlEsc   = htmlspecialchars($url, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
    $titleEsc = htmlspecialchars($title, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');

    return '
<div class="sharebox" data-share data-share-url="'.$urlEsc.'" data-share-title="'.$titleEsc.'">
  <button type="button" class="share-native">🔗<span class="shareicons"> Teilen</span></button>

  <a class="share wa" target="_blank" rel="noopener"><img src="https://sicherheitsgigant.de/image/waicon.png" alt="WhatsApp Icon" /><span class="shareicons"> WhatsApp</span></a>
  <a class="share tg" target="_blank" rel="noopener"><img src="https://sicherheitsgigant.de/image/telegramicon.png" alt="Telegram Icon" /><span class="shareicons"> Telegram</span></a>
  <a class="share fb" target="_blank" rel="noopener"><img src="https://sicherheitsgigant.de/image/fbicon.png" alt="Facebook Icon" /><span class="shareicons"> Facebook</span></a>
  <button class="share-instagram"
          data-url="'.$urlEsc.'"
          data-title="'.$titleEsc.'">
    <img src="https://sicherheitsgigant.de/image/instaicon.png" alt="Instagram Icon" /><span class="shareicons"> Instagram</span>
  </button>
  <a class="share x"  target="_blank" rel="noopener"><img src="https://sicherheitsgigant.de/image/xicon.png" alt="X Icon" /></a>

  <button type="button" class="share-copy">📋<span class="shareicons"> Link kopieren</span></button>
</div>';
}
function injectAfterH2(string $html, string $injection): string {
    // setzt 1x direkt hinter </h2> (erste H2 im Artikel)
    $out = preg_replace('~</h2>\s*~i', "</h2>\n".$injection."\n", $html, 1);
    return $out ?? $html;
}

function injectBeforeArticleEnd(string $html, string $injection): string {
    // setzt 1x vor </div></article> (robust)
    $out = preg_replace('~</div>\s*</article>\s*~i', $injection."\n</div>\n</article>\n", $html, 1);
    return $out ?? $html;
}

function extractH2Id(string $html): string {
    if (preg_match('~<h2\b[^>]*\bid\s*=\s*["\']([^"\']+)["\']~i', $html, $m)) return $m[1];
    return '';
}

function extractH2Title(string $html): string {
    // nimmt nur die erste Zeile bis <br>
    if (preg_match('~<h2\b[^>]*>(.*?)</h2>~is', $html, $m)) {
        $inner = $m[1];
        $first = preg_split('~<br\s*/?>~i', $inner)[0] ?? $inner;
        $first = html_entity_decode(strip_tags($first), ENT_QUOTES | ENT_HTML5, 'UTF-8');
        return trim($first);
    }
    return '';
}

// ===== Konfig =====
$BASE_URL = 'https://sicherheitsgigant.de';
$DIR_STARTSEITE = __DIR__ . '/Startseite';
$DIR_ARCHIV     = __DIR__ . '/Archiv';

// ===== Helpers (mbstring-frei) =====
function u_strlen(string $s): int {
    if (function_exists('mb_strlen')) return (int)mb_strlen($s, 'UTF-8');
    return $s === '' ? 0 : (preg_match_all('~.~us', $s, $m) ?: 0);
}
function u_substr(string $s, int $start, int $len): string {
    if (function_exists('mb_substr')) return (string)mb_substr($s, $start, $len, 'UTF-8');
    $chars = preg_split('~(?<=.)(?=.)~us', $s, -1, PREG_SPLIT_NO_EMPTY);
    if (!is_array($chars)) return $s;
    return implode('', array_slice($chars, $start, $len));
}
function excerpt(string $text, int $maxChars = 155): string {
    $text = trim(preg_replace("~\s+~u", " ", $text) ?? $text);
    if ($text === '') return '';
    if (u_strlen($text) <= $maxChars) return $text;
    $cut = u_substr($text, 0, $maxChars);
    $cut = preg_replace('~\s+\S*$~u', '', $cut) ?? $cut; // kein Wort abbrechen
    return rtrim($cut) . '…';
}
function h_attr(string $s): string {
    return htmlspecialchars($s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
function strip_html_to_text(string $html): string {
    $html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
    $html = preg_replace('~<br\s*/?>~i', "\n", $html) ?? $html;
    $html = strip_tags($html);
    $html = preg_replace("~[ \t]+\n~", "\n", $html) ?? $html;
    $html = preg_replace("~\n{3,}~", "\n\n", $html) ?? $html;
    return trim($html);
}

require_once __DIR__ . '/_article_catalog.php';
require_once __DIR__ . '/_dossier_catalog.php';
require_once __DIR__ . '/_story_priority.php';

$requestUri = $_SERVER['REQUEST_URI'] ?? '/';
$parsedRequest = parse_url($requestUri);
$requestPath = $parsedRequest['path'] ?? '/';
$trimmedPath = trim($requestPath, '/');
$isArchivRoute = $trimmedPath === 'archiv' || str_starts_with($trimmedPath, 'archiv/');
$scopeForMeta = $isArchivRoute ? 'archiv' : 'start';
$slugForMeta = $isArchivRoute ? trim(substr($trimmedPath, strlen('archiv')), '/') : $trimmedPath;

$catalogForMeta = sg_catalog_load(['start', 'archiv']);
$currentMetaItem = null;
if ($slugForMeta !== '' && $slugForMeta !== 'index.php') {
    $currentMetaItem = sg_catalog_find_by_slug($catalogForMeta, $slugForMeta, $scopeForMeta);
}

$leadPriorityArticles = [];
if (!$isArchivRoute) {
  $leadPriorityArticles = sg_priority_build_candidates(
    sg_catalog_flatten($catalogForMeta),
    sg_dossier_load(),
    6,
    ['start', 'archiv'],
    [83, 90, 154, 155]
  );
}

$metaTitle = 'Sicherheitsgigant - die höchste Instanz für Recht und Sicherheit!';
$metaDesc = 'Sicherheitsgigant dokumentiert Fälle, Hintergründe und aktuelle Beiträge rund um Recht und Sicherheit.';
$canonicalPath = '/';
if ($isArchivRoute) {
    $canonicalPath = '/archiv' . ($slugForMeta !== '' ? '/' . $slugForMeta : '');
} elseif ($slugForMeta !== '') {
    $canonicalPath = '/' . $slugForMeta;
}
$canonicalUrl = rtrim($BASE_URL, '/') . $canonicalPath;
$ogImage = rtrim($BASE_URL, '/') . '/image/sicherheitsgigant_header.webp';
$ogImageAlt = 'Sicherheitsgigant';

if (is_array($currentMetaItem) && $currentMetaItem) {
    $resolvedTitle = trim((string) (($currentMetaItem['title'] ?? '') ?: ($currentMetaItem['headline2'] ?? '')));
    if ($resolvedTitle !== '') {
        $metaTitle = $resolvedTitle . ' | Sicherheitsgigant';
    }

    $resolvedDesc = excerpt((string) ($currentMetaItem['content_text'] ?? ''), 190);
    if ($resolvedDesc !== '') {
        $metaDesc = $resolvedDesc;
    }

    if (!empty($currentMetaItem['image_src'])) {
        $candidateImage = (string) $currentMetaItem['image_src'];
        $ogImage = preg_match('~^https?://~i', $candidateImage)
            ? $candidateImage
            : rtrim($BASE_URL, '/') . '/' . ltrim($candidateImage, '/');
    }
    if (!empty($currentMetaItem['image_alt'])) {
        $ogImageAlt = (string) $currentMetaItem['image_alt'];
    }
}
?>
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title><?= h_attr($metaTitle) ?></title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="<?= h_attr($metaDesc) ?>">
    <link rel="canonical" href="<?= h_attr($canonicalUrl) ?>">

    <meta property="og:title" content="<?= h_attr($metaTitle) ?>">
    <meta property="og:description" content="<?= h_attr($metaDesc) ?>">
    <meta property="og:url" content="<?= h_attr($canonicalUrl) ?>">
    <meta property="og:type" content="<?= $currentMetaItem ? 'article' : 'website' ?>">
    <meta property="og:locale" content="de_DE">
    <meta property="og:site_name" content="Sicherheitsgigant">
<?php if (!empty($ogImage)): ?>
    <meta property="og:image" content="<?= h_attr($ogImage) ?>">
<?php endif; ?>
<?php if (!empty($ogImageAlt)): ?>
<meta property="og:image:alt" content="<?= h_attr($ogImageAlt) ?>">
<?php endif; ?>

<meta name="twitter:card" content="<?= !empty($ogImage) ? 'summary_large_image' : 'summary' ?>">
<meta name="twitter:title" content="<?= h_attr($metaTitle) ?>">
<meta name="twitter:description" content="<?= h_attr($metaDesc) ?>">
<?php if (!empty($ogImage)): ?>
<meta name="twitter:image" content="<?= h_attr($ogImage) ?>">
<?php endif; ?>

    <link rel="stylesheet" href="https://sicherheitsgigant.de/style.css?v=8900">
    <link rel="alternate" type="application/rss+xml" title="Sicherheitsgigant RSS" href="https://sicherheitsgigant.de/rss.xml">
</head>
<body>
	<script src="https://sicherheitsgigant.de/js/jquery.min.js"></script>
  <!-- Push-Nudge Overlay -->
<div id="pushNudgeBackdrop" class="pushNudgeBackdrop" hidden>
  <div class="pushNudgeCard" role="dialog" aria-modal="true" aria-labelledby="pushNudgeTitle">
    <div class="pushNudgeTop">
      <div class="pushNudgeBadge">🔥 Breaking-Alerts</div>
      <button class="pushNudgeClose" type="button" aria-label="Schließen" id="pushNudgeClose">✕</button>
    </div>

    <h3 id="pushNudgeTitle" class="pushNudgeTitle">Willst du die wichtigsten News sofort sehen?</h3>
    <p class="pushNudgeText">
      Aktivier Push – dann bekommst du neue Beiträge direkt aufs Handy/Browser.
      Ohne Spam. Nur Updates von <strong>Sicherheitsgigant</strong>.
    </p>

    <ul class="pushNudgeList">
      <li>✅ Neue Beiträge in Sekunden</li>
      <li>✅ Keine Anmeldung</li>
      <li>✅ 1 Klick deaktivierbar</li>
    </ul>

    <div class="pushNudgeActions">
      <button class="pushNudgeBtn primary" type="button" id="pushNudgeEnable">🔔 Push aktivieren</button>
      <button class="pushNudgeBtn" type="button" id="pushNudgeLater">Später</button>
      <button class="pushNudgeBtn ghost" type="button" id="pushNudgeNever">Nie wieder</button>
    </div>

    <div class="pushNudgeFineprint" id="pushNudgeFineprint"></div>
  </div>
</div>

<style>

  .pushNudgeBackdrop{
    position:fixed; inset:0; background:rgba(0,0,0,.55);
    display:flex; align-items:flex-end; justify-content:center;
    z-index:99999; padding:16px;
  }
  .pushNudgeCard{
    width:min(520px, 100%); background:#0f1115; color:#fff;
    border:1px solid rgba(255,255,255,.14);
    border-radius:18px; padding:16px 16px 14px;
    box-shadow:0 20px 80px rgba(0,0,0,.45);
  }
  .pushNudgeTop{display:flex; align-items:center; justify-content:space-between; gap:10px;}
  .pushNudgeBadge{
    display:inline-flex; align-items:center; gap:8px;
    font-weight:800; font-size:12px; letter-spacing:.3px;
    padding:6px 10px; border-radius:999px;
    background:rgba(255,255,255,.10); border:1px solid rgba(255,255,255,.18);
  }
  .pushNudgeClose{
    background:transparent; border:0; color:#fff; cursor:pointer;
    font-size:18px; opacity:.8;
  }
  .pushNudgeClose:hover{opacity:1}
  .pushNudgeTitle{margin:12px 0 6px; font-size:20px; line-height:1.2; color: red;}
  .pushNudgeText{margin:0 0 10px; color:rgba(255,255,255,.85); line-height:1.45}
  .pushNudgeList{margin:0 0 12px; padding-left:18px; color:rgba(255,255,255,.9)}
  .pushNudgeList li{margin:4px 0}
  .pushNudgeActions{display:flex; flex-wrap:wrap; gap:10px; margin-top:10px}
  .pushNudgeBtn{
    border-radius:14px; padding:10px 12px; cursor:pointer;
    border:1px solid rgba(255,255,255,.18);
    background:rgba(255,255,255,.08); color:#fff; font-weight:800;
  }
  .pushNudgeBtn:hover{background:rgba(255,255,255,.12)}
  .pushNudgeBtn.primary{
    background:#ffffff; color:#0f1115; border-color:#fff;
  }
  .pushNudgeBtn.primary:hover{filter:brightness(.95)}
  .pushNudgeBtn.ghost{
    background:transparent; border-color:rgba(255,255,255,.14);
    color:rgba(255,255,255,.75);
  }
  .pushNudgeFineprint{
    margin-top:10px; font-size:12px; color:rgba(255,255,255,.65);
    min-height:16px;
  }
  @media (min-width: 700px){
    .pushNudgeBackdrop{align-items:center;}
  }

  [hidden] {
    display: none !important;
}
</style>
<script type="module">
const publicVapidKey = "BB0bPJJExOosZO0dKI94ZyvPJWPUksIF2zUesUgi46RHeKk61BoOVQi0ZGfkhf9akbtNH2BGV1rWYKTMysb_ch0";
 const STORE_KEY_LAST = 'sg_push_nudge_last';      // YYYY-MM-DD
  const STORE_KEY_NEVER = 'sg_push_nudge_never';    // "1"
  const backdrop = document.getElementById('pushNudgeBackdrop');

  const btnEnable = document.getElementById('pushNudgeEnable');
  const btnLater  = document.getElementById('pushNudgeLater');
  const btnNever  = document.getElementById('pushNudgeNever');
  const btnClose  = document.getElementById('pushNudgeClose');
  const fineprint = document.getElementById('pushNudgeFineprint');

  const btnPush = document.getElementById('btnPush'); // dein Button
function urlBase64ToUint8Array(base64String) {
  const padding = "=".repeat((4 - (base64String.length % 4)) % 4);
  const base64 = (base64String + padding).replace(/-/g, "+").replace(/_/g, "/");
  const rawData = atob(base64);
  const outputArray = new Uint8Array(rawData.length);
  for (let i = 0; i < rawData.length; ++i) outputArray[i] = rawData.charCodeAt(i);
  return outputArray;
}

async function registerServiceWorker() {
let deferredPrompt;
let register,
registration;

window.addEventListener('beforeinstallprompt', (e) => {
  // Prevent the mini-infobar from appearing on mobile
  e.preventDefault();
  // Stash the event so it can be triggered later.
  deferredPrompt = e;
  // Update UI notify the user they can install the PWA
  showInstallPromotion();
  // Optionally, send analytics event that PWA install promo was shown.
  console.log(`'beforeinstallprompt' event was fired.`);
});

if ("serviceWorker" in navigator) {
    async function logState(state) {
      //var liElement = document.createElement('li');
      //liElement.textContent = state;
      //document.querySelector('#states').appendChild(liElement);
    }    
    register = await navigator.serviceWorker
    .register("/service-worker.js", { scope: "/" })
    .then((registration) => {
      let serviceWorker;
      if (registration.installing) {
        serviceWorker = registration.installing;
        //document.querySelector("#kind").textContent = "installing";
        console.log("serviceWorker is installing!");
      } else if (registration.waiting) {
        serviceWorker = registration.waiting;
        //document.querySelector("#kind").textContent = "waiting";
        console.log("serviceWorker waiting!");
      } else if (registration.active) {
        serviceWorker = registration.active;
        //document.querySelector("#kind").textContent = "active";
        console.log("serviceWorker is active!");
        fineprint.textContent = '✅ Push ist aktiv – ab jetzt verpasst du nichts mehr.';
        registration.pushManager
    .subscribe({
      userVisibleOnly: true,
      applicationServerKey: urlBase64ToUint8Array(publicVapidKey),
    })
    .then(async (subscription) => {
      const fineprint = document.getElementById('pushNudgeFineprint');
      try {
        await fetch('/push/subscribe.php', {
          method: 'POST',
          headers: {'Content-Type':'application/json'},
          body: JSON.stringify(subscription),
        });

              const j = await res.json().catch(()=>({}));
      if (!res.ok || !j.ok) {
        fineprint.textContent = 'Subscription konnte nicht gespeichert werden.';
        return;
      }
      setTimeout(closeNudge, 900);
      } catch (error) {
        //fineprint.textContent = 'Fehler: Push konnte nicht aktiviert werden.';
      }
    });
        
      }
      if (serviceWorker) {
        logState(serviceWorker.state);
        serviceWorker.addEventListener("statechange", (e) => {
          console.log(e.target.state);
          fineprint.textContent = '✅ Push ist aktiv – ab jetzt verpasst du nichts mehr.';
        });
      }
    })
    .catch((error) => {
      // Something went wrong during registration. The service-worker.js file
      // might be unavailable or contain a syntax error.
      console.log(error);
    });
} else {
  // The current browser doesn't support service workers.
  // Perhaps it is too old or we are not in a Secure Context.
  console.log("serviceWorker is not in navigator!");
}
}
window.mobileCheck = function() {
    let check = false;
    (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);
    return check;
};

  function todayKey(){
    const d = new Date();
    const y = d.getFullYear();
    const m = String(d.getMonth()+1).padStart(2,'0');
    const da = String(d.getDate()).padStart(2,'0');
    return `${y}-${m}-${da}`;
  }

  function isPushSupported(){
    return ('Notification' in window) && ('serviceWorker' in navigator) && ('PushManager' in window);
  }

  function isAlreadyEnabled(){
    // granted = Nutzer hat erlaubt (heißt nicht zwingend "abonniert", aber gut genug als Nudge-Kriterium)
    return (Notification.permission === 'granted');
  }

  function shouldShowNudge(){
    if (!isPushSupported()) return false;
    if (isAlreadyEnabled()) return false;
    if (localStorage.getItem(STORE_KEY_NEVER) === '1') return false;

    const last = localStorage.getItem(STORE_KEY_LAST) || '';
    if (last === todayKey()) return false;

    return true;
  }

  function openNudge(){
    localStorage.setItem(STORE_KEY_LAST, todayKey());
    backdrop.hidden = false;
  }

  function closeNudge(){
    backdrop.hidden = true;
  }

  async function subscribeFlow(){
    fineprint.textContent = '…';
    try {
      // 1) Permission anfragen
      const perm = await Notification.requestPermission();
      if (perm !== 'granted') {
        fineprint.textContent = 'Okay – ohne Push geht’s auch 🙂';
        return;
      }

      // 2) Service Worker registrieren (Pfad ggf. anpassen!)
      // WICHTIG: Serviceworker muss unter dem Scope liegen, den du brauchst.
      // Wenn du Push für die ganze Domain willst: /sw.js im Webroot.
      const reg = await navigator.serviceWorker.register('/service-worker.js');

      // 3) Push Subscription
      // Deine VAPID Public Key (Base64URL) – HIER EINTRAGEN:
      const VAPID_PUBLIC_KEY = 'BB0bPJJExOosZO0dKI94ZyvPJWPUksIF2zUesUgi46RHeKk61BoOVQi0ZGfkhf9akbtNH2BGV1rWYKTMysb_ch0';

      function urlBase64ToUint8Array(base64String) {
        const padding = '='.repeat((4 - base64String.length % 4) % 4);
        const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
        const rawData = atob(base64);
        const outputArray = new Uint8Array(rawData.length);
        for (let i = 0; i < rawData.length; ++i) outputArray[i] = rawData.charCodeAt(i);
        return outputArray;
      }

      const sub = await reg.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY),
      });

      // 4) An Backend schicken
      const res = await fetch('/push/subscribe.php', {
        method: 'POST',
        headers: {'Content-Type':'application/json'},
        body: JSON.stringify(sub),
      });

      const j = await res.json().catch(()=>({}));
      if (!res.ok || !j.ok) {
        fineprint.textContent = 'Subscription konnte nicht gespeichert werden.';
        return;
      }

      fineprint.textContent = '✅ Push ist aktiv – ab jetzt verpasst du nichts mehr.';
      setTimeout(closeNudge, 900);

    } catch(e){
      fineprint.textContent = 'Fehler: Push konnte nicht aktiviert werden.';
    }
  }

  // Overlay Buttons
  btnEnable?.addEventListener('click', registerServiceWorker);
  btnLater?.addEventListener('click', () => closeNudge());
  btnClose?.addEventListener('click', () => closeNudge());
  btnNever?.addEventListener('click', () => {
    localStorage.setItem(STORE_KEY_NEVER, '1');
    closeNudge();
  });

  // Dein Button nutzt denselben Flow
  //btnPush?.addEventListener('click', subscribeFlow);

  // Auto-Show (leicht verzögert, fühlt sich weniger “aggressiv” an)
  window.addEventListener('load', () => {
    if (shouldShowNudge()) setTimeout(openNudge, 1200);
  });
registerServiceWorker();
  </script>

  <script>
function random(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function randomBits(len) {
  let s = "";
  for (let i = 0; i < len; i++) s += Math.random() < 0.5 ? "0" : "1";
  return s;
}

function launchSicherheitsGigantFireworkOnce() {
  const LS_KEY = "sicherheitsgigant_matrix_once_done";
  if (localStorage.getItem(LS_KEY) === "1") return;
  localStorage.setItem(LS_KEY, "1");

  let canvas = document.querySelector("#canvas");
  if (!canvas) {
    canvas = document.createElement("canvas");
    canvas.id = "canvas";
    canvas.style.position = "fixed";
    canvas.style.top = "0px";
    canvas.style.left = "0";
    canvas.style.width = "100%";
    canvas.style.height = "100%";
    canvas.style.pointerEvents = "none";
    canvas.style.zIndex = "9999";
    document.body.appendChild(canvas);
  }

  const ctx = canvas.getContext("2d");
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  // optional: Resize sauber mitnehmen
  const onResize = () => {
    if (!canvas) return;
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
  };
  window.addEventListener("resize", onResize);

  const colour = "#00ff41";
  ctx.font = "bold 12px monospace";
  ctx.textBaseline = "top";

  let stopped = false;
  let animationId = null;

  // ---- Stop nach 30 Sekunden ----
  const killTimer = setTimeout(() => cleanup(), 30000);

  function cleanup() {
    if (stopped) return;
    stopped = true;

    clearTimeout(killTimer);
    if (animationId) cancelAnimationFrame(animationId);

    window.removeEventListener("resize", onResize);

    if (canvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);
    canvas = null;
  }

  // ---- Das ist DEIN ursprüngliches Verhalten: jede "Zündung" neu random Startpunkt ----
  function launchSicherheitsGigantFirework() {
    if (stopped || !canvas) return;

    const startTime = Date.now();
    const startX = random(50, canvas.width - 50);
    const startY = random(50, canvas.height - 50);
    const time = random(500, 1500);
    let alpha = 1;

    let particles = [];

    drawFireworks();

    function drawFireworks() {
      if (stopped || !canvas) return;

      const now = Date.now();
      ctx.clearRect(0, 0, canvas.width, canvas.height);

      // Neues Matrix-Partikel
      let particle = {
        x: startX,
        y: startY,
        xVel: random(-5, 5),
        yVel: random(-5, 5),
        len: random(2, 5),
        bits: randomBits(random(2, 5)),
        nextFlipAt: now + random(30, 90)
      };

      particles.push(particle);

      for (let p = 0; p < particles.length; p++) {
        particle = particles[p];

        if (now >= particle.nextFlipAt) {
          particle.bits = randomBits(particle.len);
          particle.nextFlipAt = now + random(30, 90);
        }

        ctx.globalAlpha = alpha;
        ctx.fillStyle = colour;

        // Glow (optional)
        ctx.shadowColor = colour;
        ctx.shadowBlur = 8;

        ctx.fillText(particle.bits, particle.x, particle.y);

        particle.x += particle.xVel;
        particle.y += particle.yVel;
      }

      if (now - startTime < time) {
        if (now - startTime < time + 100) alpha -= 0.01;
        animationId = window.requestAnimationFrame(drawFireworks);
      } else {
        // nächster Burst, ABER nur solange wir nicht gestoppt wurden
        if (!stopped) launchSicherheitsGigantFirework();
      }
    }
  }

  // Start der ersten Zündung
  launchSicherheitsGigantFirework();
}

  </script>
        <style>
          footer ul {
    list-style: none;
    display: block;
}
img.imimgclass {
    max-width: 49%;
}
footer ul li {
    display: inline-block;
}
        .video-container {
    display: flex;
    text-align: center;
    position: relative;
    width: 100%;
    max-width: 1982px;
    margin: 0 auto;
    cursor: pointer;
    justify-content: center;
}

        .video-container img {
            width: 100%;
            height: auto;
            display: block; /* Entfernt zusätzlichen Platz unter dem Bild */
        }

        .video-container .play-button {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%); /* Zentriert den Play-Button */
            width: 80px; /* Größe des Play-Buttons anpassen */
            height: 80px; /* Größe des Play-Buttons anpassen */
            background-color: rgba(0, 0, 0, 0.7); /* Hintergrund für den Button */
            border-radius: 50%; /* Rundet den Button */
            display: flex;
            justify-content: center;
            align-items: center;
            transition: background-color 0.3s ease;
        }

        .video-container .play-button::before {
            content: '';
            width: 0;
            height: 0;
            border-top: 20px solid transparent;
            border-bottom: 20px solid transparent;
            border-left: 30px solid white; /* Dreieck für den Play-Pfeil */
            margin-left: 5px; /* Korrektur für die Zentrierung des Pfeils */
        }

        .video-container .play-button:hover {
            background-color: rgba(0, 0, 0, 0.9); /* Dunkler bei Hover */
        }

        .video-player {
            display: none; /* Video ist standardmäßig versteckt */
            width: 100%;
            height: auto;
            max-width: 1982px;
            margin: 0 auto;
        }
        #headpic img {
    max-width: 1780px;
}
ul#alllinks li {
    position: relative;
    list-style-type: "§ ";
    /*color: red;*/
    margin-left: -25px;
    border: 1px solid;
    margin-bottom: 10px;
    border-top-right-radius: 15px;
    border-bottom-right-radius: 15px;
    padding-left: 10px;
    padding-right: 5px;
}
div#efak {
    margin-left: -40px;
    font-size: 22px;
}
ul#alllinks li a {
    color: #434343;
    text-decoration: none;
    font-weight: 600;
}
div#efak, div#efak_p, div#efakn {
    margin-left: -40px;
    font-size: 22px;
    margin-top: 20px;
    margin-bottom: 15px;
}
ul#alllinks #showVideoLink558894 {
    list-style-type: "*";
    color: violet;
    font-size: large;
    display: block;
    width: 100%;
    margin-left: -24px;
    border: 1px solid;
    margin-bottom: 10px;
    border-top-right-radius: 15px;
    border-bottom-right-radius: 15px;
    padding-left: 10px;
    padding-right: 5px;
    cursor: pointer;
}

    </style>
<header>


    <div class="video-container" id="headpic">
        <img src="https://sicherheitsgigant.de/image/sicherheitsgigant_header.webp" alt="Panzer nach Karlsruhe">
        <div class="play-button"></div>

        <div id="weathermain">
    <div id="weatherimg">
      <img src="" id="img"/>
    </div>
      <!-- div id="weathermax">
        maximal: lade Daten
      </div>
      <div id="weathermin">
        minimal: lade Daten
      </div>
      <div id="weatherfeel">
        Gefühlt: lade Daten
      </div -->
      <div id="name" >
        <h3 id="tem"></h3>
    </div>
      <div id="weathertemp">
        <h3 id="temp"></h3>
      </div>
    </div>
    </div>
<div id="onimageheader">SicherheitsGIGANT - die höchste Instanz für Recht und Sicherheit!</div>
    <video id="videoPlayer" class="video-player" controls preload="metadata">
        <source src="https://sicherheitsgigant.de/video/sicherheitsgigant_header_online.mp4" type="video/mp4">
        Dein Browser unterstützt das Video-Tag nicht.
    </video>

    <script>
      // Funktion, die beim Klick auf den Titel feuert
function darkmodestart() {
    // 1. Sound abspielen? (Optional, falls du ein "Stromausfall"-Geräusch hast)
    // var audio = new Audio('power_down.mp3'); audio.play();

    // 2. Den Flacker-Effekt starten
    document.body.classList.add('system-failure');

    // 3. Nach dem Flackern (1.5 Sekunden) den dauerhaften Darkmode setzen
    setTimeout(function() {
        document.body.classList.remove('system-failure');
        document.body.classList.add('dark-mode');
        
        // 4. Im LocalStorage speichern ("Cookie"), damit es so bleibt
        localStorage.setItem('sicherheitsgigant_status', 'darkness_active');
    }, 1400);
}

// Prüfen beim Laden der Seite, ob der User schon im "Dunklen" ist
document.addEventListener("DOMContentLoaded", function() {
    if (localStorage.getItem('sicherheitsgigant_status') === 'darkness_active') {
        document.body.classList.add('dark-mode');
    }
});



function launchSicherheitsGigantFirework_old() {
    const canvas = document.createElement('canvas');
    canvas.style.position = 'fixed';
    canvas.style.top = "0px";
    canvas.style.left = '0';
    canvas.style.width = '100%';
    canvas.style.height = '100%';
    canvas.style.pointerEvents = 'none';
    canvas.style.zIndex = '9999';
    canvas.style.backgroundColor = '#434343';

    document.body.appendChild(canvas);

    const ctx = canvas.getContext('2d');
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    console.log(canvas, Math.abs(document.querySelector("body").getBoundingClientRect().top-document.querySelector("main").getBoundingClientRect().top) + "px");

    let particles = [];
    const colors = ['#00ff41', '#ffffff', '#ff0000']; // Sicherheitsgigant-Farben (Grün, Weiß, Warn-Rot)

    class Particle {
        constructor(x, y, color) {
            this.x = x;
            this.y = y;
            this.color = color;
            this.size = Math.random() * 3 + 1;
            this.speedX = Math.random() * 10 - 5;
            this.speedY = Math.random() * 10 - 5;
            this.gravity = 0.1;
            this.opacity = 1;
            this.text = Math.random() > 0.5 ? "1" : "0"; // Der digitale Code
        }

        update() {
            this.x += this.speedX;
            this.y += this.speedY;
            this.speedY += this.gravity;
            this.opacity -= 0.01;
        }

        draw() {
            ctx.globalAlpha = this.opacity;
            ctx.fillStyle = this.color;
            ctx.font = this.size * 5 + "px monospace";
            ctx.fillText(this.text, this.x, this.y);
        }
    }

    function createExplosion(x, y) {
        for (let i = 0; i < 50; i++) {
            particles.push(new Particle(x, y, colors[Math.floor(Math.random() * colors.length)]));
        }
    }

    // Initial-Explosionen
    createExplosion(canvas.width / 2, canvas.height / 2);
    setTimeout(() => createExplosion(canvas.width * 0.3, canvas.height * 0.4), 200);
    setTimeout(() => createExplosion(canvas.width * 0.7, canvas.height * 0.4), 400);

    function animate() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        particles.forEach((p, index) => {
            p.update();
            p.draw();
            if (p.opacity <= 0) particles.splice(index, 1);
        });

        if (particles.length > 0) {
            requestAnimationFrame(animate);
        } else {
            //document.body.removeChild(canvas);
        }
    }

    animate();
    
    // Kombiniert mit deinem Darkmode-Start!
    if (typeof darkmodestart === "function") {
        darkmodestart();
    }
}


        document.getElementById('headpic').addEventListener('click', function() {
            var videoThumbnail = document.getElementById('headpic');
            var videoPlayer = document.getElementById('videoPlayer');
            document.getElementById('onimageheader').style.display = "none";
            videoThumbnail.style.display = 'none'; // Versteckt das Thumbnail
            videoPlayer.style.display = 'block';   // Zeigt den Videoplayer an
            videoPlayer.play().catch(error => {
      // Handle potential play() errors, e.g., if autoplay is blocked
      console.error("Error attempting to play video:", error);
    });                    // Startet das Video
            videoPlayer.addEventListener('ended', () => {
            console.log('Video ist zu Ende!');
            //videoThumbnail.style.display = 'block';
            videoPlayer.style.display = 'none';   // Zeigt den Videoplayer an
            videoThumbnail.style.display = 'block'; // Versteckt das Thumbnail
            document.getElementById('onimageheader').style.display = "block";
            // Fügen Sie hier Ihre Aktion hinzu, z. B. nächstes Video abspielen.
        });
            console.log(videoPlayer);
        });
    </script>
    </header>
<!--<nav>
        <ul>
            <li><a href="./">Start</a></li>
            <li><a href="https://taubenfreundschaft.de/index.php?v=0.01#presseaufruf">Presse</a></li>
            <li><a href="kontakt.php">Kontakt</a></li>
            <li><a href="datenschutz.html">Datenschutz</a></li>
            <li><a href="impressum.html">Impressum</a></li>
        </ul>
        <br>
        <ul>
            <li><a href="gabi_reimer_geb_kiessler.php">1. Hauptrolle Gabi Kießler - notorische Lügnerin</a></li>
            <li><a href="lothar_kiessler.php">2. Hauptrolle Lothar Kießler (pensionierter Polizist) - Ehezerstörer</a></li>
        </ul>
        <br>
        <ul>
            <li><a href="amtsgericht_tempelhof_kreuzberg.php">1. Nebenrolle Amtsgericht Tempelhof-Kreuzberg - Grundrechtmissachter</a></li>
            <li><a href="amtsgericht_tempelhof_kreuzberg.php">2. Nebenrolle REWE - eines der größten Handelsunternehmen Deutschlands</a></li>
        </ul>
    </nav>-->
<main>
<section id="sectionLeft">
<ul id="alllinks">
  <strong id="fallaktetxtstrong">Fallakte:<br>C. & V. Reimer vs G. Kießler u.a.</strong>
  <br>
  <div id="efak_p"><a href="https://sicherheitsgigant.de">🏠 POSTSTELLE:</a><br>
    <a href="https://sicherheitsgigant.de/archiv" style="color: blueviolet !important;text-decoration: underline;">zum Archiv</a><br>
    <a href="https://sicherheitsgigant.de/presse_dossier.php" style="color: #ffd774 !important;text-decoration: underline;">Prüfpfad für Presse &amp; Behörden</a></div>
  <div class="tagbox" style="display: block; position: relative; top: 0px;">
          <input type="text" id="keyword" name="keyword" value="" placeholder="Suchbegriff">
          <button class="btn2" type="button" id="btnFind">🔍 Suchen</button>
        </div>
  <div id="searchdiver"></div>
  <br><br>
  <br>
<div id="inboxartikel">
  <div id="pintrueartikel">
    <div id="angepintes">Angepinte Post:</div>
    <div id="diviconpin">📌</div>
    <li><div data-indexid="83" class="h2-preview" id="neuhausskiesslerende"><strong id="neuhausskiesslerende" style="color:red">DATA LOADING</strong> - Heute kommt was Ihr werdet sehen heute zeigich euch den Beweis…<span title="📣 *§entinel vorlesen lassen?" data-indexid="83" data-url="./video/neuhausskiesslerende.mp4" id="showVideoLink830"></span></div></li>
    <div id="diviconpin">📌</div>
    <li><div data-indexid="154" class="h2-preview" id="b200000_klagewert_sind_jetzt_gesetz" data-linktags="111;107;39">Eskalation Klage 200000 Euro gegen das Land Berlin mit Frist <strong id="b200000_klagewert_sind_jetzt_gesetz" style="color:red">ABGELAUFEN - ANGEKÜNDIGTE SCHRITTE IN VORBEREITUNG!</strong><span title="📣 *§entinel vorlesen lassen?" data-linktags="111;107;39" data-indexid="154" data-url="./video/200000_Klagewert_sind_jetzt_Gesetz.mp4" id="showVideoLink154000"></span></div></li>
<div id="diviconpin">📌</div>
  <li><div data-indexid="155" class="h2-preview" id="guten_morgen_berlin" data-linktags="148;147;141;51">Sollte es zu Störungen kommen, bitte ich jetzt schon um Verzeihung!<span title="📣 *§entinel vorlesen lassen?" data-linktags="148;147;141;51" data-indexid="155" data-url="./video/Guten_Morgen_Berlin.mp4" id="showVideoLink155000"></span></div></li>
  </div>
  <?php if ($leadPriorityArticles): ?>
  <div id="leitbeitraege">
    <div id="efak_p"><a href="https://sicherheitsgigant.de#leitbeitraege">Leitbeiträge zuerst:</a></div>
    <?php foreach ($leadPriorityArticles as $leadArticle): ?>
      <?php
      $leadScope = (string) ($leadArticle['scope'] ?? 'start');
      $leadPreview = (string) (($leadArticle['preview_html'] ?? '') ?: h_attr((string) ($leadArticle['title'] ?? '')));
      $leadReason = (string) ($leadArticle['_priority_reason_summary'] ?? 'Dossier-Fokus');
      $leadQuestions = $leadArticle['_priority_questions'] ?? [];
      $leadOffenses = $leadArticle['_priority_offenses'] ?? [];
      $leadEvidenceLinks = $leadArticle['_priority_evidence_links'] ?? [];
      ?>
      <li id="<?= h_attr(sg_priority_public_anchor($leadArticle)) ?>">
        <div
          data-indexid="<?= (int) ($leadArticle['index_number'] ?? 0) ?>"
          data-scope="<?= h_attr($leadScope) ?>"
          class="h2-preview"
          <?php if (!empty($leadArticle['slug'])): ?>id="<?= h_attr((string) $leadArticle['slug']) ?>"<?php endif; ?>
          <?php if (!empty($leadArticle['linktags_raw'])): ?>data-linktags="<?= h_attr((string) $leadArticle['linktags_raw']) ?>"<?php endif; ?>
        >
          <?= $leadPreview ?>
          <em style="display:block;margin-top:6px;color:#8fa6e8;font-size:12px;font-style:normal;">
            Leitbeitrag · <?= h_attr($leadScope === 'archiv' ? 'Archiv' : 'Startseite') ?> · <?= h_attr($leadReason) ?>
          </em>
          <?php if ($leadQuestions || $leadOffenses): ?>
          <div style="display:block;margin-top:8px;padding:10px 12px;border:1px solid rgba(143,166,232,.25);border-radius:12px;background:rgba(6,12,26,.52);">
            <strong style="display:block;color:#f2d982;font-size:11px;letter-spacing:.08em;text-transform:uppercase;">Faktenkern</strong>
            <?php if ($leadQuestions): ?>
              <div style="margin-top:6px;color:#8fa6e8;font-size:11px;text-transform:uppercase;">Ermittlungsfragen</div>
              <div style="display:grid;gap:6px;margin-top:6px;">
                <?php foreach ($leadQuestions as $question): ?>
                  <a href="<?= h_attr((string) ($question['href'] ?? '#')) ?>" data-preview-bypass="1" style="display:block;padding:8px 10px;border-radius:10px;border:1px solid rgba(143,166,232,.18);background:rgba(255,255,255,.03);color:#dce9ff;text-decoration:none;line-height:1.4;">
                    Ermittlungsfrage: <?= h_attr((string) ($question['title'] ?? '')) ?>
                  </a>
                <?php endforeach; ?>
              </div>
            <?php endif; ?>
            <?php if ($leadOffenses): ?>
              <div style="margin-top:8px;color:#ffcf70;font-size:11px;text-transform:uppercase;">Tatkomplexe / Vorwürfe</div>
              <div style="display:grid;gap:6px;margin-top:6px;">
                <?php foreach ($leadOffenses as $offense): ?>
                  <a href="<?= h_attr((string) ($offense['href'] ?? '#')) ?>" data-preview-bypass="1" style="display:block;padding:8px 10px;border-radius:10px;border:1px solid rgba(255,207,112,.18);background:rgba(255,255,255,.03);color:#ffe8bf;text-decoration:none;line-height:1.4;">
                    Tatkomplex: <?= h_attr((string) ($offense['title'] ?? '')) ?><?php if (!empty($offense['evidence_count'])): ?> · <?= (int) $offense['evidence_count'] ?> Aktenbeleg<?= (int) $offense['evidence_count'] === 1 ? '' : 'e' ?><?php endif; ?>
                  </a>
                <?php endforeach; ?>
              </div>
            <?php endif; ?>
            <?php if ($leadEvidenceLinks): ?>
              <div style="margin-top:8px;color:#8cf0b8;font-size:11px;text-transform:uppercase;">Direktbelege</div>
              <div style="display:grid;gap:6px;margin-top:6px;">
                <?php foreach ($leadEvidenceLinks as $evidenceLink): ?>
                  <a href="<?= h_attr((string) ($evidenceLink['href'] ?? '#')) ?>" data-preview-bypass="1" style="display:block;padding:8px 10px;border-radius:10px;border:1px solid rgba(140,240,184,.18);background:rgba(255,255,255,.03);color:#d7ffe5;text-decoration:none;line-height:1.4;">
                    Direktbeleg: <?= h_attr((string) (($evidenceLink['label'] ?? '') ?: ($evidenceLink['title'] ?? 'Beleg'))) ?> · <?= h_attr((string) ($evidenceLink['source'] ?? 'Beleg')) ?>
                  </a>
                <?php endforeach; ?>
              </div>
            <?php endif; ?>
          </div>
          <?php endif; ?>
          <span style="display:block;margin-top:4px;">
            <a href="<?= h_attr(sg_priority_wall_href($leadArticle)) ?>" data-preview-bypass="1" style="color:#d5e5ff;text-decoration:underline;">Faktenpfad in der Ermittlerwand öffnen</a>
          </span>
        </div>
      </li>
    <?php endforeach; ?>
  </div>
  <?php endif; ?>
  <div id="efak_p"><a href="https://sicherheitsgigant.de">Posteingang:</a></div>

<?php
// ---- Startseite-Loader ----

$dirarchive = $DIR_ARCHIV;
$files = glob($dirarchive  . '/index*.txt');
if (!$files) {
    echo "<!-- keine Startseite-Dateien gefunden -->";
} else {
$newestFirst = true;
    // Nach Nummer sortieren (startseite12.txt > startseite2.txt korrekt)
    usort($files, function($a, $b) {
        $na = (int) preg_replace('/\D+/', '', basename($a));
        $nb = (int) preg_replace('/\D+/', '', basename($b));
        return $na <=> $nb;
    });


    if ($newestFirst) {
        $files = array_reverse($files);
    }

$anzArchivRange = count($files);
$firstArchivRange = intval(str_replace(array($dirarchive, 'index', '.txt', '/', 'varwwwsicherheitsgigantArchiv'), "", $files[count($files)-1]));
$lastArchivRange = intval(str_replace(array($dirarchive, 'index', '.txt', '/', 'varwwwsicherheitsgigantArchiv'), "", $files[0]));
// true = neueste zuerst (Blog-Style), false = älteste zuerst
?>
<script>
  window.anzArchivRange = <?php echo $anzArchivRange; ?>;
  window.firstArchivRange = <?php echo $firstArchivRange; ?>;
  window.lastArchivRange = <?php echo $lastArchivRange; ?>;
</script>
<?php
} 
if(explode("/", $_SERVER['REQUEST_URI'])[1] == "archiv" AND explode("/", $_SERVER['REQUEST_URI'])[1] != "") {
$dir = $DIR_ARCHIV;
} else {
$dir = $DIR_STARTSEITE;
}
$previewScope = (explode("/", $_SERVER['REQUEST_URI'])[1] == "archiv" AND explode("/", $_SERVER['REQUEST_URI'])[1] != "") ? 'archiv' : 'start';
$files = glob($dir  . '/index*.txt');
$videofiles = array();
if (!$files) {
    echo "<!-- keine Startseite-Dateien gefunden -->";
} else {
$newestFirst = true;
    // Nach Nummer sortieren (startseite12.txt > startseite2.txt korrekt)
    usort($files, function($a, $b) {
        $na = (int) preg_replace('/\D+/', '', basename($a));
        $nb = (int) preg_replace('/\D+/', '', basename($b));
        return $na <=> $nb;
    });


    if ($newestFirst) {
        $files = array_reverse($files);
    }

$anzStartRange = count($files);
$firstStartRange = intval(str_replace(array($dir, 'index', '.txt', '/'), "", $files[count($files)-1]));
$lastStartRange = intval(str_replace(array($dir, 'index', '.txt', '/'), "", $files[0]));
// true = neueste zuerst (Blog-Style), false = älteste zuerst
?>
<script>
  window.anzStartRange = <?php echo $anzStartRange; ?>;
  window.firstStartRange = <?php echo $firstStartRange; ?>;
  window.lastStartRange = <?php echo $lastStartRange; ?>;
</script>
<?php
} 
$newestFirst = true;
 $idofsitesstart = NULL;

 if(explode("/", $_SERVER['REQUEST_URI'])[1] != "archiv") {
$files = glob($dir . '/index*.txt');
} else  if(explode("/", $_SERVER['REQUEST_URI'])[1] == "archiv") {
$files = glob($dirarchive . '/index*.txt');
//$dir = $dirarchive;
} 
 
if (!$files) {
    echo "<!-- keine Startseite-Dateien gefunden -->";
} else {

    // Nach Nummer sortieren (startseite12.txt > startseite2.txt korrekt)
    usort($files, function($a, $b) {
        $na = (int) preg_replace('/\D+/', '', basename($a));
        $nb = (int) preg_replace('/\D+/', '', basename($b));
        return $na <=> $nb;
    });


    if ($newestFirst) {
        $files = array_reverse($files);
    }

echo "<!-- H2-Inhalte (Preview / Navigation / etc.) -->\n";
$fpreachcounterstart = 0;  
foreach ($files as $file) {
    $content = file_get_contents($file);
    if ($content === false) {
        continue;
    }
    if(str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file) != 154 AND str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file) != 155 AND str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file) != 83 AND str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file) != 90) {
//echo '<pre style="display:none;">';
//var_dump(str_replace(array('/var/www/sicherheitsgigant/Startseite/index', '.txt'), "", $file));
//echo '</pre>';
// Gruppe 1 = Attribute des <h2>
    if (preg_match_all('~<h2\b([^>]*)>(.*?)</h2>~is', $content, $matches, PREG_SET_ORDER)) {
      $fpreachcounter = 0;  
      foreach ($matches as $m) {
            $attrString = $m[1];      // z.B.  id="beitrag123"
            $h2Inner    = trim($m[2]);

            // ID aus Attributen extrahieren
            $h2Id = null;
            if (preg_match('~\bid\s*=\s*["\']([^"\']+)["\']~i', $attrString, $idMatch)) {
                $h2Id = $idMatch[1];
            }
            $h2tagdata = null;
            if (preg_match('~\bdata-linktags\s*=\s*["\']([^"\']+)["\']~i', $attrString, $idMatchs)) {
                $h2tagdata = $idMatchs[1];
            }
              $uri = $_SERVER['REQUEST_URI'] ?? '/';

$parsed = parse_url($uri);
$path   = $parsed['path'] ?? '/';   // 👉 /halkwutwaage_3
$query  = $parsed['query'] ?? '';   // 👉 fbclid=...

$slug = trim($path, '/');
//var_dump(str_replace("/", "", $path) == $h2Id);
  if(str_replace("/", "", $path) == $h2Id) {

    $idofsitesstart = str_replace(array($dir, 'index', '.txt', '/'), "", $file);
         //var_dump($dataLink[$fpreachcounterstart], str_replace("/", "", $_SERVER['REQUEST_URI'] ));
         //var_dump($dataLink[$fpreachcounterstart] == str_replace("/", "", $_SERVER['REQUEST_URI'] ) );
         }
         
//var_dump($idofsitesstart );
            //var_dump($h2tagdata);
            // Ausgabe / Weiterverarbeitung
            // --------------------------------
            // Beispiel-Ausgabe:

if(explode("/", $_SERVER['REQUEST_URI'])[1] == "archiv") {
  //$idofsitesstart = str_replace(array($dir, 'index', '.txt', '/'), "", $file);
$files = glob($dir . '/index*.txt');
//$dir = $dirarchive;
echo '<div class="newwindows"><a href="../archiv/'.$h2Id.'" title="im neuen Fenster öffnen">📤</a></div>';
} else {
echo '<div class="newwindows"><a href="./'.$h2Id.'" title="im neuen Fenster öffnen">📤</a></div>';
}
            $h2Inner = trim($h2Inner);
            $h2Inner = str_replace("<br>", "", $h2Inner);
            $h2Inner = str_replace("*von §entinel vorlesen lassen?", "", $h2Inner);
            $h2Inner = str_replace("Beitrag vorlesen lassen?", "", $h2Inner);
            $h2Inner = str_replace("(", "", $h2Inner);
            $h2Inner = str_replace(")", "", $h2Inner);
$h2dataurl = "";
if (preg_match('~\bdata-url\s*=\s*["\']([^"\']+)["\']~i', $h2Inner, $idMatchsURL)) {
  //var_dump(str_replace(array($dir, 'index', '.txt', '/'), "", $file));
  $h2dataurl = $idMatchsURL[1];
}

if($h2dataurl) {
$videofiles["index".str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file).""] = $h2dataurl . "::##::" . $h2Inner . "::##::" . htmlspecialchars((string) ($h2Id ?? ''), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
            if($h2tagdata) {
            $h2Inner = str_replace("<span ", '<span title="📣 *§entinel vorlesen lassen?" data-linktags="'.$h2tagdata.'" data-indexid="'.str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file).'"', $h2Inner);
            } else {
            $h2Inner = str_replace("<span ", '<span title="📣 *§entinel vorlesen lassen?" data-indexid="'.str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file).'"', $h2Inner);
            }
            echo '<li><div data-indexid="'.str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file).'" data-scope="'.htmlspecialchars($previewScope, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8').'" class="h2-preview"' . ($h2Id ? ' id="' . htmlspecialchars($h2Id) . '"' : '');
            if($h2tagdata) {
echo 'data-linktags="'.$h2tagdata.'" ';
            }
               if(str_replace(array($dir ,'/index', '.txt', '/'), "", $file) == "94") {
echo 'onclick="darkmodestart()"';
               }
               if(str_replace(array($dir, '/index', '.txt', '/'), "", $file) == "101") {
echo 'onclick="launchSicherheitsGigantFireworkOnce();launchSicherheitsGigantFireworkOnce()"';
               }
            echo '>';
            echo $h2Inner
               . "</div></li>";

            // Alternativ nur echo:
            // echo $h2Id . ' :: ' . $h2Inner . "\n";
            $fpreachcounter++;
        }
    }
$fpreachcounterstart++;
    }
    }
    /*$matchesnew = array_slice($matchesnew, 0, 65);
    //var_dump($matchesnew);
    foreach ($matchesnew as $h2Inner) {
            // optional: Whitespace etwas säubern
            $h2Inner = trim($h2Inner);
            $h2Inner = str_replace("<br>", "", $h2Inner);
            $h2Inner = str_replace("*von §entinel vorlesen lassen?", "", $h2Inner);
            $h2Inner = str_replace("(", "", $h2Inner);
            $h2Inner = str_replace(")", "", $h2Inner);
            echo '<li><div id="ruegegabikiesslerfaehig" href="?v=0.01">' . $h2Inner . "</div></span></li>";
        }*/

}
//var_dump(array_reverse($videofiles));
//var_dump($lastArchivRange, $firstArchivRange, $anzArchivRange);
?>
</div>
<script type='text/javascript'>
<?php
$php_array = array_reverse($videofiles);
$js_array = json_encode($php_array);
echo "var javascript_array = ". $js_array . ";\n";
?>
//console.log(javascript_array);
</script>
<div id="efak">EINZELAKTEN:</div>

<li class="falllinkslinks" style="color: cornflowerblue;"><a href="gabi_reimer_geb_kiessler.php">1. Hauptrolle Gabi Kießler - notorische Lügnerin</a></li>
<li class="falllinkslinks" style="color: cornflowerblue;"><a href="lothar_kiessler.php">2. Hauptrolle Lothar Kießler (pensionierter Polizist) - Ehezerstörer</a></li>
<li class="falllinkslinks" style="color: cornflowerblue;"><a href="amtsgericht_tempelhof_kreuzberg.php">1. Nebenrolle Amtsgericht Tempelhof-Kreuzberg - Grundrechtmissachter</a></li>
<li class="falllinkslinks" style="color: cornflowerblue;"><a href="rewe_handelsunternehmen.php">2. Nebenrolle REWE - eines der größten Handelsunternehmen Deutschlands</a></li>


<div id="efakn">Sicherheitsüberwachung:</div>
<li class="sozialmedialinks" style="color: cornflowerblue;"><a href="mailto:kontakt@taubenfreundschaft.de">kontakt (at) taubenfreundschaft.de</a></li>

<li class="sozialmedialinks" style="color: cornflowerblue;" id="showyoutube"><a target="_blank" href="https://www.youtube.com/@sicherheitsgigant">@SicherheitsGIGANT YouTube</a></li>
<li class="sozialmedialinks" style="color: cornflowerblue;" id="showFacebook"><a target="_blank" href="http://facebook.com/SicherheitsGIGANT">@SicherheitsGIGANT Facebook</a></li>
<li class="sozialmedialinks" style="color: cornflowerblue;" id="showInsta"><a target="_blank" href="https://www.instagram.com/sicherheitsgigant">@SicherheitsGIGANT instagram</a></li>
<li class="sozialmedialinks" style="color: cornflowerblue;" id="showTikTok"><a target="_blank" href="https://www.tiktok.com/@taubenfreundschaft">@SicherheitsGIGANT TikTok</a></li>
<li class="sozialmedialinks" data-url="./video/sicherheitsGigantYoutubeGo.mp4" id="showVideoLink558894">Alle aktuellen Action Header</li>
<div id="efakn">Unser Hashtag:</div>
<li data-url="#" id="unser_hashtag">#wirgehendadurchwieeinpamzer</li>
</ul>

            <ul id="alllinks" style="display:none;">
              <div id="efak_p"><a href="./">🏠 POSTSTELLE:</a></div>
              <br><br><br>
              <div id="pintrueartikel">
                <div id="angepintes">Angepinte Post:</div>
                <div id="diviconpin">🧷</div>
                <li><div id="neuhausskiesslerende" href="?v=0.01"><strong id="<neuhausskiesslerende" style="color:red">Offenlegung</strong> - WIR ZEIGEN EUCH DIE GANZE WAHRHEIT!!!</div><span data-url="./video/unwiderlegbarebeweise.mp4" id="showVideoLink8456264" title="Beitrags-Video starten..."></span></li>
              </div>
              <div id="efak_p"><a href="./">Posteingang:</a></div>
<li><div id="ruegegabikiesslerfaehig" href="?v=0.01">Wie würdet ihr einen plötzlichen Rollentausch finden? – <strong id="ruegegabikiesslerfaehig" style="color:red">no Sex 😂</strong> </div><span data-url="./video/gabiinderpflicht.mp4" id="showVideoLink845dgre" title="Beitrags-Video starten..."></span></li>
<li><div id="vorweihnachtsgruessemitsuche" href="?v=0.01">Vertrauen einer großen Stimme! <strong id="vorweihnachtsgruessemitsuche" style="color:red">Search on Google</strong></div><span data-url="./video/vorweihnachtsgruessemitpost.mp4" id="showVideoLink8456264" title="Beitrags-Video starten..."></span></li>
<li><div id="lotharkiesslerschuldig" href="?v=0.01">Hat der Puppenspieler Lother Kießler seine Schuld eingestanden? - <strong id="lotharkiesslerschuldig" style="color:red">Yes, we think so.</strong> </div><span data-url="./video/derPuppenspieler.mp4" id="showVideoLinkerg264" title="Beitrags-Video starten..."></span></li>
<li><div id="mywayto2026" href="?v=0.01" onclick="darkmodestart()">Mein Weg bis zum 19.12.2025 – <strong id="mywayto2026" style="color:red">Protocol: Orion Blackout</strong></div><span data-url="./video/finibeschmutzt.mp4" id="showVideoLink87sdf4rt4" title="Beitrags-Video starten..."></span></li>
<li><div id="weinachtsgruese" href="?v=0.01">Hausschuhe geschmeckt und beruhigt?<strong id="weinachtsgruese" style="color:red">Vorweihnachtsgrüße</strong> </div><span data-url="./video/reboot2026v2.mp4" id="showVideoLink87sdffgre4" title="Beitrags-Video starten..."></span></li>
<li><div id="neuhaussversuch4lol" href="?v=0.01">Neuer Scheidungstermin 07.01.2026, meine Antwort ans OLG und AG hier zu lesen…<strong id="neuhaussversuch4lol" style="color:red">next failt</strong> </div><span data-url="./video/gabischauhin.mp4" id="showVideoLink87sr43t4" title="Beitrags-Video starten..."></span></li>
<li><div id="ichsagegebtmirdieschuld" href="?v=0.01">Jeden Tag geht hier eine Familie einen Schritt weiter… connection failt – <strong id="ichsagegebtmirdieschuld" style="color:red">Error, lost connection to peer</strong></div><span data-url="./video/schutzfamilie.mp4" id="showVideoLink87ssd43t4" title="Beitrag Video starten..."></span></li>
<li><div id="findsystemvirus" href="?v=0.01">Wenn der Zwang einen die Wahl nimmt – <strong id="findsystemvirus" style="color:red">Virus localized - UPDATE</strong></div><span data-url="./video/zeIge_einsicht.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="gabifacebookehe" href="?v=0.01">Die eine zeigt nach außen wie toll es einen geht und der andere – <strong id="gabifacebookehe" style="color:red">total destruction - UPDATE VKH Beschluss!</strong></div><span data-url="./video/wutladyred.mp4" id="showVideoLink87sd548324" title="Beitrag Video starten..."></span></li>
<li><div id="derpuppenspierteil2" href="?v=0.01"><strong id="derpuppenspierteil2" style="color:red">DER PUPPENSPIELER - Teil 2</strong> – Lasst uns nochmals in Erinnerung rufen wie stark Lothar K. alles lenkte.</div><span data-url="./video/wutlad.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="zumwohlderkinder" href="?v=0.01"><strong id="zumwohlderkinder" style="color:red">foreach-break</strong> – Hinter Anonymität verstecken und trotzdem Position und Ziel zeigen.</div><span data-url="./video/wutladyred.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="anonymisaVirus" href="?v=0.01"><strong id="anonymisaVirus" style="color:red">anonym is a Virus</strong> – Da wird einer ohne Namen zum Thema dieser Seite…</div><span data-url="./video/halkwutwaage.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="dasbinnichtich" href="?v=0.01"><strong id="dasbinnichtich" style="color:red">Das Trojanische Pferd</strong> – der böse Virus im System, oder eine sagenumwobene Geschichte?</div><span data-url="./video/wirsindonline.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="anonymresponse" href="?v=0.01"><strong id="anonymresponse" style="color:red">response to anonym</strong> - Weihnachten mit neuen Regeln und einer Antwort...</div><span data-url="./video/schutzschild.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="oeffentlicheaussageabschnitt33" href="?v=0.01"><strong id="oeffentlicheaussageabschnitt33" style="color:red">Das Trojanische Pferd</strong> - Die Polizei "Abschnitt 33" will meine Aussage und werden feststellen, dass sie diese bereits haben...</div><span data-url="./video/trojanischespferd.mp4" id="showVideoLinker4564" title="Beitrags-Video starten..."></span></li>
<li><div id="derpupenspielerlkiessler" href="?v=0.01"><strong id="derpupenspielerlkiessler" style="color:red">SYSTEM-ANALYSE: DER PUPPENSPIELER (Lothar K.)</strong> und das Bermudadreieck für meine eingereichten Schreiben...</div><span data-url="./video/stadtschutz0.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="muellerschreibenkiller" href="?v=0.01"><strong id="muellerschreibenkiller" style="color:red">Sorry ich konnte nicht anders!</strong> Neue Post zum Aktenbereinigen erhalten!</div><span data-url="./video/nichtwegehenmp4.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="dienachbrnrufen" href="?v=0.01"><strong id="dienachbrnrufen" style="color:red">BERLIN SCHAUT WEG!</strong> Holen wir die anderen Bundesländer mit an den runden Tisch! (IN ARBEIT)</div><span data-url="./video/stadtschutz0.mp4" id="showVideoLink87il324" title="Beitrag Video starten..."></span></li>
<li><div id="endschlagneuhausskiessler" href="?v=0.01"><strong id="endschlagneuhausskiessler" style="color:red">SYSTEM-ERROR - GEFAHR:</strong> Richterin Neuhauß & Lothar Kießler haben vorsätzlich </strong> <strong id="endschlagneuhausskiessler" style="color:red">1 Jahr das wohl einer minderjährigen gefährdet!</strong></div><span data-url="./video/denkeandeinenschwur.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="derprozessgeist" href="?v=0.01">Da sitzt man so rum und denkt etwas nach und plötzlich - <strong id="derprozessgeist" style="color:red">USER NOT FOUND. SYSTEM CORRUPTED.</strong></div><span data-url="./video/schauhin.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="antwort1recchnungshof" href="?v=0.01"><strong id="antwort1recchnungshof" style="color:red">BreakingNews</strong> <strong id="antwort1recchnungshof">Schaut her der Rechnungshof ist ein Profi!</strong></div><span data-url="./video/rechnungshofberlin.mp4" id="showVideoLink87sdew324" title="Beitrag Video starten..."></span></li>
<li><div id="diesteuerschleuder" href="?v=0.01"><strong id="diesteuerschleuder" style="color:red">AUDIT-BERICHT:</strong> <strong id="diesteuerschleuder">STEUERVERSCHWENDUNG</strong></div></li>
<li><div id="systemresetstart" href="?v=0.01"><strong id="systemresetstart" style="color:red">SYSTEMABSTURZ!</strong> AUFRUF AN DIE EXEKUTIVE: SCHÜTZEN SIE DIE KINDER VOR DER JUDIKATIVE!</div></li>
<li><div id="dasitztweraufdemtoepchen" href="?v=0.01"><strong id="dasitztweraufdemtoepchen" style="color:red">SYSTEM-AUDIT:</strong> IST DIE FÜHRUNGSEBENE KOMPROMITTIERT?</div></li>
<li><div id="zahlensprechen" href="?v=0.01"><strong id="zahlensprechen" style="color:red">INCIDENT REPORT 🚨</strong> Der Moment wo Kinder Gesetze lernen um sich vor Beamten zu schützen...</div></li>
<li><div id="reimerzurueck" href="?v=0.01">Ihr wollt den alten Reimer zurück?</div></li>
<li><div id="roundtablesnachricht" href="?v=0.01">Nachricht an den virtuellen Runden Tisch, ist bereits mit der Softwre versendet und hier nochmals für euch</div></li>
<li><div id="krankesland" href="?v=0.01">Nächter Beschluss einer Befangenen Richterin - 5 Tage HAFT!</div></li>
<li><div id="gespraechstarten" href="?v=0.01">Ich nenne es Ausnutzung von zu viel Macht und Ihr? <strong id="gespraechstarten" style="color:red">Der VKH Betrugsverdacht 🚨</strong></div></li>
<li><div id="eilantragneuhauss" href="?v=0.01">Eilantrag Bundesverfassungsgericht - HALTET NEUHAUß AUF!!!</div></li>
<li><div id="diefluchtvorneuhauss" href="?v=0.01">Die Flucht vor einer Richterin Außer Kontrolle aus der eigenen Wohnung - HALTET NEUHAUß AUF!!!</div></li>

<hr id="oldamdnew">

<li><div id="neueerkenntniss" href="?v=0.01">UPDATE Coming soon - Dienstag 18 Uhr, wird es ein neus Aktenzeichen geben, oder geht alles auf Richterin Neuhauß Ihren Nacken?</div></li>

<li><div id="warumzahlenwirdafuer" href="?v=0.01">Warum zahlen wir dafür? <strong id="warumzahlenwirdafuer" style="color:red"> Vorsatz kostet den Steuerzahler auch 🚨</strong></div></li>
<li><div id="neuhaussmalwieder" href="?v=0.01">Frau Neuhauß sie können es wirklich nicht lassen und gehen hier die heftigsten Wege überhaupt, richtig?</div></li>
<li><div id="jurapsydienstnachricht" href="?v=0.01">Ihr kennt noch den Beitrag: Ach kommt schon, ist euch das nicht langsam zu doof???</div></li>
<li><div id="dieabrechnungmitpreis" href="?v=0.01">OFFIZIELLE ANKÜNDIGUNG KLAGE-WERT ERHÖHUNG GEGEN Das Land BERLIN!</div></li>
<li><div id="psydienstnachricht" href="?v=0.01">Ach kommt schon, ist euch das nicht langsam zu doof???</div></li>
<li><div id="neuerrichteramstart" href="?v=0.01">JETZT MAL ERNSTHAFT LEUTE... Wollt Ihr mich hier alle ein wenig testen?</div></li>
<li><div id="amtsklageready" href="?v=0.01">PRESSEINFORMATION – November 2025 Wir haben die Verfassungsbeschwerde und Amtshaftungsklage gegen das Land Berlin eingereicht!</div></li>
<li><div id="dernaechstestreich" href="?v=0.01">Es ist ja in letzter Zeit öfter so, dass ich zwischen dem einen oder anderen Projekt dann über das Schreiben nachdenke, das ich von der Priorität her eher weiter hinten einordne.</div></li>
<li><div id="paarworteandiepraesidentin" href="?v=0.01">Frau Präsidentin Abel, wissen Sie was, auch bei Ihnen möchte ich mir gerne eine Gedankennotiz machen um das nur mal klar zu machen, dass ich auch in Ihren handeln ein Versagen sehe!</div></li>
<li><div id="wassolltemanaendern" href="?v=0.01">Kleine Gedankenstütze für mich um nicht zu vergessen, worum es ja hier auch mit geht und was aus einer eigentlich zu annullierenden Ehe entstanden ist!</div></li>
<li><div id="bverfgkenntnis" href="?v=0.01">Ja man könnte fast behaupten es geht nun in den zweiten Akt und die Bühne ist bereit für die zivilrechtliche Geschichte...</div></li>
<li><div id="verfzweiterunde" href="?v=0.01">Wie ja bereits auf Facebook angekündigt, haben wir Antwort und sind offiziell auf dem Bundesverfassungsgericht angekommen...</div></li>
<li><div id="jugenadamtterin" href="?v=0.01">Es gibt noch Ämter und Beamte mit Herz ❤️</div></li>
<li><div id="rewesmasche" href="?v=0.01">Hey Rewe, ist das heutzutage so eine Masche? <strong>Nachtrag!</strong></div></li>
<li><div id="dergrinschaergertsich" href="?v=0.01">Wer versucht denn dort für neue Freunde zu sorgen? </div></li>
<li><div id="anwaltjaodernein" href="?v=0.01">Was tun wenn der Panzer unaufhaltsam rollt und man sich anfängt zu Fragen, Anwalt, ja oder nein und </div></li>
<li><div id="scheidunggeplatzt" href="?v=0.01">Ähm hatte ich schon mal irgendwann erwähnt das es keine Scheidung geben wird?</div></li>
<li><div id="besuchbeirewe" href="?v=0.01">Es sind nicht nur meine Töchter. Es sind auch meine 2 Schutzengel! UPDATE wegen Leser...</div></li>
<li><div id="stilometrischeAnalyse" href="?v=0.01">Warum eigentlich nicht einen Schritt weitergehen? Manche Ideen sind einfach kein Zufall.</div></li>
<li><div id="einfachnoetigfuerdas" href="?v=0.01">Man könnte sagen, der weiß nicht was er tut und dann kommt so was...</div></li>
<li><div id="notfallundordnungsgeldokay" href="?v=0.01">Jetzt hat es mich wirklich auch mal interessiert...</div></li>
<li><div id="einschaetungolgschreiben" href="?v=0.01">Entscheidet selbst... War das ein Erfolg oder war es keiner?</div></li>
<li><div id="nachrichtandoc" href="?v=0.01">Nach den vergessenen Geburtstagsgrüßen eine Nachricht an einen Doktor... <strong>UPDTATE: mit Antwort</strong></div></li>
<li><div id="zusammenfassung07112025" href="?v=0.01">Jede Woche aufs Neue, Schreiben über Schreiben…</div></li>
<li><div id="antragolgmail" href="?v=0.01">Okay kleine Korrektur zum Post von gestern... Witzig aber überraschend...</div></li>
<li><div id="parworteohnetext" href="?v=0.01">Mal ein paar Worte ohne den dazugehörigen Text...Text...</div></li>
<li><div id="derbriefkasten" href="?v=0.01">Der Briefkasten hat eine Überraschung gebracht!</div></li>
<li><div id="derredbutton" href="?v=0.01">Schutz der Seite wurde auf ein maximum aufgebaut!</div></li>
<li><div id="kleineuebersicht" href="?v=0.01">Ein Einblick in die Anzahl an Dokumente, die so rein und raus gegangen ist.</div></li>
<li><div id="einpaarwortezualldem" href="?v=0.01">Eine Erklärung zum Verständnis meiner Entscheidung zur Veröffentlichung V2</div></li>
<li><div id="updatezurfallakte" href="?v=0.01">Juristische Einschätzung zum Umbau vom Blog zur Fallakte</div></li>

</ul>

<strong class="falllinkslinks">Letztes Update der Startseite:<br>
        <?php

// Checking the contents of a
// file last time changed
echo date("d F Y H:i:s", filemtime("index.php")) . " Uhr</strong>";
?></strong><br><br>
<strong class="falllinkslinks">Securitygiant-BreakingNews<br>
The next Level is comming soon<br>
mega started to look<br>
It's not just one, it's legion.<br>
WE ARE ONLINE
</strong>
        </section>
<section id="sectionright">
<div class="bottombox" id="infostobottom">
                  <div class="playlistOfSeninel" aria-label="Playlistgenerator"></div>
                  <div class="textZoom" aria-label="Textgröße">
              <button class="theme-toggle" onclick="toggleTheme()">
      <span id="theme-icon">🌙</span>
    </button>
  <button type="button" id="txtPlus" aria-label="Text größer">A+</button>
  <button type="button" id="txtReset" aria-label="Text normal">A</button>
  <button type="button" id="txtMinus" aria-label="Text kleiner">A−</button>
</div>
<div class="pdfdownloadArticle" title="Beitrag als PDF Downloaden"></div>
<div class="videocontrolerOfSeninel" aria-label="Videocontrols"></div>
</div>
<?php
$datei = __DIR__ . '/vorgangsnummer.txt';
$vorgang = file_exists($datei) ? trim(file_get_contents($datei)) : '';
if($vorgang) { echo '<h1 style="color:red">🚨 Alarmstufe Rot - DAS IST KEINE ÜBUNG!</h1><h2><a href="https://sicherheitsgigant.de/index.html">HIER KLICKEN FÜR ALLE INFOS!!!</a></h2>'; } else { echo ""; }

if(explode("/", $_SERVER['REQUEST_URI'])[1] != "archiv" AND explode("/", $_SERVER['REQUEST_URI'])[1] != "") {
//var_dump($idofsitesstart);
}
if(explode("/", $_SERVER['REQUEST_URI'])[1] != "archiv" AND explode("/", $_SERVER['REQUEST_URI'])[1] != "") {
?>
<div id="artikel">
<?php 
$file = $dir . '/index'.$idofsitesstart.'.txt';
//echo str_replace('<div id=','<div id=',str_replace("*von ","*",file_get_contents($dir . '/index'.$idofsitesstart.'.txt'))) . "\n"; 
        $content = file_get_contents($file);
        // ID + Titel aus dem Artikel ziehen
        $h2id   = extractH2Id($content);
        $title  = extractH2Title($content);

        // Fallbacks
        if ($h2id === '') $h2id = basename($file, '.txt');
        if ($title === '') $title = 'Sicherheitsgigant';

        $articleUrl = 'https://sicherheitsgigant.de/' . $h2id;

        $shareTop = renderShareBox($articleUrl, $title);
        $shareBottom = renderShareBox($articleUrl, $title);

    if (preg_match_all('~<h2\b([^>]*)>(.*?)</h2>~is', $content, $matches, PREG_SET_ORDER)) {
      $fpreachcounter = 0;  
      foreach ($matches as $m) {
            $attrString = $m[1];      // z.B.  id="beitrag123"
            $h2Inner    = trim($m[2]);

            // ID aus Attributen extrahieren
            $h2Id = null;
            if (preg_match('~\bid\s*=\s*["\']([^"\']+)["\']~i', $attrString, $idMatch)) {
                $h2Id = $idMatch[1];
            }
            $h2tagdata = null;
            if (preg_match('~\bdata-linktags\s*=\s*["\']([^"\']+)["\']~i', $attrString, $idMatchs)) {
                $h2tagdata = $idMatchs[1];

$nextarticledata = '<ul id="alllinks"><div id="ulheader">Weitere Beiträge mit ählichen Thema:</div>';
                foreach(explode(";", $h2tagdata) as $nextiddatas) {
$filenext = $dir . '/index'.$nextiddatas.'.txt';
//echo str_replace('<div id=','<div id=',str_replace("*von ","*",file_get_contents($dir . '/index'.$idofsitesstart.'.txt'))) . "\n"; 
$contentnext = file_get_contents($filenext);
    if (preg_match_all('~<h2\b([^>]*)>(.*?)</h2>~is', $contentnext, $matchesnext, PREG_SET_ORDER)) {
      $fpreachcounter = 0;  
      foreach ($matchesnext as $mnext) {
            $attrStringnext = $mnext[1];      // z.B.  id="beitrag123"
            $h2Innernext    = trim($mnext[2]);

            // ID aus Attributen extrahieren
            $h2Idnext = null;
            if (preg_match('~\bid\s*=\s*["\']([^"\']+)["\']~i', $attrStringnext, $idMatchnext)) {
                $h2Idnext = $idMatchnext[1];
            }
          }
        }
// ID + Titel aus dem Artikel ziehen
$h2idnext   = extractH2Id($contentnext);
$titlenext  = extractH2Title($contentnext);

// Fallbacks
if ($h2idnext === '') $h2idnext = basename($filenext, '.txt');
if ($titlenext === '') $titlenext = 'Sicherheitsgigant';
$h2Innernext = str_replace("*von §entinel vorlesen lassen?", "", $h2Innernext);
$articleUrlnext = 'https://sicherheitsgigant.de/' . $h2idnext;
$nextarticledata .= '<li class="is-in"><div data-indexid="50" class="h2-preview" ' . $attrStringnext . '">' . $h2Innernext . '</div></li>';
                }
$nextarticledata .= '</ul>';
//var_dump($nextarticledata);
            }
        }
        }
//echo $nextarticledata;
        // Share unter H2 + am Ende einfügen
        $content = injectAfterH2($content, $shareTop);
        $content = injectBeforeArticleEnd($content, $nextarticledata);
        $content = injectBeforeArticleEnd($content, $shareBottom);
        $content = str_replace("<span ", '<span title="📣 *§entinel vorlesen lassen?" data-indexid="'.str_replace(array($dir, 'index', '.txt', '/', "varwwwsicherheitsgigantArchiv"), "", $file).'"', $content);
        // dein display-none Hack bleibt
        echo str_replace(
            array('<div id=', '(', ')'),
            array('<div id=', '', ''),
            str_replace("*von ","📣 *",$content)
        ) . "\n";
?></div>
<script>
  window.onload = function() {
console.log(document.querySelector("#artikel").getBoundingClientRect().top);
    const ankerName = 'artikel'; 
    if(document.querySelector("#artikel").getBoundingClientRect().top > 0) {
    $('body,html').animate({
      scrollTop: Math.abs(document.querySelector("#artikel").getBoundingClientRect().top)
    }, 800);
    // window.location.hash = ankerName; // Dies setzt den Hash und löst den Sprung aus.
    // Oder besser, wenn der Anker dynamisch hinzugefügt wird:
    //document.addEventListener('DOMContentLoaded', () => {
        // Sucht nach dem Element, nachdem DOM geladen wurde, aber nicht alles (Bilder etc.)
        const ankerElement = document.getElementById(ankerName);
        if (ankerElement) {
            // Scrollt sanft zum Element
            //ankerElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }
    //});
}
    function esc(s){ return String(s ?? ''); }
 const isMobile = () => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);

  let currentUrl = '';

  document.addEventListener('click', function(e){
    const btn = e.target.closest('.share-instagram');
    if (!btn) return;

    currentUrl = btn.dataset.url;

    navigator.clipboard.writeText(currentUrl).then(() => {
      const overlay = document.getElementById('igOverlay');
      if (overlay) {
        overlay.style.display = 'flex';
      }
    });
  });

  const igOverlay = document.getElementById('igOverlay');
  const igCloseBtn = document.getElementById('igCloseBtn');
  const igOpenBtn = document.getElementById('igOpenBtn');

  if (igOverlay && igCloseBtn && igOpenBtn) {
    igCloseBtn.addEventListener('click', () => {
      igOverlay.style.display = 'none';
    });

    igOpenBtn.addEventListener('click', () => {
      igOverlay.style.display = 'none';

      if (isMobile()) {
        // versucht App zu öffnen
        window.location.href = 'instagram://app';

        // Fallback nach 800ms
        setTimeout(() => {
          window.open('https://www.instagram.com/', '_blank');
        }, 800);
      } else {
        // Desktop → Web
        window.open('https://www.instagram.com/', '_blank');
      }
    });
  }
  document.querySelectorAll('[data-share]').forEach((box) => {
    const url   = box.getAttribute('data-share-url')   || window.location.href;
    const title = box.getAttribute('data-share-title') || document.title;
    const text  = document.querySelector('meta[property="og:description"]')?.content || '';

    const btnNative = box.querySelector('.share-native');
    if (btnNative) {
      btnNative.addEventListener('click', () => {
        if (navigator.share) {
          navigator.share({ title, text, url }).catch(()=>{});
        } else {
          // Fallback: WhatsApp öffnen (wirkt am Handy am besten)
          window.open('https://wa.me/?text=' + encodeURIComponent(title + ' – ' + url), '_blank', 'noopener');
        }
      });
    }

    const aWA = box.querySelector('.wa');
    if (aWA) aWA.href = 'https://wa.me/?text=' + encodeURIComponent(title + ' – ' + url);

    const aTG = box.querySelector('.tg');
    if (aTG) aTG.href = 'https://t.me/share/url?url=' + encodeURIComponent(url) + '&text=' + encodeURIComponent(title);

    const aFB = box.querySelector('.fb');
    if (aFB) aFB.href = 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(url);

    const aX = box.querySelector('.x');
    if (aX) aX.href = 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(url) + '&text=' + encodeURIComponent(title);

    const btnCopy = box.querySelector('.share-copy');
    if (btnCopy) {
      btnCopy.addEventListener('click', async () => {
        try {
          await navigator.clipboard.writeText(url);
          btnCopy.textContent = '✅ Kopiert';
          setTimeout(() => btnCopy.textContent = '📋 Link kopieren', 1200);
        } catch {
          prompt('Link kopieren:', url);
        }
      });
    }
  });
};
</script>
<?php
} 
if(explode("/", $_SERVER['REQUEST_URI'])[1] == "archiv" AND explode("/", $_SERVER['REQUEST_URI'])[1] != "") {
?>
ARCHIV
<?php
}
?>
<div id="plaeceholderdiv"></div>
<div id="startsitediv">

 <h1>Zugriff verweigert? Nein. Zugriff erzwungen.<br><span data-url="./video/homestartvideo.mp4" id="showVideoLink">📣 *§entinel vorlesen lassen?</span></h1>
<h2>Sie wurden von Taubenfreundschaft.de hierher umgeleitet. Das ist kein technischer Fehler. Das ist eine notwendige Sicherheitsmaßnahme.
Was ist passiert?
</h2>
        <h2>UPDATE: die Fallakte - wurde an die höchste Instanz für Recht und Sicherheit abgegeben!</h2>
        <p><strong>Skandal – wir geben der wahren Geschichte vom Amtsgericht-Kreuzberg-Skandal die nötige Reichweite, Aufmerksamkeit und Technik um dafür zu sorgen, dass hier niemand mehr wegsieht!</strong></p>
<p>
Wir haben als Beobachter begonnen. Wir dachten, wir dokumentieren einen bizarren Nachbarschaftsstreit und ein paar Fehler im Amtsgericht. Ein bisschen Satire, ein bisschen Kopfschütteln. Wir nannten es "Taubenfreundschaft".<br>
Aber die Situation hat sich geändert.<br>
Wenn Richter Gesetze brechen, um Termine zu erzwingen...<br>
Wenn Polizisten Minderjährigen erklären, Kokain sei harmlos...<br>
Wenn Akten manipuliert und Postpakete offen versendet werden...<br>
...dann ist das keine Satire mehr. Das ist ein Systemabsturz.<br>
Ein "Taubenfreund" füttert Vögel. Ein Sicherheitsgigant schützt die Infrastruktur. Und die Infrastruktur unseres Rechtsstaats wird gerade massiv angegriffen – von innen.<br>
</p>
<p>
Unsere Mission ab heute:<br>
Überwachung: Wir scannen jeden Beschluss, jede Verfügung und jedes Protokoll auf Fehler im Quellcode des Rechts.<br>
Dokumentation: Nichts verschwindet mehr. Kein "verlorenes Fax", kein "vergessener Widerspruch". Wir sind das Backup.<br>
Schutz: Wir schützen die Opfer dieses Systemfehlers (die Kinder) mit der Reichweite der Öffentlichkeit.<br>
An die Verantwortlichen im Verteiler:<br>
Betrachten Sie diese Seite nicht mehr als Blog eines Vaters.<br>
Betrachten Sie sie als Audit-Log Ihres Versagens.<br>
Wir sind online.<br>
</p>
<h1>ACHTUNG, WIR WENDEN UNS AN DIE REGIERUNG UND FORDERN!</h1>
<strong>Vorab: Alle Aussagen die ich hier mache, sind nach meiner vollen Überzeugung, die Wahrheit!</strong>
<section class="fallakte-vorwort">
  <style>
    h1, h2, h3 {
color: #434343;
}
    .fallakte-vorwort h2 {
      color: #c0392b;
      font-size: 1.6rem;
      margin-bottom: 12px;
      text-transform: uppercase;
      letter-spacing: 1px;
      text-align: center;
    }

    .fallakte-vorwort p {
      margin: 12px 0;
      text-align: justify;
    }

    .fallakte-vorwort ul {
      list-style-type: "§ ";
      margin-left: 25px;
      margin-top: 10px;
      color: #444;
    }

    .fallakte-vorwort strong {
      color: #000;
    }

    .fallakte-vorwort .abschluss {
      margin-top: 20px;
      padding-top: 10px;
      border-top: 1px solid #ccc;
      font-style: italic;
      color: #555;
    }
  </style>

  <p>
     <h2><strong>OFFIZIELLE BEWEISAKTE: ANRUFUNG DES BUNDESVERFASSUNGSGERICHTS UND DER GENERALSTAATSANWALTSCHAFT</strong></h2>
  </p>
<p>
Vorab: Alle hier veröffentlichten Dokumente, forensischen Auswertungen und Aussagen entsprechen der absoluten Wahrheit, sind durch originäre Beweismittel belegt und dienen der Aufdeckung eines strukturellen Justizversagens.<br><br>
Vorwort zur Fallakte: C. Reimer vs. G. Kießler und die Berliner Justiz<br>
Diese Seite dokumentiert den Verlauf eines außergewöhnlichen Familien- und Justizverfahrens, das die Grenzen des Rechtsstaates überschritten hat. Da mir durch faktische Rechtsverweigerung, das Ignorieren medizinischer Notlagen und den absoluten Anwaltszwang der Zugang zu einem fairen Verfahren systematisch verwehrt wurde, sehe ich mich gezwungen, den gesamten Vorgang öffentlich, chronologisch und transparent zu dokumentieren.<br>
WICHTIGER JURISTISCHER HINWEIS (ZENSUR- UND LÖSCHSCHUTZ):<br>
Diese Webseite und alle hier abrufbaren Dokumente sind integraler Bestandteil und offizielles Beweismaterial der laufenden Verfassungsbeschwerde vor dem Bundesverfassungsgericht in Karlsruhe sowie der strafrechtlichen Ermittlungen bei der Generalstaatsanwaltschaft Berlin (Az. 271 Js 594/26) wegen schweren Prozessbetrugs, Urkundenfälschung und Rechtsbeugung.
Jeder zivilrechtliche oder außergerichtliche Versuch, diese Dokumentation zu zensieren, offline zu nehmen oder zu manipulieren, stellt einen direkten Eingriff in laufende verfassungsrechtliche und strafrechtliche Ermittlungsverfahren dar und wird den obersten Bundesbehörden als Beweisvereitelung (§ 258 StGB) gemeldet.<br>
Zweck der Veröffentlichung:<br>
Diese Veröffentlichung dient nicht der Diffamierung, sondern der Wahrheitsfindung, der Transparenz und dem Schutz der Grundrechte meiner Kinder und mir. Ich handle hierbei in Ausübung meiner Meinungsfreiheit (Art. 5 GG), meines Rechts auf wirksamen Rechtsschutz (Art. 19 Abs. 4 GG) sowie im berechtigten Interesse (§ 193 StGB).
Personen und Institutionen, die unmittelbar als Täter, Mittäter oder staatliche Organe an den nachgewiesenen Grundrechtsverletzungen beteiligt sind, werden aufgrund der absoluten Notwendigkeit für die Ermittlungsbehörden und zur Vermeidung von Verwechslungen mit ihrem vollen Namen und ggf. ihrer beruflichen Funktion genannt.<br>
Gegendarstellung:<br>
Jede betroffene Person oder Institution erhält das Recht auf Gegendarstellung. Diese kann an kontakt@taubenfreundschaft.de gesendet werden. Entsprechende Stellungnahmen werden transparent veröffentlicht und in den jeweiligen Artikeln ergänzt.<br>
Diese Fallakte steht unter dem absoluten Schutz folgender Grundrechte und Gesetze:</p>
<li>Art. 19 Abs. 4 GG – Recht auf effektiven Rechtsschutz (Der Auslöser dieser Akte)</li>
<li>Art. 5 GG – Meinungsfreiheit und Informationsfreiheit</li>
<li>Art. 6 GG & § 1666 BGB – Schutz von Familie und das staatliche Wächteramt (Kindeswohl)</li>
<li>Art. 20 Abs. 3 GG – Rechtsstaatsprinzip</li>
<li>Art. 103 GG – Rechtliches Gehör</li>
<li>Art. 2 Abs. 2 GG – Schutz der körperlichen Unversehrtheit</li>
<li>Art. 6 EMRK – Recht auf ein faires Verfahren</li>
<li>§ 193 StGB – Wahrnehmung berechtigter Interessen</li>
<li>§ 32 StGB – Notwehr (Abwehr gegen existenzvernichtende Gerichtsverfahren)</li>
<li>§ 244 Abs. 2 StPO & § 286 ZPO – Pflichten zur Sachverhaltsaufklärung</li>
  </ul>
<p class="abschluss">Diese Fallakte ist kein Ausdruck von Wut. Sie ist ein Akt der juristischen Notwehr mit den Mitteln der absoluten Transparenz – innerhalb der Grenzen des Grundgesetzes und im Vertrauen darauf, dass das Bundesverfassungsgericht und die Öffentlichkeit dort Gerechtigkeit erzwingen, wo geschlossene Türen am Amtsgericht sie verhindern.</p>
</section>
<div id="openbachrichtdiv">
<h1 id="openbachricht">Offener Brief: Wenn Recht schweigt, müssen wir laut werden<br><span data-url="./video/wasichfordere.mp4" id="showVideoLink">📣 *§entinel vorlesen lassen?</span></h1>
 
  <div class="hinweis">
    Dieser Beitrag ist Teil einer öffentlichen Initiative zur Aufarbeitung und Dokumentation von Missständen im deutschen Familien- und Gewaltschutzrecht. Wenn auch du betroffen bist: <strong>Bleib nicht leise.</strong>
  </div>
  <p>Ich schreibe diesen offenen Brief nicht aus einer Laune heraus. Ich schreibe ihn, weil ich – wie viele andere – das Vertrauen in ein System verliere, das eigentlich für Gerechtigkeit sorgen sollte. Ich schreibe ihn, weil ich Vater bin. Und weil meine Kinder und ich nicht mehr schweigen können.</p>

  <h2 id="wiekonnte">Wie konnte es so weit kommen?</h2>

  <p>Seit über 11 Monaten sehen wir uns massiven Angriffen und juristischen Maßnahmen ausgesetzt – eingeleitet durch eine Person, die nicht nur familiär belastet ist, sondern auch durch Suchtprobleme und emotionale Instabilität auffällt. Unterstützt wird sie dabei von einem ehemaligen Polizeibeamten, der offenbar seinen Eid auf das Gesetz längst vergessen hat.</p>

  <p>Ich habe mich verteidigt. Mit Worten. Mit Beweisen. Mit Zeugen. Mit Gutachten in Arbeit. Ich bin selbst in psychologischer Behandlung, weil ich krank geworden bin durch dieses Verfahren, das sich wie eine Waffe gegen uns richtet.</p>

  <blockquote>
    "Wie lange muss man leiden, bevor Hilfe kommt?"
  </blockquote>

  <h2 id="wasfordereich">Was fordere ich?</h2>

  <ul>
    <li>Eine unabhängige Prüfung der Prozessfähigkeit von Frau Gabi Kießler und Herr Lothar Kießler (einen pensionierten Polizist!)</li>
    <li>Eine unabhängige Prüfung auf Haftgründe gegen Frau Gabi Kießler und Herr Lothar Kießler (einen pensionierten Polizist!)</li>
    <li>Eine interne Überprüfung der Verfahrensführung durch die Berliner Justiz</li>
    <li>Eine politische Stellungnahme – denn hier wird Recht gebeugt durch Wegsehen</li>
  </ul>
  </div>
  </div>

  <style>

    blockquote {
      background: #f9f9f9;
      border-left: 5px solid #ccc;
      padding: 1em;
      margin: 1.5em 0;
      font-style: italic;
    }
    .hinweis {
      background: #fff3cd;
      border: 1px solid #ffeeba;
      padding: 1em;
      margin: 2em 0;
      color: #856404;
    }
    div#imagediver img {
    max-width: 32%;
}

  </style>
   
<!-- Vollartikel werden nicht mehr gesammelt unsichtbar in den Initial-DOM geschrieben.
   Sie werden bei Bedarf ueber article_fragment.php nachgeladen. -->



<!-- Widget-spezifisches CSS (keine Body-Styles) -->
<style>
  .cdx{border:1px solid #e6e6e9;border-radius:16px;padding:16px;margin:16px 0;background:#fff;box-shadow:0 2px 14px rgba(0,0,0,.06)}
  .cdx-h{display:flex;justify-content:space-between;gap:12px;align-items:baseline;margin-bottom:12px}
  .cdx-h strong{font-size:1.05rem}
  .cdx-h small {
    opacity: .7;
    color: red;
}
  .cdx-body{display:grid;gap:10px}
  .cdx-time{display:grid;grid-template-columns:repeat(4,minmax(70px,1fr));gap:8px}
  .cdx-time div{display:grid;justify-items:center;padding:8px;border:1px solid #eee;border-radius:12px}
  .cdx-time span {
    font-variant-numeric: tabular-nums;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 2.6rem;
    line-height: 1;
}
  .cdx-time label{font-size:.75rem;opacity:.7;margin-top:2px}
  .cdx-bar{height:8px;background:#f2f2f5;border-radius:999px;overflow:hidden}
  .cdx-bar span{display:block;height:100%;width:0%;background:linear-gradient(90deg,#d90429,#ff7a00);}
  .cdx.expired{border-color:#ffd6d6;background:#fff8f8}
  .cdx.expired .cdx-bar span{background:#d90429;width:100%}
  .cdx.expiring .cdx-time span{color:#d90429}
  .cdx-status{font-size:.9rem;opacity:.85}
  
 .cdx-time i.fire1 {
  animation-delay: 0.3333333333s;
}

 .cdx-time i.fire2 {
  animation-delay: 0.6666666667s;
}

 .cdx-time i.fire3 {
  animation-delay: 1s;
}

 .cdx-time i.fire4 {
  animation-delay: 1.3333333333s;
}

.cdx-time div span {
  font-size: 200%;
  font-weight: bold;
  animation: flaming 3s linear infinite;
  text-shadow: -2px -1px 2px purple, 2px -2px 2px blue, 2px -10px 20px white, 0 -2px 6px red, 2px -2px 10px white, 5px -10px 15px lightyellow, 8px -20px 20px yellow, 12px -30px 25px orange, 5px -60px 40px orange, 15px -34px 30px darkorange, 0px -36px 35px red, 40px -40px 50px red, -20px -60px 40px red, 20px -80px 40px red, 40px -80px 40px red, 20px -120px 60px red, 20px -150px 80px black, 50px -160px 80px black, 100px -200px 100px black, 120px -150px 100px black, 100px -100px 100px black, 120px -220px 100px black, 200px -300px 150px black;
}

@keyframes flaming {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.5);
  }
}

.breakngnewsmain {
    font-family: Arial;
    color: #fff;
    display: flex;
    display: -webkit-flex;
    flex-direction: column;
    -webkit-flex-direction: column;
    align-items: flex-end;
    -webkit-align-items: flex-end;
    justify-content: flex-end;
    -webkit-justify-content: flex-end;
    /* height: 100vh; */
    margin: 0;
    text-transform: uppercase;
    z-index: 100;
}

.breakngnewsmain {
    display: block;
    position: absolute;
    top: 15px;
    left: 0%;
    -webkit-flex-direction: row;
    justify-content: flex-end;
    -webkit-justify-content: flex-end;
    /* width: 100%; */
    transform: scale(0.65);
}

.breakngnewsmain .logo-area {
  height: 110px;
  width: 15%;
}

.breakngnewsmain .box-top, .box-bttm {
  display: block;
  margin-left: auto;
  margin-right: 20px;
  perspective: 1200px;
  perspective-origin: 50% 100px;
  width: 110px;
}

.breakngnewsmain .box-top {
  background: radial-gradient(80px 70px, #004 60%, transparent 61%, transparent);
  font-size: 24pt;
  line-height: 0.9em;
  height: 80px;
}

.breakngnewsmain .box-bttm {
  font-size: 14pt;
  font-weight: bold;
  text-align: center;
  text-transform: none;
  height: 30px;
  line-height: 1.6em;
  transform: scale(1, 0.85);
}

.breakngnewsmain .cube {
  position: relative;
  margin: auto;
  width: 110px;
  transform-style: preserve-3d;
}

.breakngnewsmain .cube div {
  position: absolute;
  width: 110px;
}

.breakngnewsmain .box-top .cube {
  animation: spin 60s linear infinite;
}
.breakngnewsmain .box-top .cube div {
  background: rgba(0, 48, 160, 0.5);
  border: 2px solid #cff;
  height: 80px;
  overflow: hidden;
}
.breakngnewsmain .box-top .cube svg {
  transform: translateY(-15px);
}

.breakngnewsmain .box-bttm .cube {
  animation: spin 15s cubic-bezier(0.25, 1, 0.45, 1) infinite;
  text-shadow: 0 0 4px #000;
}
.breakngnewsmain .box-bttm .cube div {
  background: radial-gradient(#800, #400);
  height: 30px;
}

.breakngnewsmain .back {
  transform: translateZ(-55px) rotateY(180deg);
}

.breakngnewsmain .right {
  transform: rotateY(-270deg) translateX(55px);
  transform-origin: top right;
}

.breakngnewsmain .left {
  transform: rotateY(270deg) translateX(-55px);
  transform-origin: center left;
}

.breakngnewsmain .front {
  transform: translateZ(55px);
}


@keyframes spin {
  0% {
    transform: rotateY(360deg);
  }
  25% {
    transform: rotateY(270deg);
  }
  50% {
    transform: rotateY(180deg);
  }
  75% {
    transform: rotateY(90deg);
  }
  100% {
    transform: rotateY(0deg);
  }
}
</style>

<!-- Countdown-Logik -->
<script>
/*(function(){
  const pads = n => String(n).padStart(2,'0');

  document.querySelectorAll('.cdx').forEach(card=>{
    const dl = card.getAttribute('data-deadline');
    const label = card.getAttribute('data-label') || 'Frist';
    const deadline = new Date(dl); // ISO mit Offset (+02:00) → robust
    const dEl = card.querySelector('.d');
    const hEl = card.querySelector('.h');
    const mEl = card.querySelector('.m');
    const sEl = card.querySelector('.s');
    const bar = card.querySelector('.cdx-bar span');
    const status = card.querySelector('.cdx-status');

    // Progress: von jetzt bis Deadline relativ aufspannen (Start = Script-Load)
    const start = new Date();

    function tick(){
      const now = new Date();
      const diff = deadline - now;

      if (diff <= 0){
        card.classList.add('expired');
        dEl.textContent = '0'; hEl.textContent = '00'; mEl.textContent = '00'; sEl.textContent = '00';
        status.textContent = `Frist „${label}“ ist abgelaufen.`;
        bar.style.width = '100%';
        return clearInterval(timer);
      }

      // Zeitblöcke
      const sec = Math.floor(diff/1000)%60;
      const min = Math.floor(diff/1000/60)%60;
      const hrs = Math.floor(diff/1000/60/60)%24;
      const days = Math.floor(diff/1000/60/60/24);

      dEl.textContent = days;
      hEl.textContent = pads(hrs);
      mEl.textContent = pads(min);
      sEl.textContent = pads(sec);

      // Optik: letzte 24h hervorheben
      if (diff < 24*60*60*1000) card.classList.add('expiring');

      // Fortschrittsleiste (linear)
      const total = deadline - start;
      const pct = Math.max(0, Math.min(100, 100 * (1 - diff/total)));
      bar.style.width = pct + '%';

      // Zusatzstatus
      status.textContent = days>0
        ? `Noch ${days} Tag${days===1?'':'e'}, ${pads(hrs)}:${pads(min)}:${pads(sec)}.`
        : `Heute läuft die Frist „${label}“ um ${deadline.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit', second:'2-digit'})} ab.`;
    }

    // Sofort rendern + Sekundentakt
    tick();
    const timer = setInterval(tick, 1000);
  });
})();*/
</script>
<!-- Archiv-Vollartikel werden ebenfalls erst bei Bedarf nachgeladen. -->

<script>
function sendSupportMail() {
  const name = document.getElementById('senderName').value.trim();
  const email = document.getElementById('senderEmail').value.trim();
  const custom = document.getElementById('customMessage').value.trim();

  // Empfänger
  const recipients = [
    "poststelle@senjustva.berlin.de",
    "investigativ@spiegel.de",
    "mail@verbraucherzentrale-berlin.de",
    "poststelle@sta.berlin.de"
  ];

  // Betreff
  const subject = encodeURIComponent(`Dringender Hinweis zu Justizverfahren Berlin – öffentliche Frist verstrichen`);

  // Standardtext
  let body = `Sehr geehrte Damen und Herren,\n\n` +
  `ich wende mich an Sie, da die von Herrn Christian Reimer gesetzte Frist zur öffentlichen Stellungnahme ` +
  `der involvierten Akteure (RA Tittel, L. Kießler, G. Kießler) am 19.10.2025 um 0:00 Uhr unbeantwortet verstrichen ist.\n\n` +
  `Herr Reimer hat daraufhin heute (19.10.2025, 14:50 Uhr) die unmittelbare Eskalation Richtung Verfassungsbeschwerde (Karlsruhe) ` +
  `angekündigt und öffentlich das Schweigen der Gegenseite als Schuldeingeständnis gewertet.\n\n` +
  `Zusammenfassung der aktuellen Lage:\n` +
  `- Fristablauf und Eskalation: Das Schweigen der Gegenseite wird als Bestätigung der schwerwiegenden Vorwürfe ` +
  `der Urkundenfälschung (gegen L. Kießler, pensionierter Polizist) und der Verfahrensmanipulation (durch Richterin Neuhauß) interpretiert.\n` +
  `- Ankündigung Karlsruhe: Herr Reimer hat den ersten Schritt in diese Richtung offiziell gemacht. Dies erhöht den Druck auf die Justizverwaltung ` +
  `und den Rechtsausschuss, vor einer Verfassungsbeschwerde zu handeln.\n` +
  `- Annullierungs-Aspekt: Die öffentliche Benennung von "Gabi Kießler" und die Erklärung, die Ehe-Annulierung sei nur noch eine Formalität, ` +
  `hat weitreichende juristische Konsequenzen für das gesamte Verfahren.\n\n` +
  `Dringende Aufforderung:\n` +
  `Die vollständige und fortlaufend aktualisierte Dokumentation der Beweise, Fristen und Anzeigen (Strafanzeigen, Dienstaufsichtsbeschwerden im Namen des Kindes) ist öffentlich zugänglich unter:\n` +
  `https://taubenfreundschaft.de\n\n` +
  `Ich ersuche Sie dringend, die nunmehr öffentlich und definitiv angekündigte Verfassungsklage zum Anlass zu nehmen, die Vorgänge in Berlin unverzüglich zu prüfen. ` +
  `Das Nichthandeln in diesem Fall droht, die Glaubwürdigkeit der Berliner Justiz nachhaltig zu beschädigen.\n\n` +
  `Mit freundlichen Grüßen\n${name}\n${email}`;

  if (custom) {
    body += `\n\n--- Eigene Anmerkung ---\n${custom}`;
  }

  // MailTo-Link bauen
  const mailto = `mailto:${recipients.join(",")}?subject=${subject}&body=${encodeURIComponent(body)}`;

  // Öffnen
  window.location.href = mailto;
  return false;
}
</script>
<script>
function sendPressMail() {
  const name = document.getElementById('pressName').value.trim();
  const email = document.getElementById('pressEmail').value.trim();
  const custom = document.getElementById('pressCustom').value.trim();

  // 📢 Empfänger Presse & Öffentlichkeit
  const recipients = [
    "redaktion@tagesspiegel.de",
    "investigativ@spiegel.de",
    "investigativ@zeit.de",
    "newsroom@rnd.de",
    "investigativ@t-online.de"
  ];

  const subject = encodeURIComponent("Verfassungsbeschwerde in Berlin angekündigt – Justiz unter Druck");

  let body = `Sehr geehrte Damen und Herren der Presse,\n\n` +
  `ich informiere Sie über die offizielle Ankündigung einer Verfassungsbeschwerde ` +
  `durch Herrn Christian Reimer gegen die Berliner Justizverwaltung nach Art. 93 Abs. 1 Nr. 4a GG.\n\n` +
  `Hintergrund:\n` +
  `- Mehrere gerichtliche Verfahren in Berlin (u.a. Amtsgericht Tempelhof-Kreuzberg) haben schwerwiegende Fragen ` +
  `zur Unabhängigkeit, Objektivität und Rechtsstaatlichkeit aufgeworfen.\n` +
  `- Der pensionierte Polizeibeamte Lothar Kießler steht im Mittelpunkt des Verdachts auf Urkundenfälschung und Einflussnahme.\n` +
  `- Richterin Neuhauß wird beschuldigt, das Verfahren manipulativ gelenkt und zentrale Beweismittel ignoriert zu haben.\n` +
  `- Eine öffentliche Frist zur Stellungnahme der Betroffenen ist am 19.10.2025 unbeantwortet verstrichen.\n\n` +
  `Herr Reimer hat daraufhin angekündigt, die Verfassungsbeschwerde direkt beim Bundesverfassungsgericht einzureichen ` +
  `– unter öffentlicher Dokumentation aller Beweise und Vorgänge:\n` +
  `👉 https://taubenfreundschaft.de\n\n` +
  `Diese Vorgänge betreffen das Vertrauen in die Berliner Justiz in erheblichem Maße und sind daher von überregionalem Interesse.\n\n` +
  `Mit freundlichen Grüßen\n${name}\n${email}`;

  if (custom) {
    body += `\n\n--- Eigene Anmerkung ---\n${custom}`;
  }

  const mailto = `mailto:${recipients.join(",")}?subject=${subject}&body=${encodeURIComponent(body)}`;
  window.location.href = mailto;
  return false;
}
</script>

</p>
<p><strong style="color:red;">* Das Vorlesen von §entinel dient der Vereinfachung! Diese Videodatei werden Automatisch durch die KI generiert! Da es bei einer KI zu Verständigungsproblemen kommen kann und der Text falsch verstanden wird, sollte bei unklarheiten der zugehörige Text geprüft werden!</strong></p>   
        </section>
        <!--<section id="sectionLeft">
            <img src="./image/tag1.png" alt="Tag 1 im Plattenbau" id="artiklepic" />
        </section>
        <section id="sectionright">
            <h2>Tag 1 – Der erste Tag mit unserem neuen Mitbewohner, mitten im Plattenbau von Marzahn...</h2>
            <p>Was passiert, wenn eine "wilde" Taube plötzlich Schutz bei einer Familie sucht?</p>
            <a target="_blank" href="https://youtu.be/CSZ5BFT_L6s?si=sxEoCBRB9qLa8tSF">Mehr erfahren</a>
        </section>
        <section id="sectionLeft">
            <img src="./image/tag2.png" alt="Tag 2 im Plattenbau" id="artiklepic" />
        </section>
        <section id="sectionright">
            <h2>Tag 2 – Das erste Beschnuppern - mitten im Plattenbau vonMarzahn</h2>
            <p>Wie nähert man sich einer verschreckten Taube?</p>
            <a target="_blank" href="https://youtu.be/HbUQj65vlPM?si=UKZihwEESlIoWhK5">Mehr erfahren</a>
        </section>
        <section id="sectionLeft">
            <img src="./image/tag3.png" alt="Tag 3 im Plattenbau" id="artiklepic" />
        </section>
        <section id="sectionright">
            <h2>Tag 3 – besorgter Kumpel meldet sich per Whatsapp - mitten im Plattenbau vonMarzahn</h2>
            <p>Ihhh du hast ne Ratte der Lüfte?</p>
            <a target="_blank" href="https://youtu.be/PkuSsG244bg?si=TE6BuJCfpASFRxbI">Mehr erfahren</a>
        </section>
        <section id="sectionLeft">
            <img src="./image/tag4.png" alt="Tag 4 im Plattenbau" id="artiklepic" />
        </section>
        <section id="sectionright">
            <h2>Tag 4 – Die große Sorge um unseren gefiederten Freund - mitten im Plattenbau vonMarzahn</h2>
            <p>Ihhh du hast ne Ratte der Lüfte?</p>
            <a target="_blank" href="#">KOMMT NOCH</a><br /><br />
            Hörprobe Teil 4:
            <video controls>
  <source src="./hoerproben/tag4.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
        </section>-->
    </main>
    <footer>
        <p>&copy; <?php echo date('Y'); ?> Taubenfreundschaft.de – Alle Rechte vorbehalten.</p>
        <ul>
    
    <li><a href="index.php?v=0.01#presseaufruf">Presse</a></li>
    <li><a href="kontakt.php">Kontakt</a></li>
    <li><a href="datenschutz.html">Datenschutz</a></li>
    <li><a href="impressum.html">Impressum</a></li>
    <li><a href="/feeds">Feeds & Updates</a></li>
</ul>
    </footer>
    <!-- Cookie Consent Banner - Taubenfreundschaft.de -->
<div id="cookie-banner" class="cookie-banner hidden">
<div class="cookie-banner__content">
<h2>🍪 Cookies & Drittinhalte</h2>
<p>
Diese Website verwendet Cookies und bindet externe Inhalte (z. B. YouTube, Social Media) ein, um dir ein optimales Erlebnis zu bieten.
Mit deiner Zustimmung erlaubst du uns, Dienste wie YouTube oder Instagram zu laden. Du kannst deine Entscheidung jederzeit widerrufen.
</p>
<div class="cookie-banner__actions">
<button id="accept-all">Alle akzeptieren</button>
<button id="decline-all">Ablehnen</button>
<button id="show-settings">Einstellungen</button>
</div>
</div>
</div>


<div id="cookie-settings" class="cookie-settings hidden">
<h3>Cookie-Einstellungen</h3>
<form id="cookie-form">
<label>
<input type="checkbox" name="essential" disabled checked />
Notwendige Cookies (immer aktiv)
</label><br>
<label>
<input type="checkbox" name="youtube" />
YouTube Videos erlauben
</label><br>
<label>
<input type="checkbox" name="social" />
Social-Media-Inhalte erlauben (z. B. Instagram)
</label><br><br>
<button type="submit">Speichern</button>
<button type="button" id="settings-back">Zurück</button>
</form>
</div>

<div id="videoContainerAll" class="hidden">
  <ul id="alllinks"></ul>
    <div class="video-header">
      <span onclick="startAlllinksFlyIn({ staggerMs: 580 });" id="aenliches">📚 ähnliches</span>
      <span id="minimizeBtnAll">🔽 Minimieren</span>
      <span id="closeBtnAll">❌ Schließen</span>
    </div>
    <video id="sentinelVideoAll" width="100%" preload="metadata" playsinline controls>
      Dein Browser unterstützt das Video-Tag nicht.
    </video>

    <div class='breakngnewsmain'>
  <div class='logo-area'>
    <div class='box-top'>
      <div class='cube'>
        <div class='front'>
          <!-- logo SVGs taken from Wikimedia Commons -->
          <svg version="1.1" id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
            y="0px" width="110.11px" height="90.402px" viewBox="0 0 110.11 90.402" enable-background="new 0 0 110.11 90.402" xml:space="preserve">
<g id="layer1" transform="translate(2015.8 -227.93)">
	<path id="path4147" fill="#FFFFFF" d="M-1977.275,253.557h18.07l0.621,7.908h-10.184v3.885h8.276v7.839h-8.368v9.403h-8.483
		v-29.035H-1977.275z"/>
	<ellipse id="path4149" fill="#FFFFFF" cx="-1944.076" cy="268.201" rx="14.911" ry="14.704"/>
	<path id="path4151" fill="#0030A0" d="M-1946.698,261.282l-0.023,12.896c0.21,1.581,1.396,2.519,2.46,2.529
		c2.069,0.019,2.4-1.329,2.666-2.46v-12.575c-0.187-1.005-0.733-2.38-2.459-2.482
		C-1945.015,259.132-1946.408,260.043-1946.698,261.282L-1946.698,261.282L-1946.698,261.282z"/>
	<path id="path4153" fill="#FFFFFF" d="M-1933.125,253.608h9.281l3.62,5.949l3.5-5.9h9.234l-8.035,13.82l9.01,15.114l-9.39-0.008
		l-4.265-7.193l-4.13,7.136h-9.135l8.631-14.923L-1933.125,253.608z"/>
	<path id="path4155" fill="#FFFFFF" d="M-1998.294,313.981v-26.399h7.705l7.998,13.33v-13.362h6.632v26.432h-6.496l-9.044-15.15
		l-0.033,15.15H-1998.294L-1998.294,313.981z"/>
	<path id="path4157" fill="#FFFFFF" d="M-1974.307,287.495v26.461h17.362v-6.054h-10.738v-4.607h8.643v-5.711h-8.604v-3.922h10.47
		v-6.168H-1974.307L-1974.307,287.495z"/>
	<path id="path4161" fill="#FFFFFF" d="M-1926.179,306.188l6.282-1.409c0.673,1.557,1.246,3.182,4.188,3.16
		c2.126,0.118,2.661-0.608,2.78-1.446c0.257-1.808-1.619-2.283-3.236-2.741c-2.625-0.744-5.03-1.47-6.739-3.008
		c-1.361-1.225-2.705-2.589-2.094-7.158c0.83-3.568,3.062-6.251,7.767-6.815c7.023-0.841,9.73,2.824,11.003,6.549l-5.864,1.866
		c-0.798-1.19-1.563-2.682-3.35-2.704c-2.22-0.027-2.667,1.324-2.741,1.942c-0.114,0.953,0.902,1.633,2.208,1.903
		c3.167,0.656,4.453,1.29,5.758,1.773c2.118,0.785,3.497,2.217,4.059,4.045c1.348,4.388-0.32,8.494-3.53,10.477
		c-2.444,1.51-5.435,2.269-10.094,0.989C-1922.878,312.763-1925.351,310.173-1926.179,306.188L-1926.179,306.188z"/>
	<path id="path4163" fill="#FFFFFF" d="M-1955.874,287.458h6.815l3.274,15.61l3.084-15.648h5.749l3.236,15.419l3.274-15.382h5.521
		l-6.244,26.576h-6.091l-3.123-15.153l-3.046,15.039h-6.244L-1955.874,287.458z"/>
	<linearGradient id="path4165_1_" gradientUnits="userSpaceOnUse" x1="-1986.6941" y1="318.4402" x2="-1986.6941" y2="228.2518">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4165" fill="url(#path4165_1_)" d="M-2014.989,318.387l15.614-24.661v-7.215h4.523l16.584-26.168v-7.915h5.169
		l15.184-24.176h-14.43l-43.129,90.188h0.485V318.387z"/>
	
		<linearGradient id="path4167_1_" gradientUnits="userSpaceOnUse" x1="-4015.781" y1="702.8973" x2="-4015.781" y2="793.033" gradientTransform="matrix(1 0 0 -1 2015.7998 1021.2301)">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4167" fill="url(#path4167_1_)" d="M-2015.663,318.332l31.392-90.135h-12.842l-18.576,88.601v1.535L-2015.663,318.332
		z"/>
</g>
</svg>

        </div>
        <div class='right'>
          <svg version="1.1" id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
            y="0px" width="110.11px" height="90.402px" viewBox="0 0 110.11 90.402" enable-background="new 0 0 110.11 90.402" xml:space="preserve">
<g id="layer1" transform="translate(2015.8 -227.93)">
	<path id="path4147" fill="#FFFFFF" d="M-1977.275,253.557h18.07l0.621,7.908h-10.184v3.885h8.276v7.839h-8.368v9.403h-8.483
		v-29.035H-1977.275z"/>
	<ellipse id="path4149" fill="#FFFFFF" cx="-1944.076" cy="268.201" rx="14.911" ry="14.704"/>
	<path id="path4151" fill="#0030A0" d="M-1946.698,261.282l-0.023,12.896c0.21,1.581,1.396,2.519,2.46,2.529
		c2.069,0.019,2.4-1.329,2.666-2.46v-12.575c-0.187-1.005-0.733-2.38-2.459-2.482
		C-1945.015,259.132-1946.408,260.043-1946.698,261.282L-1946.698,261.282L-1946.698,261.282z"/>
	<path id="path4153" fill="#FFFFFF" d="M-1933.125,253.608h9.281l3.62,5.949l3.5-5.9h9.234l-8.035,13.82l9.01,15.114l-9.39-0.008
		l-4.265-7.193l-4.13,7.136h-9.135l8.631-14.923L-1933.125,253.608z"/>
	<path id="path4155" fill="#FFFFFF" d="M-1998.294,313.981v-26.399h7.705l7.998,13.33v-13.362h6.632v26.432h-6.496l-9.044-15.15
		l-0.033,15.15H-1998.294L-1998.294,313.981z"/>
	<path id="path4157" fill="#FFFFFF" d="M-1974.307,287.495v26.461h17.362v-6.054h-10.738v-4.607h8.643v-5.711h-8.604v-3.922h10.47
		v-6.168H-1974.307L-1974.307,287.495z"/>
	<path id="path4161" fill="#FFFFFF" d="M-1926.179,306.188l6.282-1.409c0.673,1.557,1.246,3.182,4.188,3.16
		c2.126,0.118,2.661-0.608,2.78-1.446c0.257-1.808-1.619-2.283-3.236-2.741c-2.625-0.744-5.03-1.47-6.739-3.008
		c-1.361-1.225-2.705-2.589-2.094-7.158c0.83-3.568,3.062-6.251,7.767-6.815c7.023-0.841,9.73,2.824,11.003,6.549l-5.864,1.866
		c-0.798-1.19-1.563-2.682-3.35-2.704c-2.22-0.027-2.667,1.324-2.741,1.942c-0.114,0.953,0.902,1.633,2.208,1.903
		c3.167,0.656,4.453,1.29,5.758,1.773c2.118,0.785,3.497,2.217,4.059,4.045c1.348,4.388-0.32,8.494-3.53,10.477
		c-2.444,1.51-5.435,2.269-10.094,0.989C-1922.878,312.763-1925.351,310.173-1926.179,306.188L-1926.179,306.188z"/>
	<path id="path4163" fill="#FFFFFF" d="M-1955.874,287.458h6.815l3.274,15.61l3.084-15.648h5.749l3.236,15.419l3.274-15.382h5.521
		l-6.244,26.576h-6.091l-3.123-15.153l-3.046,15.039h-6.244L-1955.874,287.458z"/>
	<linearGradient id="path4165_1_" gradientUnits="userSpaceOnUse" x1="-1986.6941" y1="318.4402" x2="-1986.6941" y2="228.2518">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4165" fill="url(#path4165_1_)" d="M-2014.989,318.387l15.614-24.661v-7.215h4.523l16.584-26.168v-7.915h5.169
		l15.184-24.176h-14.43l-43.129,90.188h0.485V318.387z"/>
	
		<linearGradient id="path4167_1_" gradientUnits="userSpaceOnUse" x1="-4015.781" y1="702.8973" x2="-4015.781" y2="793.033" gradientTransform="matrix(1 0 0 -1 2015.7998 1021.2301)">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4167" fill="url(#path4167_1_)" d="M-2015.663,318.332l31.392-90.135h-12.842l-18.576,88.601v1.535L-2015.663,318.332
		z"/>
</g>
</svg>
        </div>
        <div class='back'>
          <svg version="1.1" id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
            y="0px" width="110.11px" height="90.402px" viewBox="0 0 110.11 90.402" enable-background="new 0 0 110.11 90.402" xml:space="preserve">
<g id="layer1" transform="translate(2015.8 -227.93)">
	<path id="path4147" fill="#FFFFFF" d="M-1977.275,253.557h18.07l0.621,7.908h-10.184v3.885h8.276v7.839h-8.368v9.403h-8.483
		v-29.035H-1977.275z"/>
	<ellipse id="path4149" fill="#FFFFFF" cx="-1944.076" cy="268.201" rx="14.911" ry="14.704"/>
	<path id="path4151" fill="#0030A0" d="M-1946.698,261.282l-0.023,12.896c0.21,1.581,1.396,2.519,2.46,2.529
		c2.069,0.019,2.4-1.329,2.666-2.46v-12.575c-0.187-1.005-0.733-2.38-2.459-2.482
		C-1945.015,259.132-1946.408,260.043-1946.698,261.282L-1946.698,261.282L-1946.698,261.282z"/>
	<path id="path4153" fill="#FFFFFF" d="M-1933.125,253.608h9.281l3.62,5.949l3.5-5.9h9.234l-8.035,13.82l9.01,15.114l-9.39-0.008
		l-4.265-7.193l-4.13,7.136h-9.135l8.631-14.923L-1933.125,253.608z"/>
	<path id="path4155" fill="#FFFFFF" d="M-1998.294,313.981v-26.399h7.705l7.998,13.33v-13.362h6.632v26.432h-6.496l-9.044-15.15
		l-0.033,15.15H-1998.294L-1998.294,313.981z"/>
	<path id="path4157" fill="#FFFFFF" d="M-1974.307,287.495v26.461h17.362v-6.054h-10.738v-4.607h8.643v-5.711h-8.604v-3.922h10.47
		v-6.168H-1974.307L-1974.307,287.495z"/>
	<path id="path4161" fill="#FFFFFF" d="M-1926.179,306.188l6.282-1.409c0.673,1.557,1.246,3.182,4.188,3.16
		c2.126,0.118,2.661-0.608,2.78-1.446c0.257-1.808-1.619-2.283-3.236-2.741c-2.625-0.744-5.03-1.47-6.739-3.008
		c-1.361-1.225-2.705-2.589-2.094-7.158c0.83-3.568,3.062-6.251,7.767-6.815c7.023-0.841,9.73,2.824,11.003,6.549l-5.864,1.866
		c-0.798-1.19-1.563-2.682-3.35-2.704c-2.22-0.027-2.667,1.324-2.741,1.942c-0.114,0.953,0.902,1.633,2.208,1.903
		c3.167,0.656,4.453,1.29,5.758,1.773c2.118,0.785,3.497,2.217,4.059,4.045c1.348,4.388-0.32,8.494-3.53,10.477
		c-2.444,1.51-5.435,2.269-10.094,0.989C-1922.878,312.763-1925.351,310.173-1926.179,306.188L-1926.179,306.188z"/>
	<path id="path4163" fill="#FFFFFF" d="M-1955.874,287.458h6.815l3.274,15.61l3.084-15.648h5.749l3.236,15.419l3.274-15.382h5.521
		l-6.244,26.576h-6.091l-3.123-15.153l-3.046,15.039h-6.244L-1955.874,287.458z"/>
	<linearGradient id="path4165_1_" gradientUnits="userSpaceOnUse" x1="-1986.6941" y1="318.4402" x2="-1986.6941" y2="228.2518">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4165" fill="url(#path4165_1_)" d="M-2014.989,318.387l15.614-24.661v-7.215h4.523l16.584-26.168v-7.915h5.169
		l15.184-24.176h-14.43l-43.129,90.188h0.485V318.387z"/>
	
		<linearGradient id="path4167_1_" gradientUnits="userSpaceOnUse" x1="-4015.781" y1="702.8973" x2="-4015.781" y2="793.033" gradientTransform="matrix(1 0 0 -1 2015.7998 1021.2301)">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4167" fill="url(#path4167_1_)" d="M-2015.663,318.332l31.392-90.135h-12.842l-18.576,88.601v1.535L-2015.663,318.332
		z"/>
</g>
</svg>
        </div>
        <div class='left'>
          <svg version="1.1" id="svg2" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
            y="0px" width="110.11px" height="90.402px" viewBox="0 0 110.11 90.402" enable-background="new 0 0 110.11 90.402" xml:space="preserve">
<g id="layer1" transform="translate(2015.8 -227.93)">
	<path id="path4147" fill="#FFFFFF" d="M-1977.275,253.557h18.07l0.621,7.908h-10.184v3.885h8.276v7.839h-8.368v9.403h-8.483
		v-29.035H-1977.275z"/>
	<ellipse id="path4149" fill="#FFFFFF" cx="-1944.076" cy="268.201" rx="14.911" ry="14.704"/>
	<path id="path4151" fill="#0030A0" d="M-1946.698,261.282l-0.023,12.896c0.21,1.581,1.396,2.519,2.46,2.529
		c2.069,0.019,2.4-1.329,2.666-2.46v-12.575c-0.187-1.005-0.733-2.38-2.459-2.482
		C-1945.015,259.132-1946.408,260.043-1946.698,261.282L-1946.698,261.282L-1946.698,261.282z"/>
	<path id="path4153" fill="#FFFFFF" d="M-1933.125,253.608h9.281l3.62,5.949l3.5-5.9h9.234l-8.035,13.82l9.01,15.114l-9.39-0.008
		l-4.265-7.193l-4.13,7.136h-9.135l8.631-14.923L-1933.125,253.608z"/>
	<path id="path4155" fill="#FFFFFF" d="M-1998.294,313.981v-26.399h7.705l7.998,13.33v-13.362h6.632v26.432h-6.496l-9.044-15.15
		l-0.033,15.15H-1998.294L-1998.294,313.981z"/>
	<path id="path4157" fill="#FFFFFF" d="M-1974.307,287.495v26.461h17.362v-6.054h-10.738v-4.607h8.643v-5.711h-8.604v-3.922h10.47
		v-6.168H-1974.307L-1974.307,287.495z"/>
	<path id="path4161" fill="#FFFFFF" d="M-1926.179,306.188l6.282-1.409c0.673,1.557,1.246,3.182,4.188,3.16
		c2.126,0.118,2.661-0.608,2.78-1.446c0.257-1.808-1.619-2.283-3.236-2.741c-2.625-0.744-5.03-1.47-6.739-3.008
		c-1.361-1.225-2.705-2.589-2.094-7.158c0.83-3.568,3.062-6.251,7.767-6.815c7.023-0.841,9.73,2.824,11.003,6.549l-5.864,1.866
		c-0.798-1.19-1.563-2.682-3.35-2.704c-2.22-0.027-2.667,1.324-2.741,1.942c-0.114,0.953,0.902,1.633,2.208,1.903
		c3.167,0.656,4.453,1.29,5.758,1.773c2.118,0.785,3.497,2.217,4.059,4.045c1.348,4.388-0.32,8.494-3.53,10.477
		c-2.444,1.51-5.435,2.269-10.094,0.989C-1922.878,312.763-1925.351,310.173-1926.179,306.188L-1926.179,306.188z"/>
	<path id="path4163" fill="#FFFFFF" d="M-1955.874,287.458h6.815l3.274,15.61l3.084-15.648h5.749l3.236,15.419l3.274-15.382h5.521
		l-6.244,26.576h-6.091l-3.123-15.153l-3.046,15.039h-6.244L-1955.874,287.458z"/>
	<linearGradient id="path4165_1_" gradientUnits="userSpaceOnUse" x1="-1986.6941" y1="318.4402" x2="-1986.6941" y2="228.2518">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4165" fill="url(#path4165_1_)" d="M-2014.989,318.387l15.614-24.661v-7.215h4.523l16.584-26.168v-7.915h5.169
		l15.184-24.176h-14.43l-43.129,90.188h0.485V318.387z"/>
	
		<linearGradient id="path4167_1_" gradientUnits="userSpaceOnUse" x1="-4015.781" y1="702.8973" x2="-4015.781" y2="793.033" gradientTransform="matrix(1 0 0 -1 2015.7998 1021.2301)">
		<stop  offset="0" style="stop-color:#FFFFFF"/>
		<stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0"/>
	</linearGradient>
	<path id="path4167" fill="url(#path4167_1_)" d="M-2015.663,318.332l31.392-90.135h-12.842l-18.576,88.601v1.535L-2015.663,318.332
		z"/>
</g>
</svg>
        </div>
      </div>
    </div>
    <div class='box-bttm'>
      <div class='cube'>
        <div class='front'>
          Sicherheits
        </div>
        <div class='right'>
          GIGANT
        </div>
        <div class='back'>
          channel
        </div>
        <div class='left'>
          <div class="time">
            <span class="hm"></span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<div id="displaytxt" class="hidden">Nächstes Video startet in</div>
<div id="display" class="hidden">8</div>
<button id="cancelBtn" class="hidden">Abbrechen</button>
  </div>
<script>
  function updateTime() {
  var dateInfo = new Date();

  // get computer time
  var hr,
    _min = (dateInfo.getMinutes() < 10) ? "0" + dateInfo.getMinutes() : dateInfo.getMinutes(),
    ampm = (dateInfo.getHours() > 12) ? "PM" : "AM";

    hr = dateInfo.getHours();
  var currentTime = hr + ":" + _min;

  // print time
  document.querySelector(".hm").innerHTML = currentTime;
  //document.querySelector(".ampm").innerHTML = ampm;
};

// print time and date once, then update them every second
updateTime();
setInterval(function() {
  updateTime()
}, 1000);
  let backtotop = document.querySelector("main").getBoundingClientRect().top;
document.querySelectorAll("section#sectionLeft li").forEach(div => { div.addEventListener("click", function (e) {
  //console.log(this.className); // logs the className of my_element
  //console.log(e.currentTarget === this); // logs `true`
  if (e.target.closest('[data-preview-bypass="1"]')) {
    return;
  }
    if(e.currentTarget.style.position != "absolute") { 
        //console.log(e.currentTarget, e.currentTarget.style.position = "absolute", e.currentTarget.style.width = "100%", e.currentTarget.style.display = "block", e.currentTarget.style.zIndex = 99);
        document.querySelector("div#videoContainerAll").style.display = "block !important";
    } else {
        console.log(e.currentTarget, e.currentTarget.style.position = "relative", e.currentTarget.style.width = "17%", e.currentTarget.style.zIndex = "unset");
    }
});

//console.log(div); 
});

const banner = document.getElementById('cookie-banner');
const settings = document.getElementById('cookie-settings');
const accepted = localStorage.getItem('cookieConsent');


if (!accepted) banner.classList.remove('hidden');


document.getElementById('accept-all').onclick = () => {
localStorage.setItem('cookieConsent', JSON.stringify({ youtube: true, social: true }));
banner.classList.add('hidden');
location.reload();
};


document.getElementById('decline-all').onclick = () => {
localStorage.setItem('cookieConsent', JSON.stringify({ youtube: false, social: false }));
banner.classList.add('hidden');
location.reload();
};


document.getElementById('show-settings').onclick = () => {
banner.classList.add('hidden');
settings.classList.remove('hidden');
};


document.getElementById('settings-back').onclick = () => {
settings.classList.add('hidden');
banner.classList.remove('hidden');
};


document.getElementById('cookie-form').onsubmit = (e) => {
e.preventDefault();
const data = new FormData(e.target);
const consent = {
youtube: data.get('youtube') === 'on',
social: data.get('social') === 'on'
};
localStorage.setItem('cookieConsent', JSON.stringify(consent));
settings.classList.add('hidden');
location.reload();
};
const sentinelVideoAll = document.getElementById('sentinelVideoAll');
const minimizeBtnAll = document.getElementById('minimizeBtnAll');
const closeBtnAll = document.getElementById('closeBtnAll');
const videosource = document.getElementById('videosource');
let isMinimized = false;
$(document).ready(function(){

var source = "";
const showVideoLinkAlls = document.querySelectorAll("[id^=showVideoLink]"); 

showVideoLinkAlls.forEach(function(element) {
  //console.log(element);
  element.addEventListener('click', (e) => {
    //console.log(e);
  e.preventDefault();
sentinelVideoAll.innerHTML = "";
  //console.log(e, e.target.getAttribute('data-url'), e.target.getAttribute('data-indexid'));
  //videosource.src = e.target.getAttribute('data-url');
source = document.createElement('source');
source.removeAttribute('src');
source.setAttribute('src', e.target.getAttribute('data-url'));
source.setAttribute('type', 'video/mp4');

sentinelVideoAll.appendChild(source);
//const checkboxchecker = document.getElementById('followNarration');
//if (checkboxchecker) {
/*
source2 = document.createElement('track');
source2.setAttribute('src', '/webvttdateien/ein_paar_worte_nach_dem_scheidungstermin_2.vtt');
source2.setAttribute('default', '');
source2.setAttribute('label', 'Deutsch');
source2.setAttribute('srclang', 'de');
source2.setAttribute('id', 'trackVtt');
source2.setAttribute('kind', 'subtitles');
sentinelVideoAll.appendChild(source2);
*/
//}
//console.log(sentinelVideoAll);
//console.log(window.enableVttFollow(e.target.getAttribute('data-indexid')));
sentinelVideoAll.pause();
var isPlaying = sentinelVideoAll.currentTime > 0 && !sentinelVideoAll.paused && !sentinelVideoAll.ended 
    && sentinelVideoAll.readyState > sentinelVideoAll.HAVE_CURRENT_DATA;

if (!isPlaying) {
    // Assuming you are intentionally changing the source or reloading
    // You might also set a new src here: sentinelVideoAll.src = 'new_video.mp4';
    sentinelVideoAll.removeAttribute('src'); // This line clears the current source
    sentinelVideoAll.load(); // This reloads the media element based on its current src (or lack thereof)

    const playVideoWhenReady = () => {
        sentinelVideoAll.play().catch(error => {
            console.error("Error attempting to play video:", error);
        });
        // Remove the event listener after it has fired once
        sentinelVideoAll.removeEventListener('canplay', playVideoWhenReady);
    };
    
    // Listen for the 'canplay' event before attempting to play
    sentinelVideoAll.addEventListener('canplay', playVideoWhenReady);
}

localStorage.setItem("lastvideoshow", `index${parseInt(e.target.getAttribute('data-indexid'))}`);
sentinelVideoAll.addEventListener('ended', () => {
  //return i !== -1 && keys[i + 1] && db[keys[i + 1]];
var keys = Object.keys(javascript_array), i = keys.indexOf(`index${parseInt(e.target.getAttribute('data-indexid'))}`);

            //console.log('Video ist zu Ende!', javascript_array[keys[i + 1]].split("::##::")[0], keys[i + 1].replace('index', ''), `index${parseInt(e.target.getAttribute('data-indexid'))}`, keys, i, javascript_array, javascript_array[`index${parseInt(e.target.getAttribute('data-indexid'))}`].split("::##::")[0]);
            //localStorage.setItem("videoshowbtn", `1`);

if(typeof localStorage.getItem('videoplaylist') == "string") {
var showobjectok = JSON.parse(localStorage.getItem('videoplaylist'));
console.log(`'"index${parseInt(e.target.getAttribute('data-indexid'))}"'`);
delete showobjectok[`"index${parseInt(e.target.getAttribute('data-indexid'))}"`];
Object.keys(showobjectok);
console.log(showobjectok);
localStorage.setItem('videoplaylist', JSON.stringify(showobjectok));

if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length > 0) {
        let counter = 8;
        let intervalId = null;
        const displaytxt = document.getElementById('displaytxt');
        const display = document.getElementById('display');
        //const startBtn = document.getElementById('startBtn');
        const cancelBtn = document.getElementById('cancelBtn');
displaytxt.classList.remove("hidden");
display.classList.remove("hidden");
cancelBtn.classList.remove("hidden");
        function startTimer() {
            // Verhindert mehrere Intervalle, falls Start mehrfach geklickt wird
            if (intervalId !== null) return; 

            counter = 8; // Reset auf 8
            display.textContent = counter;
            
            // Startet den Intervall: alle 1000ms (1 Sekunde)
            intervalId = setInterval(() => {
                counter--;
                display.textContent = counter;

                if (counter <= 0) {
                    clearInterval(intervalId);
                    intervalId = null;
                    //display.textContent = "Fertig!";
                    displaytxt.classList.add("hidden");
                    display.classList.add("hidden");
                    cancelBtn.classList.add("hidden");
                    document.querySelector(`ul#alllinks li [data-indexid="${Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replace("index", "").replaceAll('"', "").replaceAll("'", "")}"] span`).click();
                }
            }, 1000);
        }

        function cancelTimer() {
            // Stoppt den Timer
            clearInterval(intervalId);
            intervalId = null;
            display.textContent = "Abgebrochen";
        }
startTimer();
        //startBtn.addEventListener('click', startTimer);
        cancelBtn.addEventListener('click', cancelTimer);
} else {
  displaytxt.classList.add("hidden");
  display.classList.add("hidden");
  cancelBtn.classList.add("hidden");
}
}
            //
        });
sentinelVideoAll.pause();
sleep(6000).then(() => {
      $('div#infodiverNews').animate({ width: "0" }); $('div#infodiverNews').css({ backgroundColor: 'transparent' }); 
      $('div#infodiverNews').html('<span id="sentinelAutorunInf"></span>');
  });
  videoContainerAll.classList.add('show');
  videoContainerAll.classList.remove('hidden');
  //window.enableVttFollow(e.target.getAttribute('data-indexid'));

console.log({
  src: source.getAttribute('src'),
  type: source.getAttribute('type'),
});



});
});
});

minimizeBtnAll.addEventListener('click', () => {
  isMinimized = !isMinimized;
  if (isMinimized) {
    videoContainerAll.classList.add('minimized');
    minimizeBtnAll.textContent = '🔼 Maximieren';
  } else {
    videoContainerAll.classList.remove('minimized');
    minimizeBtnAll.textContent = '🔽 Minimieren';
  }
});
closeBtnAll.addEventListener('click', () => {
      window.startng = undefined;
  document.querySelector("#videoContainerAll ul#alllinks").innerHTML = "";
  sentinelVideoAll.pause();
  sentinelVideoAll.currentTime = 0;
  videoContainerAll.classList.remove('show', 'minimized');
  sentinelVideoAll.innerHTML = "";
  isMinimized = false;
  minimizeBtnAll.textContent = '🔽 Minimieren';
});
function currentArticleScope(element) {
  const explicitScope = element && (element.getAttribute('data-scope') || element.dataset.currentScope);
  if (explicitScope === 'start' || explicitScope === 'archiv' || explicitScope === 'dev') {
    return explicitScope;
  }
  return window.location.pathname.replace(/\/+$/, '').startsWith('/archiv') ? 'archiv' : 'start';
}

function playNarration(trigger) {
  const videoUrl = trigger.getAttribute('data-url');
  if (!videoUrl) {
    return;
  }

  sentinelVideoAll.innerHTML = "";
  source = document.createElement('source');
  source.setAttribute('src', videoUrl);
  source.setAttribute('type', 'video/mp4');
  sentinelVideoAll.appendChild(source);

  if (typeof window.enableVttFollow === 'function') {
    window.enableVttFollow(trigger.getAttribute('data-indexid'));
  }

  const playVideoWhenReady = () => {
    sentinelVideoAll.play().catch(error => {
      console.error('Error attempting to play video:', error);
    });
    sentinelVideoAll.removeEventListener('canplay', playVideoWhenReady);
  };

  sentinelVideoAll.load();
  sentinelVideoAll.addEventListener('canplay', playVideoWhenReady);
  videoContainerAll.classList.add('show');
  videoContainerAll.classList.remove('hidden');
}

function bindPlaceholderVideoLinks(root) {
  if (!root) {
    return;
  }

  root.querySelectorAll('span[id^=showVideoLink]').forEach(function(element) {
    if (element.dataset.boundVideo === '1') {
      return;
    }

    element.dataset.boundVideo = '1';
    if (!element.getAttribute('data-scope')) {
      element.setAttribute('data-scope', currentArticleScope(root));
    }

    element.addEventListener('click', (e) => {
      e.preventDefault();
      playNarration(e.currentTarget);
    });
  });
}

function previewSourceByIndex(indexId) {
  return document.querySelector('#inboxartikel [data-indexid="' + indexId + '"]')
    || document.querySelector('#plaeceholderdiv [data-indexid="' + indexId + '"]')
    || document.querySelector('[data-indexid="' + indexId + '"]');
}

function rebuildVideoLinks(previewElement) {
  const targetList = document.querySelector('#videoContainerAll ul#alllinks');
  if (!targetList) {
    return;
  }

  targetList.innerHTML = '';
  const linktags = previewElement.getAttribute('data-linktags');
  if (typeof linktags !== 'string' || linktags.trim() === '') {
    return;
  }

  linktags.split(';').map(function(value) {
    return value.trim();
  }).filter(Boolean).forEach(function(indexId) {
    const sourcePreview = previewSourceByIndex(indexId);
    if (!sourcePreview) {
      return;
    }
    targetList.insertAdjacentHTML('beforeend', '<li>' + sourcePreview.outerHTML + '</li>');
  });
}

function bindShareBoxes(root) {
  (root || document).querySelectorAll('[data-share]').forEach((box) => {
    if (box.dataset.shareBound === '1') {
      return;
    }
    box.dataset.shareBound = '1';

    const url = box.getAttribute('data-share-url') || window.location.href;
    const title = box.getAttribute('data-share-title') || document.title;
    const text = document.querySelector('meta[property="og:description"]')?.content || '';

    const btnNative = box.querySelector('.share-native');
    if (btnNative) {
      btnNative.addEventListener('click', () => {
        if (navigator.share) {
          navigator.share({ title, text, url }).catch(() => {});
        } else {
          window.open('https://wa.me/?text=' + encodeURIComponent(title + ' – ' + url), '_blank', 'noopener');
        }
      });
    }

    const btnInstagram = box.querySelector('.share-instagram');
    if (btnInstagram) {
      btnInstagram.addEventListener('click', () => {
        currentUrl = url;
        navigator.clipboard.writeText(currentUrl).then(() => {
          const overlay = document.getElementById('igOverlay');
          if (overlay) {
            overlay.style.display = 'flex';
          }
        }).catch(() => {
          const overlay = document.getElementById('igOverlay');
          if (overlay) {
            overlay.style.display = 'flex';
          }
        });
      });
    }

    const aWA = box.querySelector('.wa');
    if (aWA) aWA.href = 'https://wa.me/?text=' + encodeURIComponent(title + ' – ' + url);

    const aTG = box.querySelector('.tg');
    if (aTG) aTG.href = 'https://t.me/share/url?url=' + encodeURIComponent(url) + '&text=' + encodeURIComponent(title);

    const aFB = box.querySelector('.fb');
    if (aFB) aFB.href = 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(url);

    const aX = box.querySelector('.x');
    if (aX) aX.href = 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(url) + '&text=' + encodeURIComponent(title);

    const btnCopy = box.querySelector('.share-copy');
    if (btnCopy) {
      btnCopy.addEventListener('click', async () => {
        try {
          await navigator.clipboard.writeText(url);
          btnCopy.textContent = '✅ Kopiert';
          setTimeout(() => {
            btnCopy.innerHTML = '📋<span class="shareicons"> Link kopieren</span>';
          }, 1200);
        } catch {
          prompt('Link kopieren:', url);
        }
      });
    }
  });
}

async function loadArticleFragment(previewElement) {
  const plaeceholderdiv = document.querySelector('#plaeceholderdiv');
  const startsitediv = document.querySelector('#startsitediv');
  const indexId = previewElement.getAttribute('data-indexid');
  if (!plaeceholderdiv || !indexId) {
    return;
  }

  const scope = currentArticleScope(previewElement);
  const response = await fetch('/article_fragment.php?scope=' + encodeURIComponent(scope) + '&id=' + encodeURIComponent(indexId), {
    headers: { 'X-Requested-With': 'XMLHttpRequest' }
  });

  if (!response.ok) {
    throw new Error('fragment_load_failed');
  }

  plaeceholderdiv.innerHTML = await response.text();
  plaeceholderdiv.dataset.currentScope = scope;
  if (startsitediv) {
    startsitediv.style.display = 'none';
  }
  bindPlaceholderVideoLinks(plaeceholderdiv);
  bindShareBoxes(plaeceholderdiv);
  makeliclicklinks();
  plaeceholderdiv.scrollIntoView({ block: 'start', behavior: 'smooth' });
}

function makeliclicklinks() {
  document.querySelectorAll('ul#alllinks li div').forEach(function(element) {
    if (element.dataset.boundPreview === '1') {
      return;
    }

    element.dataset.boundPreview = '1';
    element.addEventListener('click', async (e) => {
      if (e.target.closest('[data-preview-bypass="1"]')) {
        return;
      }

      const previewElement = e.currentTarget;
      e.preventDefault();
      window.startng = undefined;

      if (previewElement.closest('#videoContainerAll')) {
        document.querySelector('#videoContainerAll ul#alllinks').innerHTML = '';
        document.getElementById('closeBtnAll').click();
      }

      rebuildVideoLinks(previewElement);

      try {
        await loadArticleFragment(previewElement);
      } catch (error) {
        console.error('Article fragment could not be loaded', error);
      }
    });
  });
}

function esc(s){ return String(s ?? ''); }
const isMobile = () => /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);

let currentUrl = '';

const igOverlay = document.getElementById('igOverlay');
const igCloseBtn = document.getElementById('igCloseBtn');
const igOpenBtn = document.getElementById('igOpenBtn');

if (igOverlay && igCloseBtn && igOpenBtn) {
  igCloseBtn.addEventListener('click', () => {
    igOverlay.style.display = 'none';
  });

  igOpenBtn.addEventListener('click', () => {
    igOverlay.style.display = 'none';

    if (isMobile()) {
      window.location.href = 'instagram://app';
      setTimeout(() => {
        window.open('https://www.instagram.com/', '_blank');
      }, 800);
    } else {
      window.open('https://www.instagram.com/', '_blank');
    }
  });
}

bindShareBoxes(document);
bindPlaceholderVideoLinks(document.querySelector('#artikel'));
makeliclicklinks();
var back_to_top_button = ['<div id="backtop"><a style="color: #ffffff;" href="#top" class="back-to-top"><img src="https://sicherheitsgigant.de/arrow_top_big.png" alt="Top" id="Top"/></a></div>'].join("");
$("body").append(back_to_top_button);

// Der Button wird ausgeblendet
$(".back-to-top").hide();
// Funktion für das Scroll-Verhalten
$(function () {
  $(window).scroll(function () {
    scrollposition = $(this).scrollTop();
    //console.log($(this).scrollTop());
    if ($(this).scrollTop() > 100) { // Wenn 100 Pixel gescrolled wurde
      $('.back-to-top').fadeIn();
      if(document.body.clientWidth <= 1600 || document.body.clientWidth > 1950) {
        if(document.body.clientWidth <= 850) {
          $('.back-to-top').css("top", $( window ).height()/2);
          //console.log("HIER0");
        } else {
      $('.back-to-top').css("top", $( window ).height()-100);
      //$("#preview1").css("top", $(this).scrollTop());
      //console.log("HIER1");
        }
      
      } else {
      $('.back-to-top').css("top", ($(this).scrollTop()*100/80)+$( window ).height());
      console.log("HIER2");
      }
      //console.log($(this).scrollTop());
      //console.log($( window ).height()/2);
    } else {
      $('.back-to-top').fadeOut();
    }
  });
  let bodysicetop = document.querySelector("body").getBoundingClientRect();
//console.log(bodysicetop, backtotop);
  $('.back-to-top').click(function () { // Klick auf den Button
    $('body,html').animate({
      scrollTop: Math.abs(document.querySelector("body").getBoundingClientRect().top-document.querySelector("main").getBoundingClientRect().top)
    }, 800);
    return false;
  });
});   

(function () {
  const UL_ID = "#videoContainerAll ul#alllinks";
  const MOBILE_BREAKPOINT = 750;

  function isMobile() {
    return window.innerWidth < MOBILE_BREAKPOINT;
  }

  function getTopPercentForIndex(i, count) {
    // Desktop: z.B. 5%, 25%, 45%, 65%, 85% ...
    // Dynamisch verteilt (oben/unten mit etwas Rand)
    const start = 8;   // % oben
    const end = 85;    // % unten
    if (count <= 1) return start;
    const step = (end - start) / (count - 1);
    return start + step * i;
  }

  function prepareListPositions(ul) {
    const lis = Array.from(ul.querySelectorAll("li"));

    // Reset
    lis.forEach(li => {
      li.classList.remove("fly-in");
      li.style.transitionDelay = "0ms";
      li.style.top = "";
      li.style.left = "";
    });

    if (!isMobile()) {
      // Desktop: absolute Position + top%-Staffel
      lis.forEach((li, i) => {
        li.style.left = "0px";
        li.style.top = getTopPercentForIndex(i, lis.length) + "%";
      });
    } else {
      // Mobile: normale Flow-List → sicherstellen, dass sie nicht absolut bleibt
      lis.forEach(li => {
        li.style.position = ""; // lässt Media Query entscheiden
        li.style.top = "";
        li.style.left = "";
      });
    }

    return lis;
  }

  function flyInSequential(ul, options = {}) {
    window.startng = false;
    const {
      staggerMs = 160,      // Abstand zwischen den LIs
      durationMs = 600      // muss zum CSS transition passen
    } = options;

    const lis = prepareListPositions(ul);

    lis.forEach((li, i) => {
      // leicht unterschiedliche "Easing"-Wirkung durch Delay (cooler Stagger)
      const delay = i * staggerMs;
      li.style.transitionDelay = delay + "ms";

      // Trigger in nächstem Frame, damit der Browser Startzustand sicher rendert
      requestAnimationFrame(() => {
        li.classList.add("fly-in");
      });
    });

    // Optional: Callback/Promise wenn fertig
    const total = (lis.length - 1) * staggerMs + durationMs;
    return new Promise(resolve => setTimeout(resolve, total));
  }

  // Expose global function (damit du sie onClick callen kannst)
  window.startAlllinksFlyIn = function (opts) {
    
    const ul = document.querySelector(UL_ID);
    const licheck = document.querySelector(UL_ID + " li");
    const li = document.querySelectorAll(UL_ID + " li");
    console.log(window.startng);
    if(window.startng == false) {
      li.forEach((li, i) => {
       var staggerMs = 160
      // leicht unterschiedliche "Easing"-Wirkung durch Delay (cooler Stagger)
      const delay = i * staggerMs;
      li.style.transitionDelay = delay + "ms";

      // Trigger in nächstem Frame, damit der Browser Startzustand sicher rendert
      requestAnimationFrame(() => {
        li.classList.remove("fly-in");
      });
       window.startng = true;
    });
    return;
    }
    if (!ul) return;
    return flyInSequential(ul, opts);
  };

  // Optional: Wenn du willst, dass Resize neu vorbereitet (nur wenn noch nicht sichtbar)
  window.addEventListener("resize", () => {
    const ul = document.querySelector(UL_ID);
    if (!ul) return;

    // Wenn noch nichts geflogen ist (erstes LI noch unsichtbar), Positionen vorbereiten
    const firstLi = ul.querySelector("li");
    if (firstLi && !firstLi.classList.contains("fly-in")) {
      prepareListPositions(ul);
    }
  });
})();
</script>

<button style="display: none;" id="btnPush" type="button">🔔 Push aktivieren</button>

<script>
(async () => {
  const btn = document.getElementById('btnPush');
  if (!btn) return;

  const VAPID_PUBLIC = "BB0bPJJExOosZO0dKI94ZyvPJWPUksIF2zUesUgi46RHeKk61BoOVQi0ZGfkhf9akbtNH2BGV1rWYKTMysb_ch0";

  function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
    const rawData = atob(base64);
    return Uint8Array.from([...rawData].map(ch => ch.charCodeAt(0)));
  }

  async function enablePush() {
    if (!('serviceWorker' in navigator)) throw new Error("No serviceWorker");
    if (!('PushManager' in window)) throw new Error("No PushManager");

    const reg = await navigator.serviceWorker.register('/service-worker.js', { scope: '/' });

    const perm = await Notification.requestPermission();
    if (perm !== 'granted') throw new Error("Permission not granted");

    const sub = await reg.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC)
    });

    const res = await fetch('/push/subscribe.php', {
      method: 'POST',
      headers: {'Content-Type':'application/json'},
      body: JSON.stringify(sub)
    });

    const j = await res.json().catch(()=>({ok:false}));
    if (!j.ok) throw new Error("Subscribe endpoint failed");

    btn.textContent = "✅ Push aktiv";
    btn.disabled = true;
  }

  btn.addEventListener('click', async () => {
    btn.disabled = true;
    try {
      await enablePush();
    } catch (e) {
      console.error(e);
      btn.disabled = false;
      alert("Push konnte nicht aktiviert werden: " + (e.message || e));
    }
  });
})();
</script>

<style>
.ig-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,.55);
  display: none;
  align-items: center;
  justify-content: center;
  z-index: 9999;
}
.ig-box {
  background: #434343;
  border-radius: 14px;
  padding: 18px;
  max-width: 360px;
  width: calc(100% - 32px);
  font-family: system-ui, sans-serif;
}
.ig-box h3 {
  margin: 0 0 10px;
}
.ig-actions {
  display: flex;
  gap: 10px;
  margin-top: 14px;
}
.ig-actions button {
  flex: 1;
  padding: 10px;
  border-radius: 10px;
  border: none;
  cursor: pointer;
  font-weight: 600;
}
.ig-primary {
  background: #e1306c;
  color: #fff;
}
.ig-secondary {
  background: #eee;
}
</style>
<div class="ig-overlay" id="igOverlay">
  <div class="ig-box">
    <h3>📋 Link kopiert</h3>
    <p>
      Der Beitrag ist jetzt in deiner Zwischenablage.<br>
      Möchtest du Instagram direkt öffnen?
    </p>

    <div class="ig-actions">
      <button class="ig-primary" id="igOpenBtn">Instagram öffnen</button>
      <button class="ig-secondary" id="igCloseBtn">Nur schließen</button>
    </div>
  </div>
</div>


<style>
  :root{
  --article-scale: 1; /* 1 = normal */
}

/* nur Artikeltexte skalieren, NICHT die ganze Seite */
div#plaeceholderdiv p, div#artikel article p, ul#alllinks .h2-preview {
  font-size: calc(1rem * var(--article-scale)) !important;
}

/* Überschriften skalieren mit, aber etwas “ruhiger” */
div#plaeceholderdiv h2, div#artikel article h2, div#plaeceholderdiv h2 strong, div#artikel article h2 strong{ font-size: calc(clamp(1.6rem, 3.5vw, 2.2rem) * var(--article-scale)) !important; }
div#plaeceholderdiv h3, div#artikel article h3{ font-size: calc(clamp(1.25rem, 2.5vw, 1.5rem) * var(--article-scale)) !important; }

/* optional: Code nicht zu stark aufblasen */
div#plaeceholderdiv code, div#artikel article code{ font-size: calc(0.95em * var(--article-scale)) !important; }
li.falllinkslinks a, strong#fallaktetxtstrong, strong.falllinkslinks {
    font-size: calc(1rem * var(--article-scale)) !important;
    width: 99%;
}
</style>
<script>
(() => {
  const KEY = "sg_article_scale";
  const MIN = 0.85;   // 85%
  const MAX = 1.85;   // 135%
  const STEP = 0.05;  // 5% pro Klick

  const root = document.documentElement;
//console.log(root);
  function clamp(v,min,max){ return Math.min(max, Math.max(min, v)); }

  function getScale(){
    const raw = localStorage.getItem(KEY);
    const v = raw ? parseFloat(raw) : 1;
    return Number.isFinite(v) ? clamp(v, MIN, MAX) : 1;
  }

  function setScale(v){
    v = clamp(Math.round(v * 100) / 100, MIN, MAX);
    root.style.setProperty("--article-scale", String(v));
    localStorage.setItem(KEY, String(v));
  }

  // init
  setScale(getScale());

  const btnMinus = document.getElementById("txtMinus");
  const btnPlus  = document.getElementById("txtPlus");
  const btnReset = document.getElementById("txtReset");

  if (btnMinus) btnMinus.addEventListener("click", () => setScale(getScale() - STEP));
  if (btnPlus)  btnPlus.addEventListener("click",  () => setScale(getScale() + STEP));
  if (btnReset) btnReset.addEventListener("click", () => setScale(1));
})();
</script>
<style>
  cue-active{
  outline: 2px solid #111;
  border-radius: 10px;
  padding: 6px 8px;
  background: #fff7cc;
}
</style>
<script>

async function attachVttFollow(loadid) {
const slug = loadid; 
const slugcontainer = "plaeceholderdiv"; 
const videoEl = document.querySelector("#sentinelVideoAll"); 

// 1. Track erstellen (wie in deinem Code)
const source2 = document.createElement('track');
source2.setAttribute('src', `https://sicherheitsgigant.de/webvttdateien/${slug}.vtt`);
source2.setAttribute('default', '');
source2.setAttribute('label', 'Deutsch');
source2.setAttribute('srclang', 'de');
source2.setAttribute('id', 'trackVtt');
source2.setAttribute('kind', 'subtitles');
videoEl.appendChild(source2);

// WICHTIG: Wir müssen warten, bis der Track geladen ist, sonst sind die Cues leer
source2.addEventListener('load', function() {
<?php if(str_replace("/", "", $path) != "") { ?>
const articleContainer = document.querySelector(`#artikel article div p`); // Dein Container
<?php } else { ?>
const articleContainer = document.querySelector(`#plaeceholderdiv p`); // Dein Container
<?php } ?>
    const track = this.track;
    track.mode = "hidden"; // Subtitles im Video ausblenden
    
    // 2. Den Text im <p> Tag vorbereiten (Spans setzen)
    prepareTextForSync(track.cues, articleContainer);

    // 3. Auf Änderungen hören (Synchronisation)
    track.addEventListener('cuechange', function() {
        const activeCue = track.activeCues[0];
        
        // Erstmal alle Highlights entfernen
        document.querySelectorAll('.active-transcript-text').forEach(el => {
            el.classList.remove('active-transcript-text');
            el.style.backgroundColor = "transparent"; // Fallback inline style reset
        });

        if (activeCue) {
            // Die ID haben wir beim "prepareTextForSync" als Index gesetzt
            // Wir suchen den Cue anhand seiner ID (die wir unten vergeben haben)
            const activeSpan = document.getElementById(activeCue.id);
            
            if (activeSpan) {
                // Styling anwenden
                activeSpan.classList.add('active-transcript-text');
                activeSpan.style.borderColor = "transparent !important"; // Beispiel: Gelb markieren
                //activeSpan.style.opacity = "0.3";
                activeSpan.style.transition = "border-color 0.3s";

                // 4. Scroll-Logik (Oberes Drittel)
                scrollToUpperThird(activeSpan);
            }
        }
    });
});
return true;
}
/**
 * Funktion: Sucht den Text der Cues im HTML und umschließt ihn mit Spans
 */
function prepareTextForSync(cues, container) {
  console.log(container);
    let originalHTML = container.innerHTML;
    
    // Wir iterieren rückwärts oder nutzen eine spezifische Ersetzung, 
    // um den HTML-Code nicht zu zerschießen. 
    // Einfacher Ansatz: Wir vertrauen darauf, dass der Text im VTT exakt so im HTML steht.
    
    // Wir bauen Cues in ein Array um, um einfacher damit zu arbeiten
    Array.from(cues).forEach((cue, index) => {
        // Wir geben dem Cue eine ID, damit wir ihn später wiederfinden
        cue.id = `cue_uid_${index}`;
        
        // Der Text aus dem VTT (bereinigt um Whitespace/Newlines)
        const textToFind = cue.text.trim();
        
        // Sicherheitshalber Sonderzeichen für Regex escapen
        const safeText = textToFind.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
        
        // Wir ersetzen das erste Vorkommen dieses Textes mit einem Span
        // Hinweis: Das funktioniert am besten, wenn der Text im VTT eindeutig ist.
        // Wenn ein Satz 2x vorkommt, könnte es knifflig werden. 
        // Für diesen Fall nutzen wir eine Funktion, die nur unmarkierten Text ersetzt.
        
        // Regex: Finde den Text, der noch nicht in einem span mit id="cue_uid..." steckt
        // Dies ist eine vereinfachte Methode.
        const regex = new RegExp(`(${safeText})(?![^<]*>)`, 'i'); // 'i' für case-insensitive falls nötig
        
        // Wir fügen das Span ein
        originalHTML = originalHTML.replace(regex, `<span id="${cue.id}">$1</span>`);
    });

    container.innerHTML = originalHTML;
}

/**
 * Funktion: Scrollt das Element ins obere Drittel
 */
function scrollToUpperThird(element) {
    const offsetTop = element.getBoundingClientRect().top + window.scrollY;
    
    // Berechnung: Position des Elements - (1/3 der Fensterhöhe)
    // Wenn du einen festen Header hast, musst du dessen Höhe hier noch abziehen (z.B. - 80)
    const position = offsetTop - (window.innerHeight / 3)+100; 

    window.scrollTo({
        top: position,
        behavior: 'smooth'
    });
}

  // Expose global helper:
  window.enableVttFollow = attachVttFollow;
</script>
        <div class="tagresult" id="tagResult" hidden></div>
        <input type="text" id="linktags" name="linktags" value="" placeholder="z.B. 71;75;80;82;90" hidden>
<script>
        (function(){
          const btn = document.getElementById('btnFind');
          const kw  = document.getElementById('keyword');
          const out = document.getElementById('tagResult');
          const linktags = document.getElementById('linktags');

          function esc(s){
            return String(s).replace(/[&<>\"']/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;','\'':'&#39;'}[c]));
          }

          async function run(){
            const keyword = kw.value.trim();
            out.innerHTML = '';
            if (!keyword) {
              out.innerHTML = '<small>Bitte ein Keyword eingeben.</small>';
              return;
            }

            btn.disabled = true;
            btn.textContent = '...';

            try {
              const url = new URL("https://sicherheitsgigant.de/underground/readsites.php?allin=true");
              url.searchParams.set('ajax', 'findtags');
              url.searchParams.set('keyword', keyword);
              url.searchParams.set('exclude', '0');

              const res = await fetch(url.toString(), {headers: {'Accept':'application/json'}});
              const j = await res.json();
              window.j = j;
              if (!j.ok) throw new Error('ajax failed');

              const lt = j.linktags || '';
              linktags.value = lt;

              if (!j.items || j.items.length === 0) {
                out.innerHTML = '<small>Keine Treffer in den letzten Dateien gefunden.</small>';
                return;
              }

              //let html = '<div><small>Gefunden (neueste zuerst) – übernommen als <span class="mono">'+esc(lt)+'</span>:</small></div>';
              let html = '';
              
              html += `<div id="searchresultlupe" style="margin-left: -40px; font-size: 22px; margin-top: 20px; margin-bottom: 15px;">Suchergebnis:<br></div>`;
              for (const it of j.items) {
                //console.log(encodeURIComponent(it.id));
                //console.log(+encodeURIComponent(it.id), "<li>" + document.querySelector(`div#inboxartikel div[data-indexid="${+encodeURIComponent(it.id)}"]`).outerHTML + "</li>");
                if(encodeURIComponent(it.id) <= window.lastStartRange && encodeURIComponent(it.id) >=  window.firstStartRange) {
                html += `<li>` + document.querySelector(`div#inboxartikel div[data-indexid="${+encodeURIComponent(it.id)}"]`).outerHTML + "</li>";
                } else {
                  //html += `<li><div data-indexid="${+encodeURIComponent(it.id)}" class="h2-preview">` + document.querySelector(`div[data-indexid="${+encodeURIComponent(it.id)}"] h2`).innerHTML + "</div></li>";
                  if(encodeURIComponent(it.id) >=  window.firstStartRange) {
                  //html += "<li>" + document.querySelector(`div[data-indexid="${+encodeURIComponent(it.id)}"]`).outerHTML + "</li>";
                }
                }
                //console.log("<li>" + document.querySelector(`div#inboxartikel div[data-indexid="${+encodeURIComponent(it.id)}"]`).outerHTML + "</li>");
                //html += '<span class="pill"><a href="?id='+encodeURIComponent(it.id)+'" target="_blank">'+esc(it.id)+'</a></span>';
              }
              //html += '';document.querySelector(`section#sectionLeft ul#alllinks #searchdiver`).innerHTML = '<span onclick="' + searchInPlaylist(window.j) + '" id="setalltolist">🔊 Als Playliste erstellen?</span>' + document.querySelector(`section#sectionLeft ul#alllinks #searchdiver`).innerHTML;
              document.querySelector(`section#sectionLeft ul#alllinks #searchdiver`).classList.add("fly-outSearch");
              document.querySelector(`section#sectionLeft ul#alllinks #searchdiver`).innerHTML = '<span id="setalltolist">🔊 Als Playliste speichern?</span>' + html;
              makeliclicklinks();
 const showVideoLinkAlls = document.querySelectorAll("[id^=showVideoLink]"); 

showVideoLinkAlls.forEach(function(element) {
  //console.log(element);
  element.addEventListener('click', (e) => {
    console.log(e);
  e.preventDefault();
sentinelVideoAll.innerHTML = "";
  console.log(e, e.target.getAttribute('data-url'));
  //videosource.src = e.target.getAttribute('data-url');
source = document.createElement('source');
source.removeAttribute('src');
source.setAttribute('src', e.target.getAttribute('data-url'));
source.setAttribute('type', 'video/mp4');

sentinelVideoAll.appendChild(source);
//const checkboxchecker = document.getElementById('followNarration');
//if (checkboxchecker) {
/*
source2 = document.createElement('track');
source2.setAttribute('src', '/webvttdateien/ein_paar_worte_nach_dem_scheidungstermin_2.vtt');
source2.setAttribute('default', '');
source2.setAttribute('label', 'Deutsch');
source2.setAttribute('srclang', 'de');
source2.setAttribute('id', 'trackVtt');
source2.setAttribute('kind', 'subtitles');
sentinelVideoAll.appendChild(source2);
*/
//}
var isPlaying = sentinelVideoAll.currentTime > 0 && !sentinelVideoAll.paused && !sentinelVideoAll.ended 
    && sentinelVideoAll.readyState > sentinelVideoAll.HAVE_CURRENT_DATA;

if (!isPlaying) {
    // Assuming you are intentionally changing the source or reloading
    // You might also set a new src here: sentinelVideoAll.src = 'new_video.mp4';
    sentinelVideoAll.removeAttribute('src'); // This line clears the current source
    sentinelVideoAll.load(); // This reloads the media element based on its current src (or lack thereof)

    const playVideoWhenReady = () => {
        sentinelVideoAll.play().catch(error => {
            console.error("Error attempting to play video:", error);
        });
        // Remove the event listener after it has fired once
        sentinelVideoAll.removeEventListener('canplay', playVideoWhenReady);
    };
    
    // Listen for the 'canplay' event before attempting to play
    sentinelVideoAll.addEventListener('canplay', playVideoWhenReady);
}
console.log({
  src: source.getAttribute('src'),
  src: source.getAttribute('src'),
  type: source.getAttribute('type'),
});
videoContainerAll.addEventListener('ended', () => {
            console.log('Video ist zu Ende!');
        });
  videoContainerAll.classList.add('show');
    videoContainerAll.classList.remove('hidden');

});
});

setsearchli();
              //out.innerHTML = html;

            } catch(e) {
              console.log(e);
              out.innerHTML = '<small>Fehler bei der Suche.</small>' + e;
            } finally {
              btn.disabled = false;
              btn.textContent = 'Suchen';
              document.querySelector(`section#sectionLeft ul#alllinks #searchdiver`).addEventListener('click', (e) => {
searchInPlaylist(window.j);
    });
            }
          }

          btn.addEventListener('click', run);
          kw.addEventListener('keydown', (ev) => {
            if (ev.key === 'Enter') { ev.preventDefault(); run(); }
          });

          function setsearchli() {
const MOBILE_BREAKPOINT = 750;

function getTopPercentForIndex(i, count) {
    // Desktop: z.B. 5%, 25%, 45%, 65%, 85% ...
    // Dynamisch verteilt (oben/unten mit etwas Rand)
    const start = 8;   // % oben
    const end = 85;    // % unten
    if (count <= 1) return start;
    const step = (end - start) / (count - 1);
    return start + step * i;
  }

  function isMobile() {
    return window.innerWidth < MOBILE_BREAKPOINT;
  }
    var ul = document.querySelector("div#searchdiver");
    const lis = Array.from(ul.querySelectorAll("li"));
console.log(ul.style, ul.height);
    // Reset
    lis.forEach(li => {
      li.classList.remove("fly-in");
      li.style.transitionDelay = "0ms";
      li.style.top = "";
      li.style.left = "";
    });

    if (!isMobile()) {
      // Desktop: absolute Position + top%-Staffel
        let newtop = 0;//document.querySelector("ul#alllinks div#searchdiver").getBoundingClientRect().top + document.querySelector("body").getBoundingClientRect().top;
      lis.forEach((li, i) => {
          li.removeAttribute('style');
          ul.height = li.getBoundingClientRect().height+5;
          //newtop = document.querySelector("ul#alllinks div#searchdiver").getBoundingClientRect().top + document.querySelector("body").getBoundingClientRect().top;
          
          console.log(newtop);
        li.style.left = "0px";
        li.style.top = "0px";
        li.style.marginTop = 10 + "px";
        li.style.maxWidth = "247px";
        li.style.display = "list-item";
        li.style.position = "relative";
          
      li.style.transition = "top " + (i+1)*500 + "ms cubic-bezier(.2,.9,.2,1), opacity " + (i+1)*500 + "ms ease;";
          li.classList.add("fly-inSearch_" + i);
          newtop += li.getBoundingClientRect().height+15;
      });
    } else {
      // Mobile: normale Flow-List → sicherstellen, dass sie nicht absolut bleibt
      lis.forEach(li => {
        li.style.position = ""; // lässt Media Query entscheiden
        li.style.top = "";
        li.style.left = "";
      });
    }
ul.classList.remove("fly-outSearch");
ul.classList.add("fly-inSearch");
    return lis;
  }

        })();
      </script>
  <style>
.textZoom .theme-toggle {
    position: relative;
    display: block;
    align-items: center;
    gap: 10px;
    background: #434343 !important;
    padding: 8px 10px;
    border-radius: 20px;
    border: none;
    cursor: pointer;
    color: #fff;
    font-size: 14px;
    /* top: 2vh; */
    /* right: 2vh; */
}

.theme-toggle:hover {
  background: #000;
}
  </style>
  <script>
  let body = document.body;
  let themeIcon = document.getElementById("theme-icon");

  if(localStorage.getItem('sicherheitsgigant_status') == 'darkness_active') {
    
    themeIcon.textContent = "☀️";
  }
function toggleTheme() {
  

  if (body.classList.contains("dark-mode") && localStorage.getItem('sicherheitsgigant_status') == 'darkness_active') {
    // Switch to light theme
    body.classList.remove("dark-mode");
    localStorage.removeItem("sicherheitsgigant_status");
    themeIcon.textContent = "🌙";
  } else {
    // Switch to dark theme
    body.classList.add("dark-mode");
    localStorage.setItem('sicherheitsgigant_status', 'darkness_active');
    themeIcon.textContent = "☀️";
  }
}
//toggleTheme();
  </script>
<div id="allsettingsdiv" class="hidden">
  <span onclick="window.showsettingsyn()">❌</span>
  <h3>Sicherheitsgigant Usersettings</h3>
<div class="weatherbox" style="display: block; position: relative; top: 0px;">
  <label name="weatherzoneinput">Ort für Wetter im Header-Bild ändern:</label>
          <input type="text" id="weatherzoneinput" name="weatherzone" value="" placeholder="Ort eintragen">
          <button class="btn2" type="button" id="btnweatherzoneFind">Ort ändern</button>
<div id="nogeneratePlaylistcontroltxt" class="hidden">Ohne Playliste ab letzten Beitrag Autoplay starten?</div>
<div id="nogeneratePlaylistback" class="hidden">⏮️ voriegen Beitrag vorlesen lassen?</div>
<div id="nogeneratePlaylistplay" class="hidden">▶️ §entinel letzten Beitrag erneut ansehen?</div>
<div id="nogeneratePlaylistnext" class="hidden">⏭️ nächsten Beitrag vorlesen lassen?</div>
<div id="generatePlaylist" class="hidden">Playliste für Autostart erstellen?</div>
<div id="generatePlaylisttxt" class="hidden">Beitrag anklicken um ihn zur Playliste hinzuzufügen.</div>
<div id="allsettingsdivout"></div>
<div id="nogeneratePlaylistreadall" class="hidden">⏬ alle Beiträge aus dem Posteingang in Playliste?</div>
<div id="videoplaconsole" class="hidden">▶️ §entinel Playliste vorlesen lassen?</div>
<div id="allsettingsdivin"></div>
        </div>
</div>
    <textarea
    readonly
    class="event-log-contents"
    rows="1"
    cols="30"
    id="eventLog"></textarea>
      <script type="module">
    import translate from "https://cdn.jsdelivr.net/npm/translate/index.min.js";
    let translatetext;
translate.engine = "google"; // "google", "yandex", "libre", "deepl"
//translate.key = process.env.DEEPL_KEY;
async function translateTXT(thisTXT) {
translatetext = await translate(thisTXT, 'de');
//console.log(text);
document.getElementById("weathermain").innerHTML = document.getElementById("weathermain").innerHTML + ' ' +  `<div id="wetterstatusTXT">${translatetext}</div>` ;
return translatetext;
}


let schowsettingsdata = true; 

window.showsettingsyn = function () { if(schowsettingsdata) { document.querySelector('#allsettingsdiv').classList.remove('hidden'); schowsettingsdata = false; } else { document.querySelector('#allsettingsdiv').classList.add('hidden'); schowsettingsdata = true; }}

const weatherboxbtn = document.querySelector('#btnweatherzoneFind');
const weatherboxkw = document.querySelector('#weatherzoneinput');
const allsettingsout = document.querySelector('#allsettingsdivout');
const settingsclicker = document.querySelector('div#showsecuregiantsettings span#settingsclicker')?.addEventListener('click', async (e) => { console.log(e); });

async function runnewwather(out = null) {
console.log(out);
            const weatherboxkwin = weatherboxkw.value.trim();
            allsettingsout.innerHTML = '';
            if (!weatherboxkwin) {
              allsettingsout.innerHTML = '<small>Bitte einen Ort eingeben.</small>';
              return;
            }

            weatherboxbtn.disabled = true;
            weatherboxbtn.textContent = '...';
           var newwatherzone = weatherboxkwin;
           weatherboxkw.value = "";
return callweatherzoneData(newwatherzone);
}
weatherboxbtn.addEventListener('click', runnewwather);
weatherboxkw.addEventListener('keydown', (ev) => {
  if (ev.key === 'Enter') { ev.preventDefault(); runnewwather(ev); }
});

//console.log(translateTXT("Fuck the World"));
async function callweatherzoneData(newwatherzone = null) {
//console.log("RUN NEW ZONE " + newwatherzone);
let link = "https://api.openweathermap.org/data/2.5/weather?q=" + newwatherzone + "&units=metric&apikey=dc989810ec5879216998f7685d8d2057";
var request = new XMLHttpRequest();
request.open('GET',link,true);
request.onload = function(){
 var obj = JSON.parse(this.response);
 if (request.status >= 200 && request.status < 400) {
 var temp = obj.main.temp;
 var temp2=Math.ceil(temp);
 var feel=obj.main.feels_like;
 weatherboxbtn.disabled = false;
weatherboxbtn.textContent = 'Ort ändern';


localStorage.setItem('sicherheitsgigant_weatherzone', newwatherzone);
 //document.querySelector("#weatherfeel").innerHTML="Gefühlt:"+feel+"&#176;c";

 //document.querySelector("#weathermax").innerHTML="maximal:"+obj.main.temp_max+"&#176;c";
 //document.querySelector("#weathermin").innerHTML="minimal:"+obj.main.temp_min+"&#176;c";

 //console.log(temp+" derece");
 //console.log(feel);
 //console.log(obj)
 var icon=obj.weather[0].icon;
 //console.log(obj.weather[0].icon);
 //console.log(translateTXT(obj.weather[0].description));
 //console.log(obj.name);
 var name= document.querySelector("#tem").innerHTML=obj.name;
 var t=document.querySelector("#temp").innerHTML=temp2+"&#176;c";
 var img=document.querySelector("#weatherimg #img");
img.setAttribute("src","./images/3D"+icon+".png");
 function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}
function getRandomIntNext(max, last) {
  var outPutNumber = Math.floor(Math.random() * max);
  if(outPutNumber != last) {
  return outPutNumber;
} else {
  getRandomIntNext(max, last);
}
}
 }
 else{
  console.log("The city doesn't exist! Kindly check");
 }
 }
 
request.send();
}
var setzonew = localStorage.getItem('sicherheitsgigant_weatherzone');
if(typeof localStorage.getItem('sicherheitsgigant_weatherzone') != "string") {
  localStorage.setItem('sicherheitsgigant_weatherzone', "Berlin");
 callweatherzoneData("Berlin");
} else {
  callweatherzoneData(setzonew);
}
  </script>
  <!-- script src="//unpkg.com/hammer-touchemulator@0.0.2/touch-emulator.js"></script>
  <script>TouchEmulator()</script -->
    <script>

if (document.readyState === "loading") {
  // Loading hasn't finished yet
  //document.addEventListener("DOMContentLoaded", doSomething);
} else {
}
const log = document.querySelector(".event-log-contents");
  var errorLog = [];
window.addEventListener("error", (event) => {
  log.textContent = `${log.textContent}${event.type}: ${event.message}\n`;

  var errorInfo = {
    message: event.message,  // Fehlermeldung
    source: event.filename, // Datei, in der der Fehler aufgetreten ist
    lineNumber: event.lineno, // Zeilennummer des Fehlers
    columnNumber: event.colno, // Spaltennummer des Fehlers
    timestamp: new Date().toISOString() // Zeitstempel des Fehlers
  };

  errorLog.push(errorInfo);
    if(typeof localStorage.getItem('devshow') == "string") {
  showinfosdiver(`${log.textContent}${event.type}: ${event.message}\n`, JSON.stringify(errorLog), 0);
    }
  //logger.disableLogger();
  console.log(event);
  console.log(errorInfo);
  console.table(JSON.stringify(errorLog));
});
document.addEventListener("keydown", function (e) {

  // Beispiel: STRG + ALT + V
  if (e.ctrlKey && e.altKey && e.key.toLowerCase() === "v") {
    e.preventDefault();

    const el = document.querySelector('#plaeceholderdiv h2 span');
    if (el) el.click();
  }

});

/*let lastTap = 0;

document.addEventListener("touchend", function () {
  const now = Date.now();
  if (now - lastTap < 300) {
    document.getElementById("showVideoLink")?.click();
  }
  lastTap = now;
});*/
let javascript_array_pl = {};
let userispaused = false;
let playlistend = false;
let playliststart = false;
let keys, i;
if(typeof localStorage.getItem('videoshowbtn') != "string") {
localStorage.setItem('videoshowbtn', "0");
}
if(typeof localStorage.getItem('videoplaylist') != "string") {
localStorage.setItem('videoplaylist', "{}");
}
if(typeof localStorage.getItem('lastvideoshow') != "string") {
localStorage.setItem('lastvideoshow', Object.keys(javascript_array)[Object.keys(javascript_array).length-1]);
}
if(typeof localStorage.getItem('videoshowbtn') == "string") { 
   //keys = Object.keys(javascript_array), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
if(typeof localStorage.getItem('lastvideoshow') == "string") {
    if(localStorage.getItem('lastvideoshow') != "0") {
    //console.log(localStorage.getItem('lastvideoshow'), javascript_array, "NEXT: " + keys[i + 1].replace('index', ''), "ZURÜCK: " + keys[i - 1].replace('index', ''));
    //document.querySelector('#nogeneratePlaylistback').classList.remove('hidden');
    //document.querySelector('#nogeneratePlaylistplay').classList.remove('hidden');
    //document.querySelector('#nogeneratePlaylistnext').classList.remove('hidden');
    //document.querySelector('#nogeneratePlaylistcontroltxt').classList.remove('hidden');
    document.querySelector('#generatePlaylisttxt').classList.remove('hidden');
    //document.querySelector(`[data-indexid="${keys[i + 1].replace('index', '')}"] span`).click();

    
    }
}

document.querySelector('#nogeneratePlaylistreadall').classList.remove('hidden');
document.querySelector('#generatePlaylist').classList.remove('hidden');
document.querySelector('#nogeneratePlaylistreadall').addEventListener('click', (e) => {
document.querySelector(`#allsettingsdivin`).innerHTML = "";
Object.keys(javascript_array).forEach(function(key) {
console.log(key);
    document.querySelector(`#allsettingsdivout #${key.replaceAll('"', '')}`).click();
});
document.querySelector('#nogeneratePlaylistreadall').classList.add('hidden');
     });
    document.querySelector('.playlistOfSeninel').innerHTML = `<div id="idofsentispan"><span id="sentinelAutorun"></span></div>` + document.querySelector('.playlistOfSeninel').innerHTML;
    document.querySelector('div#idofsentispan').addEventListener('click', (e) => { 
        $('div#idofsentispan').animate({ width: "50" }); $('div#idofsentispan').css({ backgroundColor: 'transparent' }); $('div#idofsentispan').html('<span id="sentinelAutorun"></span>');
        document.querySelector('#allsettingsdivout').innerHTML = "";
        var newInnerHTML = "";
        var newInnerCounter = 0;
window.showsettingsyn();
        Object.keys(javascript_array).forEach(function(key) {
var selectedImgDiv = document.querySelector('#' + javascript_array[key].split("::##::")[2] + "div");
  //console.log(typeof selectedImgDiv.querySelector("img.articleimages"), selectedImgDiv.querySelector("img.articleimages"), selectedImgDiv.querySelector("img.articleimages") != null);

  //console.log(key, javascript_array[key].split("::##::")[1]);
            if(selectedImgDiv.querySelector("img.articleimages") != null) {
                console.log(selectedImgDiv.querySelector("img.articleimages").outerHTML);
newInnerHTML += `<div class="selectedVideoArticle" id="${keys[newInnerCounter]}">` + document.querySelector('#allsettingsdivout').innerHTML + selectedImgDiv.querySelector("img.articleimages").outerHTML + javascript_array[key].split("::##::")[1] + '</div>';
            } else {
                newInnerHTML +=  `<div class="selectedVideoArticle" id="${keys[newInnerCounter]}">` + document.querySelector('#allsettingsdivout').innerHTML + javascript_array[key].split("::##::")[1] + '</div>';
            }
            newInnerCounter++;
});

            console.log(newInnerHTML);
        document.querySelector('#allsettingsdivout').innerHTML = newInnerHTML;
var setonthislistner = document.querySelectorAll('#allsettingsdivout .selectedVideoArticle');
    setonthislistner.forEach((seldivthis) => {
    seldivthis.addEventListener('click', (e) => {
        document.querySelector('#generatePlaylist').classList.remove('hidden');
        document.querySelector('#nogeneratePlaylistback').classList.add('hidden');
    document.querySelector('#nogeneratePlaylistplay').classList.add('hidden');
    document.querySelector('#nogeneratePlaylistnext').classList.add('hidden');
    document.querySelector('#nogeneratePlaylistcontroltxt').classList.add('hidden');
console.log(javascript_array[e.target.id], e.target.outerHTML, parseInt(e.target.id.replace("index", "")));
        javascript_array_pl[`"${e.target.id}"`] = javascript_array[e.target.id];
        if(Object.keys(javascript_array_pl).length == 1) {
            //localStorage.removeItem("lastvideoshow");
            document.querySelector('#videoplaconsole').classList.remove('hidden');
            localStorage.setItem("videoplaylist",JSON.stringify(javascript_array_pl));
            document.querySelector('#videoplaconsole').addEventListener('click', (e) => {
                document.querySelector('div#allsettingsdiv span').click();
                Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replace("index", "").replaceAll('"', "").replaceAll("'", "");
                document.querySelector(`[data-indexid="${Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replace("index", "").replaceAll('"', "").replaceAll("'", "")}"] span`).click();
            });
        }else if(Object.keys(javascript_array_pl).length > 1) {
            document.querySelector('#videoplaconsole').classList.remove('hidden');
            localStorage.setItem("videoplaylist",JSON.stringify(javascript_array_pl));
            document.querySelector('#videoplaconsole').addEventListener('click', (e) => {
                document.querySelector('div#allsettingsdiv').classList.add('hidden');
                document.querySelector(`[data-indexid="${Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replace("index", "").replaceAll('"', "").replaceAll("'", "")}"] span`).click();
                localStorage.setItem('lastvideoshow', 'index' + Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replace("index", "").replaceAll('"', "").replaceAll("'", ""));
            });
        } else {
document.querySelector('#videoplaconsole').classList.add('hidden');
        }
        console.log(JSON.parse(localStorage.getItem('videoplaylist')));
        document.querySelector('#allsettingsdivin').innerHTML = document.querySelector('#allsettingsdivin').innerHTML + e.target.outerHTML;
        e.target.classList.add('hidden');
        var setonthislistnerinout = document.querySelectorAll('#allsettingsdivin .selectedVideoArticle');
    setonthislistnerinout.forEach((seldivthisinout) => {
    seldivthisinout.addEventListener('click', (e) => {
        document.querySelector('#allsettingsdivout #' + e.target.getAttribute('id')).classList.remove('hidden');
        var showobjectok = JSON.parse(localStorage.getItem('videoplaylist'));
        delete showobjectok[`"${e.target.getAttribute('id')}"`];
        Object.keys(showobjectok);
console.log(showobjectok);
localStorage.setItem('videoplaylist', JSON.stringify(showobjectok));
e.target.remove();
        });
});
});
});
if(typeof localStorage.getItem('videoplaylist') == "string") {
document.querySelector(`#allsettingsdivin`).innerHTML = "";
Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).forEach(function(key) {
console.log(key);
    document.querySelector(`#allsettingsdivout #${key.replaceAll('"', '')}`).click();
});
    }
    });
/*
if(typeof localStorage.getItem('lastvideoshow') == "string" && typeof localStorage.getItem('videoshowbtn') == "string") { 
//Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1]
//Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0]
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0 || typeof localStorage.getItem('videoplaylist') != "string") {
if((Object.keys(javascript_array)[Object.keys(javascript_array).length-1] != localStorage.getItem('lastvideoshow') && Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow'))) {
document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    } else if(Object.keys(javascript_array)[Object.keys(javascript_array).length-1] == localStorage.getItem('lastvideoshow') && Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow')) {
      document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" class="hidden" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    } else {
      document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" class="hidden" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    }
} else {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1].replaceAll('"', '') != localStorage.getItem('lastvideoshow') && Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replaceAll('"', '') != localStorage.getItem('lastvideoshow')) {
document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    } else if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1].replaceAll('"', "") == localStorage.getItem('lastvideoshow') && Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0].replaceAll('"', "") != localStorage.getItem('lastvideoshow')) {
      document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" class="hidden" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    } else {
      document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" class="hidden" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    }
  }
}*/
}

if(localStorage.getItem('videoshowbtn') == "0") {let newintervalId = setInterval(() => { if (newintervalId == null) return; $('div#idofsentispan').animate({ width: "465" }); $('div#idofsentispan').css({ backgroundColor: '#fe0707' }); $('div#idofsentispan').html('<span id="sentinelAutorun"></span> NEW FUNCTION - PlayList & Autoplay 👈 KLICK'); newintervalId = null; clearInterval(newintervalId); 
let newintervalIdnext = setInterval(() => {  if (newintervalIdnext == null) return; $('div#idofsentispan').animate({ width: "50" }); $('div#idofsentispan').css({ backgroundColor: 'transparent' }); $('div#idofsentispan').html('<span id="sentinelAutorun"></span>'); newintervalIdnext = null; clearInterval(newintervalIdnext); 
    }, 8000);
}, 5000);
localStorage.setItem('videoshowbtn', "1");
    }
function controlsofvid(e) {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0) {
/**
 * Playlist hat keine Einträge
 */
keys = Object.keys(javascript_array); 
i = keys.indexOf(localStorage.getItem('lastvideoshow'));
} else {
/**
 * Playlist hat Einträge
 */
keys = Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))); 
i = keys.indexOf(`"${localStorage.getItem('lastvideoshow')}"`);
}

const displaytxt = document.getElementById('displaytxt');
const display = document.getElementById('display');
const cancelBtn = document.getElementById('cancelBtn');
displaytxt.classList.add("hidden");
display.classList.add("hidden");
cancelBtn.classList.add("hidden");
/**
 * Hier pausedlasvid
 */
if(e.currentTarget.id == "pausedlasvid") {
sentinelVideoAll.pause();
    userispaused = true;
}
/**
 * Hier playlasvid
 */
if(e.currentTarget.id == "playlasvid") {
        if(!userispaused) {
            sentinelVideoAll.pause();
            $('ul#alllinks div[data-indexid="' + localStorage.getItem('lastvideoshow').replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + localStorage.getItem('lastvideoshow').replace('index', '').replaceAll('"', "") + '"]').click();
            localStorage.setItem('lastvideoshow', localStorage.getItem('lastvideoshow'));
            window.enableVttFollow(localStorage.getItem('lastvideoshow').replace('index', '').replaceAll('"', ""));
        } else {
            sentinelVideoAll.play();
        }
    }

/**
 * Hier playonebackvid
 */
console.log(i, Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length);
if(e.currentTarget.id == "playonenextvid") {
if(document.querySelector('span#playonebackvid').classList.contains("hidden")) {
console.log(document.querySelector('span#playonebackvid').classList.remove("hidden"));
}
  if(playlistend) {
if(i != Object.keys(javascript_array).length+1) {
keys = Object.keys(javascript_array); 
i = keys.indexOf(localStorage.getItem('lastvideoshow'));
$('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
window.enableVttFollow(keys[i + 1].replace('index', '').replaceAll('"', ""));
document.querySelector('span#playlasvid').click();
} else {
  document.getElementById('playonenextvid').classList.add("hidden");
  playlistend = false;
}
} else {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length != 0) {
  if(i != Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length+1) {
  console.log(keys[i + 1],keys);
  $('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
  window.enableVttFollow(keys[i + 1].replace('index', '').replaceAll('"', ""));
  document.querySelector('span#playlasvid').click();
  } else {
showinfosdiver("Playlist-Ende erreicht! Erneut klicken um Playlist zu verlassen.", 0);
playlistend = true;
  }
}
}
}
/**
 * Hier playonenextvid
 */
if(e.currentTarget.id == "playonebackvid") {
if(document.querySelector('span#playonenextvid').classList.contains("hidden")) {
console.log(document.querySelector('span#playonenextvid').classList.remove("hidden"));
}
if(playliststart) {
if(Object.keys(javascript_array)[Object.keys(javascript_array).length-1] != localStorage.getItem('lastvideoshow')) {
  if(document.querySelector('span#playonebackvid').classList.contains("hidden")) {
console.log(document.querySelector('span#playonebackvid').classList.remove("hidden"));
  }
keys = Object.keys(javascript_array); 
i = keys.indexOf(localStorage.getItem('lastvideoshow'));
$('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
document.querySelector('span#playlasvid').click();
window.enableVttFollow(keys[i + 1].replace('index', '').replaceAll('"', ""));
} else {
  document.getElementById('playonebackvid').classList.add("hidden");
  playliststart = false;
}
} else {
if(document.querySelector('span#playonebackvid').classList.contains("hidden")) {
console.log(document.querySelector('span#playonebackvid').classList.remove("hidden"));
}
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length != 0) {
    if(i != 0) {
  console.log(keys[i - 1].replace('index', '').replaceAll('"', ""));
  $('ul#alllinks div[data-indexid="' + keys[i - 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i - 1].replace('index', '').replaceAll('"', "") + '"]').click();
  window.enableVttFollow(keys[i - 1].replace('index', '').replaceAll('"', ""));
  document.querySelector('span#playlasvid').click();
  } else {
showinfosdiver("Playlist-Anfang erreicht! Erneut klicken um Playlist zu verlassen.", 0);
playliststart = true;
  }
  }
}
}
return;

/**
 * Hier playonebackvid
 */
if(e.currentTarget.id == "playonebackvid") {
  sentinelVideoAll.pause();
  if(playlistend) { 
var keys = Object.keys(javascript_array), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
//console.log( "clicked", keys, i, keys[i - 1], e, e.currentTarget.id, Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow'));
$('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
return;
//showinfosdiver("Playlist ende erreicht! STEP 2", 0);
}
var obj = JSON.parse(localStorage.getItem('videoplaylist'));
console.log(obj.hasOwnProperty(`${localStorage.getItem('lastvideoshow')}`));
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1] == `"${localStorage.getItem('lastvideoshow')}"` || Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0] == `"${localStorage.getItem('lastvideoshow')}"`) {
  if((Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow') || Object.keys(javascript_array)[Object.keys(javascript_array).length-1] != localStorage.getItem('lastvideoshow')) && !playlistend) {
            showinfosdiver("Playlist ende erreicht! Erneut klicken um Playlist zu verlassen.", 0);
            playlistend = true;
return;
          } else if((Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow') || Object.keys(javascript_array)[Object.keys(javascript_array).length-1] == localStorage.getItem('lastvideoshow')) && playlistend) {
            playlistend = false;
console.log( "clicked", keys, i, keys[i - 1], e, e.currentTarget.id, Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow'));
showinfosdiver("Letzter Britrag wurde erreicht!.", 0);
          }
} else {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0 || typeof localStorage.getItem('videoplaylist') != "string") {
var keys = Object.keys(javascript_array), i = keys.indexOf(`${localStorage.getItem('lastvideoshow').replaceAll('"', "")}`);
} else {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0) {
var keys = Object.keys(javascript_array), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
} else {
    var keys = Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
}
}
}
console.log( "clicked", keys, i, keys[i - 1], e, e.currentTarget.id, localStorage.getItem('lastvideoshow'));
        
        $('ul#alllinks div[data-indexid="' + keys[i - 1].replaceAll('"', "").replace('index', '') + '"] span[data-indexid="' + keys[i - 1].replaceAll('"', "").replace('index', '') + '"]').click();
    if(localStorage.getItem('lastvideoshow') == localStorage.getItem('lastvideoshow')) {
document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
    }
    localStorage.setItem('lastvideoshow', keys[i - 1].replaceAll('"', ""));
    if(Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow')) {
    document.querySelector("span#playonebackvid").remove();
    }
    }
/**
 * Hier playonenextvid
 */
if(e.currentTarget.id == "playonenextvid") {
sentinelVideoAll.pause();
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0 || typeof localStorage.getItem('videoplaylist') != "string") {
var keys = Object.keys(javascript_array), i = keys.indexOf(`${localStorage.getItem('lastvideoshow').replaceAll('"', "")}`);
} else {
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0) {
var keys = Object.keys(javascript_array), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
} else {
if(playlistend) { 
var keys = Object.keys(javascript_array), i = keys.indexOf(localStorage.getItem('lastvideoshow'));
//console.log( "clicked", keys, i, keys[i - 1], e, e.currentTarget.id, Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow'));
$('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
return;
}
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1] == `"${localStorage.getItem('lastvideoshow')}"` || Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0] == `"${localStorage.getItem('lastvideoshow')}"`) {
  if((Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow') || Object.keys(javascript_array)[Object.keys(javascript_array).length-1] != localStorage.getItem('lastvideoshow')) && !playlistend) {
            showinfosdiver("Playlist ende erreicht! Erneut klicken um Playlist zu verlassen.", 0);
            playlistend = true;
return;
          } else if((Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow') || Object.keys(javascript_array)[Object.keys(javascript_array).length-1] == localStorage.getItem('lastvideoshow')) && playlistend) {
            playlistend = false;
console.log( "clicked", keys, i, keys[i - 1], e, e.currentTarget.id, Object.keys(javascript_array)[0] == localStorage.getItem('lastvideoshow'));
showinfosdiver("Letzter Britrag wurde erreicht!.", 0);
          }
}
}
}
        $('ul#alllinks div[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"] span[data-indexid="' + keys[i + 1].replace('index', '').replaceAll('"', "") + '"]').click();
//console.log( "clicked", keys, i, keys[i + 1], e, e.currentTarget.id, localStorage.getItem('lastvideoshow'));
if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length == 0 || typeof localStorage.getItem('videoplaylist') != "string") {
        if(Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow')) {
            document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
        }
        localStorage.setItem('lastvideoshow', keys[i + 1]);
} else {
        if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[Object.keys(JSON.parse(localStorage.getItem('videoplaylist'))).length-1] == localStorage.getItem('lastvideoshow')) {
            document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
            if(Object.keys(javascript_array)[0] != localStorage.getItem('lastvideoshow')) {
            showinfosdiver("Playlist ende erreicht!", 0);
          }
        }
        if(Object.keys(JSON.parse(localStorage.getItem('videoplaylist')))[0] == localStorage.getItem('lastvideoshow')) {
            document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';
        }
        localStorage.setItem('lastvideoshow', keys[i + 1].replaceAll('"', ""));
}
        if(Object.keys(javascript_array)[Object.keys(javascript_array).length-1] == localStorage.getItem('lastvideoshow')) {
          if(document.querySelector("span#playonenextvid") != null) {
        }
        }
    }
}
document.querySelector("div.videocontrolerOfSeninel").innerHTML = '<span id="playonebackvid" title="Beitrag vor letzten gesehenen vorlesen lassen?">⏮️</span> <span id="playlasvid" title="Letzten gesehenen Beitrag erneut vorlesen lassen?">▶️</span> <span id="pausedlasvid" title="Beitrag pausieren?">⏸️</span> <span id="playonenextvid" title="Nächsten Beitrag vorlesen lassen?">⏭️</span>';

$("span#playonebackvid").on( "click", controlsofvid );
$("span#playonenextvid").on( "click", controlsofvid );
$("span#playlasvid").on( "click", controlsofvid );
$("span#pausedlasvid").on( "click", controlsofvid );
//document.querySelector("div#infostobottom span#playlasvid").click();
//controlsofvid();

let path = window.location.pathname;

let pathArray = path.split('/'); 
let cleanPathArray = path.split('/').filter(Boolean);

//console.log(cleanPathArray); 

if(typeof cleanPathArray[0] != "undefined") {
//console.log(document.querySelector(`div#artikel div span`).getAttribute("data-indexid"), cleanPathArray[0]);
    localStorage.setItem('lastvideoshow', 'index' + document.querySelector(`div#artikel div span`).getAttribute("data-indexid"));
}

if(typeof cleanPathArray[1] != "undefined") {
console.log(cleanPathArray[1]);
}
function openthisfunktion(e) {
$("div#infodiverNews span#sentinelAutorun").click();
}
function sleep(ms) {
      return new Promise((resolve) => setTimeout(resolve, ms));
  }

function showinfosdiver(showinfo, waiting, closing = 6000) {
  waiting = waiting * 1000;
sleep(waiting).then(() => {
    $('div#infodiverNews').animate({ width: "435" }); $('div#infodiverNews').css({ backgroundColor: '#fe0707' }); 
    $('div#infodiverNews').html('<span id="sentinelAutorunInf"></span> ' + showinfo + '');
    $("div#infostobottom span#sentinelAutorunInf").on("click", openthisfunktion);
    sleep(closing).then(() => {
      $('div#infodiverNews').animate({ width: "0" }); $('div#infodiverNews').css({ backgroundColor: 'transparent' }); 
      $('div#infodiverNews').html('<span id="sentinelAutorunInf"></span>');
  });
  });
}

async function searchInPlaylist(j) {
let loadstolist = {};
var setfirstelement = true;
if (!j.ok)
                    throw new Error('ajax failed');

console.log(j);
j.items.forEach(function(element) {
    if(window.firstStartRange <= element.id) {
    //console.log('[data-indexid="' + element.id + '"]', document.querySelector('div#searchdiver div[data-indexid="' + element.id + '"]'));
    loadstolist[`"index${element.id}"`] = document.querySelector('div#searchdiver div[data-indexid="' + element.id + '"] span').getAttribute("data-url") + "::##::" + element.title + "::##::" + document.querySelector('div#searchdiver div[data-indexid="' + element.id + '"]').id;
    
  if(setfirstelement) {
localStorage.setItem('lastvideoshow', 'index' + element.id);
  setfirstelement = false;
  }
  }
});
localStorage.setItem('videoplaylist', JSON.stringify(loadstolist));
showinfosdiver("Suchergebnis als Playlist gespeichert!", 0);
    return loadstolist;
}

</script>
<div onclick="window.showsettingsyn()" id="showsecuregiantsettings"><span id="settingsclicker">⚙️</span>
</div>
<div id="infodiverNews">
</div>

<script src="https://cdn.bootcss.com/html2pdf.js/0.9.1/html2pdf.bundle.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js" integrity="sha512-GsLlZN/3F2ErC5ifS5QtgpiJtWd43JWSuIgh7mbzZ8zBps+dvLusV+eNQATqgA/HdeKFVgA5v3S/cIrLF7QnIg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script>
  function startPrintStep() {
    showinfosdiver("PDF wird erzeugt - Bitte warten!", 0, 20000);
let fundtxtH2 = "";
let fundtxtH3 = "";
let fundtxtDate = "";

let container = document.querySelector("div#plaeceholderdiv p");
let originalHTML = container.innerHTML + `<img src="./images/signature.png" class="ste-signature" alt="Digitalsignatur" /><br>Digitalsignatur!`;

var contentfromdivinner = document.createElement('div');
contentfromdivinner.setAttribute('id', 'pagePaperdivinner');

var contentfromdiv = document.createElement('div');
contentfromdiv.setAttribute('id', 'pagePaperdivouter');
contentfromdiv.setAttribute('style', 'font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; padding: 25px;font-size:calc(1rem * var(--article-scale)) !important; margin-left: 20%; background: #fff; color:#000; width: 195mm; position: absolute;');

// Wählt alle h2 und h3 Elemente aus
const headingsH2 = document.querySelectorAll('div#plaeceholderdiv h2');
const headingsH3 = document.querySelectorAll('div#plaeceholderdiv h3');
const headingsDate = document.querySelectorAll('div#plaeceholderdiv span.datespan');

// Extrahiert den reinen Text (ohne HTML)
const headingTextsH2 = Array.from(headingsH2).map(h => h.textContent.trim());
const headingTextsH3 = Array.from(headingsH3).map(h => h.textContent.trim());
const headingTextsDate = Array.from(headingsDate).map(h => h.textContent.trim());

headingTextsH2.forEach(el => {
    console.log(el.replace("📣 *§entinel vorlesen lassen?",""));
    fundtxtH2 += el.replace("📣 *§entinel vorlesen lassen?","");
    console.log(el);
});

headingTextsH3.forEach(el => {
    console.log(el);
    fundtxtH3 += el;
    console.log(el);
});

headingTextsDate.forEach(el => {
    console.log(el);
    fundtxtDate += el;
    console.log(el);
});
console.log(fundtxtH2, fundtxtH3, fundtxtDate);
contentfromdivinner.innerHTML = "<h2>" + fundtxtH2 + "</h2>" + fundtxtDate + "<br><h3>" + fundtxtH3 + "</h3><br>" + originalHTML;
contentfromdiv.appendChild(contentfromdivinner);
body.appendChild(contentfromdiv);

console.log(headingTextsH2);
console.log(headingTextsH3);

const headingsSharebox = document.querySelectorAll('div#pagePaperdivouter div.sharebox, div#pagePaperdivouter span');

headingsSharebox.forEach(el => {
    //console.log(el.remove());
});
const elemente = document.querySelectorAll('div#pagePaperdivouter h2, div#pagePaperdivouter h3, div#pagePaperdivouter img.articleimages');

// Iterieren durch die Elemente
elemente.forEach(el => {
    console.log(el.tagName, el, el.innerTEXT);
});
let containersize = document.querySelector("div#pagePaperdivouter").getBoundingClientRect();
sleep(500).then(() => {
$('div#pagePaperdivouter').animate({ top: Math.abs(document.querySelector("body").getBoundingClientRect().top-document.querySelector("main").getBoundingClientRect().top) });
sleep(500).then(() => {
insertHrBreaks(document.querySelector('div#plaeceholderdiv h2').id);
});
});
//addHrAtHeight(1000);
console.log(containersize, containersize.top/1040, originalHTML);
}
function insertHrBreaks(nameofh2) {
    const container = document.getElementById('pagePaperdivinner');
    
    // Sicherheitscheck
    if (!container) {
        console.error("Container nicht gefunden!");
        return;
    }
    //const brList = Array.from(container.getElementsByTagName('br'));

    let nextCutoff = 950;
    const step = 950;  
    let count = 1;  


const containers = document.getElementById("pagePaperdivouter");
  const brList = Array.from(containers.getElementsByTagName('br'));
const brRect = containers.querySelectorAll("br");
    console.log(`Starte Berechnung mit ${brList.length} Zeilenumbrüchen...`);
    
    for (let i = 0; i < brList.length; i++) {
        const currentBr = brList[i];
        const currentPos = brRect[i].getBoundingClientRect().top;
        if (currentPos > nextCutoff) {

            let indexToReplace = i > 0 ? i - 1 : i;
            let brToReplace = brList[indexToReplace];

            // Prüfen, ob das Element noch ein BR ist (nicht dass wir es schon bearbeitet haben)
            if (brToReplace.tagName === 'BR') {
                const label = document.createElement('div');
                label.className = 'generated-label'; 
                label.innerHTML = count + " Seite";
                brToReplace.parentNode.replaceChild(label, brToReplace);
                
                console.log(`HR gesetzt bei ca. ${brToReplace.offsetTop}px (Grenze war ${nextCutoff}px)`);
                nextCutoff = label.offsetTop + step;
                count++;
            }
        }
    }
    containers.innerHTML += `<div class="generated-lastlabel">${count} Seite</div>`;
    console.log("Fertig mit Einfügen der HR Tags.");
    document.querySelector("div#pagePaperdivouter").setAttribute('style', 'font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; padding: 55px;font-size:calc(1rem * var(--article-scale)) !important; margin-left: unset; background: #fff; color:#000; width: 185mm; position: relative; top:unset;');
createPDF(document.querySelector('div#pagePaperdivouter'), nameofh2);
//document.querySelector('div#pagePaperdivouter').remove();
}
           function createPDF(loadthisdiv, nameofh2) {
            var element = loadthisdiv;
            html2pdf(element, {
                margin: [0, 0, 0, 0], //top, left, buttom, right,
              pagebreak: {after: '.generated-label'},
                filename: nameofh2 + '.pdf',
                image: { type: 'jpeg', quality: 1 },
              html2canvas: {dpi: 192, scale: window.devicePixelRatio, scrollY: 0, scrollX: 0, letterRendering: true},
                jsPDF: { unit: 'mm', format: 'A4', orientation: 'portrait' },
                class: createPDF
            });
        };

        // 1. Das zu überwachende DIV auswählen
const targetNode = document.getElementById('plaeceholderdiv');

// 2. Callback-Funktion definieren, die bei Änderungen ausgeführt wird
const callback = function(mutationsList, observer) {
    for(let mutation of mutationsList) {
        if (mutation.type === 'childList' || mutation.type === 'characterData') {
            console.log('Inhalt des DIV hat sich geändert!');
            console.log('Neuer Inhalt:', targetNode.innerHTML);
if(document.querySelector('.pdfdownloadArticle').innerHTML == "") {
document.querySelector('.pdfdownloadArticle').innerHTML += "📥";
$("div.pdfdownloadArticle").on( "click", startPrintStep );
}
        }
    }
};

// 3. Observer-Instanz erstellen
const observer = new MutationObserver(callback);

// 4. Konfiguration: Überwache Änderungen am Text und Kindelementen
const config = { childList: true, subtree: true, characterData: true };

// 5. Überwachung starten
observer.observe(targetNode, config);


function loadJSdata(url) {
  var link = document.createElement("script");
  link.src = url;
  link.setAttribute("id", "targetJS");
  document.head.appendChild(link);
}

if(localStorage.getItem('devshow') == "true") {
  loadJSdata("./js/elements.js");
}
</script>
</body>
</html>
