1 2const initializeFilters = () => { 3 let elCurrentActive; 4 waitForElement(`.filter-container #filter-all`).then(elFilterAll => { 5 elCurrentActive = elFilterAll; 6 document.querySelectorAll('.filter-container button[id^="filter-"]').forEach(iterElBtn => { 7 iterElBtn.addEventListener('click',() => { 8 _log('Filter btn clicked'); 9 // Clear existing active button, reset to new one 10 elCurrentActive.className = ""; 11 iterElBtn.classList.add('active'); 12 elCurrentActive = iterElBtn; 13 const elSnowReportsContainer = document.querySelector('#container-snow-reports'); 14 if (elSnowReportsContainer) { 15 elSnowReportsContainer.className = ""; 16 elSnowReportsContainer.classList.add(iterElBtn.dataset.id); 17 } 18 }); 19 }); 20 21 22 }).catch( () => { console.log('Error waiting for EL:');}); 23}; 24 25 26const insertSEOItemListOfResorts = () => { 27 waitForElement('.statelist-rendered').then(() => { 28 29 let resortList = ''; 30 let delim = ''; 31 document.querySelectorAll('a.resort__link h2').forEach((iterEl) => { 32 resortList += `${delim} "${iterEl.innerText}"\n`; 33 delim = ','; 34 }); 35 let state = document.body.dataset.snowreport.replaceAll('-',' '); 36 state = state.replace(/(^\w{1})|(\s+\w{1})/g, letter => letter.toUpperCase()); 37 const seoItemList = ` 38 <script type="application/ld+json"> 39 { 40 "@context": "https://schema.org", 41 "@type": "ItemList", 42 "itemListElement": [ 43 ${resortList} 44 ], 45 "itemListOrder": "https://schema.org/ItemListUnordered", 46 "name": "Ski Resorts in ${state}" 47 } 48 </script> 49 `; 50 document.querySelector('head').insertAdjacentHTML('beforeend',seoItemList); 51 }).catch( (e) => { console.error('Error waiting for resort list to create SEO state list of resorts:',e);}); 52}; 53 54document.addEventListener('DOMContentLoaded',()=> { 55 const target = document.body.dataset.snowreport; 56 const src = document.body.dataset.source; 57 const requestType = document.body.dataset.resorttype; 58 const endpoint = (src !== 'resort') ? 'list' : 'resort'; 59 // fetch(url,{"headers": {"sec-fetch-mode": "cors","Access-Control-Allow-Origin":"*"}, "mode":"cors"}).then(response => { 60 61 //const url = `.netlify/functions/snowreport-api?target=${target}&src=${src}` ; 62 const url = (window.location.hostname !== 'localhost') ? `.netlify/functions/snowreport-api?target=${target}&src=${src}&type=${requestType}` : `https://feeds.snocountry.net/proof-of-concept/headless-snow-report-${endpoint}.php?target=${target}&src=${src}&type=${requestType}`; 63 _log(`snowreport-api: ${url}`); 64 fetch(url).then(response => { 65 return response.json(); 66 }).then(data => { 67 68 document.querySelector('#container-snow-reports').innerHTML = data.snowreport; 69 //process progressbars 70 (function() { 71 const progressBarList = document.querySelectorAll('.progress-bar'); 72 if (progressBarList) { 73 progressBarList.forEach(iterBar => { 74 iterBar.style.width = iterBar.dataset.percentage; 75 //console.log(`pb:`,iterBar.dataset.percentage); 76 }); 77 } 78 })(); 79 initializeFilters(); 80 insertSEOItemListOfResorts(); 81 82 }).catch( () => { console.log('Error waiting for EL:');}); 83 84 //checkForAd(target); 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.