get('admin_sendeplan_page_title', '📅 Sendeplan Admin'); // 🔥 NEU: backLink nur für Admin/Co-Admin $isAdminRole = in_array($userRole ?? '', ['admin', 'co_admin'], true); $backLink = $isAdminRole ? './?AdminIndex' : ''; $hideNav = !$isAdminRole; ob_start(); ?>

get('admin_sendeplan_serie_conflicts_title', '⚠️ {count} Konflikte gefunden')) ?>

get('admin_sendeplan_serie_conflicts_intro', 'Die folgenden Termine überschneiden sich mit bestehenden Sendungen:') ?>

get('admin_sendeplan_serie_conflicts_th_nummer', 'Termin') ?> get('admin_sendeplan_serie_conflicts_th_datum', 'Datum') ?> get('admin_sendeplan_serie_conflicts_th_zeit', 'Zeit') ?> get('admin_sendeplan_serie_conflicts_th_konflikt', 'Konflikt mit') ?>
# –
get('admin_sendeplan_serie_conflicts_hint', '') ?>
$fv): ?> get('admin_sendeplan_serie_conflicts_cancel', '❌ Abbrechen & Zeit ändern') ?>
' . $lang->get('admin_sendeplan_vorlagen_select', '— Vorlage wählen —') . ''; foreach ($vorlagen as $v) { $vBild = htmlspecialchars($v['bild'] ?? '', ENT_QUOTES, 'UTF-8'); $vName = htmlspecialchars($v['name'] ?? '', ENT_QUOTES, 'UTF-8'); $vorlagenOptionsHtml .= ''; } ?>
get('admin_sendeplan_save_success', 'Änderungen wurden erfolgreich gespeichert.') ?>
✖
❌ get('admin_sendeplan_save_error', 'Fehler beim Speichern!') ?> ✖

get('admin_sendeplan_all_title', '📋 Sendeplan Verwaltung') ?> get('admin_sendeplan_filter_prefix', 'am') . " '" . e($filter) . "'" : "" ?> ( get('admin_sendeplan_total', 'insgesamt') ?>)

get('admin_sendeplan_tab_current', '📅 Aktuelle Sendungen') ?> get('admin_sendeplan_tab_expired', '🕐 Abgelaufene Sendungen') ?>
0 ? '&moderator=' . (int)$filterModerator : ''; // 🔥 NEU: Serien-Filter in Pagination mitnehmen $serieGruppeParam = !empty($filterSerieGruppe) ? '&serie_gruppe=' . urlencode($filterSerieGruppe) : ''; if ($currentPage > 1): ?> get('admin_sendeplan_pagination_prev', '« Vorherige') ?> 📄 get('admin_sendeplan_pagination_page', 'Seite') ?> get('admin_sendeplan_pagination_of', 'von') ?> get('admin_sendeplan_pagination_next', 'Nächste »') ?>
0 && (int)$entry['id'] === (int)$errorId); if ($isErrorEntry) { $bgStyle = 'background: rgba(220, 53, 69, 0.15);'; } // 🔥 NEU: Abgelaufene Sendungen sind nur lesbar – aber Admins dürfen löschen! if ($showStatus === 2) { $canEditEntry = false; // 🔥 NEU: Admins und Co-Admins dürfen abgelaufene Sendungen löschen $isAdmin = in_array($userRole, ['admin', 'co_admin'], true); $canDeleteEntry = $isAdmin; } else { $canEditEntry = $canEdit($entry['id']); $canDeleteEntry = $canDelete($entry['id']); // 🔥 NEU: Ist die Sendung gerade noch aktiv, aber der Starttag schon vorbei? $isOngoing = false; if ($canEditEntry && !empty($entry['zeit_bis']) && !empty($entry['zeit_von'])) { $isOvernight = $entry['zeit_bis'] < $entry['zeit_von']; if ($isOvernight) { // Tagübergreifend (22:00 - 02:00) if ($entry['datum'] === date('Y-m-d')) { // Läuft heute bis Mitternacht $isOngoing = ($entry['zeit_von'] <= date('H:i')); } if ($entry['datum'] < date('Y-m-d')) { // Läuft am Folgetag (00:00 - 02:00) $isOngoing = ($entry['zeit_bis'] >= date('H:i')); } } else { // Normale Sendung $isOngoing = ($entry['datum'] === date('Y-m-d') && $entry['zeit_von'] <= date('H:i')); } } } // 🔥 NEU: Globale Rechte-Flags setzen if ($canEditEntry) $hasAnyEditRights = true; if ($canDeleteEntry) $hasAnyDeleteRights = true; // 🔥 NEU: Für die Anzeige der Moderator-Namen $moderatorName = ''; foreach ($moderators as $mod) { if (($entry['moderator_id'] ?? 0) == $mod['etchat_user_id']) { $privClass = ''; if ($mod['etchat_userprivilegien'] === 'autodj') $privClass = '🤖 '; elseif ($mod['etchat_userprivilegien'] === 'admin') $privClass = '👑 '; elseif ($mod['etchat_userprivilegien'] === 'co_admin') $privClass = '⭐ '; elseif ($mod['etchat_userprivilegien'] === 'mod') $privClass = '🛡️ '; $moderatorName = $privClass . $mod['etchat_username']; break; } } ?>
get('admin_sendeplan_table_id', '🆔 ID') ?> get('admin_sendeplan_table_moderator', '👤 Moderator') ?> get('admin_sendeplan_table_date', '📅 Datum') ?> get('admin_sendeplan_table_time', '🕐 Zeit') ?> get('admin_sendeplan_table_name', '📋 Sendung') ?> get('admin_sendeplan_table_desc', '📝 Beschreibung') ?> get('admin_sendeplan_table_wunsch', '🎵 WB') ?> ⓘ get('admin_sendeplan_table_action', '⚡ Aktion') ?>
get('admin_sendeplan_empty', '📭 Keine Sendungen vorhanden') ?>

