\n \n \n \n \n
\n Enjoying Chronoodle? Share your thoughts in a brief\n
\n Survey\n .\n
\n \n ',"neutral",!0,0,(()=>{e.dismissedCount+=1,this.saveToStorage(surveyKey,e)}));if(t){const o=t.querySelector(".survey-link");o&&o.addEventListener("click",(()=>{e.surveyClickedCount+=1,this.saveToStorage(surveyKey,e)}))}}static showSurvey(){const e="survey_0",t=this.getFromStorage(e)||{dismissedCount:0,surveyClickedCount:0};if(t.dismissedCount>=2||t.surveyClickedCount>=2)return;const o=this.showToast('\n \n
\n \n \n \n \n \n
\n Enjoying Chronoodle? Share your thoughts in a brief\n
\n Survey\n .\n
\n
\n ',"neutral",!0,0,(()=>{t.dismissedCount+=1,this.saveToStorage(e,t)}));if(o){const r=o.querySelector(".survey-link");r&&r.addEventListener("click",(()=>{t.surveyClickedCount+=1,this.saveToStorage(e,t)}))}}static showToast(e,t="neutral",o=!0,r=3e3,n){const i=document.createElement("div");i.className=`toast ${t}`;const s=document.createElement("button");return s.className="close-btn",s.innerHTML="×",s.onclick=()=>{"function"==typeof n&&n(),i.remove()},i.innerHTML=e,o&&i.appendChild(s),document.getElementById("toaster").appendChild(i),r>0&&setTimeout((()=>{i.remove()}),r),i}static async LogReferral(e=null){const t=e=>new URLSearchParams(window.location.search).get(e);if((()=>{if(!document.referrer)return!1;return new URL(document.referrer).hostname===window.location.hostname})())return;let o={device_uuid:this.getDeviceUuid(),session_uuid:await this.getSessionUuid()};const r=t("utm_source"),n=t("utm_medium"),i=t("utm_campaign"),s=t("utm_term"),a=t("utm_content"),d=t("ref"),c=document.referrer;if(r&&(o.utm_source=r),n&&(o.utm_medium=n),i&&(o.utm_campaign=i),s&&(o.utm_term=s),a&&(o.utm_content=a),c&&(o.referrer_url=c),d&&(o.referral_code=d.slice(0,500)),o.landing_url=window.location.href,c||r||i||d){const t=`referral-logged-${d||"none"}`;if(sessionStorage.getItem(t))return;sessionStorage.setItem(t,"1"),fetch(window.chronoodleConfig.saveReferralEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}).then((e=>e.json())).then((t=>{e&&e(t)})).catch((e=>{console.error("Error logging referral:",e)}))}}static getQueryStringParam(e){return e?new URLSearchParams(window.location.search).get(e):null}static isQueryStringParamPresent(e){return!!e&&null!==this.getQueryStringParam(e)}static async startSession(){let e=this.getFromStorage("sessionUuid",sessionStorage),t=this.getFromStorage("deviceUuid");if(t||(t=`device_${this.generateUuid()}`,this.saveToStorage("deviceUuid",t)),!e){e=`session_${this.generateUuid()}`;const t=(new Date).toISOString();this.saveToStorage("sessionUuid",e,sessionStorage),this.saveToStorage("sessionStartDateTime",t,sessionStorage),this.isBot()||this.logSessionStart()}return e}static async getSessionUuid(){return await this.startSession()}static async logSessionStart(){const e={environment:this.getEnvironment(),deviceUuid:this.getDeviceUuid(),sessionUuid:await this.getSessionUuid(),deviceInfo:this.getDeviceInfo(),userAgent:navigator.userAgent};await(new OodleApi).post("/api/save-session-data",e)}static getUsernameInitials(){try{const e=this.getUsername().toUpperCase();return e?e.length<2?"":e.substring(0,1):""}catch(e){return"X"}}static getLocalYYYYMMDD(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}static parseLocalDateString(e){const[t,o,r]=e.split("-").map(Number);return new Date(t,o-1,r)}static formatSmartDate(e){if(!e)return null;const t=e instanceof Date?e:this.parseLocalDateString(e),o=new Date,r=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),n=new Date;return n.setDate(o.getDate()-1),r(t,o)?"TODAY":r(t,n)?"YESTERDAY":t.toLocaleDateString(void 0,{year:"numeric",month:"long",day:"numeric",weekday:"long"})}static getUserStartDate(){const e=this.Jwt.getClaim("createdAt");if(e){const t=Date.parse(e+"Z");if(!isNaN(t))return new Date(t)}return null}static getUsername(){return this.Jwt.getClaim("username")}static saveToStorage(e,t,o=localStorage){if("function"!=typeof o.setItem)throw new Error("Invalid storage provider: must implement setItem");o.setItem(e,JSON.stringify(t))}static getFromStorage(e,t=localStorage){if("function"!=typeof t.getItem)throw new Error("Invalid storage provider: must implement getItem");const o=t.getItem(e);try{return JSON.parse(o)}catch{return o}}static removeFromStorage(e,t=localStorage){if("function"!=typeof t.removeItem)throw new Error("Invalid storage provider: must implement removeItem");try{t.removeItem(e)}catch{return!1}return!0}static clearLocalStorageByPrefix(e){if("string"==typeof e&&""!==e.trim())for(const t in localStorage)t.startsWith(e)&&localStorage.removeItem(t);else console.warn("clearLocalStorageByPrefix: invalid prefix provided")}static saveToStorageWithExpiry(e,t,o){const r={value:t,expiry:(new Date).getTime()+o};this.saveToStorage(e,r)}static getFromStorageWithExpiry(e){const t=this.getFromStorage(e);if(!t)return null;return(new Date).getTime()>t.expiry?(this.removeFromStorage(e),null):t.value}static getDeviceUuid(){let e=this.getFromStorage("deviceUuid");return e||(e=`device_${this.generateUuid()}`,this.saveToStorage("deviceUuid",e)),e}static getEnvironment(){return window.chronoodleConfig.environment.toUpperCase()}static getDeviceInfo(){const e=navigator.platform;let t="Unknown OS";/Android/.test(navigator.userAgent)?t="Android":/iPhone|iPad|iPod/.test(navigator.userAgent)?t="iOS":e.includes("Mac")?t="MacOS":e.includes("Win")?t="Windows":e.includes("Linux")&&(t="Linux");const o=navigator.userAgent;let r="Unknown Browser";o.includes("Chrome")&&!o.includes("Chromium")?r="Chrome "+o.match(/Chrome\/(\d+\.\d+)/)[1]:o.includes("Firefox")?r="Firefox "+o.match(/Firefox\/(\d+\.\d+)/)[1]:o.includes("Safari")&&!o.includes("Chrome")?r="Safari "+o.match(/Version\/(\d+\.\d+)/)[1]:o.includes("MSIE")||o.includes("Trident")?r="Internet Explorer":o.includes("Edg")&&(r="Edge "+o.match(/Edg\/(\d+\.\d+)/)[1]);return`${t} | ${r} | ${/Mobi|Android/i.test(o)?"Mobile":"Desktop"} | ${`${window.screen.width}x${window.screen.height}`} | ${Intl.DateTimeFormat().resolvedOptions().timeZone} | ${navigator.language||navigator.userLanguage}`}static generateUuid(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}static isBot(){const e=navigator.userAgent.toLowerCase();return!!["bot","crawl","spider","slurp","mediapartners","googlebot","bingbot","baiduspider","yandex","duckduckbot","facebot","ia_archiver"].some((t=>e.includes(t)))||(!!navigator.webdriver||(0===window.screen.width||0===window.screen.height))}static mergeUniqueInArray(e,t){return[...new Set([...e,...t])]}static toggleDebugMode(){const e=document.getElementById("debug");e.classList.contains("open")?e.classList.remove("open"):e.classList.add("open")}static getFeatures(){const e=this.getFromStorage("featureFlags")||[],t=[],o=["enabled"],r=[{name:"'You Are Here' Mode",code:"you_are_here_mode",description:"Adds a visual callout to the 'Now' label in the game.",enabled:!1,rendered:!0,deletable:!1},{name:"Time Flip (Early Access)",code:"time_flip_mode",description:"Flips the chronological display order. When enabled, 'The Big Bang' will be at the top and 'Now' goes to the bottom.",enabled:!1,rendered:!0,deletable:!1},{name:"User Accounts",code:"user_accounts",description:"Sign in and save progress to your Oodle Games account",enabled:!0,rendered:!1,deletable:!1}];r.forEach((e=>{e.rendered||t.push(e.code)}));const n=e.filter((e=>!t.includes(e.code)));return r.forEach((e=>{const t=n.find((t=>t.code===e.code));t&&e.rendered?Object.keys(e).forEach((r=>{o.includes(r)||(t[r]=e[r])})):n.push(e)})),n.sort(((e,t)=>{const o=e.name.replace(/^[^a-zA-Z0-9]+/,"").toLowerCase(),r=t.name.replace(/^[^a-zA-Z0-9]+/,"").toLowerCase();return o.localeCompare(r)})),this.saveToStorage("featureFlags",n),n}static isFeatureAdded(e){return(this.getFromStorage("featureFlags")||[]).some((t=>t.code===e))}static disableFeature(e){let t=this.getFromStorage("featureFlags")||[];const o=t.findIndex((t=>t.code===e));-1!==o&&(t[o].enabled=!1,this.saveToStorage("featureFlags",t)),document.dispatchEvent(new Event("featureChange")),this.addTelemetry("FEATURE_FLAG",{code:e,enabled:!1})}static enableFeature(e){let t=this.getFromStorage("featureFlags")||[];const o=t.findIndex((t=>t.code===e));-1!==o&&(t[o].enabled=!0),this.saveToStorage("featureFlags",t),document.dispatchEvent(new Event("featureChange")),this.addTelemetry("FEATURE_FLAG",{code:e,enabled:!0})}static removeFeature(e){let t=this.getFromStorage("featureFlags")||[];t=t.filter((t=>t.code!==e)),this.saveToStorage("featureFlags",t),document.dispatchEvent(new Event("featureChange"))}static isFeatureEnabled(e){return(this.getFromStorage("featureFlags")||[]).some((t=>t.code===e&&t.enabled))}static async loadFeaturesBySecret(e){const t=await(new OodleApi).post("/api/v1/feature/get-by-secret",{secret:e});if(t.success&&t.data&&Array.isArray(t.data.features)&&t.data.features.length>0){const e=t.data.features,o=this.getFromStorage("featureFlags")||[];return e.forEach((e=>{o.find((t=>t.code===e.code))||o.push(e)})),this.saveToStorage("featureFlags",o),document.dispatchEvent(new Event("featureChange")),o}return null}static async sendLogToServer(e="INFO",t=null,o="",r="",n=""){const i={logLevel:e,logKey:t,title:o,message:r,details:n,deviceUuid:this.getDeviceUuid()||null,sessionUuid:await this.getSessionUuid()||null,source:"chronoodle.com"};(new OodleApi).enqueuePost("/api/v1/log",i)}static async addTelemetry(e,t){const o="undefined"!=typeof chronoodle,r=o&&chronoodle.currentChallengeKey?chronoodle.currentChallengeKey:null,n=o&&chronoodle.currentChallenge?String(chronoodle.currentChallenge.gameId):null,i=o&&chronoodle.getGameStateText?chronoodle.getGameStateText():null,s={environment:this.getEnvironment(),deviceUuid:this.getDeviceUuid(),sessionUuid:await this.getSessionUuid(),gameKey:r,gameId:n,eventType:e,gameData:t,gameState:i};await(new OodleApi).enqueuePost("/api/save-game-data",s)}static setCookie(e,t,o={}){let r=`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(o.expires)if("number"===o.expires){const e=new Date;e.setTime(e.getTime()+1e3*o.expires),r+=`; expires=${e.toUTCString()}`}else o.expires instanceof Date&&(r+=`; expires=${o.expires.toUTCString()}`);o.path&&(r+=`; path=${o.path}`),o.domain&&(r+=`; domain=${o.domain}`),o.secure&&(r+="; secure"),o.sameSite&&(r+=`; SameSite=${o.sameSite}`),document.cookie=r}static getCookie(e){return document.cookie.split("; ").reduce(((e,t)=>{const[o,r]=t.split("=");return e[decodeURIComponent(o)]=decodeURIComponent(r),e}),{})[e]||null}static deleteCookie(e,t={}){let o=`${encodeURIComponent(e)}=; expires=Thu, 01 Jan 1970 00:00:00 GMT`;t.path&&(o+=`; path=${t.path}`),t.domain&&(o+=`; domain=${t.domain}`),document.cookie=o}static createScrim(e="light",t=3){const o=document.createElement("div");return o.classList.add("basic-scrim"),"dark"===e&&o.classList.add("dark"),o.style.zIndex=t,document.body.appendChild(o),o}}"undefined"!=typeof module&&void 0!==module.exports&&(module.exports=Utils)
“Chronboozle” Results & References Chronoodle relies on quality resources to ensure historical accuracy. By visiting these sources, you’re supporting the original authors and helping promote knowledge-sharing.
Shaboozey drops record chart topper "A Bar Song (Tipsy)" 2024
Trendy beverage "Zima" is introduced 1993
Iconic copper mug filler, the Moscow Mule is invented 1941
Catchy sea shanty "Drunken Sailor" hits the high seas 1830
Arthur Guinness signs a 9,000 year lease at £45/year for the Guinness Brewery in Dublin 1759
Earliest known use of the term "Dutch Courage" 1665
The earliest evidence for intentionally made alcoholic drinks 11k BCE
Impersonating: @hoodler
Exit Impersonation DEBUG MODE Copy game data Exit debug mode You can re-enable debug mode in Settings.