1/** 2 * responsive.js 3 * 4 * Handles toggling the navigation menu for small screens. 5 */ 6 7 8/* 9 * Enable 'More' menu item behaviour on primary menus 10 */ 11jQuery(document).ready(function ($) { 12 (function () { 13 var container, button, menu; 14 15 container = document.getElementById('site-navigation'); 16 if (!container) 17 return; 18 19 button = document.getElementsByClassName('menu-toggle')[0]; 20 if ('undefined' === typeof button) 21 return; 22 23 menu = container.getElementsByTagName('ul')[0]; 24 25 // Hide menu toggle button if menu is empty and return early. 26 if ('undefined' === typeof menu) { 27 button.style.display = 'none'; 28 return; 29 } 30 31 if (-1 === menu.className.indexOf('nav-menu')) 32 menu.className += ' nav-menu'; 33 34 $jbutton = jQuery(button); 35 36 if($jbutton.prop("tagName") === 'A') { 37 jQuery(button).attr("href", "javascript:menuClick();"); 38 } else { 39 jQuery(button).click(function(){ menuClick(); return false; }); 40 } 41 })(); 42 43 var $primaryMenu = $('.nav-primary:first'); // Retrieve primary menu 44 if ($primaryMenu.length === 0) { 45 return; 46 } // Verify that menu exists 47 48 if ($primaryMenu.hasClass('disable-more')) { 49 return; 50 } // option to disable resize 51 52 var $menuItems = $primaryMenu.children('li'); // Retrieve menu items 53 if ($menuItems < 2) { 54 cleanUp(); 55 return; 56 } // Verify at least 2 menu items exists [Home][Item1] 57 58 var $home = $menuItems.first(); // Retrieve home menu item 59 // COMMENTED OUT BECAUSE OF MULTILINGUAL 60 //if ($home.find('a:first').text() !== 'Home') { cleanUp(); return; }; // Verify that the first link says 'Home' 61 62 // Create and append 'More' item to navigator 63 var $more = $('<li/>', {'class': 'menu-item menu-item-more menu-item-has-children'}); 64 $('<a/>', {href: 'javascript:void(0);', text: 'More', 'aria-label': 'More Expanded Menu'}).appendTo($more); 65 var $moreSub = $('<ul/>', {'class': 'sub-menu'}); 66 $more.append($moreSub); 67 $menuItems.last().after($more); // CHROME BUG: using appendTo caused last LI (before more) to register as width 0 68 69 var $middleItems = $menuItems.not($home); // Get items between home and more button 70 var registered = false; // Whether the menu has item widths have been registered. This wont happen if the menu is in toggle mode. 71 var DATA_WIDTH = 'oWidth';
71 // Width data place-holder 72 73 rectifyMenu(); 74 $(window).resize(rectifyMenu); 75 navigationFocus($('.navigation-main a')); 76 77 function rectifyMenu() { 78 var viewWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); 79 80 if (!registered && viewWidth > 600) { 81 // Register menu widths 82 $menuItems.add($more).each(function () { 83 $me = $(this); 84 $me.data(DATA_WIDTH, $me.outerWidth()); 85 $me.addClass('measured'); 86 }); 87 registered = true; 88 } else if (viewWidth <= 600) { 89 // Toggle mode is enabled so show everything except the more button 90 $middleItems.show(); 91 $more.hide(); 92 return; 93 } 94 95 var maxReached = false; // Whether the max number of items have been displayed 96 var $hiddenLIs = $(); // List items that were hidden 97 var maxWidth = $primaryMenu.width(); // Get the max space the navigation bar has 98 if ($('html').is('.old-ie')) { 99 maxWidth = 960; 100 } // If we are an old version of IE (7-), set the width cause it calculates improperly 101 var filled = $home.data(DATA_WIDTH); // How much space on the bar is filled (initially set to the width of the always showing home link) 102 var moreWidth = $more.data(DATA_WIDTH); // The more button width 103 104 $middleItems.each(function (index) { 105 var $me = $(this); 106 var meWidth = $me.outerWidth(); 107 var firstWidth = $me.data(DATA_WIDTH); 108 109 if (meWidth > firstWidth) { // FireFox Fix 110 $me.data(DATA_WIDTH, meWidth); 111 firstWidth = meWidth; 112 } else { 113 meWidth = firstWidth; 114 } 115 116 if (!maxReached && 117 ((filled + meWidth + moreWidth) < maxWidth || // [filled][item][more] 118 (index == $middleItems.length - 1 && ((filled + meWidth) < maxWidth)))) {// [filled][last item] 119 filled += meWidth; 120 $me.show(); 121 } else { 122 if (!maxReached) { 123 $more.show(); 124 } 125 maxReached = true; 126 $me.hide(); 127 128 $hiddenLIs = $hiddenLIs.add($me); 129 } 130 }); 131 132 // Remove all more menu items 133 $moreSub.empty(); 134 135 if (!maxReached) { 136 $more.hide(); 137 } else { 138 $hiddenLIs.each(function () { 139 var $me = $(this); 140 var $links = $me.find('a').not('[href="javascript:void(0);"]'); 141 $links.each(function () { 142 $link = $(this); 143 $('<li/>', {'class': $link.parent().attr('class'), html: $link.clone()}).appendTo($moreSub); 144 }); 145 }); 146 } 147 navigationFocus($('.navigation-main .menu-item-more a')); 148 } 149 150 function cleanUp() { 151 $menuItems.css('visibility', 'visible'); 152 } 153 154}); 155 156function navigationFocus(elements) { 157 elements.focus( 158 function () { 159 var menuClass = 'menu-item-focused'; 160 var $parentMenu = jQuery(this).parents('.menu-item-has-children'); 161 var $subMenu = jQuery(this).parent('li').parent('.sub-menu'); 162 if ($parentMenu.length !== 0) { 163 if ($parentMenu.hasClass(menuClass) !== true) { 164 jQuery('.' + menuClass).removeClass(menuClass); 165 $parentMenu.addClass(menuClass); 166 } 167 } else { 168 if ($subMenu.length === 0) { 169 jQuery('.' + menuClass).removeClass(menuClass); 170 } 171 } 172 }).blur( 173 function () { 174 var menuClass = 'menu-item-focused'; 175 var $blurredMenu = jQuery(this).parents('.nav-primary-container'); 176 setTimeout(function () {
177 var $focusedMenu = jQuery(document.activeElement).parents('.nav-primary-container'); 178 if ($blurredMenu.length !== 0 && $focusedMenu.length === 0) { 179 jQuery('.' + menuClass).removeClass(menuClass); 180 } 181 }, 1); 182 }); 183} 184 185function menuClick() { 186 container = document.getElementById('site-navigation'); 187 button = jQuery('.menu-toggle').first(); 188 189 if (-1 !== container.className.indexOf('toggled')) { 190 container.className = container.className.replace(' toggled', ''); 191 button.trigger("untoggled"); 192 } else { 193 container.className += ' toggled'; 194 button.trigger("toggled"); 195 } 196}
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.