1const Zubrowisko = { 2 message: function (text, status = "error") { 3 const m = new Monit(); 4 const color = status == "ok" ? "#0f6e28" : "#b90204"; 5 const container = document.createElement("div"); 6 container.style.textAlign = "center"; 7 const p = document.createElement("p"); 8 p.style.color = color; 9 p.style.fontWeight = "700"; 10 p.innerHTML = text; 11 container.appendChild(p); 12 const cb = document.createElement("button"); 13 cb.onclick = function () { 14 m.close(); 15 }; 16 cb.textContent = "Zamknij"; 17 cb.style.display = "inline-block"; 18 cb.style.backgroundColor = color; 19 cb.style.color = "#ffffff"; 20 cb.style.border = "none"; 21 cb.style.padding = "8px 20px"; 22 cb.style.fontSize = "16px"; 23 cb.style.cursor = "pointer"; 24 cb.style.borderRadius = "8px"; 25 cb.style.fontWeight = "700"; 26 container.appendChild(cb); 27 m.show(container); 28 }, 29 getVotes: function () { 30 fetch("/skrypty/zubrowisko/actions.php?action=votes") 31 .then((response) => { 32 if (!response.ok) { 33 throw new Error( 34 `BÅÄ d sieci: ${response.status} ${response.statusText}`, 35 ); 36 } 37 return response.json(); 38 }) 39 .then((data) => { 40 if (data.status == "ok") { 41 Zubrowisko.updateVotes(data.data); 42 } else { 43 throw new Error(`BÅÄ d danych: ${data.data}`); 44 } 45 }) 46 .catch((error) => { 47 console.error( 48 "WystÄ piÅ bÅÄ d podczas pobierania danych:", 49 error.message, 50 ); 51 }); 52 }, 53 sortByVotes: function () { 54 const section = document.querySelector("div.voting-module"); 55 const cards = Array.from(section.querySelectorAll(".team-card")); 56 cards.sort((a, b) => { 57 const votesA = parseInt(a.getAttribute("data-votes"), 10); 58 const votesB = parseInt(b.getAttribute("data-votes"), 10); 59 return votesB - votesA; // malejÄ co 60 }); 61 cards.forEach((card) => section.appendChild(card)); 62 section.classList.remove("voting-module-hidden"); 63 }, 64 updateVotes: function (teams) { 65 let totalVotes = teams.reduce((sum, t) => sum + t[1], 0); 66 67 teams.forEach((team, index) => { 68 const [id, votes] = team; 69 const percent = totalVotes 70 ? ((votes / totalVotes) * 100).toFixed(1) 71 : 0; 72 document.getElementById(`z${id}`).setAttribute("data-votes", votes); 73 document.querySelector(`#z${id} .bar-votes`).textContent = `${votes} gÅosów`; 74 document.querySelector(`#z${id} .bar span`).style.width = `${percent}%`; 75 document.querySelector(`#z${id} .bar-percentage`).textContent = `${percent}%`; 76 }); 77 Zubrowisko.sortByVotes(); 78 }, 79 sendVote: function (id, fb_token) { 80 const formData = new FormData(); 81 formData.append("id", id); 82 formData.append("fb_token", fb_token); 83 84 fetch("/skrypty/zubrowisko/actions.php?action=vote", { 85 method: "POST", 86 body: formData, 87 }) 88 .then((res) => { 89 if (!res.ok) throw new Error(`BÅÄ d sieci: ${res.status}`); 90 return res.json(); 91 }) 92 .then((data) => { 93 if (data.status == "ok") { 94 Zubrowisko.message( 95 "DziÄkujemy za oddanie gÅosu na wybrany zespóÅ! Twój gÅos zostaÅ zapisany.<br>Już jutro bÄdziesz mieÄ kolejnÄ okazjÄ, aby wesprzeÄ swój ulubiony zespóÅ.", 96 "ok", 97 ); 98 Zubrowisko.updateVotes(data.data); 99 } else { 100 Zubrowisko.message(data.data); 101 } 102 }) 103 .catch((error) => { 104 console.error("BÅÄ d podczas wysyÅania gÅosu:", error.message); 105 Zubrowisko.message( 106 "WystÄ piÅ bÅÄ d poÅÄ czenia. Spróbuj ponownie.", 107 ); 108 }); 109 }, 110 checkUrlForToken: function() { 111 const hash = window.location.hash; 112 if (hash.includes('access_token=')) { 113 const params = new URLSearchParams(hash.substring(1)); 114 const accessToken = params.get('access_token'); 115 116 // ZMIANA: Używamy localStorage zamiast sessionStorage 117 const pendingVoteId = localStorage.getItem('zubrowisko_pending_vote'); 118 119 // Czyszczenie paska adresu 120 history.replaceState(null, null, window.location.pathname + window.location.search); 121 122 if (accessToken && pendingVoteId) { 123 localStorage.removeItem('zubrowisko_pending_vote'); 124 Zubrowisko.sendVote(pendingVoteId, accessToken); 125 } else if (accessToken && !pendingVoteId) { 126 // ZMIANA: Dodany komunikat bÅÄdu, żeby skrypt nie umieraÅ po cichu, gdy ID zginie 127 Zubrowisko.message("Zalogowano pomyÅlnie, ale utracono informacjÄ o wybranym zespole. Kliknij przycisk 'GÅosuj' ponownie na swoim zespole."); 128 } 129 } 130 }, 131 132 vote: function (id) { 133 if (typeof FB === 'undefined') { 134 Zubrowisko.message('Trwa Åadowanie skryptów Facebooka. Spróbuj kliknÄ Ä przycisk "GÅosuj" za chwilÄ.'); 135 return; 136 } 137 138 const loginStatus = FB.getAuthResponse(); 139 140 if (loginStatus && loginStatus.accessToken) { 141 Zubrowisko.sendVote(id, loginStatus.accessToken); 142 return; 143 } 144 145 // ZMIANA: Zapis do localStorage, nie sessionStorage 146 localStorage.setItem('zubrowisko_pending_vote', id); 147 148 // Bardziej rygorystyczna detekcja dla Årodowiska mobilnego
149 const isMobile = window.innerWidth <= 768 || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 150 151 if (isMobile) { 152 // ARCHITEKTURA MOBILNA: RÄczne przekierowanie OAuth. 153 // Nie ufamy FB.login na smartfonach ze wzglÄdu na konflikty z aplikacjÄ natywnÄ . 154 const clientId = '303994802962884'; 155 //const redirectUri = encodeURIComponent(window.location.href.split('#')[0]); 156 const redirectUri = encodeURIComponent('https://www.pless.pl/zubrowisko/'); 157 158 // Wymuszamy najnowszÄ stabilnÄ wersjÄ API dla przekierowaÅ rÄcznych (v19.0). 159 // Wersja v24.0 z Twojego FB.init jeszcze oficjalnie nie istnieje w dokumentacji OAuth i może generowaÄ bÅÄdy. 160 const oauthUrl = `https://www.facebook.com/v24.0/dialog/oauth?client_id=${clientId}&redirect_uri=${redirectUri}&response_type=token&scope=public_profile`; 161 162 window.location.href = oauthUrl; 163 } else { 164 // ARCHITEKTURA DESKTOPOWA: DziaÅa bez zarzutu z użyciem FB JS SDK 165 FB.login( 166 function (response) { 167 if (response.authResponse) { 168 Zubrowisko.sendVote(id, response.authResponse.accessToken); 169 } else { 170 // Okno pop-up po prostu zamkniÄte krzyżykiem na komputerze 171 Zubrowisko.message("Logowanie nie powiodÅo siÄ lub zostaÅo anulowane."); 172 } 173 }, 174 { 175 scope: "public_profile", 176 auth_type: "rerequest" 177 } 178 ); 179 } 180 } 181}; 182 183// Po wczytaniu DOM natychmiastowo sprawdzamy, czy w pasku adresu nie ma tokena logowania 184// zdefiniowanego przez Facebooka po wykonaniu przekierowania OAuth. 185document.addEventListener('DOMContentLoaded', () => { 186 Zubrowisko.checkUrlForToken(); 187});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.