PageSourceSearch

https://psychomedic.online/wp-content/themes/astra-child/js/globalne.js?v=?051220251607

js psychomedic.online collected 2026-09-26 02:59:52 UTC 14,437 bytes, 432 lines download raw bytes

1//HEADER
2
3
4if (!document.body.classList.contains('elementor-editor-active')) {
5		document.querySelectorAll('.kontener_slider .menu_slide1 li.menu-item')
6				.forEach(li => li.addEventListener('click', () => {
7			const span   = li.querySelector('span[menu3]');
8			if (!span) return;                       // brak <span> – nic nie rób
9			const klucz = span.getAttribute('menu3'); // np. "warszawa"
10
11			// 2) Ukryj wszystkie .menu_slide2
12			document.querySelectorAll('.kontener_slider .menu_slide2')
13					.forEach(el => el.style.display = 'none');
14
15			// 3) Pokaż ten, który ma ten sam atrybut
16			const cel = document.querySelector(`.kontener_slider .menu_slide2[menu3="${klucz}"]`);
17			if (cel) {
18				cel.style.display = 'block';
19				fokusujPierwszyButtonSlide2(cel);   // ← NOWA LINIA
20			}
21		}));
22
23
24		/* ———  UKRYWANIE SLIDE’A (cofnij)  ——— */
25		function schowajSlide(btn) {
26			const slide = btn.closest('.menu_slide2');         // rodzic .menu_slide2
27			if (!slide) return;
28
29			const klucz = slide.getAttribute('menu3');         // np. „warszawa”
30			slide.style.display = 'none';
30                      // ukryj obecny slide
31			
32			/* ► Przenieś fokus na pierwszy li.menu-item otwartego slide1 */
33			const widocznySlide1 = Array.from(
34				document.querySelectorAll('.kontener_slider .menu_slide1')
35			).find(el => getComputedStyle(el).display !== 'none');
36
37			if (widocznySlide1) {
38				fokusujPierwszyLiWSlide1(widocznySlide1);
39			}
40		}
41
42		/* Delegacja zdarzeń na cały kontener, by działało także dla przyszłych elementów */
43		const kontener = document.querySelectorAll('.kontener_slider');
44		
45		kontener.forEach((el)=>{
46			/* Kliknięcie myszką */
47			el.addEventListener('click', (e) => {
48				const btn = e.target.closest('.menu_slide2 .menu_cofnij_btn');
49				if (btn) schowajSlide(btn);
50			});
51
52			/* Enter z klawiatury (keydown — bo keyup nie łapie we wszystkich przeglądarkach) */
53			el.addEventListener('keydown', (e) => {
54				if (e.key !== 'Enter') return;
55				const btn = e.target.closest('.menu_slide2 .menu_cofnij_btn');
56				if (btn) {
57					e.preventDefault();            // żeby np. <button> nie wysłał formularza
58					schowajSlide(btn);
59				}
60			});
61		})
62		
63
64
65		function zamknijGlowneMenu() {
66			// obsłuż i ID, i klasę – użyj jednego z nich, jeśli znasz właściwy
67			const glowny = document.querySelector('#glowny_kontener_menu, .glowny_kontener_menu');
68			if (glowny) glowny.style.display = 'none';
69			// Usuń klasę .rozwiniete z wszystkich pozycji w głównym menu
70		    document
71		      .querySelectorAll('.glowne_menu li.menu-item.rozwiniete')
72		      .forEach(item => item.classList.remove('rozwiniete'));
73		}
74
75		/* kliknięcie .menu_zamknij_btn (globalnie – może być poza .kontener_slider) */
76		document.addEventListener('click', (e) => {
77			if (e.target.closest('.menu_zamknij_btn')) {
78				zamknijGlowneMenu();
79			}
80		});
81
82		/* Enter na .menu_zamknij_btn */
83		document.addEventListener('keydown', (e) => {
84			if (e.key !== 'Enter') return;
85			if (e.target.closest('.menu_zamknij_btn')) {
86				e.preventDefault();
87				zamknijGlowneMenu();
88			}
89		});
90
91
92		/* ———  POKAZYWANIE .menu_slide1 NA PODSTAWIE menu2  ——— */
93		function pokazSlide1DlaMenu2(klucz, sidebar) {
94			// 0) Usuń klasę .rozwiniete tylko w tym sidebarze
95			if (sidebar) {
96				sidebar
97				  .querySelectorAll('li.menu-item.rozwiniete')
98				  .forEach(li => li.classList.remove('rozwiniete'));
99			}
100
101			const podmenu = sidebar.closest('.kontener_podmenu');
102			if (!podmenu) return;  // brak kontekstu – nic nie rób
103			
104			
105			 // 2) W jego obrębie znajdź slider
106			const kontener = podmenu.querySelector('.kontener_slider');
107			if (!kontener) return;
108	
109			// 1) Ukryj wszystkie .menu_slide2
110			kontener.querySelectorAll('.kontener_slider .menu_slide2')
111					.forEach(el => el.style.display = 'none');
112
113			// 2) Ukryj wszystkie .menu_slide1
114			kontener.querySelectorAll('.kontener_slider .menu_slide1')
115					.forEach(el => el.style.display = 'none');
116
117			// 3) Pokaż ten, który ma ten sam atrybut menu2
118			const docelowy = kontener.querySelector(`.kontener_slider .menu_slide1[menu2="${klucz}"]`);
119			if (docelowy) {
120				docelowy.style.display = 'flex';
121				fokusujPierwszyLiWSlide1(docelowy);
122			}
123		}
124
125		// pobieramy wszystkie sidebary
126		 document.querySelectorAll('.menu_sidebar')
127		   .forEach(sidebar => {
128		     /* Kliknięcie myszką */
129		     sidebar.addEventListener('click', e => {
130		       const li = e.target.closest('li.menu-item');
131		       if (!li) return;
132		
133		      const span = li.querySelector('span[menu2]');
134		       if (!span) return;
135		
136		       const klucz = span.getAttribute('menu2');
137		       // czyścimy wszystkie rozwiniete
138		       sidebar
139				  .querySelectorAll('li .menu_rodzic_right.rozwiniete')
140				  .forEach(el => el.classList.remove('rozwiniete'));
141		
142		       pokazSlide1DlaMenu2(klucz, sidebar);
143		
144		       const rodzicRight = li.querySelector('.menu_rodzic_right');
145		       if (rodzicRight) rodzicRight.classList.add('rozwiniete');
146		     });
147		
148		     /* Naciśnięcie Enter */
149		     sidebar.addEventListener('keydown', e => {
150		       if (e.key !== 'Enter') return;
151		       const li = e.target.closest('li.menu-item');
152		       if (!li) return;
153		
154		       const span = li.querySelector('span[menu2]');
155		       if (!span) return;
156		       e.preventDefault();
157		
158		       const klucz = span.getAttribute('menu2');
159		       sidebar
160				  .querySelectorAll('li .menu_rodzic_right.rozwiniete')
161				  .forEach(el => el.classList.remove('rozwiniete'));
162		
163		       pokazSlide1DlaMenu2(klucz, sidebar);
164		
165		       const rodzicRight = li.querySelector('.menu_rodzic_right');
166		       if (rodzicRight) rodzicRight.classList.add('rozwiniete');
167		     });
168		   });
169
170
171		/* —— 1. Funkcja pomocnicza: ukrywa wszystko —— */
172		function zamknijWszystkiePodmenu() {
173			document.querySelectorAll('.kontener_podmenu')
174					.forEach(el => el.style.display = 'none');
175		}
176
177		/* —— 2. Obsługa jednego kliknięcia / Enter —— */
178		function obsluzKlikLubEnter(li) {
179			if (li.classList.contains('rozwiniete')) {
180		        zamknijGlowneMenu();
181		        return;
182		    }
183
184			// 0) Usuń klasę .rozwiniete ze wszystkich elementów w głównym menu
185			document
186			  .querySelectorAll('.glowne_menu li.menu-item.rozwiniete')
187			  .forEach(el => el.classList.remove('rozwiniete'));
188	  
189			zamknijWszystkiePodmenu();          // zawsze najpierw reset
190
191			const span   = li.querySelector('span[menu1]');
192			const glowny = document.querySelector('.glowny_kontener_menu');
193
194			if (span) {                         // <span menu1="…"> istnieje
195				const klucz   = span.getAttribute('menu1');
196				const podmenu = document.querySelector(`.kontener_podmenu[menu1="${klucz}"]`);
197				if (podmenu) {
198					podmenu.style.display = 'block';
199					przeniesFokusNaSidebar(podmenu);   // ← NOWA LINIA
200				}
201				if (glowny)  glowny.style.display  = 'block';
202				
203				// b) Dodaj klasę .rozwiniete do .menu_rodzic_down w klikniętym li
204				li.classList.add('rozwiniete');
205		
206			} else {                            // brak <span> ⇒ chowamy kontener
207				if (glowny) glowny.style.display = 'none';
208			}
209		}
210
211		/* —— 3. Dodajemy nasłuch do KAŻDEGO li.menu-item —— */
212		document.querySelectorAll('.glowne_menu ul li.menu-item').forEach(li => {
213
214			/* Klik myszą */
215			li.addEventListener('click', () => obsluzKlikLubEnter(li));
216
217			/* Enter z klawiatury */
218			li.addEventListener('keydown', e => {
219				if (e.key !== 'Enter') return;
220				e.preventDefault();             // blokuje np. przewinięcie strony
221				obsluzKlikLubEnter(li);
222			});
223
224			/* (opcjonalnie) Jeśli <li> nie jest fokusowalne,
225			   odkomentuj linię poniżej, by działał Enter: */
226			// li.setAttribute('tabindex', '0');
227		});
228
229
230		/* —— Ustaw fokus na pierwszym li.menu-item w sidebarze —— */
231		function przeniesFokusNaSidebar(podmenu) {
232			// pierwszy li.menu-item w otwartym pod‑menu
233			const firstLi = podmenu.querySelector('.menu_sidebar ul li.menu-item');
234			if (!firstLi) return;
235
236			// jeżeli <li> zawiera <a>/<button> lub element z tabindex,
237			// skupiamy się na nim – inaczej na samym <li>
238			const target = firstLi.querySelector('a, button, [tabindex]') || firstLi;
239
240			// upewnij się, że element jest fokusowalny
241			if (target === firstLi && !target.hasAttribute('tabindex')) {
242				target.setAttribute('tabindex', '-1'); // -1 ⇒ fokusowalny, ale nie w kolejności TAB
243			}
244
245			// minimalne opóźnienie, by mieć pewność, że DOM jest już widoczny
246			setTimeout(() => target.focus(), 0);
247		}
248
249		/* —— Fokus na pierwszym li.menu-item w slide1 —— */
250		function fokusujPierwszyLiWSlide1(slide1) {
251			const firstLi = slide1.querySelector('ul li.menu-item');
252			if (!firstLi) return;
253
254			const target = firstLi.querySelector('a, button, [tabindex]') || firstLi;
255
256			if (target === firstLi && !target.hasAttribute('tabindex')) {
257				target.setAttribute('tabindex', '-1');   // element staje się fokusowalny
258			}
259
260			setTimeout(() => target.focus(), 0);         // minimalne opóźnienie – pewność, że widać
261		}
262
263		function fokusujPierwszyButtonSlide2(slide2) {
264			const btn = slide2.querySelector('.elementor-button');
265			if (!btn) return;
266
267			setTimeout(() => btn.focus(), 0);         // mikro‑opóźnienie, by mieć pewność widoczności
268		}
269}
270
271
272
273
274//OBSŁUGA IFRAMÓW
275
276
277
278
279
280
281 
282			window.addEventListener("message", function(event) {
283			
284			console.log( "Wiadomość z ramki:", event.data );  
285			console.log( "Wiadomość z ramki:", event.data.type);  
286			if(event.data.type !== undefined && event.data.type==='registerToVisit') 
287			{			  	  
288						dataLayer.push ({ 'event':  'godzina', 'godz':  {'godzina':  event.data.data.slot }  })  ;  
289							  
290						window.scrollTo({ top: 0, behavior: 'smooth' });
291						iframe.style.height = '1000px';	   
292			} 
293			
294			if (event.data.type !== undefined && event.data.type === 'resize') { 
295					var height = crossDomainMessage.data.data.height; 
296					iframe.style.height = height+20+'px';	 
297			}  
298		  
299			if ( event.data.data.event!== undefined && event.data.data.event === 'pp.proceedWithoutLogin' ) dataLayer.push ({ 'event':  'proceedwithoutloginBtnClick' })  ;  	
300			if ( event.data.data.event!== undefined && event.data.data.event === 'pp.createAccount' ) dataLayer.push ({ 'event':  'createAccountBtnClick' })  ; 		
301			if ( event.data.data.event!== undefined && event.data.data.event === 'registered' ) {   
302					dataLayer.push ({ 'event':  'umowienieWizyty' , 
303						'daneWizyty':  
304							{		//'godzina': event.data.data.slot, 
305									'value': parseInt(event.data.data.value, 10),
306									'doktor':  event.data.data.doctor.lastname+' '+event.data.data.doctor.name,
307									'doktoruuid':  event.data.data.doctor.uuid, 
308							}
309						  
310					})  ; 
311				}		 
312		 
313
314		}) ;    
315 
316
317
318
319
320		(function() {
321			 
322			 if(document.querySelectorAll('#myIframe').length > 0){
323				 var iframe = document.getElementById('myIframe'); 
324				iframe.scrolling = 'no';
325				
326				window.onmessage = function (crossDomainMessage) {  
327					 
328					
329					if (crossDomainMessage.data.type !== undefined && crossDomainMessage.data.type == 'registerToVisit'){
330						window.scrollTo({ top: 0, behavior: 'smooth' });
331						iframe.style.height = '1000px';			
332					}
333					
334					if ( crossDomainMessage.data.type !== undefined && crossDomainMessage.data.type == 'resize') { 
335						var height = crossDomainMessage.data.data.height;  
336						iframe.style.height = height+20+'px'; 
337					}  
338					if ( crossDomainMessage.data.type !== undefined && crossDomainMessage.data.type == 'doctorClick') {   
339						fetch('/impDataApp/mydoctor.json') 
340							  .then(response => response.json())
341							  .then(data => {    //				    console.log(crossDomainMessage.data.data.uuid);
342								var result = data.find(item =>item.UUID  ===  crossDomainMessage.data.data.uuid );
343								// if(typeof result !== undefined ) { location.href= result.link2;   }else{ }
344									location.href= result.link2;   
345							  })
346							  .catch(error => { 
347								console.error('Wystąpił błąd podczas pobierania danych:', error);
348							  });  
349					}   
350				}
351			 }  
352		})(); 
353		
354		
355		// WYWOŁANIE FORMULARZA WYSZUKIWARKI 
356		jQuery('.form-col.submit button').on('click', function (e) {
357			e.preventDefault();
358
359			// Szukamy tylko w obrębie konkretnej instancji wyszukiwarki (shortcodu)
360			const root = this.closest('.c-app.minApp');
361			if (!root) return;
362
363			// Klinika / miasto
364			const klinikaOpt = root.querySelector(
365				'.form-col.clinic .custom-select-option.is-selected'
366			);
367			const klinikaID = klinikaOpt ? klinikaOpt.getAttribute('data-value') : '';
368
369			// Specjalność
370			const specjalnoscOpt = root.querySelector(
371				'.form-col.specialty .custom-select-option.is-selected'
372			);
373			const specjalnoscID = specjalnoscOpt ? specjalnoscOpt.getAttribute('data-value') : '';
374
375			// Lekarz(e) – multi-select (zaznaczone w danym shortcodzie)
376			const lekarzID = Array.from(
377				root.querySelectorAll('.form-col.doctor .custom-select-option.zaznaczone')
378			)
379				.map((el) => el.getAttribute('data-value'))
380				.join('||');
381
382			// Godziny
383			let startTimeEl = root.querySelector('#timeMyStart');
384			let endTimeEl = root.querySelector('#timeMyEnd');
385			let startTime = startTimeEl ? startTimeEl.value : '';
386			let endTime = endTimeEl ? endTimeEl.value : '';
387
388			if (startTime) {
389				startTime = startTime.replace(':', '%3A');
390			}
391			if (endTime) {
392				endTime = endTime.replace(':', '%3A');
393			}
394
395			// Daty
396			let startDateEl = root.querySelector('#dateStart');
397			let endDateEl = root.querySelector('#dateEnd');
398			let startDate = startDateEl ? startDateEl.value : '';
399			let endDate = endDateEl ? endDateEl.value : '';
400
401			if (startDate !== '') {
402				let parts = startDate.split('-'); // Y-m-d
403				startDate = parts[2] + '%2F' + parts[1] + '%2F' + parts[0]; // d/m/Y
404			} else {
405				startDate = '';
406			}
407
408			if (endDate !== '') {
409				let parts = endDate.split('-');
410				endDate = parts[2] + '%2F' + parts[1] + '%2F' + parts[0];
411			} else {
412				endDate = '';
413			}
414
415			const url =
416				'/wyszukiwarka/?klinika=' +
417				encodeURIComponent(klinikaID) +
418				'&specjalnosc=' +
419				encodeURIComponent(specjalnoscID) +
420				'&lekarz=' +
421				encodeURIComponent(lekarzID) +
422				'&data_od=' +
423				startDate +
424				'&data_do=' +
425				endDate +
426				'&godz_od=' +
427				startTime +
428				'&godz_do=' +
429				endTime;
430
431			window.location.href = url;
432		});

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.