1(function () { 2 'use strict'; 3 4 var internalId = 0; 5 var togglesMap = {}; 6 var targetsMap = {}; 7 8 function $ (selector) { 9 return Array.prototype.slice.call(document.querySelectorAll(selector)); 10 } 11 12 function getClosestToggle (element) { 13 if (element.closest) { 14 return element.closest('[data-a11y-toggle]'); 15 } 16 17 while (element) { 18 if (element.nodeType === 1 && element.hasAttribute('data-a11y-toggle')) { 19 return element; 20 } 21 22 element = element.parentNode; 23 } 24 25 return null; 26 } 27 28 function handleToggle (toggle) { 29 var target = toggle && targetsMap[toggle.getAttribute('aria-controls')]; 30 31 if (!target) { 32 return false; 33 } 34 35 var toggles = togglesMap['#' + target.id]; 36 var isExpanded = target.getAttribute('aria-hidden') === 'false'; 37 38 target.setAttribute('aria-hidden', isExpanded); 39 toggles.forEach(function (toggle) { 40 toggle.setAttribute('aria-expanded', !isExpanded); 41 }); 42 } 43 44 document.addEventListener('DOMContentLoaded', function () { 45 togglesMap = $('[data-a11y-toggle]').reduce(function (acc, toggle) { 46 var selector = '#' + toggle.getAttribute('data-a11y-toggle'); 47 acc[selector] = acc[selector] || []; 48 acc[selector].push(toggle); 49 return acc; 50 }, togglesMap); 51 52 var targets = Object.keys(togglesMap); 53 targets.length && $(targets).forEach(function (target) { 54 var toggles = togglesMap['#' + target.id]; 55 var isExpanded = target.hasAttribute('data-a11y-toggle-open'); 56 var labelledby = []; 57 58 toggles.forEach(function (toggle) { 59 toggle.id || toggle.setAttribute('id', 'a11y-toggle-' + internalId++); 60 toggle.setAttribute('aria-controls', target.id); 61 toggle.setAttribute('aria-expanded', isExpanded); 62 labelledby.push(toggle.id); 63 }); 64 65 target.setAttribute('aria-hidden', !isExpanded); 66 target.hasAttribute('aria-labelledby') || target.setAttribute('aria-labelledby', labelledby.join(' ')); 67 68 targetsMap[target.id] = target; 69 }); 70 }); 71 72 document.addEventListener('click', function (event) { 73 var toggle = getClosestToggle(event.target); 74 handleToggle(toggle); 75 }); 76 77 document.addEventListener('keyup', function (event) { 78 if (event.which === 13 || event.which === 32) { 79 var toggle = getClosestToggle(event.target); 80 if (toggle && toggle.getAttribute('role') === 'button') { 81 handleToggle(toggle); 82 } 83 } 84 }); 85})();
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.