1function delay(ms){return new Promise(resolve=>setTimeout(resolve,ms))} 2/** 3 * Page Type: QMod - Chart, Quote & Historical 4 * 5 * Assigns unique aria-labels to highcharts containers. 6 * 7 * @since QMod v1.69.0 8 */function assignUniqueAriaLabels(){const charts=jq("[id^=highcharts-].highcharts-container");charts.each(function(index){const uniqueLabel=`Chart Container ${index+1}`;jq(this).attr("aria-label",uniqueLabel)})} 9/** 10 * Page Type: QMod - Chart, Quote & Historical 11 * 12 * Assigns unique IDs to duplicate filters within SVG defs. 13 * 14 * @since QMod v1.69.0 15 */function assignUniqueFilterIds(){const filters=jq('svg defs filter[id="highcharts-drop-shadow-0"]');filters.each(function(index){if(index>0){const newId=`highcharts-drop-shadow-${Math.random().toString(36).substr(2,9)}`;jq(this).attr("id",newId);const references=jq(`svg [filter="url(#highcharts-drop-shadow-0)"]`);references.each(function(){jq(this).attr("filter",`url(#${newId})`)})}})}delay(2e3).then(()=>{toggleTabIndex(null,true);jq("[id^=highcharts-].highcharts-container").attr("role","region");assignUniqueAriaLabels();assignUniqueFilterIds();jq("[id^=highcharts-end-of-chart-marker-]").attr("role","region")});function assignUniqueAttributes(){return new Promise(resolve=>{setTimeout(()=>{function generateUniqueId(baseId){return baseId+"-"+Math.random().toString(36).substr(2,9)}const ids=["highcharts-end-of-chart-marker-0","highcharts-screen-reader-region-before-0","highcharts-drop-shadow-0","highcharts-screen-reader-region-after-0","highcharts-2ih7fo0-0","highcharts-fjy84ra-0"];ids.forEach(baseId=>{const elements=document.querySelectorAll(`#${baseId}`);elements.forEach((element,index)=>{if(index>0){const newId=generateUniqueId(baseId);element.setAttribute("id",newId)}})});const landmarkElements=document.querySelectorAll(".highcharts-exit-anchor, .highcharts-container");landmarkElements.forEach((element,index)=>{if(!element.getAttribute("aria-label")){element.setAttribute("aria-label",`Unique Chart ${index+1}`)}});const filters=document.querySelectorAll('svg defs filter[id="highcharts-drop-shadow-0"]');filters.forEach((filter,index)=>{if(index>0){const newId=generateUniqueId("highcharts-drop-shadow-0");filter.setAttribute("id",newId);
15const references=document.querySelectorAll(`svg [filter="url(#highcharts-drop-shadow-0)"]`);references.forEach(reference=>{jq(reference).attr("filter",`url(#${newId})`)})}});const specificElements=["highcharts-3yiiuel-0","highcharts-pu44erb-0"];specificElements.forEach((baseId,index)=>{const element=document.querySelector(`#${baseId}`);if(element&&!element.getAttribute("aria-label")){element.setAttribute("aria-label",`Unique Chart Specific ${index+1}`)}});resolve()},2e3)})}document.addEventListener("DOMContentLoaded",()=>{assignUniqueAttributes()});function createLabelForInputBySelector(selector,labelText){let inputElement=document.querySelector(selector);if(!inputElement){return}let inputId="input-"+Math.random().toString(36).substr(2,9);inputElement.id=inputId;let label=document.createElement("label");label.htmlFor=inputId;label.textContent=labelText;label.classList.add("visually-hidden");inputElement.parentNode.insertBefore(label,inputElement)}delay(2e3).then(()=>{createLabelForInputBySelector("#qmod-fromdate > div > div.duet-date__input-wrapper > input.duet-date__input","From date");createLabelForInputBySelector("#qmod-todate > div > div.duet-date__input-wrapper > input.duet-date__input","To date")}); 16/** 17 * Page Type: QMod - Historical Data 18 * 19 * Adds a span element with class "visually-hidden" to all matching th elements. 20 * 21 * @since QMod v1.69.0 22 */function addVisuallyHiddenSpanToThElements(){let thElements=document.querySelectorAll("th.qmod-control.control.sorting_disabled.dtr-hidden");thElements.forEach(function(th){if(!th.querySelector(".visually-hidden")){let span=document.createElement("span");span.className="visually-hidden";span.textContent="Control Header";span.setAttribute("aria-hidden","true");th.appendChild(span)}})}delay(2e3).then(()=>{addVisuallyHiddenSpanToThElements()});function observeForContent(selector){return new Promise((resolve,reject)=>{let checkInterval=setInterval(()=>{if(jq(selector).html()){clearInterval(checkInterval);resolve()}},100)})}if(jq("body").hasClass("page-type-qmod---historical-data")){observeForContent("#qmod-price-history").then(()=>{ 23// Append visually-hidden caption to table 24let $historyTable=jq("#qmod-price-history");$historyTable.prepend('<caption class="visually-hidden">Column headers are sortable.</caption>');$historyTable.find("th.sorting").each(function(){jq(this).removeAttr("aria-label");jq(this).accessibleClick(function(e){jq("#qmod-price-history th.sorting").removeAttr("aria-label")})})})}delay(1e3).then(()=>{jq(".qmod-legend li").each(function(i){jq(this).attr("tabindex",0);jq(this).accessibleClick(function(evt){if(evt.type!="click"){jq(this).click();return false}})})});function assignUniqueLabels(){return new Promise(resolve=>{setTimeout(()=>{const elements=document.querySelectorAll(".qmod-main-chart");elements.forEach((element,index)=>{if(!element.getAttribute("aria-label")){element.setAttribute("aria-label",`Unique Chart ${index+1}`)}});resolve()},2e3)})}document.addEventListener("DOMContentLoaded",()=>{assignUniqueLabels()}); 25/** 26 * Page Type: QMod - Dividends 27 * 28 * Fixes invalid ARIA attribute names. 29 * 30 * @since QMod v1.69.0 31 */function fixInvalidAriaAttributes(){return new Promise(resolve=>{setTimeout(()=>{const invalidAriaElements=document.querySelectorAll("[aria-role]");invalidAriaElements.forEach(element=>{const ariaRoleValue=element.getAttribute("aria-role");element.removeAttribute("aria-role");element.setAttribute("role",ariaRoleValue)});resolve()},2e3)})}document.addEventListener("DOMContentLoaded",()=>{fixInvalidAriaAttributes()});function toggleTabIndex(event,isFirstLoad=false){let next,previous;if(!isFirstLoad){next=jq(event.target.hash);previous=jq(event.relatedTarget.hash)}else{next=jq("#tab_quote");previous=jq("#tab_historical")} 32// Add aria-hidden="true" and tabindex="-1" to the hidden tab-panel 33previous.attr("aria-hidden","true");previous.find("input, button:not(.no-tab), th.sorting, .qmod-calendar-control, .highcharts-container, .qmod-a11y-toggle-wrap, .qmod-a11y-dropdown2-combobox, .highcharts-exit-anchor").attr("tabindex","-1");previous.find(".highcharts-exit-anchor").attr("aria-hidden","true");next.removeAttr("aria-hidden");next.find("input, button:not(.no-tab), th.sorting, .qmod-calendar-control, .highcharts-container, .qmod-a11y-toggle-wrap, .qmod-a11y-dropdown2-combobox, .highcharts-exit-anchor").attr("tabindex","0");next.find(".highcharts-exit-anchor").attr("aria-hidden","false")}jq('.stock-tab a[data-toggle="tab"]').on("shown.bs.tab",function(event){toggleTabIndex(event,false)});delay(2e3).then(()=>{toggleTabIndex(null,true)});jq(document).on("keydown",".qmod-a11y-dropdown2",function(event){if(event.key==="Enter"){let expanded=jq(this).attr("aria-expanded")==="true";jq(this).attr("aria-expanded",!expanded);jq(this).click()}});function setAriaLabelsForIcons(){const downArrowIcon=jq(".qmod-change.qmod-ch-down .qmod-change-icon.fa.fa-arrow-circle-down");const upArrowIcon=jq(".qmod-change.qmod-ch-up .qmod-change-icon.fa.fa-arrow-circle-up");if(downArrowIcon.length>0){downArrowIcon.attr("aria-hidden","false");downArrowIcon.attr("aria-label","Down");downArrowIcon.attr("role","img");downArrowIcon.removeAttr("aria-disabled")}if(upArrowIcon.length>0){upArrowIcon.attr("aria-hidden","false");upArrowIcon.attr("aria-label","Up");upArrowIcon.attr("role","img");upArrowIcon.removeAttr("aria-disabled")}}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{setAriaLabelsForIcons()},2e3)});function enhancePaginationAccessibility(){const pagination=document.querySelector("#DataTables_Table_1_paginate");if(pagination){const navWrapper=document.createElement("nav");navWrapper.classList.add("pagination-wrapper");
33navWrapper.setAttribute("aria-label","Pagination");pagination.parentNode.insertBefore(navWrapper,pagination);navWrapper.appendChild(pagination);const setAriaLabels=()=>{const prevButton=pagination.querySelector(".previous");const nextButton=pagination.querySelector(".next");if(prevButton){prevButton.setAttribute("aria-label","Previous Page");prevButton.setAttribute("role","link")}if(nextButton){nextButton.setAttribute("aria-label","Next Page");nextButton.setAttribute("role","link")}const pageButtons=pagination.querySelectorAll(".paginate_button");pageButtons.forEach(button=>{if(button.classList.contains("current")){button.setAttribute("aria-current","page")}else{button.removeAttribute("aria-current")}if(!button.classList.contains("previous")&&!button.classList.contains("next")){const blabel=parseInt(button.getAttribute("data-dt-idx"),10)+1;button.setAttribute("aria-label","Page "+blabel)} 34// Remove aria-role attribute (not a valid ARIA attribute) 35button.removeAttribute("aria-role")}); 36// Add aria labels to ellipses 37const ellipses=pagination.querySelectorAll(".ellipsis");ellipses.forEach(ellipsis=>{ellipsis.setAttribute("aria-label","Ellipsis indicating non-visible pages")})}; 38// Apply aria-labels initially 39setAriaLabels();const observer=new MutationObserver(setAriaLabels);observer.observe(pagination,{childList:true,subtree:true})}}document.addEventListener("DOMContentLoaded",()=>{delay(2e3).then(()=>{enhancePaginationAccessibility()})}); 40/** 41 * Page Type: QMod - Chart, Quote & Historical 42 * 43 * Adds meaningful aria-label to empty table headers. 44 * 45 * @since QMod v1.69.0 46 */function fixEmptyTableHeaders(){return new Promise(resolve=>{setTimeout(()=>{const emptyHeaders=document.querySelectorAll('th.qmod-control.control.sorting_disabled[aria-label=""]');emptyHeaders.forEach(header=>{header.setAttribute("aria-label","Empty header")});resolve()},2e3)})}document.addEventListener("DOMContentLoaded",()=>{fixEmptyTableHeaders()}); 47/** 48 * Page Type: QMod - Chart, Quote & Historical 49 * 50 * Adds a valid role to .qmod-a11y-toggle-wrap.qmod-volume-toggle elements. 51 * 52 * @since QMod v1.69.0 53 */function addTabIndexToVolumeToggle(){return new Promise(resolve=>{setTimeout(()=>{const toggleWrapElements=document.querySelectorAll(".qmod-a11y-toggle-wrap.qmod-volume-toggle");toggleWrapElements.forEach(element=>{element.setAttribute("tabindex","-1")});resolve()},2e3)})}document.addEventListener("DOMContentLoaded",()=>{addTabIndexToVolumeToggle()});
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.