//2024 Munro Research Limited, All rights reserved const BASE_URL = "https://app.anymodel.xyz"; var supportedOptions = {}; var availableTextModels = {}; var availableImageModels = {}; // var availableSummaryEngines = []; var openShareMenus = []; var imageState = null; var textState = null; var publicMode = false; var showPricing = false; var autoSave = true; async function init() { extendSidebar(); publicMode = await handleQueryString(); if (publicMode) { //public mode initPublicMode(); return; } restoreNightDayMode(); await restoreSessionOrRedirectToLogin(); await initialiseOptionsAndStates(); populatePricing(supportedOptions); if (showPricing) { await pricing(); } else { await initText(fresh=true); } restoreAutoSave(); } function initPublicMode() { document.getElementById("saved-sessions").style.display = "none"; document.getElementById("public-content").style.display = "block"; document.getElementById("logout-btn").style.display = "none"; document.getElementById("account-btn").style.display = "none"; document.getElementById("signin-btn").style.display = "block"; document.getElementById("signup-btn").style.display = "block"; document.getElementById("image-options").style.display = "none"; document.getElementById("image-prompt").style.display = "none"; document.querySelector("#image-controls .controls-left").style.display = "none"; } async function handleQueryString() { const urlParams = new URLSearchParams(window.location.search); showPricing = urlParams.get('pricing'); const status = urlParams.get('status'); if (status) { setStatus(status, 20000); } const error = urlParams.get('error'); if (error) { setError(error, 20000); } const view= urlParams.get("view"); if (view) { try { console.log("Opening public view"); let result = await openState(view, publicMode=true); return result; } catch (err) { console.log(err); } } window.history.pushState({}, document.title, stripQueryStringAndHashFromPath(location.href)); return false; } async function initialiseOptionsAndStates() { await retrieveOptions(); await updateSavedStates(); } async function openState(id, public=false) { openPage("Loader"); try { if (public) { var loadedState = await loadPublicState(id); } else { var loadedState = await loadState(id); } switch(loadedState.type) { case "TEXT": console.log(`Loading text state ${id}`); textState = loadedState; initText(); return true; case "IMAGE": console.log(`Loading image state ${id}`); imageState = loadedState; initImage(); return true; default: setError("Unrecognized state type", 20000); } } catch { setError("Requested state not found", 20000); } return false; } async function retrieveOptions() { let response = await fetch(`${BASE_URL}/supported-options`); if (response.status == 200) { supportedOptions = await response.json(); for (section of supportedOptions.textModelList) { for (const model of section.models) { availableTextModels[model.name] = model; } } for (section of supportedOptions.imageModelList) { for (const model of section.models) { availableImageModels[model.name] = model; } } } else { console.log(response); setError("Internal Error, please try again later"); } } function showMobileMenu() { var nav = document.getElementById("nav"); var bars = document.getElementById("mobile-menu-icon"); if (nav.className === "") { nav.className = "mobile"; bars.className = "fa-solid fa-xmark fa-2x"; } else { nav.className = ""; bars.className = "fa fa-bars fa-2x"; } if (document.getElementById("credit-menu")) document.getElementById("credit-menu").style.display = "none"; if (document.getElementById("help-menu")) document.getElementById("help-menu").style.display = "none"; } function showHelpMenu() { let block = document.getElementById("help-menu").style.display == "block"; if (document.getElementById("credit-menu")) document.getElementById("credit-menu").style.display = "none"; if (block) { document.getElementById("help-menu").style.display = "none"; } else { document.getElementById("help-menu").style.display = "block"; } } async function pricing() { await updateAccountInfo(); openPage("Pricing"); retractSidebar(); if (userStatus.plan == "plan1" && userStatus.status != "canceled") { document.getElementById("plan1-price").classList.add("current-plan"); document.getElementById("plan1-btn").innerHTML = "Cancel Plan"; } else if (userStatus.plan == "plan2" && userStatus.status != "canceled") { document.getElementById("plan2-price").classList.add("current-plan"); document.getElementById("plan1-btn").innerHTML = "Downgrade"; document.getElementById("plan2-btn").innerHTML = "Cancel"; } else if (userStatus.plan == "plan3" && userStatus.status != "canceled") { document.getElementById("plan3-price").classList.add("current-plan"); document.getElementById("plan1-btn").innerHTML = "Contact us to downgrade"; document.getElementById("plan1-btn").onclick = contactUs; document.getElementById("plan2-btn").innerHTML = "Contact us to downgrade"; document.getElementById("plan2-btn").onclick = contactUs; } else { document.getElementById("trial-price").classList.add("current-plan"); } } function contactUs() { console.log("contact"); } let statusTimout = null; function setError(error, timeout) { let statusField = document.getElementById("status"); if (error == "") { statusField.innerHTML = " "; } else { statusField.innerHTML = error; scrollToTop(); } statusField.classList.remove("status"); statusField.classList.add("error"); statusTimout = null; if (!isNaN(timeout)) { statusTimout = setTimeout(() => { statusField.innerHTML = " "; }, timeout); statusTimout = setTimeout(() => { statusField.innerHTML = "  "; }, timeout); } } function setStatus(status, timeout) { let statusField = document.getElementById("status") statusField.innerHTML = status == "" ? " " : status; statusField.classList.remove("error"); statusField.classList.add("status"); statusTimout = null; if (!isNaN(timeout)) { statusTimout = setTimeout(() => { statusField.innerHTML = "  "; }, timeout); } } function scrollToTop() { setTimeout(function () { window.scrollTo({ top: 0, behavior: 'smooth' }); }, 25); } function mobileCheck() { let check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; }; // return a promise that resolves with a File instance async function urlToFile(url, filename, mimeType){ if (url.startsWith('data:')) { var arr = url.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[arr.length - 1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } var file = new File([u8arr], filename, {type:mime || mimeType}); return Promise.resolve(file); } return fetch(url) .then(res => res.arrayBuffer()) .then(buf => new File([buf], filename,{type:mimeType})); } function deleteElementMatching(arr, elem) { const index = arr.indexOf(elem); if (index > -1) { arr.splice(index, 1); } } async function saveState(state) { if (!state._id && numberOfSavedStates >= supportedOptions.plans[userStatus.plan].maxSavedSessions) { exceededMaxItemsSaved(); return; } if (publicMode) { publicModeMessage(); return; } let response = await fetch(`${BASE_URL}/state/save`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, body: JSON.stringify({ state }) }) let json = await response.json(); if (response.status == 200) { state._id = json.id; updateSavedStates(); window.onbeforeunload = null; } else { throw new Error(json.error); } } async function loadPublicState(id) { let response = await fetch(`${BASE_URL}/state/load/public/${id}`, { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, }); let json = await response.json(); if (response.status == 200) { return json.state; } else { throw new Error(json.error); } } async function loadState(id) { let response = await fetch(`${BASE_URL}/state/load/${id}`, { method: 'GET', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': token }, }); if (response.status == 200) { let json = await response.json(); return json.state; } else { throw new Error(json.error); } } function stripQueryStringAndHashFromPath(url) { return url.split("?")[0].split("#")[0]; } async function copyToClipboard(text){ await navigator.clipboard.writeText(text); } async function togglePublicState(id) { let public = document.getElementById(`checkbox-${id}`).checked; let loadedState = await loadState(id); loadedState.public = public; await saveState(loadedState); } function toggleFab(id) { let fab = document.getElementById(id); if (fab.classList.contains("slide")) { fab.classList.remove("slide"); setTimeout(() => fab.classList.remove('show'), 250); } else { fab.classList.add("show"); setTimeout(() => fab.classList.add('slide'), 50); } } function parseJwtUnverified (token) { var base64Url = token.split('.')[1]; var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); return JSON.parse(jsonPayload); } function isBaseTierUser() { return (userStatus.status == "trial" || userStatus.plan == "plan1"); } function populatePricing(options) { const baseTextModelList = document.getElementById("base-text-model-list"); const plusTextModelList = document.getElementById("plus-text-model-list"); for (const section of options.textModelList) { for (const model of section.models) { if (model.tier == "base") { baseTextModelList.innerHTML += `
  • ${model.displayName}
  • `; } else if (model.tier=="plus") { plusTextModelList.innerHTML += `
  • ${model.displayName}
  • `; } } } const baseImageModelList = document.getElementById("base-image-model-list"); const plusImageModelList = document.getElementById("plus-image-model-list"); for (const section of options.imageModelList) { for (const model of section.models) { if (model.tier == "base") { baseImageModelList.innerHTML += `
  • ${model.displayName}
  • `; } else if (model.tier=="plus") { plusImageModelList.innerHTML += `
  • ${model.displayName}
  • `; } } } let trialFeatures = document.getElementById("trial-features"); let starterFeatures = document.getElementById("starter-features"); let plusFeatures = document.getElementById("plus-features"); trialFeatures.innerHTML = trialFeatures.innerHTML .replace("$trial_monthly_text", options.plans.trial.textAllowance) .replace("$trial_monthly_images", options.plans.trial.imageAllowance) .replace("$trial_saved_sessions", options.plans.trial.maxSavedSessions); starterFeatures.innerHTML = starterFeatures.innerHTML .replace("$starter_monthly_text", options.plans.plan1.textAllowance) .replace("$starter_monthly_images", options.plans.plan1.imageAllowance) .replace("$starter_saved_sessions", options.plans.plan1.maxSavedSessions); plusFeatures.innerHTML = plusFeatures.innerHTML .replace("$plus_monthly_text", options.plans.plan2.textAllowance) .replace("$plus_monthly_images", options.plans.plan2.imageAllowance) .replace("$plus_saved_sessions", options.plans.plan2.maxSavedSessions); document.getElementById("text-units-input").innerHTML = options.parameters.textUnits.input; document.getElementById("text-units-output").innerHTML = options.parameters.textUnits.output; } function toggleAutosave() { autoSave = !autoSave; localStorage.setItem("autosave", autoSave); } function restoreAutoSave() { autoSaveSetting = localStorage.getItem("autosave"); if (autoSaveSetting == undefined) { //autosave should be on by default autoSave = true; localStorage.setItem("autosave", autoSave); } else { //and user's setting restored if they have set one autoSave = autoSaveSetting === "true"; } document.getElementById("autosave").checked = autoSave; } function insufficientAllowance() { document.getElementById("tmp").innerHTML = ``; } function upgradeToPremium() { document.getElementById("tmp").innerHTML = ``; } function exceededMaxItemsSaved() { document.getElementById("tmp").innerHTML = ``; }