window.Codex = function() { let overrides = JSON.parse(localStorage.getItem('codex-overrides')) || {} let init = function() { if(!window.codex) { window.codex = { api: 'https://sala-studio.codexfit.com', translations: 'https://sala-studio.codexfit.com/api/v1/customer/translations', stripe_key: 'pk_live_97qd6Nyg5imtOgmav4w5pshU', timezone: 'Pacific/Auckland', components: {}, stageIds: ['codex-app'], locale: 'en-NZ', currency: 'NZD', currencyDecimals: 2, app_id: 'sala-studio', analytics: {"enabled":true,"webEnabled":true,"appEnabled":false,"firstPartyEndpoint":"https://analytics.sala.studio","publishDataLayer":true,"assumeConsent":false,"debug":false,"ga":{"measurementId":""}}, delimiters: ['{{','}}'], routerConfig: { mode: 'hash' }, scriptUrl: 'https://codexfit-api-assets.s3.amazonaws.com/release/latest/main.js', styleUrl: '', 'auto_configure': { modals: { 'codex-cart': { modalProps: { 'v-slot': '{open, close}', 'x-position': 'right', 'y-position': 'bottom', }, props: { 'v-on:updated': 'open', 'v-on:open': 'open', 'v-on:close': 'close', } }, 'codex-login': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-register': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-password-recover': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-password-reset': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, }, props: { 'v-on:close': 'close' } }, 'codex-verify-sms': { modalProps: { 'v-slot': '{close}', ':delay-close': 3000, ':show-close-button': false }, props: { 'v-on:close': 'close' } }, 'codex-waitlist-confirmation': { modalProps: { 'v-slot': '{close, open}', ':delay-close': 3000 }, props: { 'v-on:close': 'close', 'v-on:open': 'open' } }, 'codex-survey': { modalProps: { 'v-slot': '{close}', }, props: { 'v-on:close': 'close', } } } }, registration_fields: {"first_name":{"type":"text","group":"","handle":"first_name","title":"","required":true,"placeholder":"First Name","validation":"","label_translation":"register_fields.first_name","placeholder_translation":"register_fields.first_name_placeholder","columnspan":"1"},"last_name":{"type":"text","group":"","handle":"last_name","title":"","required":true,"placeholder":"Last Name","validation":"","label_translation":"register_fields.last_name","placeholder_translation":"register_fields.last_name_placeholder","columnspan":"1"},"email":{"type":"email","group":"","handle":"email","title":"","required":true,"placeholder":"Email","validation":"","label_translation":"register_fields.email","placeholder_translation":"register_fields.email_placeholder","columnspan":"1"},"opt_in_email":{"type":"checkbox","group":"","handle":"opt_in_email","title":"","required":false,"placeholder":"","validation":"","label_translation":"register_fields.opt_in_email","placeholder_translation":"register_fields.opt_in_email_placeholder","default":false,"inverted":false,"columnspan":"1"},"password":{"type":"password","group":"","handle":"password","title":"","required":true,"placeholder":"Password","validation":"","label_translation":"register_fields.password","placeholder_translation":"register_fields.password_placeholder","columnspan":"1"},"password_confirmation":{"type":"password","group":"","handle":"password_confirmation","title":"","required":true,"placeholder":"Confirm password Placeholder","validation":"","label_translation":"register_fields.password_confirmation","placeholder_translation":"register_fields.password_confirmation_placeholder","columnspan":"1"},"dob":{"type":"date","group":"","handle":"dob","title":"","required":true,"placeholder":"","validation":"","label_translation":"register_fields.dob","placeholder_translation":"register_fields.dob_placeholder","columnspan":"1"},"telephone":{"type":"telephone","group":"","handle":"telephone","title":"","required":true,"placeholder":"Mobile number","validation":"","label_translation":"register_fields.telephone","placeholder_translation":"register_fields.telephone_placeholder","columnspan":"1"},"opt_in_sms":{"type":"checkbox","group":"opt_ins","handle":"opt_in_sms","title":"","required":false,"placeholder":"","validation":"","label_translation":"register_fields.opt_in_sms","placeholder_translation":"register_fields.opt_in_sms_placeholder","default":false,"inverted":false,"columnspan":"1"}}, registration_fields_layout: 1, update_fields: {"first_name":{"type":"text","group":"","handle":"first_name","title":"","required":true,"placeholder":"First Name","validation":"","label_translation":"update_fields.first_name","placeholder_translation":"update_fields.first_name_placeholder","columnspan":"2"},"last_name":{"type":"text","group":"","handle":"last_name","title":"","required":true,"placeholder":"Last Name","validation":"","label_translation":"update_fields.last_name","placeholder_translation":"update_fields.last_name_placeholder","columnspan":"2"},"email":{"type":"email","group":"","handle":"email","title":"","required":true,"placeholder":"Email","validation":"","label_translation":"update_fields.email","placeholder_translation":"update_fields.email_placeholder","columnspan":"2"},"username":{"type":"text","group":"","handle":"username","title":"","required":false,"placeholder":"Username","validation":"","label_translation":"update_fields.username","placeholder_translation":"update_fields.username_placeholder","columnspan":"2"},"password":{"type":"password","group":"","handle":"password","title":"","required":true,"placeholder":"Password","validation":"","label_translation":"update_fields.password","placeholder_translation":"update_fields.password_placeholder","columnspan":"2"},"password_confirmation":{"type":"password","group":"","handle":"password_confirmation","title":"","required":true,"placeholder":"Confirm password Placeholder","validation":"","label_translation":"update_fields.password_confirmation","placeholder_translation":"update_fields.password_confirmation_placeholder","columnspan":"2"},"dob":{"type":"date","group":"","handle":"dob","title":"","required":true,"placeholder":"Enter your date of birth","validation":"","label_translation":"update_fields.dob","placeholder_translation":"update_fields.dob_placeholder","columnspan":"2"},"telephone":{"type":"telephone","group":"","handle":"telephone","title":"","required":true,"placeholder":"Mobile number","validation":"","label_translation":"update_fields.telephone","placeholder_translation":"update_fields.telephone_placeholder","columnspan":"2"},"opt_in_email":{"type":"checkbox","group":"opt_ins","handle":"opt_in_email","title":"","required":false,"placeholder":"","validation":"","label_translation":"update_fields.opt_in_email","placeholder_translation":"update_fields.opt_in_email_placeholder","default":false,"inverted":false,"columnspan":"2"},"opt_in_sms":{"type":"checkbox","group":"opt_ins","handle":"opt_in_sms","title":"","required":false,"placeholder":"","validation":"","label_translation":"update_fields.opt_in_sms","placeholder_translation":"update_fields.opt_in_sms_placeholder","default":false,"inverted":false,"columnspan":"2"}}, update_fields_layout: 2, urls: {"buy_url":"https:\/\/www.sala.studio\/buy","event_url":"https:\/\/www.sala.studio\/book","video_url":"https:\/\/www.sala.studio\/video?id={videoId}&collection={collection}&index={index}","videos_url":"https:\/\/www.sala.studio\/class-finder","account_url":"https:\/\/www.sala.studio\/account","booking_url":"https:\/\/www.sala.studio\/book","website_url":"https:\/\/www.sala.studio","instructor_url":"https:\/\/www.sala.studio\/instructor?handle={handle}","instructors_url":"https:\/\/www.sala.studio\/instructors","video_collection_url":"https:\/\/www.sala.studio\/collection?collection={collection}","video_collection_listing_url":"https:\/\/www.sala.studio\/series"}, metafield_schema: {"eventtype":{"_classpass_exclusions":{"label":"Classpass Exclusions","icon":null,"show_on_website":false,"order":0}},"event":{"_classpass_exclusions":{"label":"Classpass Exclusions","icon":null,"show_on_website":false,"order":0}},"instructor":{"spotify":{"label":"Spotify URL","icon":null,"show_on_website":false,"order":0},"description":{"label":"Description","icon":null,"show_on_website":false,"order":1},"spotify_embed":{"label":"Spotify playlist Embed","icon":null,"show_on_website":false,"order":2}},"videocollection":{"intensity":{"label":"Intensity","icon":null,"show_on_website":false,"order":0},"instructor":{"label":"Instructor Name","icon":null,"show_on_website":false,"order":1}},"video":{"focus":{"label":"Focus","icon":null,"show_on_website":false,"order":0},"spotify":{"label":"Spotify playlist","icon":null,"show_on_website":false,"order":1},"category":{"label":"Category","icon":null,"show_on_website":false,"order":2},"duration":{"label":"Duration","icon":null,"show_on_website":false,"order":3},"equipment":{"label":"Equipment","icon":null,"show_on_website":false,"order":4},"intensity":{"label":"Intensity","icon":null,"show_on_website":false,"order":5},"instructor":{"label":"Instructor","icon":null,"show_on_website":false,"order":6}}} } Object.keys(overrides).map(x => { window.codex[x] = overrides[x] }) var observer = new MutationObserver(function() { if (document.body) { if(window.codex.translations) { let translations = document.createElement("script") translations.type = "text/javascript" translations.src = window.codex.translations translations.addEventListener('load', function() { console.log('%cCodex |%c Translations loaded', 'font-weight: bold', 'font-weight: normal') document.dispatchEvent(new Event('codex-initialise')) }) document.head.appendChild(translations) console.log('%cCodex |%c Added translations', 'font-weight: bold', 'font-weight: normal') } if(window.codex.scriptUrl) { loadScript = function() { let cs = document.createElement("script") cs.type = window.codex.scriptType ?? "text/javascript" cs.src = window.codex.scriptUrl cs.module = cs.defer = true if(window.codex.momentLocaleUrl) { cs.addEventListener("load", function() { let mls = document.createElement("script") mls.type = "text/javascript" mls.src = window.codex.momentLocaleUrl mls.defer = true document.body.appendChild(mls) console.log('%cCodex |%c Added moment locale script', 'font-weight: bold', 'font-weight: normal') }) } document.body.appendChild(cs) console.log('%cCodex |%c Added app script', 'font-weight: bold', 'font-weight: normal') } if(document.readyState === "complete") { loadScript() } else { document.addEventListener("DOMContentLoaded", loadScript) } } if(window.codex.styleUrl) { let css = document.createElement("link") css.media = "all" css.type = "text/css" css.rel = "stylesheet" css.href = window.codex.styleUrl document.head.appendChild(css) console.log('%cCodex |%c Added default styles', 'font-weight: bold', 'font-weight: normal') } if(window.codex?.auto_configure?.modals) { // Create a single container for all modals const modalContainer = document.createElement("div") modalContainer.id = "codex-modal-container" modalContainer.dataset.codex = "" // Create modals within the single container Object.entries(window.codex.auto_configure.modals).forEach(([component, attrs]) => { const modal = document.createElement("codex-modal") modal.setAttribute('modal-name', component) Object.entries(attrs.modalProps ?? {}).forEach(([key, value]) => { modal.setAttribute(key, value) }) const vueComponent = document.createElement(component) Object.entries(attrs.props ?? {}).forEach(([key, value]) => { vueComponent.setAttribute(key, value) }) modal.appendChild(vueComponent) modalContainer.appendChild(modal) }) // Append the single container to body instead of head document.body.appendChild(modalContainer) document.addEventListener("click", (event) => { if(event.target?.dataset.codexModalOpen) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.open.' + event.target.dataset.codexModalOpen)) } if(event.target?.dataset.codexModalClose) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.close.' + event.target.dataset.codexModalClose)) } if(event.target?.dataset.codexModalToggle) { event.stopPropagation() document.dispatchEvent(new Event('codex.modal.toggle.' + event.target.dataset.codexModalToggle)) } }) console.log('%cCodex |%c Added default modals', 'font-weight: bold', 'font-weight: normal') } observer.disconnect(); } }) observer.observe(document.documentElement, {childList: true}); console.log(`%cCodex | %cConfiguring...`, 'font-weight: bold', 'font-weight: normal' ) if(localStorage.getItem('codex-overrides')) { console.log('%cCodex | %cWarning! Using custom overrides %o', 'font-weight: bold', 'color: rgb(217,31,38)', overrides) // Object.keys(overrides).map(x => { // console.log('%c ' + x + ': ' + overrides[x], 'display: block; color: red') // }) } // if(localStorage.getItem('codex-script-url')) { // console.log(`%cWarning: Using custom script URL: ` + localStorage.getItem('codex-script-url'), 'display: block; font-size: 16px;color: red);') // } } } let addStage = function(id) { window.codex.stageIds.push(id) } let store = function(key, value) { window.codex[key] = value overrides[key] = value localStorage.setItem('codex-overrides', JSON.stringify(overrides)) } let set = function(key, value) { window.codex[key] = value } let unset = function(key) { delete window.codex[key] delete overrides[key] localStorage.setItem('codex-overrides', JSON.stringify(overrides)) } return { addStage, store, set, unset, init, } } Codex().init();