{"id":2552,"date":"2026-05-17T09:41:23","date_gmt":"2026-05-17T09:41:23","guid":{"rendered":"https:\/\/danishdrift.dk\/?page_id=2552"},"modified":"2026-05-28T10:42:59","modified_gmt":"2026-05-28T10:42:59","slug":"koerere-program","status":"publish","type":"page","link":"https:\/\/danishdrift.dk\/en\/koerere-program\/","title":{"rendered":"K\u00f8rere program"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2552\" class=\"elementor elementor-2552\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e6c9b9b e-flex e-con-boxed e-con e-parent\" data-id=\"e6c9b9b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-80de4fe elementor-widget elementor-widget-html\" data-id=\"80de4fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ========================================= -->\r\n<!-- DDC \u2013 K\u00d8RERE PROGRAM FRA GOOGLE SHEETS CSV -->\r\n<!-- Dynamic DA\/EN + group\/day tabs + anti-cache -->\r\n<!-- ========================================= -->\r\n\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800;900&family=Teko:wght@600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n:root{\r\n  --ddc-bg:#070A10;\r\n  --ddc-bg2:#05070C;\r\n  --ddc-red:#E50914;\r\n  --ddc-red2:#FF2A2A;\r\n  --ddc-text:#FFFFFF;\r\n  --ddc-dim:#A9B0BC;\r\n  --ddc-stroke:rgba(255,255,255,0.12);\r\n  --ddc-shadow:0 18px 60px rgba(0,0,0,0.55);\r\n  --ddc-max:1320px;\r\n}\r\n\r\nhtml{\r\n  scroll-behavior:smooth;\r\n}\r\n\r\n.ddc-program-page{\r\n  position:relative;\r\n  left:50%;\r\n  right:50%;\r\n  margin-left:-50vw;\r\n  margin-right:-50vw;\r\n  width:100vw;\r\n  max-width:100vw;\r\n  overflow:hidden;\r\n  isolation:isolate;\r\n  background:\r\n    radial-gradient(900px 420px at 12% 0%, rgba(229,9,20,0.20), transparent 64%),\r\n    radial-gradient(850px 420px at 88% 5%, rgba(255,42,42,0.12), transparent 64%),\r\n    radial-gradient(700px 420px at 50% 20%, rgba(255,255,255,0.045), transparent 70%),\r\n    linear-gradient(180deg,#070A10,#05070C 62%,#03050A);\r\n  color:#fff;\r\n  font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;\r\n}\r\n\r\n.ddc-program-page *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.ddc-program-page::before{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  pointer-events:none;\r\n  z-index:-2;\r\n  background:\r\n    linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),\r\n    linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px);\r\n  background-size:54px 54px;\r\n  mask-image:linear-gradient(180deg, rgba(0,0,0,0.85), transparent 82%);\r\n}\r\n\r\n.ddc-program-page::after{\r\n  content:\"\";\r\n  position:absolute;\r\n  inset:0;\r\n  pointer-events:none;\r\n  z-index:-1;\r\n  background:\r\n    radial-gradient(circle at 50% 0%, rgba(255,255,255,0.07), transparent 36%),\r\n    linear-gradient(180deg, transparent, rgba(0,0,0,0.35));\r\n}\r\n\r\n.ddc-program-hero,\r\n.ddc-program-tabs,\r\n.ddc-program-wrap{\r\n  position:relative;\r\n  z-index:1;\r\n}\r\n\r\n.ddc-program-hero{\r\n  padding:86px 20px 44px;\r\n}\r\n\r\n.ddc-program-hero__inner{\r\n  width:min(var(--ddc-max), calc(100% - 28px));\r\n  margin:0 auto;\r\n  text-align:center;\r\n}\r\n\r\n.ddc-program-badge{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:10px;\r\n  padding:10px 16px;\r\n  margin-bottom:18px;\r\n  border-radius:999px;\r\n  background:rgba(229,9,20,0.12);\r\n  border:1px solid rgba(255,42,42,0.28);\r\n  color:#fff;\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.ddc-program-badge::before{\r\n  content:\"\";\r\n  width:8px;\r\n  height:8px;\r\n  border-radius:50%;\r\n  background:#FF2A2A;\r\n  box-shadow:0 0 0 4px rgba(255,42,42,0.14);\r\n}\r\n\r\n.ddc-program-title{\r\n  margin:0 0 14px;\r\n  font-family:Teko,sans-serif;\r\n  font-size:clamp(48px, 7vw, 88px);\r\n  line-height:.9;\r\n  letter-spacing:1px;\r\n  text-transform:uppercase;\r\n  color:#fff;\r\n}\r\n\r\n.ddc-program-title span:last-child{\r\n  color:var(--ddc-red2);\r\n}\r\n\r\n.ddc-program-lead{\r\n  max-width:860px;\r\n  margin:0 auto;\r\n  color:#A9B0BC;\r\n  font-size:16px;\r\n  line-height:1.8;\r\n}\r\n\r\n.ddc-program-tabs{\r\n  width:min(var(--ddc-max), calc(100% - 28px));\r\n  margin:0 auto 30px;\r\n  display:flex;\r\n  justify-content:center;\r\n  gap:12px;\r\n  flex-wrap:wrap;\r\n}\r\n\r\n.ddc-program-tab,\r\n.ddc-day-tab{\r\n  appearance:none;\r\n  border:1px solid rgba(255,255,255,0.14);\r\n  background:rgba(255,255,255,0.06);\r\n  color:#FFFFFF !important;\r\n  border-radius:999px;\r\n  font-weight:900;\r\n  letter-spacing:.08em;\r\n  text-transform:uppercase;\r\n  cursor:pointer;\r\n  transition:.22s ease;\r\n}\r\n\r\n.ddc-program-tab{\r\n  min-height:50px;\r\n  padding:13px 22px;\r\n  font-size:13px;\r\n}\r\n\r\n.ddc-day-tab{\r\n  min-height:46px;\r\n  padding:12px 22px;\r\n  font-size:12px;\r\n}\r\n\r\n.ddc-program-tab:hover,\r\n.ddc-day-tab:hover{\r\n  transform:translateY(-2px);\r\n  background:rgba(255,255,255,0.10);\r\n  border-color:rgba(255,255,255,0.24);\r\n  color:#FFFFFF !important;\r\n}\r\n\r\n.ddc-program-tab.is-active,\r\n.ddc-day-tab.is-active{\r\n  color:#FFFFFF !important;\r\n  border-color:rgba(255,42,42,0.62);\r\n  background:linear-gradient(135deg,#E50914,#FF2A2A);\r\n  box-shadow:0 18px 50px rgba(229,9,20,0.34);\r\n}\r\n\r\n.ddc-program-tab[data-class-color=\"pro\"].is-active,\r\n.ddc-day-tab[data-class-color=\"pro\"].is-active{\r\n  border-color:rgba(255,42,42,0.70);\r\n  background:linear-gradient(135deg,#B0000D,#FF2A2A);\r\n  box-shadow:0 18px 50px rgba(229,9,20,0.36);\r\n}\r\n\r\n.ddc-program-tab[data-class-color=\"pro2\"].is-active,\r\n.ddc-day-tab[data-class-color=\"pro2\"].is-active{\r\n  border-color:rgba(45,107,255,0.70);\r\n  background:linear-gradient(135deg,#164BDF,#2D6BFF);\r\n  box-shadow:0 18px 50px rgba(45,107,255,0.30);\r\n}\r\n\r\n.ddc-program-tab[data-class-color=\"street\"].is-active,\r\n.ddc-day-tab[data-class-color=\"street\"].is-active{\r\n  border-color:rgba(49,175,71,0.70);\r\n  background:linear-gradient(135deg,#168A2D,#31AF47);\r\n  box-shadow:0 18px 50px rgba(49,175,71,0.28);\r\n}\r\n\r\n.ddc-program-tab[data-class-color=\"rookie\"].is-active,\r\n.ddc-day-tab[data-class-color=\"rookie\"].is-active{\r\n  border-color:rgba(45,255,136,0.58);\r\n  background:linear-gradient(135deg,#0F8F4D,#2DFF88);\r\n  box-shadow:0 18px 50px rgba(45,255,136,0.20);\r\n}\r\n\r\n.ddc-program-wrap{\r\n  width:min(var(--ddc-max), calc(100% - 28px));\r\n  margin:0 auto;\r\n  padding:12px 0 84px;\r\n}\r\n\r\n.ddc-program-loading,\r\n.ddc-program-error{\r\n  padding:34px 24px;\r\n  border-radius:24px;\r\n  border:1px solid rgba(255,255,255,0.10);\r\n  background:rgba(255,255,255,0.045);\r\n  box-shadow:var(--ddc-shadow);\r\n  text-align:center;\r\n}\r\n\r\n.ddc-program-loading h3,\r\n.ddc-program-error h3{\r\n  margin:0 0 8px;\r\n  font-family:Teko,sans-serif;\r\n  font-size:42px;\r\n  line-height:1;\r\n  text-transform:uppercase;\r\n  color:#fff;\r\n}\r\n\r\n.ddc-program-loading p,\r\n.ddc-program-error p{\r\n  margin:0 auto;\r\n  max-width:760px;\r\n  color:#A9B0BC;\r\n  line-height:1.7;\r\n}\r\n\r\n.ddc-program-panel{\r\n  display:none;\r\n  animation:ddcFade .25s ease both;\r\n}\r\n\r\n.ddc-program-panel.is-active{\r\n  display:block;\r\n}\r\n\r\n@keyframes ddcFade{\r\n  from{\r\n    opacity:0;\r\n    transform:translateY(8px);\r\n  }\r\n  to{\r\n    opacity:1;\r\n    transform:translateY(0);\r\n  }\r\n}\r\n\r\n.ddc-program-top{\r\n  display:flex;\r\n  align-items:flex-end;\r\n  justify-content:space-between;\r\n  gap:20px;\r\n  margin-bottom:22px;\r\n}\r\n\r\n.ddc-kicker{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:10px;\r\n  font-family:Teko,sans-serif;\r\n  letter-spacing:1.2px;\r\n  text-transform:uppercase;\r\n  color:var(--ddc-dim);\r\n  font-size:18px;\r\n}\r\n\r\n.ddc-kicker::before{\r\n  content:\"\";\r\n  width:10px;\r\n  height:10px;\r\n  border-radius:999px;\r\n  background:linear-gradient(135deg,var(--ddc-red),var(--ddc-red2));\r\n  box-shadow:0 0 0 6px rgba(229,9,20,0.12);\r\n}\r\n\r\n.ddc-panel-title{\r\n  margin:6px 0 0;\r\n  font-family:Teko,sans-serif;\r\n  font-size:clamp(42px, 5vw, 68px);\r\n  line-height:.9;\r\n  letter-spacing:1px;\r\n  text-transform:uppercase;\r\n  color:#fff;\r\n}\r\n\r\n.ddc-panel-title span{\r\n  color:var(--ddc-red2);\r\n}\r\n\r\n.ddc-panel-lead{\r\n  margin:8px 0 0;\r\n  color:var(--ddc-dim);\r\n  max-width:72ch;\r\n  font-size:15px;\r\n  line-height:1.65;\r\n}\r\n\r\n.ddc-program-meta{\r\n  display:flex;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n  justify-content:flex-end;\r\n}\r\n\r\n.ddc-chip{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:8px;\r\n  padding:10px 13px;\r\n  border-radius:999px;\r\n  border:1px solid var(--ddc-stroke);\r\n  background:rgba(255,255,255,0.045);\r\n  color:var(--ddc-dim);\r\n  font-size:13px;\r\n  white-space:nowrap;\r\n}\r\n\r\n.ddc-chip b{\r\n  color:#fff;\r\n}\r\n\r\n.ddc-day-tabs{\r\n  display:flex;\r\n  justify-content:center;\r\n  gap:12px;\r\n  flex-wrap:wrap;\r\n  margin:0 0 22px;\r\n}\r\n\r\n.ddc-days{\r\n  display:grid;\r\n  grid-template-columns:1fr;\r\n  gap:22px;\r\n}\r\n\r\n.ddc-day-panel{\r\n  display:none;\r\n}\r\n\r\n.ddc-day-panel.is-active{\r\n  display:block;\r\n}\r\n\r\n.ddc-day-card{\r\n  overflow:hidden;\r\n  border-radius:24px;\r\n  border:1px solid rgba(255,255,255,0.10);\r\n  background:\r\n    radial-gradient(800px 240px at 10% 0%, rgba(229,9,20,0.14), transparent 70%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.035));\r\n  box-shadow:var(--ddc-shadow);\r\n}\r\n\r\n.ddc-day-head{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:12px;\r\n  padding:18px 20px;\r\n  border-bottom:1px solid rgba(255,255,255,0.10);\r\n  background:rgba(255,255,255,0.03);\r\n}\r\n\r\n.ddc-day-title{\r\n  margin:0;\r\n  font-family:Teko,sans-serif;\r\n  font-size:36px;\r\n  line-height:1;\r\n  letter-spacing:.8px;\r\n  text-transform:uppercase;\r\n  color:#fff;\r\n}\r\n\r\n.ddc-day-sub{\r\n  color:#A9B0BC;\r\n  font-size:13px;\r\n  font-weight:800;\r\n  letter-spacing:.06em;\r\n  text-transform:uppercase;\r\n}\r\n\r\n.ddc-table-wrap{\r\n  overflow-x:auto;\r\n  -webkit-overflow-scrolling:touch;\r\n}\r\n\r\n.ddc-program-table{\r\n  width:100%;\r\n  border-collapse:separate;\r\n  border-spacing:0;\r\n  min-width:560px;\r\n}\r\n\r\n.ddc-program-table th{\r\n  padding:13px 12px;\r\n  background:#3D3D3D;\r\n  color:#fff;\r\n  text-align:left;\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:.05em;\r\n  text-transform:uppercase;\r\n  border-bottom:1px solid rgba(255,255,255,0.18);\r\n}\r\n\r\n.ddc-program-table th:first-child{\r\n  width:135px;\r\n  text-align:center;\r\n}\r\n\r\n.ddc-program-table td{\r\n  padding:10px 12px;\r\n  border-bottom:1px solid rgba(255,255,255,0.08);\r\n  border-right:1px solid rgba(255,255,255,0.08);\r\n  background:rgba(5,7,12,0.68);\r\n  color:#fff;\r\n  font-size:13px;\r\n  line-height:1.35;\r\n  vertical-align:middle;\r\n}\r\n\r\n.ddc-time{\r\n  background:linear-gradient(135deg,#B0000D,#E50914) !important;\r\n  color:#FFFFFF !important;\r\n  font-weight:900;\r\n  text-align:center;\r\n  white-space:nowrap;\r\n}\r\n\r\n.ddc-event,\r\n.ddc-event--black,\r\n.ddc-event--pro,\r\n.ddc-event--pro2,\r\n.ddc-event--street,\r\n.ddc-event--rookie,\r\n.ddc-event--break,\r\n.ddc-event--info,\r\n.ddc-event--green,\r\n.ddc-event--yellow{\r\n  background:rgba(255,255,255,0.055) !important;\r\n  color:#FFFFFF !important;\r\n  font-weight:800;\r\n  text-align:center;\r\n}\r\n\r\n.ddc-event[data-label=\"Pro\"]{\r\n  background:\r\n    linear-gradient(\r\n      0deg,\r\n      rgba(255,23,23,0.34) 0%,\r\n      rgba(255,23,23,0.16) 38%,\r\n      rgba(255,255,255,0.055) 100%\r\n    ) !important;\r\n  color:#FFFFFF !important;\r\n  border-bottom:1px solid rgba(255,23,23,0.35);\r\n}\r\n\r\n.ddc-event[data-label=\"Pro2\"]{\r\n  background:\r\n    linear-gradient(\r\n      0deg,\r\n      rgba(45,107,255,0.34) 0%,\r\n      rgba(45,107,255,0.16) 38%,\r\n      rgba(255,255,255,0.055) 100%\r\n    ) !important;\r\n  color:#FFFFFF !important;\r\n  border-bottom:1px solid rgba(45,107,255,0.35);\r\n}\r\n\r\n.ddc-event[data-label=\"Street\"]{\r\n  background:\r\n    linear-gradient(\r\n      0deg,\r\n      rgba(49,175,71,0.34) 0%,\r\n      rgba(49,175,71,0.16) 38%,\r\n      rgba(255,255,255,0.055) 100%\r\n    ) !important;\r\n  color:#FFFFFF !important;\r\n  border-bottom:1px solid rgba(49,175,71,0.35);\r\n}\r\n\r\n.ddc-event[data-label=\"Rookie\"]{\r\n  background:\r\n    linear-gradient(\r\n      0deg,\r\n      rgba(45,255,136,0.30) 0%,\r\n      rgba(45,255,136,0.13) 38%,\r\n      rgba(255,255,255,0.055) 100%\r\n    ) !important;\r\n  color:#FFFFFF !important;\r\n  border-bottom:1px solid rgba(45,255,136,0.28);\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"pro\"] .ddc-kicker::before{\r\n  background:linear-gradient(135deg,#B0000D,#FF2A2A);\r\n  box-shadow:0 0 0 6px rgba(229,9,20,0.14);\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"pro2\"] .ddc-kicker::before{\r\n  background:linear-gradient(135deg,#164BDF,#2D6BFF);\r\n  box-shadow:0 0 0 6px rgba(45,107,255,0.14);\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"street\"] .ddc-kicker::before{\r\n  background:linear-gradient(135deg,#168A2D,#31AF47);\r\n  box-shadow:0 0 0 6px rgba(49,175,71,0.14);\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"rookie\"] .ddc-kicker::before{\r\n  background:linear-gradient(135deg,#0F8F4D,#2DFF88);\r\n  box-shadow:0 0 0 6px rgba(45,255,136,0.12);\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"pro\"] .ddc-day-card{\r\n  border-color:rgba(255,42,42,0.24);\r\n  background:\r\n    radial-gradient(800px 240px at 10% 0%, rgba(229,9,20,0.18), transparent 70%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.035));\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"pro2\"] .ddc-day-card{\r\n  border-color:rgba(45,107,255,0.24);\r\n  background:\r\n    radial-gradient(800px 240px at 10% 0%, rgba(45,107,255,0.18), transparent 70%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.035));\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"street\"] .ddc-day-card{\r\n  border-color:rgba(49,175,71,0.24);\r\n  background:\r\n    radial-gradient(800px 240px at 10% 0%, rgba(49,175,71,0.18), transparent 70%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.035));\r\n}\r\n\r\n.ddc-program-panel[data-class-color=\"rookie\"] .ddc-day-card{\r\n  border-color:rgba(45,255,136,0.22);\r\n  background:\r\n    radial-gradient(800px 240px at 10% 0%, rgba(45,255,136,0.14), transparent 70%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.035));\r\n}\r\n\r\n.ddc-note{\r\n  margin-top:20px;\r\n  padding:18px 20px;\r\n  border-radius:18px;\r\n  border:1px solid rgba(255,255,255,0.10);\r\n  background:rgba(255,255,255,0.045);\r\n  color:#A9B0BC;\r\n  font-size:14px;\r\n  line-height:1.7;\r\n}\r\n\r\n.ddc-note strong{\r\n  color:#fff;\r\n}\r\n\r\n.ddc-last-updated{\r\n  display:block;\r\n  margin-top:6px;\r\n  color:rgba(255,255,255,0.56);\r\n  font-size:12px;\r\n}\r\n\r\n@media (min-width:981px){\r\n  .ddc-program-table th{\r\n    font-size:14px;\r\n    padding:15px 14px;\r\n  }\r\n\r\n  .ddc-program-table td{\r\n    font-size:16px;\r\n    line-height:1.45;\r\n    padding:15px 16px;\r\n  }\r\n\r\n  .ddc-time{\r\n    font-size:17px;\r\n  }\r\n\r\n  .ddc-event{\r\n    font-size:16px;\r\n  }\r\n\r\n  .ddc-day-title{\r\n    font-size:42px;\r\n  }\r\n\r\n  .ddc-day-sub{\r\n    font-size:14px;\r\n  }\r\n\r\n  .ddc-panel-lead{\r\n    font-size:17px;\r\n  }\r\n\r\n  .ddc-chip{\r\n    font-size:14px;\r\n  }\r\n}\r\n\r\n@media (max-width:980px){\r\n  .ddc-program-hero{\r\n    padding:72px 16px 38px;\r\n  }\r\n\r\n  .ddc-program-top{\r\n    align-items:flex-start;\r\n    flex-direction:column;\r\n  }\r\n\r\n  .ddc-program-meta{\r\n    justify-content:flex-start;\r\n  }\r\n}\r\n\r\n@media (max-width:640px){\r\n  .ddc-program-hero{\r\n    padding:60px 14px 32px;\r\n  }\r\n\r\n  .ddc-program-title{\r\n    font-size:46px;\r\n  }\r\n\r\n  .ddc-program-lead{\r\n    font-size:15px;\r\n  }\r\n\r\n  .ddc-program-tabs{\r\n    display:grid;\r\n    grid-template-columns:repeat(3, 1fr);\r\n    gap:7px;\r\n    width:min(var(--ddc-max), calc(100% - 18px));\r\n  }\r\n\r\n  .ddc-day-tabs{\r\n    display:grid;\r\n    grid-template-columns:1fr 1fr;\r\n    gap:10px;\r\n  }\r\n\r\n  .ddc-program-tab{\r\n    width:100%;\r\n    min-height:42px;\r\n    padding:10px 8px;\r\n    font-size:10px;\r\n    letter-spacing:.05em;\r\n  }\r\n\r\n  .ddc-day-tab{\r\n    width:100%;\r\n    min-height:44px;\r\n    padding:12px 13px;\r\n    font-size:12px;\r\n  }\r\n\r\n  .ddc-day-head{\r\n    align-items:flex-start;\r\n    flex-direction:column;\r\n    padding:16px;\r\n  }\r\n\r\n  .ddc-day-title{\r\n    font-size:34px;\r\n  }\r\n\r\n  .ddc-table-wrap{\r\n    overflow-x:visible;\r\n  }\r\n\r\n  .ddc-program-table{\r\n    min-width:0;\r\n    width:100%;\r\n  }\r\n\r\n  .ddc-program-table thead{\r\n    display:none;\r\n  }\r\n\r\n  .ddc-program-table,\r\n  .ddc-program-table tbody,\r\n  .ddc-program-table tr,\r\n  .ddc-program-table td{\r\n    display:block;\r\n    width:100%;\r\n  }\r\n\r\n  .ddc-program-table tr{\r\n    margin:0 0 14px;\r\n    padding:12px;\r\n    border-radius:18px;\r\n    background:rgba(255,255,255,0.045);\r\n    border:1px solid rgba(255,255,255,0.10);\r\n    box-shadow:0 12px 34px rgba(0,0,0,0.28);\r\n    overflow:hidden;\r\n  }\r\n\r\n  .ddc-program-table td{\r\n    border-right:0;\r\n    border-bottom:0;\r\n  }\r\n\r\n  .ddc-time{\r\n    display:flex !important;\r\n    align-items:center;\r\n    justify-content:center;\r\n    margin:0 0 10px;\r\n    padding:12px 14px !important;\r\n    border-radius:14px;\r\n    background:linear-gradient(135deg,#B0000D,#E50914) !important;\r\n    color:#FFFFFF !important;\r\n    font-family:Teko,sans-serif;\r\n    font-size:30px !important;\r\n    line-height:1;\r\n    letter-spacing:1px;\r\n  }\r\n\r\n  .ddc-event{\r\n    position:relative;\r\n    min-height:54px;\r\n    display:flex !important;\r\n    flex-direction:column;\r\n    align-items:center;\r\n    justify-content:center;\r\n    padding:14px 12px !important;\r\n    margin-bottom:8px;\r\n    border-radius:14px;\r\n    font-size:13px !important;\r\n    line-height:1.35;\r\n    text-align:center;\r\n  }\r\n\r\n  .ddc-event::before{\r\n    content:attr(data-label);\r\n    display:block;\r\n    margin-bottom:6px;\r\n    font-size:10px;\r\n    font-weight:900;\r\n    letter-spacing:.10em;\r\n    text-transform:uppercase;\r\n    opacity:.78;\r\n  }\r\n\r\n  .ddc-event:last-child{\r\n    margin-bottom:0;\r\n  }\r\n\r\n  .ddc-event:empty{\r\n    display:none !important;\r\n  }\r\n\r\n  .ddc-day-card{\r\n    border-radius:22px;\r\n  }\r\n}\r\n\r\n\/* =========================================================\r\n   DDC 2027 FRONTBOKS\r\n   Viser en boks foran programmet, s\u00e5 siden ikke l\u00e6ngere bruges aktivt.\r\n========================================================= *\/\r\n.ddc-2027-overlay{\r\n  position:absolute;\r\n  inset:0;\r\n  z-index:50;\r\n  display:flex;\r\n  align-items:flex-start;\r\n  justify-content:center;\r\n  padding:130px 20px 60px;\r\n  background:\r\n    radial-gradient(circle at center, rgba(229,9,20,0.15), transparent 52%),\r\n    rgba(3,5,10,0.74);\r\n  backdrop-filter:blur(7px);\r\n  -webkit-backdrop-filter:blur(7px);\r\n  pointer-events:auto;\r\n}\r\n\r\n.ddc-2027-box{\r\n  width:min(560px, 100%);\r\n  text-align:center;\r\n  border-radius:30px;\r\n  border:1px solid rgba(255,255,255,0.16);\r\n  background:\r\n    radial-gradient(circle at top, rgba(255,42,42,0.15), transparent 58%),\r\n    linear-gradient(180deg, rgba(255,255,255,0.12), rgba(255,255,255,0.055));\r\n  box-shadow:0 28px 90px rgba(0,0,0,0.55);\r\n  padding:38px 26px 34px;\r\n}\r\n\r\n.ddc-2027-icon{\r\n  width:58px;\r\n  height:58px;\r\n  margin:0 auto 16px;\r\n  border-radius:20px;\r\n  display:grid;\r\n  place-items:center;\r\n  background:linear-gradient(135deg,#E50914,#FF2A2A);\r\n  box-shadow:0 18px 45px rgba(229,9,20,0.35);\r\n  font-size:28px;\r\n}\r\n\r\n.ddc-2027-title{\r\n  margin:0;\r\n  font-family:Teko,Inter,sans-serif;\r\n  font-size:clamp(48px, 7vw, 76px);\r\n  line-height:.9;\r\n  letter-spacing:.03em;\r\n  text-transform:uppercase;\r\n  color:#FFFFFF;\r\n}\r\n\r\n@media (max-width:640px){\r\n  .ddc-2027-overlay{\r\n    padding:100px 14px 40px;\r\n  }\r\n\r\n  .ddc-2027-box{\r\n    border-radius:24px;\r\n    padding:30px 18px 28px;\r\n  }\r\n\r\n  .ddc-2027-icon{\r\n    width:52px;\r\n    height:52px;\r\n    border-radius:18px;\r\n    font-size:26px;\r\n  }\r\n\r\n  .ddc-2027-title{\r\n    font-size:clamp(42px, 13vw, 58px);\r\n  }\r\n}\r\n\r\n<\/style>\r\n\r\n<section class=\"ddc-program-page\" data-ddc-program-page>\r\n\r\n  <div class=\"ddc-2027-overlay\" aria-label=\"Vi ses til n\u00e6ste event!\">\r\n    <div class=\"ddc-2027-box\">\r\n      <div class=\"ddc-2027-icon\">\ud83c\udfc1<\/div>\r\n      <h2 class=\"ddc-2027-title\">Vi ses til n\u00e6ste event!<\/h2>\r\n    <\/div>\r\n  <\/div>\r\n\r\n\r\n  <section class=\"ddc-program-hero\">\r\n    <div class=\"ddc-program-hero__inner\">\r\n      <div class=\"ddc-program-badge\" data-i18n=\"badge\">K\u00f8rere program<\/div>\r\n\r\n      <h1 class=\"ddc-program-title\">\r\n        <span data-i18n=\"title_1\">Program for<\/span> <span data-i18n=\"title_2\">klasserne<\/span>\r\n      <\/h1>\r\n\r\n      <p class=\"ddc-program-lead\" data-i18n=\"hero\">\r\n        Her finder du k\u00f8replanerne for Danish Drift Championship. V\u00e6lg klasse og dag for at se programmet.\r\n        V\u00e6r opm\u00e6rksom p\u00e5, at der kan komme \u00e6ndringer l\u00f8bende, s\u00e5 hold \u00f8je med siden og hold dig opdateret.\r\n      <\/p>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <div class=\"ddc-program-tabs\" data-ddc-tabs><\/div>\r\n\r\n  <div class=\"ddc-program-wrap\">\r\n    <div class=\"ddc-program-loading\" data-ddc-loading>\r\n      <h3 data-i18n=\"loading_title\">Indl\u00e6ser program<\/h3>\r\n      <p data-i18n=\"loading_text\">Programmet hentes fra Google Sheets. Vent et \u00f8jeblik.<\/p>\r\n    <\/div>\r\n\r\n    <div data-ddc-content><\/div>\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n<script>\r\n(function(){\r\n  const params = new URLSearchParams(window.location.search);\r\n  const q = (params.get(\"lang\") || \"\").toLowerCase();\r\n  const h = (document.documentElement.getAttribute(\"lang\") || \"\").toLowerCase();\r\n  const path = (window.location.pathname || \"\").toLowerCase();\r\n\r\n  const lang = (\r\n    q.startsWith(\"en\") ||\r\n    h.startsWith(\"en\") ||\r\n    path.startsWith(\"\/en\/\") ||\r\n    path === \"\/en\"\r\n  ) ? \"en\" : \"da\";\r\n\r\n  const TXT = {\r\n    da:{\r\n      badge:\"K\u00f8rere program\",\r\n      title_1:\"Program for\",\r\n      title_2:\"klasserne\",\r\n      hero:\"Her finder du k\u00f8replanerne for Danish Drift Championship. V\u00e6lg klasse og dag for at se programmet. V\u00e6r opm\u00e6rksom p\u00e5, at der kan komme \u00e6ndringer l\u00f8bende, s\u00e5 hold \u00f8je med siden og hold dig opdateret.\",\r\n      loading_title:\"Indl\u00e6ser program\",\r\n      loading_text:\"Programmet hentes fra Google Sheets. Vent et \u00f8jeblik.\",\r\n      schedule:\"K\u00f8reprogram\",\r\n      saturday:\"L\u00f8rdag\",\r\n      sunday:\"S\u00f8ndag\",\r\n      class:\"Klasse\",\r\n      note:\"Bem\u00e6rk:\",\r\n      note_text:\"Programmet hentes automatisk fra Google Sheets og opdateres ca. hvert\",\r\n      minute:\"minut\",\r\n      error_title:\"Kunne ikke indl\u00e6se programmet\",\r\n      error_help:\"Tjek at Google Sheet er udgivet som CSV, og at det rigtige faneblad er publiceret.\",\r\n      no_program_title:\"Intet program fundet\",\r\n      no_program_text:\"Der blev ikke fundet programdata for\",\r\n      in_google_sheet:\"i Google Sheet.\",\r\n      street_lead:\"Program for Street-klassen. V\u00e6lg l\u00f8rdag eller s\u00f8ndag herunder.\",\r\n      rookie_lead:\"Program for Rookie-klassen. Vises automatisk hvis Rookie findes i Google Sheets.\",\r\n      choose_day_for:\"V\u00e6lg dag for\",\r\n      time:\"Tid\",\r\n      updated:\"Sidst opdateret\"\r\n    },\r\n    en:{\r\n      badge:\"Drivers program\",\r\n      title_1:\"Program for\",\r\n      title_2:\"classes\",\r\n      hero:\"Here you can find the driving schedules for Danish Drift Championship. Choose a class and day to view the program. Please note that changes may occur, so keep an eye on this page and stay updated.\",\r\n      loading_title:\"Loading program\",\r\n      loading_text:\"The program is being loaded from Google Sheets. Please wait a moment.\",\r\n      schedule:\"Schedule\",\r\n      saturday:\"Saturday\",\r\n      sunday:\"Sunday\",\r\n      class:\"Class\",\r\n      note:\"Note:\",\r\n      note_text:\"The program is loaded automatically from Google Sheets and refreshes approx. every\",\r\n      minute:\"minute\",\r\n      error_title:\"Could not load program\",\r\n      error_help:\"Check that the Google Sheet has been published as CSV and that the correct sheet tab is published.\",\r\n      no_program_title:\"No program found\",\r\n      no_program_text:\"No program data was found for\",\r\n      in_google_sheet:\"in Google Sheet.\",\r\n      street_lead:\"Program for the Street class. Choose Saturday or Sunday below.\",\r\n      rookie_lead:\"Program for the Rookie class. Shown automatically if Rookie exists in Google Sheets.\",\r\n      choose_day_for:\"Choose day for\",\r\n      time:\"Time\",\r\n      updated:\"Last updated\"\r\n    }\r\n  };\r\n\r\n  function t(key){\r\n    return TXT[lang] && TXT[lang][key] ? TXT[lang][key] : TXT.da[key] || key;\r\n  }\r\n\r\n  const GOOGLE_SHEET_CSV_URL = \"https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vQqjwxg4Rk6sWhez49pzDJe-OSUzGVMPSjKGuOpE2KBQvp7Dbk0D2_jn1LrrDA6wyLNFtxISTKraftq\/pub?output=csv\";\r\n\r\n  const AUTO_REFRESH_MINUTES = 5;\r\n\r\n  const root = document.querySelector('[data-ddc-program-page]');\r\n  if(!root) return;\r\n\r\n  const tabsEl = root.querySelector('[data-ddc-tabs]');\r\n  const contentEl = root.querySelector('[data-ddc-content]');\r\n  const loadingEl = root.querySelector('[data-ddc-loading]');\r\n\r\n  if(!tabsEl || !contentEl) return;\r\n\r\n  function applyStaticTranslations(){\r\n    root.querySelectorAll(\"[data-i18n]\").forEach(el => {\r\n      const key = el.getAttribute(\"data-i18n\");\r\n      el.textContent = t(key);\r\n    });\r\n  }\r\n\r\n  const GROUPS = [\r\n    {\r\n      key:\"pro\",\r\n      label:\"Pro\",\r\n      title:\"Pro\",\r\n      classes:[\"Pro\"],\r\n      lead: lang === \"en\"\r\n        ? \"Program for the Pro class. Choose Saturday or Sunday below.\"\r\n        : \"Program for Pro-klassen. V\u00e6lg l\u00f8rdag eller s\u00f8ndag herunder.\"\r\n    },\r\n    {\r\n      key:\"pro2\",\r\n      label:\"Pro2\",\r\n      title:\"Pro2\",\r\n      classes:[\"Pro2\"],\r\n      lead: lang === \"en\"\r\n        ? \"Program for the Pro2 class. Choose Saturday or Sunday below.\"\r\n        : \"Program for Pro2-klassen. V\u00e6lg l\u00f8rdag eller s\u00f8ndag herunder.\"\r\n    },\r\n    {\r\n      key:\"street\",\r\n      label:\"Street\",\r\n      title:\"Street\",\r\n      classes:[\"Street\"],\r\n      lead:t(\"street_lead\")\r\n    },\r\n    {\r\n      key:\"rookie\",\r\n      label:\"Rookie\",\r\n      title:\"Rookie\",\r\n      classes:[\"Rookie\"],\r\n      lead:t(\"rookie_lead\")\r\n    }\r\n  ];\r\n\r\n  function normalize(str){\r\n    return String(str || \"\")\r\n      .toLowerCase()\r\n      .trim()\r\n      .replace(\/\\s+\/g,\" \")\r\n      .replace(\/\u00f8\/g,\"oe\")\r\n      .replace(\/\u00e5\/g,\"aa\")\r\n      .replace(\/\u00e6\/g,\"ae\");\r\n  }\r\n\r\n  function cleanText(value){\r\n    return String(value || \"\").replace(\/\\s+\/g,\" \").trim();\r\n  }\r\n\r\n  function escapeHtml(str){\r\n    return String(str || \"\")\r\n      .replace(\/&\/g,\"&amp;\")\r\n      .replace(\/<\/g,\"&lt;\")\r\n      .replace(\/>\/g,\"&gt;\")\r\n      .replace(\/\"\/g,\"&quot;\")\r\n      .replace(\/'\/g,\"&#039;\");\r\n  }\r\n\r\n  function detectDay(header){\r\n    const h = normalize(header);\r\n\r\n    if(h.includes(\"saturday\") || h.includes(\"loerdag\") || h.includes(\"l\u00f8rdag\")) return \"L\u00f8rdag\";\r\n    if(h.includes(\"sunday\") || h.includes(\"soendag\") || h.includes(\"s\u00f8ndag\")) return \"S\u00f8ndag\";\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function displayDay(day){\r\n    return day === \"S\u00f8ndag\" ? t(\"sunday\") : t(\"saturday\");\r\n  }\r\n\r\n  function detectClass(header){\r\n    const h = normalize(header);\r\n\r\n    if(h.includes(\"rookie\")) return \"Rookie\";\r\n    if(h.includes(\"street\")) return \"Street\";\r\n    if(h.includes(\"pro 2\") || h.includes(\"pro2\")) return \"Pro2\";\r\n    if(h.includes(\"pro\") && !h.includes(\"pro2\") && !h.includes(\"pro 2\")) return \"Pro\";\r\n\r\n    return \"\";\r\n  }\r\n\r\n  function classifyActivity(text, fallbackClass){\r\n    const tText = normalize(text);\r\n\r\n    if(!tText) return \"black\";\r\n\r\n    if(tText.includes(\"track closes\") || tText.includes(\"banen lukker\") || tText.includes(\"banelukker\")) return \"black\";\r\n    if(tText.includes(\"break\") || tText.includes(\"pause\")) return \"break\";\r\n    if(tText.includes(\"briefing\") || tText.includes(\"street briefing\") || tText.includes(\"r2 briefing\")) return \"info\";\r\n    if(tText.includes(\"driver evaluation\") || tText.includes(\"aftensmad\") || tText.includes(\"morgenmad\")) return \"green\";\r\n    if(tText.includes(\"engine start\") || tText.includes(\"tilladt start\") || tText.includes(\"buffer\") || tText.includes(\"access\") || tText.includes(\"clean up\") || tText.includes(\"track check\") || tText.includes(\"udstyr\") || tText.includes(\"modtagelse\")) return \"yellow\";\r\n    if(tText.includes(\"pro2\") || tText.includes(\"pro 2\")) return \"pro2\";\r\n    if(tText.includes(\"street\")) return \"street\";\r\n    if(tText.includes(\"rookie\")) return \"rookie\";\r\n    if(tText.includes(\"pro\")) return \"pro\";\r\n\r\n    if(fallbackClass === \"Pro\") return \"pro\";\r\n    if(fallbackClass === \"Pro2\") return \"pro2\";\r\n    if(fallbackClass === \"Street\") return \"street\";\r\n    if(fallbackClass === \"Rookie\") return \"rookie\";\r\n\r\n    return \"black\";\r\n  }\r\n\r\n  function normalizeTime(value){\r\n    return String(value || \"\")\r\n      .replace(\/\\.\/g,\":\")\r\n      .replace(\/\\s*-\\s*\/g,\" - \")\r\n      .replace(\/\\s+\/g,\" \")\r\n      .trim();\r\n  }\r\n\r\n  function timeToMinutes(value){\r\n    const str = String(value || \"\").trim();\r\n    const match = str.match(\/(\\d{1,2})[:.](\\d{2})\/);\r\n\r\n    if(!match) return 999999;\r\n\r\n    return (parseInt(match[1], 10) * 60) + parseInt(match[2], 10);\r\n  }\r\n\r\n  async function fetchGoogleSheetCsv(){\r\n    const cacheBuster = \"_ddc_cache=\" + Date.now() + \"_\" + Math.floor(Math.random() * 1000000);\r\n    const url = GOOGLE_SHEET_CSV_URL + (GOOGLE_SHEET_CSV_URL.includes(\"?\") ? \"&\" : \"?\") + cacheBuster;\r\n\r\n    const res = await fetch(url, {\r\n      method:\"GET\",\r\n      cache:\"no-store\"\r\n    });\r\n\r\n    if(!res.ok){\r\n      throw new Error(\"Kunne ikke hente Google Sheet CSV. HTTP \" + res.status);\r\n    }\r\n\r\n    const text = await res.text();\r\n\r\n    if(!text || text.length < 50){\r\n      throw new Error(\"Google Sheet blev hentet, men indholdet virker tomt.\");\r\n    }\r\n\r\n    return text;\r\n  }\r\n\r\n  function parseCsvLine(line){\r\n    const result = [];\r\n    let current = \"\";\r\n    let inQuotes = false;\r\n\r\n    for(let i = 0; i < line.length; i++){\r\n      const char = line[i];\r\n      const next = line[i + 1];\r\n\r\n      if(char === '\"' && inQuotes && next === '\"'){\r\n        current += '\"';\r\n        i++;\r\n        continue;\r\n      }\r\n\r\n      if(char === '\"'){\r\n        inQuotes = !inQuotes;\r\n        continue;\r\n      }\r\n\r\n      if(char === \",\" && !inQuotes){\r\n        result.push(current);\r\n        current = \"\";\r\n        continue;\r\n      }\r\n\r\n      current += char;\r\n    }\r\n\r\n    result.push(current);\r\n    return result;\r\n  }\r\n\r\n  function parseCsv(csvText){\r\n    return csvText\r\n      .replace(\/\\r\/g, \"\")\r\n      .split(\"\\n\")\r\n      .filter(line => line.trim() !== \"\")\r\n      .map(parseCsvLine);\r\n  }\r\n\r\n  function parseRows(rows){\r\n    const events = [];\r\n    let headerIndex = -1;\r\n\r\n    for(let i = 0; i < Math.min(rows.length, 25); i++){\r\n      const rowText = rows[i].map(normalize).join(\" | \");\r\n\r\n      if(\r\n        (rowText.includes(\"time\") || rowText.includes(\"klokkeslaet\") || rowText.includes(\"klokkesl\u00e6t\")) &&\r\n        (\r\n          rowText.includes(\"saturday\") ||\r\n          rowText.includes(\"sunday\") ||\r\n          rowText.includes(\"loerdag\") ||\r\n          rowText.includes(\"soendag\") ||\r\n          rowText.includes(\"l\u00f8rdag\") ||\r\n          rowText.includes(\"s\u00f8ndag\")\r\n        )\r\n      ){\r\n        headerIndex = i;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if(headerIndex === -1){\r\n      throw new Error(\"Kunne ikke finde header-r\u00e6kken i Google Sheet. Tjek at r\u00e6kken med Time \/ Saturday \/ Sunday findes i det publicerede ark.\");\r\n    }\r\n\r\n    const header = rows[headerIndex];\r\n    let timeCol = -1;\r\n    const columns = [];\r\n\r\n    header.forEach((cell, index) => {\r\n      const text = cleanText(cell);\r\n      const n = normalize(text);\r\n\r\n      if(n.includes(\"time\") || n.includes(\"klokkeslaet\") || n.includes(\"klokkesl\u00e6t\")){\r\n        timeCol = index;\r\n      }\r\n\r\n      const day = detectDay(text);\r\n      const cls = detectClass(text);\r\n\r\n      if(day && cls){\r\n        columns.push({\r\n          index:index,\r\n          header:text,\r\n          day:day,\r\n          className:cls\r\n        });\r\n      }\r\n    });\r\n\r\n    if(timeCol === -1){\r\n      throw new Error(\"Kunne ikke finde Time-kolonnen i Google Sheet.\");\r\n    }\r\n\r\n    if(columns.length === 0){\r\n      throw new Error(\"Kunne ikke finde programkolonner som Saturday - Pro, Saturday - Pro2, Saturday - Street osv.\");\r\n    }\r\n\r\n    for(let r = headerIndex + 1; r < rows.length; r++){\r\n      const row = rows[r];\r\n      const time = normalizeTime(cleanText(row[timeCol]));\r\n\r\n      if(!time || !time.match(\/\\d{1,2}[:.]\\d{2}\/)) continue;\r\n\r\n      columns.forEach(col => {\r\n        const activity = cleanText(row[col.index]);\r\n\r\n        if(!activity) return;\r\n\r\n        events.push({\r\n          time:time,\r\n          sortTime:timeToMinutes(time),\r\n          day:col.day,\r\n          className:col.className,\r\n          activity:activity,\r\n          type:classifyActivity(activity, col.className)\r\n        });\r\n      });\r\n    }\r\n\r\n    return events;\r\n  }\r\n\r\n  function uniqueSortedTimes(events){\r\n    return [...new Set(events.map(e => e.time))].sort((a,b) => {\r\n      return timeToMinutes(a) - timeToMinutes(b);\r\n    });\r\n  }\r\n\r\n  function groupHasEvents(events, group){\r\n    return events.some(e => group.classes.includes(e.className));\r\n  }\r\n\r\n  function getCurrentTimeString(){\r\n    const now = new Date();\r\n    const hh = String(now.getHours()).padStart(2,\"0\");\r\n    const mm = String(now.getMinutes()).padStart(2,\"0\");\r\n    return hh + \":\" + mm;\r\n  }\r\n\r\n  function renderTabs(groups){\r\n    tabsEl.innerHTML = groups.map((group, index) => `\r\n      <button class=\"ddc-program-tab ${index === 0 ? \"is-active\" : \"\"}\" type=\"button\" data-program-target=\"${group.key}\" data-class-color=\"${group.key}\">\r\n        ${group.label}\r\n      <\/button>\r\n    `).join(\"\");\r\n  }\r\n\r\n  function renderTable(events, group, day){\r\n    const dayEvents = events.filter(e => e.day === day && group.classes.includes(e.className));\r\n    const times = uniqueSortedTimes(dayEvents);\r\n\r\n    if(!times.length){\r\n      return `\r\n        <div class=\"ddc-program-error\">\r\n          <h3>${t(\"no_program_title\")}<\/h3>\r\n          <p>${t(\"no_program_text\")} ${group.label} ${displayDay(day)} ${t(\"in_google_sheet\")}<\/p>\r\n        <\/div>\r\n      `;\r\n    }\r\n\r\n    const headers = group.classes.map(cls => `<th>${cls}<\/th>`).join(\"\");\r\n\r\n    const rows = times.map(time => {\r\n      const cells = group.classes.map(cls => {\r\n        const event = dayEvents.find(e => e.time === time && e.className === cls);\r\n\r\n        if(!event){\r\n          return `<td class=\"ddc-event ddc-event--black\" data-label=\"${cls}\"><\/td>`;\r\n        }\r\n\r\n        return `\r\n          <td class=\"ddc-event ddc-event--${event.type}\" data-label=\"${cls}\">\r\n            ${escapeHtml(event.activity)}\r\n          <\/td>\r\n        `;\r\n      }).join(\"\");\r\n\r\n      return `\r\n        <tr>\r\n          <td class=\"ddc-time\">${escapeHtml(time)}<\/td>\r\n          ${cells}\r\n        <\/tr>\r\n      `;\r\n    }).join(\"\");\r\n\r\n    return `\r\n      <div class=\"ddc-table-wrap\">\r\n        <table class=\"ddc-program-table\">\r\n          <thead>\r\n            <tr>\r\n              <th>${t(\"time\")}<\/th>\r\n              ${headers}\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody>\r\n            ${rows}\r\n          <\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  function renderGroup(events, group, index){\r\n    const saturdayKey = group.key + \"-lordag\";\r\n    const sundayKey = group.key + \"-sondag\";\r\n\r\n    return `\r\n      <section class=\"ddc-program-panel ${index === 0 ? \"is-active\" : \"\"}\" data-program-panel=\"${group.key}\" data-class-color=\"${group.key}\">\r\n        <div class=\"ddc-program-top\">\r\n          <div>\r\n            <div class=\"ddc-kicker\">${t(\"schedule\")}<\/div>\r\n            <h2 class=\"ddc-panel-title\">${group.title} <span>\/<\/span> Program<\/h2>\r\n            <p class=\"ddc-panel-lead\">${group.lead}<\/p>\r\n          <\/div>\r\n\r\n          <div class=\"ddc-program-meta\">\r\n            <span class=\"ddc-chip\">${t(\"class\")}: <b>${group.label}<\/b><\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ddc-day-tabs\" aria-label=\"${t(\"choose_day_for\")} ${group.label}\">\r\n          <button class=\"ddc-day-tab is-active\" type=\"button\" data-day-target=\"${saturdayKey}\" data-class-color=\"${group.key}\">\r\n            ${t(\"saturday\")}\r\n          <\/button>\r\n          <button class=\"ddc-day-tab\" type=\"button\" data-day-target=\"${sundayKey}\" data-class-color=\"${group.key}\">\r\n            ${t(\"sunday\")}\r\n          <\/button>\r\n        <\/div>\r\n\r\n        <div class=\"ddc-days\">\r\n          <div class=\"ddc-day-panel is-active\" data-day-panel=\"${saturdayKey}\">\r\n            <div class=\"ddc-day-card\">\r\n              <div class=\"ddc-day-head\">\r\n                <h3 class=\"ddc-day-title\">${t(\"saturday\")}<\/h3>\r\n                <div class=\"ddc-day-sub\">${group.label}<\/div>\r\n              <\/div>\r\n              ${renderTable(events, group, \"L\u00f8rdag\")}\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"ddc-day-panel\" data-day-panel=\"${sundayKey}\">\r\n            <div class=\"ddc-day-card\">\r\n              <div class=\"ddc-day-head\">\r\n                <h3 class=\"ddc-day-title\">${t(\"sunday\")}<\/h3>\r\n                <div class=\"ddc-day-sub\">${group.label}<\/div>\r\n              <\/div>\r\n              ${renderTable(events, group, \"S\u00f8ndag\")}\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ddc-note\">\r\n          <strong>${t(\"note\")}<\/strong> ${t(\"note_text\")} ${AUTO_REFRESH_MINUTES} ${t(\"minute\")}.\r\n          <span class=\"ddc-last-updated\">${t(\"updated\")}: ${getCurrentTimeString()}<\/span>\r\n        <\/div>\r\n      <\/section>\r\n    `;\r\n  }\r\n\r\n  function renderContent(events, keepState){\r\n    const groupsWithEvents = GROUPS.filter(group => groupHasEvents(events, group));\r\n\r\n    if(!groupsWithEvents.length){\r\n      throw new Error(\"Der blev ikke fundet nogen programkolonner i Google Sheet.\");\r\n    }\r\n\r\n    let currentGroup = null;\r\n    const currentDayTargets = {};\r\n\r\n    if(keepState){\r\n      currentGroup = root.querySelector(\".ddc-program-tab.is-active\")?.getAttribute(\"data-program-target\") || null;\r\n\r\n      root.querySelectorAll(\".ddc-program-panel\").forEach(panel => {\r\n        const panelKey = panel.getAttribute(\"data-program-panel\");\r\n        const activeDay = panel.querySelector(\".ddc-day-tab.is-active\")?.getAttribute(\"data-day-target\");\r\n\r\n        if(panelKey && activeDay){\r\n          currentDayTargets[panelKey] = activeDay;\r\n        }\r\n      });\r\n    }\r\n\r\n    renderTabs(groupsWithEvents);\r\n\r\n    contentEl.innerHTML = groupsWithEvents.map((group, index) => {\r\n      return renderGroup(events, group, index);\r\n    }).join(\"\");\r\n\r\n    const tabs = root.querySelectorAll('[data-program-target]');\r\n    const panels = root.querySelectorAll('[data-program-panel]');\r\n\r\n    function showPanel(name, shouldScroll){\r\n      tabs.forEach(tab => {\r\n        tab.classList.toggle(\"is-active\", tab.getAttribute(\"data-program-target\") === name);\r\n      });\r\n\r\n      panels.forEach(panel => {\r\n        panel.classList.toggle(\"is-active\", panel.getAttribute(\"data-program-panel\") === name);\r\n      });\r\n\r\n      if(shouldScroll){\r\n        const activePanel = root.querySelector('[data-program-panel=\"' + name + '\"]');\r\n\r\n        if(activePanel){\r\n          const y = activePanel.getBoundingClientRect().top + window.pageYOffset - 90;\r\n          window.scrollTo({top:y, behavior:\"smooth\"});\r\n        }\r\n      }\r\n    }\r\n\r\n    tabs.forEach(tab => {\r\n      tab.addEventListener(\"click\", function(){\r\n        showPanel(this.getAttribute(\"data-program-target\"), true);\r\n      });\r\n    });\r\n\r\n    const dayTabs = root.querySelectorAll('[data-day-target]');\r\n\r\n    dayTabs.forEach(dayTab => {\r\n      dayTab.addEventListener(\"click\", function(){\r\n        const target = this.getAttribute(\"data-day-target\");\r\n        const parentPanel = this.closest(\".ddc-program-panel\");\r\n\r\n        if(!parentPanel) return;\r\n\r\n        parentPanel.querySelectorAll(\"[data-day-target]\").forEach(btn => {\r\n          btn.classList.toggle(\"is-active\", btn.getAttribute(\"data-day-target\") === target);\r\n        });\r\n\r\n        parentPanel.querySelectorAll(\"[data-day-panel]\").forEach(panel => {\r\n          panel.classList.toggle(\"is-active\", panel.getAttribute(\"data-day-panel\") === target);\r\n        });\r\n      });\r\n    });\r\n\r\n    if(currentGroup && root.querySelector('[data-program-panel=\"' + currentGroup + '\"]')){\r\n      showPanel(currentGroup, false);\r\n    }\r\n\r\n    Object.keys(currentDayTargets).forEach(panelKey => {\r\n      const panel = root.querySelector('[data-program-panel=\"' + panelKey + '\"]');\r\n      const activeDayTarget = currentDayTargets[panelKey];\r\n\r\n      if(!panel || !activeDayTarget) return;\r\n\r\n      panel.querySelectorAll(\"[data-day-target]\").forEach(btn => {\r\n        btn.classList.toggle(\"is-active\", btn.getAttribute(\"data-day-target\") === activeDayTarget);\r\n      });\r\n\r\n      panel.querySelectorAll(\"[data-day-panel]\").forEach(dayPanel => {\r\n        dayPanel.classList.toggle(\"is-active\", dayPanel.getAttribute(\"data-day-panel\") === activeDayTarget);\r\n      });\r\n    });\r\n  }\r\n\r\n  function renderError(message){\r\n    tabsEl.innerHTML = \"\";\r\n\r\n    contentEl.innerHTML = `\r\n      <div class=\"ddc-program-error\">\r\n        <h3>${t(\"error_title\")}<\/h3>\r\n        <p>\r\n          ${escapeHtml(message)}\r\n          <br><br>\r\n          ${t(\"error_help\")}\r\n        <\/p>\r\n      <\/div>\r\n    `;\r\n  }\r\n\r\n  let isRefreshingProgram = false;\r\n\r\n  async function init(isAutoRefresh){\r\n    if(isRefreshingProgram) return;\r\n\r\n    isRefreshingProgram = true;\r\n\r\n    try{\r\n      const csvText = await fetchGoogleSheetCsv();\r\n      const rows = parseCsv(csvText);\r\n      const events = parseRows(rows);\r\n\r\n      if(loadingEl) loadingEl.style.display = \"none\";\r\n\r\n      renderContent(events, !!isAutoRefresh);\r\n    }catch(err){\r\n      if(loadingEl) loadingEl.style.display = \"none\";\r\n\r\n      if(!isAutoRefresh){\r\n        renderError(err && err.message ? err.message : \"Ukendt fejl.\");\r\n      } else {\r\n        console.warn(\"DDC program auto-refresh fejlede:\", err);\r\n      }\r\n    }finally{\r\n      isRefreshingProgram = false;\r\n    }\r\n  }\r\n\r\n  applyStaticTranslations();\r\n  init(false);\r\n\r\n  setInterval(function(){\r\n    init(true);\r\n  }, AUTO_REFRESH_MINUTES * 60 * 1000);\r\n\r\n  window.addEventListener(\"focus\", function(){\r\n    init(true);\r\n  });\r\n\r\n  document.addEventListener(\"visibilitychange\", function(){\r\n    if(!document.hidden){\r\n      init(true);\r\n    }\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83c\udfc1 Vi ses til n\u00e6ste event! K\u00f8rere program Program for klasserne Her finder du k\u00f8replanerne for Danish Drift Championship. V\u00e6lg klasse og dag for at se programmet. V\u00e6r opm\u00e6rksom p\u00e5, at der kan komme \u00e6ndringer l\u00f8bende, s\u00e5 hold \u00f8je med siden og hold dig opdateret. Indl\u00e6ser program Programmet hentes fra Google Sheets. Vent et \u00f8jeblik.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2552","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>K\u00f8rere program - Danish Drift Championship<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/danishdrift.dk\/en\/koerere-program\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"K\u00f8rere program - Danish Drift Championship\" \/>\n<meta property=\"og:description\" content=\"\ud83c\udfc1 Vi ses til n\u00e6ste event! K\u00f8rere program Program for klasserne Her finder du k\u00f8replanerne for Danish Drift Championship. V\u00e6lg klasse og dag for at se programmet. V\u00e6r opm\u00e6rksom p\u00e5, at der kan komme \u00e6ndringer l\u00f8bende, s\u00e5 hold \u00f8je med siden og hold dig opdateret. Indl\u00e6ser program Programmet hentes fra Google Sheets. Vent et \u00f8jeblik.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/danishdrift.dk\/en\/koerere-program\/\" \/>\n<meta property=\"og:site_name\" content=\"Danish Drift Championship\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-28T10:42:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/Logo-1024x683.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/koerere-program\\\/\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/koerere-program\\\/\",\"name\":\"K\u00f8rere program - Danish Drift Championship\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#website\"},\"datePublished\":\"2026-05-17T09:41:23+00:00\",\"dateModified\":\"2026-05-28T10:42:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/koerere-program\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/danishdrift.dk\\\/koerere-program\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/koerere-program\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/danishdrift.dk\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"K\u00f8rere program\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#website\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/\",\"name\":\"danishdrift.dk\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/danishdrift.dk\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#organization\",\"name\":\"danishdrift.dk\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/danishdrift.dk\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-Bold-_D_-with-red-accents.png\",\"contentUrl\":\"https:\\\/\\\/danishdrift.dk\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/cropped-Bold-_D_-with-red-accents.png\",\"width\":512,\"height\":512,\"caption\":\"danishdrift.dk\"},\"image\":{\"@id\":\"https:\\\/\\\/danishdrift.dk\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/DanishDriftChampionship?locale=da_DK\",\"https:\\\/\\\/www.instagram.com\\\/danishdriftchampionship\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"K\u00f8rere program - Danish Drift Championship","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/danishdrift.dk\/en\/koerere-program\/","og_locale":"en_US","og_type":"article","og_title":"K\u00f8rere program - Danish Drift Championship","og_description":"\ud83c\udfc1 Vi ses til n\u00e6ste event! K\u00f8rere program Program for klasserne Her finder du k\u00f8replanerne for Danish Drift Championship. V\u00e6lg klasse og dag for at se programmet. V\u00e6r opm\u00e6rksom p\u00e5, at der kan komme \u00e6ndringer l\u00f8bende, s\u00e5 hold \u00f8je med siden og hold dig opdateret. Indl\u00e6ser program Programmet hentes fra Google Sheets. Vent et \u00f8jeblik.","og_url":"https:\/\/danishdrift.dk\/en\/koerere-program\/","og_site_name":"Danish Drift Championship","article_publisher":"https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK","article_modified_time":"2026-05-28T10:42:59+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/03\/Logo-1024x683.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/danishdrift.dk\/koerere-program\/","url":"https:\/\/danishdrift.dk\/koerere-program\/","name":"K\u00f8rere program - Danish Drift Championship","isPartOf":{"@id":"https:\/\/danishdrift.dk\/#website"},"datePublished":"2026-05-17T09:41:23+00:00","dateModified":"2026-05-28T10:42:59+00:00","breadcrumb":{"@id":"https:\/\/danishdrift.dk\/koerere-program\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/danishdrift.dk\/koerere-program\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/danishdrift.dk\/koerere-program\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/danishdrift.dk\/"},{"@type":"ListItem","position":2,"name":"K\u00f8rere program"}]},{"@type":"WebSite","@id":"https:\/\/danishdrift.dk\/#website","url":"https:\/\/danishdrift.dk\/","name":"danishdrift.dk","description":"","publisher":{"@id":"https:\/\/danishdrift.dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/danishdrift.dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/danishdrift.dk\/#organization","name":"danishdrift.dk","url":"https:\/\/danishdrift.dk\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/danishdrift.dk\/#\/schema\/logo\/image\/","url":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/04\/cropped-Bold-_D_-with-red-accents.png","contentUrl":"https:\/\/danishdrift.dk\/wp-content\/uploads\/2026\/04\/cropped-Bold-_D_-with-red-accents.png","width":512,"height":512,"caption":"danishdrift.dk"},"image":{"@id":"https:\/\/danishdrift.dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DanishDriftChampionship?locale=da_DK","https:\/\/www.instagram.com\/danishdriftchampionship\/"]}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/2552","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/comments?post=2552"}],"version-history":[{"count":91,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/2552\/revisions"}],"predecessor-version":[{"id":4021,"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/pages\/2552\/revisions\/4021"}],"wp:attachment":[{"href":"https:\/\/danishdrift.dk\/en\/wp-json\/wp\/v2\/media?parent=2552"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}