1// must be loaded at the end of the body element 2(function(){ 3 var addEvent = function(element, event, func){ 4 if(element.addEventListener){ 5 element.addEventListener(event, func, false); 6 } 7 else{ 8 element.attachEvent('on'+event, func); 9 } 10 }, 11 eventPreventDefault = function(event){ 12 event = event || window.event; 13 if(event.preventDefault){ 14 event.preventDefault(); 15 } 16 else{ 17 event.returnValue = false; 18 } 19 }, 20 elementMatches = function(element, selector) { 21 var methods = ['matches', 'matchesSelector', 'mozMatchesSelector', 'webkitMatchesSelector']; 22 for (var i = 0; i < methods.length; i++) { 23 if (methods[i] in element) { 24 return element[methods[i]](selector); 25 } 26 } 27 return false; 28 }, 29 addClass = function(element, className) { 30 var elements = ('length' in element && !('className' in element)) 31 ? element 32 : [element]; 33 for (var i = 0; i < elements.length; i++) { 34 if (!hasClass(elements[i], className)) { 35 elements[i].className += ' ' + className; 36 } 37 } 38 }, 39 removeClass = function(element, className) { 40 var elements = ('length' in element && !('className' in element)) 41 ? element 42 : [element]; 43 for (var i = 0; i < elements.length; i++) { 44 if (hasClass(elements[i], className)) { 45 elements[i].className = elements[i].className.replace(new RegExp('(?:^|\\s+)' + className + '(?:$|\\s+)'), ' '); 46 } 47 } 48 }, 49 hasClass = function(element, className) { 50 return !!element.className.match('(?:^|\\s)' + className + '(?:$|\\s)'); 51 }, 52 toggleClass = function(element, className) { 53 return hasClass(element, className) 54 ? removeClass(element, className) 55 : addClass(element, className); 56 }, 57 footerForms = document.querySelectorAll('.page-footer-inner form'), 58 labels, 59 navMain = document.getElementById('main-navigation'), 60 navMainLis, i, element, navMainTouched, touchUsed; 61 if(footerForms && footerForms.length){ 62 for(i = 0; i < footerForms.length; i++){ 63 labels = footerForms[i].getElementsByTagName('label'); 64 for(var j = 0; j < labels.length; j++){ 65 (function(){ 66 var label = labels[j], 67 labelFor, 68 input; 69 if( 70 (labelFor = label.getAttribute('for')) && 71 (input = document.getElementById(labelFor)) && 72 (input.tagName.toLowerCase() == 'textarea' || input.type.toLowerCase() == 'text' || input.type.toLowerCase() == 'email' || input.type.toLowerCase() == 'password' || input.type.toLowerCase() == 'search') 73 ){ 74 addEvent(input, 'focus', function(){ 75 label.style.display = 'none'; 76 }); 77 addEvent(input, 'blur', function(){ 78 if(!input.value){ 79 label.style.display = ''; 80 } 81 }); 82 if(input.value){ 83 label.style.display = 'none'; 84 } 85 } 86 })(); 87 } 88 } 89 } 90 91 // Edge dropdown touch fix 92 if(navMain && navMain.getElementsByTagName('ul').length){ 93 navMainLis = navMain.getElementsByTagName('ul')[0].childNodes; 94 for(i = 0; i < navMainLis.length; i++){ 95 if(navMainLis[i].nodeName && navMainLis[i].nodeName.toLowerCase() === 'li' && navMainLis[i].querySelector('ul,.mega-dropdown')){ 96 element = navMainLis[i].getElementsByTagName('a'); 97 if(element && (element = element[0])){ 98 element.setAttribute('aria-haspopup', 'true'); 99 } 100 } 101 } 102 } 103 104 // dropdown fix for all touch devices 105 if(window.Modernizr && Modernizr.touch){ 106 if(navMain && navMain.getElementsByTagName('ul').length){ 107 // devices supporting touch events may not mean touch input is used 108 // e.g. touch enabled laptops running Windows 8 109 addEvent(navMain, 'touchstart', function(event) { 110 touchUsed = true; 111 }); 112 navMainLis = navMain.getElementsByTagName('ul')[0].childNodes; 113 for(i = 0; i < navMainLis.length; i++){ 114 if(navMainLis[i].nodeName && navMainLis[i].nodeName.toLowerCase() === 'li' && navMainLis[i].querySelector('ul,.mega-dropdown')){ 115 element = navMainLis[i].getElementsByTagName('a'); 116 if(element && (element = element[0])){ 117 addEvent(element, 'click', function(event){ 118 if(navMainTouched !== this && touchUsed){ 119 navMainTouched = this; 120 eventPreventDefault(event); 121 } 122 }); 123 } 124 } 125 } 126 } 127 } 128 129 // Mobile navigation 130 (function(nav, page) { 131 if (!nav) { 132 return; 133 } 134 document.body.insertBefore(nav, document.body.firstChild); 135 var navLink; 136 var isOpened; 137 var open, close; 138 var updateHeight = function() { 139 if (!isOpened) { 140 return; 141 } 142 if (!nav.offsetHeight) { 143 // Close the nav if it is not visible anymore 144 return close(); 145 } 146 nav.style.minHeight = 0; 147 page.style.height = Math.max((window.innerHeight || document.documentElement.clientHeight), nav.offsetHeight) + 'px'; 148 page.style.position = 'relative'; 149 page.style.overflow = 'hidden'; 150 nav.style.minHeight = ''; 151 }; 152 open = function() { 153 isOpened = true; 154 addClass(nav, 'is-active'); 155 updateHeight(); 156 }; 157 close = function() { 158 isOpened = false;
159 removeClass(nav, 'is-active'); 160 page.style.height = ''; 161 page.style.position = ''; 162 page.style.overflow = ''; 163 }; 164 addEvent(window, 'resize', updateHeight); 165 addClass(nav, 'is-enabled'); 166 navLink = document.createElement('a'); 167 navLink.innerHTML = 'navigation'; 168 navLink.href = ''; 169 addClass(navLink, 'main-navigation-mobile-open'); 170 addEvent(navLink, 'click', function(event) { 171 eventPreventDefault(event); 172 if (hasClass(nav, 'is-active')) { 173 close(); 174 } 175 else { 176 open(); 177 } 178 }); 179 if (document.querySelector && document.querySelector('.page-wrapper')) { 180 document.querySelector('.page-wrapper').insertBefore( 181 navLink, 182 document.querySelector('.page-wrapper').firstChild 183 ); 184 } 185 else { 186 nav.parentNode.insertBefore(navLink, nav); 187 } 188 closeButton = document.createElement('button'); 189 closeButton.innerHTML = 'close'; 190 addClass(closeButton, 'main-navigation-mobile-close'); 191 addEvent(closeButton, 'click', function(event) { 192 if (isOpened) { 193 close(); 194 } 195 eventPreventDefault(event); 196 }); 197 nav.appendChild(closeButton); 198 var uls = nav.querySelectorAll('ul ul'); 199 var button; 200 var buttonOnClick = function(event) { 201 toggleClass(this.parentNode, 'is-expanded'); 202 toggleClass(this.parentNode, 'is-collapsed'); 203 updateHeight(); 204 }; 205 for (var i = 0; i < uls.length; i++) { 206 button = document.createElement('button'); 207 button.innerHTML = 'expand'; 208 button.className = 'main-navigation-mobile-expand'; 209 addEvent(button, 'click', buttonOnClick); 210 uls[i].parentNode.insertBefore(button, uls[i]); 211 if (hasClass(uls[i].parentNode, 'active') || hasClass(uls[i].parentNode, 'trail')) { 212 addClass(uls[i].parentNode, 'is-expanded'); 213 } 214 else { 215 addClass(uls[i].parentNode, 'is-collapsed'); 216 } 217 } 218 })( 219 document.querySelector && document.querySelector('.main-navigation-mobile'), 220 document.querySelector && document.querySelector('.page-wrapper') 221 ); 222 223 // Animations 224 (function(elements) { 225 var filteredElements = []; 226 for (var i = 0; i < elements.length; i++) { 227 if (!elementMatches(elements[i], '.not-animated *, .not-animated')) { 228 filteredElements.push(elements[i]); 229 } 230 } 231 elements = filteredElements; 232 if (!elements.length || !(window.Modernizr && Modernizr.csstransitions)) { 233 return; 234 } 235 addClass(elements, 'not-in-view'); 236 var update = function() { 237 var rect; 238 for (var i = 0; i < elements.length; i++) { 239 rect = elements[i].getBoundingClientRect(); 240 if (rect.top < (window.innerHeight || document.documentElement.clientHeight) * 0.8) { 241 addClass(elements[i], 'in-view'); 242 addClass(elements[i], 'has-shown'); 243 removeClass(elements[i], 'not-in-view'); 244 } 245 else if(rect.top > (window.innerHeight || document.documentElement.clientHeight) * 1.2) { 246 addClass(elements[i], 'not-in-view'); 247 removeClass(elements[i], 'in-view'); 248 } 249 } 250 }; 251 addEvent(window, 'scroll', update); 252 //addEvent(window, 'resize', update); 253 //addEvent(window, 'load', update); 254 setTimeout(update, 0); 255 })(document.querySelectorAll && document.querySelectorAll('.is-animated')); 256 257})();
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.