1/****SETTINGS****/ 2var mobileBreak = 1000; //mobile breakpoint 3var menuBarHeight = 50; 4var mobileMenuContainer = "mobile-menu-container"; //classname of scrolling mobile menu container 5 6window.addEventListener('DOMContentLoaded', function() 7{ 8 hookMobileSubmenus(); 9 onResize(); 10}); 11 12function hookMobileSubmenus() 13{ 14 var submenus = document.querySelectorAll('.' + mobileMenuContainer + ' > div > ul > li > .sub-menu'); 15 16 for(var i = 0; i < submenus.length; i++) 17 { 18 submenus[i].style.height = "0px"; 19 submenus[i].style.overflow = "hidden"; 20 var button = submenus[i].parentNode.children[0]; 21 button.addEventListener('click', function(e) 22 { 23 if (window.innerWidth <= mobileBreak) 24 { 25 if (e.target.parentNode.querySelectorAll('.sub-menu li').length > 2) 26 { 27 e.preventDefault(); 28 } 29 } 30 }); 31 button.addEventListener('mouseup', function(e) 32 { 33 if (e.target.parentNode.querySelectorAll('.sub-menu li').length > 2) 34 { 35 mobileSubmenuClicked(e); 36 } 37 }); 38 39 button.addEventListener('touchstart', function(e) 40 { 41 if (e.target.parentNode.querySelectorAll('.sub-menu li').length > 2) 42 { 43 mobileSubmenuClicked.x = e.changedTouches.pageX; 44 mobileSubmenuClicked.y = e.changedTouches.pageY; 45 } 46 }); 47 button.addEventListener('touchend', function(e) 48 { 49 if (Math.abs(mobileSubmenuClicked.x - e.changedTouches.pageX) < 10 && Math.abs(mobileSubmenuClicked.y - e.changedTouches.pageY) < 10) 50 { 51 if (e.target.parentNode.querySelectorAll('.sub-menu li').length > 2) 52 { 53 mobileSubmenuClicked(e); 54 } 55 } 56 }); 57 } 58} 59 60function onResize() 61{ 62 var submenus = document.querySelectorAll('.' + mobileMenuContainer + ' > div > ul > li > .sub-menu'); 63 64 if (window.innerWidth <= mobileBreak) 65 { 66 for(var i = 0; i < submenus.length; i++) 67 { 68 submenus[i].style.height = "0px"; 69 submenus[i].style.overflow = "hidden"; 70 } 71 } 72 else 73 { 74 for(i = 0; i < submenus.length; i++) 75 { 76 submenus[i].style.height = ""; 77 submenus[i].style.overflow = ""; 78 } 79 } 80} 81window.addEventListener('resize', onResize); 82 83function mobileSubmenuClicked(e) 84{ 85 if (window.innerWidth <= mobileBreak) 86 { 87 e.preventDefault(); 88 var submenu = e.target.parentNode.children[1]; 89 if (submenu.style.height == "0px") 90 { 91 resetMobileSubmenus(); 92 e.target.style.background = ""; 93 e.target.className = "mobile-button-selected"; 94 var innerHeight = 0; 95 for (var c=0; c < submenu.children.length; c++) 96 { 97 innerHeight+=submenu.children[c].clientHeight+1; 98 } 99 submenu.style.transition = "0.2s ease"; 100 101 submenu.style.height = innerHeight + 1 + "px"; 102 103 var viewportOffset = e.target.getBoundingClientRect(); 104 105 mobileSubmenuClicked.animating = true; 106 107 setTimeout(function(e){mobileSubmenuClicked.animating = false;}, 200); 108 109 animateScroll(document.getElementsByClassName(mobileMenuContainer)[0], document.getElementsByClassName(mobileMenuContainer)[0].scrollTop + viewportOffset.top - menuBarHeight); 110 } 111 else 112 { 113 resetMobileSubmenus(); 114 } 115 } 116} 117 118function resetMobileSubmenus() 119{ 120 var submenus = document.querySelectorAll('.' + mobileMenuContainer + ' > div > ul > li > .sub-menu'); 121 122 for(var i = 0; i < submenus.length; i++) 123 { 124 var button = submenus[i].parentNode.children[0]; 125 button.style.background = ""; 126 button.className = ""; 127 submenus[i].style.transition = "none"; 128 submenus[i].style.height = "0px"; 129 } 130} 131 132function animateScroll(element, top, speed) 133{ 134 if (typeof speed == 'undefined') 135 { 136 speed = 4; 137 } 138 if (element.scrollTop < Math.round(top)) 139 { 140 element.scrollTop += speed; 141 } 142 if (element.scrollTop > Math.round(top)) 143 { 144 element.scrollTop -= speed; 145 } 146 147 if (Math.abs(element.scrollTop - Math.round(top)) > speed && (element.scrollTop != animateScroll.previous || mobileSubmenuClicked.animating)) 148 { 149 setTimeout(function(){animateScroll(element, top, speed);}, 1); 150 } 151 152 animateScroll.previous = element.scrollTop; 153}
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.