{"version":3,"file":"../javascript/haze.js","sources":["haze.js"],"sourcesContent":["var HAZE = {\n    debug: false,\n    instances: [],\n    viewer: null,\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        instance.model = model;\n\n        if (update) {\n            HAZE.updateInstance(instanceName);\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        };\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                }\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    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            }, 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","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","getFeatures","k","features","structuredClone","feature","code","updateAll","value","instantiate","id","options","type","materials","gallery","isViewerInitialised","document","querySelector","this","findViewer","setTimeout","onChange","adminOnCameraChange","indexOf","adminOnCameraChangeCrop","key","newValue","isNaN","split","cropField","Math","round","translations","floor","PI","alpha","beta","radius","param","querySelectorAll","forEach","image","url","URL","src","searchParams","set","toString","v3","force","updateLayout","updateGallery","async","forceToUpdate","views","timeout","part","material","newFeatures","inst","clonedFeatures","push","join","element","img","newSrc","pathname","pattern","RegExp","newPath","replace","encodeURIComponent","Object","entries","afterLoadTemplate"],"mappings":"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"}