PageSourceSearch

https://bnb.by/local/templates/itachMain_copy/assets/js/custom.js?ver=240926121047

js bnb.by collected 2026-09-24 09:13:22 UTC 15,502 bytes, 458 lines download raw bytes

1document.addEventListener('DOMContentLoaded', function (event) {
2	// header modal contact
3	
4	/*
5	const buttonModalContact = document.getElementById('button-modal-contact')
6	const modalContact = document.getElementById('modal-contact')
7
8	buttonModalContact.addEventListener('click', () => {
9		buttonModalContact.classList.toggle('header-top__item_show')
10		modalContact.classList.toggle('modal-contact_show')
11	})
12	*/
13	
14	/*
15	const appBackCall = document.getElementById('app-back-call')
16	const buttonBackCall = document.getElementById('back-call-btn')
17	const buttonBackCallMobile = document.getElementById('button-back-call-mobile')
18	buttonBackCall.addEventListener('click', function () {
19		modalContact.classList.remove('modal-contact_show')
20		appBackCall.style.display = 'block'
21	})
22	buttonBackCallMobile.addEventListener('click', function () {
23		modalContact.classList.remove('modal-contact_show')
24		appBackCall.style.display = 'block'
25	})
26
27	// close header modal contect (click outside)
28
29	document.addEventListener('click', outsideEvtListenerModalContactHeader)
30	//document.addEventListener('click', outsideBackCall)
31
32	function outsideBackCall(event){
33		const modal = appBackCall.querySelector('.v-modal__modal')
34		if (
35			modal.contains(event.target) ||
36			modal === event.target ||
37			buttonBackCallMobile === event.target || 
38			buttonBackCallMobile.contains(event.target) ||
39			buttonBackCall === event.target || 
40			buttonBackCall.contains(event.target)
41		) {
42			console.log('Это форма')
43			console.log(event)
44			return false
45		}
46		console.log('скрыть')
47		appBackCall.style.display = 'none';
48	}
49
50	function outsideEvtListenerModalContactHeader(event) {
51		if (
52			modalContact.contains(event.target) ||
53			modalContact === event.target ||
54			buttonModalContact === event.target ||
55			buttonModalContact.contains(event.target)
56		) {
57			return false
58		}
59
60		buttonModalContact.classList.remove('header-top__item_show')
61		modalContact.classList.remove('modal-contact_show')
62	}
63	*/
64	// menu header
65	const menuItems = document.querySelectorAll('.menu__item')
66	const menuAdditional = document.querySelectorAll('.menu-additional')
67	const overlay = document.getElementById('custom-overlay')
68	menuItems.forEach((element, index) => {
69		element.addEventListener('click', (event) => {
70			const currentElement = element
71			const activeElement = document.querySelector('.menu__item_open')
72			
73			if (activeElement === currentElement) {
74				activeElement.classList.remove('menu__item_open')
75				overlay.classList.remove('opened')
76				menuAdditional.forEach((elem, ind) => {
77					if (index !== ind) elem.classList.remove('menu-additional_show')
78				})
79				menuAdditional[index]?.classList.toggle('menu-additional_show')
80			} else {			
81				if (activeElement) {
82					activeElement.classList.remove('menu__item_open')
83				}
84				currentElement.classList.add('menu__item_open')
85
86				overlay.classList.add('opened')
87				
88			menuAdditional.forEach((elem, ind) => {
89			if (index !== ind)
90				elem.classList.remove('menu-additional_show')
91			})
92				menuAdditional[index].classList.toggle('menu-additional_show')
93			}
94		})
95	})
96
97
98	// Закрытие меню по клику вне меню
99	document.addEventListener('click', outsideEvtListener)
100
101	function outsideEvtListener(evt) {
102		const menuAdditional = document.querySelector('.menu-additional_show')
103		const activeElement = document.querySelector('.menu__item_open')
104		if (menuAdditional) {
105			const menu = document.querySelector('.menu-new')
106			if (
107				evt.target === menu ||
108				menu?.contains(evt.target) ||
109				evt.target === menuAdditional ||
110				menuAdditional?.contains(evt.target)
111			) {
112				// клик внутри
113				return
114			}
115
116			activeElement.classList.remove('menu__item_open')
117			menuAdditional.classList.remove('menu-additional_show')
118			overlay.classList.toggle('opened')
119		}
120	}
121
122	overlay.addEventListener('click', function () {
123		menuAdditional.classList.remove('menu-additional_show')
124		overlay.classList.remove('opened')
125	})
126
127	// dropdown mobile footer
128	const dropdownButton = document.querySelectorAll('.dropdown__button')
129	const dropdownList = document.querySelectorAll('.dropdown__list')
130
131	for (let i = 0; i < dropdownButton.length; i++) {
132		dropdownButton[i].addEventListener('click', function () {
133			dropdownList[i].classList.toggle('dropdown__list_show')
134		})
135	}
136
137	// footer-menu dropdown mobile
138
139	const menuDropdownButton = document.querySelectorAll(
140		'.footer-menu-dropdown__button'
141	)
142	const dropdownListMenu = document.querySelectorAll(
143		'.footer-menu-dropdown__list'
144	)
145
146	for (let i = 0; i < menuDropdownButton.length; i++) {
147		menuDropdownButton[i].addEventListener('click', function () {
148			dropdownListMenu[i].classList.toggle('footer-menu-dropdown__list_show')
149		})
150	}
151
152	// header burger
153
154	const headerBurger = document.getElementById('header-burger')
155	const headerLogoWrapper = document.getElementById('header-logo-mobile')
156	const headerMenuMobile = document.getElementById('header-menu-mobile')
157	headerBurger.addEventListener('click', () => {
158		headerBurger.classList.toggle('header-burger_show')
159		headerMenuMobile.classList.toggle('header-menu-mobile_show')
160		headerLogoWrapper.classList.toggle('header-logo-mobile_show')
161		document.body.classList.toggle('no-scroll')
162	})
163
164	
165	// header-menu dropdown mobile
166
167	const menuDropdownButtonHeader = document.querySelectorAll(
168		'.header-menu-dropdown__button'
169	)
170	const dropdownListMenuHeader = document.querySelectorAll(
171		'.header-menu-dropdown__list'
172	)
173
174	for (let i = 0; i < menuDropdownButtonHeader.length; i++) {
175		menuDropdownButtonHeader[i].addEventListener('click', function () {
176			dropdownListMenuHeader[i].classList.toggle('header-menu-dropdown__list_show')
177		})
178	}
179	// currency dropdown
180
181	function outsideEvtListenerDropdownCurrency(event) {
182		const dropdownsWrapper = document.querySelectorAll(
183			'.mp-rates-dropdown-wrap'
184		)
185
186		if (dropdownsWrapper.length) {
187			dropdownsWrapper.forEach(function (dropdown) {
188				const button = dropdown.querySelector('.mp-rates-wrapper')
189				const list = dropdown.querySelector('.mp-rates__dropdown')
190
191				if (dropdown.contains(event.target)) {
192					return
193				}
194
195				button.classList.remove('mp-rates-wrapper_click')
196				list.classList.remove('mp-rates__dropdown_show')
197			})
198		}
199	}
200	
201	document.addEventListener('click', outsideEvtListenerDropdownCurrency)
202	
203	const changeCurrenctEvent = () => {
204		// Имитация изменения обмена валют
205		const event = new Event('keyup');
206		const elem = document
207			.querySelector('.custom-tabs-content.opened')
208			.querySelector('.get-money');
209			if (elem)
210				elem.dispatchEvent(event);
211	}
212	
213	const onChangeCurrency = (currencyBlock) => {
214		const currencyItems = currencyBlock.querySelectorAll(
215			'.mp-rates__dropdown__item'
216		)
217
218		const dropDown = currencyBlock.querySelector('.mp-rates__dropdown')
219
220		const activeRates = currencyBlock.querySelector('.mp-rates-wrapper')
221		const flagIcon = currencyBlock.querySelector('.mp-rates__flag img')
222		const activeReateCurrencyText = activeRates.querySelector(
223			'.mp-rates__currency'
224		)
225
226		currencyItems.forEach((item) => {
227			item.addEventListener('click', function (event) {
228				currencyBlock
229					.querySelector('.mp-rates__dropdown__item_hide')
230					.classList.remove('mp-rates__dropdown__item_hide')
231				item.classList.add('mp-rates__dropdown__item_hide')
232				flagIcon.src = `/local/templates/itachMain/assets/images/flag/${this.dataset.value}.svg`
233				activeRates.dataset.selected = this.dataset.value
234				activeReateCurrencyText.textContent = this.dataset.value.toUpperCase()
235
236				dropDown.classList.remove('mp-rates__dropdown_show')
237				activeRates.classList.remove('mp-rates-wrapper_click')
238				changeCurrenctEvent()
239			})
240		})
241	}
242
243	// Revers currency
244
245	const reverseCurrency = (tab, currencyGive, currencyGet) => {
246		const buttonReverce = tab.querySelector('.btn-calc')
247
248		buttonReverce.addEventListener('click', () => {
249			const buttonCurrencySelectGive =
250				currencyGive.querySelector('.mp-rates-wrapper')
251			const buttonCurrencySelectGet =
252				currencyGet.querySelector('.mp-rates-wrapper')
253			const currencyValueGive = buttonCurrencySelectGive.dataset.selected
254			const currencyValueGet = buttonCurrencySelectGet.dataset.selected
255			const currentTextGive = currencyGive.querySelector(
256				'.mp-rates__currency'
257			).textContent
258			const currentTextGet = currencyGet.querySelector(
259				'.mp-rates__currency'
260			).textContent
261
262			const iconGive = (currencyGive.querySelector(
263				'.mp-rates__flag img'
264			).src = `/local/templates/itachMain/assets/images/flag/${currencyValueGet}.svg`)
265			const iconGet = (currencyGet.querySelector(
266				'.mp-rates__flag img'
267			).src = `/local/templates/itachMain/assets/images/flag/${currencyValueGive}.svg`)
268
269			buttonCurrencySelectGive.dataset.selected = currencyValueGet
270			buttonCurrencySelectGet.dataset.selected = currencyValueGive
271			currencyGive.querySelector('.mp-rates__currency').textContent =
272				currentTextGet
273			currencyGet.querySelector('.mp-rates__currency').textContent =
274				currentTextGive
275			changeCurrenctEvent()
276		})
277	}
278
279		const sectionExchangeRates = document.getElementById('exchange_rates') 
280		 if (sectionExchangeRates){ 
281		  const exchangeTabs = sectionExchangeRates.querySelectorAll( 
282		   '.custom-tabs-content' 
283		  ) 
284		 if (exchangeTabs.length > 0){ 
285		  for (let i = 0; i < exchangeTabs.length; i++) { 
286		   const currencyGive = exchangeTabs[i].querySelector('.currency-calc-give') 
287		   const currencyGet = exchangeTabs[i].querySelector('.currency-calc-get') 
288		   // Вешаем методы на работу со списком валют 
289		   onChangeCurrency(currencyGive) 
290		   onChangeCurrency(currencyGet) 
291		   reverseCurrency(exchangeTabs[i], currencyGive, currencyGet) 
292		  } 
293		 }
294		 } 
295
296
297	// Делим число на разряды
298	function digits_float(target){
299		val = $(target).val().replace(/[^0-9.]/g, '');
300		if (val.indexOf(".") != '-1') {
301			val = val.substring(0, val.indexOf(".") + 3);
302		} 
303		val = val.replace(/^0+/, ''); // Удаление нулей вначале строки
304		val = val.replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
305		$(target).val(val);
306	}
307
308
309	// Отложенная загрузка, debounce
310	function debounce(func, ms) {
311		let timeout;
312		return function() {
313		  clearTimeout(timeout);
314		  timeout = setTimeout(() => func.apply(this, arguments), ms);
315		};
316	}
317
318	// Метод подсчета курса
319	
320	let inputGetMoney = document.querySelectorAll('.get-money')
321	if (inputGetMoney) {
322		inputGetMoney.forEach((element) => {
323			element.addEventListener('keyup', debounce((e) => getNewMoney(e), 300))
324		})
325	}
326	let inputGetMoneySecond = document.querySelectorAll('.new-money')
327	if (inputGetMoneySecond) {
328		inputGetMoneySecond.forEach((element) => {
329			element.addEventListener('keyup', debounce((e) => getNewMoney(e), 300))
330		})
331	}
332
333	
334	function getNewMoney(e) {
335		let requestURL = '/local/templates/itachMain/includes/ajax/getNewMoney.php'
336		let currentCurrency = '';
337		let inputNewMoney = '';
338		digits_float(e.target);
339		if(e.target.classList.contains('get-money')){
340			currentCurrency = document
341			.querySelector('.custom-tabs-content.opened').querySelector('.mp-rates-wrapper.sale').getAttribute('data-selected')
342			inputNewMoney = document
343			.querySelector('.custom-tabs-content.opened')
344			.querySelector('.new-money')
345		}
346		if(e.target.classList.contains('new-money')){
347			currentCurrency = document
348			.querySelector('.custom-tabs-content.opened').querySelector('.mp-rates-wrapper.buy').getAttribute('data-selected')
349			inputNewMoney = document
350			.querySelector('.custom-tabs-content.opened')
351			.querySelector('.get-money')
352		}
353		let currentValue = e?.target?.value || document
354			.querySelector('.custom-tabs-content.opened')
355			.querySelector('.get-money').value
356		let saleCurrencyCode = document
357			.querySelector('.custom-tabs-content.opened')
358			.querySelector('.mp-rates-wrapper.sale')
359			.querySelector('.mp-rates__currency').innerText
360		let buyCurrencyCode = document
361			.querySelector('.custom-tabs-content.opened')
362			.querySelector('.mp-rates-wrapper.buy')
363			.querySelector('.mp-rates__currency').innerText
364		let getMoney = true
365		/*if (e && e.target.classList.contains('new-money')) {
366			getMoney = false
367			currentValue = document
368				.querySelector('.custom-tabs-content.opened')
369				.querySelector('.new-money').value
370			inputNewMoney = document
371				.querySelector('.custom-tabs-content.opened')
372				.querySelector('.get-money')
373			saleCurrencyCode = document
374				.querySelector('.custom-tabs-content.opened')
375				.querySelector('.mp-rates-wrapper.buy')
376				.querySelector('.mp-rates__currency').innerText
377			buyCurrencyCode = document
378				.querySelector('.custom-tabs-content.opened')
379				.querySelector('.mp-rates-wrapper.sale')
380				.querySelector('.mp-rates__currency').innerText
381		}*/
382
383		let textInfo = document
384			.querySelector('.custom-tabs-content.opened')
385			.querySelector('.rates-info p')
386		let textPlusInfo = document
387			.querySelector('.custom-tabs-content.opened')
388			.querySelector('.rates-info .rates-second-info')
389		let bestCurr = document
390			.querySelector('.custom-tabs-content.opened')
391			.querySelector('.rates-mark__content_value')
392		let showCurr = document
393			.querySelector('.custom-tabs-content.opened')
394			.querySelector('.rates-mark__content_text')
395		//let saleCurrencyCode = document.querySelector('.custom-tabs-content.opened').querySelector('.mp-rates-wrapper.sale').getAttribute('data-selected').toUpperCase()
396		//let buyCurrencyCode = document.querySelector('.custom-tabs-content.opened').querySelector('.mp-rates-wrapper.buy').getAttribute('data-selected').toUpperCase()
397		let currentType = document
398			.querySelector('.basic-tab.custom-tab.active')
399			.getAttribute('data-type')
400		let formData = new FormData()
401		formData.append('currentValue', currentValue)
402		formData.append('currentCurrency', currentCurrency)
403		formData.append('saleCurrencyCode', saleCurrencyCode)
404		formData.append('buyCurrencyCode', buyCurrencyCode)
405		formData.append('currentType', currentType)
406		const xhr = new XMLHttpRequest()
407		xhr.open('POST', requestURL)
408		xhr.responseType = 'json'
409		xhr.onload = function () {
410			if (xhr.status !== 200) {
411				return
412			}
413			let response = xhr.response
414			inputNewMoney.value = response.price
415			textInfo.innerText = response.textInfo
416			bestCurr.innerText = response.bestCurr
417			showCurr.innerText = response.showCurr
418			if (response.currentType !== 6) {
419				textPlusInfo.innerHTML = response.textPlusInfo
420			}
421		}
422		xhr.send(formData)
423	}
424	
425	
426	
427	if (document.querySelector('.custom-tabs-content.opened'))
428		changeCurrenctEvent()
429	let customTabs = document.querySelectorAll('.custom-tab')
430	if (customTabs.length > 0)
431	{
432		customTabs.forEach((element) => {
433			element.addEventListener('click', function() {
434				setTimeout(changeCurrenctEvent, 500)
435			})
436		})
437	}
438
439	//Обрезаем текст у описания события
440
441	const cutText = (element) => {
442		const maxLength = 80
443		console.log(element.innerText.trim().length)
444		if (element.innerText.trim().length>maxLength){
445		const result = element.innerText.trim().substring(0, maxLength) + '...'
446		element.textContent = result}
447	}
448
449	const eventContainer = document.querySelector('.events-info-slider')
450	if (eventContainer){
451		const eventList = eventContainer.querySelectorAll('.mp-events__item')
452
453		eventList.forEach((element) => {
454			let description = element.querySelector('.mp-events__item_description')
455			cutText(description)
456		})
457	}
458})

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.