1document.addEventListener("DOMContentLoaded",function(){const refreshInterval=120*1e3;let isRefreshing=false;function bindTabToggles(){document.querySelectorAll(".market-widget-tab-group").forEach(widget=>{const buttons=widget.querySelectorAll(".market-button");const viewAllLink=widget.querySelector(".view-all-link");buttons.forEach(button=>{button.addEventListener("click",()=>{if(button.classList.contains("active"))return;buttons.forEach(btn=>btn.classList.remove("active"));button.classList.add("active");const tabId=button.getAttribute("data-tab");widget.querySelectorAll(".market-tab").forEach(tab=>{tab.classList.remove("active-tab");if(tab.classList.contains(`${tabId}-tab`)){tab.classList.add("active-tab")}});const isNSE=tabId.includes("nse");const nseUrl=viewAllLink.getAttribute("data-nse-url");const bseUrl=viewAllLink.getAttribute("data-bse-url");viewAllLink.setAttribute("href",isNSE?nseUrl:bseUrl)})})})}async function refreshMarketData(){if(isRefreshing)return;isRefreshing=true;try{const response=await fetch("https://data.indianexpress.com/markets/api-market/json/market-widget.json");if(!response.ok)throw new Error("Failed to fetch market data");const data=await response.json();if(data)updateMarketWidget(data)}catch(err){console.error("Market data fetch error:",err)}finally{isRefreshing=false}}function updateMarketWidget(data){function formatNumber(val){return typeof val==="number"?val.toFixed(1):val}function createItemHTML(item){const changeClass=item.change>=0?"fe-green":"";const changeText=(item.change>=0?"+":"")+formatNumber(item.change)+" ("+(item.perChange>=0?"+":"")+formatNumber(item.perChange)+"%)";return` 2 <li class="market-widget-content-main"> 3 <div class="market-widget-data-main"> 4 <div class="market-widget-data"><a href="${item.url}?ref=Marketaction_hp" target="_blank">${item.label}</a></div> 5 <div class="market-widget-data">${formatNumber(item.current)}</div> 6 <div class="market-widget-data-value-red ${changeClass}">${changeText}</div> 7 </div> 8 </li> 9 `}function updateList(selector,items=[]){const list=document.querySelector(selector);if(!list)return;if(items.length===0){list.innerHTML=`<li class='market-widget-no-data'>Sorry, there's nothing to show here at the moment. Do check back later!</li>`;return}list.innerHTML=items.map(createItemHTML).join("")}updateList(".market-widget-bottom:not(.market-tab)",data.markets);updateList(".market-widget-bottom:not(.market-tab) + .market-widget-bottom",data.indices);updateList(".gainers-nse-tab",data.gainers?.nse||[]);updateList(".gainers-bse-tab",data.gainers?.bse||[]);updateList(".losers-nse-tab",data.losers?.nse||[]);updateList(".losers-bse-tab",data.losers?.bse||[]);const dateDiv=document.querySelector(".market-widget-date-time");if(dateDiv&&data.datetime){dateDiv.textContent=data.datetime}}bindTabToggles();setTimeout(()=>{refreshMarketData();setInterval(refreshMarketData,refreshInterval)},15e3)});
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.