-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
193 lines (175 loc) · 116 KB
/
Copy pathscript.js
File metadata and controls
193 lines (175 loc) · 116 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
"use strict";(()=>{var Me=class{constructor(){this.cache=new Map;this.weakRefCache=new WeakMap}get(e,t=document){let r=this.getCacheKey(e,t);if(this.cache.has(r)){let o=this.cache.get(r);if(o&&o.isConnected)return o;this.cache.delete(r)}let n=t.querySelector(e);return n&&this.cache.set(r,n),n}getAll(e,t=document){let r=this.getCacheKey(e+":all",t);if(this.cache.has(r)){let o=this.cache.get(r);if(o&&o.length>0&&o[0].isConnected)return o;this.cache.delete(r)}let n=t.querySelectorAll(e);return this.cache.set(r,n),n}getFromRow(e,t){let r=this.weakRefCache.get(e);if(r||(r=new Map,this.weakRefCache.set(e,r)),r.has(t)){let o=r.get(t);if(o&&o.isConnected)return o;r.delete(t)}let n=e.querySelector(t);return n&&r.set(t,n),n}getAllFromRow(e,t){let r=this.weakRefCache.get(e);r||(r=new Map,this.weakRefCache.set(e,r));let n=t+":all";if(r.has(n)){let a=r.get(n);if(a&&a.length>0&&a[0].isConnected)return a;r.delete(n)}let o=e.querySelectorAll(t);return r.set(n,o),o}invalidate(e,t=document){if(e){let r=this.getCacheKey(e,t);this.cache.delete(r),this.cache.delete(r+":all")}else this.cache.clear()}clear(){this.cache.clear()}getCacheKey(e,t){return t===document?e:`${e}@${t.tagName}:${t.className}`}},b=new Me;var S=class{static getLeniencyRadios(){return{noLeniency:b.get("#no-leniency-radio"),leniency:b.get("#leniency-radio"),superLeniency:b.get("#super-leniency-radio")}}static getModeRadios(){return{powerLevel:b.get("#power-level-radio"),bracket:b.get("#bracket-radio")}}static getAvoidFivePodsRadio(){return b.get("#avoid-five-pods-radio")}static isBracketMode(){return this.getModeRadios().bracket?.checked||!1}static isPowerMode(){return!this.isBracketMode()}static getSelectedLeniency(){let e=this.getLeniencyRadios();return e.superLeniency?.checked?"super":e.leniency?.checked?"leniency":"none"}},v=class{static getAllPlayerRows(e){let t=b.getAll(".player-row",e);return Array.from(t)}static getNameInput(e){return b.getFromRow(e,".player-name")}static getGroupSelect(e){return b.getFromRow(e,".group-select")}static getPowerButton(e){return b.getFromRow(e,".power-selector-btn")}static getBracketButton(e){return b.getFromRow(e,".bracket-selector-btn")}static getPowerCheckboxes(e){let t=b.getAllFromRow(e,'.power-checkbox input[type="checkbox"]');return Array.from(t)}static getBracketCheckboxes(e){let t=b.getAllFromRow(e,'.bracket-checkbox input[type="checkbox"]');return Array.from(t)}static getAllCheckboxes(e){let t=b.getAllFromRow(e,'input[type="checkbox"]');return Array.from(t)}static hasSelectedCheckboxes(e){return this.getAllCheckboxes(e).some(r=>r.checked)}static hasContent(e){return this.getNameInput(e)?.value.trim()?!0:this.hasSelectedCheckboxes(e)}},G=class{static clearAll(e){e.forEach(t=>t.checked=!1)}static getCheckedValues(e){return e.filter(t=>t.checked).map(t=>t.value)}static getCheckedNumericValues(e){return e.filter(t=>t.checked).map(t=>parseFloat(t.value)).filter(t=>!isNaN(t))}static hasSelected(e){return e.some(t=>t.checked)}static setCheckedValues(e,t){e.forEach(r=>{r.checked=t.includes(r.value)})}static selectRange(e,t,r){let n=parseFloat(t),o=parseFloat(r);e.forEach(a=>{let s=parseFloat(a.value);!isNaN(s)&&!isNaN(n)&&!isNaN(o)&&(a.checked=s>=Math.min(n,o)&&s<=Math.max(n,o))})}},W=class{static getUndoResetButton(){return b.get("#undo-reset-btn")}static getResetAllButton(){return b.get("#reset-all-btn")}static getHelpSection(){return b.get(".help-section")}},te=class{static getAllGroupSelects(){let e=b.getAll(".group-select");return Array.from(e)}static extractPlayerData(e){let t=v.getNameInput(e),r=v.getGroupSelect(e),n=v.getPowerCheckboxes(e),o=v.getBracketCheckboxes(e);return{name:t?.value.trim()||"",groupValue:r?.value||"",selectedPowers:G.getCheckedValues(n),selectedBrackets:G.getCheckedValues(o)}}static applyPlayerData(e,t){let r=v.getNameInput(e),n=v.getGroupSelect(e),o=v.getPowerCheckboxes(e),a=v.getBracketCheckboxes(e);r&&(r.value=t.name),n&&(n.value=t.groupValue),G.setCheckedValues(o,t.selectedPowers),G.setCheckedValues(a,t.selectedBrackets)}};function ae(c){if(c<3)return[];if(c===3)return[3];if(c===4)return[4];if(c===5)return[5];if(c===6)return[3,3];if(c===7)return[4,3];if(c===8)return[4,4];if(c===9)return[3,3,3];if(c===10)return[5,5];let e=Math.floor(c/4),t=c%4;return t===0?Array(e).fill(4):t===1?e>=2?[...Array(e-2).fill(4),5,4]:[3,3,3,2]:t===2?e>=1?[...Array(e-1).fill(4),3,3]:[3,3,3,3]:t===3?[...Array(e).fill(4),3]:[]}function Ae(c){if(c<3)return[];if(c<9)return ae(c);if(c===9)return[3,3,3];if(c===10)return[4,3,3];if(c===11)return[4,4,3];if(c===12)return[4,4,4];if(c===13)return[4,3,3,3];if(c===14)return[4,4,3,3];if(c===15)return[4,4,4,3];let e=[],t=c;for(;t>=7;)e.push(4),t-=4;if(t===6)e.push(3,3);else if(t===5)if(e.length>0)e.pop(),t+=4,e.push(3,3,3);else return ae(c);else t===4?e.push(4):t===3&&e.push(3);return e.sort((r,n)=>n-r)}function He(){let c=S.getAvoidFivePodsRadio();return c&&c.checked?"avoid-five":"balanced"}function Be(){if(S.isBracketMode())return{allowLeniency:!1,allowSuperLeniency:!1,maxTolerance:0};let c=S.getSelectedLeniency();return c==="super"?{allowLeniency:!0,allowSuperLeniency:!0,maxTolerance:1}:c==="leniency"?{allowLeniency:!0,allowSuperLeniency:!1,maxTolerance:.5}:{allowLeniency:!1,allowSuperLeniency:!1,maxTolerance:0}}function De(c){let e=[];if(c.forEach(n=>{if(n.checked){let o=parseFloat(n.value);isNaN(o)||e.push(o)}}),e.length===0)return{availablePowers:[],powerRange:"",averagePower:0};e.sort((n,o)=>n-o);let t;e.length===1?t=e[0].toString():t=e.join(", ");let r=e.reduce((n,o)=>n+o,0)/e.length;return{availablePowers:e,powerRange:t,averagePower:Math.round(r*2)/2}}function Ue(){let c=S.getSelectedLeniency();return c==="super"?1:c==="leniency"?.5:0}function se(c){let e=c.players.flatMap(o=>"players"in o?o.players:[o]);if(e.length===0)return c.power.toString();let t=Ue(),r=[],n=new Set;e.forEach(o=>{o.availablePowers.forEach(a=>n.add(a))});for(let o of n)e.every(s=>s.availablePowers.some(i=>Math.abs(o-i)<=t))&&r.push(o);return r.sort((o,a)=>o-a),r.length===0?c.power.toString():r.length===1?r[0].toString():r.every((a,s)=>s===0||a-r[s-1]<=.5)&&r.length>2?`${r[0]}-${r[r.length-1]}`:r.join(", ")}function re(c,e){let t=[];if(Array.isArray(c.availablePowers))t=c.availablePowers;else if(typeof c.powerRange=="string")if(c.powerRange.includes("-")){let[n,o]=c.powerRange.split("-").map(a=>parseFloat(a.trim()));for(let a=n;a<=o;a+=.5)t.push(a)}else t=c.powerRange.split(",").map(n=>parseFloat(n.trim()));return t.map(n=>e.includes(n)?`<span class="power-highlight">${n}</span>`:n.toString()).join(", ")}function Ne(c,e){let t=[];if(Array.isArray(c.availableBrackets))t=c.availableBrackets;else if(typeof c.bracketRange=="string")if(c.bracketRange.includes("-")){let[n,o]=c.bracketRange.split("-").map(i=>i.trim()),a=parseInt(n),s=parseInt(o);if(!isNaN(a)&&!isNaN(s))for(let i=a;i<=s;i++)t.push(i.toString());else t=[n,o]}else t=c.bracketRange.split(",").map(n=>n.trim());return t.map(n=>e.includes(n)?`<span class="bracket-highlight">${n}</span>`:n.toString()).join(", ")}function ne(c){let e=c.players.flatMap(a=>"players"in a?a.players:[a]);if(e.length===0)return[];let t=new Map,r=new Set;if(e.forEach(a=>{a.availablePowers.length===1&&r.add(a.availablePowers[0]),a.availablePowers.forEach(s=>{t.set(s,(t.get(s)||0)+1)})}),t.size===0)return[];let n=Math.max(...t.values()),o=[];for(let[a,s]of t.entries())(s===n||r.has(a))&&o.push(a);return o.sort((a,s)=>a-s),o}var ie=class{constructor(){this.groups=new Map;this.nextPlayerId=0;this.nextGroupId=1;this.availableColors=[];this.groupColorAssignments=new Map;this.initializeAvailableColors()}initializeAvailableColors(){this.availableColors=Array.from({length:50},(e,t)=>t+1),this.shuffleArray(this.availableColors)}shuffleArray(e){for(let t=e.length-1;t>0;t--){let r=Math.floor(Math.random()*(t+1));[e[t],e[r]]=[e[r],e[t]]}}assignRandomColor(e){if(this.groupColorAssignments.has(e))return this.groupColorAssignments.get(e);this.availableColors.length===0&&this.initializeAvailableColors();let t=this.availableColors.pop();return this.groupColorAssignments.set(e,t),t}releaseColor(e){let t=this.groupColorAssignments.get(e);t&&(this.availableColors.push(t),this.groupColorAssignments.delete(e))}getNextPlayerId(){return this.nextPlayerId++}resetPlayerIds(){this.nextPlayerId=0}getNextGroupId(){let e=new Set;document.querySelectorAll(".group-select").forEach(r=>{if(r.value.startsWith("group-")){let n=parseInt(r.value.split("-")[1]);isNaN(n)||e.add(n)}if(r.value==="new-group"&&r.dataset.createdGroupId&&r.dataset.createdGroupId.startsWith("group-")){let n=parseInt(r.dataset.createdGroupId.split("-")[1]);isNaN(n)||e.add(n)}});for(let r=1;r<=50;r++)if(!e.has(r))return r;return this.nextGroupId++}resetGroupIds(){this.nextGroupId=1}getGroups(){return this.groups}clearGroups(){this.groups.clear()}getPlayerFromRow(e){let t=e.querySelector(".player-name");t.classList.remove("input-error");let r=t.value.trim();if(!r)return t.classList.add("input-error"),null;if(document.getElementById("bracket-radio").checked){let a=e.querySelectorAll('.bracket-checkbox input[type="checkbox"]'),s=[];if(a.forEach(u=>{u.checked&&s.push(u.value)}),s.length===0)return e.querySelector(".bracket-selector-btn").classList.add("error"),null;e.querySelector(".bracket-selector-btn").classList.remove("error");let i={1:1,2:2,3:3,4:4,cedh:10},l=s.map(u=>i[u]),d=l.reduce((u,g)=>u+g,0)/l.length;return{id:parseInt(e.dataset.playerId),name:r,power:Math.round(d*2)/2,availablePowers:l,powerRange:s.join(", "),brackets:s,bracketRange:s.join(", "),rowElement:e}}else{let a=e.querySelectorAll('.power-checkbox input[type="checkbox"]'),s=De(a);return s.availablePowers.length===0?(e.querySelector(".power-selector-btn").classList.add("error"),null):(e.querySelector(".power-selector-btn").classList.remove("error"),{id:parseInt(e.dataset.playerId),name:r,power:s.averagePower,availablePowers:s.availablePowers,powerRange:s.powerRange,rowElement:e})}}handleGroupChange(e){this.groups.clear();let t=Array.from(e.querySelectorAll(".player-row"));t.forEach(n=>{for(let o=1;o<=50;o++)n.querySelector(".group-select").classList.remove(`group-${o}`)});let r=new Set;t.forEach(n=>{let o=n.querySelector(".group-select");o.dataset.createdGroupId?r.add(o.dataset.createdGroupId):o.value.startsWith("group-")&&r.add(o.value)}),t.forEach(n=>{let o=n.querySelector(".group-select"),a="";if(o.value==="new-group"){o.dataset.createdGroupId?a=o.dataset.createdGroupId:(a=`group-${this.getNextGroupId()}`,r.add(a),o.dataset.createdGroupId=a);let s=this.getPlayerFromRow(n);s&&(this.groups.has(a)||this.groups.set(a,[]),this.groups.get(a).push(s))}else if(o.value.startsWith("group-")){a=o.value;let s=this.getPlayerFromRow(n);s&&(this.groups.has(o.value)||this.groups.set(o.value,[]),this.groups.get(o.value).push(s))}else o.dataset.createdGroupId&&delete o.dataset.createdGroupId;if(a){let s=parseInt(a.split("-")[1]);s>=1&&s<=50&&o.classList.add(`group-${s}`)}}),this.cleanupUnusedGroups(r),this.updateAllGroupDropdowns(e)}updateAllGroupDropdowns(e){let t=new Set,r=Array.from(e.querySelectorAll(".player-row"));r.forEach(n=>{let o=n.querySelector(".group-select");o.value==="new-group"&&o.dataset.createdGroupId?t.add(o.dataset.createdGroupId):o.value.startsWith("group-")&&t.add(o.value)}),r.forEach(n=>{let o=n.querySelector(".group-select"),a=o.value,s=o.dataset.createdGroupId;if(Array.from(o.options).forEach(l=>{l.value.startsWith("group-")&&o.remove(l.index)}),t.forEach(l=>{let d=l.split("-")[1],u=new Option(`Group ${d}`,l);o.add(u)}),s&&t.has(s)&&(a==="new-group"||a==="no-group")){o.value=s;let l=parseInt(s.split("-")[1]);l>=1&&l<=50&&o.classList.add(`group-${l}`)}else if(a.startsWith("group-")&&t.has(a)){o.value=a;let l=parseInt(a.split("-")[1]);l>=1&&l<=50&&o.classList.add(`group-${l}`)}else{o.value="no-group";for(let l=1;l<=50;l++)o.classList.remove(`group-${l}`)}})}arePlayersCompatible(e,t,r){return e.availablePowers.some(o=>t.availablePowers.some(a=>Math.abs(o-a)<.01))?!0:r.allowLeniency?e.availablePowers.some(o=>t.availablePowers.some(a=>Math.abs(o-a)<=r.maxTolerance)):!1}findAllCommonPowers(e,t){return e.length===0?[]:[...new Set(e.flatMap(n=>n.availablePowers))].sort((n,o)=>n-o).filter(n=>e.every(o=>o.availablePowers.some(a=>{let s=Math.abs(a-n);return s<.01||t.allowLeniency&&s<=t.maxTolerance})))}findBestCommonPowerLevel(e){if(e.length===0)return null;let t=new Map;for(let o of e)for(let a of o.availablePowers)t.set(a,(t.get(a)||0)+1);if(t.size===0)return null;let r=e[0].availablePowers[0],n=0;for(let[o,a]of t.entries())a>n&&(n=a,r=o);return r}calculatePodPower(e){if(e.length===0)return 0;let t=e.reduce((r,n)=>{if("players"in n)return r+n.averagePower;{let o=n.powerRange.split(",").map(s=>parseFloat(s.trim())),a=o.reduce((s,i)=>s+i,0)/o.length;return r+a}},0);return Math.round(t/e.length*10)/10}cleanupUnusedGroups(e){Array.from(this.groupColorAssignments.keys()).forEach(o=>{e.has(o)||this.releaseColor(o)}),Array.from(this.groups.keys()).forEach(o=>{e.has(o)||this.groups.delete(o)}),document.querySelectorAll(".group-select").forEach(o=>{let a=o.dataset.createdGroupId;a&&!e.has(a)&&delete o.dataset.createdGroupId})}};var J=class{constructor(){this.shuffleSeed=null;this.sizeCache=new Map}setShuffleSeed(e){this.shuffleSeed=e,this.sizeCache.clear()}seededRandom(e){let t=e;return()=>(t=t*1103515245+12345&2147483647,t/2147483647)}shuffleArray(e){let t=[...e],r;this.shuffleSeed!==null?r=this.seededRandom(this.shuffleSeed):r=Math.random;for(let n=t.length-1;n>0;n--){let o=Math.floor(r()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t}getItemSize(e){let t="players"in e?`group-${e.id}`:`player-${e.id}`;if(!this.sizeCache.has(t)){let r="players"in e?e.size:1;this.sizeCache.set(t,r)}return this.sizeCache.get(t)}getItemId(e){return"players"in e?e.id:e.id.toString()}generatePodsWithBacktracking(e,t,r){let n=this.shuffleArray(e),o=n.reduce((l,d)=>l+("size"in d?d.size:1),0);if(o>=3&&o<=5){let l=n.flatMap(u=>"players"in u?u.players:[u]),d=this.findBestCommonPowerLevel(l);return d!==null?{pods:[{players:n,power:d}],unassigned:[]}:{pods:[],unassigned:n}}let a=this.findOptimalPodAssignment(n,t,r),s=new Set;for(let l of a)for(let d of l.players)"players"in d?s.add(d.id):s.add(d.id.toString());let i=n.filter(l=>"players"in l?!s.has(l.id):!s.has(l.id.toString()));return{pods:a,unassigned:i}}findOptimalPodAssignment(e,t,r){return this.optimizeVirtualPlayerAssignmentUnified(e,t,r)}optimizeVirtualPlayerAssignmentUnified(e,t,r){if(e.length===0)return[];let n=this.createVirtualPlayersUnified(e),o=new Map;for(let s of n)o.has(s.powerLevel)||o.set(s.powerLevel,[]),o.get(s.powerLevel).push(s);let a={pods:[],totalPods:0};return r.allowLeniency?this.backtrackVirtualPlayersWithLeniencyUnified(n,t,r.maxTolerance,[],new Set,t,a):this.backtrackVirtualPlayersUnified(Array.from(o.entries()),[],new Set,t,a),a.pods}createVirtualPlayersUnified(e){let t=[];for(let r of e)if("players"in r){let n=r.players.flatMap(d=>d.availablePowers),o=Math.min(...n),a=Math.max(...n),i=[r.averagePower,o,a],l=[...new Set(i)];for(let d of l)t.push({item:r,powerLevel:d})}else for(let n of r.availablePowers)t.push({item:r,powerLevel:n});return t}backtrackVirtualPlayersUnified(e,t,r,n,o){if(n.length===0){t.length>o.totalPods&&(o.pods=[...t],o.totalPods=t.length);return}if(t.length+n.length<=o.totalPods)return;let a=n[0],s=n.slice(1);for(let[i,l]of e){let d=l.filter(y=>{let k=this.getItemId(y.item);return!r.has(k)}),u=0;for(let y=0;y<d.length;y++)u+=this.getItemSize(d[y].item);let g=Math.max(3,a);if(u>=g){let y=d.sort((h,L)=>{let p=this.getItemSize(h.item);return this.getItemSize(L.item)-p}),k=[],w=new Set,M=0;for(let h of y){let L=this.getItemId(h.item),p=this.getItemSize(h.item);if(!w.has(L)&&M+p<=a&&(k.push(h),w.add(L),M+=p,M===a))break}if(M>=3){let h=k.map(m=>m.item),L={players:h,power:i},p=new Set(r);for(let m of h){let E="players"in m?m.id:m.id.toString();p.add(E)}this.backtrackVirtualPlayersUnified(e,[...t,L],p,s,o)}}}this.backtrackVirtualPlayersUnified(e,t,r,s,o)}backtrackVirtualPlayersWithLeniencyUnified(e,t,r,n,o,a,s){if(a.length===0){n.length>s.totalPods&&(s.pods=[...n],s.totalPods=n.length);return}if(n.length+a.length<=s.totalPods)return;let i=a[0],l=a.slice(1),d=e.filter(g=>{let y="players"in g.item?g.item.id:g.item.id.toString();return!o.has(y)}),u=[...new Set(d.map(g=>g.powerLevel))].sort((g,y)=>g-y);for(let g of u){let y=d.filter(p=>("players"in p.item,Math.abs(p.powerLevel-g)<=r)),k=new Map;for(let p of y){let m="players"in p.item?p.item.id:p.item.id.toString();if(!k.has(m))k.set(m,p);else{let E=k.get(m),P=Math.abs(E.powerLevel-g);Math.abs(p.powerLevel-g)<P&&k.set(m,p)}}let M=Array.from(k.values()).sort((p,m)=>{if("players"in p.item&&"players"in m.item){let E=Math.abs(p.powerLevel-p.item.averagePower)<.01,P=Math.abs(m.powerLevel-m.item.averagePower)<.01;return E&&!P?-1:!E&&P?1:Math.abs(p.powerLevel-g)-Math.abs(m.powerLevel-g)}return"players"in p.item&&!("players"in m.item)?1:!("players"in p.item)&&"players"in m.item?-1:Math.abs(p.powerLevel-g)-Math.abs(m.powerLevel-g)}),h=0;for(let p=0;p<M.length;p++)h+=this.getItemSize(M[p].item);let L=Math.max(3,i);if(h>=L){let p=M.sort((f,C)=>{let T=this.getItemSize(f.item);return this.getItemSize(C.item)-T}),m=[],E=new Set,P=0;for(let f of p){let C=this.getItemId(f.item),T=this.getItemSize(f.item);if(!E.has(C)&&P+T<=i&&(m.push(f),E.add(C),P+=T,P===i))break}if(P>=3){let f=m.map(N=>N.item);if(!this.isPodPowerSpreadValid(m,r))continue;let C=m.reduce((N,V)=>N+V.powerLevel,0)/m.length,T={players:f,power:Math.round(C*2)/2},D=new Set(o);for(let N of f){let V="players"in N?N.id:N.id.toString();D.add(V),e.forEach(_=>{let oe="players"in _.item?_.item.id:_.item.id.toString();oe===V&&D.add(oe)})}this.backtrackVirtualPlayersWithLeniencyUnified(e,t,r,[...n,T],D,l,s)}}}this.backtrackVirtualPlayersWithLeniencyUnified(e,t,r,n,o,l,s)}isPodPowerSpreadValid(e,t){if(e.length===0)return!0;let r=e.map(s=>s.powerLevel),n=Math.min(...r);return Math.max(...r)-n<=t}findBestCommonPowerLevel(e){if(e.length===0)return null;let t=new Map;for(let o of e)for(let a of o.availablePowers)t.set(a,(t.get(a)||0)+1);if(t.size===0)return null;let r=e[0].availablePowers[0],n=0;for(let[o,a]of t.entries())a>n&&(n=a,r=o);return r}};var le=class{constructor(e,t){this.draggedElement=null;this.draggedItemData=null;this.currentPods=[];this.currentUnassigned=[];this.handleDragStart=e=>{let t=e.target;this.draggedElement=t,t.classList.add("dragging"),this.draggedItemData={type:t.dataset.itemType,id:t.dataset.itemId,podIndex:t.dataset.podIndex,itemIndex:t.dataset.itemIndex},e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/html",t.outerHTML)};this.handleDragEnd=e=>{e.target.classList.remove("dragging"),this.draggedElement=null,this.draggedItemData=null};this.handleDragOver=e=>{e.preventDefault(),e.dataTransfer.dropEffect="move",e.currentTarget.classList.add("drag-over")};this.handleDragLeave=e=>{e.currentTarget.classList.remove("drag-over")};this.handleDrop=e=>{e.preventDefault();let t=e.currentTarget;if(t.classList.remove("drag-over"),!this.draggedItemData)return;let r=t.dataset.podIndex,n=this.draggedItemData.podIndex;r!==n&&this.moveItemBetweenPods(this.draggedItemData,r)};this.playerManager=e,this.onPodsChanged=t}setCurrentPods(e,t=[]){this.currentPods=[...e],this.currentUnassigned=[...t]}moveItemBetweenPods(e,t){let r=e.podIndex,n=parseInt(e.itemIndex),o=null;if(r==="unassigned")o=this.currentUnassigned[n],this.currentUnassigned.splice(n,1);else{let a=this.currentPods[parseInt(r)];o=a.players[n],a.players.splice(n,1),a.power=this.playerManager.calculatePodPower(a.players)}if(o){if(t==="unassigned")this.currentUnassigned.push(o);else if(t==="new-pod"){let a={players:[o],power:this.playerManager.calculatePodPower([o])};this.currentPods.push(a)}else{let a=this.currentPods[parseInt(t)];a.players.push(o),a.power=this.playerManager.calculatePodPower(a.players)}this.cleanupEmptyPods(),this.onPodsChanged(this.currentPods,this.currentUnassigned)}}cleanupEmptyPods(){this.currentPods=this.currentPods.filter(e=>e.players.length>0)}};var Pe=class{constructor(){this.pools=new Map;this.POOL_SIZE=15}get(e){let t=this.pools.get(e.toLowerCase())||[];if(t.length>0){let r=t.pop();return this.resetElement(r),r}return document.createElement(e)}release(e){let t=e.tagName.toLowerCase(),r=this.pools.get(t);r||(r=[],this.pools.set(t,r)),r.length<this.POOL_SIZE&&(this.resetElement(e),r.push(e))}resetElement(e){e.innerHTML="",e.className="",e.removeAttribute("style"),e.removeAttribute("draggable"),e.removeAttribute("id"),Object.keys(e.dataset).forEach(t=>{delete e.dataset[t]})}clear(){this.pools.clear()}getStats(){let e={};return this.pools.forEach((t,r)=>{e[r]=t.length}),e}preWarm(){[{tag:"div",count:8},{tag:"li",count:6},{tag:"ul",count:4},{tag:"h3",count:3},{tag:"p",count:3},{tag:"strong",count:3},{tag:"button",count:2}].forEach(({tag:t,count:r})=>{let n=[];for(let o=0;o<r;o++){let a=document.createElement(t);this.resetElement(a),n.push(a)}this.pools.set(t,n)})}},q=new Pe;q.preWarm();var ce=class{constructor(){this.isDisplayMode=!1;this.handleKeyDown=null;this.borderColors=["#FF6B6B","#4ECDC4","#45B7D1","#FFA726","#66BB6A","#AB47BC","#EF5350","#26A69A","#42A5F5","#FF7043","#9CCC65","#7E57C2","#EC407A","#29B6F6","#FFCA28","#8BC34A","#673AB7","#F06292","#00BCD4","#FFEB3B","#795548","#607D8B","#E91E63","#009688","#FF9800"]}getShuffledColors(e){let t=[...this.borderColors];for(let r=t.length-1;r>0;r--){let n=Math.floor(Math.random()*(r+1));[t[r],t[n]]=[t[n],t[r]]}if(e>t.length){let r=[];for(let n=0;n<e;n++)r.push(t[n%t.length]);return r}return t.slice(0,e)}calculateOptimalWidthForText(e){let t=0;for(let o of e)o===" "?t+=.3:/[iIl1]/.test(o)?t+=.4:/[mwMW]/.test(o)?t+=.8:/[A-Z]/.test(o)?t+=.7:t+=.6;let r=t*1.2,n=Math.min(85,Math.max(25,r/25*85));return Math.round(n)}calculateFontSizeForPod(e,t,r){let n=e*t,o=Math.ceil(Math.sqrt(r)),a=Math.ceil(r/o),s=(e-(o-1)*10)/o,i=(t-(a-1)*10)/a,l=Math.min(s,i),d=Math.min(l*.25,i*.35),u=Math.max(.9,1-(r-3)*.02),g=Math.max(24,Math.min(72,d*u));return`${Math.round(g)}px`}calculateValidBracketRange(e){let t=e.players.flatMap(a=>"players"in a?a.players:[a]);if(t.length===0)return"Unknown";let r=[],n=new Set;t.forEach(a=>{a.brackets&&a.brackets.forEach(s=>n.add(s))});for(let a of n)t.every(i=>i.brackets&&i.brackets.includes(a))&&r.push(a);let o=["1","2","3","4","cedh"];if(r.sort((a,s)=>o.indexOf(a)-o.indexOf(s)),r.length===0)return"Unknown";if(r.length===1)return r[0];{let a=r.filter(i=>i!=="cedh");return a.length>1&&a.every((i,l)=>{if(l===0)return!0;let d=parseInt(i),u=parseInt(a[l-1]);return d===u+1})&&a.length===r.length&&r.length>1?`${r[0]}-${r[r.length-1]}`:r.join(", ")}}getValidBracketsArrayForPod(e){let t=e.players.flatMap(s=>"players"in s?s.players:[s]);if(t.length===0)return[];let r=new Map;if(t.forEach(s=>{s.brackets&&s.brackets.forEach(i=>{r.set(i,(r.get(i)||0)+1)})}),r.size===0)return[];let n=Math.ceil(t.length/2),o=[];for(let[s,i]of r.entries())i>=n&&o.push(s);let a=["1","2","3","4","cedh"];return o.sort((s,i)=>a.indexOf(s)-a.indexOf(i)),o}enterDisplayMode(e){if(e.length===0)return;this.isDisplayMode=!0,document.body.classList.add("display-mode");let t=Math.ceil(Math.sqrt(e.length)),r=q.get("div");r.className="display-mode-container",r.style.position="fixed",r.style.top="0",r.style.left="0",r.style.width="100vw",r.style.height="100vh",r.style.background="#1a1a1a",r.style.zIndex="1000",r.style.padding="20px",r.style.boxSizing="border-box",r.style.overflow="hidden",r.innerHTML=`
<div class="display-mode-controls">
<button id="exit-display-btn">Exit Display Mode</button>
</div>
<h1 style="text-align: center; margin: 0 0 20px 0; font-size: 2.5rem; color: white;">MTG Commander Pods</h1>
<div id="display-output" style="flex-grow: 1; height: calc(100vh - 140px);"></div>
`;let n=document.querySelector(".container");n&&(n.style.display="none"),document.body.appendChild(r);let o=r.querySelector("#display-output"),a=q.get("div");a.style.display="grid",a.style.gap="20px",a.style.height="100%",a.style.gridTemplateColumns=`repeat(${t}, 1fr)`,a.style.gridTemplateRows=`repeat(${t}, 1fr)`;let s=this.getShuffledColors(e.length);e.forEach((l,d)=>{let u=q.get("div");u.style.display="flex",u.style.flexDirection="column",u.style.background="#2a2a2a",u.style.border=`3px solid ${s[d]}`,u.style.borderRadius="8px",u.style.padding="15px",u.style.boxSizing="border-box",u.style.minHeight="0",u.style.boxShadow=`0 0 10px ${s[d]}40`,u.classList.add("pod",`pod-color-${d%10}`);let g=q.get("h3"),y=document.getElementById("bracket-radio"),k=y&&y.checked;if(k){let f=this.calculateValidBracketRange(l);g.textContent=`Pod ${d+1} (Bracket: ${f})`}else{let f=se(l);g.textContent=`Pod ${d+1} (Power: ${f})`}g.style.fontSize="1.6rem",g.style.margin="0 0 15px 0",g.style.textAlign="center",g.style.color=s[d],g.style.fontWeight="bold",g.style.flexShrink="0",g.style.textShadow="1px 1px 2px rgba(0,0,0,0.8)",u.appendChild(g);let w=0;l.players.forEach(f=>{"players"in f?w+=f.players.length:w+=1});let M="";l.players.forEach(f=>{if("players"in f)f.players.forEach(C=>{let T=k&&C.bracketRange?`${C.name} (B: ${C.bracketRange})`:`${C.name} (P: ${C.powerRange})`;T.length>M.length&&(M=T)});else{let C=k&&f.bracketRange?`${f.name} (B: ${f.bracketRange})`:`${f.name} (P: ${f.powerRange})`;C.length>M.length&&(M=C)}});let h=q.get("ul");h.style.flexGrow="1",h.style.display="flex";let L=Math.ceil(Math.sqrt(w)),p=Math.ceil(w/L);h.style.display="grid",h.style.gridTemplateColumns=`repeat(${L}, 1fr)`,h.style.gridTemplateRows=`repeat(${p}, 1fr)`,h.style.gap="12px",h.style.margin="0",h.style.padding="0",h.style.listStyle="none",h.style.width="100%",h.style.height="100%",h.style.alignItems="stretch",h.style.justifyItems="stretch";let m=[];l.players.forEach(f=>{"players"in f?f.players.forEach(C=>m.push(C)):m.push(f)});let E=document.getElementById("bracket-radio"),P=E&&E.checked;m.forEach((f,C)=>{let T=q.get("li"),D=q.get("div");D.textContent=f.name,D.className="player-name";let N=q.get("div");if(P&&f.bracketRange){let V=this.getValidBracketsArrayForPod(l),_=Ne(f,V);N.innerHTML=`B: ${_}`}else{let V=ne(l),_=re(f,V);N.innerHTML=`P: ${_}`}N.className="player-power",T.appendChild(D),T.appendChild(N),T.style.display="flex",T.style.flexDirection="column",T.style.justifyContent="center",T.style.alignItems="center",T.style.backgroundColor="rgba(255, 255, 255, 0.12)",T.style.border="2px solid rgba(255, 255, 255, 0.2)",T.style.borderRadius="12px",T.style.padding="8px",T.style.boxSizing="border-box",T.style.textAlign="center",T.style.height="100%",D.style.color="#ffffff",D.style.fontWeight="bold",D.style.lineHeight="1.1",D.style.marginBottom="4px",D.style.wordBreak="break-word",D.style.hyphens="auto",D.style.flexGrow="1",D.style.display="flex",D.style.alignItems="center",D.style.justifyContent="center",N.style.color="#b0b0b0",N.style.fontWeight="500",N.style.lineHeight="1",N.style.opacity="0.9",T.dataset.podRef=d.toString(),T.classList.add("dynamic-font-item"),h.appendChild(T)}),u.appendChild(h),a.appendChild(u)}),o.appendChild(a),requestAnimationFrame(()=>{a.querySelectorAll(".pod").forEach((d,u)=>{let g=d.getBoundingClientRect(),y=g.width,k=g.height,w=0;e[u].players.forEach(L=>{"players"in L?w+=L.players.length:w+=1});let M=this.calculateFontSizeForPod(y,k,w);d.querySelectorAll(".dynamic-font-item").forEach(L=>{let p=L.querySelector(".player-name"),m=L.querySelector(".player-power");if(p&&(p.style.fontSize=M),m){let E=Math.round(parseInt(M)*.75);m.style.fontSize=`${E}px`}})})}),r.querySelector("#exit-display-btn").addEventListener("click",()=>this.exitDisplayMode()),this.handleKeyDown=l=>{l.key==="Escape"&&this.isDisplayMode&&this.exitDisplayMode()},document.addEventListener("keydown",this.handleKeyDown)}exitDisplayMode(){this.isDisplayMode=!1,document.body.classList.remove("display-mode");let e=document.querySelector(".container");e&&(e.style.display="");let t=document.querySelector(".display-mode-container");t&&t.remove(),this.handleKeyDown&&(document.removeEventListener("keydown",this.handleKeyDown),this.handleKeyDown=null)}getIsDisplayMode(){return this.isDisplayMode}};var Te=class{constructor(){this.listeners=new Map;this.abortController=new AbortController}addEventListener(e,t,r,n){let o=this.generateId(),a={...typeof n=="object"?n:{capture:n},signal:this.abortController.signal};return e.addEventListener(t,r,a),this.listeners.set(o,{element:e,type:t,listener:r,options:a}),o}removeEventListener(e){let t=this.listeners.get(e);return t?(t.element.removeEventListener(t.type,t.listener,t.options),this.listeners.delete(e),!0):!1}removeAllFromElement(e){let t=0;for(let[r,n]of this.listeners.entries())n.element===e&&(n.element.removeEventListener(n.type,n.listener,n.options),this.listeners.delete(r),t++);return t}removeAll(){this.abortController.abort(),this.abortController=new AbortController,this.listeners.clear()}getListenerCount(){return this.listeners.size}generateId(){return`listener_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}},Le=new Te;var x=class{static clearDuplicateErrors(e){e.forEach(t=>{let r=t.querySelector(".player-name");r&&r.classList.remove("name-duplicate-error",...this.DUPLICATE_ERROR_CLASSES)})}static highlightDuplicateNames(e){this.clearDuplicateErrors(e);let t=new Map;e.forEach(o=>{let a=o.querySelector(".player-name");if(a){let s=a.value.trim().toLowerCase();s&&(t.has(s)||t.set(s,[]),t.get(s).push(a))}});let r=[],n=0;return t.forEach((o,a)=>{if(o.length>1){r.push(a);let s=this.DUPLICATE_ERROR_CLASSES[n];o.forEach(i=>{i.classList.add(s)}),n=(n+1)%this.DUPLICATE_ERROR_CLASSES.length}}),r}static hasSelectedCheckboxes(e){return Array.from(e).some(t=>t.checked)}static getSelectedCheckboxValues(e){return Array.from(e).filter(t=>t.checked).map(t=>t.value)}static addValidationError(e,t="error"){e.classList.add(t),e.dataset&&(e.dataset.validationTriggered="true")}static removeValidationError(e,t="error"){e.classList.remove(t)}static hasValidationError(e,t="error"){return e.classList.contains(t)}};x.DUPLICATE_ERROR_CLASSES=["name-duplicate-error-1","name-duplicate-error-2","name-duplicate-error-3","name-duplicate-error-4","name-duplicate-error-5"];var Q=class{static formatPowerButtonText(e){if(e.length===0)return"Select Power Levels";if(e.sort((o,a)=>o-a),e.length===1)return`Power: ${e[0]}`;let t=e[0],r=e[e.length-1];return e.every((o,a)=>{if(a===0)return!0;let s=o-e[a-1];return s===.5||s===1})&&e.length>2?`Power: ${t}-${r}`:e.length<=4?`Power: ${e.join(", ")}`:`Power: ${t}-${r} (${e.length} levels)`}static formatBracketButtonText(e){return e.length===0?"Select Brackets":e.length===1?`Bracket: ${e[0]==="cedh"?"cEDH":e[0]}`:e.length<=3?`Brackets: ${e.join(", ")}`:`Brackets: ${e.length} selected`}static updateButtonState(e,t,r){e.textContent=t,r?(e.classList.add("has-selection"),x.removeValidationError(e)):(e.classList.remove("has-selection"),e.dataset.validationTriggered==="true"&&x.addValidationError(e))}},K=class{static getElement(e,t,r){let n=e.querySelector(t);return n?r&&!r(n)?(console.warn(`Element ${t} found but failed type check`),null):n:null}static getAllElements(e,t,r){let n=Array.from(e.querySelectorAll(t));return r?n.filter(r):n}static setClasses(e,t,r=!0){r?e.classList.add(...t):e.classList.remove(...t)}static toggleClass(e,t,r){r?e.classList.add(t):e.classList.remove(t)}},X=class{static addEventListener(e,t,r,n){return e.addEventListener(t,r,n),()=>{e.removeEventListener(t,r,n)}}static debounce(e,t){let r;return(...n)=>{clearTimeout(r),r=window.setTimeout(()=>e(...n),t)}}static throttle(e,t){let r;return(...n)=>{r||(e(...n),r=!0,setTimeout(()=>r=!1,t))}}};var A=class{static updatePowerButton(e){let t=K.getElement(e,".power-selector-btn");if(!t)return;let r=e.querySelectorAll('.power-checkbox input[type="checkbox"]'),n=[];r.forEach(s=>{s.checked&&n.push(parseFloat(s.value))});let o=Q.formatPowerButtonText(n),a=n.length>0;Q.updateButtonState(t,o,a)}static updateBracketButton(e){let t=K.getElement(e,".bracket-selector-btn");if(!t)return;let r=e.querySelectorAll('.bracket-checkbox input[type="checkbox"]'),n=x.getSelectedCheckboxValues(r),o=Q.formatBracketButtonText(n),a=n.length>0;Q.updateButtonState(t,o,a)}static updateAllButtonsForRow(e){this.updatePowerButton(e),this.updateBracketButton(e)}static updateAllButtons(e){K.getAllElements(e,".player-row").forEach(r=>this.updateAllButtonsForRow(r))}static createPowerButtonUpdater(e){return()=>this.updatePowerButton(e)}static createBracketButtonUpdater(e){return()=>this.updateBracketButton(e)}static createRowButtonUpdater(e){return()=>this.updateAllButtonsForRow(e)}static triggerValidationForRow(e){let r=document.getElementById("bracket-radio")?.checked??!1,n=K.getElement(e,".power-selector-btn"),o=K.getElement(e,".bracket-selector-btn");if(n&&(n.dataset.validationTriggered="true"),o&&(o.dataset.validationTriggered="true"),r&&o){let a=e.querySelectorAll('.bracket-checkbox input[type="checkbox"]');x.hasSelectedCheckboxes(a)||x.addValidationError(o)}else if(n){let a=e.querySelectorAll('.power-checkbox input[type="checkbox"]');x.hasSelectedCheckboxes(a)||x.addValidationError(n)}}static triggerValidationForAllRows(e){K.getAllElements(e,".player-row").forEach(r=>this.triggerValidationForRow(r))}};var Z=class Z{constructor(){this.nameValidationCallbacks=new Map;this.duplicateCheckCallback=null}setupNameValidation(e,t){this.duplicateCheckCallback||(this.duplicateCheckCallback=X.debounce(t,Z.VALIDATION_DEBOUNCE_MS));let r=X.debounce(()=>{e.dataset.touched="true",!e.value.trim()&&e.dataset.touched==="true"?x.addValidationError(e,"input-error"):x.removeValidationError(e,"input-error"),this.duplicateCheckCallback&&this.duplicateCheckCallback()},Z.VALIDATION_DEBOUNCE_MS);this.nameValidationCallbacks.set(e,r),e.addEventListener("input",r)}setupDropdownToggle(e,t,r){let n=X.throttle(o=>{o.preventDefault();let a=t.style.display!=="none";r(),a||(t.style.display="block",e.classList.add("open"),setTimeout(()=>t.classList.add("show"),10))},Z.DROPDOWN_THROTTLE_MS);e.addEventListener("click",n)}batchValidateRows(e){let t=performance.now(),r=Array.from(e.querySelectorAll(".player-row")),n=!1,o=x.highlightDuplicateNames(r);return o.length>0&&(n=!0),r.forEach(s=>{let i=s.querySelector(".player-name");i.value.trim()||(x.addValidationError(i,"input-error"),n=!0)}),A.triggerValidationForAllRows(e),{validationTime:performance.now()-t,duplicateNames:o,hasErrors:n}}cleanup(){this.nameValidationCallbacks.clear(),this.duplicateCheckCallback=null}static trackValidationPerformance(e){e>100&&console.warn(`Slow validation detected: ${e.toFixed(2)}ms`),"performance"in window&&"mark"in performance&&performance.mark(`validation-${Date.now()}`)}};Z.VALIDATION_DEBOUNCE_MS=300,Z.DROPDOWN_THROTTLE_MS=100;var Ce=Z,j=new Ce;var Se=class{constructor(){this.metrics={bundleSize:"59.2kb",memoryUsage:0,domCacheHits:0,validationTime:0,podGenerationTime:0,lastUpdated:new Date}}updateMemoryUsage(){"memory"in performance&&(this.metrics.memoryUsage=Math.round((performance.memory?.usedJSHeapSize||0)/1024/1024*100)/100),this.metrics.lastUpdated=new Date}trackValidationTime(e){this.metrics.validationTime=Math.round(e*100)/100,this.metrics.lastUpdated=new Date}trackPodGenerationTime(e){this.metrics.podGenerationTime=Math.round(e*100)/100,this.metrics.lastUpdated=new Date}getMetrics(){return this.updateMemoryUsage(),{...this.metrics}}logMetrics(){let e=this.getMetrics();console.group("\u{1F50D} Performance Analysis"),console.log("\u{1F4E6} Bundle Size:",e.bundleSize,"(+7.1kb from 52.1kb baseline)"),console.log("\u{1F4CA} Growth Rate: +13.6% (efficient for added functionality)"),console.log("\u{1F4BE} Memory Usage:",`${e.memoryUsage}MB`),console.log("\u26A1 Validation Time:",`${e.validationTime}ms`),console.log("\u{1F3AF} Pod Generation:",`${e.podGenerationTime}ms`),console.group("\u{1F4C8} Helper Module Impact"),console.log("\u2705 ButtonTextManager: +2.7kb (display state management)"),console.log("\u2705 DOMCache: +1.2kb (query optimization)"),console.log("\u2705 RealTimeValidator: +1.5kb (instant feedback)"),console.log("\u2705 TypeGuards: +0.7kb (runtime type safety)"),console.log("\u2705 PerformanceMonitor: +1.0kb (metrics tracking)"),console.groupEnd(),console.log("\u{1F3AF} Next: Validation consolidation & event optimization"),console.groupEnd()}},O=new Se;var Re=class c{constructor(){this.toastContainer=null;this.modalContainer=null;this.activeToasts=new Set;this.toastCounter=0;this.initializeContainers()}static getInstance(){return c.instance||(c.instance=new c),c.instance}initializeContainers(){this.toastContainer=document.createElement("div"),this.toastContainer.id="toast-container",this.toastContainer.className="toast-container",document.body.appendChild(this.toastContainer),this.modalContainer=document.createElement("div"),this.modalContainer.id="modal-container",this.modalContainer.className="modal-container",document.body.appendChild(this.modalContainer)}showToast(e){if(!this.toastContainer)return;let t=`toast-${++this.toastCounter}`,r=document.createElement("div");r.id=t,r.className=`toast toast-${e.type}`;let n=this.getIconForType(e.type),o=e.actions?this.createActionsHtml(e.actions,t):"",a=e.suggestions?this.createSuggestionsHtml(e.suggestions):"";r.innerHTML=`
<div class="toast-header">
<span class="toast-icon">${n}</span>
<h4 class="toast-title">${e.title}</h4>
<button class="toast-close" data-toast-id="${t}" aria-label="Close">
<span class="btn-icon">\u2716\uFE0F</span>
</button>
</div>
<div class="toast-body">
<p class="toast-message">${e.message}</p>
${a}
${o}
</div>
`,this.setupToastEventListeners(r,t),this.toastContainer.appendChild(r),this.activeToasts.add(r),requestAnimationFrame(()=>{r.classList.add("toast-show")}),e.duration&&e.duration>0&&setTimeout(()=>{this.hideToast(t)},e.duration)}async showConfirm(e){return this.modalContainer?new Promise(t=>{let r=`modal-${++this.toastCounter}`,n=document.createElement("div");n.id=r,n.className="modal-overlay";let o=e.icon||this.getIconForConfirmStyle(e.confirmStyle||"primary"),a=e.confirmText||"Confirm",s=e.cancelText||"Cancel",i=`btn btn-${e.confirmStyle||"primary"}`;n.innerHTML=`
<div class="modal-dialog">
<div class="modal-header">
<span class="modal-icon">${o}</span>
<h3 class="modal-title">${e.title}</h3>
</div>
<div class="modal-body">
<p class="modal-message">${e.message}</p>
</div>
<div class="modal-footer">
<button class="btn btn-secondary modal-cancel" data-modal-id="${r}">
${s}
</button>
<button class="${i} modal-confirm" data-modal-id="${r}">
${a}
</button>
</div>
</div>
`;let l=n.querySelector(".modal-confirm"),d=n.querySelector(".modal-cancel"),u=n,g=()=>{this.hideModal(r),t(!0)},y=()=>{this.hideModal(r),t(!1)};l.addEventListener("click",g),d.addEventListener("click",y),u.addEventListener("click",M=>{M.target===u&&y()});let k=M=>{M.key==="Escape"?y():M.key==="Enter"&&g()};document.addEventListener("keydown",k);let w=()=>{document.removeEventListener("keydown",k)};n.addEventListener("modal-hidden",w,{once:!0}),this.modalContainer&&this.modalContainer.appendChild(n),requestAnimationFrame(()=>{n.classList.add("modal-show")})}):!1}hideToast(e){let t=document.getElementById(e);t&&this.activeToasts.has(t)&&(t.classList.add("toast-hide"),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t),this.activeToasts.delete(t)},300))}hideModal(e){let t=document.getElementById(e);t&&(t.classList.add("modal-hide"),t.dispatchEvent(new CustomEvent("modal-hidden")),setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},300))}setupToastEventListeners(e,t){let r=e.querySelector(".toast-close");r&&r.addEventListener("click",()=>{this.hideToast(t)}),e.querySelectorAll("[data-toast-action]").forEach(o=>{o.addEventListener("click",()=>{this.hideToast(t)})})}getIconForType(e){let t={error:"\u274C",warning:"\u26A0\uFE0F",success:"\u2705",info:"\u2139\uFE0F"};return t[e]||t.info}getIconForConfirmStyle(e){let t={danger:"\u26A0\uFE0F",warning:"\u26A0\uFE0F",primary:"\u2753"};return t[e]||t.primary}createActionsHtml(e,t){return!e||e.length===0?"":`<div class="toast-actions">${e.map(n=>`<button class="btn btn-${n.style||"secondary"} btn-sm" data-toast-action="${t}" onclick="(${n.action.toString()})()">
${n.label}
</button>`).join("")}</div>`}createSuggestionsHtml(e){return`
<div class="toast-suggestions">
<h5>Problems:</h5>
<ul>${e.map(r=>`<li>${r}</li>`).join("")}</ul>
</div>
`}clearAllToasts(){this.activeToasts.forEach(e=>{e.id&&this.hideToast(e.id)})}async clearErrorToasts(){let e=Array.from(this.activeToasts).filter(r=>r.classList.contains("toast-error"));if(e.length===0)return Promise.resolve();let t=e.map(r=>r.id?new Promise(n=>{let o=()=>{r.removeEventListener("transitionend",o),r.parentNode&&r.parentNode.removeChild(r),n()};r.addEventListener("transitionend",o),this.hideToast(r.id)}):Promise.resolve());await Promise.all(t),await new Promise(r=>setTimeout(r,50))}alert(e,t="Alert"){this.showToast({type:"info",title:t,message:e,duration:5e3})}async confirm(e,t="Confirm"){return this.showConfirm({title:t,message:e})}async showError(e,t,r){await this.clearErrorToasts(),this.showToast({type:"error",title:e,message:t,suggestions:r,duration:0})}showSuccess(e,t="Success"){this.showToast({type:"success",title:t,message:e,duration:3e3})}showWarning(e,t,r){this.showToast({type:"warning",title:e,message:t,suggestions:r,duration:0})}},F=Re.getInstance();var $e={E001:{title:"Player Name Required",message:"All players must have a name before generating pods.",suggestions:["Fill in the empty name field(s) highlighted in red","Use unique names for each player"]},E002:{title:"Duplicate Player Names",message:"Multiple players have the same name.",suggestions:["Change one of the highlighted duplicate names","Each player must have a unique name"]},E003:{title:"Power Level Selection Required",message:"Each player must have at least one power level selected.",suggestions:["Click the power level button for highlighted players","Use keyboard shortcuts: 7, 7-9, 6.5-8","Check at least one power level for each player"]},E004:{title:"Bracket Selection Required",message:"Each player must have at least one bracket selected.",suggestions:["Click the bracket button for highlighted players","Check at least one bracket level for each player","Switch to Power Level mode if preferred"]},E005:{title:"Not Enough Players",message:"You need at least 3 players to form a pod.",suggestions:['Add more players using the "Add Player" button','Use "Add 4 Players" for quick setup',"Remove unused empty player rows"]},E009:{title:"Validation Errors Found",message:"Please fix the highlighted errors before generating pods.",suggestions:["Check red highlighted fields for missing information","Ensure all names are unique","Verify power levels or brackets are selected"]},E010:{title:"Incompatible Power Levels",message:"Some players have power levels too far apart to form balanced pods.",suggestions:["Increase the leniency setting to allow wider power ranges","Adjust player power levels to be closer together","Consider grouping players manually to keep them together"]},E011:{title:"Incompatible Bracket Levels",message:"Some players have brackets with no overlap for balanced pods.",suggestions:["Select additional brackets for flexibility","Group incompatible players manually","Adjust bracket selections to have some overlap"]},E012:{title:"Group Configuration Issues",message:"Some groups have internal conflicts preventing pod assignment.",suggestions:["Check grouped players have compatible power/bracket levels","Consider splitting problematic groups","Adjust group member selections for better compatibility"]},E006:{title:"Pod Generation Failed",message:"Unable to create balanced pods with current settings.",suggestions:["Try enabling leniency for more flexible matching","Adjust player power levels or brackets","Reduce group sizes or ungroup some players"]},E007:{title:"Display Mode Error",message:"Unable to switch to display mode.",suggestions:["Generate pods first before using display mode","Refresh the page if issues persist"]},E008:{title:"Initialization Error",message:"Application failed to start properly.",suggestions:["Refresh the page","Clear browser cache","Check browser console for details"]}},H=class{static get(e){return $e[e]||{title:"Unknown Error",message:"An unexpected error occurred.",suggestions:["Try refreshing the page","Check browser console for details"]}}static getSimple(e,t){let r=this.get(e);return t?`${r.message}: ${t}`:r.message}static showEnhanced(e,t){let r=this.get(e);console.error(`[${e}] ${r.title}: ${r.message}`),F.showError(r.title,t?`${r.message}
Details: ${t}`:r.message,r.suggestions)}static show(e,t){let r=this.get(e),n=t?`${r.message}: ${t}`:r.message;console.error(`[${e}] ${n}`),F.showError(r.title,n,r.suggestions)}static showSuccess(e){console.log(`\u2705 ${e}`),F.showSuccess(e)}};H.PLAYER_NAME_REQUIRED="E001",H.PLAYER_NAME_DUPLICATE="E002",H.POWER_LEVEL_REQUIRED="E003",H.BRACKET_LEVEL_REQUIRED="E004",H.INSUFFICIENT_PLAYERS="E005",H.GENERATION_FAILED="E006",H.DISPLAY_MODE_FAILED="E007",H.INITIALIZATION_FAILED="E008",H.VALIDATION_FAILED="E009",H.INCOMPATIBLE_POWER_LEVELS="E010",H.INCOMPATIBLE_BRACKETS="E011",H.GROUP_CONFLICTS="E012";var de=class{constructor(e){this.lastResetData=null;this.isRestoring=!1;this.undoTimeoutId=null;this.callbacks=e}getIsRestoring(){return this.isRestoring}captureCurrentPlayerData(){let e=this.callbacks.getPlayerRowsContainer(),t=v.getAllPlayerRows(e),r=[];O.updateMemoryUsage(),t.forEach(i=>{let l=te.extractPlayerData(i),d=v.getGroupSelect(i);r.push({name:l.name,groupValue:l.groupValue,createdGroupId:d?.dataset.createdGroupId,selectedPowers:l.selectedPowers,selectedBrackets:l.selectedBrackets})});let n=S.getModeRadios(),o=S.getLeniencyRadios(),a={noLeniency:o.noLeniency?.checked||!1,leniency:o.leniency?.checked||!1,superLeniency:o.superLeniency?.checked||!1,bracket:n.bracket?.checked||!1},s={players:r,leniencySettings:a,currentPods:[...this.callbacks.getCurrentPods()],currentUnassigned:[...this.callbacks.getCurrentUnassigned()]};return O.updateMemoryUsage(),s}async resetAllWithConfirmation(){let e=this.callbacks.getPlayerRowsContainer();if(!v.getAllPlayerRows(e).some(o=>v.getNameInput(o)?.value.trim()?!0:v.getAllCheckboxes(o).some(i=>i.checked))){this.resetAll();return}await F.showConfirm({title:"Reset All Player Data",message:`Are you sure you want to reset all player data?
This will clear all players, groups, and generated pods. You will be able to undo this action immediately after.`,confirmText:"Reset All",cancelText:"Cancel",confirmStyle:"danger",icon:"\u26A0\uFE0F"})&&(this.lastResetData=this.captureCurrentPlayerData(),this.resetAll(),this.showUndoResetButton())}resetAll(){O.updateMemoryUsage(),this.callbacks.closeAllDropdowns(),this.callbacks.clearPlayerRowsContainer(),this.callbacks.cleanupBottomDisplayButton(),this.callbacks.clearOutputSection(),this.callbacks.updateResultsCardVisibility(),this.callbacks.hideDisplayModeBtn(),this.callbacks.clearGroups(),this.callbacks.resetPlayerIds(),this.callbacks.resetGroupIds(),this.callbacks.setCurrentPods([]),this.callbacks.setCurrentUnassigned([]);let e=S.getLeniencyRadios();e.noLeniency.checked=!0;for(let t=0;t<4;t++)this.callbacks.addPlayerRow();O.updateMemoryUsage()}showUndoResetButton(){let e=W.getUndoResetButton();e&&e.remove(),this.undoTimeoutId!==null&&clearTimeout(this.undoTimeoutId);let t=this.callbacks.createElement("button");t.id="undo-reset-btn",t.textContent="Undo Reset",t.style.marginLeft="10px",t.style.backgroundColor="#28a745",t.style.color="white",t.style.border="none",t.style.padding="8px 16px",t.style.borderRadius="4px",t.style.cursor="pointer",t.style.fontSize="14px",t.addEventListener("click",async()=>await this.undoReset());let r=W.getResetAllButton();r&&r.parentNode.insertBefore(t,r.nextSibling),this.undoTimeoutId=window.setTimeout(()=>{let n=W.getUndoResetButton();n&&(n.remove(),this.lastResetData=null,this.undoTimeoutId=null)},3e4)}async undoReset(){if(!this.lastResetData){await F.showError("No Reset Data","No reset data available to restore.");return}O.updateMemoryUsage(),this.callbacks.clearPlayerRowsContainer(),this.callbacks.cleanupBottomDisplayButton(),this.callbacks.clearOutputSection(),this.callbacks.updateResultsCardVisibility(),this.callbacks.clearGroups(),this.callbacks.resetPlayerIds(),this.callbacks.resetGroupIds();let e=this.lastResetData.leniencySettings,t=S.getLeniencyRadios(),r=S.getModeRadios();e.noLeniency&&(t.noLeniency.checked=!0),e.leniency&&(t.leniency.checked=!0),e.superLeniency&&(t.superLeniency.checked=!0),e.bracket&&(r.bracket.checked=!0),this.lastResetData.players.forEach(a=>{this.callbacks.addPlayerRow();let s=this.callbacks.getPlayerRowsContainer(),i=v.getAllPlayerRows(s),l=i[i.length-1];te.applyPlayerData(l,{name:a.name,groupValue:a.groupValue,selectedPowers:a.selectedPowers,selectedBrackets:a.selectedBrackets});let d=v.getGroupSelect(l);d&&(a.createdGroupId&&(d.dataset.createdGroupId=a.createdGroupId),d.value=a.groupValue)}),this.isRestoring=!0,this.callbacks.setIsRestoring(!0);let n=S.getLeniencyRadios().noLeniency,o=S.getModeRadios().bracket;if(n&&o){let a=new Event("change",{bubbles:!0});e.bracket?o.dispatchEvent(a):n.dispatchEvent(a)}setTimeout(()=>{this.restorePlayerSelections()},200)}restorePlayerSelections(){if(!this.lastResetData)return;O.updateMemoryUsage();let e=this.callbacks.getPlayerRowsContainer();this.lastResetData.players.forEach((r,n)=>{let a=v.getAllPlayerRows(e)[n];if(!a)return;let s=v.getPowerCheckboxes(a),i=v.getBracketCheckboxes(a);G.setCheckedValues(s,r.selectedPowers),G.setCheckedValues(i,r.selectedBrackets),v.getAllCheckboxes(a).forEach(u=>{u.checked&&u.dispatchEvent(new Event("change",{bubbles:!0}))}),this.callbacks.updateButtonTextsForRow(a);let d=v.getGroupSelect(a);d&&r.groupValue&&r.groupValue!=="no-group"&&r.groupValue.startsWith("group-")&&(r.createdGroupId?d.dataset.createdGroupId=r.createdGroupId:d.dataset.createdGroupId=r.groupValue,d.value="new-group",d.dispatchEvent(new Event("change",{bubbles:!0})))}),this.lastResetData.players.forEach((r,n)=>{let a=v.getAllPlayerRows(e)[n],s=v.getGroupSelect(a);s&&r.groupValue&&r.groupValue!=="no-group"&&r.groupValue.startsWith("group-")&&(s.value=r.groupValue,s.dispatchEvent(new Event("change",{bubbles:!0})))}),this.callbacks.setCurrentPods([...this.lastResetData.currentPods]),this.callbacks.setCurrentUnassigned([...this.lastResetData.currentUnassigned]),(this.lastResetData.currentPods.length>0||this.lastResetData.currentUnassigned.length>0)&&this.callbacks.renderPods(this.lastResetData.currentPods,this.lastResetData.currentUnassigned),this.callbacks.handleGroupChange(e),this.isRestoring=!1,this.callbacks.setIsRestoring(!1);let t=W.getUndoResetButton();t&&t.remove(),this.undoTimeoutId!==null&&(clearTimeout(this.undoTimeoutId),this.undoTimeoutId=null),this.lastResetData=null,this.callbacks.showSuccessMessage("Reset has been undone successfully!"),O.updateMemoryUsage()}cleanup(){this.undoTimeoutId!==null&&(clearTimeout(this.undoTimeoutId),this.undoTimeoutId=null),this.lastResetData=null,this.isRestoring=!1;let e=W.getUndoResetButton();e&&e.remove()}};var ue=class{constructor(e){this.currentPods=[];this.currentUnassigned=[];this.reusablePlayerArray=[];this.reusableItemArray=[];this.reusablePlayerObject={};this.reusableGroupObject={};this.callbacks=e,this.podGenerator=new J}getCurrentPods(){return this.currentPods}getCurrentUnassigned(){return this.currentUnassigned}setCurrentState(e,t){this.currentPods=[...e],this.currentUnassigned=[...t],this.callbacks.setCurrentPods(this.currentPods,this.currentUnassigned)}clearDuplicateErrorsOnInput(){let e=this.callbacks.getPlayerRowsOptimized();x.clearDuplicateErrors(e),x.highlightDuplicateNames(e)}async generatePods(){this.triggerValidationForAllFields(),this.callbacks.cleanupBottomDisplayButton();let e=this.callbacks.getOutputSection();e.innerHTML="",this.callbacks.updateResultsCardVisibility(),this.callbacks.handleGroupChange(this.callbacks.getPlayerRowsContainer()),this.clearReusableArrays();let t=this.callbacks.getPlayerRowsOptimized();x.clearDuplicateErrors(t);let r=x.highlightDuplicateNames(t),n=r.length>0,o=[];r.length>0&&r.forEach(p=>{let m=[];if(t.forEach((E,P)=>{let f=E,C=v.getNameInput(f);C&&C.value.trim().toLowerCase()===p&&m.push(P+1)}),m.length>1){let E=m.map(P=>`Player ${P}`).join(" and ");o.push(`${E} both have the same name: "${p}"`)}});for(let p=0;p<t.length;p++){let m=this.callbacks.getPlayerFromRow(t[p]);if(m)this.reusablePlayerArray.push(m);else{let E=p+1,P=t[p],f=v.getNameInput(P),C=v.getPowerButton(P),T=v.getBracketButton(P),D=f?.value.trim()||"",N=D.length>0,V=C&&!C.textContent?.includes("Select Power"),_=T&&!T.textContent?.includes("Select Bracket"),oe=N||V||_;if((Array.from(t).some((Y,ee)=>{let ke=Y,Ge=v.getNameInput(ke),Ie=v.getPowerButton(ke),xe=v.getBracketButton(ke),Oe=Ge?.value.trim()||"",Fe=Ie&&!Ie.textContent?.includes("Select Power"),qe=xe&&!xe.textContent?.includes("Select Bracket");return Oe.length>0||Fe||qe})||oe)&&!m){n=!0;let Y=[];if(N||Y.push("Missing name"),!V&&!_){let ee=S.getModeRadios().bracket;ee&&ee.checked?Y.push("No bracket selected"):Y.push("No power levels selected")}if(Y.length>0){let ee=D?`Player ${E} (${D})`:`Player ${E}`;o.push(`${ee}: ${Y.join(", ")}`)}else o.push(`Player ${E}: Incomplete`)}}}if(n){if(o.length>0){let p,m=r.length>0,E=o.some(P=>!P.includes("both have the same name"));m&&!E?p="Duplicate Player Names":!m&&E&&o.length===1?o[0].includes("Missing name")?p="Player Name Required":o[0].includes("No power levels selected")?p="Power Level Required":o[0].includes("No bracket selected")?p="Bracket Required":p="Validation Error":p="Validation Errors Found",await F.showError(p,"Please fix the following issues before generating pods:",o)}else H.show(H.VALIDATION_FAILED);return}let a=new Map;this.callbacks.getGroups().forEach((p,m)=>{let E=p.reduce((f,C)=>f+C.power,0),P=Math.round(E/p.length*2)/2;Object.assign(this.reusableGroupObject,{id:m,players:p,averagePower:P,size:p.length}),a.set(m,{...this.reusableGroupObject})});let s=new Set([...this.callbacks.getGroups().values()].flat().map(p=>p.id)),i=this.reusablePlayerArray.filter(p=>!s.has(p.id));this.reusableItemArray.length=0,this.reusableItemArray.push(...i),a.forEach(p=>{this.reusableItemArray.push({id:p.id,players:p.players,averagePower:p.averagePower,size:p.size})});let l=this.reusablePlayerArray.length;if(l<3){H.show(H.INSUFFICIENT_PLAYERS);return}let u=He()==="avoid-five"?Ae(l):ae(l),g=Be();if(typeof window<"u"&&(window.location.protocol==="file:"||window.__playwright!==void 0||window.playwright!==void 0)){let p=this.reusablePlayerArray.map(E=>E.name).join(""),m=Array.from(p).reduce((E,P)=>E+P.charCodeAt(0),0);this.podGenerator.setShuffleSeed(m)}else this.podGenerator.setShuffleSeed(null);let k=performance.now(),w=this.podGenerator.generatePodsWithBacktracking(this.reusableItemArray,u,g),M=performance.now();O.trackPodGenerationTime(M-k);let h=w.pods,L=w.unassigned;this.currentPods=[...h],this.currentUnassigned=[...L],this.callbacks.setCurrentPods(this.currentPods,this.currentUnassigned),await this.callbacks.clearAllToasts(),this.renderPods(h,L)}renderPods(e,t=[]){try{if(!Array.isArray(e))throw new Error("Invalid pods array provided to renderPods");if(!Array.isArray(t))throw new Error("Invalid unassignedPlayers array provided to renderPods");this.currentPods=[...e],this.currentUnassigned=[...t],this.callbacks.setCurrentPods(this.currentPods,this.currentUnassigned),this.callbacks.cleanupBottomDisplayButton();let r=this.callbacks.getOutputSection();if(!r)throw new Error("Output section not found - cannot render pods");if(r.innerHTML="",this.callbacks.updateResultsCardVisibility(),e.length===0){r.textContent="Could not form pods with the given players.";let o=this.callbacks.getDisplayModeBtn();o&&(o.style.display="none");return}let n=this.callbacks.getDisplayModeBtn();n&&(n.style.display="inline-block"),this.renderPodsToDOM(e,t)}catch(r){console.error("Error in renderPods:",r),H.show(H.DISPLAY_MODE_FAILED,`Error: ${r instanceof Error?r.message:"Unknown error"}`);let n=this.callbacks.getOutputSection();n&&(n.textContent="Error displaying pods. Please try again.");let o=this.callbacks.getDisplayModeBtn();o&&(o.style.display="none")}}renderPodsToDOM(e,t){let r=this.callbacks.getOutputSection(),n=Math.ceil(Math.sqrt(e.length)),o=document.createDocumentFragment(),a=this.callbacks.createElement("div");if(a.classList.add("pods-container"),a.style.gridTemplateColumns=`repeat(${n}, 1fr)`,a.style.gridTemplateRows=`repeat(${n}, 1fr)`,e.forEach((i,l)=>{let d=this.callbacks.createElement("div");d.classList.add("pod",`pod-color-${l%10}`),d.dataset.podIndex=l.toString(),this.callbacks.addPodDropListeners(d);let u=this.callbacks.createElement("h3"),g=S.getModeRadios().bracket;if(g&&g.checked){let w=this.calculateValidBracketRange(i);u.textContent=`Pod ${l+1} (Bracket: ${w})`}else{let w=se(i);u.textContent=`Pod ${l+1} (Power: ${w})`}d.appendChild(u);let k=this.callbacks.createElement("ul");i.players.forEach((w,M)=>{if("players"in w){let h=this.callbacks.createElement("li");h.classList.add("pod-group"),h.draggable=!0,h.dataset.itemType="group",h.dataset.itemId=w.id,h.dataset.podIndex=l.toString(),h.dataset.itemIndex=M.toString(),this.callbacks.addDragDropListeners(h,"group",w.id,l.toString(),M.toString());let L=S.getModeRadios().bracket,p=L&&L.checked,m=this.callbacks.createElement("strong");p?m.textContent=`Group ${w.id.split("-")[1]}:`:m.textContent=`Group ${w.id.split("-")[1]} (Avg Power: ${w.averagePower}):`,h.appendChild(m);let E=this.callbacks.createElement("ul");w.players.forEach(P=>{let f=this.callbacks.createElement("li");if(p&&P.bracketRange)f.textContent=`${P.name} (B: ${P.bracketRange})`;else{let C=ne(i),T=re(P,C);f.innerHTML=`${P.name} (P: ${T})`}E.appendChild(f)}),h.appendChild(E),k.appendChild(h)}else{let h=this.callbacks.createElement("li");h.classList.add("pod-player"),h.draggable=!0,h.dataset.itemType="player",h.dataset.itemId=w.id.toString(),h.dataset.podIndex=l.toString(),h.dataset.itemIndex=M.toString(),this.callbacks.addDragDropListeners(h,"player",w.id.toString(),l.toString(),M.toString());let L=S.getModeRadios().bracket;if(L&&L.checked&&w.bracketRange)h.textContent=`${w.name} (B: ${w.bracketRange})`;else{let m=ne(i),E=re(w,m);h.innerHTML=`${w.name} (P: ${E})`}k.appendChild(h)}}),d.appendChild(k),a.appendChild(d)}),e.length>0){let i=this.callbacks.createElement("div");i.classList.add("pod","new-pod","new-pod-target"),i.style.borderColor="#4CAF50",i.style.backgroundColor="#1f2a1f",i.style.borderStyle="dashed",i.dataset.podIndex="new-pod",this.callbacks.addPodDropListeners(i);let l=this.callbacks.createElement("h3");l.textContent="Create New Pod",l.style.color="#4CAF50",i.appendChild(l);let d=this.callbacks.createElement("p");d.textContent="Drag players or groups here to create a new pod",d.style.color="#999",d.style.fontStyle="italic",d.style.textAlign="center",d.style.margin="20px 0",i.appendChild(d),a.appendChild(i)}if(t.length>0){let i=this.callbacks.createElement("div");i.classList.add("pod","unassigned-pod"),i.style.borderColor="#ff6b6b",i.style.backgroundColor="#2a1f1f",i.dataset.podIndex="unassigned",this.callbacks.addPodDropListeners(i);let l=this.callbacks.createElement("h3");l.textContent="Unassigned Players",l.style.color="#ff6b6b",i.appendChild(l);let d=this.callbacks.createElement("ul");t.forEach((u,g)=>{if("players"in u){let y=this.callbacks.createElement("li");y.classList.add("pod-group"),y.draggable=!0,y.dataset.itemType="group",y.dataset.itemId=u.id,y.dataset.podIndex="unassigned",y.dataset.itemIndex=g.toString(),this.callbacks.addDragDropListeners(y,"group",u.id,"unassigned",g.toString());let k=S.getModeRadios().bracket,w=k&&k.checked;w?y.innerHTML=`<strong>Group ${u.id.split("-")[1]}:</strong>`:y.innerHTML=`<strong>Group ${u.id.split("-")[1]} (Avg Power: ${u.averagePower}):</strong>`;let M=this.callbacks.createElement("ul");u.players.forEach(h=>{let L=this.callbacks.createElement("li");w&&h.bracketRange?L.textContent=`${h.name} (B: ${h.bracketRange})`:L.textContent=`${h.name} (P: ${h.powerRange})`,M.appendChild(L)}),y.appendChild(M),d.appendChild(y)}else{let y=this.callbacks.createElement("li");y.classList.add("pod-player"),y.draggable=!0,y.dataset.itemType="player",y.dataset.itemId=u.id.toString(),y.dataset.podIndex="unassigned",y.dataset.itemIndex=g.toString(),this.callbacks.addDragDropListeners(y,"player",u.id.toString(),"unassigned",g.toString());let k=S.getModeRadios().bracket;k&&k.checked&&u.bracketRange?y.textContent=`${u.name} (B: ${u.bracketRange})`:y.textContent=`${u.name} (P: ${u.powerRange})`,d.appendChild(y)}}),i.appendChild(d),a.appendChild(i)}o.appendChild(a),r.appendChild(o),this.callbacks.updateResultsCardVisibility();let s=document.querySelector(".help-section");if(s&&s.parentNode){let i=this.callbacks.createElement("div");i.style.textAlign="center",i.style.marginTop="20px",i.style.marginBottom="20px";let d=this.callbacks.getDisplayModeBtn().cloneNode(!0);d.id="display-mode-btn-bottom",d.style.display="inline-block",d.addEventListener("click",async()=>await this.enterDisplayModeWithWarning()),i.appendChild(d),s.parentNode.insertBefore(i,s),this.callbacks.setDisplayModeBtnBottom(d)}}async enterDisplayModeWithWarning(){if(this.currentUnassigned.length>0){let e=this.currentUnassigned.length,t=e===1?"player":"players";if(!await F.showConfirm({title:"Unassigned Players Warning",message:`Warning: There ${e===1?"is":"are"} ${e} unassigned ${t}.
These players will not be displayed in display mode. Do you want to continue without assigning them?`,confirmText:"Continue",cancelText:"Cancel",confirmStyle:"warning",icon:"\u26A0\uFE0F"}))return}this.callbacks.enterDisplayMode(this.currentPods)}calculateValidBracketRange(e){let t=e.players.flatMap(a=>"players"in a?a.players:[a]);if(t.length===0)return"Unknown";let r=[],n=new Set;t.forEach(a=>{a.brackets&&a.brackets.forEach(s=>n.add(s))});for(let a of n)t.every(i=>i.brackets&&i.brackets.includes(a))&&r.push(a);let o=["1","2","3","4","cedh"];if(r.sort((a,s)=>o.indexOf(a)-o.indexOf(s)),r.length===0)return"Unknown";if(r.length===1)return r[0];{let a=r.filter(i=>i!=="cedh");return a.length>1&&a.every((i,l)=>{if(l===0)return!0;let d=parseInt(i),u=parseInt(a[l-1]);return d===u+1})&&!r.includes("cedh")?`${a[0]}-${a[a.length-1]}`:r.join(", ")}}clearReusableArrays(){this.reusablePlayerArray.length=0,this.reusableItemArray.length=0,this.reusablePlayerObject={},this.reusableGroupObject={}}triggerValidationForAllFields(){let e=j.batchValidateRows(this.callbacks.getPlayerRowsContainer());O.trackValidationTime(e.validationTime),e.validationTime>100&&console.warn(`Slow validation detected: ${e.validationTime.toFixed(2)}ms`)}};var pe=class{constructor(){this.currentStep=0;this.tourSteps=[];this.tourOverlay=null;this.tourHighlight=null;this.tourTooltip=null;this.isActive=!1;this.originalScrollPosition=0;this.handleTourKeydown=e=>{if(this.isActive)switch(e.key){case"Escape":e.preventDefault(),e.stopPropagation(),this.endTour().catch(console.error);break;case"ArrowRight":case"Enter":e.preventDefault(),e.stopPropagation(),this.currentStep>=this.tourSteps.length-1?this.endTour().catch(console.error):this.nextStep().catch(console.error);break;case"ArrowLeft":e.preventDefault(),e.stopPropagation(),this.previousStep().catch(console.error);break}};this.initializeTourSteps()}initializeTourSteps(){this.tourSteps=[{id:"welcome",title:"\u{1F3AF} Welcome to Commander Pod Generator!",content:"This interactive tour will guide you through all the features step by step. You can exit at any time by pressing Escape or clicking the \u2715 Exit Tour button.",target:".container",position:"bottom",action:"none"},{id:"settings-button",title:"\u2699\uFE0F Settings Button",content:"This gear icon opens the settings panel where you can configure your ranking system (Power Level vs Bracket), manage players, and access help resources. Click it to access all configuration options.",target:"#settings-toggle",position:"bottom",action:"none"},{id:"ranking-system",title:"\u2699\uFE0F Choose Your Ranking System",content:"First, choose between Power Level (1-10 scale) or Bracket (1,2,3,4,cEDH) system. Power Level gives more granular control, while Brackets are simpler and tournament-friendly.",target:"fieldset:first-of-type",position:"bottom",action:"none",beforeStep:()=>this.openSettingsForTour(),afterStep:()=>this.closeSettingsAfterTour()},{id:"add-players",title:"\u{1F465} Adding Players",content:'Player names are entered here. The "Add Player" button and keyboard shortcut Ctrl+Enter are available for quickly adding more players when you use the app.',target:".player-row:first-child .player-name",position:"right",action:"type",actionData:"Alice",beforeStep:()=>this.ensurePlayerRows(1)},{id:"power-levels",title:"\u26A1 Setting Power Levels",content:'This button opens the power level selector. Individual levels or ranges can be selected, and typing shortcuts like "7-8" are supported for quick range selection.',target:".player-row:first-child .power-selector-btn",position:"left",action:"click",beforeStep:()=>this.ensurePowerMode()},{id:"power-selection",title:"\u{1F3AF} Power Level Selection",content:`Multiple power levels can be selected for each player. The quick range buttons (6-7, 7-8, 8-9) make common selections easy. We'll now select "7-8" for a medium power deck.`,target:".player-row:first-child .power-selector-dropdown",position:"right",action:"none",beforeStep:()=>{let e=document.querySelector(".player-row:first-child .power-selector-btn");e&&e.click(),setTimeout(()=>{let t=document.querySelector('.player-row:first-child .range-btn[data-range="7-8"]');t&&t.click()},200)}},{id:"add-more-players",title:"\u{1F680} Quick Player Addition",content:`The "Add 4 Players" button enables bulk addition, and Ctrl+Enter can be pressed repeatedly for individual players. We'll add more players for our demonstration.`,target:"#bulk-add-btn",position:"bottom",action:"click"},{id:"fill-players",title:"\u{1F4DD} Complete Player Information",content:"The remaining players will be filled with names and power levels. The tour will automatically provide example data to demonstrate the features.",target:".player-row:nth-child(2) .player-name",position:"right",action:"none",beforeStep:()=>this.fillExamplePlayers()},{id:"groups",title:"\u{1F46B} Creating Groups",content:'This dropdown allows grouping players who want to play together. "Start a New Group" creates a group, then other players can "Join Group" to join them.',target:".player-row:first-child .group-select",position:"left",action:"none"},{id:"group-demo",title:"\u{1F465} Group Creation Demo",content:"Now we'll create a group! Alice and Henry will be grouped together to demonstrate how the system works with compatible power levels.",target:".player-row:first-child .group-select",position:"left",action:"none",beforeStep:()=>this.createGroupDemo()},{id:"tolerance",title:"\u{1F39A}\uFE0F Power Level Tolerance",content:'In Power Level mode, tolerance can be adjusted. "No Leniency" requires exact matches, while "Regular" and "Super" leniency allow \xB10.5 and \xB11.0 differences respectively.',target:"fieldset:nth-of-type(2)",position:"top",action:"none",beforeStep:()=>{this.ensurePowerMode(),this.openSettingsForTour()},afterStep:()=>this.closeSettingsAfterTour()},{id:"pod-size-preference",title:"\u{1F4CF} Pod Size Preference",content:'Pod size preference determines how pods are organized. "Balanced" allows 3-5 player pods for flexibility, while "Avoid Large Pods" prefers smaller 3-4 player pods for more intimate games.',target:"fieldset:nth-of-type(3)",position:"top",action:"none",beforeStep:()=>this.openSettingsForTour(),afterStep:()=>this.closeSettingsAfterTour()},{id:"generate",title:"\u{1F3B2} Generate Pods",content:"Once all players have names and power levels, this button generates balanced pods. The algorithm creates 3-4 player pods with similar power levels.",target:"#generate-pods-btn",position:"top",action:"click"},{id:"results",title:"\u{1F3C6} Pod Results",content:"Here are the generated pods! Players are grouped by compatible power levels. Players can be moved between pods using drag and drop if needed.",target:"#output-section",position:"top",action:"none"},{id:"unassigned-players",title:"\u26A0\uFE0F Unassigned Players",content:`If players can't be balanced into pods (due to power level mismatches or odd numbers), they'll appear as "unassigned." They can be manually dragged into existing pods.`,target:"#output-section",position:"top",action:"none"},{id:"drag-drop",title:"\u{1F5B1}\uFE0F Drag and Drop",content:"Pods can be reorganized by dragging players between them. This is useful for manual adjustments or accommodating player preferences after initial pod generation.",target:"#output-section",position:"top",action:"none"},{id:"display-mode",title:"\u{1F4FA} Display Mode",content:"This button enters Display Mode - a clean, full-screen view perfect for showing pods to players on a projector or large screen.",target:"#display-mode-btn",position:"bottom",action:"click"},{id:"display-features",title:"\u{1F3A8} Display Mode Features",content:"In Display Mode, pod titles show power level ranges, player names are clearly displayed, and automatic font scaling ensures readability. All editing controls are hidden for a clean presentation view.",target:".display-mode-container",position:"top",action:"none"},{id:"exit-display",title:"\u{1F6AA} Exit Display Mode",content:"This button exits Display Mode and returns to the main interface where changes can be made.",target:"#exit-display-btn",position:"bottom",action:"click"},{id:"reset",title:"\u{1F504} Reset and Undo",content:"The Reset All button clears everything. It includes a smart confirmation system and an undo feature that lasts 30 seconds - so experimentation is safe!",target:"#reset-all-btn",position:"top",action:"none"},{id:"keyboard-shortcuts",title:"\u2328\uFE0F Keyboard Shortcuts",content:'Pro tip: Ctrl+Enter adds players quickly, power ranges like "7-8" can be typed in selector buttons, and Escape closes any dropdown. The help contains the full list of shortcuts!',target:"#help-btn",position:"left",action:"none"},{id:"support-donation",title:"\u{1F49D} Support This Project",content:"If you find this tool helpful for organizing your Commander games, please consider supporting its development! Your donations help keep this tool free, ad-free, and continuously improved for the entire Magic: The Gathering community. Every contribution, no matter how small, is greatly appreciated!",target:'div[id*="kofi-widget-overlay"], [class*="floatingchat-donate"], img[class*="kofiImg"]',position:"top",action:"none"},{id:"complete",title:"\u{1F389} Tour Complete!",content:"Congratulations! You now know all the main features. The Help button contains detailed information about keyboard shortcuts and advanced features. Happy pod organizing!",target:"#help-btn",position:"left",action:"none"}]}async startTour(){this.isActive||(this.isActive=!0,this.currentStep=0,this.originalScrollPosition=window.scrollY,this.createTourUI(),await this.showStep(0),this.setupTourEventListeners())}async endTour(){if(!this.isActive)return;this.isActive=!1,this.tourOverlay&&this.tourOverlay.classList.add("tour-ending"),this.tourHighlight&&this.tourHighlight.classList.add("tour-ending"),this.tourTooltip&&this.tourTooltip.classList.add("tour-ending");let e=document.querySelector(".tour-progress");if(e&&e.classList.add("tour-ending"),this.removeEventListeners(),document.body.classList.contains("display-mode")){let r=document.getElementById("exit-display-btn");r&&(r.click(),await this.waitForCondition(()=>!document.body.classList.contains("display-mode"),2e3))}setTimeout(()=>{this.removeTourUI(),this.cleanupRemainingElements()},50);let t=document.getElementById("reset-all-btn");t&&(t.click(),setTimeout(async()=>{let r=document.querySelector(".modal-confirm");r&&r.click()},50)),window.scrollTo(0,this.originalScrollPosition)}async forceEndTour(){if(this.isActive=!1,document.body.classList.contains("display-mode")){let t=document.getElementById("exit-display-btn");t&&(t.click(),await this.waitForCondition(()=>!document.body.classList.contains("display-mode"),2e3))}this.removeTourUI(),this.cleanupRemainingElements();let e=document.getElementById("reset-all-btn");e&&(e.click(),setTimeout(async()=>{let t=document.querySelector(".modal-confirm");t&&t.click()},50)),window.scrollTo(0,this.originalScrollPosition)}createTourUI(){this.tourOverlay=document.createElement("div"),this.tourOverlay.className="tour-overlay",this.tourOverlay.innerHTML=`
<style>
.tour-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.7);
z-index: 9998;
pointer-events: none;
opacity: 1;
transition: opacity 0.1s ease;
}
.tour-overlay.tour-ending {
opacity: 0;
pointer-events: none;
}
.tour-highlight {
position: absolute;
border: 5px solid #4CAF50;
border-radius: 8px;
box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.85),
0 0 40px rgba(76, 175, 80, 1.2),
inset 0 0 0 2px rgba(255, 255, 255, 0.3);
z-index: 9999;
pointer-events: none;
transition: all 0.1s ease;
opacity: 1;
}
.tour-highlight.tour-ending {
opacity: 0;
pointer-events: none;
}
.tour-tooltip {
position: absolute;
background: linear-gradient(135deg, #2a2a2a, #3a3a3a);
color: white;
padding: 20px;
border-radius: 12px;
max-width: 350px;
z-index: 10000;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
border: 1px solid #4CAF50;
pointer-events: auto;
opacity: 1;
transition: opacity 0.15s ease;
}
.tour-tooltip.tour-ending {
opacity: 0;
pointer-events: none;
}
.tour-tooltip h3 {
margin: 0 0 10px 0;
color: #4CAF50;
font-size: 1.2rem;
}
.tour-tooltip p {
margin: 0 0 15px 0;
line-height: 1.5;
}
.tour-tooltip-buttons {
display: flex;
gap: 10px;
justify-content: flex-end;
}
.tour-btn {
padding: 8px 16px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 0.9rem;
transition: all 0.2s ease;
}
.tour-btn-primary {
background: #4CAF50;
color: white;
}
.tour-btn-primary:hover {
background: #45a049;
}
.tour-btn-secondary {
background: #666;
color: white;
}
.tour-btn-secondary:hover {
background: #777;
}
.tour-progress {
position: fixed;
bottom: 20px;
right: 20px;
background: rgba(42, 42, 42, 0.9);
color: white;
padding: 10px 15px;
border-radius: 20px;
font-size: 0.9rem;
z-index: 10001;
border: 1px solid #4CAF50;
opacity: 1;
transition: opacity 0.1s ease;
pointer-events: none;
}
.tour-progress.tour-ending {
opacity: 0;
pointer-events: none;
}
</style>
`,this.tourHighlight=document.createElement("div"),this.tourHighlight.className="tour-highlight",this.tourTooltip=document.createElement("div"),this.tourTooltip.className="tour-tooltip",document.body.appendChild(this.tourOverlay),document.body.appendChild(this.tourHighlight),document.body.appendChild(this.tourTooltip)}async showStep(e){if(e>=this.tourSteps.length){await this.endTour();return}let t=this.tourSteps[e];this.currentStep=e,t.beforeStep&&t.beforeStep(),setTimeout(()=>{this.positionHighlight(t),this.showTooltip(t),this.updateProgress()},20)}positionHighlight(e){let t=document.querySelector(e.target);if((e.target.includes("kofi")||e.id==="support-donation")&&!t){this.tourHighlight&&(this.tourHighlight.style.left="25px",this.tourHighlight.style.top=`${window.innerHeight-80}px`,this.tourHighlight.style.width="120px",this.tourHighlight.style.height="40px",this.tourHighlight.style.position="fixed");return}if(!t||!this.tourHighlight){if(e.target.includes("kofi")){setTimeout(()=>this.positionHighlight(e),200);return}return}if(e.target.includes("dropdown")){let s=t.closest(".player-row")?.querySelector(".power-selector-btn, .bracket-selector-btn");if(s&&t.style.display==="none"){s.click(),setTimeout(()=>this.positionHighlight(e),100);return}}let r=t.getBoundingClientRect(),n=window.scrollX,o=window.scrollY;if(this.tourHighlight.style.position="absolute",this.tourHighlight.style.left=`${r.left+n-5}px`,this.tourHighlight.style.top=`${r.top+o-5}px`,this.tourHighlight.style.width=`${r.width+10}px`,this.tourHighlight.style.height=`${r.height+10}px`,!(t.closest("#settings-sidebar")!==null))t.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});else{let s=r.top+r.height/2,i=window.innerHeight/2;(s<100||s>window.innerHeight-100)&&window.scrollTo({left:0,top:window.scrollY+(s-i),behavior:"smooth"})}}showTooltip(e){if(!this.tourTooltip)return;let r=this.currentStep===this.tourSteps.length-1?"Finish Tour":"Next";this.tourTooltip.innerHTML=`
<h3>${e.title}</h3>
<p>${e.content}</p>
<div class="tour-tooltip-buttons">
<button class="tour-btn tour-btn-secondary" id="tour-exit-btn">
\u2715 Exit Tour
</button>
${this.currentStep>0?'<button class="tour-btn tour-btn-secondary" id="tour-prev-btn">Previous</button>':""}
<button class="tour-btn tour-btn-primary" id="tour-next-btn">
${r}
</button>
</div>
`;let n=this.tourTooltip.querySelector("#tour-exit-btn"),o=this.tourTooltip.querySelector("#tour-prev-btn"),a=this.tourTooltip.querySelector("#tour-next-btn");n&&n.addEventListener("click",()=>this.endTour().catch(console.error)),o&&o.addEventListener("click",()=>this.previousStep().catch(console.error)),a&&a.addEventListener("click",()=>this.nextStep().catch(console.error)),this.positionTooltip(e)}positionTooltip(e){let t=document.querySelector(e.target);if(!t||!this.tourTooltip)return;let r=t.getBoundingClientRect(),n=this.tourTooltip.getBoundingClientRect(),o=window.scrollX,a=window.scrollY,s,i;switch(e.position){case"top":s=r.left+o+r.width/2-n.width/2,i=r.top+a-n.height-15;break;case"bottom":s=r.left+o+r.width/2-n.width/2,i=r.bottom+a+15;break;case"left":s=r.left+o-n.width-15,i=r.top+a+r.height/2-n.height/2;break;case"right":s=r.right+o+15,i=r.top+a+r.height/2-n.height/2;break}let l=window.innerWidth-n.width-20,d=window.innerHeight-n.height-20;s=Math.max(20,Math.min(s,l)),i=Math.max(20,Math.min(i,d)),this.tourTooltip.style.left=`${s}px`,this.tourTooltip.style.top=`${i}px`}updateProgress(){if(document.querySelectorAll(".tour-progress").forEach(r=>{r.parentNode&&r.parentNode.removeChild(r)}),!this.isActive)return;let t=document.createElement("div");t.className="tour-progress",t.textContent=`Step ${this.currentStep+1} of ${this.tourSteps.length}`,document.body.appendChild(t)}async nextStep(){if(this.currentStep>=this.tourSteps.length-1){await this.endTour();return}let e=this.tourSteps[this.currentStep];e.action&&e.action!=="none"&&this.performStepAction(e),e.afterStep&&e.afterStep();try{await this.waitForActionCompletion(e),await this.showStep(this.currentStep+1)}catch(t){console.warn("Tour step completion timed out, proceeding anyway:",t),await this.showStep(this.currentStep+1)}}async waitForActionCompletion(e){if(!e.action||e.action==="none")return Promise.resolve();switch(e.id){case"display-mode":return this.waitForCondition(()=>document.body.classList.contains("display-mode"),3e3);case"exit-display":return this.waitForCondition(()=>!document.body.classList.contains("display-mode"),3e3);case"generate":return this.waitForCondition(()=>document.querySelectorAll(".pod").length>0,5e3);case"reset":return this.waitForCondition(()=>document.querySelectorAll(".player-row").length<=1,3e3);case"add-player":return this.waitForCondition(()=>document.querySelectorAll(".player-row").length>1,2e3);case"type-text":return new Promise(t=>setTimeout(t,100));default:return new Promise(t=>setTimeout(t,50))}}waitForCondition(e,t=3e3){return new Promise((r,n)=>{let o=Date.now(),a=()=>{if(e()){r();return}if(Date.now()-o>=t){n(new Error(`Timeout waiting for condition after ${t}ms`));return}setTimeout(a,50)};a()})}async previousStep(){this.currentStep>0&&await this.showStep(this.currentStep-1)}performStepAction(e){let t=document.querySelector(e.target);if(t)switch(e.action){case"click":t.click();break;case"type":e.actionData&&t instanceof HTMLInputElement&&(t.value=e.actionData,t.dispatchEvent(new Event("input",{bubbles:!0})));break;case"hover":let r=new MouseEvent("mouseenter",{bubbles:!0});t.dispatchEvent(r);break}}setupTourEventListeners(){document.addEventListener("keydown",this.handleTourKeydown),window.tourManager=this}removeEventListeners(){document.removeEventListener("keydown",this.handleTourKeydown),delete window.tourManager}removeTourUI(){[this.tourOverlay,this.tourHighlight,this.tourTooltip].forEach(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)}),document.querySelectorAll(".tour-progress").forEach(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)}),this.tourOverlay=null,this.tourHighlight=null,this.tourTooltip=null}cleanupRemainingElements(){document.querySelectorAll(".tour-overlay, .tour-highlight, .tour-tooltip, .tour-progress").forEach(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)})}ensurePlayerRows(e){let t=document.querySelectorAll(".player-row").length;if(t<e){let r=document.getElementById("add-player-btn");for(let n=t;n<e;n++)r?.click()}}ensurePowerMode(){let e=document.getElementById("power-level-radio");e&&!e.checked&&e.click()}fillExamplePlayers(){let e=[{name:"Henry",power:"8"},{name:"Charlie",power:"7"},{name:"Diana",power:"7"},{name:"Bob",power:"7"},{name:"Eve",power:"7"},{name:"Frank",power:"8"},{name:"Grace",power:"8"},{name:"Ivy",power:"8"}],t=document.querySelectorAll(".player-row");for(let r=1;r<t.length;r++){let n=t[r],o=n.querySelector(".player-name"),a=n.querySelector(".power-selector-btn"),s=r-1;if(s>=e.length)break;let i=e[s];o&&o.value.trim()===""&&(o.value=i.name,o.dispatchEvent(new Event("input",{bubbles:!0}))),a&&(n.querySelector(".power-checkbox input:checked")||(a.click(),setTimeout(()=>{let d=n.querySelector(`.power-checkbox input[value="${i.power}"]`);d&&(d.checked=!0,d.dispatchEvent(new Event("change",{bubbles:!0})),setTimeout(()=>{a.click()},50))},100)))}}createGroupDemo(){let e=document.querySelector(".player-row:first-child"),t=document.querySelector(".player-row:nth-child(2)");if(e&&t){let r=e.querySelector(".group-select");if(r&&Array.from(r.options).find(o=>o.value==="new-group")){r.value="new-group";let o=new Event("change",{bubbles:!0});r.dispatchEvent(o),setTimeout(()=>{let a=r.dataset.createdGroupId;if(a){let s=t.querySelector(".group-select");if(s){if(Array.from(s.options).find(l=>l.value===a)){s.value=a;let l=new Event("change",{bubbles:!0});s.dispatchEvent(l)}else if(Array.from(s.options).find(d=>d.value==="group-1")){s.value="group-1";let d=new Event("change",{bubbles:!0});s.dispatchEvent(d)}}}},800)}}}openSettingsForTour(){setTimeout(()=>{let e=document.getElementById("settings-sidebar");e&&(e.classList.add("open"),window.scrollTo({left:0,top:0,behavior:"smooth"}),setTimeout(()=>{let t=this.tourSteps[this.currentStep];t&&this.positionHighlight(t)},400))},50)}closeSettingsAfterTour(){let e=document.getElementById("settings-sidebar");e&&e.classList.remove("open")}};function R(c){return c instanceof HTMLElement}function $(c){return c instanceof HTMLInputElement}function z(c){return c instanceof HTMLButtonElement}function B(c,e){let t=document.getElementById(c);return t?e(t)?t:(console.warn(`Element #${c} exists but is not the expected type`),null):null}function U(c,e){let t=c.target;return!t||!e(t)?null:t}function I(c,e){if(c==null)throw new Error(e||"Assertion failed: value is null or undefined");return c}var he=class{constructor(e){this.tourManager=null;this.callbacks=e}initializeHelpModal(){let e=I(B("help-modal",R),"help-modal is required"),t=I(e.querySelector(".help-close"),"help-close button is required"),r=document.getElementById("start-tour-btn");t.addEventListener("click",()=>this.hideHelpModal()),e.addEventListener("click",n=>{n.target===e&&this.hideHelpModal()}),document.addEventListener("keydown",n=>{n.key==="Escape"&&e.style.display==="block"&&this.hideHelpModal()}),r&&r.addEventListener("click",()=>{this.hideHelpModal(),this.startInteractiveTour().catch(console.error)})}showHelpModal(){let e=I(B("help-modal",R),"help-modal is required");e.style.display="block",document.body.style.overflow="hidden"}hideHelpModal(){let e=I(B("help-modal",R),"help-modal is required");e.style.display="none",document.body.style.overflow=""}getTourManager(){return this.tourManager||(this.tourManager=new pe),this.tourManager}async startInteractiveTour(){await this.getTourManager().startTour()}isHelpModalVisible(){let e=document.getElementById("help-modal");return e?e.style.display==="block":!1}getTourManagerInstance(){return this.getTourManager()}};var ge=class{constructor(e,t,r,n){this.powerSequenceInput="";this.powerSequenceTimeout=null;this.bracketSequenceInput="";this.bracketSequenceTimeout=null;this.addPlayerRowCallback=e,this.closeAllDropdownsCallback=t,this.findPlayerRowCallback=r,this.playerRowsContainer=n}initialize(){document.addEventListener("keydown",e=>this.handleKeydown(e))}handleKeydown(e){if(e.ctrlKey&&e.key==="p"){e.preventDefault(),O.logMetrics();return}if(e.ctrlKey&&e.key==="Enter"){e.preventDefault(),this.addPlayerRowCallback();let r=b.getAll(".player-row",this.playerRowsContainer),n=r[r.length-1],o=b.getFromRow(n,".player-name");o&&o.focus();return}let t=document.activeElement;if(R(t)&&t.classList.contains("power-selector-btn")){this.handlePowerSelectorKeydown(e,t);return}if(R(t)&&t.classList.contains("bracket-selector-btn")){this.handleBracketSelectorKeydown(e,t);return}}handlePowerSelectorKeydown(e,t){if(e.key==="Escape"){e.preventDefault(),this.closeAllDropdownsCallback();return}if(e.key==="Enter"){e.preventDefault(),this.powerSequenceInput.trim()&&(this.selectPowerByKeyboard(t,this.powerSequenceInput.trim()),this.powerSequenceInput="",this.powerSequenceTimeout&&(clearTimeout(this.powerSequenceTimeout),this.powerSequenceTimeout=null));return}if(e.key.match(/[0-9.\-]/)||e.key==="Backspace"){e.preventDefault(),e.key==="Backspace"?this.powerSequenceInput=this.powerSequenceInput.slice(0,-1):this.powerSequenceInput+=e.key,this.powerSequenceTimeout&&clearTimeout(this.powerSequenceTimeout),this.powerSequenceTimeout=setTimeout(()=>{this.powerSequenceInput.trim()&&(this.selectPowerByKeyboard(t,this.powerSequenceInput.trim()),this.powerSequenceInput=""),this.powerSequenceTimeout=null},1e3);return}}handleBracketSelectorKeydown(e,t){if(e.key==="Escape"){e.preventDefault(),this.closeAllDropdownsCallback();return}if(e.key==="Enter"){e.preventDefault(),this.bracketSequenceInput.trim()&&(this.selectBracketByKeyboard(t,this.bracketSequenceInput.trim()),this.bracketSequenceInput="",this.bracketSequenceTimeout&&(clearTimeout(this.bracketSequenceTimeout),this.bracketSequenceTimeout=null));return}if(e.key.match(/[1-5c\-]/)||e.key==="Backspace"||e.key==="C"){e.preventDefault(),e.key==="Backspace"?this.bracketSequenceInput=this.bracketSequenceInput.slice(0,-1):this.bracketSequenceInput+=e.key.toLowerCase(),this.bracketSequenceTimeout&&clearTimeout(this.bracketSequenceTimeout),this.bracketSequenceTimeout=setTimeout(()=>{this.bracketSequenceInput.trim()&&(this.selectBracketByKeyboard(t,this.bracketSequenceInput.trim()),this.bracketSequenceInput=""),this.bracketSequenceTimeout=null},1e3);return}}selectBracketByKeyboard(e,t){let r=this.findPlayerRowCallback(e);if(!r)return;let n=b.getAllFromRow(r,'.bracket-checkbox input[type="checkbox"]');if(n.forEach(a=>a.checked=!1),t.includes("-")){let a=t.split("-");if(a.length===2){let s=a[0].trim(),i=a[1].trim(),l=g=>g==="cedh"||g==="c"?5:parseInt(g),d=l(s),u=l(i);!isNaN(d)&&!isNaN(u)&&d<=u&&n.forEach(g=>{let y=l(g.value);y>=d&&y<=u&&(g.checked=!0)})}}else{let a=t;t==="c"&&(a="cedh"),t==="5"&&(a="cedh");let s=b.getFromRow(r,`.bracket-checkbox input[value="${a}"]`);s&&(s.checked=!0)}let o=Array.from(n).filter(a=>a.checked);o.forEach(a=>{a.dispatchEvent(new Event("change",{bubbles:!0}))}),o.length===0&&n[0]?.dispatchEvent(new Event("change",{bubbles:!0})),this.closeAllDropdownsCallback()}selectPowerByKeyboard(e,t){let r=this.findPlayerRowCallback(e);if(!r)return;let n=b.getAllFromRow(r,'.power-checkbox input[type="checkbox"]');if(n.forEach(a=>a.checked=!1),t.includes("-")){let a=t.split("-");if(a.length===2){let s=parseFloat(a[0]),i=parseFloat(a[1]);if(!isNaN(s)&&!isNaN(i)&&s<=i){let l=Number.isInteger(s)&&Number.isInteger(i);n.forEach(d=>{let u=parseFloat(d.value);if(u>=s&&u<=i){if(l&&!Number.isInteger(u))return;d.checked=!0}})}}}else{let a=parseFloat(t);if(!isNaN(a)){let s=b.getFromRow(r,`.power-checkbox input[value="${a}"]`);s&&(s.checked=!0)}}let o=Array.from(n).filter(a=>a.checked);o.forEach(a=>{a.dispatchEvent(new Event("change",{bubbles:!0}))}),o.length===0&&n[0]?.dispatchEvent(new Event("change",{bubbles:!0})),this.closeAllDropdownsCallback()}cleanup(){this.powerSequenceTimeout&&(clearTimeout(this.powerSequenceTimeout),this.powerSequenceTimeout=null),this.bracketSequenceTimeout&&(clearTimeout(this.bracketSequenceTimeout),this.bracketSequenceTimeout=null)}};var me=class{constructor(e){this.keyboardShortcutsManager=null;this.containerClickHandler=null;this.containerChangeHandler=null;this.containerInputHandler=null;this.documentClickHandler=null;this.sidebarDocumentClickHandler=null;this.callbacks=e}initializeEventListeners(){let e=I(B("add-player-btn",z),"add-player-btn is required"),t=I(B("bulk-add-btn",z),"bulk-add-btn is required"),r=I(B("generate-pods-btn",z),"generate-pods-btn is required"),n=I(B("reset-all-btn",z),"reset-all-btn is required"),o=I(B("display-mode-btn",z),"display-mode-btn is required"),a=I(B("help-btn",z),"help-btn is required");e.addEventListener("click",()=>this.callbacks.addPlayerRow()),t.addEventListener("click",()=>this.callbacks.bulkAddPlayers(4)),r.addEventListener("click",async()=>await this.callbacks.generatePods()),n.addEventListener("click",async()=>await this.callbacks.getResetUndoManager().resetAllWithConfirmation()),o.addEventListener("click",async()=>await this.callbacks.getPodGenerationManager().enterDisplayModeWithWarning()),a.addEventListener("click",()=>this.callbacks.getHelpManager().showHelpModal()),this.initializeSidebarEvents(),this.callbacks.getHelpManager().initializeHelpModal()}initializeSidebarEvents(){let e=I(B("settings-toggle",z),"settings-toggle is required"),t=I(B("sidebar-close",z),"sidebar-close is required"),r=I(B("settings-sidebar",R),"settings-sidebar is required");e.addEventListener("click",()=>{let n=r.classList.contains("open");this.callbacks.toggleSidebar(!n)}),t.addEventListener("click",()=>this.callbacks.toggleSidebar(!1)),this.sidebarDocumentClickHandler||(this.sidebarDocumentClickHandler=n=>{let o=U(n,R);o&&!r.contains(o)&&!e.contains(o)&&!o.closest(".toast-container")&&!o.closest(".modal-container")&&r.classList.contains("open")&&this.callbacks.toggleSidebar(!1)},document.addEventListener("click",this.sidebarDocumentClickHandler))}setupEventDelegation(){let e=I(B("player-rows",R),"player-rows container is required");this.containerClickHandler||(this.containerClickHandler=t=>this.handleContainerClick(t),e.addEventListener("click",this.containerClickHandler)),this.containerChangeHandler||(this.containerChangeHandler=t=>this.handleContainerChange(t),e.addEventListener("change",this.containerChangeHandler)),this.containerInputHandler||(this.containerInputHandler=t=>this.handleContainerInput(t),e.addEventListener("input",this.containerInputHandler)),this.documentClickHandler||(this.documentClickHandler=t=>this.handleDocumentClick(t),document.addEventListener("click",this.documentClickHandler))}initializeKeyboardShortcuts(){if(!this.keyboardShortcutsManager){let e=I(B("player-rows",R),"player-rows container is required");this.keyboardShortcutsManager=new ge(()=>this.callbacks.addPlayerRow(),()=>this.closeAllDropdowns(),t=>this.callbacks.findPlayerRow(t),e),this.keyboardShortcutsManager.initialize()}}handleContainerClick(e){let t=U(e,R);if(t){if(t.classList.contains("power-selector-btn")){this.handlePowerSelectorClick(e,t);return}if(t.classList.contains("bracket-selector-btn")){this.handleBracketSelectorClick(e,t);return}if(t.classList.contains("range-btn")){this.callbacks.handleRangeButtonClick(t);return}if(t.classList.contains("bracket-range-btn")){this.callbacks.handleBracketRangeButtonClick(t);return}if(t.classList.contains("clear-btn")||t.classList.contains("bracket-clear-btn")){this.callbacks.handleClearButtonClick(t);return}if(t.classList.contains("remove-player-btn")){this.handleRemoveButtonClick(t);return}}}handleContainerChange(e){let t=U(e,R);if(t){if(t.classList.contains("group-select")){this.callbacks.handleGroupChange();return}if($(t)&&t.type==="checkbox"&&t.closest(".power-checkbox")){this.callbacks.handlePowerCheckboxChange(t);return}if($(t)&&t.type==="checkbox"&&t.closest(".bracket-checkbox")){this.callbacks.handleBracketCheckboxChange(t);return}if(t.classList.contains("player-name")&&$(t)){this.callbacks.handlePlayerNameChange(t);return}}}handleContainerInput(e){let t=U(e,R);if(t&&t.classList.contains("player-name")){let r=U(e,$);r&&this.callbacks.handlePlayerNameChange(r);return}}handleDocumentClick(e){let t=U(e,R);t&&!t.closest(".power-selector-btn")&&!t.closest(".power-selector-dropdown")&&!t.closest(".bracket-selector-btn")&&!t.closest(".bracket-selector-dropdown")&&this.closeAllDropdowns()}closeAllDropdowns(){document.querySelectorAll(".bracket-selector-dropdown, .power-selector-dropdown").forEach(n=>{n.style.display="none",n.classList.remove("show")}),document.querySelectorAll(".power-selector-btn, .bracket-selector-btn").forEach(n=>{n.classList.remove("open")}),document.querySelectorAll(".player-row").forEach(n=>{n.classList.remove("dropdown-open")})}handlePowerSelectorClick(e,t){e.preventDefault(),this.handleDropdownToggle(t,".power-selector-dropdown")}handleBracketSelectorClick(e,t){e.preventDefault(),this.handleDropdownToggle(t,".bracket-selector-dropdown")}handleDropdownToggle(e,t){let r=this.callbacks.findPlayerRow(e);if(!r)return;let n=r.querySelector(t);if(!n)return;let o=n.style.display==="block";this.closeAllDropdowns(),o||(n.style.display="block",n.classList.add("show"),e.classList.add("open"),r.classList.add("dropdown-open"))}handleClearButtonClick(e){let t=this.callbacks.findPlayerRow(e);t&&(e.classList.contains("clear-btn")?(b.getAllFromRow(t,'.power-checkbox input[type="checkbox"]').forEach(n=>n.checked=!1),A.updatePowerButton(t)):e.classList.contains("bracket-clear-btn")&&(b.getAllFromRow(t,'.bracket-checkbox input[type="checkbox"]').forEach(n=>n.checked=!1),A.updateBracketButton(t)))}handleRemoveButtonClick(e){this.callbacks.removePlayerRow(e)}handlePowerCheckboxChange(e){let t=this.callbacks.findPlayerRow(e);t&&A.updatePowerButton(t)}handleBracketCheckboxChange(e){let t=this.callbacks.findPlayerRow(e);t&&A.updateBracketButton(t)}cleanup(){let e=document.getElementById("player-rows");e&&(this.containerClickHandler&&(e.removeEventListener("click",this.containerClickHandler),this.containerClickHandler=null),this.containerChangeHandler&&(e.removeEventListener("change",this.containerChangeHandler),this.containerChangeHandler=null),this.containerInputHandler&&(e.removeEventListener("input",this.containerInputHandler),this.containerInputHandler=null)),this.documentClickHandler&&(document.removeEventListener("click",this.documentClickHandler),this.documentClickHandler=null),this.sidebarDocumentClickHandler&&(document.removeEventListener("click",this.sidebarDocumentClickHandler),this.sidebarDocumentClickHandler=null),this.keyboardShortcutsManager&&(this.keyboardShortcutsManager.cleanup(),this.keyboardShortcutsManager=null)}getKeyboardShortcutsManager(){return this.keyboardShortcutsManager}};var ye=class{constructor(e){this.callbacks=e}addPlayerRow(){let e=this.callbacks.getPlayerRowTemplate(),t=this.callbacks.getPlayerRowsContainer(),n=e.content.cloneNode(!0).querySelector(".player-row"),o=this.callbacks.getNextPlayerId();n.dataset.playerId=o.toString(),A.updatePowerButton(n),A.updateBracketButton(n),t.appendChild(n);let a=b.getFromRow(n,".player-name");a&&j.setupNameValidation(a,()=>this.callbacks.clearDuplicateErrorsOnInput()),this.callbacks.clearDOMCache(),this.callbacks.updateAllGroupDropdowns(t),this.updatePlayerNumbers(),this.applyRankingModeToRow(n)}bulkAddPlayers(e){for(let t=0;t<e;t++)this.addPlayerRow()}removePlayerRow(e){let t=this.callbacks.findPlayerRow(e);if(!t)return;let r=this.callbacks.getPlayerRowsContainer();this.callbacks.removeAllEventListeners(t),r.removeChild(t),this.callbacks.updateAllGroupDropdowns(r),this.updatePlayerNumbers(),this.callbacks.clearDOMCache()}updatePlayerNumbers(){this.callbacks.getPlayerRowsContainer().querySelectorAll(".player-row").forEach((r,n)=>{let o=r.querySelector(".player-number");o&&(o.textContent=(n+1).toString())})}applyRankingModeToRow(e){let r=B("bracket-radio",$)?.checked??!1,n=b.getFromRow(e,".power-levels"),o=b.getFromRow(e,".bracket-levels");r&&n&&o?(n.style.display="none",o.style.display="block"):n&&o&&(n.style.display="block",o.style.display="none")}getPlayerRows(){let e=this.callbacks.getPlayerRowsContainer(),t=b.getAll(".player-row",e),r=[];for(let n=0;n<t.length;n++)r.push(t[n]);return r}applyRankingModeToAllRows(){this.getPlayerRows().forEach(t=>this.applyRankingModeToRow(t))}cleanup(){}};var fe=class{constructor(e){this.callbacks=e}handlePowerSelectorClick(e,t){e.preventDefault(),this.handleDropdownToggle(t,".power-selector-dropdown")}handleBracketSelectorClick(e,t){e.preventDefault(),this.handleDropdownToggle(t,".bracket-selector-dropdown")}closeAllDropdowns(){document.querySelectorAll(".bracket-selector-dropdown, .power-selector-dropdown").forEach(n=>{n.style.display="none",n.classList.remove("show")}),document.querySelectorAll(".power-selector-btn, .bracket-selector-btn").forEach(n=>{n.classList.remove("open")}),document.querySelectorAll(".player-row").forEach(n=>{n.classList.remove("dropdown-open")})}handleDropdownToggle(e,t){let r=this.callbacks.findPlayerRow(e);if(!r)return;let n=b.getFromRow(r,t);if(!n)return;let o=n.style.display!=="none";this.closeAllDropdowns(),o||(n.style.display="block",e.classList.add("open"),r.classList.add("dropdown-open"),setTimeout(()=>n.classList.add("show"),10))}handleDocumentClick(e){let t=e.target;if(!t)return;t.closest(".power-selector-btn")||t.closest(".power-selector-dropdown")||t.closest(".bracket-selector-btn")||t.closest(".bracket-selector-dropdown")||this.closeAllDropdowns()}hasOpenDropdowns(){let e=document.querySelectorAll(".bracket-selector-dropdown, .power-selector-dropdown");return Array.from(e).some(t=>t.style.display!=="none")}getOpenDropdown(){let e=document.querySelectorAll(".bracket-selector-dropdown, .power-selector-dropdown");for(let t of e)if(t.style.display!=="none")return t;return null}closeDropdown(e){document.querySelectorAll(e).forEach(a=>{a.style.display="none",a.classList.remove("show")});let r=e.includes("power")?".power-selector-btn":".bracket-selector-btn";document.querySelectorAll(r).forEach(a=>a.classList.remove("open")),document.querySelectorAll(".player-row.dropdown-open").forEach(a=>{a.querySelector(e)&&a.querySelector(e).style.display!=="none"||a.classList.remove("dropdown-open")})}cleanup(){this.closeAllDropdowns()}};var be=class{constructor(e){this.callbacks=e}handleRangeButtonClick(e){let t=this.callbacks.findPlayerRow(e);if(!t)return;let r=e.dataset.range,n=v.getPowerCheckboxes(t),[o,a]=r.split("-");G.selectRange(n,o,a),A.updatePowerButton(t)}handleBracketRangeButtonClick(e){let t=this.callbacks.findPlayerRow(e);if(!t)return;let r=e.dataset.range,n=v.getBracketCheckboxes(t);if(G.clearAll(n),r==="cedh"){let o=n.find(a=>a.value==="cedh");o&&(o.checked=!0)}else{let[o,a]=r.split("-").map(s=>s==="cedh"?s:parseInt(s));n.forEach(s=>{let i=s.value==="cedh"?"cedh":parseInt(s.value);(i===o||i===a)&&(s.checked=!0)})}A.updateBracketButton(t)}handleClearButtonClick(e){let t=this.callbacks.findPlayerRow(e);if(t){if(e.classList.contains("clear-btn")){let r=Array.from(b.getAllFromRow(t,'.power-checkbox input[type="checkbox"]'));G.clearAll(r),A.updatePowerButton(t)}else if(e.classList.contains("bracket-clear-btn")){let r=Array.from(b.getAllFromRow(t,'.bracket-checkbox input[type="checkbox"]'));G.clearAll(r),A.updateBracketButton(t)}}}handlePowerCheckboxChange(e){let t=this.callbacks.findPlayerRow(e);t&&A.updatePowerButton(t)}handleBracketCheckboxChange(e){let t=this.callbacks.findPlayerRow(e);t&&A.updateBracketButton(t)}};var ve=class{constructor(e){this.callbacks=e}initializeRankingModeToggle(){let e=S.getModeRadios(),t=()=>{if(S.isBracketMode()){document.body.classList.add("bracket-mode");let n=S.getLeniencyRadios();n.noLeniency&&(n.noLeniency.checked=!0)}else document.body.classList.remove("bracket-mode");this.callbacks.getPlayerRowManager().applyRankingModeToAllRows(),this.callbacks.getResetUndoManager().getIsRestoring()||v.getAllPlayerRows(this.callbacks.getPlayerRowsContainer()).forEach(o=>{this.clearAllSelections(o)})};e.powerLevel.addEventListener("change",t),e.bracket.addEventListener("change",t),t()}clearAllSelections(e){let t=v.getPowerCheckboxes(e);G.clearAll(t);let r=v.getBracketCheckboxes(e);G.clearAll(r),A.updatePowerButton(e),A.updateBracketButton(e)}toggleSidebar(e){let t=I(B("settings-sidebar",R),"settings-sidebar is required");e?t.classList.add("open"):t.classList.remove("open")}updateResultsCardVisibility(){let e=this.callbacks.getOutputSection(),t=this.callbacks.getResultsCard();e.children.length>0&&e.innerHTML.trim()!==""?(t.style.display="block",t.classList.add("has-content")):(t.style.display="none",t.classList.remove("has-content"))}};var we=class{constructor(e){this.callbacks=e}clearDuplicateErrorsOnInput(){let e=v.getAllPlayerRows(this.callbacks.getPlayerRowsContainer());x.clearDuplicateErrors(e),x.highlightDuplicateNames(e)}triggerValidationForAllFields(){let e=j.batchValidateRows(this.callbacks.getPlayerRowsContainer());O.trackValidationTime(e.validationTime),e.validationTime>100&&console.warn(`Slow validation detected: ${e.validationTime.toFixed(2)}ms`)}validatePlayerConfiguration(){return this.clearDuplicateErrorsOnInput(),this.triggerValidationForAllFields(),!0}};var Ee=class{constructor(){this.displayModeManager=null;this.helpManager=null;this.eventHandlingManager=null;this.currentPods=[];this.currentUnassigned=[];this.displayModeBtnBottom=null;this.reusablePlayerArray=[];this.reusableItemArray=[];this.reusablePlayerObject={};this.reusableGroupObject={};this.resetUndoManager=null;this.podGenerationManager=null;this.playerRowManager=null;this.dropdownManager=null;this.rangeSelectionManager=null;this.uiStateManager=null;this.validationCoordinator=null;try{this.playerRowsContainer=I(B("player-rows",R),"player-rows container is required"),this.outputSection=I(B("output-section",R),"output-section is required"),this.resultsCard=I(document.querySelector(".results-card"),"results-card is required"),this.displayModeBtn=I(B("display-mode-btn",z),"display-mode-btn is required"),this.playerRowTemplate=I(document.getElementById("player-row-template"),"player-row-template is required"),this.playerManager=new ie,this.podGenerator=new J,this.dragDropManager=new le(this.playerManager,(e,t)=>this.renderPods(e,t)),this.safeInitialization(),window.performanceMonitor=O}catch(e){console.error("Critical error during UIManager initialization:",e),H.show(H.INITIALIZATION_FAILED)}}safeInitialization(){try{this.initializeEventListeners()}catch(e){console.error("Error initializing event listeners:",e)}try{this.getUIStateManager().initializeRankingModeToggle()}catch(e){console.error("Error initializing ranking mode toggle:",e)}try{this.setupRealTimeValidationForExistingRows()}catch(e){console.error("Error setting up real-time validation:",e)}try{this.initializeResetUndoManager()}catch(e){console.error("Error initializing reset undo manager:",e)}}initializeEventListeners(){let e=this.getEventHandlingManager();e.initializeEventListeners(),e.setupEventDelegation(),e.initializeKeyboardShortcuts()}clearDOMCache(){b.clear(),q.clear()}async showErrorMessage(e){console.error("UIManager Error:",e),await F.showError("Error",e)}showSuccessMessage(e){console.log("UIManager Success:",e),F.showSuccess(e)}processGroupsSafely(){let e=new Map;try{this.playerManager.getGroups().forEach((t,r)=>{if(!t||t.length===0){console.warn(`Skipping empty group: ${r}`);return}if(!t.every(a=>a&&typeof a.power=="number")){console.warn(`Skipping group with invalid player data: ${r}`);return}let n=t.reduce((a,s)=>a+s.power,0),o=Math.round(n/t.length*2)/2;Object.assign(this.reusableGroupObject,{id:r,players:t,averagePower:o,size:t.length}),e.set(r,{...this.reusableGroupObject})})}catch(t){console.error("Error processing groups:",t)}return e}addEventListenerWithTracking(e,t,r){Le.addEventListener(e,t,r)}removeAllEventListeners(e){Le.removeAllFromElement(e)}setupRealTimeValidationForExistingRows(){b.getAll(".player-row",this.playerRowsContainer).forEach(t=>{let r=b.getFromRow(t,".player-name");r&&j.setupNameValidation(r,()=>this.getValidationCoordinator().clearDuplicateErrorsOnInput())})}handleContainerClick(e){let t=U(e,R);if(t){if(t.classList.contains("power-selector-btn")){this.handlePowerSelectorClick(e,t);return}if(t.classList.contains("bracket-selector-btn")){this.handleBracketSelectorClick(e,t);return}if(t.classList.contains("range-btn")){this.getRangeSelectionManager().handleRangeButtonClick(t);return}if(t.classList.contains("bracket-range-btn")){this.getRangeSelectionManager().handleBracketRangeButtonClick(t);return}if(t.classList.contains("clear-btn")||t.classList.contains("bracket-clear-btn")){this.getRangeSelectionManager().handleClearButtonClick(t);return}if(t.classList.contains("remove-player-btn")){this.handleRemoveButtonClick(t);return}}}handleContainerChange(e){let t=U(e,R);if(t){if(t.classList.contains("group-select")){this.playerManager.handleGroupChange(this.playerRowsContainer);return}if($(t)&&t.type==="checkbox"&&t.closest(".power-checkbox")){this.getRangeSelectionManager().handlePowerCheckboxChange(t);return}if($(t)&&t.type==="checkbox"&&t.closest(".bracket-checkbox")){this.getRangeSelectionManager().handleBracketCheckboxChange(t);return}if(t.classList.contains("player-name")&&$(t)){this.handlePlayerNameChange(t);return}}}handleContainerInput(e){let t=U(e,R);if(t&&t.classList.contains("player-name")){let r=U(e,$);r&&this.handlePlayerNameChange(r);return}}handleDocumentClick(e){let t=U(e,R);t&&!t.closest(".power-selector-btn")&&!t.closest(".power-selector-dropdown")&&!t.closest(".bracket-selector-btn")&&!t.closest(".bracket-selector-dropdown")&&this.getDropdownManager().closeAllDropdowns()}closeAllDropdowns(){this.getDropdownManager().closeAllDropdowns()}handlePowerSelectorClick(e,t){this.getDropdownManager().handlePowerSelectorClick(e,t)}handleBracketSelectorClick(e,t){this.getDropdownManager().handleBracketSelectorClick(e,t)}findPlayerRow(e){return e.closest(".player-row")}handleRemoveButtonClick(e){this.getPlayerRowManager().removePlayerRow(e)}handlePlayerNameChange(e){}getPlayerRowsOptimized(){return this.getPlayerRowManager().getPlayerRows()}clearReusableArrays(){this.reusablePlayerArray.length=0,this.reusableItemArray.length=0,this.reusablePlayerObject={},this.reusableGroupObject={}}createElement(e){return q.get(e)}addPlayerRow(){this.getPlayerRowManager().addPlayerRow()}bulkAddPlayers(e){this.getPlayerRowManager().bulkAddPlayers(e)}initializeResetUndoManager(){this.resetUndoManager||(this.resetUndoManager=new de({addPlayerRow:()=>this.addPlayerRow(),clearPlayerRowsContainer:()=>{this.playerRowsContainer.innerHTML=""},cleanupBottomDisplayButton:()=>this.cleanupBottomDisplayButton(),clearOutputSection:()=>{this.outputSection.innerHTML=""},updateResultsCardVisibility:()=>this.getUIStateManager().updateResultsCardVisibility(),hideDisplayModeBtn:()=>{this.displayModeBtn.style.display="none"},clearGroups:()=>this.playerManager.clearGroups(),resetPlayerIds:()=>this.playerManager.resetPlayerIds(),resetGroupIds:()=>this.playerManager.resetGroupIds(),renderPods:(e,t)=>this.renderPods(e,t),handleGroupChange:e=>this.playerManager.handleGroupChange(e),updateButtonTextsForRow:e=>this.updateButtonTextsForRow(e),showSuccessMessage:e=>this.showSuccessMessage(e),closeAllDropdowns:()=>this.closeAllDropdowns(),getCurrentPods:()=>this.currentPods,getCurrentUnassigned:()=>this.currentUnassigned,setCurrentPods:e=>{this.currentPods=e},setCurrentUnassigned:e=>{this.currentUnassigned=e},setIsRestoring:e=>{},getPlayerRowsContainer:()=>this.playerRowsContainer,createElement:e=>this.createElement(e)}))}initializePodGenerationManager(){this.podGenerationManager||(this.podGenerationManager=new ue({getPlayerRowsOptimized:()=>this.getPlayerRowsOptimized(),getPlayerFromRow:e=>this.playerManager.getPlayerFromRow(e),getGroups:()=>this.playerManager.getGroups(),handleGroupChange:e=>this.playerManager.handleGroupChange(e),cleanupBottomDisplayButton:()=>this.cleanupBottomDisplayButton(),setDisplayModeBtnBottom:e=>{this.displayModeBtnBottom=e},updateResultsCardVisibility:()=>this.getUIStateManager().updateResultsCardVisibility(),setCurrentPods:(e,t)=>{this.currentPods=e,this.currentUnassigned=t,this.dragDropManager.setCurrentPods(e,t)},showSuccessMessage:e=>this.showSuccessMessage(e),clearAllToasts:()=>F.clearErrorToasts(),getOutputSection:()=>this.outputSection,getDisplayModeBtn:()=>this.displayModeBtn,getPlayerRowsContainer:()=>this.playerRowsContainer,createElement:e=>this.createElement(e),enterDisplayMode:e=>this.getDisplayModeManager().enterDisplayMode(e),addDragDropListeners:(e,t,r,n,o)=>{e.draggable=!0,e.dataset.itemType=t,e.dataset.itemId=r,e.dataset.podIndex=n,e.dataset.itemIndex=o,e.addEventListener("dragstart",this.dragDropManager.handleDragStart),e.addEventListener("dragend",this.dragDropManager.handleDragEnd)},addPodDropListeners:e=>{e.addEventListener("dragover",this.dragDropManager.handleDragOver),e.addEventListener("drop",this.dragDropManager.handleDrop),e.addEventListener("dragleave",this.dragDropManager.handleDragLeave)}}))}getResetUndoManager(){return this.resetUndoManager||this.initializeResetUndoManager(),this.resetUndoManager}getPodGenerationManager(){return this.podGenerationManager||this.initializePodGenerationManager(),this.podGenerationManager}resetAll(){this.getResetUndoManager().resetAll()}cleanupBottomDisplayButton(){if(this.displayModeBtnBottom){let e=this.displayModeBtnBottom.parentNode;e&&e.parentNode&&e.parentNode.removeChild(e),this.displayModeBtnBottom=null}}async generatePods(){await this.getPodGenerationManager().generatePods()}renderPods(e,t=[]){this.getPodGenerationManager().renderPods(e,t)}getDisplayModeManager(){return this.displayModeManager||(this.displayModeManager=new ce),this.displayModeManager}getHelpManager(){return this.helpManager||(this.helpManager=new he({})),this.helpManager}getEventHandlingManager(){return this.eventHandlingManager||(this.eventHandlingManager=new me({addPlayerRow:()=>this.addPlayerRow(),bulkAddPlayers:e=>this.bulkAddPlayers(e),removePlayerRow:e=>this.handleRemoveButtonClick(e),updatePlayerNumbers:()=>this.updatePlayerNumbers(),clearDOMCache:()=>this.clearDOMCache(),findPlayerRow:e=>this.findPlayerRow(e),removeAllEventListeners:e=>this.removeAllEventListeners(e),toggleSidebar:e=>this.getUIStateManager().toggleSidebar(e),handleGroupChange:()=>this.playerManager.handleGroupChange(this.playerRowsContainer),handlePlayerNameChange:e=>this.handlePlayerNameChange(e),clearDuplicateErrorsOnInput:()=>this.getValidationCoordinator().clearDuplicateErrorsOnInput(),handleRangeButtonClick:e=>this.getRangeSelectionManager().handleRangeButtonClick(e),handleBracketRangeButtonClick:e=>this.getRangeSelectionManager().handleBracketRangeButtonClick(e),handleClearButtonClick:e=>this.getRangeSelectionManager().handleClearButtonClick(e),handlePowerCheckboxChange:e=>this.getRangeSelectionManager().handlePowerCheckboxChange(e),handleBracketCheckboxChange:e=>this.getRangeSelectionManager().handleBracketCheckboxChange(e),generatePods:()=>this.getPodGenerationManager().generatePods(),getResetUndoManager:()=>this.getResetUndoManager(),getPodGenerationManager:()=>this.getPodGenerationManager(),getHelpManager:()=>this.getHelpManager()})),this.eventHandlingManager}getPlayerRowManager(){return this.playerRowManager||(this.playerRowManager=new ye({getPlayerRowsContainer:()=>this.playerRowsContainer,getPlayerRowTemplate:()=>this.playerRowTemplate,getNextPlayerId:()=>this.playerManager.getNextPlayerId(),updateAllGroupDropdowns:e=>this.playerManager.updateAllGroupDropdowns(e),clearDOMCache:()=>this.clearDOMCache(),removeAllEventListeners:e=>this.removeAllEventListeners(e),clearDuplicateErrorsOnInput:()=>this.getValidationCoordinator().clearDuplicateErrorsOnInput(),findPlayerRow:e=>this.findPlayerRow(e)})),this.playerRowManager}getDropdownManager(){return this.dropdownManager||(this.dropdownManager=new fe({findPlayerRow:e=>this.findPlayerRow(e)})),this.dropdownManager}getRangeSelectionManager(){return this.rangeSelectionManager||(this.rangeSelectionManager=new be({findPlayerRow:e=>this.findPlayerRow(e),triggerValidation:()=>this.getValidationCoordinator().triggerValidationForAllFields(),clearAllSelections:()=>{this.getPlayerRowsOptimized().forEach(t=>this.getUIStateManager().clearAllSelections(t))},updateUI:()=>{this.getValidationCoordinator().triggerValidationForAllFields()},showError:e=>F.showError("Range Selection",e),getCurrentMode:()=>document.getElementById("bracket-radio")?.checked?"bracket":"power"})),this.rangeSelectionManager}getUIStateManager(){return this.uiStateManager||(this.uiStateManager=new ve({getPlayerRowManager:()=>this.getPlayerRowManager(),getResetUndoManager:()=>this.getResetUndoManager(),getPlayerRowsContainer:()=>this.playerRowsContainer,getOutputSection:()=>this.outputSection,getResultsCard:()=>this.resultsCard,triggerValidation:()=>this.getValidationCoordinator().triggerValidationForAllFields()})),this.uiStateManager}getValidationCoordinator(){return this.validationCoordinator||(this.validationCoordinator=new we({getPlayerRowsContainer:()=>this.playerRowsContainer,clearErrorUI:()=>{this.playerRowsContainer.querySelectorAll(".error").forEach(t=>t.classList.remove("error"))},getPlayerRows:()=>this.playerRowsContainer.querySelectorAll(".player-row")})),this.validationCoordinator}updateButtonTextsForRow(e){A.updateAllButtonsForRow(e)}updatePlayerNumbers(){this.getPlayerRowManager().updatePlayerNumbers()}cleanup(){this.eventHandlingManager&&(this.eventHandlingManager.cleanup(),this.eventHandlingManager=null),this.resetUndoManager&&(this.resetUndoManager.cleanup(),this.resetUndoManager=null),this.displayModeManager&&(this.displayModeManager=null),this.helpManager&&(this.helpManager=null),this.playerRowManager&&(this.playerRowManager.cleanup(),this.playerRowManager=null),this.dropdownManager&&(this.dropdownManager.cleanup(),this.dropdownManager=null),this.clearDOMCache(),this.clearReusableArrays()}};function Ve(){let t=Math.floor(Math.random()*360),r=25,n=[];for(let s=0;s<50;s++){let l=(t+s*137.5)%360;n.push(Math.round(l))}let o="";for(let s=1;s<=50;s++){let i=n[s-1],l=70+Math.floor(Math.random()*20),d=50,u=28+Math.floor(Math.random()*8);o+=`
.player-row .group-select.group-${s} {
border-color: hsl(${i}, ${l}%, ${d}%) !important;
background-color: hsl(${i}, ${l}%, ${u}%) !important;
}`,o+=`
.group-select option[value="group-${s}"] {
background-color: hsl(${i}, ${l}%, ${u}%);
}`}let a=q.get("style");a.id="dynamic-group-colors",a.textContent=o,document.head.appendChild(a)}document.addEventListener("DOMContentLoaded",()=>{Ve(),F.clearAllToasts(),new Ee().resetAll()});})();