PageSourceSearch

https://stroytrakt.ru/bitrix/templates/.default/components/bitrix/…da_team_catalog_menu_option_3_4_6/script.js

js stroytrakt.ru collected 2026-10-05 22:56:27 UTC 20,027 bytes, 634 lines download raw bytes

1(function() {
2	'use strict';
3
4	if(!!window.JCCatalogMenu)
5		return;
6
7	window.JCCatalogMenu = function(params) {
8		this.catalogMenu = BX(params.container);
9		this.catalogMenuInside = params.inside;
10		this.catalogMenuSetActive = params.setActive;
11		this.catalogMenuOpenLast = params.openLast;
12		this.catalogMenuMoved = false;
13
14		this.menuIcon = document.body.querySelector('[data-entity="menu-icon"]');
15		
16		BX.ready(BX.delegate(this.init, this));
17	};
18
19	window.JCCatalogMenu.prototype = {
20		init: function() {
21			var subMenuAll = this.catalogMenu.querySelectorAll('[data-entity="dropdown-menu"]');
22			if(!!subMenuAll) {
23				for(var i in subMenuAll) {
24					if(subMenuAll.hasOwnProperty(i)) {
25						var subMenuLiActive = subMenuAll[i].querySelector('.active');
26						if(!!subMenuLiActive) {						
27							var parentMenuLi = BX.findParent(subMenuAll[i], {tagName: 'LI'});
28							if(!!parentMenuLi)
29								BX.addClass(parentMenuLi, 'active');
30						}
31					}
32				}
33			}
34
35			if(window.innerWidth >= 992)
36				$(this.catalogMenu).moreMenu();
37			
38			this.adjustCatalogMenu();
39			BX.bind(window, 'resize', BX.proxy(this.adjustCatalogMenu, this));
40
41			this.resetDropDownAll();
42			BX.bind(window, 'resize', BX.proxy(this.resetDropDownAll, this));
43			
44			this.checkCatalogMenuTop();
45			BX.bind(window, 'resize', BX.proxy(this.checkCatalogMenuTop, this));
46			BX.bind(window, 'scroll', BX.proxy(this.checkCatalogMenuTop, this));
47		},
48
49		adjustCatalogMenu: function() {
50			if(window.innerWidth >= 992) {
51				if(!!this.catalogMenuMoved) {
52					var insertNode = document.body.querySelector(this.catalogMenuInside ? '.top-panel__catalog-menu' : '.catalog-menu-wrapper');
53					if(!!insertNode) {
54						insertNode.appendChild(this.catalogMenu);
55						this.catalogMenuMoved = false;
56
57						this.resetCatalogMenu();
58
59						$(this.catalogMenu).moreMenu();
60					}
61				}
62				
63				if(!!this.menuIcon)
64					BX.unbind(this.menuIcon, 'click', BX.proxy(this.showHideCatalogMenu, this));
65
66				BX.unbind(document, 'click', BX.proxy(this.checkDropDownMenu, this));
67				BX.unbind(document, 'keydown', BX.proxy(this.checkDropDownMenuKeydown, this));
68			} else {
69				if(!this.catalogMenuMoved) {
70					var insertNode = document.body.querySelector('.page-wrapper');
71					if(!!insertNode) {
72						insertNode.appendChild(this.catalogMenu);
73						this.catalogMenuMoved = true;
74						
75						$(this.catalogMenu).moreMenu({'undo': true});
76
77						this.adjustMainMenu();
78						
79						$(this.catalogMenu).scrollbar({
80							disableBodyScroll: true
81						});
82						if(BX.hasClass(this.catalogMenu.parentNode, 'scroll-wrapper'))
83							this.catalogMenu = this.catalogMenu.parentNode;
84						
85						if(this.catalogMenuSetActive)
86							this.setCatalogMenuActive();
87					}
88				}
89				
90				if(!!this.menuIcon)
91					BX.bind(this.menuIcon, 'click', BX.proxy(this.showHideCatalogMenu, this));
92				
93				BX.bind(document, 'click', BX.proxy(this.checkDropDownMenu, this));
94				BX.bind(document, 'keydown', BX.proxy(this.checkDropDownMenuKeydown, this));
95			}
96		},
97
98		resetDropDownAll: function() {
99			var dropDownAll = this.catalogMenu.querySelectorAll('[data-entity="dropdown"]');
100			if(!!dropDownAll) {
101				for(var i in dropDownAll) {
102					if(dropDownAll.hasOwnProperty(i)) {
103						if(!BX.hasClass(dropDownAll[i], 'more'))
104							this.hoverIntentLi(dropDownAll[i]);
105						else
106							this.hoverIntentLiMore(dropDownAll[i]);
107					}
108				}
109			}
110		},
111
112		hoverIntentLi: function(item) {			
113			$(item).hoverIntent({
114				over: function() {
115					BX.addClass(this, 'hover');
116					if(window.innerWidth >= 992) {
117						var parentMenu = BX.findParent(this, {attrs: {'data-entity': 'dropdown-menu'}});
118						if(!!parentMenu && BX.hasClass(parentMenu, 'catalog-menu')) {
119							var dropDownMenu = this.querySelector('[data-entity="dropdown-menu"]');
120							if(!!dropDownMenu) {
121								BX.style(dropDownMenu, 'left', '0');
122								new BX.easing({
123									duration: 150,
124									start: {opacity: 0},
125									finish: {opacity: 100},
126									transition: BX.easing.transitions.linear,
127									step: function(state) {								
128										dropDownMenu.style.opacity = state.opacity / 100;
129									}
130								}).animate();
131							}
132						}
133					}
134				},
135				out: function() {
136					BX.removeClass(this, 'hover');
137					if(window.innerWidth >= 992) {
138						var parentMenu = BX.findParent(this, {attrs: {'data-entity': 'dropdown-menu'}});
139						if(!!parentMenu && BX.hasClass(parentMenu, 'catalog-menu')) {
140							var dropDownMenu = this.querySelector('[data-entity="dropdown-menu"]');
141							if(!!dropDownMenu) {
142								new BX.easing({
143									duration: 150,
144									start: {opacity: 100},
145									finish: {opacity: 0},
146									transition: BX.easing.transitions.linear,
147									step: function(state){
148										dropDownMenu.style.opacity = state.opacity / 100;
149									},
150									complete: function() {
151										BX.style(dropDownMenu, 'left', '');
152									}
153								}).animate();
154							}
155						}
156					}
157				},
158				timeout: 200
159			});			
160		},
161
162		hoverIntentLiMore: function(item) {
163			$(item).hoverIntent({
164				over: function() {
165					BX.addClass(this, 'hover');
166					if(window.innerWidth >= 992) {
167						var parentMenu = BX.findParent(this, {attrs: {'data-entity': 'dropdown-menu'}});
168						if(!!parentMenu && BX.hasClass(parentMenu, 'catalog-menu')) {
169							var dropDownMenu = this.querySelector('[data-entity="dropdown-menu"]');
170							if(!!dropDownMenu) {
171								BX.style(dropDownMenu, 'left', 'auto');
172								if(this.getBoundingClientRect().left + dropDownMenu.offsetWidth > document.body.clientWidth)
173									BX.style(dropDownMenu, 'right', '0');
174								
175								new BX.easing({
176									duration: 150,
177									start: {opacity: 0},
178									finish: {opacity: 100},
179									transition: BX.easing.transitions.linear,
180									step: function(state) {								
181										dropDownMenu.style.opacity = state.opacity / 100;
182									}
183								}).animate();
184							}
185						}
186					}
187				},
188				out: function() {
189					BX.removeClass(this, 'hover');
190					if(window.innerWidth >= 992) {
191						var parentMenu = BX.findParent(this, {attrs: {'data-entity': 'dropdown-menu'}});
192						if(!!parentMenu && BX.hasClass(parentMenu, 'catalog-menu')) {
193							var dropDownMenu = this.querySelector('[data-entity="dropdown-menu"]');
194							if(!!dropDownMenu) {
195								new BX.easing({
196									duration: 150,
197									start: {opacity: 100},
198									finish: {opacity: 0},
199									transition: BX.easing.transitions.linear,
200									step: function(state){
201										dropDownMenu.style.opacity = state.opacity / 100;
202									},
203									complete: function() {
204										BX.style(dropDownMenu, 'left', '');
205										BX.style(dropDownMenu, 'right', '');
206									}
207								}).animate();
208							}
209						}
210					}
211				},
212				timeout: 200
213			});
214		},
215
216		resetCatalogMenu: function() {
217			if(BX.hasClass(this.catalogMenu, 'scroll-wrapper')) {
218				var catalogMenu = this.catalogMenu.querySelector('.scroll-content');
219				if(!!catalogMenu) {
220					$(catalogMenu).scrollbar('destroy');
221					this.catalogMenu = catalogMenu;
222				}
223			}
224
225			if(BX.hasClass(this.catalogMenu, 'active')) {
226				BX.removeClass(this.catalogMenu, 'active');
227				BX.removeClass(document.body, 'slide-menu-option-1-active');
228			}
229			
230			var dropDownMenuAll = this.catalogMenu.querySelectorAll('[data-entity="dropdown-menu"]');
231			if(!!dropDownMenuAll) {
232				for(var i in dropDownMenuAll) {
233					if(dropDownMenuAll.hasOwnProperty(i)) {
234						BX.style(dropDownMenuAll[i], 'top', '');
235						BX.style(dropDownMenuAll[i], 'bottom', '');
236							
237						if(BX.hasClass(dropDownMenuAll[i], 'active'))
238							BX.removeClass(dropDownMenuAll[i], 'active');
239						
240						if(BX.hasClass(dropDownMenuAll[i], 'scroll-content'))
241							$(dropDownMenuAll[i]).scrollbar('destroy');
242					}
243				}
244			}
245
246			var mainMenu = this.catalogMenu.querySelector('[data-role="mainMenu"]');
247			if(!!mainMenu)
248				BX.remove(mainMenu);
249		},
250
251		checkCatalogMenuTop: function() {
252			var topPanelThead = document.body.querySelector('.top-panel__thead');
253			
254			if(window.innerWidth < 992) {
255				if(!!topPanelThead)
256					BX.style(this.catalogMenu, 'top', topPanelThead.getBoundingClientRect().top + topPanelThead.offsetHeight + 'px');
257			} else {
258				BX.style(this.catalogMenu, 'top', '');				
259			}
260		},
261
262		adjustMainMenu: function() {
263			var topMenu = document.body.querySelector('.horizontal-multilevel-menu'),
264				mainMenu = !!topMenu && BX.clone(topMenu);
265		
266			if(!!mainMenu) {
267				var mainMenuLiAll = BX.findChild(mainMenu, {tagName: 'LI'}, true, true);
268				if(!!mainMenuLiAll) {
269					for(var i in mainMenuLiAll) {
270						if(mainMenuLiAll.hasOwnProperty(i)) {
271							var mainMenuLiA = BX.findChild(mainMenuLiAll[i], {tagName: 'A'}, false, false);
272							if(!!mainMenuLiA) {
273								BX.adjust(mainMenuLiA, {
274									html: '<span class="catalog-menu-text">' + mainMenuLiA.innerText + '</span>'
275								});
276								if(mainMenuLiAll[i].getAttribute('data-entity') == 'dropdown') {
277									mainMenuLiA.appendChild(BX.create('SPAN', {
278										props: {
279											className: 'catalog-menu-arrow'
280										},
281										children: [
282											BX.create('I', {
283												props: {
284													className: 'icon-arrow-right'
285												}
286											})
287										]
288									}));
289								}
290
291								var dropDownMenuTitle = BX.create('LI', {
292									attrs: {
293										'data-entity': 'title'
294									},
295									children: [
296										BX.create('I', {
297											props: {
298												className: 'icon-arrow-left catalog-menu-back'
299											}
300										}),
301										BX.create('SPAN', {
302											props: {
303												className: 'catalog-menu-title'
304											},
305											html: mainMenuLiA.innerText
306										}),
307										BX.create('I', {
308											props: {
309												className: 'icon-close catalog-menu-close'
310											}
311										})
312									]
313								});
314							}
315							
316							var dropDownMenu = mainMenuLiAll[i].querySelector('[data-entity="dropdown-menu"]');
317							if(!!dropDownMenu) {
318								if(!!dropDownMenuTitle)
319									BX.prepend(dropDownMenuTitle, dropDownMenu);
320
321								BX.adjust(dropDownMenu, {
322									props: {
323										className: ''
324									},
325									attrs: {
326										'data-entity': ''
327									}
328								});
329								
330								var dropDownMenuContainer = BX.create('DIV', {
331									props: {
332										className: 'catalog-menu-dropdown-menu scrollbar-inner'
333									},
334									attrs: {
335										'data-entity': 'dropdown-menu'
336									}
337								});
338								dropDownMenuContainer.appendChild(dropDownMenu);
339
340								BX.append(dropDownMenuContainer, mainMenuLiAll[i]);
341							}
342						}
343					}
344				}
345				
346				BX.prepend(BX.create('LI', {
347					attrs: {
348						'data-entity': 'title'
349					},
350					children: [
351						BX.create('I', {
352							props: {
353								className: 'icon-arrow-left catalog-menu-back'
354							}
355						}),
356						BX.create('SPAN', {
357							props: {
358								className: 'catalog-menu-title'
359							},
360							html: BX.message('MAIN_MENU')
361						}),
362						BX.create('I', {
363							props: {
364								className: 'icon-close catalog-menu-close'
365							}
366						})
367					]
368				}), mainMenu);
369
370				BX.adjust(mainMenu, {
371					props: {
372						className: ''
373					},
374					attrs: {
375						'id': '',
376						'data-entity': ''
377					}
378				});
379
380				var mainMenuContainer = BX.create('DIV', {
381					props: {
382						className: 'catalog-menu-dropdown-menu scrollbar-inner'
383					},
384					attrs: {
385						'data-entity': 'dropdown-menu'
386					}
387				});
388				mainMenuContainer.appendChild(mainMenu);
389				
390				var mainMenuLi = BX.create('LI', {
391					attrs: {
392						'data-entity': 'dropdown',
393						'data-role': 'mainMenu'
394					},
395					children: [
396						BX.create('A', {
397							attrs: {
398								'href': 'javascript:void(0);'
399							},
400							children: [
401								BX.create('SPAN', {
402									props: {
403										className: 'catalog-menu-pic'
404									},
405									children: [
406										BX.create('IMG', {
407											attrs: {
408												'src': '/upload/da-team/icons_new/contacts.png'
409											},
410										})
411									]
412								}),
413								BX.create('SPAN', {
414									props: {
415										className: 'catalog-menu-text'
416									},
417									html: BX.message('MAIN_MENU')
418								}),
419								BX.create('SPAN', {
420									props: {
421										className: 'catalog-menu-arrow'
422									},
423									children: [
424										BX.create('I', {
425											props: {
426												className: 'icon-arrow-right'
427											}
428										})
429									]
430								})
431							]
432						}),
433					]
434				});
435				mainMenuLi.appendChild(mainMenuContainer);
436
437				var subMenuAll = mainMenuLi.querySelectorAll('[data-entity="dropdown-menu"]');
438				if(!!subMenuAll) {
439					for(var i in subMenuAll) {
440						if(subMenuAll.hasOwnProperty(i)) {
441							var subMenuLiActive = subMenuAll[i].querySelector('.active');
442							if(!!subMenuLiActive) {						
443								var parentMenuLi = BX.findParent(subMenuAll[i], {tagName: 'LI'});
444								if(!!parentMenuLi)
445									BX.addClass(parentMenuLi, 'active');
446							}
447						}
448					}
449				}
450				
451				BX.prepend(mainMenuLi, this.catalogMenu);
452			}
453		},
454
455		setCatalogMenuActive: function() {
456			var catalogMenuLiActiveAll = BX.findChild(this.catalogMenu, {tagName: 'li', className: 'active'}, true, true);
457			if(!!catalogMenuLiActiveAll) {
458				for(var i in catalogMenuLiActiveAll) {
459					if(catalogMenuLiActiveAll.hasOwnProperty(i)) {
460						var dropDownMenu = catalogMenuLiActiveAll[i].querySelector('[data-entity="dropdown-menu"]');
461						if(!!dropDownMenu && !BX.hasClass(dropDownMenu, 'active'))
462							BX.addClass(dropDownMenu, 'active');
463					}
464				}
465			}
466			
467			var dropDownMenuActiveAll = BX.findChild(this.catalogMenu, {className: 'active', attrs: {'data-entity': 'dropdown-menu'}}, true, true);
468			if(!!dropDownMenuActiveAll) {
469				var dropDownMenuLastActive = dropDownMenuActiveAll[dropDownMenuActiveAll.length - 1];
470				if(!!dropDownMenuLastActive) {
471					if(BX.hasClass(this.catalogMenu, 'scroll-wrapper')) {
472						var catalogMenu = this.catalogMenu.querySelector('.scroll-content');
473						if(!!catalogMenu) {
474							var catalogMenuTop = Math.abs(parseInt(BX.style(catalogMenu.parentNode, 'top'), 10));
475							if(!!catalogMenuTop && catalogMenuTop > 0)
476								BX.style(catalogMenu, 'top', catalogMenuTop + 'px');
477							
478							catalogMenu.scrollTop = 0;
479								
480							$(catalogMenu).scrollbar('destroy');
481							
482							this.catalogMenu = catalogMenu;
483						}
484					}
485					
486					if(!BX.hasClass(dropDownMenuLastActive, 'scroll-content')) {
487						$(dropDownMenuLastActive).scrollbar({
488							disableBodyScroll: true,
489							onInit: function() {
490								if(BX.hasClass(dropDownMenuLastActive, 'active'))
491									BX.removeClass(dropDownMenuLastActive, 'active');
492							}
493						});
494					}
495				}
496			}
497		},
498
499		showHideCatalogMenu: function(event) {
500			if(!BX.hasClass(this.catalogMenu, 'active')) {
501				BX.addClass(this.catalogMenu, 'active');
502				BX.addClass(document.body, 'slide-menu-option-1-active');
503			} else {
504				BX.removeClass(this.catalogMenu, 'active');
505				BX.removeClass(document.body, 'slide-menu-option-1-active');
506			}
507			event.stopPropagation();
508		},
509
510		checkDropDownMenu: function(event) {			
511			if(BX.hasClass(this.catalogMenu, 'active')) {
512				var catalogMenuLi = event.target.tagName == 'LI' ? event.target : BX.findParent(event.target, {tagName: 'LI'});
513				if(!!catalogMenuLi) {
514					if(catalogMenuLi.getAttribute('data-entity') == 'dropdown') {
515						var isCatalogMenuMainMenu = catalogMenuLi.hasAttribute('data-role') && catalogMenuLi.getAttribute('data-role') == 'mainMenu',
516							isCatalogMenuArrow = BX.hasClass(event.target, 'catalog-menu-arrow') || (BX.findParent(event.target, {className: 'catalog-menu-arrow'}) ? true : false);
517						
518						if(!!isCatalogMenuMainMenu || this.catalogMenuOpenLast || (!this.catalogMenuOpenLast && !!isCatalogMenuArrow)) {
519							BX.PreventDefault(event);
520							
521							var dropDownMenu = catalogMenuLi.querySelector('[data-entity="dropdown-menu"]');
522							if(!!dropDownMenu) {
523								var parentMenu = BX.findParent(dropDownMenu, {attrs: {'data-entity': 'dropdown-menu'}});
524								if(!!parentMenu && BX.hasClass(parentMenu, 'scroll-content')) {
525									var parentMenuScrollTop = parentMenu.scrollTop,
526										parentMenuTop = Math.abs(parseInt(BX.style(parentMenu.parentNode, 'top'), 10)),
527										parentMenuBottom = Math.abs(parseInt(BX.style(parentMenu.parentNode, 'bottom'), 10));
528									
529									if(!!parentMenuTop && parentMenuTop > 0)
530										BX.styl
530e(parentMenu, 'top', parentMenuTop + 'px');
531									
532									if(!!parentMenuBottom && parentMenuBottom > 0)
533										BX.style(parentMenu, 'bottom', parentMenuBottom * -1 + 'px');
534
535									if(BX.hasClass(parentMenu.parentNode, 'active'))
536										BX.addClass(parentMenu, 'active');
537									
538									$(parentMenu).scrollbar('destroy');
539									
540									if(BX.hasClass(parentMenu, 'catalog-menu'))
541										this.catalogMenu = parentMenu;
542								}
543
544								$(dropDownMenu).scrollbar({
545									disableBodyScroll: true,
546									onInit: function() {
547										dropDownMenu = dropDownMenu.parentNode;
548										if(!!parentMenuScrollTop && parentMenuScrollTop > 0) {
549											BX.style(dropDownMenu, 'top', parentMenuScrollTop + 'px');
550											BX.style(dropDownMenu, 'bottom', parentMenuScrollTop * -1 + 'px');
551										}
552									}
553								});
554								
555								new BX.easing({
556									duration: 300,
557									start: {left: 100},
558									finish: {left: 0},
559									transition: BX.easing.transitions.linear,
560									step: function(state) {								
561										BX.style(dropDownMenu, 'left', state.left + '%');
562									},
563									complete: function() {
564										BX.addClass(dropDownMenu, 'active');
565										BX.style(dropDownMenu, 'left', '');
566									}
567								}).animate();
568							}
569						}
570					} else if(catalogMenuLi.getAttribute('data-entity') == 'title') {
571						var parentMenu = BX.findParent(catalogMenuLi, {attrs: {'data-entity': 'dropdown-menu'}});
572						if(!!parentMenu) {
573							var parentParentMenu = BX.findParent(parentMenu, {attrs: {'data-entity': 'dropdown-menu'}});
574							if(!!parentParentMenu) {
575								$(parentParentMenu).scrollbar({
576									disableBodyScroll: true,
577									onInit: BX.delegate(function() {
578										var parentParentMenuTop = Math.abs(parseInt(BX.style(parentParentMenu, 'top'), 10));
579										if(!!parentParentMenuTop && parentParentMenuTop > 0) {
580											BX.style(parentParentMenu.parentNode, 'top', parentParentMenuTop + 'px');
581											BX.style(parentParentMenu, 'top', '');
582										}
583
584										var parentParentMenuBottom = Math.abs(parseInt(BX.style(parentParentMenu, 'bottom'), 10));
585										if(!!parentParentMenuBottom && parentParentMenuBottom > 0) {
586											BX.style(parentParentMenu.parentNode, 'bottom', parentParentMenuBottom * -1 + 'px');
587											BX.style(parentParentMenu, 'bottom', '');
588										}
589
590										if(BX.hasClass(parentParentMenu, 'active'))
591											BX.removeClass(parentParentMenu, 'active');
592
593										if(BX.hasClass(parentParentMenu.parentNode, 'catalog-menu'))
594											this.catalogMenu = parentParentMenu.parentNode;
595									}, this)
596								});
597							}
598							
599							if(BX.hasClass(parentMenu, 'scroll-content')) {
600								if(BX.hasClass(parentMenu.parentNode, 'active'))
601									BX.addClass(parentMenu, 'active');
602
603								$(parentMenu).scrollbar('destroy');
604							}
605							
606							new BX.easing({
607								duration: 300,
608								start: {left: 0},
609								finish: {left: 100},
610								transition: BX.easing.transitions.linear,
611								step: function(state) {								
612									BX.style(parentMenu, 'left', state.left + '%');
613								},
614								complete: function() {
615									BX.removeClass(parentMenu, 'active');
616									BX.style(parentMenu, 'left', '');
617								}
618							}).animate();
619						}
620					}
621				}
622				event.stopPropagation();
623			}
624		},
625
626		checkDropDownMenuKeydown: function(event) {
627			if(BX.hasClass(this.catalogMenu, 'active') && event.keyCode == 27) {
628				BX.removeClass(this.catalogMenu, 'active');
629				BX.removeClass(document.body, 'slide-menu-option-1-active');
630				event.stopPropagation();
631			}
632		}
633	}
634})();

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.