{"id":8310,"date":"2024-01-24T09:48:19","date_gmt":"2024-01-24T08:48:19","guid":{"rendered":"https:\/\/www.ansporran.at\/?page_id=8310"},"modified":"2025-09-24T11:16:38","modified_gmt":"2025-09-24T09:16:38","slug":"auslosungsprogramm-2","status":"publish","type":"page","link":"https:\/\/www.ansporran.at\/?page_id=8310","title":{"rendered":"Auslosungsprogramm"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n    <meta charset=\"utf-8\" \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n    <title>CrownsCup &#8211; Pairs Generator &#8211; AnSporran<\/title>\n\n    <!-- Bootstrap 5.3 -->\n    <link href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.2\/dist\/css\/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <style>\n        body {\n            background-color: #ddd;\n            height: 100%;\n            background-position: center;\n            background-repeat: no-repeat;\n            background-size: cover;\n        }\n        .tdred { background-color: red; }\n        .tr1 { background-color: wheat; }\n        tr { background-color: paleturquoise; }\n        td { background-color: grey; }\n\n        \/* player button style *\/\n        .player-btn {\n            width:36px;\n            padding: 0 5px;\n            margin: 2px;\n        }\n        \/* small table styling to keep compact *\/\n        .compact-table td { padding: 2px; border: none; }\n    <\/style>\n<\/head>\n<body onload=\"Init()\">\n    <div class=\"container py-3\">\n        <table style=\"width:100%;\">\n            <tr>\n                <td colspan=\"2\" class=\"tdred text-center\">\n                    <button type=\"button\" class=\"btn btn-primary btn-lg w-100\" onclick=\"onHeaderClick()\">\n                        CrownsCup &#8211; Pairs Generator &#8211; AnSporran\n                    <\/button>\n                <\/td>\n            <\/tr>\n\n            <tr class=\"text-center\">\n                <td class=\"py-3\">\n                    <button id=\"btnCalculate\" class=\"btn btn-success btn-lg\" onclick=\"calculate()\">Calculate<\/button>\n                    <button id=\"btnShowTable\" class=\"btn btn-primary btn-lg d-none\" onclick=\"showTable()\">Show<\/button>\n                <\/td>\n                <td class=\"py-3\">\n                    <button type=\"button\" class=\"btn btn-primary btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#playerCount\">Spieler:<\/button>\n                    <div id=\"playerCount\" class=\"collapse show mt-2\">\n                        <table class=\"compact-table\">\n                            <tbody>\n                                <tr>\n                                    <td>\n                                        <select class=\"form-select\" id=\"maxNumber\" style=\"width:200px;\" onchange=\"onChangePlayer()\">\n                                            <!-- gleiche Optionen wie original (4..64), default 24 -->\n                                            <option>4<\/option><option>6<\/option><option>8<\/option><option>10<\/option>\n                                            <option>12<\/option><option>14<\/option><option>16<\/option><option>18<\/option>\n                                            <option>20<\/option><option>22<\/option><option>24<\/option><option>26<\/option>\n                                            <option>28<\/option><option>30<\/option><option>32<\/option><option>34<\/option>\n                                            <option>36<\/option><option>38<\/option><option>40<\/option><option>42<\/option>\n                                            <option>44<\/option><option>46<\/option><option>48<\/option><option>50<\/option>\n                                            <option>52<\/option><option>54<\/option><option>56<\/option><option>58<\/option>\n                                            <option>60<\/option><option>62<\/option><option>64<\/option>\n                                        <\/select>\n                                    <\/td>\n                                <\/tr>\n                            <\/tbody>\n                        <\/table>\n                    <\/div>\n                <\/td>\n            <\/tr>\n        <\/table>\n\n        <!-- Filter \/ Pools (initially visible) -->\n        <div id=\"tableFilter\">\n            <table style=\"width:100%;\">\n                <tr class=\"text-center\">\n                    <td>\n                        <button type=\"button\" class=\"btn btn-danger btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#upperPlayer\">Gesetzte<\/button>\n                        <div id=\"upperPlayer\" class=\"collapse show mt-2\">\n                            <table class=\"compact-table\"><tbody><tr><td align=\"center\" colspan=\"2\" id=\"upperSeatedPlayers\"><\/td><\/tr><\/tbody><\/table>\n                        <\/div>\n                    <\/td>\n                <\/tr>\n\n                <tr class=\"text-center\">\n                    <td>\n                        <button type=\"button\" class=\"btn btn-success btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#lowerPlayerDiv\">Mittelfeld<\/button>\n                        <div id=\"lowerPlayerDiv\" class=\"collapse mt-2\">\n                            <table class=\"compact-table\"><tbody><tr><td align=\"center\" colspan=\"2\" id=\"lowerSeatedPlayers\"><\/td><\/tr><\/tbody><\/table>\n                        <\/div>\n                    <\/td>\n                <\/tr>\n\n                <tr class=\"text-center\">\n                    <td>\n                        <button type=\"button\" class=\"btn btn-outline-info btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#unseatedPlayerDiv\">Ungesetzte<\/button>\n                        <div id=\"unseatedPlayerDiv\" class=\"collapse mt-2\">\n                            <table class=\"compact-table\"><tbody><tr><td align=\"center\" colspan=\"2\" id=\"unSeatedPlayers\"><\/td><\/tr><\/tbody><\/table>\n                        <\/div>\n                    <\/td>\n                <\/tr>\n\n                <tr class=\"text-center\">\n                    <td>\n                        <button type=\"button\" class=\"btn btn-info btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#privatePlayerDiv\">Private Pool<\/button>\n                        <div id=\"privatePlayerDiv\" class=\"collapse mt-2\">\n                            <table class=\"compact-table\"><tbody><tr><td align=\"center\" colspan=\"2\" id=\"privatePlayers\"><\/td><\/tr><\/tbody><\/table>\n                        <\/div>\n                    <\/td>\n                <\/tr>\n            <\/table>\n        <\/div>\n\n        <!-- Output table (hidden initially) -->\n        <div id=\"tableOutput\" class=\"d-none mt-3\">\n            <table style=\"width:100%;\">\n                <tr class=\"text-center\">\n                    <td>\n                        <button type=\"button\" class=\"btn btn-success btn-lg w-100\" data-bs-toggle=\"collapse\" data-bs-target=\"#divOutput\">Teams:<\/button>\n                        <div id=\"divOutput\" class=\"collapse show mt-2\">\n                            <table class=\"compact-table\"><tbody><tr><td align=\"center\" colspan=\"2\"><p id=\"output\" class=\"button col-8\"><\/p><\/td><\/tr><\/tbody><\/table>\n                        <\/div>\n                    <\/td>\n                <\/tr>\n            <\/table>\n        <\/div>\n\n    <\/div>\n\n    <!-- Bootstrap bundle (Popper included). No jQuery required. -->\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap@5.3.2\/dist\/js\/bootstrap.bundle.min.js\"><\/script>\n\n    <script>\n        \/* -----------------------\n           Pools & globale Variablen\n           ----------------------- *\/\n        let PoolAllPlayers = [];\n        let PoolSeatedPlayers = [];\n        let PoolMiddlePlayers = [];\n        let PoolNotSeatedPlayers = [];\n        let PoolPrivatePlayers = [];\n\n        \/* Init beim Laden *\/\n        function Init() {\n            \/\/ set default selection to 24 (if present)\n            const sel = document.getElementById('maxNumber');\n            if (sel) {\n                \/\/ try to set selected to 24\n                for (let opt of sel.options) {\n                    if (opt.value === '24' || opt.text === '24') { opt.selected = true; break; }\n                }\n            }\n            onChangePlayer();\n            hideElement('#btnShowTable');\n            \/\/ showFilter initially\n            showElement('#tableFilter');\n            hideElement('#tableOutput');\n        }\n\n        function getMaxPlayers() {\n            const v = document.getElementById(\"maxNumber\").value;\n            const n = parseInt(v, 10);\n            return isNaN(n) ? 0 : n;\n        }\n\n        \/* Erzeugt die Buttons f\u00fcr Spieler (8 pro Zeile), dann clone\/replace f\u00fcr die anderen Pools *\/\n        function createPlayerButtons() {\n            const count = getMaxPlayers();\n\n            \/\/ clear existing tables\n            document.getElementById('upperSeatedPlayers').innerHTML = \"\";\n            document.getElementById('lowerSeatedPlayers').innerHTML = \"\";\n            document.getElementById('unSeatedPlayers').innerHTML = \"\";\n            document.getElementById('privatePlayers').innerHTML = \"\";\n\n            \/\/ base table: use single quotes for easier replace patterns like \"'num\"\n            let tempTable = \"<table class='compact-table'><tbody><tr>\";\n\n            for (let i = 1; i <= count; i++) {\n                tempTable += \"<td> <button type='button' style='width:36px; padding-right:5px ; padding-left:5px' id='num\" + i + \"' class='btn btn-info btn-lg player-btn' onclick='addRemoveUpperSeatedPlayer(\" + i + \")'>\" + i + \"<\/button>       <\/td>\";\n                if (i % 8 === 0) tempTable += \"<\/tr><tr>\";\n            }\n\n            tempTable += \"<\/tr><\/tbody><\/table>\";\n\n            \/\/ append for each pool (use string replace to change function names & ids)\n            document.getElementById('upperSeatedPlayers').insertAdjacentHTML('beforeend', tempTable);\n\n            \/\/ lower\n            const lower = tempTable\n                .replace(\/addRemoveUpperSeatedPlayer\/g, \"addRemoveLowerSeatedPlayer\")\n                .replace(\/'num\/g, \"'numlow\")\n                .replace(\/btn-info\/g, \"btn-info\");\n            document.getElementById('lowerSeatedPlayers').insertAdjacentHTML('beforeend', lower);\n\n            \/\/ unseated\n            const unseated = tempTable\n                .replace(\/addRemoveUpperSeatedPlayer\/g, \"addRemoveNoSeatedPlayer\")\n                .replace(\/'num\/g, \"'numno\")\n                .replace(\/btn-info\/g, \"btn-info\");\n            document.getElementById('unSeatedPlayers').insertAdjacentHTML('beforeend', unseated);\n\n            \/\/ private\n            const privateTbl = tempTable\n                .replace(\/addRemoveUpperSeatedPlayer\/g, \"addRemovePrivatePlayerPool\")\n                .replace(\/'num\/g, \"'numprivate\")\n                .replace(\/btn-info\/g, \"btn-danger\");\n            document.getElementById('privatePlayers').insertAdjacentHTML('beforeend', privateTbl);\n        }\n\n        \/* onChangePlayer: neu aufbauen und Pools zur\u00fccksetzen *\/\n        function onChangePlayer() {\n            const count = getMaxPlayers();\n            createPlayerButtons();\n\n            PoolAllPlayers = [];\n            PoolSeatedPlayers = [];\n            PoolMiddlePlayers = [];\n            PoolNotSeatedPlayers = [];\n            PoolPrivatePlayers = [];\n\n            for (let i = 1; i <= count; i++) PoolAllPlayers.push(i);\n        }\n\n        \/* Helper wrappers, identisch benannte Funktionen wie im Original *\/\n        function addRemoveUpperSeatedPlayer(a) { addRemoveFromPlayer(PoolSeatedPlayers, a, true, '#num', 'btn-warning', 'btn-primary'); }\n        function addRemoveLowerSeatedPlayer(a) { addRemoveFromPlayer(PoolMiddlePlayers, a, true, '#numlow', 'btn-warning', 'btn-primary'); }\n        function addRemoveNoSeatedPlayer(a) { addRemoveFromPlayer(PoolNotSeatedPlayers, a, true, '#numno', 'btn-warning', 'btn-primary'); }\n        function addRemovePrivatePlayerPool(a) { addRemoveFromPlayer(PoolPrivatePlayers, a, true, '#numprivate', 'btn-primary', 'btn-danger'); }\n\n        \/* show\/hide helpers using Bootstrap d-none *\/\n        function hideElement(selector) {\n            const el = document.querySelector(selector);\n            if (el) el.classList.add('d-none');\n        }\n        function showElement(selector) {\n            const el = document.querySelector(selector);\n            if (el) el.classList.remove('d-none');\n        }\n\n        \/* add\/remove player from pool and update corresponding button styles &#038; visibility *\/\n        function addRemoveFromPlayer(playerArray, a, removeFromOtherLists, nameOfControl, firstColor, secondColor) {\n            const index = playerArray.indexOf(a);\n            const controlEl = document.querySelector(nameOfControl + a);\n\n            if (index > -1) {\n                \/\/ remove\n                playerArray.splice(index, 1);\n                if (controlEl) {\n                    controlEl.classList.remove(firstColor);\n                    controlEl.classList.add(secondColor);\n                }\n                if (removeFromOtherLists) {\n                    if (nameOfControl !== '#num') { const e = document.getElementById('num' + a); if (e) e.classList.remove('d-none'); }\n                    if (nameOfControl !== '#numlow') { const e = document.getElementById('numlow' + a); if (e) e.classList.remove('d-none'); }\n                    if (nameOfControl !== '#numno') { const e = document.getElementById('numno' + a); if (e) e.classList.remove('d-none'); }\n                    if (nameOfControl !== '#numprivate') { const e = document.getElementById('numprivate' + a); if (e) e.classList.remove('d-none'); }\n                }\n            } else {\n                \/\/ add\n                if (controlEl) {\n                    controlEl.classList.remove(secondColor);\n                    controlEl.classList.add(firstColor);\n                }\n                if (removeFromOtherLists) {\n                    if (nameOfControl !== '#num') { const e = document.getElementById('num' + a); if (e) e.classList.add('d-none'); }\n                    if (nameOfControl !== '#numlow') { const e = document.getElementById('numlow' + a); if (e) e.classList.add('d-none'); }\n                    if (nameOfControl !== '#numno') { const e = document.getElementById('numno' + a); if (e) e.classList.add('d-none'); }\n                    if (nameOfControl !== '#numprivate') { const e = document.getElementById('numprivate' + a); if (e) e.classList.add('d-none'); }\n                }\n                playerArray.push(a);\n            }\n        }\n\n        \/* einfache Output-Funktionen (wie im Original, mit <br>) *\/\n        function clearOutput() {\n            const out = document.getElementById(\"output\");\n            if (out) out.innerHTML = \"\";\n        }\n        function WriteOutput(text) {\n            const out = document.getElementById(\"output\");\n            if (out) out.innerHTML = out.innerHTML + text + \"<br>\";\n        }\n\n        \/* shuffle: Fisher-Yates (deterministisch random) *\/\n        function shuffle(array) {\n            const arr = array.slice();\n            for (let i = arr.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [arr[i], arr[j]] = [arr[j], arr[i]];\n            }\n            return arr;\n        }\n\n        \/* Haupt-Logik: Paare erstellen (angepasst vom Original) *\/\n        function calculate() {\n            \/\/ shuffle pools as original attempted\n            PoolAllPlayers = shuffle(PoolAllPlayers);\n            PoolSeatedPlayers = shuffle(PoolSeatedPlayers);\n            PoolMiddlePlayers = shuffle(PoolMiddlePlayers);\n            PoolNotSeatedPlayers = shuffle(PoolNotSeatedPlayers);\n            \/\/ PoolPrivatePlayers intentionally not shuffled in original, but we can shuffle it if desired\n            \/\/ PoolPrivatePlayers = shuffle(PoolPrivatePlayers);\n\n            const pairs = [];\n            const missingPlayers = [];\n\n            const clonePoolSeatedPlayers = [...PoolSeatedPlayers];\n            const clonePoolMiddlePlayers = [...PoolMiddlePlayers];\n            const clonePoolNotSeatedPlayers = [...PoolNotSeatedPlayers];\n            let clonePoolAllPlayers = [...PoolAllPlayers];\n\n            \/\/ find players not in any pool (missing)\n            while (clonePoolAllPlayers.length > 0) {\n                const id = clonePoolAllPlayers.pop();\n                if (PoolSeatedPlayers.includes(id) || PoolMiddlePlayers.includes(id) || PoolNotSeatedPlayers.includes(id) || PoolPrivatePlayers.includes(id) || missingPlayers.includes(id)) {\n                    continue;\n                }\n                missingPlayers.push(id);\n            }\n\n            \/\/ create rows according to available pairs (totalPlayers - privatePool) \/ 2\n            const totalPairs = Math.floor((getMaxPlayers() - PoolPrivatePlayers.length) \/ 2);\n            for (let i = 1; i <= totalPairs; i++) {\n                let first = -1;\n                let second = -1;\n\n                \/\/ choose first\n                if (clonePoolSeatedPlayers.length > 0) {\n                    first = clonePoolSeatedPlayers.pop();\n                } else if (clonePoolMiddlePlayers.length > 0) {\n                    first = clonePoolMiddlePlayers.pop();\n                    if (clonePoolMiddlePlayers.length > 0)\n                        second = clonePoolMiddlePlayers.pop();\n                } else if (missingPlayers.length > 0) {\n                    first = missingPlayers.pop();\n                } else if (clonePoolNotSeatedPlayers.length > 0) {\n                    first = clonePoolNotSeatedPlayers.pop();\n                }\n\n                \/\/ choose second if still -1\n                if (second === -1) {\n                    if (clonePoolNotSeatedPlayers.length > 0) second = clonePoolNotSeatedPlayers.pop();\n                    else if (missingPlayers.length > 0) second = missingPlayers.pop();\n                    else if (clonePoolMiddlePlayers.length > 0) second = clonePoolMiddlePlayers.pop();\n                    else if (clonePoolSeatedPlayers.length > 0) second = clonePoolSeatedPlayers.pop();\n                }\n\n                pairs.push({ first: first, second: second });\n            }\n\n            \/\/ output\n            clearOutput();\n            console.log(\"pairs\", pairs);\n            WriteOutput(\"Pairs\");\n            for (let i = 0; i < pairs.length; i++) {\n                WriteOutput(pairs[i].first + \" \/ \" + pairs[i].second);\n            }\n\n            if (PoolPrivatePlayers.length > 0) {\n                WriteOutput(\"Private Pool\");\n                for (let i = 0; i <= PoolPrivatePlayers.length - 2; i = i + 2) {\n                    WriteOutput(PoolPrivatePlayers[i] + \" \/ \" + PoolPrivatePlayers[i + 1]);\n                }\n            }\n\n            \/\/ show output, hide filters, show the \"Show\" button to return\n            showElement('#tableOutput');\n            hideElement('#tableFilter');\n            showElement('#btnShowTable');\n        }\n\n        \/* zeigt wieder die Filter\/Pool-Auswahl (wie urspr\u00fcnglicher btnShowTable) *\/\n        function showTable() {\n            showElement('#tableFilter');\n            hideElement('#tableOutput');\n            hideElement('#btnShowTable');\n        }\n\n        \/* header click -> f\u00fcgt ein Bild (wie im Original) *\/\n        function onHeaderClick() {\n            const image = new Image(220, 220);\n            image.src = \"data:image\/png;base64,iVBORw0K...\"; \/\/ (gek\u00fcrzt in Beispiel; hier Original-base64 einf\u00fcgen falls ben\u00f6tigt)\n            \/\/ Wenn du das Original-Bild behalten willst, ersetze die src oben mit vollst\u00e4ndiger Base64 oder URL.\n            document.body.appendChild(image);\n        }\n\n    <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>CrownsCup &#8211; Pairs Generator &#8211; AnSporran CrownsCup &#8211; Pairs Generator &#8211; AnSporran Calculate Show Spieler: 46810121416182022242628303234363840424446485052545658606264 Gesetzte Mittelfeld Ungesetzte Private Pool Teams:<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":515,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0,"footnotes":""},"class_list":["post-8310","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/pages\/8310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ansporran.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8310"}],"version-history":[{"count":3,"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/pages\/8310\/revisions"}],"predecessor-version":[{"id":9242,"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/pages\/8310\/revisions\/9242"}],"up":[{"embeddable":true,"href":"https:\/\/www.ansporran.at\/index.php?rest_route=\/wp\/v2\/pages\/515"}],"wp:attachment":[{"href":"https:\/\/www.ansporran.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}