PageSourceSearch

https://www.pless.pl/skrypty/zubrowisko/scripts_v2.js?v=1

js pless.pl collected 2026-10-02 05:28:56 UTC 6,701 bytes, 187 lines download raw bytes

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.