{"id":56,"date":"2024-03-11T11:14:26","date_gmt":"2024-03-11T11:14:26","guid":{"rendered":"https:\/\/hirtshals-kristiansand.com\/da\/?page_id=56"},"modified":"2026-04-21T08:20:35","modified_gmt":"2026-04-21T08:20:35","slug":"sejlplan","status":"publish","type":"page","link":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/","title":{"rendered":"Hirtshals Kristiansand sejlplan"},"content":{"rendered":"\n<p>Se den aktuelle k\u00f8replan for f\u00e6rgeruten Hirtshals Kristiansand (drevet af Fjord Line og Color Line).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hirtshals Kristiansand afgangs- og ankomsttider<\/h2>\n\n\n\n<p>Se afgangs- og ankomsttider fra <a href=\"https:\/\/hirtshals-kristiansand.com\/da\/hirtshals-havn\/\">Hirtshals havn<\/a>.<\/p>\n\n\n<div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[171],&quot;days&quot;:6,&quot;autoload&quot;:true,&quot;routeLabels&quot;:{&quot;171&quot;:&quot;Hirtshals til Kristiansand&quot;},&quot;opFilter&quot;:[&quot;8&quot;,&quot;27&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Dato&quot;,&quot;ui_days&quot;:&quot;Dage&quot;,&quot;ui_button&quot;:&quot;Vis afgange&quot;,&quot;status_idle&quot;:&quot;V\\u00e6lg en dato og klik p\\u00e5 Vis afgange&quot;,&quot;status_loading&quot;:&quot;Indl\\u00e6ser&quot;,&quot;status_empty&quot;:&quot;Ingen afgange fundet&quot;,&quot;status_found&quot;:&quot;%d afgange fundet&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Afgang&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Varighed&quot;,&quot;th_ship&quot;:&quot;Skib&quot;,&quot;th_op&quot;:&quot;Rederi&quot;,&quot;th_route&quot;:&quot;Rute&quot;,&quot;wd_sun&quot;:&quot;S\\u00d8N&quot;,&quot;wd_mon&quot;:&quot;MAN&quot;,&quot;wd_tue&quot;:&quot;TIR&quot;,&quot;wd_wed&quot;:&quot;ONS&quot;,&quot;wd_thu&quot;:&quot;TOR&quot;,&quot;wd_fri&quot;:&quot;FRE&quot;,&quot;wd_sat&quot;:&quot;L\\u00d8R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alle %s afgange i vores k\\u00f8replan&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se flere afgange mellem %1$s og %2$s i vores k\\u00f8replan&quot;,&quot;summary_footer_generic&quot;:&quot;Se vores k\\u00f8replan for flere afgange&quot;,&quot;summary_header&quot;:&quot;De n\\u00e6ste to afgange&quot;,&quot;summary_no_upcoming&quot;:&quot;Ingen kommende afgange fundet&quot;,&quot;more_link&quot;:&quot;Flere afgange&quot;},&quot;showLogo&quot;:true,&quot;title&quot;:&quot;Alle overfarter&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;bf&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/ms-bergensfjord\\\/&quot;,&quot;superspeed 1&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/color-line-superspeed-1\\\/&quot;},&quot;showShip&quot;:true}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Dato<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Dato\">\n    <\/div>\n    <div>\n      <label for=\"tp-range-ops\">Dage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">Vis afgange<\/button><\/div>\n  <\/div>\n\n      <h3 style=\"margin:8px 0 12px;color:#0f172a;\">Alle overfarter<\/h3>\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">V\u00e6lg en dato og klik p\u00e5 Vis afgange<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Indl\u00e6ser<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n\n  dateEl.valueAsDate = new Date();\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeLabel(r.routeId)+'<\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship & Route\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\">'+routeLabel(r.routeId)+'<\/div>'+\n        '<\/div>';\n      } else {\n        \/\/ Alleen route, geen ship\n        html +=\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><\/div>'+\n          '<div class=\"rhs\">'+routeLabel(r.routeId)+'<\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      status.textContent = (L.status_found||'%d sailings found').replace('%d', total) + (errs.length ? ` (skipped ${errs.length} route${errs.length>1?'s':''})` : '');\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n\n\n\n<h2 class=\"wp-block-heading\">Kristiansand Hirtshals afgangs- og ankomsttider<\/h2>\n\n\n\n<p>Rejser du ogs\u00e5 tilbage fra Kristiansand til Hirtshals? S\u00e5 tjek afgangs- og ankomsttiderne fra <a href=\"https:\/\/hirtshals-kristiansand.com\/da\/kristiansand-havn\/\">Kristiansand havn<\/a> nedenfor.<\/p>\n\n\n<div class=\"tp-wrap\" data-config=\"{&quot;rest&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-json\\\/timetables-pro\\\/v1\\\/timetables&quot;,&quot;routes&quot;:[172],&quot;days&quot;:6,&quot;autoload&quot;:true,&quot;routeLabels&quot;:{&quot;172&quot;:&quot;Kristiansand til Hirtshals&quot;},&quot;opFilter&quot;:[&quot;8&quot;,&quot;27&quot;],&quot;labels&quot;:{&quot;ui_date&quot;:&quot;Dato&quot;,&quot;ui_days&quot;:&quot;Dage&quot;,&quot;ui_button&quot;:&quot;Vis afgange&quot;,&quot;status_idle&quot;:&quot;V\\u00e6lg en dato og klik p\\u00e5 Vis afgange&quot;,&quot;status_loading&quot;:&quot;Indl\\u00e6ser&quot;,&quot;status_empty&quot;:&quot;Ingen afgange fundet&quot;,&quot;status_found&quot;:&quot;%d afgange fundet&quot;,&quot;th_date&quot;:&quot;Date&quot;,&quot;th_dep&quot;:&quot;Afgang&quot;,&quot;th_arr&quot;:&quot;Ankomst&quot;,&quot;th_dur&quot;:&quot;Varighed&quot;,&quot;th_ship&quot;:&quot;Skib&quot;,&quot;th_op&quot;:&quot;Rederi&quot;,&quot;th_route&quot;:&quot;Rute&quot;,&quot;wd_sun&quot;:&quot;S\\u00d8N&quot;,&quot;wd_mon&quot;:&quot;MAN&quot;,&quot;wd_tue&quot;:&quot;TIR&quot;,&quot;wd_wed&quot;:&quot;ONS&quot;,&quot;wd_thu&quot;:&quot;TOR&quot;,&quot;wd_fri&quot;:&quot;FRE&quot;,&quot;wd_sat&quot;:&quot;L\\u00d8R&quot;,&quot;summary_footer_one&quot;:&quot;\\u00bb Se alle %s afgange i vores k\\u00f8replan&quot;,&quot;summary_footer_two&quot;:&quot;\\u00bb Se flere afgange mellem %1$s og %2$s i vores k\\u00f8replan&quot;,&quot;summary_footer_generic&quot;:&quot;Se vores k\\u00f8replan for flere afgange&quot;,&quot;summary_header&quot;:&quot;De n\\u00e6ste to afgange&quot;,&quot;summary_no_upcoming&quot;:&quot;Ingen kommende afgange fundet&quot;,&quot;more_link&quot;:&quot;Flere afgange&quot;},&quot;showLogo&quot;:true,&quot;title&quot;:&quot;Alle overfarter&quot;,&quot;shipMap&quot;:[],&quot;shipLinks&quot;:{&quot;bf&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/ms-bergensfjord\\\/&quot;,&quot;superspeed 1&quot;:&quot;https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/color-line-superspeed-1\\\/&quot;},&quot;showShip&quot;:true}\">\n  <div class=\"tp-controls\" role=\"group\" aria-label=\"Timetable controls\">\n    <div>\n      <label for=\"tp-date-ops\">Dato<\/label><br>\n      <input id=\"tp-date-ops\" class=\"tp-date\" type=\"date\" aria-label=\"Dato\">\n    <\/div>\n    <div>\n      <label for=\"tp-range-ops\">Dage<\/label><br>\n      <select id=\"tp-range-ops\" class=\"tp-range\" aria-label=\"Dage\">\n        <option value=\"1\">1<\/option><option value=\"3\">3<\/option><option value=\"7\">7<\/option><option value=\"14\">14<\/option>\n      <\/select>\n    <\/div>\n    <div><button id=\"tp-load-ops\" class=\"tp-btn\">Vis afgange<\/button><\/div>\n  <\/div>\n\n      <h3 style=\"margin:8px 0 12px;color:#0f172a;\">Alle overfarter<\/h3>\n  \n  <div id=\"tp-status-ops\" class=\"tp-muted\" aria-live=\"polite\">V\u00e6lg en dato og klik p\u00e5 Vis afgange<\/div>\n\n  <div id=\"tp-ops-results\"><\/div>\n\n  <div class=\"tp-loader\" aria-hidden=\"true\">\n    <div class=\"tp-loader-card\">\n      <div class=\"tp-spinner\" aria-hidden=\"true\"><\/div>\n      <div class=\"tp-loader-text\">Indl\u00e6ser<\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  const wrap   = document.currentScript.previousElementSibling;\n  const cfg    = JSON.parse(wrap.getAttribute('data-config')||'{}');\n  const L      = cfg.labels||{};\n  const dateEl = wrap.querySelector('#tp-date-ops');\n  const daysEl = wrap.querySelector('#tp-range-ops');\n  const btn    = wrap.querySelector('#tp-load-ops');\n  const status = wrap.querySelector('#tp-status-ops');\n  const out    = wrap.querySelector('#tp-ops-results');\n  const loader = wrap.querySelector('.tp-loader');\n\n  const showShip = (cfg.showShip !== false && cfg.showShip !== 0 && cfg.showShip !== '0');\n\n  dateEl.valueAsDate = new Date();\n  Array.from(daysEl.options).forEach(o=>{ if(parseInt(o.value,10)===parseInt(cfg.days||7,10)) o.selected=true; });\n\n  function pad(n){ return String(n).padStart(2,'0'); }\n  function iso(d){ return d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate()); }\n  function toLocal(s){ return new Date(s); }\n  function hhmm(d){ return d.toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'}); }\n  function dShort(d){ return d.toLocaleDateString([], {day:'numeric', month:'short'}); }\n  function dur(m){ const h=Math.floor(m\/60), r=m%60; return r? (h+'h '+r+'m') : (h+'h'); }\n\n  const WD = [\n    L.wd_sun || 'SUN',\n    L.wd_mon || 'MON',\n    L.wd_tue || 'TUE',\n    L.wd_wed || 'WED',\n    L.wd_thu || 'THU',\n    L.wd_fri || 'FRI',\n    L.wd_sat || 'SAT'\n  ];\n\n  function setLoader(v){ loader.classList.toggle('show', !!v); loader.setAttribute('aria-hidden', v?'false':'true'); }\n\n  function opCell(r){\n    const name = r.opName || ('Operator '+(r.opId||''));\n    const logo = (cfg.showLogo && r.opLogo) ? '<img decoding=\"async\" src=\"'+r.opLogo+'\" alt=\"'+name+'\"> ' : '';\n    const label = logo + '<span>'+name+'<\/span>';\n    return r.opLink ? '<a class=\"tp-op\" href=\"'+r.opLink+'\" target=\"_blank\" rel=\"nofollow noopener\">'+label+'<\/a>' : '<span class=\"tp-op\">'+label+'<\/span>';\n  }\n\n  function shipInfo(original){\n    const key = (original||'').toLowerCase().trim();\n    const label = (cfg.shipMap && cfg.shipMap[key]) || original || '';\n    const href  = (cfg.shipLinks && cfg.shipLinks[key]) || '';\n    return {label, href};\n  }\n\n  function shipBadge(original){\n    const s = shipInfo(original);\n    const badge = '<span class=\"tp-badge\">'+(s.label||'')+'<\/span>';\n    return s.href ? ('<a href=\"'+s.href+'\" target=\"_blank\" rel=\"nofollow noopener\">'+badge+'<\/a>') : badge;\n  }\n\n  function routeLabel(rid){\n    return (cfg.routeLabels && (cfg.routeLabels[String(rid)] || cfg.routeLabels[rid])) || String(rid);\n  }\n\n  function renderTable(rows){\n    const th = {date:L.th_date,dep:L.th_dep,arr:L.th_arr,dur:L.th_dur,ship:L.th_ship,route:L.th_route,op:L.th_op};\n\n    const headCells = [\n      '<th>'+th.date+'<\/th>',\n      '<th>'+th.dep+'<\/th>',\n      '<th>'+th.arr+'<\/th>',\n      '<th>'+th.dur+'<\/th>'\n    ];\n    if (showShip) {\n      headCells.push('<th>'+th.ship+'<\/th>');\n    }\n    headCells.push('<th>'+th.route+'<\/th>');\n    headCells.push('<th>'+th.op+'<\/th>');\n\n    let html = '<table class=\"tp-table\"><thead><tr>'+headCells.join('')+'<\/tr><\/thead><tbody>';\n    rows.forEach(r=>{\n      const dow = WD[r.dep.getDay()] || '';\n      const cells = [\n        '<td>'+dShort(r.dep)+' <span class=\"tp-day\">'+dow+'<\/span><\/td>',\n        '<td>'+hhmm(r.dep)+'<\/td>',\n        '<td>'+hhmm(r.arr)+'<\/td>',\n        '<td>'+dur(r.min)+'<\/td>'\n      ];\n      if (showShip) {\n        cells.push('<td>'+shipBadge(r.ship)+'<\/td>');\n      }\n      cells.push('<td>'+routeLabel(r.routeId)+'<\/td>');\n      cells.push('<td>'+opCell(r)+'<\/td>');\n      html += '<tr>'+cells.join('')+'<\/tr>';\n    });\n    html += '<\/tbody><\/table>';\n    return html;\n  }\n\n  function renderCards(rows){\n    let html = '<div class=\"tp-cardlist\">';\n    rows.forEach(r=>{\n      const dow   = WD[r.dep.getDay()] || '';\n      const times = hhmm(r.dep) + ' <span class=\"tp-arrow\">\u2192<\/span> ' + hhmm(r.arr);\n      html += '<div class=\"tp-card\">'+\n        \/\/ Row 1: Date + weekday + times\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><span class=\"tp-sub\">'+dShort(r.dep)+'<\/span><span class=\"tp-day\">'+dow+'<\/span><\/div>'+\n          '<div class=\"rhs\"><span class=\"tp-time\">'+times+'<\/span><\/div>'+\n        '<\/div>';\n\n      if (showShip) {\n        html +=\n        \/\/ Row 2: Ship & Route\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+shipBadge(r.ship)+'<\/div>'+\n          '<div class=\"rhs\">'+routeLabel(r.routeId)+'<\/div>'+\n        '<\/div>';\n      } else {\n        \/\/ Alleen route, geen ship\n        html +=\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\"><\/div>'+\n          '<div class=\"rhs\">'+routeLabel(r.routeId)+'<\/div>'+\n        '<\/div>';\n      }\n\n      html +=\n        \/\/ Row 3: Operator\n        '<div class=\"tp-mrow\">'+\n          '<div class=\"lhs\">'+opCell(r)+'<\/div>'+\n          '<div class=\"rhs\"><\/div>'+\n        '<\/div>'+\n      '<\/div>';\n    });\n    html += '<\/div>';\n    return html;\n  }\n\n  \/\/ Safe fetch helper\n  async function fetchOne(routeId, from, to){\n    try{\n      const url = new URL(cfg.rest);\n      url.searchParams.set('route', String(routeId));\n      url.searchParams.set('from', from);\n      url.searchParams.set('to', to);\n      const res = await fetch(url.toString(), {credentials:'same-origin'});\n      if(!res.ok) return { rid: routeId, error: 'HTTP '+res.status };\n      const json = await res.json();\n      const list = (json && json.data && Array.isArray(json.data.rows)) ? json.data.rows : [];\n      return { rid: routeId, rows: list };\n    }catch(e){\n      return { rid: routeId, error: String(e && e.message ? e.message : e) };\n    }\n  }\n\n  async function load(){\n    btn.disabled = true; setLoader(true); status.textContent = L.status_loading;\n\n    const start = new Date(dateEl.value || new Date());\n    const days  = Math.max(1, parseInt(daysEl.value,10)||1);\n    const end   = new Date(start); end.setDate(start.getDate()+days-1);\n    const fromIso = iso(start), toIso = iso(end);\n\n    try{\n      const results  = await Promise.all((cfg.routes||[]).map(rid=>fetchOne(rid, fromIso, toIso)));\n      const oks  = results.filter(r => !r.error);\n      const errs = results.filter(r =>  r.error);\n\n      const all = [];\n      oks.forEach(({rid, rows})=>{\n        rows.forEach(t=>{\n          all.push({\n            routeId: rid,\n            opId: t.operatorId || null,\n            opName: t.operatorName || '',\n            opLogo: t.operatorLogo || '',\n            opLink: t.operatorLink || '',\n            dep: toLocal(t.departureTime),\n            arr: toLocal(t.arrivalTime),\n            min: t.durationInMinutes || 0,\n            ship: t.shipName || ''\n          });\n        });\n      });\n\n      let rows = all;\n      if (Array.isArray(cfg.opFilter) && cfg.opFilter.length>0) {\n        rows = all.filter(r => r.opId && cfg.opFilter.includes(String(r.opId)));\n      }\n\n      rows.sort((a,b)=> a.dep - b.dep);\n\n      const total = rows.length;\n      if (total===0){\n        status.textContent = L.status_empty + (errs.length ? ' (some routes returned no data or errors)' : '');\n        out.innerHTML='';\n        setLoader(false); btn.disabled=false; return;\n      }\n\n      status.textContent = (L.status_found||'%d sailings found').replace('%d', total) + (errs.length ? ` (skipped ${errs.length} route${errs.length>1?'s':''})` : '');\n      out.innerHTML = renderTable(rows) + renderCards(rows);\n\n    } catch(e){\n      status.textContent = 'Failed to load data';\n      out.innerHTML = '<pre>'+String(e.message||e)+'<\/pre>';\n    } finally {\n      setLoader(false);\n      btn.disabled = false;\n    }\n  }\n\n  btn.addEventListener('click', load);\n  if (cfg.autoload) load();\n})();\n<\/script>\n\n\n\n\n<p class=\"has-small-font-size\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Yderligere information om k\u00f8replanen<\/h2>\n\n\n\n<p>Vil du vide mere om skibene? L\u00e6s mere om den p\u00e5g\u00e6ldende f\u00e6rge:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/ms-bergensfjord\/\">MS Bergensfjord<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/ms-stavangerfjord\/\">MS Stavangerfjord<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/fjord-fstr\/\">Fjord FSTR<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/color-line-superspeed-1\/\">Color Line SuperSpeed 1<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Vigtigt: Venligst tjek ind til tiden<\/h2>\n\n\n\n<p>Bem\u00e6rk venligst, at du b\u00f8r checke ind tidligt, da b\u00e5de havnene i Kristiansand og Hirtshals kan v\u00e6re meget travle til tider. Tjek ogs\u00e5 de specifikke terminaloplysninger for begge rederier:<\/p>\n\n\n\n<p><strong>Color Line:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/hirtshals-havn\/color-line-terminal\/\">Color Line Terminal Hirtshals<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/kristiansand-havn\/color-line-terminal\/\">Color Line Terminal Kristiansand<\/a><\/li>\n<\/ul>\n\n\n\n<p><strong>Fjord Line:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/hirtshals-havn\/fjord-line-terminal\/\">Fjord Line Terminal Hirtshals<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/hirtshals-kristiansand.com\/da\/kristiansand-havn\/fjord-line-terminal\/\">Fjord Line Terminal Kristiansand<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Se den aktuelle k\u00f8replan for f\u00e6rgeruten Hirtshals Kristiansand (drevet af Fjord Line og Color Line). Hirtshals Kristiansand afgangs- og ankomsttider [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":121,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-56","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand<\/title>\n<meta name=\"description\" content=\"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand\" \/>\n<meta property=\"og:description\" content=\"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/\" \/>\n<meta property=\"og:site_name\" content=\"F\u00e6rge Hirtshals Kristiansand\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-21T08:20:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/\",\"url\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/\",\"name\":\"Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/2024\\\/03\\\/hirtshals-kristiansand-ferry-2.jpg\",\"datePublished\":\"2024-03-11T11:14:26+00:00\",\"dateModified\":\"2026-04-21T08:20:35+00:00\",\"description\":\"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/2024\\\/03\\\/hirtshals-kristiansand-ferry-2.jpg\",\"contentUrl\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/2024\\\/03\\\/hirtshals-kristiansand-ferry-2.jpg\",\"width\":1200,\"height\":800,\"caption\":\"sejlplan\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/sejlplan\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Hirtshals Kristiansand\",\"item\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Hirtshals Kristiansand sejlplan\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#website\",\"url\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/\",\"name\":\"F\u00e6rge Hirtshals Kristiansand\",\"description\":\"Alt om f\u00e6rgeoverfarten fra Hirtshals til Kristiansand\",\"publisher\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#organization\",\"name\":\"F\u00e6rge Hirtshals Kristiansand\",\"url\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/2025\\\/05\\\/hirtshals-kristiansand.svg\",\"contentUrl\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/wp-content\\\/uploads\\\/sites\\\/4\\\/2025\\\/05\\\/hirtshals-kristiansand.svg\",\"width\":800,\"height\":256,\"caption\":\"F\u00e6rge Hirtshals Kristiansand\"},\"image\":{\"@id\":\"https:\\\/\\\/hirtshals-kristiansand.com\\\/da\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand","description":"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.","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:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/","og_locale":"da_DK","og_type":"article","og_title":"Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand","og_description":"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.","og_url":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/","og_site_name":"F\u00e6rge Hirtshals Kristiansand","article_modified_time":"2026-04-21T08:20:35+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimeret l\u00e6setid":"2 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/","url":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/","name":"Hirtshals Kristiansand sejlplan - F\u00e6rge Hirtshals Kristiansand","isPartOf":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/#primaryimage"},"image":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/#primaryimage"},"thumbnailUrl":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg","datePublished":"2024-03-11T11:14:26+00:00","dateModified":"2026-04-21T08:20:35+00:00","description":"Se den aktuelle Hirtshals Kristiansand sejlplan her. Fartplanen for Color Line og Fjord Line.","breadcrumb":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/#primaryimage","url":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg","contentUrl":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg","width":1200,"height":800,"caption":"sejlplan"},{"@type":"BreadcrumbList","@id":"https:\/\/hirtshals-kristiansand.com\/da\/sejlplan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Hirtshals Kristiansand","item":"https:\/\/hirtshals-kristiansand.com\/da\/"},{"@type":"ListItem","position":2,"name":"Hirtshals Kristiansand sejlplan"}]},{"@type":"WebSite","@id":"https:\/\/hirtshals-kristiansand.com\/da\/#website","url":"https:\/\/hirtshals-kristiansand.com\/da\/","name":"F\u00e6rge Hirtshals Kristiansand","description":"Alt om f\u00e6rgeoverfarten fra Hirtshals til Kristiansand","publisher":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hirtshals-kristiansand.com\/da\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/hirtshals-kristiansand.com\/da\/#organization","name":"F\u00e6rge Hirtshals Kristiansand","url":"https:\/\/hirtshals-kristiansand.com\/da\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/hirtshals-kristiansand.com\/da\/#\/schema\/logo\/image\/","url":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2025\/05\/hirtshals-kristiansand.svg","contentUrl":"https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2025\/05\/hirtshals-kristiansand.svg","width":800,"height":256,"caption":"F\u00e6rge Hirtshals Kristiansand"},"image":{"@id":"https:\/\/hirtshals-kristiansand.com\/da\/#\/schema\/logo\/image\/"}}]}},"uagb_featured_image_src":{"full":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg",1200,800,false],"thumbnail":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2-150x150.jpg",150,150,true],"medium":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2-300x200.jpg",300,200,true],"medium_large":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2-768x512.jpg",768,512,true],"large":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2-1024x683.jpg",1024,683,true],"1536x1536":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg",1200,800,false],"2048x2048":["https:\/\/hirtshals-kristiansand.com\/da\/wp-content\/uploads\/sites\/4\/2024\/03\/hirtshals-kristiansand-ferry-2.jpg",1200,800,false]},"uagb_author_info":{"display_name":"mail@robberttigchelaar.com","author_link":"https:\/\/hirtshals-kristiansand.com\/da\/author\/mailrobberttigchelaar-com\/"},"uagb_comment_info":0,"uagb_excerpt":"Se den aktuelle k\u00f8replan for f\u00e6rgeruten Hirtshals Kristiansand (drevet af Fjord Line og Color Line). Hirtshals Kristiansand afgangs- og ankomsttider [&hellip;]","_links":{"self":[{"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/pages\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":5,"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/pages\/56\/revisions"}],"predecessor-version":[{"id":198,"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/pages\/56\/revisions\/198"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/media\/121"}],"wp:attachment":[{"href":"https:\/\/hirtshals-kristiansand.com\/da\/wp-json\/wp\/v2\/media?parent=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}