const video=document.getElementById("videoPlayer");video.addEventListener("loadeddata",(()=>{video.style.display="block"}));let old_tracking_multiplier,trackingUrlsOnceOld={impression:new Set,creativeView:new Set,start:new Set,firstQuartile:new Set,midpoint:new Set,thirdQuartile:new Set,complete:new Set,loaded:new Set,viewableImpression:new Set},cachedDefaultVideos=null,isPlaying=!1,isPlaybackInProgress=!1;const trackingMultiplierData=JSON.parse(localStorage.getItem("trackingMultiplierData"));trackingMultiplierData&&trackingMultiplierData.old_tracking_multiplier?old_tracking_multiplier=trackingMultiplierData.old_tracking_multiplier:(old_tracking_multiplier=tracking_multipliers[0],localStorage.setItem("trackingMultiplierData",JSON.stringify({old_tracking_multiplier:old_tracking_multiplier})));let trackingUrlsMultipleOld={impression:new Set},trackingUrlsOnce={impression:new Set,creativeView:new Set,start:new Set,firstQuartile:new Set,midpoint:new Set,thirdQuartile:new Set,complete:new Set,loaded:new Set,viewableImpression:new Set},trackingUrlsMultiple={impression:new Set};const maxRetries=3;let fetchCount=0,viewableImpressionFired=!1,startFired=!1,firstQuartileFired=!1,midpointFired=!1,thirdQuartileFired=!1,videoCompleted=!1;async function fetchData(e){try{const t=await fetch(e);return t.ok?await t.json():(console.warn(""),null)}catch(e){return console.error("",e),null}}async function fetchHtml(e){try{const t=await fetch(e);if(!t.ok)throw new Error("Network response was not ok");return await t.text()}catch(e){return console.error("Error fetching HTML:",e),null}}async function getDefaultVideos(){try{const e=await fetch(defaultVideojsonUrl);if(!e.ok)throw new Error(`Failed to fetch JSON at ${defaultVideojsonUrl}`);const t=await e.json();return t.videoUrls||[t.videoUrl]}catch(e){return console.error("",e),[]}}function getLastPlayedIndex(){return parseInt(localStorage.getItem("lastPlayedIndex")||"0",10)}function updateLastPlayedIndex(e){localStorage.setItem("lastPlayedIndex",e.toString())}function getNextVideoIndex(e,t){return(e+1)%t}async function storeDefaultVideosLocally(e){const t=await openDatabase();for(const r of e)try{await checkVideoExists(t,r)||await downloadAndStoreVideo(r)}catch(e){console.error("",e)}}async function initializeDefaultVideos(){cachedDefaultVideos=await getDefaultVideos(),cachedDefaultVideos.length>0?await storeDefaultVideosLocally(cachedDefaultVideos):console.error("")}async function encodeIPAddress(e){const t=(new TextEncoder).encode(e),r=await crypto.subtle.digest("SHA-256",t),n=Array.from(new Uint8Array(r)).map((e=>e.toString(16).padStart(2,"0"))).join("");return BigInt("0x"+n).toString(36).padStart(7,"0").slice(0,7)}function sanitizeKeyword(e){return e.replace(/[^a-zA-Z0-9:., ]/g,"").replace(/ /g,"_")}async function getWeatherData(e,t){const[r,n]=await Promise.all([fetchHtml(e),fetchHtml(t)]),a=new DOMParser,i=a.parseFromString(r,"text/html"),o=a.parseFromString(n,"text/html"),s=i.querySelector(".display-temp"),c=s?s.textContent.trim():"null",l=i.querySelector(".phrase"),d=l?l.textContent.trim():"null",u=o.querySelector(".category-text"),g=u?u.textContent.trim():"null",m=i.querySelector(".current-weather-details"),p=m?m.querySelectorAll(".detail-item"):[];let f="null";p.forEach((e=>{const t=e.querySelector("div:first-child").textContent.trim(),r=e.querySelector("div:last-child").textContent.trim();"Max UV Index"===t&&(f=r.replace(/[^a-zA-Z]/g,""))}));let w="null";const y=i.getElementsByTagName("script");let h="";for(const e of y)if(e.textContent.includes("var adInfo = ")){h=e.textContent;break}const k=h.match(/var adInfo = ([^;]+)/),S=k?JSON.parse(k[1]):{};return S.city&&(w=S.city),{currentTemperature:c,phrase:d,airQuality:g,maxUVIndex:f,city:w}}async function getIPAddress(){const e=await fetch("https://api.ipify.org?format=json"),t=await e.json();return await encodeIPAddress(t.ip)}async function initializePlayback(){loadOldData()?(setupVideoPlayback(),triggerTrackers()):(await initializeDefaultVideos(),playDefaultVideo()),fetchDataAndDisplay().catch((e=>{console.error("Error fetching additional data:",e)}))}function triggerTrackers(){trackingUrlsOnceOld.impression.forEach((e=>sendImpression(e))),trackingUrlsMultipleOld.impression.forEach((e=>{for(let t=0;t<old_tracking_multiplier;t++)sendImpression(e)}))}function loadOldData(){const e=JSON.parse(localStorage.getItem("trackingData"));if(e){e.trackingUrlsOnce&&Object.keys(e.trackingUrlsOnce).forEach((t=>{e.trackingUrlsOnce[t].forEach((e=>trackingUrlsOnceOld[t].add(e)))})),e.trackingUrlsMultiple&&e.trackingUrlsMultiple.impression.forEach((e=>{trackingUrlsMultipleOld.impression.add(e)}));const t=e.videoURL;return openDatabase().then((async e=>{const r=await getVideoBlob(e,t);if(r){const e=URL.createObjectURL(r),t=document.getElementById("videoPlayer");t.src=e,t.autoplay=!0,t.muted=!0,t.onloadeddata=()=>{t.play().catch((e=>console.error("",e)))},setupTracking(t)}else console.error("",t)})),!0}return!1}function base64ToBlob(e){const t=atob(e.split(",")[1]),r=new Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);const n=new Uint8Array(r);return new Blob([n],{type:"video/mp4"})}async function setupVideoPlayback(){const e=await openDatabase(),t=normalizeUrl(videoPlayer.src);if(t)try{const r=await getVideoBlob(e,t);if(r){const e=URL.createObjectURL(r);videoPlayer.src=e}else console.warn(""),videoPlayer.src=t;await videoPlayer.play()}catch(e){console.error("",e)}}async function playDefaultVideo(){const e=await openDatabase(),t=cachedDefaultVideos||await getDefaultVideos();if(0===t.length)return void console.error("");const r=getNextVideoIndex(getLastPlayedIndex(),t.length),n=t[r];try{const t=await getVideoBlob(e,n);t?videoPlayer.src=URL.createObjectURL(t):(console.warn(""),videoPlayer.src=n,await downloadAndStoreVideo(n)),videoPlayer.play().catch((e=>console.error("",e))),updateLastPlayedIndex(r)}catch(e){console.error("",e)}}async function fetchDataAndDisplay(){const{currentTemperature:e,phrase:t,airQuality:r,maxUVIndex:n,city:a}=await getWeatherData(weatherUrl,airQualityUrl),i=sanitizeKeyword(`Current Temperature:${e},Phrase:${t},Air Quality:${r},UV Index:${n},City:${a},IP:${await getIPAddress()},Hour:${getCurrentHourInCETorCEST()}`),o=vastUrl+"&mkv="+encodeURIComponent(i);await fetchAndParseVAST(o)}function normalizeUrl(e){if(!e||"string"!=typeof e)return null;try{const t=new URL(e,window.location.origin);return t.origin+t.pathname}catch{return null}}async function downloadAndStoreVideo(e){const t=await openDatabase();if(!await checkVideoExists(t,e))try{const r=await fetch(e);if(!r.ok)throw new Error("");const n=await r.blob();await storeVideo(t,e,n)}catch(e){console.error("",e)}}async function fetchAndParseVAST(e){fetchCount++;try{const t=await fetch(e);if(!t.ok)throw new Error(`Failed VAST fetch - Status: ${t.status}`);const r=await t.text(),n=(new DOMParser).parseFromString(r,"text/xml");extractTrackingUrls(n);const a=n.querySelector("VASTAdTagURI");if(a)await fetchAndParseVAST(a.textContent.trim());else{const e=n.querySelector("MediaFiles MediaFile");if(e){const t=e.textContent.trim();localStorage.getItem(t)||await downloadAndStoreVideo(t),storeNewData(t)}else console.error(""),localStorage.removeItem("trackingData")}}catch(e){console.error("",e),localStorage.removeItem("trackingData")}}function extractTrackingUrls(e){["creativeView","start","firstQuartile","midpoint","thirdQuartile","complete","loaded"].forEach((t=>{e.querySelectorAll(`Tracking[event="${t}"]`).forEach((e=>{const r=e.textContent.trim();"creativeView"===t?trackingUrlsOnce.viewableImpression.add(r):trackingUrlsOnce[t].add(r)}))}));e.querySelectorAll("Impression").forEach((e=>{const t=e.textContent.trim();fetchCount<=2?trackingUrlsOnce.impression.add(t):trackingUrlsMultiple.impression.add(t)}));e.querySelectorAll("ViewableImpression > Viewable").forEach((e=>{const t=e.textContent.trim();trackingUrlsOnce.viewableImpression.add(t)}))}function storeNewData(e){const t={trackingUrlsOnce:Object.fromEntries(Object.entries(trackingUrlsOnce).map((([e,t])=>[e,[...t]]))),trackingUrlsMultiple:{impression:[...trackingUrlsMultiple.impression]},videoURL:e};localStorage.setItem("trackingData",JSON.stringify(t))}function sendImpression(e,t=0,r=!1){const n=e+(e.includes("?")?"&":"?")+"cacheBust="+(new Date).getTime()+Math.random();if(r)for(let a=0;a<old_tracking_multiplier;a++)fetch(n,{method:"GET"}).then((n=>{!n.ok&&t<maxRetries&&setTimeout((()=>sendImpression(e,t+1,r)),1e3)})).catch((()=>{t<maxRetries&&setTimeout((()=>sendImpression(e,t+1,r)),1e3)}));else fetch(n,{method:"GET"}).then((n=>{!n.ok&&t<maxRetries&&setTimeout((()=>sendImpression(e,t+1,r)),1e3)})).catch((()=>{t<maxRetries&&setTimeout((()=>sendImpression(e,t+1,r)),1e3)}))}function sendTrackingRequests(e){e.forEach((e=>{const t=e+(e.includes("?")?"&":"?")+"cacheBust="+(new Date).getTime()+Math.random(),r=new Image(1,1);r.src=t,r.style.display="none",document.body.appendChild(r)}))}function setupTracking(e){e.addEventListener("loadedmetadata",(()=>{sendTrackingRequests(trackingUrlsOnceOld.loaded)})),e.addEventListener("play",(()=>{startFired||videoCompleted||(sendTrackingRequests(trackingUrlsOnceOld.start),startFired=!0),viewableImpressionFired||videoCompleted||(sendTrackingRequests(trackingUrlsOnceOld.viewableImpression),viewableImpressionFired=!0)})),e.addEventListener("timeupdate",(()=>{let t=e.currentTime/e.duration*100;t>=25&&!firstQuartileFired?(sendTrackingRequests(trackingUrlsOnceOld.firstQuartile),firstQuartileFired=!0):t>=50&&!midpointFired?(sendTrackingRequests(trackingUrlsOnceOld.midpoint),midpointFired=!0):t>=75&&!thirdQuartileFired&&(sendTrackingRequests(trackingUrlsOnceOld.thirdQuartile),thirdQuartileFired=!0)})),e.addEventListener("ended",(()=>{videoCompleted||(sendTrackingRequests(trackingUrlsOnceOld.complete),videoCompleted=!0)}))}function getCurrentHourInCETorCEST(){const e=new Date,t=new Date(e.getFullYear(),2,31);t.setDate(t.getDate()-t.getDay());const r=new Date(e.getFullYear(),9,31);r.setDate(r.getDate()-r.getDay());const n=e>=t&&e<r?2:1,a=new Date(e.getTime()+60*n*60*1e3).getUTCHours(),i={old_tracking_multiplier:tracking_multipliers[a]};return localStorage.setItem("trackingMultiplierData",JSON.stringify(i)),a.toString().padStart(2,"0")+"h"}function openDatabase(){return new Promise(((e,t)=>{const r=indexedDB.open("VideoDatabase",1);r.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains("videos")||t.createObjectStore("videos",{keyPath:"url"})},r.onsuccess=t=>{e(t.target.result)},r.onerror=e=>{t(e.target.error)}}))}function checkVideoExists(e,t){return new Promise(((r,n)=>{const a=e.transaction("videos","readonly").objectStore("videos").get(t);a.onsuccess=()=>{r(!!a.result)},a.onerror=()=>{n(a.error)}}))}function storeVideo(e,t,r){return new Promise(((n,a)=>{const i=e.transaction("videos","readwrite").objectStore("videos"),o={url:t,blob:r},s=i.put(o);s.onsuccess=()=>n(!0),s.onerror=e=>a(e.target.error)}))}async function getVideoBlob(e,t){return t?new Promise(((r,n)=>{const a=e.transaction("videos","readonly").objectStore("videos");try{const e=a.get(t);e.onsuccess=()=>{r(e.result?e.result.blob:null)},e.onerror=e=>{console.error("",e),n(e.target.error)}}catch(e){console.error("",e),n(e)}})):(console.error("",t),null)}initializePlayback();