{"version":3,"file":"../javascript/haze.js","sources":["haze.js"],"sourcesContent":["var HAZE = {\n    debug: false,\n    instances: [],\n    viewer: null,\n    timeout: 0,\n    isFirstLoad: true,\n    eventsFired: [],\n\n    delay: ms => new Promise(res => setTimeout(res, ms)),\n\n    get: function(instanceName) {\n        var instance = HAZE.instances[instanceName];\n\n        if (instance === undefined) {\n            console.log('haze instance not found ' + instanceName);\n        }\n\n        return instance;\n    },\n\n    destroy: function(instanceName) {\n        var instance = HAZE.get(instanceName);\n\n        if (instance === undefined) {\n            return;\n        }\n\n        delete HAZE.instances[instanceName];\n        // lets the same view be loaded twice but causes a console error\n        delete HAZE.viewer.instances[HAZE.viewer[instanceName].name];\n        delete HAZE.viewer[instanceName];\n    },\n\n    setFabric: function(instanceName, fabric, update) {\n        update = update || false;\n\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            if (HAZE.debug) {\n                console.log('No haze instance: ' + instanceName);\n            }\n            return;\n        }\n\n        if (HAZE.debug) {\n            console.log('haze fabric:', fabric);\n        }\n\n        HAZE.updateFeature(instanceName, 'UPHOLSTERY', fabric, update);\n    },\n\n    setCamera: function(instanceName, camera, update) {\n        update = update || false;\n\n        var instance = HAZE.get(instanceName);\n\n        if (!camera) {\n            return;\n        }\n\n        if (!instance) {\n            return;\n        }\n\n        if (HAZE.debug) {\n            console.log('haze setCamera:', camera, update);\n        }\n\n        if (!camera.angle_x || !camera.angle_y || !camera.distance) {\n            console.error('Invalid camera parameters:', camera);\n            return;\n        }\n\n        var config = {\n            camera: {\n                angle_x: parseFloat(camera.angle_x),\n                angle_y: parseFloat(camera.angle_y),\n                distance: parseFloat(camera.distance),\n            }\n        };\n\n        instance.config = config;\n        if (update) {\n            HAZE.updateInstance(instanceName);\n        }\n    },\n\n    setModel: function(instanceName, model, update) {\n        update = update || false;\n\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            return;\n        }\n\n        if (instance.model == model) {\n            return;\n        }\n\n        if (HAZE.debug) {\n            console.log('haze model:', model, update);\n        }\n\n        if (instance.measurementsShown) {\n            // If dimensions are currently shown, we need to hide them before updating the model\n            if (HAZE.debug) {\n                console.log('haze setModel hide dimensions', instanceName);\n            }\n            HAZE.showDimensions(instanceName, false);\n        }\n\n        instance.model = model;\n\n        if (update) {\n            HAZE.updateInstance(instanceName);\n        }\n    },\n\n    setDimensionsToggle: function(instanceName, toggleOn) {\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            return;\n        }\n\n        if (HAZE.debug) {\n            console.log('HAZE setDimensionsToggle:', instanceName, toggleOn);\n        }\n\n        instance.measurementsToggleOn = toggleOn;\n    },\n\n    toggleDimensions: function(instanceName) {\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            return;\n        }\n\n        HAZE.showDimensions(instanceName, !instance.measurementsShown);\n    },\n\n    showDimensions: async function(instanceName, show) {\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            return;\n        }\n\n        if (show) {\n            await HAZE.delay(1000); // Wait for 1000ms (1 second) to ensure the viewer is ready\n            if (HAZE.debug) {\n                console.log('waited 1 second');\n            }\n        }\n\n        if (HAZE.debug) {\n            console.log('haze show dimensions:', instance.model, show);\n            console.log('HAZE current template:', instance.measurementsCurrentTemplate);\n        }\n\n        var template = null;\n        if (!show && instance.measurementsCurrentTemplate) {\n            // if we are hiding the dimensions, we want to use the current template to hide them\n            template = instance.measurementsCurrentTemplate;\n            if (HAZE.debug) {\n                console.log('haze hide dimensions using current template:', template);\n            }\n        }\n\n        const templates = HAZE.viewer[instanceName].templates || [];\n\n        if (!template) {\n            var key = instance.model + '#def';\n            template = templates[key] ?? null;\n\n            if (HAZE.debug) {\n                console.log('HAZE template found', key);\n            }\n        }\n\n        if (!template) {\n            var keys = Object.keys(templates);\n\n            if (HAZE.debug) {\n                console.log('HAZE template keys', keys);\n            }\n\n            for (var i = 0; i < keys.length; i++) {\n                var key = keys[i];\n                template = templates[key] ?? null;\n\n                if (template) {\n                    break;\n                }\n            }\n        }\n\n        if (!template) {\n            if (HAZE.debug) {\n                console.log('haze no templates found for instance', instanceName, key);\n            }\n            return;\n        }\n\n        if (show) {\n            HAZE.viewer[instanceName].showDimensions(template);\n            instance.measurementsCurrentTemplate = template;\n            instance.measurementsShown = true;\n\n            if (HAZE.debug) {\n                console.log('haze show dimensions complete:', instanceName);\n            }\n        } else {\n            instance.measurementsCurrentTemplate = null; // clear the current template when hiding dimensions\n            HAZE.viewer[instanceName].hideDimensions(template);\n            instance.measurementsShown = false;\n\n            if (HAZE.debug) {\n                console.log('haze hide dimensions complete:', instanceName, instance.measurementsCurrentTemplate);\n            }\n        }\n    },\n\n    getFeatures: function(instanceName) {\n        var instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            return;\n        }\n\n        var changeFeatures = structuredClone(instance.features);\n\n        var features = [];\n        for (var k in changeFeatures) {\n            var feature = instance.features[k].code || instance.features[k];\n            features[k] = {code: feature};\n        }\n\n        if (HAZE.debug) {\n            console.log('haze get features:', instanceName, features);\n        }\n\n        return features;\n    },\n\n    updateAll: function(name, value) {\n        for (var instanceName in HAZE.instances) {\n            HAZE.updateFeature(instanceName, name, value);\n            HAZE.updateInstance(instanceName);\n        }\n    },\n\n    instantiate: function(id, instanceName, options) {\n        if (HAZE.debug) {\n            console.log('haze instantiate:', id, instanceName, options);\n        }\n\n        var type = options.type || (instanceName == 'chooser' ? 'image' : 'viewer');\n\n        instance = {\n            'id'       : id,\n            'features' : options.materials || {},\n            'model'    : options.model,\n            'gallery'  : options.gallery || false,\n            'name'     : instanceName,\n            'config'   : null,\n            'type'     : type,\n            'isViewerInitialised': function() {},\n            'measurementsShown': false,\n            'measurementsToggleOn': false,\n            'measurementsCurrentTemplate': null,\n        };\n\n        instance.isViewerInitialised = function() {\n            const canvas = document.querySelector('#' + this.id + ' canvas');\n\n            if (!canvas) {\n                return false;\n            }\n\n            return true;\n        }\n\n        HAZE.instances[instanceName] = instance;\n\n        if (!HAZE.viewer) {\n            HAZE.viewer = HAZE.findViewer();\n\n            if (HAZE.debug) {\n                console.log('haze viewer found:', HAZE.viewer);\n            }\n        }\n\n        if (HAZE.viewer) {\n            if (options.camera !== undefined) {\n                if (HAZE.debug) {\n                    console.log('haze camera:', options.camera);\n                }\n\n                HAZE.setCamera(instanceName, options.camera, true);\n\n                if (HAZE.debug) {\n                    console.log('haze instance config:', instance.config);\n                }\n            }\n\n            if (HAZE.debug) {\n                console.log('haze instance:', instance);\n            }\n\n            setTimeout(() => {\n                if (instanceName == 'admin') {\n                    HAZE.viewer[instanceName].onChange('camera.distance', null, HAZE.adminOnCameraChange);\n                    HAZE.viewer[instanceName].onChange('camera.alpha', null, HAZE.adminOnCameraChange);\n                    HAZE.viewer[instanceName].onChange('camera.beta', null, HAZE.adminOnCameraChange);\n                } else if (instanceName.indexOf('admin_crop') === 0) {\n                    HAZE.viewer[instanceName].onChange('camera.distance', null, HAZE.adminOnCameraChangeCrop);\n                    HAZE.viewer[instanceName].onChange('camera.beta', null, HAZE.adminOnCameraChangeCrop);\n                    HAZE.viewer[instanceName].onChange('camera.alpha', null, HAZE.adminOnCameraChangeCrop);\n                } else {\n                    HAZE.viewer[instanceName].onChange('camera.distance', null, HAZE.onCameraChange);\n                    HAZE.viewer[instanceName].onChange('camera.alpha', null, HAZE.onCameraChange);\n                    HAZE.viewer[instanceName].onChange('camera.beta', null, HAZE.onCameraChange);\n                }\n\n                HAZE.updateInstance(instanceName, instanceName.indexOf('admin') === 0);\n            }, 20);\n        } else {\n            console.log('haze.js; no haze :(');\n        }\n    },\n\n    adminOnCameraChangeCrop: function(key, newValue) {\n        if (isNaN(newValue)) {\n            return;\n        }\n\n        var name = key.split('.')[1];\n        const cropSelector = '.js-haze_crop_frame__' + name;\n        const cropField = document.querySelector(cropSelector);\n\n        if (name == 'distance') {\n            name = 'radius';\n            newValue = Math.round(newValue * 10) / 10;\n        }\n\n        if (cropField) {\n            cropField.value = newValue;\n            var value = newValue;\n\n            if (name !== 'radius') {\n                value = Math.floor(newValue * 180 / Math.PI);\n            }\n\n            const translations = {\n                alpha: 'angle_x',\n                beta: 'angle_y',\n                radius: 'distance',\n            };\n            const param = translations[name];\n            const hazeImages = document.querySelectorAll('.js-haze_crop img');\n\n            hazeImages.forEach(image => {\n                const url = new URL(image.src);\n                url.searchParams.set(param, value);\n\n                image.src = url.toString();\n            });\n        }\n    },\n\n    adminOnCameraChange: function(key, newValue) {\n        if (isNaN(newValue)) {\n            return;\n        }\n\n        var name = key.split('.')[1];\n\n        if (name == 'distance') {\n            name = 'radius';\n            newValue = Math.round(newValue * 10) / 10;\n        }\n\n        if (HAZE.debug) {\n            console.log('haze admin camera change:', name, newValue);\n        }\n\n        const selector = '.js-haze_frame__' + name;\n        const field = document.querySelector(selector);\n        field.value = newValue;\n    },\n\n    onCameraChange: async function(key, newValue) {\n        if (isNaN(newValue)) {\n            return;\n        }\n\n        var name = key.split('.')[1];\n\n        if (name == 'distance') {\n            newValue = Math.round(newValue * 10) / 10;\n        }\n\n        if (HAZE.debug) {\n            // console.log('haze camera change:', name, newValue);\n        }\n\n        HAZE.debounce(function() {\n            if (HAZE.eventsFired.includes('camera_change' + ':' + name)) {\n                if (HAZE.debug) {\n                    console.log('haze camera change event already fired:', 'camera_change' + ':' + name);\n                }\n                return;\n            }\n\n            HAZE.eventsFired.push('camera_change' + ':' + name);\n            HAZE.addToDataLayer('3d_viewer', {\n                'interaction_type': 'camera_change',\n                'dimension': name,\n            });\n        }, 250)();\n    },\n\n    debounce: function(func, wait, immediate) {\n        if (HAZE.isFirstLoad) {\n            return function() {\n                var later = function() {\n                    HAZE.timeout = null;\n                    HAZE.isFirstLoad = false;\n                    if (HAZE.debug) {\n                        console.log('haze first load debounce');\n                    }\n                };\n                clearTimeout(HAZE.timeout);\n                HAZE.timeout = setTimeout(later, 2500);\n            };\n        }\n\n        return function() {\n            var context = this, args = arguments;\n            var later = function() {\n                HAZE.timeout = null;\n                if (!immediate) func.apply(context, args);\n            };\n            var callNow = immediate && !HAZE.timeout;\n            clearTimeout(HAZE.timeout);\n            HAZE.timeout = setTimeout(later, wait);\n            if (callNow) func.apply(context, args);\n        };\n    },\n\n    addToDataLayer: function(event, params) {\n        if (window.dataLayer) {\n            var data = {\n                'event': event,\n            };\n\n            for (var key in params) {\n                data[key] = params[key];\n            }\n\n            window.dataLayer.push(data);\n\n            if (HAZE.debug) {\n                console.log('haze dataLayer push:', data);\n            }\n        }\n    },\n\n    findViewer: function() {\n        if (!v3) {\n            console.error('Haze v3 is not defined');\n            return;\n        }\n\n        if (HAZE.viewer) {\n            if (HAZE.debug) {\n                console.log('haze viewer already exists:', HAZE.viewer);\n            }\n            return HAZE.viewer;\n        }\n\n        return v3;\n    },\n\n    updateInstance: function(instanceName, force) {\n        var instance = HAZE.get(instanceName);\n        var force = force || false;\n\n        if (HAZE.debug) {\n            console.log('haze update instance:', instanceName);\n        }\n\n        HAZE.updateLayout(instance, instance.model, HAZE.getFeatures(instanceName), instance.config, force);\n\n        if (instanceName == 'gallery') {\n            HAZE.updateGallery(instanceName);\n        }\n    },\n\n    updateLayout: async function(instance, model, materials, config, force) {\n        if (HAZE.debug) {\n            console.log('haze update layout:', {instance, model, materials, config, force});\n            console.log('haze instance name:', instance.name);\n        }\n\n        if (!HAZE.viewer) {\n            return;\n        }\n\n        var material = {...materials};\n\n        var options = {\n            'model': model,\n            'materials': material,\n        };\n\n        if (force) {\n            options.forceToUpdate = force;\n        }\n\n        if (config) {\n            options.camera = config.camera || null;\n        }\n\n        if (instance.type == 'image') {\n            if (HAZE.debug) {\n                console.log('haze setModel params (' + instance.name + ' view):', options);\n            }\n\n            setTimeout(() => {\n                HAZE.viewer.gallery.views[instance.name].setModel(options);\n            }, 20);\n\n            return;\n        } else {\n            if (HAZE.debug) {\n                console.log('haze setModel params (' + instance.name + ' viewer):', options);\n            }\n\n            var timeout = 20;\n\n            if (instance.name == 'admin' && force) {\n                timeout = 2000; // Admin viewer needs more time to load\n            }\n\n            setTimeout(() => {\n                HAZE.viewer[instance.name].setModel(options);\n                HAZE.showDimensions(instance.name, instance.measurementsToggleOn);\n            }, timeout);\n        }\n    },\n\n    updateFeature: function(instanceName, part, material, update) {\n        update = update || false;\n\n        if (HAZE.debug) {\n            console.log('haze update feature:', instanceName, part, material, update);\n        }\n\n        const instance = HAZE.get(instanceName);\n\n        if (!instance) {\n            if (HAZE.debug) {\n                console.log('haze instance not found ' + instanceName);\n            }\n            return;\n        }\n\n        var newFeatures = structuredClone(instance.features);\n\n        if (newFeatures == material) {\n            return;\n        }\n\n        newFeatures[part] = material;\n        instance.features = newFeatures;\n\n        if (HAZE.debug) {\n            console.log('haze update features:', instance.name, instance.features);\n        }\n\n        if (update) {\n            HAZE.updateInstance(instanceName);\n        }\n\n        if (HAZE.debug) {\n            HAZE.instances.forEach((inst, name) => {\n                console.log('haze update feature instance:', name, inst);\n            });\n        }\n    },\n\n    updateGallery: function(instanceName) {\n        if (HAZE.debug) {\n            console.log('haze updateGallery:', instanceName);\n        }\n\n        var features = HAZE.getFeatures(instanceName);\n        var instance = HAZE.get(instanceName);\n\n        var clonedFeatures = structuredClone(features);\n\n        var materials = [];\n\n        for (var k in clonedFeatures) {\n            var feature = clonedFeatures[k].code || clonedFeatures[k];\n            materials.push(k + ':' + feature);\n        }\n\n        features = materials.join(',');\n\n        document.querySelectorAll('.js-haze').forEach(element => {\n            element.querySelectorAll('img').forEach(img => {\n                if (img.src) {\n                    var src = img.src;\n                    var url = new URL(src);\n                    url.searchParams.set('materials', features);\n                    var newSrc = url.toString();\n\n                    if (src != newSrc) {\n                        img.src = newSrc;\n                    }\n                }\n            });\n        });\n\n        document.querySelectorAll('.js-haze-first').forEach(element => {\n            element.querySelectorAll('img').forEach(img => {\n                if (img.src) {\n                    var src = img.src;\n                    var url = new URL(src);\n                    var pathname = url.pathname;\n\n                    var pattern = new RegExp('\\_(.*)[\\.]');\n                    var newPath = pathname.replace(pattern, '_' + encodeURIComponent(instance.model) + '.');\n                    url.pathname = newPath;\n\n                    var camera = instance.config.camera || {};\n                    for (const [key, value] of Object.entries(camera)) {\n                        url.searchParams.set(key, value);\n                    };\n\n                    var newSrc = url.toString();\n\n                    if (src != newSrc) {\n                        img.src = newSrc;\n\n                        if (HAZE.debug) {\n                            console.log('haze update image:', src, newSrc);\n                        }\n                    }\n                }\n            });\n        });\n\n        document.querySelectorAll('.js-haze-viewer-thumb').forEach(element => {\n            element.querySelectorAll('img').forEach(img => {\n                if (img.src) {\n                    var src = img.src;\n                    var url = new URL(src);\n                    url.searchParams.set('materials', features);\n\n                    var pattern = new RegExp('\\_.*[\\.]');\n                    var newPath = url.pathname.replace(pattern, '_' + encodeURIComponent(instance.model) + '.');\n                    url.pathname = newPath;\n\n                    var camera = instance.config.camera || {};\n                    for (const [key, value] of Object.entries(camera)) {\n                        url.searchParams.set(key, value);\n                    };\n\n                    var newSrc = url.toString();\n\n                    if (src != newSrc) {\n                        img.src = newSrc;\n\n                        if (HAZE.debug) {\n                            console.log('haze update viewer thumb path:', newPath);\n                            console.log('haze update viewer thumb:', src, newSrc);\n                        }\n                    }\n                }\n            });\n        });\n    },\n\n    afterLoadTemplate: function(instance) {},\n};\n"],"names":["HAZE","debug","instances","viewer","timeout","isFirstLoad","eventsFired","delay","ms","Promise","res","setTimeout","get","instanceName","instance","undefined","console","log","destroy","name","setFabric","fabric","update","updateFeature","setCamera","camera","config","angle_x","angle_y","distance","parseFloat","updateInstance","error","setModel","model","measurementsShown","showDimensions","setDimensionsToggle","toggleOn","measurementsToggleOn","toggleDimensions","async","show","await","measurementsCurrentTemplate","template","templates","key","keys","Object","i","length","hideDimensions","getFeatures","k","features","structuredClone","feature","code","updateAll","value","instantiate","id","options","type","materials","gallery","isViewerInitialised","document","querySelector","this","findViewer","onChange","adminOnCameraChange","indexOf","adminOnCameraChangeCrop","onCameraChange","newValue","isNaN","split","cropField","Math","round","translations","floor","PI","alpha","beta","radius","param","querySelectorAll","forEach","image","url","URL","src","searchParams","set","toString","debounce","includes","push","addToDataLayer","interaction_type","dimension","func","wait","immediate","clearTimeout","context","args","arguments","callNow","apply","event","params","window","dataLayer","data","v3","force","updateLayout","updateGallery","forceToUpdate","views","part","material","newFeatures","inst","clonedFeatures","join","element","img","newSrc","pathname","pattern","RegExp","newPath","replace","encodeURIComponent","entries","afterLoadTemplate"],"mappings":"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"}