{"version":3,"sources":["jsdelivr-header.js","/npm/janusweb@1.7.0/scripts/janusweb.js"],"names":[],"mappings":"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","file":"/npm/janusweb@1.7.0/scripts/janusweb.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/janusweb@1.7.0/scripts/janusweb.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","elation.require([\n  'janusweb.config', 'engine.things.generic','janusweb.remoteplayer', 'janusweb.room', 'janusweb.tracking', 'janusweb.multiplayermanager', 'janusweb.external.JanusFireboxParser', 'utils.proxy',\n  'janusweb.elements.raycaster', 'janusweb.elements.teleporter', 'janusweb.elements.linesegments', 'janusweb.elements.outliner'], function() {\n\n  elation.requireCSS('janusweb.janusweb');\n  elation.component.add('engine.things.janusweb', function() {\n    this.rooms = {};\n    this.version = 'janusweb-1.2';\n    this.settings = {\n      multiplayer: true,\n      sessiontracking: true,\n      jsdebugger: false,\n      selfavatar: false,\n      maxmemory: 2048,\n      comfortmode: false,\n      downloadcache: true,\n      antialiasing: true,\n      assetshaders: true,\n      assetimages: true,\n      sounds: true,\n      leapmotionhmd: true,\n      editmode: false,\n      crosshair: false,\n      gamepad: true,\n      portalhotkeys: false,\n      decouplehead: false,\n      mousepitch: true,\n      invertpitch: false,\n      avatarlighting: true,\n      uivoice: true,\n      launchurl: 'https://www.janusxr.com/',\n      server: 'presence.janusxr.org',\n      port: 5566,\n      rate: 200,\n      fov: 70.0,\n      rotationspeed: 50.0,\n      hidemenu: false\n    };\n    this.scriptframeargs = [\n      1000/60\n    ];\n    this.typemap = {\n      'object': 'janusobject',\n      'link': 'janusportal',\n      'text': 'janustext',\n      'paragraph': 'janusparagraph',\n      ///'image3d': 'janusimage',\n      'image': 'janusimage',\n      'video': 'janusvideo',\n      'sound': 'janussound',\n      'light': 'januslight',\n      'particle': 'janusparticle',\n      'ghost': 'janusghost',\n      'xrplayer': 'janusxrplayer',\n    };\n    this.classmap = {};\n    this.customElements = {};\n\n\n    this.postinit = function() {\n      this.defineProperties({\n        url:            { type: 'string', default: false },\n        homepage:       { type: 'string', default: \"\" },\n        corsproxy:      { type: 'string', default: '' },\n        showui:         { type: 'boolean', default: true },\n        shownavigation: { type: 'boolean', default: true },\n        showchat:       { type: 'boolean', default: true },\n        datapath:       { type: 'string', default: '/media/janusweb' },\n        autoload:       { type: 'boolean', default: true },\n        networking:     { type: 'boolean', default: true },\n        server:         { type: 'string', default: null },\n        port:           { type: 'integer', default: null },\n        urltemplate:    { type: 'string', default: false },\n        muted:          { type: 'boolean', default: false },\n      });\n      elation.events.add(window, 'popstate', elation.bind(this, this.handlePopstate));\n\n      try {\n        this.bookmarks = elation.collection.localindexed({index: 'url', storagekey: 'janusweb.bookmarks'});\n      } catch (e) {\n        this.bookmarks = elation.collection.indexed({index: 'url', storagekey: 'janusweb.bookmarks'});\n      }\n\n      if (this.corsproxy != '') {\n        elation.engine.assets.setCORSProxy(this.corsproxy);\n      }\n      this.assetpack = elation.engine.assets.loadAssetPack(this.properties.datapath + 'assets.json', this.properties.datapath);\n      this.parser = new JanusFireboxParser();\n      this.scriptingInitialized = false;\n\n      this.engine.systems.controls.addContext('janus', {\n        //'load_url': [ 'keyboard_tab', elation.bind(this, this.showLoadURL) ],\n        'toggle_menu': [ 'keyboard_esc', elation.bind(this, this.toggleMenu) ],\n        //'room_debug': [ 'keyboard_f6', elation.bind(this, this.showRoomDebug) ],\n        'chat': [ 'keyboard_t', elation.bind(this, this.showChat) ],\n        'bookmark': [ 'keyboard_ctrl_b', elation.bind(this, this.addBookmark) ],\n        'mute': [ 'keyboard_ctrl_m', elation.bind(this, this.mute) ]\n      });\n      this.engine.systems.controls.activateContext('janus');\n\n      if (this.muted) {\n        this.mute();\n      }\n\n      elation.events.add(this.engine.systems.render.views.main, 'render_view_prerender', elation.bind(this, this.updatePortals));\n      if (this.urltemplate) {\n        dust.filters.stripunsafe = function(s) {\n          return s.replace(/:\\//g, '');\n        };\n        elation.template.add('janusweb.url', this.urltemplate);\n      }\n      this.initScripting();\n\n      this.assetpack.executeWhenLoaded(() => {\n        // TODO - this should be config-driven\n        this.registerAdditionalElements(['raycaster', 'linesegments', 'outliner']);\n\n        if (this.networking) {\n          this.network = elation.janusweb.multiplayermanager({\n            janusweb: this,\n            server: this.server,\n            player: this.engine.client.player\n          });\n          this.network.enable(this.engine.client.player);\n        }\n\n        this.initRoom();\n      });\n    }\n    this.initScripting = function() {\n      if (this.scriptingInitialized) return;\n\n      this.registerBuiltinElements({\n        'object': 'janusobject',\n        'link': 'janusportal',\n        'text': 'janustext',\n        'paragraph': 'janusparagraph',\n        'image': 'janusimage',\n        'image3d': 'janusimage',\n        'video': 'janusvideo',\n        'sound': 'janussound',\n        'light': 'januslight',\n        'particle': 'janusparticle',\n        'ghost': 'janusghost',\n        'xrplayer': 'janusxrplayer',\n      });\n\n      window.delta_time = 1000/60;\n      window.janus = new elation.proxy(this, {\n        version:           ['property', 'version',       { readonly: true}],\n        versiononline:     ['property', 'versiononline', {readonly: true}],\n        currentkey:        ['property', 'currentkey',    {readonly: true}],\n        chat:              ['property', 'chat.messagelist.items', {readonly: true}],\n        networkstatus:     ['property', 'network.status', {readonly: true}],\n        networkerror:      ['property', 'network.error', {readonly: true}],\n        roomserver:        ['property', 'network.server'],\n        playercount:       ['property', 'network.playerCount'],\n        bookmarkurl:       ['property', 'bookmarks.items'],\n        bookmarkthumb:     ['property', 'bookmarks.items'], // FIXME - need to filter?\n        playerlist:        ['property', ''],\n        settings:          ['property', 'settings'],\n        userid:            ['property', 'userId'],\n        avatarlighting:    ['property', 'settings.avatarlighting'],\n        ui:                ['property', 'engine.client.ui'],\n        currentroom:       ['property', 'currentroom'],\n\n        hmd:               ['accessor', 'isVRActive'],\n\n        currenturl:        ['function', 'getCurrentURL'],\n        tricount:          ['function', 'getTriangleCount'],\n        locked:            ['function', 'isLocked'],\n        getsetting:        ['function', 'getSetting'],\n        setsetting:        ['function', 'setSetting'],\n        roomprogress:      ['function', 'currentroom.getProgress'],\n        launchurl:         ['function', 'load'],\n        navback:           ['function', 'navigateBack'],\n        navforward:        ['function', 'navigateForward'],\n        load:              ['function', 'navigateTo'],\n        setActiveRoom:     ['function', 'setActiveRoom'],\n        preload:           ['function', 'preload'],\n        createRoom:        ['function', 'createRoom'],\n        navhome:           ['function', 'navigateHome'],\n        chatsend:          ['function', 'sendChatMessage'],\n        sync:              ['function', 'currentroom.sync'],\n        reset:             ['function', 'reset'],\n        quit:              ['function', 'quit'],\n        focus:             ['function', 'focus'],\n        unfocus:           ['function', 'blur'],\n        saveroom:          ['function', 'saveRoom'],\n        roomcode:          ['function', 'getRoomCode'],\n        setroomcode:       ['function', 'setRoomCode'],\n        setuserid:         ['function', 'setUsername'],\n        getuserid:         ['function', 'getUsername'],\n        setavatarlighting: ['function', 'setAvatarLighting'],\n        getavatarlighting: ['function', 'getAvatarLighting'],\n        resetavatar:       ['function', 'resetAvatar'],\n        hasFocus:          ['function', 'hasFocus'],\n        registerElement:   ['function', 'registerElement'],\n        extendElement:     ['function', 'extendElement'],\n      });\n\n      //THREE.Vector3.prototype.toString = function() { return this.toArray().map(function(d) { return d.toFixed(4); }).join(' '); } \n      window.Vector = function(x, y, z, w) {\n        if (x) {\n          if (x._target && x._target instanceof THREE.Vector3) return x._target.clone();\n          if (x instanceof THREE.Vector3) return new elation.physics.vector3().copy(x);\n        }\n        if (y === undefined) y = x;\n        if (z === undefined) z = y;\n\n        return (w === undefined ? new elation.physics.vector3(x, y, z) : new THREE.Vector4(x, y, z, w));\n      }\n      window.V = window.Vector;\n      window.translate = function(v1, v2) {\n        return new elation.physics.vector3().addVectors(v1, v2);\n      }\n      window.distance = function(v1, v2) {\n        return v1.distanceTo(v2);\n      }\n      window.scalarMultiply = function(v, s) {\n        var ret = new elation.physics.vector3().copy(v);\n        if (s instanceof THREE.Vector3) {\n          ret.x *= s.x;\n          ret.y *= s.y;\n          ret.z *= s.z;\n        } else {\n          ret.multiplyScalar(s);\n        }\n        return ret;\n      }\n      window.cross = function(v1, v2) {\n        return new elation.physics.vector3().crossVectors(v1, v2);\n      }\n      window.normalized = function(v) {\n        return new elation.physics.vector3().copy(v).normalize();\n      }\n      window.equals = function(v1, v2) {\n        return v1.equals(v2);\n      }\n      window.copy = function(v1, x, y, z) {\n        if (x instanceof THREE.Vector3) {\n          v1.copy(x);\n        } else if (elation.utils.isnumeric(x)) {\n          if (typeof y != 'undefined' && typeof z != 'undefined') {\n            v1.set(x, y, z);\n          } else {\n            v1.set(x, x, x);\n          }\n        }\n        return v1;\n      }\n      window.add = function(v1, v2) {\n        return v1.add(v2);\n      }\n      window.scale = function(v1, s) {\n        return v1.multiplyScalar(s);\n      }\n      window.print = function(...args) {\n        console.log.apply(console, args);\n        elation.events.fire({type: 'clientprint', element: this, data: args});\n      }.bind(this);\n      window.debug = function() {\n        console.log.apply(console, arguments);\n      }\n      window.removeKey = function(dict, key) {\n        delete dict[key];\n      }\n      var uniqueId = 1;\n      window.uniqueId = function() {\n        return uniqueId++;\n      }\n      this.scriptingInitialized = true;\n    }\n\n    this.createChildren = function() {\n      var player = this.engine.client.player;\n      //setTimeout(elation.bind(this, this.load, starturl, true), 5000);\n      //this.initScripting();\n      this.userId = player.getUsername();\n      player.player_id = this.userId; // FIXME - player spawns without an id, so we fix it up here\n      window.player = player.getProxyObject();\n      if (this.networking && this.network) {\n        this.network.enable(player);\n      }\n      if (!(this.autoload || this.getStartURL() != this.properties.homepage)) {\n        player.disable();\n      }\n    }\n\n    this.initRoom = function() {\n      var starturl = this.getStartURL();\n\n      if (this.autoload) {\n        this.load(starturl, true);\n      }\n    }\n\n    this.clear = function() {\n      if (this.currentroom) {\n        this.remove(this.currentroom);\n        //this.currentroom.die();\n        //setTimeout(elation.bind(this.currentroom, this.currentroom.die), 1000);\n        //this.currentroom.die();\n        this.currentroom.disable();\n        //this.leave_room(this.currentroom.url);\n        this.currentroom = false;\n      }\n      this.refresh();\n    }\n    this.load = function(url, makeactive, baseurl, stripreferrer) {\n      var roomname = url;\n\n      var room = this.spawn('janusroom', roomname, {\n        url: url,\n        janus: this,\n        baseurl: baseurl,\n        corsproxy: this.corsproxy,\n        deferload: true\n      }, makeactive && typeof makeactive != 'undefined');\n\n      if (this.currentroom && !stripreferrer) {\n        room.referrer = this.currentroom.url;\n      } else {\n        room.referrer = null;\n      }\n      elation.events.fire({element: this, type: 'room_load_start', data: room});\n      room.load();\n      // FIXME - should be able to spawn without adding to the heirarchy yet\n      this.remove(room);\n\n      if (this.networking) {\n        this.network.registerRoom(room, true);\n      }\n\n      this.rooms[room.roomid] = room;\n      //console.log('made new room', url, room);\n      this.loading = false;\n      if (room && makeactive) {\n        this.setActiveRoom(url, room.referrer);\n      }\n      this.initScripting();\n      return room;\n    }\n    this.loadFromSource = function(source, makeactive, baseurl) {\n      var dataurl = 'data:text/html,' + encodeURIComponent(source);\n      return this.load(dataurl, makeactive, baseurl)\n    }\n    this.setActiveRoom = function(url, referrer, skipURLUpdate) {\n      var oldroom = this.currentroom;\n\n      var room = false;\n      this.loading = true;\n\n      if (elation.utils.isString(url)) {\n        var roomid = this.roomid = this.getRoomId(url);\n        if (this.rooms[roomid]) {\n          room = this.rooms[roomid];\n        }\n      } else if (url.type == 'janusroom') {\n        room = url._target || url;\n        url = room.url;\n      }\n      var player = this.engine.client.player;\n\n      if (room) {\n        var changed = false;//this.properties.url != url;\n        if (!url) {\n          url = this.properties.homepage || this.properties.url;\n        } else {\n          this.properties.url = url;\n        }\n        if (oldroom !== room) {\n          // Set referrer so we know where this link came from\n          if (typeof referrer != 'undefined') {\n            room.referrer = referrer;\n          } else if (oldroom) {\n            room.referrer = oldroom.url;\n          }\n\n          this.clear();\n          this.currentroom = room;\n\n          window.room = this.currentroom.getProxyObject();\n\n          let urlhash = this.getRoomHash(url);\n          if (urlhash != room.urlhash) {\n            room.urlhash = urlhash;\n          }\n\n          player.setRoom(room);\n          this.add(this.currentroom);\n          this.currentroom.setActive();\n          this.properties.url = url;\n          this.loading = false;\n          changed = true;\n          elation.events.fire({element: this, type: 'room_change', data: url});\n        }\n        if (changed && !skipURLUpdate) {\n          this.updateClientURL(url);\n        }\n\n        if (!this.currentroom.loaded) {\n          if (this.currentroom.completed) {\n            // Room was previously loaded but deallocated, reload it\n            this.currentroom.load();\n          }\n          elation.events.add(this.currentroom, 'janus_room_load', elation.bind(this, function() {\n            this.currentroom.enable();\n          }));\n        } else {\n          this.currentroom.enable();\n          this.currentroom.setTitle(this.currentroom.title);\n        }\n        //this.enter_room(url);\n      } else {\n        this.load(url, true, null, referrer === false);\n      }\n    }\n    this.preload = function(url, stripreferrer) {\n      return this.load(url, false, null, stripreferrer);\n    }\n    this.createRoom = function(url, makeactive=true) {\n      let newroom = this.spawn('janusroom', url, {\n        url: url,\n        janus: this,\n        corsproxy: this.corsproxy,\n        deferload: true\n      }, !makeactive);\n\n      this.rooms[newroom.roomid] = newroom;\n      //console.log('made new room', url, room);\n      this.loading = false;\n      if (newroom && makeactive) {\n        this.setActiveRoom(newroom);\n      }\n      this.initScripting();\n      return newroom.getProxyObject();\n    }\n    this.getFixedURL = function(url) {\n      // Our 'clean' client URLs don't contain a : because many services have problems parsing them\n      var m = url.match(/^(https?)\\/\\/?(.*)$/i);\n      if (m) {\n        url = m[1] + '://' + m[2];\n      }\n      return url;\n    }\n    this.updateClientURL = function(url) {\n      if (this.urltemplate) {\n        var re = new RegExp(elation.template.get('janusweb.url', {url: '(.*)'}).replace('/', '\\\\/'));\n        var m = document.location.pathname.match(re);\n        if (m) {\n          var oldurl = this.getFixedURL(m[1]);\n          if (oldurl !== this.currentroom.url) {\n            var fullurl = elation.template.get('janusweb.url', {url: this.currentroom.url});\n            history.pushState({}, '', fullurl);\n          }\n        } else {\n          var fullurl = elation.template.get('janusweb.url', {url: this.currentroom.url});\n          history.pushState({}, '', fullurl);\n        }\n      } else {\n        var hashargs = elation.url();\n        if (url == this.properties.homepage) {\n          delete hashargs['janus.url'];\n        } else {\n          hashargs['janus.url'] = url;\n        }\n        var newhash = '#' + elation.utils.encodeURLParams(hashargs);\n        if (document.location.hash != newhash) {\n          document.location.hash = (newhash == '#' ? '' : newhash);\n        }\n      }\n    }\n    this.handlePopstate = function(ev) {\n      if (this.urltemplate) {\n        var re = new RegExp(elation.template.get('janusweb.url', {url: '(.*)'}).replace('/', '\\\\/'));\n        var m = document.location.pathname.match(re);\n        if (m) {\n          var url = this.getFixedURL(m[1]);\n          if (url != this.currentroom.url) {\n            this.setActiveRoom(url, this.currentroom.url, true);\n          }\n        }\n      } else {\n        var hashargs = elation.url();\n        var hashurl = hashargs['janus.url'];\n        if (hashurl && hashurl != this.properties.url && !this.loading) {\n          this.setActiveRoom(hashurl, this.currentroom.url, true);\n        } else if (!hashurl && this.properties.url != this.homepage) { // && !document.location.hash) {\n          this.setActiveRoom(this.homepage);\n        }\n        if (document.location.hash && document.location.hash.substr(1) in room.objects) {\n          let jumpto = room.objects[document.location.hash.substr(1)];\n          if (typeof jumpto.activate == 'function') {\n            jumpto.activate();\n          } else if (typeof jumpto.navigate == 'function') {\n            jumpto.navigate();\n          } else {\n            player.pos = jumpto.pos;\n            player.xdir.copy(jumpto.xdir);\n            player.ydir.copy(jumpto.ydir);\n            player.zdir.copy(jumpto.zdir);\n          }\n        }\n      }\n    }\n\n    this.showLoadURL = function(ev) {\n      if (ev.value == 1) {\n        this.engine.client.ui.urlbar.selectall();\n        this.engine.client.ui.urlbar.focus();\n      }\n    }\n    this.showRoomDebug = function(ev) {\n      if (ev.value == 1) {\n        this.currentroom.showDebug();\n      }\n    }\n    this.showChat = function(ev) {\n      if (ev.value == 1 && this.chat && document.activeElement != this.engine.client.ui.urlbar.inputelement) {\n        this.chat.focus();\n      }\n    }\n    this.addBookmark = function(ev) {\n      if (ev.value == 1) {\n        var room = {\n          url: this.currentroom.properties.url, \n          title: this.currentroom.title,\n          time: (new Date().getTime() / 1000)\n        };\n        this.bookmarks.add(room);\n        elation.events.fire({type: 'janusweb_bookmark_add', element: this, data: room});\n      }\n    }\n    this.mute = function(ev) {\n      if (!ev || ev.value == 1) {\n        this.engine.systems.sound.toggleMute();\n      }\n    }\n\n    this.setUsername = function(name) {\n      var player = this.engine.client.player;\n      player.setUsername(name);\n    }\n    this.getUsername = function() {\n      var player = this.engine.client.player;\n      return player.getUsername();\n    }\n    this.handleRoomEditOther = function(data) {\n      var roomId = data.roomId,\n          movedata = data.position,\n          edit = movedata.room_edit,\n          del = movedata.room_delete;\n\n      var room = this.rooms[roomId];\n      if (room) {\n        if (edit) {\n          var editxml = edit.replace(/\\^/g, '\"');\n//console.log('RECV', editxml);\n          room.applyEditXML(editxml);\n        }\n        if (del) {\n          var deletexml = del.replace(/\\^/g, '\"');\n          room.applyDeleteXML(deletexml);\n        }\n      } \n    }\n    this.getCurrentURL = function() {\n      return this.properties.url;\n    }\n    this.navigateHome = function() {\n      return this.setActiveRoom(this.properties.homepage);\n    }\n    this.navigateBack = function() {\n      history.back();\n    }\n    this.navigateTo = function(url, referrer) {\n      return this.setActiveRoom(url, referrer);\n    }\n    this.navigateForward = function() {\n      history.forward();\n    }\n    this.getTriangleCount = function() {\n      return this.engine.systems.render.views.main.renderinfo.render.faces;\n    }\n    this.isLocked = function() {\n      return this.currentroom.properties.locked;\n    }\n    this.sendChatMessage = function(text) {\n      var network = this.currentroom.getServer();\n      network.send({'method': 'chat', data: text});\n    }\n    this.getSetting = function(name) {\n      return elation.utils.arrayget(this.settings, name);\n    }\n    this.setSetting = function(name, value) {\n      return elation.utils.arrayset(this.settings, name, value);\n    }\n    this.reset = function() {\n    }\n    this.quit = function() {\n    }\n    this.focus = function() {\n    }\n    this.blur = function() {\n    }\n    this.saveRoom = function() {\n    }\n    this.getRoomCode = function() {\n    }\n    this.setRoomCode = function(code) {\n    }\n    this.setAvatarLighting = function(lighting) {\n    }\n    this.getAvatarLighting = function() {\n    }\n    this.resetAvatar = function() {\n    }\n    this.hasFocus = function() {\n      return true;\n    }\n    this.sendScriptFrame = function(ev) {\n      this.scriptframeargs[0] = Math.round(ev.data.delta * 1000);\n/*\n      this.engine.systems.world.scene['world-3d'].updateMatrixWorld(true);\n      //elation.events.fire({element: this.currentroom, type: 'janusweb_script_frame'});\n      if (this.currentroom.update) {\n        this.currentroom.update(1000/60);\n      }\n*/\n    }\n    this.updatePortals = function() {\n      var portalpass = this.engine.systems.render.views.main.portalpass;\n      if (portalpass && this.currentroom) {\n        portalpass.portals = this.currentroom.getVisiblePortals();\n      }\n    }\n    this.registerElement = function(tagname, classobj, extendclass) {\n      if (!extendclass || !elation.engine.things[extendclass]) extendclass = 'janusbase';\n      tagname = tagname.toLowerCase();\n      //console.log('Register new SYSTEM tag type:', tagname, classobj, extendclass);\n      elation.component.add('engine.things.' + tagname, classobj, elation.engine.things[extendclass]);\n/*\n      this.typemap[tagname] = tagname;\n      this.classmap[tagname] = {\n        class: classobj,\n        extendclass: extendclass\n      };\n*/\n      this.customElements[tagname] = {\n        tagname: tagname,\n        classname: tagname,\n        class: classobj,\n        extendclass: extendclass\n      };\n\n      if (this.currentroom && this.currentroom.unknownElements[tagname]) {\n        var unknownElements = this.currentroom.unknownElements[tagname];\n        // console.log('Now we know about ' + tagname + ', so make some!', unknownElements);\n        for (var i = 0; i < unknownElements.length; i++) {\n          this.currentroom.createObject(tagname, unknownElements[i].args, unknownElements[i].parent);\n        }\n        delete this.currentroom.unknownElements[tagname];\n      }\n    }\n    this.extendElement = function(extendclass, tagname, classobj) {\n      this.registerElement(tagname, classobj, extendclass);\n    }\n    this.registerBuiltinElements = function(elements) {\n      for (var k in elements) {\n        var tagname = k.toLowerCase(),\n            classname = elements[k];\n        this.customElements[tagname] = {\n          tagname: tagname,\n          classname: classname,\n          class: elation.engine.things[classname]\n        };\n      }\n    }\n    this.registerAdditionalElements = function(elements) {\n      for (var k in elation.janusweb.elements) {\n        this.registerElement(k, elation.janusweb.elements[k].classdef);\n      }\n    }\n    this.getAsset = function(type, name, assetargs) {\n      var asset;\n      if (this.assetpack) {\n        asset = this.assetpack.get(type, name, assetargs);\n      }\n\n      if (!asset) {\n        asset = elation.engine.assets.find(type, name, true);\n      }\n\n      return asset;\n    }\n    this.getStartURL = function() {\n      var hashargs = elation.url();\n      return hashargs['janus.url'] || this.properties.url || this.properties.homepage;\n    }\n    this.getRoomId = function(url) {\n      let idx = url.indexOf('#');\n      if (idx != -1) {\n        return md5(url.substr(0, idx));\n      }\n      return md5(url);\n    }\n    this.getRoomHash = function(url) {\n      let idx = url.indexOf('#');\n      if (idx != -1) {\n        return url.substr(idx + 1);\n      }\n      return false;\n    }\n    this.toggleMenu = function(ev) {\n      if (ev.value != 1) return;\n      let overlay = this.engine.client.overlay;\n      console.log('toggle the menu', overlay, this.parent);\n      if (overlay) {\n        if (overlay.hidden) {\n          overlay.show();\n        } else {\n          overlay.hide();\n        }\n      }\n      if (document.pointerLockElement) {\n        document.exitPointerLock();\n      }\n    }\n    this.isVRActive = function() {\n      return (typeof XRSession != 'undefined' && this.engine.client.xrsession instanceof XRSession);\n    }\n  }, elation.engine.things.generic);\n});\n"]}