🔁 #
get('admin_sendeplan_no_moderator', '— Kein Moderator —')) ?> = date('Y-m-d')): ?>min="" style="padding: 4px; border-radius: 4px; border: 1px solid #444; background: #1a1a1a; color: #e0e0e0; width: 120px;"> - - formatTime($entry['zeit_von'])) ?>-formatTime($entry['zeit_bis'])) ?>

get('admin_sendeplan_error_correct_save', '⚠️ Korrigieren und speichern') ?>

🔒 get('admin_sendeplan_readonly', 'Nur Lesen') ?>
—
✏️ get('admin_sendeplan_error_new', 'Fehler (Neu)') ?>
get('admin_sendeplan_max_date_hint', 'max. {days} Tage ab heute
({date}) wählbar') ) ?>
-

get('admin_sendeplan_error_correct_save', '⚠️ Korrigieren und speichern') ?>
(int)$mod['etchat_user_id'], 'name' => $privClass . htmlspecialchars($mod['etchat_username'], ENT_QUOTES, 'UTF-8') ]; } $moderatorsJson = json_encode($moderatorsJs, JSON_UNESCAPED_UNICODE); $vorlagenOptionsJson = json_encode($vorlagenOptionsHtml, JSON_UNESCAPED_UNICODE); // 🔥 NEU: Serien-Berechtigung + Werte $serienEnabled = $config['serien_enabled'] ?? 'mod'; $canUseSerien = ($serienEnabled === 'mod') || ($serienEnabled === 'admin' && in_array($userRole, ['admin', 'co_admin'], true)); $serienMaxTage = (int)($config['serien_max_tage'] ?? 92); $serienMaxTermine = (int)($config['serien_max_termine'] ?? 60); $serienMonateMax = (int)($config['serien_monate_max'] ?? 36); $serienMonateMaxJahre = (int)($serienMonateMax / 12); $serienMonateMaxLabel = $serienMonateMaxJahre . ' ' . $lang->get('admin_sendeplan_serie_years', 'Jahre'); // 🔥 NEU: Sprachdaten für JS $langJs = json_encode([ 'new_label' => $lang->get('admin_sendeplan_new_label', '✏️ Neu'), 'max_date_hint' => $lang->get('admin_sendeplan_max_date_hint', 'max. {days} Tage ab heute
({date}) wählbar'), 'no_selection' => $lang->get('admin_sendeplan_js_no_selection', 'Bitte mindestens einen Eintrag markieren!'), 'no_moderator' => $lang->get('admin_sendeplan_no_moderator', '— Kein Moderator —'), 'placeholder_name' => $lang->get('admin_sendeplan_js_placeholder_name', 'Sendungsname (mit {zahl} oder {4 zahl})...'), 'placeholder_desc' => $lang->get('admin_sendeplan_js_placeholder_desc', 'Beschreibung ({zahl} oder {4 zahl} möglich)...'), 'serie_button' => $lang->get('admin_sendeplan_serie_button', '🔁 Serie'), 'serie_monatlich_enabled' => (function() use ($config, $userRole) { $mod = $config['serien_monatlich_enabled'] ?? 'mod'; if ($mod === 'none') return false; if ($mod === 'admin') return in_array($userRole, ['admin', 'co_admin'], true); return true; // 'mod' → alle })(), 'serie_panel_title' => $lang->get('admin_sendeplan_serie_panel_title', '🔁 Serien-Funktion – wird als einzelne Termine angelegt'), 'serie_panel_hint' => str_replace( ['{max_tage}', '{max_termine}', '{monate_label}'], [(string)$serienMaxTage, (string)$serienMaxTermine, $serienMonateMaxLabel], $lang->get('admin_sendeplan_serie_panel_hint', '') ), 'serie_repeat_label' => $lang->get('admin_sendeplan_serie_repeat_label', 'Wiederholung:'), 'serie_repeat_daily' => $lang->get('admin_sendeplan_serie_repeat_daily', 'Täglich / Wöchentlich'), 'serie_repeat_monthly' => $lang->get('admin_sendeplan_serie_repeat_monthly', 'Monatlich'), 'serie_repeat_interval' => $lang->get('admin_sendeplan_serie_repeat_interval', 'Alle X Tage'), 'serie_week_rhythm' => $lang->get('admin_sendeplan_serie_week_rhythm', 'Wochen-Rhythmus:'), 'serie_week_1' => $lang->get('admin_sendeplan_serie_week_1', 'jede Woche'), 'serie_week_2' => $lang->get('admin_sendeplan_serie_week_2', 'alle 2 Wochen'), 'serie_week_3' => $lang->get('admin_sendeplan_serie_week_3', 'alle 3 Wochen'), 'serie_weekdays' => $lang->get('admin_sendeplan_serie_weekdays', 'Wochentage (keine Auswahl = täglich):'), 'serie_weekday_mo' => $lang->get('admin_sendeplan_serie_weekday_mo', 'Mo'), 'serie_weekday_di' => $lang->get('admin_sendeplan_serie_weekday_di', 'Di'), 'serie_weekday_mi' => $lang->get('admin_sendeplan_serie_weekday_mi', 'Mi'), 'serie_weekday_do' => $lang->get('admin_sendeplan_serie_weekday_do', 'Do'), 'serie_weekday_fr' => $lang->get('admin_sendeplan_serie_weekday_fr', 'Fr'), 'serie_weekday_sa' => $lang->get('admin_sendeplan_serie_weekday_sa', 'Sa'), 'serie_weekday_so' => $lang->get('admin_sendeplan_serie_weekday_so', 'So'), 'serie_interval_days' => $lang->get('admin_sendeplan_serie_interval_days_label', 'Alle'), 'serie_interval_days_suffix' => $lang->get('admin_sendeplan_serie_interval_days_suffix', 'Tage'), 'serie_month_rhythm' => $lang->get('admin_sendeplan_serie_month_rhythm', 'Monats-Rhythmus:'), 'serie_month_1' => $lang->get('admin_sendeplan_serie_month_1', 'jeden Monat'), 'serie_month_2' => $lang->get('admin_sendeplan_serie_month_2', 'alle 2 Monate'), 'serie_month_3' => $lang->get('admin_sendeplan_serie_month_3', 'alle 3 Monate'), 'serie_month_4' => $lang->get('admin_sendeplan_serie_month_4', 'alle 4 Monate'), 'serie_month_6' => $lang->get('admin_sendeplan_serie_month_6', 'alle 6 Monate'), 'serie_month_12' => $lang->get('admin_sendeplan_serie_month_12', 'alle 12 Monate (jährlich)'), 'serie_start_date' => $lang->get('admin_sendeplan_serie_start_date', 'Serien-Startdatum (optional):'), 'serie_start_date_hint' => str_replace( ['{max_date}', '{max_days}'], [date('d.m.Y', strtotime($maxDateAhead)), (string)$maxDaysAhead], $lang->get('admin_sendeplan_serie_start_date_hint', '') ), 'serie_month_day_label_before' => $lang->get('admin_sendeplan_serie_month_day_label_before', 'Am'), 'serie_month_day_label_after' => $lang->get('admin_sendeplan_serie_month_day_label_after', '. Tag des Monats'), 'serie_month_weekday_label_before' => $lang->get('admin_sendeplan_serie_month_weekday_label_before', 'Am'), 'serie_month_weekday_label_after' => $lang->get('admin_sendeplan_serie_month_weekday_label_after', 'des Monats'), 'serie_month_weekday_mo' => $lang->get('admin_sendeplan_serie_month_weekday_mo', 'Montag'), 'serie_month_weekday_di' => $lang->get('admin_sendeplan_serie_month_weekday_di', 'Dienstag'), 'serie_month_weekday_mi' => $lang->get('admin_sendeplan_serie_month_weekday_mi', 'Mittwoch'), 'serie_month_weekday_do' => $lang->get('admin_sendeplan_serie_month_weekday_do', 'Donnerstag'), 'serie_month_weekday_fr' => $lang->get('admin_sendeplan_serie_month_weekday_fr', 'Freitag'), 'serie_month_weekday_sa' => $lang->get('admin_sendeplan_serie_month_weekday_sa', 'Samstag'), 'serie_month_weekday_so' => $lang->get('admin_sendeplan_serie_month_weekday_so', 'Sonntag'), 'serie_pos_1' => $lang->get('admin_sendeplan_serie_pos_1', '1.'), 'serie_pos_2' => $lang->get('admin_sendeplan_serie_pos_2', '2.'), 'serie_pos_3' => $lang->get('admin_sendeplan_serie_pos_3', '3.'), 'serie_pos_4' => $lang->get('admin_sendeplan_serie_pos_4', '4.'), 'serie_end_label' => $lang->get('admin_sendeplan_serie_end_label', 'Ende der Serie:'), 'serie_end_count_before' => $lang->get('admin_sendeplan_serie_end_count_before', 'Nach'), 'serie_end_count_after' => $lang->get('admin_sendeplan_serie_end_count_after', 'Terminen'), 'serie_end_date' => $lang->get('admin_sendeplan_serie_end_date', 'Nach Datum:'), 'serie_preview_button' => $lang->get('admin_sendeplan_serie_preview_button', '👁️ Vorschau anzeigen'), 'serie_save_button' => $lang->get('admin_sendeplan_serie_save_button', '💾 Serie speichern'), 'serie_js_loading' => $lang->get('admin_sendeplan_serie_js_loading', '⏳ Vorschau wird geladen...'), 'serie_js_no_date' => $lang->get('admin_sendeplan_serie_js_no_date', 'Bitte zuerst ein Startdatum eintragen.'), 'serie_js_terms_calculated' => $lang->get('admin_sendeplan_serie_js_terms_calculated', '📅 {count} Termine berechnet'), 'serie_js_conflicts' => $lang->get('admin_sendeplan_serie_js_conflicts', '⚠️ {count} Konflikte'), 'serie_js_free' => $lang->get('admin_sendeplan_serie_js_free', '✓ frei'), 'serie_js_conflict_warning' => $lang->get('admin_sendeplan_serie_js_conflict_warning', ''), 'serie_js_error' => $lang->get('admin_sendeplan_serie_js_error', 'Fehler: '), 'save' => $lang->get('admin_sendeplan_button_save', '💾 Speichern'), 'wb_off' => $lang->get('admin_sendeplan_wb_off', '🚫 Aus'), 'wb_on' => $lang->get('admin_sendeplan_wb_on', '✅ Ein'), 'wb_vorab' => $lang->get('admin_sendeplan_wb_vorab', '🕐 Vorab ein'), ]); ?>