{"id":3461,"date":"2026-04-26T15:47:14","date_gmt":"2026-04-26T13:47:14","guid":{"rendered":"https:\/\/filmsafari.de\/?page_id=3461"},"modified":"2026-04-26T15:51:17","modified_gmt":"2026-04-26T13:51:17","slug":"nationalteams","status":"publish","type":"page","link":"https:\/\/filmsafari.de\/?page_id=3461","title":{"rendered":"Nationalteams"},"content":{"rendered":"    <div class=\"fm-nt-wrap\" data-ajax-url=\"https:\/\/filmsafari.de\/wp-admin\/admin-ajax.php\" data-player-profile-url=\"https:\/\/filmsafari.de\/?page_id=3377\">\n                                    <details class=\"fm-nt-card\" data-team-id=\"4\" data-country=\"Belgium\">\n                    <summary class=\"fm-nt-head\">\n                        <span class=\"fm-nt-badges\">\n                                                        <img decoding=\"async\" src=\"https:\/\/flagcdn.com\/24x18\/be.png\" class=\"fm-nt-flag\" alt=\"Belgium Flag\">                        <\/span>\n                        <span class=\"fm-nt-title-wrap\">\n                            <span class=\"fm-nt-title\">Belgien<\/span>\n                            <span class=\"fm-nt-sub\">Belgium \u00b7 0\/20<\/span>\n                        <\/span>\n                        <span class=\"fm-nt-chevron\">\u25be<\/span>\n                    <\/summary>\n                    <div class=\"fm-nt-panel\">\n                        <div class=\"fm-nt-loading\">Spieler werden geladen \u2026<\/div>\n                    <\/div>\n                <\/details>\n                            <details class=\"fm-nt-card\" data-team-id=\"1\" data-country=\"Estonia\">\n                    <summary class=\"fm-nt-head\">\n                        <span class=\"fm-nt-badges\">\n                            <img decoding=\"async\" src=\"http:\/\/filmsafari.de\/wp-content\/uploads\/2026\/04\/nm_eesti.png\" class=\"fm-nt-logo\" alt=\"Estland Logo\">                            <img decoding=\"async\" src=\"https:\/\/flagcdn.com\/24x18\/ee.png\" class=\"fm-nt-flag\" alt=\"Estonia Flag\">                        <\/span>\n                        <span class=\"fm-nt-title-wrap\">\n                            <span class=\"fm-nt-title\">Estland<\/span>\n                            <span class=\"fm-nt-sub\">Estonia \u00b7 1\/20<\/span>\n                        <\/span>\n                        <span class=\"fm-nt-chevron\">\u25be<\/span>\n                    <\/summary>\n                    <div class=\"fm-nt-panel\">\n                        <div class=\"fm-nt-loading\">Spieler werden geladen \u2026<\/div>\n                    <\/div>\n                <\/details>\n                            <details class=\"fm-nt-card\" data-team-id=\"2\" data-country=\"Finland\">\n                    <summary class=\"fm-nt-head\">\n                        <span class=\"fm-nt-badges\">\n                            <img decoding=\"async\" src=\"http:\/\/filmsafari.de\/wp-content\/uploads\/2026\/05\/nm_finland.png\" class=\"fm-nt-logo\" alt=\"Finnland Logo\">                            <img decoding=\"async\" src=\"https:\/\/flagcdn.com\/24x18\/fi.png\" class=\"fm-nt-flag\" alt=\"Finland Flag\">                        <\/span>\n                        <span class=\"fm-nt-title-wrap\">\n                            <span class=\"fm-nt-title\">Finnland<\/span>\n                            <span class=\"fm-nt-sub\">Finland \u00b7 0\/20<\/span>\n                        <\/span>\n                        <span class=\"fm-nt-chevron\">\u25be<\/span>\n                    <\/summary>\n                    <div class=\"fm-nt-panel\">\n                        <div class=\"fm-nt-loading\">Spieler werden geladen \u2026<\/div>\n                    <\/div>\n                <\/details>\n                            <details class=\"fm-nt-card\" data-team-id=\"3\" data-country=\"Iceland\">\n                    <summary class=\"fm-nt-head\">\n                        <span class=\"fm-nt-badges\">\n                            <img decoding=\"async\" src=\"http:\/\/filmsafari.de\/wp-content\/uploads\/2026\/05\/nm_iceland.png\" class=\"fm-nt-logo\" alt=\"Island Logo\">                            <img decoding=\"async\" src=\"https:\/\/flagcdn.com\/24x18\/is.png\" class=\"fm-nt-flag\" alt=\"Iceland Flag\">                        <\/span>\n                        <span class=\"fm-nt-title-wrap\">\n                            <span class=\"fm-nt-title\">Island<\/span>\n                            <span class=\"fm-nt-sub\">Iceland \u00b7 0\/20<\/span>\n                        <\/span>\n                        <span class=\"fm-nt-chevron\">\u25be<\/span>\n                    <\/summary>\n                    <div class=\"fm-nt-panel\">\n                        <div class=\"fm-nt-loading\">Spieler werden geladen \u2026<\/div>\n                    <\/div>\n                <\/details>\n                        <\/div>\n\n    <style>\n        .fm-nt-wrap{max-width:760px;margin:14px auto;padding:0 10px;display:flex;flex-direction:column;gap:10px;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif}\n        .fm-nt-card{background:linear-gradient(180deg,#ffffff,#f7faff);border:1px solid #dbe5f3;border-radius:14px;box-shadow:0 7px 20px rgba(30,64,175,.08);overflow:hidden}\n        .fm-nt-head{width:100%;display:flex;align-items:center;gap:10px;text-align:left;border:0;background:transparent;padding:12px 10px;cursor:pointer;list-style:none}\n        .fm-nt-head::-webkit-details-marker{display:none}\n        .fm-nt-badges{display:flex;align-items:center;gap:8px;flex:0 0 auto}\n        .fm-nt-logo,.fm-nt-flag{width:34px;height:24px;object-fit:cover;border-radius:6px;border:1px solid rgba(15,23,42,.12);background:#fff}\n        .fm-nt-title-wrap{flex:1;min-width:0}\n        .fm-nt-title{display:block;font-weight:700;color:#0f172a;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n        .fm-nt-sub{display:block;color:#5b6b84;font-size:12px;margin-top:2px}\n        .fm-nt-chevron{color:#1d4ed8;font-size:16px;transition:transform .2s ease}\n        .fm-nt-card[open] .fm-nt-chevron{transform:rotate(180deg)}\n        .fm-nt-panel{border-top:1px solid #e3eaf4;background:#fff;padding:8px 8px 10px}\n        .fm-nt-loading,.fm-nt-empty{padding:12px;border-radius:10px;background:#f8fbff;color:#52607a;font-size:13px}\n        .fm-nt-filters{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:4px 0 10px}\n        .fm-nt-filter{border:0;border-radius:8px;padding:7px 4px;font-size:12px;font-weight:700;color:#0f172a;cursor:pointer;opacity:.8}\n        .fm-nt-filter.is-active{box-shadow:inset 0 0 0 2px rgba(15,23,42,.4);opacity:1}\n        .fm-nt-filter[data-pos=\"G\"]{background:#c7d2fe}\n        .fm-nt-filter[data-pos=\"D\"]{background:#bfdbfe}\n        .fm-nt-filter[data-pos=\"M\"]{background:#bbf7d0}\n        .fm-nt-filter[data-pos=\"F\"]{background:#fecaca}\n        .fm-nt-player{display:grid;grid-template-columns:96px minmax(0,1fr)auto;gap:8px;align-items:center;padding:8px;border-radius:10px;border:1px solid #e9eef7;background:#fbfdff}\n        .fm-nt-player.is-in-squad{border-color:#22c55e;box-shadow:inset 0 0 0 1px rgba(34,197,94,.2)}\n        .fm-nt-player + .fm-nt-player{margin-top:7px}\n        .fm-nt-player-media{display:flex;gap:8px;align-items:center}\n        .fm-nt-player-photo{width:44px;height:44px;border-radius:50%;object-fit:cover;border:1px solid #dbe5f3;background:#eef2ff}\n        .fm-nt-team-logo{width:44px;height:44px;border-radius:50%;object-fit:cover;border:1px solid #dbe5f3;background:#eef2ff}\n        .fm-nt-team-logo.is-empty{opacity:.25}\n        .fm-nt-player-main{min-width:0}\n        .fm-nt-player-name{font-weight:600;color:#0f172a;font-size:14px}\n        .fm-nt-player-link{text-decoration:none;color:inherit}\n        .fm-nt-player-link:hover{text-decoration:underline}\n        .fm-nt-player-meta{font-size:12px;color:#5b6b84;display:flex;flex-wrap:wrap;gap:8px;margin-top:3px}\n        .fm-nt-player-avg{font-weight:700;color:#0f172a}\n        .fm-nt-player-avg.is-negative{color:#b91c1c}\n        .fm-nt-actions{display:flex;gap:6px}\n        .fm-nt-add{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;border:1px solid #bfd2f7;background:#eaf1ff;color:#1e40af;font-weight:800;font-size:16px;cursor:pointer}\n        .fm-nt-remove{border-color:#bbf7d0;background:#f0fdf4;color:#166534}\n        .fm-nt-add[disabled]{opacity:.45;cursor:not-allowed}\n        @media (max-width:640px){.fm-nt-wrap{padding:0 6px}.fm-nt-head{padding:11px 8px}.fm-nt-logo,.fm-nt-flag{width:30px;height:21px}.fm-nt-player{grid-template-columns:88px minmax(0,1fr)26px}.fm-nt-player-photo,.fm-nt-team-logo{width:40px;height:40px}}\n    <\/style>\n\n    <script>\n    (function(){\n        const roots = document.querySelectorAll('.fm-nt-wrap[data-ajax-url]');\n        if(!roots.length){ return; }\n\n        roots.forEach(function(root){\n        const ajaxUrl = root.getAttribute('data-ajax-url');\n        const playerProfileUrl = root.getAttribute('data-player-profile-url') || '';\n\n        function buildPlayerProfileUrl(playerId){\n            if(!playerProfileUrl){ return '#'; }\n            try{\n                const url = new URL(playerProfileUrl, window.location.origin);\n                url.searchParams.set('player_id', String(playerId || ''));\n                return url.toString();\n            }catch(e){\n                const separator = playerProfileUrl.includes('?') ? '&' : '?';\n                return `${playerProfileUrl}${separator}player_id=${encodeURIComponent(String(playerId || ''))}`;\n            }\n        }\n\n        function normalizePosition(pos){\n            const value = (pos || '').toString().trim().toUpperCase();\n            if(value.includes('GOALKEEP') || value === 'GK' || value === 'G'){ return 'G'; }\n            if(value.includes('DEF') || value === 'CB' || value === 'LB' || value === 'RB' || value === 'D'){ return 'D'; }\n            if(value.includes('MID') || value === 'CM' || value === 'CDM' || value === 'CAM' || value === 'M'){ return 'M'; }\n            return 'F';\n        }\n\n        function escapeHtml(str){\n            return (str || '').toString()\n                .replace(\/&\/g, '&amp;')\n                .replace(\/<\/g, '&lt;')\n                .replace(\/>\/g, '&gt;')\n                .replace(\/\"\/g, '&quot;')\n                .replace(\/'\/g, '&#039;');\n        }\n\n        function renderPlayers(panel, teamId, players, activePos = ''){\n            if(!players.length){\n                panel.innerHTML = '<div class=\"fm-nt-loading\">Keine Spieler f\u00fcr dieses Land gefunden.<\/div>';\n                return;\n            }\n            const positionButtons = [\n                {key: 'G', label: 'Tor'},\n                {key: 'D', label: 'Abwehr'},\n                {key: 'M', label: 'Mittelfeld'},\n                {key: 'F', label: 'Sturm'}\n            ];\n            const filteredPlayers = activePos ? players.filter(p => normalizePosition(p.position) === activePos) : players;\n            const playerListHtml = filteredPlayers.length ? filteredPlayers.map(p => {\n                const gamesPlayed = Number.isFinite(Number(p.games_played)) ? Number(p.games_played) : 0;\n                const avg = p.durchschnitt !== null ? `\u00d8 ${p.durchschnitt}` : '';\n                const avgNegative = p.durchschnitt !== null && Number(p.durchschnitt) < 0;\n                const age = Number.isInteger(p.age) ? ` (${p.age})` : '';\n                const profileUrl = buildPlayerProfileUrl(p.player_id);\n                const photo = p.photo ? `<img decoding=\"async\" src=\"${escapeHtml(p.photo)}\" class=\"fm-nt-player-photo\" alt=\"${escapeHtml(p.player_name)}\">` : '<div class=\"fm-nt-player-photo\" aria-hidden=\"true\"><\/div>';\n                const teamLogo = p.customteam_logo\n                    ? `<img decoding=\"async\" src=\"${escapeHtml(p.customteam_logo)}\" class=\"fm-nt-team-logo\" alt=\"\">`\n                    : '<div class=\"fm-nt-team-logo is-empty\" aria-hidden=\"true\"><\/div>';\n                return `\n                <div class=\"fm-nt-player${p.in_squad ? ' is-in-squad' : ''}\" data-player-id=\"${p.player_id}\">\n                    <div class=\"fm-nt-player-media\">${teamLogo}${photo}<\/div>\n                    <div class=\"fm-nt-player-main\">\n                        <div class=\"fm-nt-player-name\"><a class=\"fm-nt-player-link\" href=\"${escapeHtml(profileUrl)}\">${p.player_name}${age}<\/a><\/div>\n                        <div class=\"fm-nt-player-meta\">\n                            ${avg ? `<span class=\"fm-nt-player-avg${avgNegative ? ' is-negative' : ''}\">${avg}<\/span>` : ''}\n                            ${avg ? `<span>\/ Anzahl Spiele : ${gamesPlayed}<\/span>` : ''}\n                        <\/div>\n                    <\/div>\n                    <div class=\"fm-nt-actions\">\n                        <button type=\"button\" class=\"fm-nt-add\" data-team-id=\"${teamId}\" data-player-id=\"${p.player_id}\" title=\"Zum Kader hinzuf\u00fcgen\"${p.in_squad ? ' disabled' : ''}>+<\/button>\n                        ${p.in_squad ? `<button type=\"button\" class=\"fm-nt-add fm-nt-remove\" data-team-id=\"${teamId}\" data-player-id=\"${p.player_id}\" title=\"Aus Kader entfernen\">-<\/button>` : ''}\n                    <\/div>\n                <\/div>`;\n            }).join('') : '<div class=\"fm-nt-loading\">Keine Spieler in dieser Position.<\/div>';\n\n            panel.innerHTML = `\n                <div class=\"fm-nt-filters\">\n                    ${positionButtons.map(btn => `<button type=\"button\" class=\"fm-nt-filter${activePos === btn.key ? ' is-active' : ''}\" data-pos=\"${btn.key}\">${btn.label}<\/button>`).join('')}\n                <\/div>\n                <div class=\"fm-nt-player-list\">${playerListHtml}<\/div>\n            `;\n        }\n\n        root.querySelectorAll('.fm-nt-card').forEach(function(card){\n            card.addEventListener('toggle', function(){\n                const panel = card.querySelector('.fm-nt-panel');\n                const teamId = card.getAttribute('data-team-id');\n                const country = card.getAttribute('data-country') || '';\n                if(card.open && !panel.dataset.loaded){\n                    panel.innerHTML = '<div class=\"fm-nt-loading\">Spieler werden geladen \u2026<\/div>';\n                    fetch(`${ajaxUrl}?action=fm_nt_get_players&country=${encodeURIComponent(country)}&nationalteam_id=${encodeURIComponent(teamId)}`)\n                        .then(r => r.json())\n                        .then(payload => {\n                            if(!payload.success){\n                                panel.innerHTML = `<div class=\"fm-nt-loading\">Fehler: ${payload.data || 'Unbekannt'}<\/div>`;\n                                return;\n                            }\n                            panel.dataset.loaded = '1';\n                            panel.dataset.players = JSON.stringify(payload.data || []);\n                            renderPlayers(panel, teamId, payload.data || []);\n                        })\n                        .catch(() => {\n                            panel.innerHTML = '<div class=\"fm-nt-loading\">Fehler beim Laden der Spieler.<\/div>';\n                        });\n                }\n            });\n        });\n\n        root.addEventListener('click', function(e){\n\n            var removeBtn = e.target.closest('.fm-nt-remove');\n            if(removeBtn){\n                const teamId = removeBtn.getAttribute('data-team-id');\n                const playerId = removeBtn.getAttribute('data-player-id');\n                const body = new URLSearchParams();\n                body.set('action', 'fm_nt_remove_player');\n                body.set('nationalteam_id', teamId || '');\n                body.set('response_player_id', playerId || '');\n                fetch(ajaxUrl, { method: 'POST', headers: {'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8'}, body: body.toString() })\n                    .then(r => r.json())\n                    .then(payload => {\n                        if(payload.success){\n                            panelReloadByTeam(teamId);\n                            return;\n                        }\n                        alert(payload.data || 'Spieler konnte nicht entfernt werden.');\n                    })\n                    .catch(() => alert('Fehler beim Entfernen.'));\n                return;\n            }\n\n            var addBtn = e.target.closest('.fm-nt-add');\n            if(addBtn){\n                addBtn.disabled = true;\n                const teamId = addBtn.getAttribute('data-team-id');\n                const playerId = addBtn.getAttribute('data-player-id');\n\n                const body = new URLSearchParams();\n                body.set('action', 'fm_nt_add_player');\n                body.set('nationalteam_id', teamId || '');\n                body.set('response_player_id', playerId || '');\n\n                fetch(ajaxUrl, {\n                    method: 'POST',\n                    headers: {'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8'},\n                    body: body.toString()\n                })\n                    .then(r => r.json())\n                    .then(payload => {\n                        if(payload.success){\n                            panelReloadByTeam(teamId);\n                            return;\n                        }\n                        addBtn.disabled = false;\n                        alert(payload.data || 'Spieler konnte nicht hinzugef\u00fcgt werden.');\n                    })\n                    .catch(() => {\n                        addBtn.disabled = false;\n                        alert('Fehler beim Speichern.');\n                    });\n                return;\n            }\n\n            var filterBtn = e.target.closest('.fm-nt-filter');\n            if(!filterBtn){ return; }\n            const panel = filterBtn.closest('.fm-nt-panel');\n            const card = filterBtn.closest('.fm-nt-card');\n            if(!panel || !card || !panel.dataset.players){ return; }\n            let players = [];\n            try {\n                players = JSON.parse(panel.dataset.players);\n            } catch(_err){\n                players = [];\n            }\n            const teamId = card.getAttribute('data-team-id');\n            const current = panel.dataset.activePos || '';\n            const nextPos = current === filterBtn.dataset.pos ? '' : (filterBtn.dataset.pos || '');\n            panel.dataset.activePos = nextPos;\n            renderPlayers(panel, teamId, players, nextPos);\n        });\n\n        function panelReloadByTeam(teamId){\n            const card = root.querySelector(`.fm-nt-card[data-team-id=\"${CSS.escape(teamId)}\"]`);\n            const panel = card ? card.querySelector('.fm-nt-panel') : null;\n            const country = card ? (card.getAttribute('data-country') || '') : '';\n            if(!panel || !country){ return; }\n            fetch(`${ajaxUrl}?action=fm_nt_get_players&country=${encodeURIComponent(country)}&nationalteam_id=${encodeURIComponent(teamId)}`)\n                .then(r => r.json())\n                .then(payload => {\n                    if(!payload.success){ return; }\n                    panel.dataset.players = JSON.stringify(payload.data || []);\n                    renderPlayers(panel, teamId, payload.data || [], panel.dataset.activePos || '');\n                })\n                .catch(() => {});\n        }\n        });\n    })();\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"class_list":["post-3461","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/pages\/3461","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/filmsafari.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3461"}],"version-history":[{"count":2,"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/pages\/3461\/revisions"}],"predecessor-version":[{"id":3464,"href":"https:\/\/filmsafari.de\/index.php?rest_route=\/wp\/v2\/pages\/3461\/revisions\/3464"}],"wp:attachment":[{"href":"https:\/\/filmsafari.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}