PageSourceSearch

https://www.yourfirm.de/app/uploads/sites/24/ac_assets/fullscreen_navigation_menu/menu.js?ver=2.0.20

js yourfirm.de collected 2026-10-04 00:06:49 UTC 21,592 bytes, 780 lines download raw bytes

1function UCFullscreenMenu(menuWrapperID){
2  
3  var t = this;
4  
5  //classes / ids
6  var g_menuWrapperID, g_subMenuClass, g_collapsedClass, g_expandedClass, g_noTransitionClass, g_listMenuClass, g_menuItemPointerClass, g_menuOpenedClass, g_isActiveCLass, g_menuItemHasChildrenClass, ucForceDisablePageScroll;
7  
8  //selectors
9  var g_subMenuSelector, g_expandedSelector, g_menuItemPointerSelector, g_checkboxToggleSelector, g_objBody, g_objHTML, g_objWindow, g_innerMenuExpandIconSelector, g_innerMenuCollapseIconSelector;
10  
11  //obj
12  var g_objWidget, g_objInnerMenu, g_objMenuLinks, g_objListMenu, g_objMenuItemPointers, g_objMenuItemHasChildren, g_objHamburgerMenu, g_objCheckboxToggle, g_objUCHamburger, g_objUCHamburgerLink;
13  
14  //helpers
15  var g_isIconClicked = false, g_isCloseOnOpen = false, g_isLoaded = false, g_isClickable, g_dataOpenOnHover, g_isDesktopViewport;
16  
17  /**
18  * collapse inner section
19  */
20  function collapseInnerSection(element, link){    
21    var sectionHeight = element.scrollHeight;    
22    var elementTransition = element.style.transition;
23    element.style.transition = '';    
24    
25    requestAnimationFrame(function() {
26      element.style.height = sectionHeight + 'px';
27      element.style.transition = elementTransition;      
28      
29      requestAnimationFrame(function() {	
30        element.style.height = 0 + 'px';        
31      });
32    });
33    
34    element.setAttribute('data-collapsed', 'true');
35  }
36  
37  /**
38  * expand the inner of the section
39  */
40  function expandSectionInner(element){
41    var sectionHeight = element.scrollHeight;
42    
43    element.style.height = sectionHeight + 'px';
44    
45    element.addEventListener('transitionend', function(e) {
46      element.removeEventListener('transitionend', arguments.callee);
47      element.style.height = null;
48    });
49    
50    element.setAttribute('data-collapsed', 'false');    
51  }
52  
53  /**
54  * expand section
55  */
56  function expandSection(section, objLink){    
57    expandSectionInner(section);
58    
59    section.setAttribute('data-collapsed', 'false')
60    objLink.removeClass(g_collapsedClass);
61    objLink.addClass(g_expandedClass);    
62  }
63  
64  /**
65  * collapse the section
66  */
67  function collapseSection(section, objLink){    
68    collapseInnerSection(section, objLink);
69    
70    objLink.addClass(g_collapsedClass);
71    objLink.removeClass(g_expandedClass);
72  }
73  
74  /**
75  * collapse all expanded sections
76  */
77  function collapseAllExpanded(clickedItem){
78    var clickedParentExpanded = jQuery(clickedItem).parents(g_subMenuSelector).prev();    
79    var clickedChildrenExpanded = jQuery(clickedItem).next().find(g_expandedSelector);     
80    var objAllExpanded = g_objInnerMenu.find(g_expandedSelector).not(clickedChildrenExpanded).not(clickedParentExpanded);
81    
82    if(objAllExpanded.length == false)
83      return(false);
84    
85    jQuery.each(objAllExpanded, function(index, link){
86      var objLink = jQuery(link);
87      var section = link.nextElementSibling;
88      
89      collapseSection(section, objLink);      
90    });
91  }
92  
93  /**
94  * close or open link
95  */
96  function toggleSection(objLink){    
97    var link = objLink[0];
98    var section = link.nextElementSibling;    
99    var isCollapsed = section.getAttribute('data-collapsed') === 'true';
100    
101    if (isCollapsed) {		//expend current      
102      if(g_isCloseOnOpen == true)
103        collapseAllExpanded(link);
104      
105      expandSection(section, objLink);      
106    } else {		//collapse current      
107      collapseSection(section,objLink);
108    }    
109  }
110  
111  /**
112  * open or close some item
113  */
114  function openCloseItem(link, event){    
115    var section = link.nextElementSibling;
116    
117    if(!section)
118      return(true);
119    
120    var objSection = jQuery(section);
121    if(objSection.hasClass(g_subMenuClass) == false)
122      return(true);
123    
124    if(event)
125      event.preventDefault();
126    
127    var objLink = jQuery(link);    
128    var isCollapsed = section.getAttribute('data-collapsed') === 'true';
129    
130    if (isCollapsed) {		//expend current      
131      if(g_isCloseOnOpen == true)
132        collapseAllExpanded(link);
133      
134      expandSection(section, objLink);      
135    } else {		//collapse current      
136      collapseSection(section,objLink);
137    }    
138  }
139  
140  /**
141  * got to item
142  */
143  function showExpandCollapseIcons(e, objLink){   
144    toggleIcon(objLink);
145    
146    var url = objLink.attr("href");
147    url = jQuery.trim(url);
148    
149    if(!url)
150      return(true);
151    
152    var objLinkParent = objLink.parent();    
153    var expandCollapsed = g_objListMenu.find(g_menuItemPointerSelector)
154    var target = e.target
155    
156    if(expandCollapsed && expandCollapsed.length > 0 && target.className == expandCollapsed[0].className)
157      return(true);
158    
159    if(g_isClickable == false){
160      
161      if(objLinkParent.hasClass(g_menuItemHasChildrenClass) == true)
162        return(true)
163      else
164        resetMenuState();      
165      
166    }else{
167      resetMenuState();
168    }
169    
170    return(true);
171  }
172  
173  /**
174  * on menu item click, if sub menu, open or close
175  */
176  function onMenuItemClick(event){   
177    openCloseItem(this, event);    
178    
179    var objLink = jQuery(this);
180    
181    showExpandCollapseIcons(event, objLink);    
182  }
183  
184  /**
185  * expand current item tree
186  */
187  function expandCurrentItemTree(){    
188    //disable transition    
189    var objCurrentItem = g_objInnerMenu.find(".current-menu-item");
190    
191    if(objCurrentItem.length == 0)
192      return(false);
193    
194    g_objInnerMenu.addClass(g_noTransitionClass);
195    
196    setTimeout(function(){
197      g_objInnerMenu.removeClass(g_noTransitionClass);
198    },300);
199    
200    var objParents = objCurrentItem.parents("li");
201    
202    if(objParents.length == 0)
203      return(false);
204    
205    jQuery.each(objParents, function(index, parent){      
206      var objParent = jQuery(parent);
207      var objLink = objParent.children("a");      
208      var link = objLink[0];
209      
210      openCloseItem(link);      
211    });    
212  }
213  
214  // collapse all except the current	
215  this.collapseAll = function(){    
216    g_objMenuLinks.each((i, item) => {
217      var objLink = jQuery(item);
218      
219      collapseAllExpanded(objLink[0]);		    
220    });
221  }  
222  
223  /**
224  * expand all
225  */
226  this.expandAllAfterPageLoad = function(){
227    var dataExpandAll = g_objInnerMenu.data("expandall");
228    
229    if(dataExpandAll == false)
230      return(false);
231    
232    if(!g_objMenuItemHasChildren || g_objMenuItemHasChildren.length == 0)
233      return(false);
234    
235    //disable transition temporarely
236    g_objInnerMenu.addClass(g_noTransitionClass);
237    setTimeout(function(){
238      g_objInnerMenu.removeClass(g_noTransitionClass);
239    },300);
240    
241    g_objMenuItemHasChildren.each(function(){
242      var objItem = jQuery(this);
243      var objLink = objItem.children("a");      
244      var link = objLink[0];
245      
246      openCloseItem(link); 
247    });
248  }
249  
250  /*
251  * open current page menu item
252  */
253  this.openCurrentPageMenuItem = function(){
254    var currentLocation =  window.location.href;
255    
256    g_objMenuLinks.each((i, item) => {
257      
258      var objLink = jQuery(item);
259      var section = item.nextElementSibling;  
260      var objLinkItemHref = objLink.attr('href');
261      
262      if(currentLocation == objLinkItemHref){
263        
264        if(jQuery(section) && jQuery(section).length > 0)
265          expandSection(section, objLink); 
266        
267        var objParentSection = objLink.parents(g_subMenuSelector);
268        
269        if(!objParentSection)
270          return(true)
271        
272        var objParentLink = objParentSection.prev();
273        
274        if(!objParentLink)
275          return(true)
276        
277        if(objParentSection && objParentSection.length > 0)
278          expandSection(objParentSection[0], objParentLink);
279      }    
280    });    
281  }  
282  
283  /*
284  * position fixed protection from parents transform rules
285  */
286  function protectForFixed(){    
287    //find element with position fixed css rule
288    var objFixedElement = g_objInnerMenu.parents('.ue_menu');
289    
290    //find all parents and look at each one
291    var objFixedParents = objFixedElement.parents();
292    
293    objFixedParents.each(function(){      
294      var objFixedParent = jQuery(this);
295      
296      //check if parent has one of issued css rules
297      var transformRule = objFixedParent.css('transform');
298      
299      //if transform is epsent then skip and move to another css rule
300      if(transformRule == 'none')
301        return(true);
302      
303      //if finds transform then remove it
304      objFixedParent.css('transform', '');
305      
306      //animation-fill-mode
307      var fillmodeRule = objFixedParent.css('animation-fill-mode');
308      
309      if(fillmodeRule == 'none')
310        return(true);
311      
312      objFixedParent.css('animation-fill-mode', 'none');
313      
314      //perspective
315      var perspectiveRule = objFixedParent.css('perspective');
316      
317      if(perspectiveRule == 'none')
318        return(true);
319      
320      objFixedParent.css('perspective', 'none');
321      
322      //filter
323      var filterRule = objFixedParent.css('filter');
324      
325      if(filterRule == 'none')
326        return(true);
327      
328      objFixedParent.css('filter', 'none');      
329    });    
330  }  
331  
332  /**
333  * on hamburger menu icon keydown
334  */
335  function onHamburgerKeydown(event){
336    var keyCode =  event.keyCode;
337    
338    if(keyCode == 13 && g_objHamburgerMenu.is(":focus")){
339      
340      g_objCheckboxToggle.trigger("click");
341    }
342  }
343  
344  /**
345  * close menu
346  */
347  function closeMenu(){
348    g_objBody.removeClass(g_menuOpenedClass);
349    g_objHTML.removeClass(g_menuOpenedClass);
350    g_objWidget.removeClass(g_menuOpenedClass);
351    g_objHamburgerMenu.attr("aria-expanded", false);
352  }
353  
354  /**
355  * reset menu state
356  */
357  function resetMenuState(){    
358    g_objCheckboxToggle.prop('checked',false);    
359    
360    closeMenu();
361    
362    if(g_objUCHamburger && g_objUCHamburger.length > 0){
363      g_objUCHamburger.removeClass(g_isActiveCLass);
364      g_objUCHamburgerLink.removeClass(g_isActiveCLass);
365    }
366  }
367  
368  /**
369  * toggle icons
370  */
371  function toggleIcons() {
372    var objExpandIconHTML = g_objWidget.find(g_innerMenuExpandIconSelector).html();
373    var objCollapseIconHTML = g_objWidget.find(g_innerMenuCollapseIconSelector).html();
374    
375    g_objMenuLinks.each(function() {
376      var objLink = jQuery(this);
377      var isLinkOpened = objLink.hasClass(g_expandedClass);
378      var objLinkContainer = objLink.find(g_menuItemPointerSelector);
379      
380      // Update icon based on the state of the menu item
381      if (isLinkOpened == true) {
382        objLinkContainer.html(objCollapseIconHTML);
383      } else {
384        objLinkContainer.html(objExpandIconHTML);
385      }
386    });
387  }
388  
389  /**
390  * toggle icon for a specific link
391  */
392  function toggleIcon(objLink) {
393    var isLinkOpened = objLink.hasClass(g_expandedClass);
394    var objLinkContainer = objLink.find(g_menuItemPointerSelector);
395    var objExpandIconHTML = g_objWidget.find(g_innerMenuExpandIconSelector).html();
396    var objCollapseIconHTML = g_objWidget.find(g_innerMenuCollapseIconSelector).html();
397    
398    // Update icon based on the state of the menu item
399    if (isLinkOpened) {
400      objLinkContainer.html(objCollapseIconHTML);
401    } else {
402      objLinkContainer.html(objExpandIconHTML);
403    }
404    
405    // Update all icons
406    toggleIcons();
407  }
408  
409  /**
410  * open menu
411  */
412  function openMenu(){
413    var dataOpenCurrentOnLoad = g_objInnerMenu.data("open-current-menu");
414    
415    g_objBody.addClass(g_menuOpenedClass);
416    g_objHTML.addClass(g_menuOpenedClass);
417    g_objWidget.addClass(g_menuOpenedClass);
418    t.collapseAll();
419    g_objHamburgerMenu.attr("aria-expanded", true);
420    
421    if(dataOpenCurrentOnLoad == true)
422      objMenu.openCurrentPageMenuItem();
423    
424    if(g_isLoaded == false){
425      t.expandAllAfterPageLoad();
426    }
427    
428    g_isLoaded = true;                                                                                       
429    
430    g_objMenuLinks.each(function(){
431      var objLink = jQuery(this);
432      
433      toggleIcon(objLink);
434    });
435    
436    if(g_objUCHamburger && g_objUCHamburger.length > 0){
437      g_objUCHamburger.addClass(g_isActiveCLass);
438      g_objUCHamburgerLink.addClass(g_isActiveCLass);
439    } 
440  }
441  
442  /**
443  * on checkbox toggle click
444  */
445  function onCheckboxToggleClick(){
446    var isChecked = g_objCheckboxToggle.is(":checked");
447    
448    if(isChecked == true){
449      openMenu();      
450    }else{
451      resetMenuState();      
452    }  
453  }
454  
455  /**
456  * on window keydown 
457  */
458  function onWindowKeydown(event) {
459    if(event.key == "Escape"){   
460      resetMenuState();
461    } 
462  }
463  
464  /**
465  * init close icon position
466  */
467  function initCloseIconPosition(){
468    var closeIconPosition = g_objInnerMenu.data('close-position');
469    
470    if(closeIconPosition == 'top'){
471      var scrolledDistance;
472      
473      g_objInnerMenu.on('scroll', function(e){          
474        scrolledDistance = g_objInnerMenu.scrollTop();
475        
476        g_objCheckboxToggle.css({
477          'transform': 'translate(0, -' + scrolledDistance + 'px)',
478          'transition': 'unset'
479        });
480        g_objHamburgerMenu.css({
481          'transform': 'translate(0, -' + scrolledDistance + 'px)',
482          'transition': 'unset'
483        });
484      });
485      
486      g_objWidget.delegate(g_checkboxToggleSelector, 'click', function(){
487        
488        g_objCheckboxToggle.css({
489          'transform': 'translate(0, 0)',
490          'transition': ''
491        });
492        
493        g_objHamburgerMenu.css({
494          'transform': 'translate(0, 0)',
495          'transition': ''
496        });
497      });
498    }
499  }
500  
501  /**
502  * on mouse hover
503  */
504  function onMouseHover(){
505    if(g_dataOpenOnHover == false)
506      return(true);
507    
508    if(g_isDesktopViewport == false)
509      return(true);
510    
511    var objLink = jQuery(this);
512    var objLinkParent = objLink.parent();
513    
514    if(objLinkParent.hasClass(g_menuItemHasChildrenClass) == false)
515      return(true);
516    
517    if(g_isClickable == true){
518      if(objLink.hasClass(g_expandedClass) == true)
519        return(true);
520      
521      var objLinkIcon = objLink.find(g_menuItemPointerSelector);
522      
523      objLinkIcon.trigger("click");
524    }else{
525      if(objLink.hasClass(g_expandedClass) == true)
526        return(true);
527      
528      objLink.trigger("click");
529    }
530  } 
531  
532  /**
533  * init exp / collase icons
534  */
535  function initExpandCollapseIcons(){
536    var dataShowIcons = g_objInnerMenu.data("show-menuicons");
537    
538    if(dataShowIcons == false)
539      return(false);
540    
541    g_objMenuLinks.each(function(){
542      objLink = jQuery(this);
543      
544      toggleIcon(objLink);
545    }); 
546  }
547  
548  /**
549  * on mouse leave
550  */
551  function onMouseLeave(){        
552    if(g_dataOpenOnHover == false)
553      return(true);
554    
555    if(g_isDesktopViewport == false)
556      return(true);
557    
558    var objLinkParent = jQuery(this);
559    var objLink = objLinkParent.find('> a');    
560    
561    if(g_isClickable == true){
562      
563      if(objLink.hasClass(g_collapsedClass) == true)
564        return(false);
565      
566      var objLinkIcon = objLink.find(g_menuItemPointerSelector);
567      
568      setTimeout(function(){
569        objLinkIcon.trigger("click");
570      }, 600);
571      
572    }else{
573      if(objLink.hasClass(g_collapsedClass) == true)
574        return(false);
575      
576      setTimeout(function(){
577        objLink.trigger("click");
578      }, 600);
579    }    
580  }
581  
582  /**
583  * fix for sticky parent section
584  */
585  function initFixForStickyParent(){
586    var objParents = g_objWidget.parents();
587    var ucVisibleClass = "uc-visible";
588    var ucHiddenClass = "uc-hidden";
589    
590    objParents.each(function(){
591      var objParent = jQuery(this); 
592      
593      if(objParent.hasClass("elementor-sticky") == true){
594        var isParentVisible = objParent.is(":visible");
595        g_objBody.addClass(ucForceDisablePageScroll);
596        g_objHTML.addClass(ucForceDisablePageScroll);
597        
598        if(isParentVisible == true){
599          objParent.addClass(ucVisibleClass);
600          objParent.removeClass(ucHiddenClass);
601        } else{
602          objParent.addClass(ucHiddenClass);
603          objParent.removeClass(ucVisibleClass);
604        }        
605      }	      
606    });
607  }
608  
609  /**
610  * init fix for safari browser
611  */
612  function initFixForSafari(){
613    var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
614    
615    if (isSafari) 
616      g_objWidget.closest(".e-flex.e-con-boxed.e-con.e-parent").css("overflow", "visible");    
617  }
618  
619  /**
620  * outer button click func
621  */
622  this.ueOpenFullscreenMenu = function(){
623    openMenu(); 
624  }
625  
626  /**
627  * outer button click func
628  */
629  this.ueCloseFullscreenMenu = function(){
630    resetMenuState(); 
631  }
632  
633  /**
634  * run the menu, init
635  */
636  function runMenu(menuWrapperID){    
637    //classes / ids
638    g_menuWrapperID = menuWrapperID;
639    g_subMenuClass = "sub-menu";
640    g_collapsedClass = "collapsed";
641    g_expandedClass = "expanded";
642    g_noTransitionClass = "uc-no-transition";
643    g_listMenuClass = "uc-list-menu";
644    g_menuItemPointerClass = "uc-menu-item-pointer";
645    g_menuOpenedClass = "menu-opened";
646    g_isActiveCLass = "is-active";
647    g_menuItemHasChildrenClass = "menu-item-has-children";
648    ucForceDisablePageScroll = "uc-force-disable-page-scroll";
649    
650    //selectors
651    g_subMenuSelector = "."+g_subMenuClass;
652    g_expandedSelector = "."+g_expandedClass;
653    g_menuItemPointerSelector = "."+g_menuItemPointerClass;
654    g_checkboxToggleSelector = ".checkbox-toggle";
655    g_innerMenuExpandIconSelector = ".ue_inner_menu_expand_icon";
656    g_innerMenuCollapseIconSelector = ".ue_inner_menu_collapse_icon";
657    
658    //init globals
659    g_objWindow = jQuery(window);
660    g_objHTML = jQuery("html");
661    g_objBody = jQuery("body");
662    g_objWidget = jQuery("#"+g_menuWrapperID);    
663    g_objInnerMenu = g_objWidget.find(".ue_inner_menu");
664    g_objListMenu = g_objWidget.find(".uc-list-menu");
665    g_objMenuLinks = g_objListMenu.find("a");
666    g_objHamburgerMenu = g_objWidget.find(".ue_hamburger");
667    g_objCheckboxToggle = g_objWidget.find(g_checkboxToggleSelector);
668    g_objUCHamburger = g_objWidget.find(".uc_hamburger");
669    g_objUCHamburgerLink = g_objWidget.find(".uc_animated_hamburger_icon");    
670    g_objMenuItemHasChildren = g_objListMenu.find("."+g_menuItemHasChildrenClass);
671    
672    //helpers
673    g_isCloseOnOpen = g_objInnerMenu.data("closeothers");
674    g_isCloseOnOpen = (g_isCloseOnOpen == "yes");    
675    g_isClickable = g_objInnerMenu.data("clickable");
676    g_dataOpenOnHover = g_objInnerMenu.data("openonhover");
677    g_isDesktopViewport = window.matchMedia("(min-width: 1024px)");
678    
679    if(g_objWidget.length == 0){
680      console.log("menu with ID: "+g_menuWrapperID+" not found!");
681      
682      return(false);
683    }
684    
685    resetMenuState();
686    initCloseIconPosition();
687    initExpandCollapseIcons();
688    initFixForSafari();
689    setTimeout(initFixForStickyParent,300);
690    
691    jQuery(window).on("scroll", function(){
692      //init fix for sticky
693      setTimeout(initFixForStickyParent,100);
694    });
695    
696    //collapse all except the current    
697    g_objMenuLinks.each((i, item) => {
698      //add area haspopup
699      var objHasChildrenLinks = g_objMenuItemHasChildren.find("> a");
700      
701      if(objHasChildrenLinks && objHasChildrenLinks.length > 0){
702        objHasChildrenLinks.attr("aria-haspopup", "true");
703      }
704      
705      if(item.nextElementSibling){        
706        var objItem = jQuery(item);
707        var iconPosition = g_objInnerMenu.data('icon-position');
708        
709        if(iconPosition == 'start')
710          objItem.prepend("<span class='"+g_menuItemPointerClass+"'></span>");
711        
712        if(iconPosition == 'end')
713          objItem.append("<span class='"+g_menuItemPointerClass+"'></span>");
714        
715        collapseInnerSection(item.nextElementSibling, item);
716        
717        item.nextElementSibling.style.display = "block";
718        
719        jQuery(item).addClass(g_collapsedClass);
720        jQuery(item).removeClass(g_expandedClass);
721      }      
722    });
723    
724    g_objMenuItemPointers = g_objListMenu.find(g_menuItemPointerSelector);
725    
726    //init events
727    
728    if(g_isClickable == false){      
729      g_objMenuLinks.on("click", onMenuItemClick);      
730    }else{      
731      //pointer click - toggle section      
732      g_objMenuItemPointers.on("click", function(event){       
733        g_isIconClicked = true;
734        
735        var objLink = jQuery(this).parent();
736        
737        toggleSection(objLink);
738      });
739      
740      g_objMenuLinks.on("click", function(e){
741        
742        //check if icon was clicked if not make sure that no icon found in clicked link
743        if(g_isIconClicked == true){
744          var objIcon = jQuery(this).find(g_menuItemPointerSelector);
745          
746          if(objIcon && objIcon.length > 0){
747            e.preventDefault();
748            
749            g_isIconClicked = false;
750          }
751        }
752        
753        showExpandCollapseIcons(e, jQuery(this));
754      });
755    }
756    
757    g_objHamburgerMenu.on("keydown", function(event){
758      onHamburgerKeydown(event);
759    });
760    
761    g_objWidget.delegate(g_checkboxToggleSelector, "click", onCheckboxToggleClick);
762    
763    g_objWindow.on("keydown", function(e) {
764      onWindowKeydown(e);
765    });
766    
767    g_objMenuLinks.on("mouseover", onMouseHover);
768    g_objMenuItemHasChildren.on("mouseleave", onMouseLeave);
769    
770    //open the section with current item    
771    setTimeout(expandCurrentItemTree,100);
772    
773    //protection for elements with position fixed rule    
774    setTimeout(protectForFixed,2000);    
775  }  
776  
777  this.initFullscreenMenu = function(id){
778    runMenu(id);
779  }
780}

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.