{"version":3,"sources":["RemoteApp/pages/viewport.html","RemoteApp/pages/hotspotDoorOnGround.html","RemoteApp/pages/hotspotInfo.html","RemoteApp/pages/hotspotLogo.html","RemoteApp/pages/loader.html","RemoteApp/js/easing.js","RemoteApp/pages/floorplanWindow.html","RemoteApp/pages/floorplanTab.html","RemoteApp/pages/floorplanLevel.html","RemoteApp/pages/chat-widget.html","RemoteApp/pages/leadPage.html","RemoteApp/pages/presentationLobby.html","RemoteApp/pages/presentationParticipants.html","RemoteApp/pages/hotspotDoor.html","RemoteApp/config/i18n.js","RemoteApp/js/utils.js","RemoteApp/js/simple-bus.js","RemoteApp/js/events.js","RemoteApp/js/logo.js","RemoteApp/js/intro.js","RemoteApp/js/floorplan.js","RemoteApp/js/icons.js","RemoteApp/js/activity-tracker.js","RemoteApp/js/preview.js","RemoteApp/js/controls.js","RemoteApp/js/fullscreen.js","RemoteApp/js/presentationLobby.js","RemoteApp/js/utils/trackIndicators.js","RemoteApp/js/utils/throttle.js","RemoteApp/js/virtualPresentation.js","RemoteApp/js/chat.js","RemoteApp/js/store.js","RemoteApp/js/marzipano-view-linker.js","RemoteApp/js/languages.js","RemoteApp/js/ajax.js","RemoteApp/js/speech.js","RemoteApp/js/virtual-guide.js","RemoteApp/boot-app.js","RemoteApp/images/camOn.html","RemoteApp/images/camOff.html","RemoteApp/images/micOn.html","RemoteApp/images/micOff.html"],"names":["module","exports","define","easeInQuad","pos","Math","pow","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","PI","easeOutSine","sin","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeOutBounce","easeInBack","s","easeOutBack","easeInOutBack","elastic","swingFromTo","swingFrom","swingTo","bounce","bouncePast","easeFromTo","easeFrom","easeTo","i18n","Utils","control","css","classList","add","trim","remove","contains","visibility","this","checkClass","removeClass","addClass","sender","eventType","handler","touchEvent","window","addEventListener","parameter","def","urlParams","URLSearchParams","location","search","has","get","obj","Array","isArray","element","querySelectorAll","forEach","node","attributeToTranslate","dataset","translate","t","cname","name","ca","decodeURIComponent","document","cookie","split","i","length","c","charAt","substring","indexOf","languageFromNavigator","navigator","language","languageFromQuery","getParameterValue","languageFromCookie","getCookie","getProjectLang","permissionName","permissions","query","result","state","backdrop","createElement","loader","innerHTML","loaderTemplate","body","appendChild","EventBus","eventCallbacksPairs","callback","eventCallbacksPair","_findEventCallbacksPair","callbacks","toString","push","EventCallbacksPair","args","console","error","find","eventObject","Bus","NEW_MESSAGE","SCENE_CHANGED","INTRO_CLOSED","VIEW_CHANGED","MEDIA_PREVIEW_OPENED","MEDIA_PREVIEW_CLOSED","CHAT_STARTED","FIRST_VISIT_SCHENE","Logo","project","property","selector","url","src","container","querySelector","img","Intro","minMode","config","active","status","onClick","OgImage","style","backgroundImage","title","Name","Description","GroupLogoUrl","show","innerText","infoControl","showStartButton","clientHeight","e","target","innerHeight","serverNotResponse","max","children","child","getBoundingClientRect","bottom","getLastVisibleChild","cb","getElementById","post","button","warn","buttonText","Floorplan","photos","events","levels","points","onPointClickEvent","CustomEvent","hasOwnProperty","index","splice","evs","l","apply","floorplanElement","floorplanWindowTemplate","firstChild","level","tabElementDiv","floorplanTabTemplate","tabElement","setAttribute","Id","link","preventDefault","onTabClick","bind","point","levelId","photo","getPhotoById","PhotoId","pointElementDiv","pointElement","label","left","X","top","Y","onPointClick","levelElementDiv","floorplanLevelTemplate","levelElement","Url","levelPoints","Points","buildLevelPoint","floorplanTabs","el","floorplanLevels","florplanTab","buildTab","florplanLevel","buildLevel","tab","pointsContainer","tippy","content","arrow","theme","appendTo","placement","offset","popperOptions","modifiers","options","boundary","roundOffsets","x","y","round","floorplan","buildWindow","preparedLevels","filter","Boolean","rebuildLevels","showLevel","id","initial","withSwitchLevel","switchPoint","fireEvent","fontawesome","library","faSync","faSignInAlt","faEnvelope","faArrowLeft","faArrowRight","faArrowUp","faArrowDown","faPlus","faMinus","faSpinner","faPlayCircle","faCircle","faLink","faUnlink","faPhone","faPhoneSlash","faMicrophone","faMicrophoneSlash","faExpand","faInfo","farCircle","faArrowAltCircleRight","faComments","faTimes","faShoePrints","faWalking","faCheck","faPlay","faUserTie","faMap","farSmile","faCamera","faVolumeUp","faVolumeOff","comment","commentSlash","dom","i2svg","ActivityTracker","currentSceneId","StartingPhotoId","Photos","visitedRooms","time","lastSceneChange","dayjs","lastActivityCallbacks","isMediaPreviewOpen","isChatStarted","handleEvents","subscribe","data","onNewActivity","photoId","diff","type","log","activity","timeout","clearTimeout","setTimeout","fromNextEvent","unvisitedRooms","floor","random","sceneId","AUTOROTATE_MOVEMENT","Marzipano","autorotate","yawAccel","yawSpeed","targetPitch","targetFov","VirtualWalk","store","minimalMode","showNadir","containerCandidates","getElementsByTagName","projectSplit","projectId","Number","createViewer","intro","switching","bigpic","registerEvent","hideBigPic","setupNavigator","map","switchSceneDirect","ready","hideSpinner","Object","prototype","call","showLoadFailed","buildMap","Status","first","getPhoto","getFirst","showMessage","IsFloorplan","createFloorplam","create","Floorplans","entertrace","StartScene","Pitch","PhotoPoints","prepareScene","switchScene","min","ceil","includes","hubsUrl","photosCount","Filters","Saturation","Contrast","Brightness","j","scene","leadPage","IsLeadPage","delay","autorotateTimer","autorotateCounter","setInterval","elapsed","performance","now","viewer","_idleTimer","_startTime","isIdle","_duration","autorotateChangeScene","startMovement","setIdleMovement","clearInterval","stopMovement","stopAutorotate","nextIndex","currentPhotoIndex","next","switchSceneAlternative","startAutorotate","viewportTemplate","excludedElement","blockElement","tryPrevent","cancelable","passive","touchAction","height","hotspots","className","Viewer","stage","progressive","onRenderStarted","renderStarted","currentFov","logoHotspot","tools","geometry","CubeGeometry","tileSize","size","fallbackOnly","autorotateActivity","layer","textureStore","view","isRenderFinished","width","tileList","visibleTiles","hasTexture","renderFinished","showButtons","showHotspots","removeEventListener","spinner","textContent","text","message","back","controls","imageUrl","onprogress","Promise","resolve","reject","xhr","XMLHttpRequest","notifiedNotComputable","open","responseType","ev","lengthComputable","parseInt","loaded","total","onloadend","match","m","getAllResponseHeaders","blob","Blob","response","URL","createObjectURL","send","loadFaceStore","elements","progress","updateProgress","ratio","loadImage","then","imgSrc","hideInterval","loading","currentPercent","current","keys","value","percent","parseFloat","toFixed","viewPhotoLoader","viewPhotoLoaderValue","source","ImageUrlSource","tile","face","toUpperCase","z","loadFace","limiter","RectilinearView","limit","traditional","createScene","yaw","fov","pinFirstLevel","entrance","mapPoint","ImageUrl","key","createHotspot","Type","reverse","targetId","targetPhotoId","TargetPhotoId","pitch","Yaw","canvas","filters","filterString","toLowerCase","assign","afterCall","lastScene","exit","lookTo","transitionDuration","destroyScene","animateSwitching","updateTitle","findIndexByPhotoId","recentTargetId","targetView","exitPoint","TargetId","position","setParameters","nextTick","photoIndex","done","autorotateMode","switchTo","transitionUpdate","val","newScene","oldScene","newLayer","eased","Easing","opf","Saturate","oldScenePhoto","p","npf","newScenePhoto","nf","domElement","setCanvasEffects","mergeEffects","opacity","rect","relativeWidth","relativeHeight","relativeX","relativeY","destinationViewParameters","hotspot","outerHTML","hotspotDoorOnGroundTemplate","hotspotInfoTemplate","hotspotLogoTemplate","getElementsByClassName","PhotoPointStyle","rotationAngle","abs","transform","switchSceneByUser","parentElement","matches","animationPlayState","ring","hotspotContainer","infoContent","Info","MediaType","PhotoInfoThumbnailUrl","event","showBigPicture","PhotoInfoUrl","VideoLink","linkEl","Link","href","getVideoThumbnail","contentContainer","perspective","radius","hide","videoUrl","info","mediaType","getPlayerType","videoId","searchParams","append","pathname","part","substr","contentWindow","postMessage","method","pause","videoType","regExp","fetch","videoData","json","thumbnailUrl","thumbnail_url","UserId","navigatorBtn","toggle","sceneThumbnail","photoLabel","photoEl","getPhotoThumbail","thumbnail","apiUrl","res","ok","Error","Controls","viewUpElement","viewDownElement","viewLeftElement","viewRightElement","viewInElement","viewOutElement","velocity","registerMethod","ElementPressControlMethod","Fullscreen","documentElement","expandIcon","shrinkIcon","isEnabled","disable","enable","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getCurrent","PresentationLobby","onLobbyClose","presentationId","localTracks","canJoin","lobbyTemplate","joinButton","joinToPresentationLobby","hasSentRequestToJoin","buttonContainer","loadingMessage","marginTop","lobbyData","closeLobby","timeInterval","getDeviceInfo","hasVideoInputDevices","hasAudioInputDevices","mediaDevices","getUserMedia","audio","video","stream","fillDeviceInputs","catch","dir","createLocalTracks","finally","fillPresentationData","removeAttribute","modalContainer","messageEl","replaceChildren","welcomeHeading","clientDto","showAuthForm","remainingTime","getRemainingTime","date","display","clientNameInput","placeholder","phone","hideLoader","showLoader","showLobby","showError","enumerateDevices","devices","audioInputDevices","device","kind","videoInputDevices","audioOutputDevices","some","selectContainer","camSelect","createSelectElement","deviceId","selectedVideo","setLocalTracks","micSelect","selectedAudio","onChange","iconContainer","selectIcon","select","option","createActionButton","icon","micOn","camOn","trackKind","buttonEl","toggleLocalTrack","track","getTracks","micOff","camOff","displayCamPreview","undefined","videoTrack","attach","parsedDate","durationInSeconds","d","h","difference","toLocaleString","minimumIntegerDigits","useGrouping","onJoin","join","trackIndicators","disabled","enabled","throttle","waitingArgs","shouldWait","timeoutFunc","VirtualPresentation","tracks","connection","roomId","utils","roomData","hasControl","isMicMuted","isCamDisabled","participantsTemplate","joinRoom","roomName","token","room","maxAudioBitrate","frameRate","connect","viewport","scenePickerButton","handleConnectedParticipant","localParticipant","participants","on","handleDisconnectedParticipant","disconnect","muteButton","toggleMute","camButton","toggleCam","endCall","participant","toggleControl","participantDiv","identity","indicatorContainer","trackPublication","handleTrackPublication","displayTrack","handleTrackState","removeAllListeners","controlIndicator","audioTracks","videoTracks","off","stop","indicator","removeDisabledTrackIndicator","createDisabledTrackIndicator","swapVideoThumbnail","participantId","isDisabled","videoEl","placeholderEl","disabledIndicator","changeView","changeScene","invoke","presentaionId","messageContainer","flexDirection","gap","refreshButton","reload","leadPageConfig","linkRegex","FIVE_MINUTES","Chat","folderId","from","mls","noChat","nc","noLead","nl","unreadMessageCount","creationLanguage","getProjectCreationLanguage","localStorage","getItem","getAgentAvailability","isAgentAvailable","HasVirtualGuide","VirtualGuideMessages","lastMessageDate","delayBetweenMessages","timeToRemoveNewMessage","userStartedConversation","chatTemplate","translateAttributes","hideAlertsBtn","alerts","updateIcon","stopPropagation","presentationLobby","chatContainer","ownerAvatar","avatar","unreadMessageCounter","newMessageList","contactForm","contactFormFields","startChat","userDataForm","messageForm","sendMessage","addMessage","lng","sendByClient","sent","Date","toISOString","userName","UserName","sendNotificationToAgent","phoneNumber","setCustomValidity","checkValidity","checked","messageList","currentTime","play","emojiBtn","pickerOptions","skinTonePosition","perLine","locale","onEmojiSelect","native","focus","onClickOutside","picker","EmojiMart","emojiPickerComponent","startStatsGather","stopGather","markAsAlive","handleInactivity","inactivityTimeout","isStatGatherStopped","authenticateClient","requestToJoin","joinRoomById","history","connecting","loadChatHistory","headers","Headers","JSON","stringify","setItem","signalR","nameArg","phoneArg","joinRoomByClient","reset","captureInfo","async","XDomainRequest","leadPageContainer","leadPageTemplate","subject","createCORSRequest","onreadystatechange","readyState","responseText","parse","item","subjectOptionNode","leadPageSend","policy","xhr2","policyText","ooc","company","address","city","zip_code","zipCode","leadPageTimeout","leadPageShowed","leadPageMaximize","leadPageClose","leadPageMinimize","sendLeadForm","email","formControlReset","msg","formGroup","parentNode","formControlError","validEmail","sendLeadUrl","sendLead","leadThanks","addSeparator","clb","HubConnectionBuilder","withUrl","build","onMessage","onRequestToJoinAccepted","onRequestToJoinPresentationDeclined","linker","set","requestChangeScene","presentation","sentByClient","start","reconnecting","reconnectRefresh","command","connectionState","onDisconnected","timeStamp","arguments","payload","dataAgent","childElementCount","removeChild","firstElementChild","startsWith","messageContent","withQuestion","addActionButtonsToMessage","withContactForm","addContactFormToMessage","newMessage","messageId","getTime","slice","wordCount","disableAutoHiding","newMessageTiemout","messageToRemove","hideAfter","live","onHangUp","rtcActions","sendWrapper","refreshWrapper","onMessageInput","setInputHeight","scrollHeight","conversation","maxHeight","setTime","expires","toUTCString","direction","onTrasmittingChanged","transmitting","receiving","transfer","showCaptureInfo","callEl","conversationError","separator","format","question","replaceAll","buttonPositive","positiveButtonText","positiveButtonAction","positiveButtonInMessage","negativeButtonInMessage","buttonNegative","negativeButtonText","negativeButtonAction","uniqueId","form","inputWrapper","phoneInput","submitButton","checkboxWrapper","checkbox","required","checkboxLabel","fontSize","htmlFor","formInContainer","messageElement","lastChild","previousDate","startOf","addDateMessage","agentJoinedBefore","isObject","conversationContainer","scrollTop","cursor","isLink","onChatBtnClickCallback","order","isChatHidden","startConverstation","maximizelabel","maximize","minimize","offsetHeight","scrollableDiv","reconnect","invokeForce","capture","old","unlinkEl","indicatorSpinner","hangupEl","callIndicator","userPhotoUrl","showHideChat","waitingTimer","showPhoto","photoContainer","userPhotoEl","feature","unavailable","afterWaiting","photoUrl","pokeWindow","busyMessage","displayLeadPage","params","portal","intervals","intervalIndex","markAsAliveTimeout","alertsOffElement","alertsOnElement","setVisibility","MarzipanoLinker","walk","interval","Store","requestSwitchScene","publisher","lastCheck","temp","range","shift","sum","reduce","a","b","last","pl","en","request","Speech","muted","acc","Messages","SpeechUrl","audioElement","volume","duration","mutedElement","unmutedElement","VirtualGuide","chat","activityTracker","messages","isGuideActive","startTime","systeMessage1PhotoId","systeMessage2PhotoId","systeMessage3PhotoId","fetchGuideMessages","speech","systemMessages","SystemMessageQueue","firstPhotoId","Content","addToQueue","isSystemMessage","withLector","messageDelay","Lector","sendSystemMessage1","sendSystemMessage2","sendSystemMessage3","afterLastActivity","getUnvisitedRoom","addToQueueOnTop","replace","getSize","handleVisitNewScene","clearQueue","handleActionButtonClick","getReponseTextDependingOnAgentStatus","noteVirtualGuideInteraction","delayMessage","noChatResponse","activeChatResponse","stopVirtualGuide","prev","curr","alreadyPlayed","queue","nextUpdate","tryNext","unshift","finished","app","getFolderId","getFromConnection","projectMatches","tpl","langs","lang","parsed","replacer","configUrl","storageUrl","ajax","embedDataResponse","embedData","OwnerAvatarUrl","ownerAvatarUrl","AutorotationEnabled","ChatEnabled","ContactFormEnabled","HideNadir","webView","setChatBtnClickCallback","setViewer","sendCaptureData","load","hiddenPropName","visibilityChangeEventName","started","hidden","msHidden","webkitHidden","innerStart","winHeight","docHeight","promise","use","Backend","LanguageDetector","init","fallbackLng","debug","detection","lookupQuerystring","cache","interpolation","escapeValue","backend","loadPath","entries","customElements","HTMLElement","initTranslations"],"mappings":"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","file":"static/js/main.58bd0a1a.chunk.js","sourcesContent":["// Module\nvar code = \"

PREZENTACJA ONLINE

txtStart txtVirtualTour

tytuł
powered by SpotBrowser
txtLoading 0%
txtRoomViewed 
txtLoading
zamknij
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
Kliknij aby powiększyć
Otwórz link w nowej karcie
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
\";\n// Exports\nmodule.exports = code;","// --------------------------------------------------\n// easing.js v0.5.4\n// Generic set of easing functions with AMD support\n// https://github.com/danro/easing-js\n// This code may be freely distributed under the MIT license\n// http://danro.mit-license.org/\n// --------------------------------------------------\n// All functions adapted from Thomas Fuchs & Jeremy Kahn\n// Easing Equations (c) 2003 Robert Penner, BSD license\n// https://raw.github.com/danro/easing-js/master/LICENSE\n// --------------------------------------------------\n(function (name, definition) {\n /*global define module*/\n if (typeof define == 'function') define(definition);\n else if (typeof module != 'undefined') module.exports = definition;\n else this[name] = definition;\n }('easing', {\n easeInQuad: function(pos) {\n return Math.pow(pos, 2);\n },\n \n easeOutQuad: function(pos) {\n return -(Math.pow((pos-1), 2) -1);\n },\n \n easeInOutQuad: function(pos) {\n if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,2);\n return -0.5 * ((pos-=2)*pos - 2);\n },\n \n easeInCubic: function(pos) {\n return Math.pow(pos, 3);\n },\n \n easeOutCubic: function(pos) {\n return (Math.pow((pos-1), 3) +1);\n },\n \n easeInOutCubic: function(pos) {\n if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,3);\n return 0.5 * (Math.pow((pos-2),3) + 2);\n },\n \n easeInQuart: function(pos) {\n return Math.pow(pos, 4);\n },\n \n easeOutQuart: function(pos) {\n return -(Math.pow((pos-1), 4) -1);\n },\n \n easeInOutQuart: function(pos) {\n if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,4);\n return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);\n },\n \n easeInQuint: function(pos) {\n return Math.pow(pos, 5);\n },\n \n easeOutQuint: function(pos) {\n return (Math.pow((pos-1), 5) +1);\n },\n \n easeInOutQuint: function(pos) {\n if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,5);\n return 0.5 * (Math.pow((pos-2),5) + 2);\n },\n \n easeInSine: function(pos) {\n return -Math.cos(pos * (Math.PI/2)) + 1;\n },\n \n easeOutSine: function(pos) {\n return Math.sin(pos * (Math.PI/2));\n },\n \n easeInOutSine: function(pos) {\n return (-0.5 * (Math.cos(Math.PI*pos) -1));\n },\n \n easeInExpo: function(pos) {\n return (pos===0) ? 0 : Math.pow(2, 10 * (pos - 1));\n },\n \n easeOutExpo: function(pos) {\n return (pos===1) ? 1 : -Math.pow(2, -10 * pos) + 1;\n },\n \n easeInOutExpo: function(pos) {\n if(pos===0) return 0;\n if(pos===1) return 1;\n if((pos/=0.5) < 1) return 0.5 * Math.pow(2,10 * (pos-1));\n return 0.5 * (-Math.pow(2, -10 * --pos) + 2);\n },\n \n easeInCirc: function(pos) {\n return -(Math.sqrt(1 - (pos*pos)) - 1);\n },\n \n easeOutCirc: function(pos) {\n return Math.sqrt(1 - Math.pow((pos-1), 2));\n },\n \n easeInOutCirc: function(pos) {\n if((pos/=0.5) < 1) return -0.5 * (Math.sqrt(1 - pos*pos) - 1);\n return 0.5 * (Math.sqrt(1 - (pos-=2)*pos) + 1);\n },\n \n easeOutBounce: function(pos) {\n if ((pos) < (1/2.75)) {\n return (7.5625*pos*pos);\n } else if (pos < (2/2.75)) {\n return (7.5625*(pos-=(1.5/2.75))*pos + 0.75);\n } else if (pos < (2.5/2.75)) {\n return (7.5625*(pos-=(2.25/2.75))*pos + 0.9375);\n } else {\n return (7.5625*(pos-=(2.625/2.75))*pos + 0.984375);\n }\n },\n \n easeInBack: function(pos) {\n var s = 1.70158;\n return (pos)*pos*((s+1)*pos - s);\n },\n \n easeOutBack: function(pos) {\n var s = 1.70158;\n return (pos=pos-1)*pos*((s+1)*pos + s) + 1;\n },\n \n easeInOutBack: function(pos) {\n var s = 1.70158;\n if((pos/=0.5) < 1) return 0.5*(pos*pos*(((s*=(1.525))+1)*pos -s));\n return 0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos +s) +2);\n },\n \n elastic: function(pos) {\n return -1 * Math.pow(4,-8*pos) * Math.sin((pos*6-1)*(2*Math.PI)/2) + 1;\n },\n \n swingFromTo: function(pos) {\n var s = 1.70158;\n return ((pos/=0.5) < 1) ? 0.5*(pos*pos*(((s*=(1.525))+1)*pos - s)) :\n 0.5*((pos-=2)*pos*(((s*=(1.525))+1)*pos + s) + 2);\n },\n \n swingFrom: function(pos) {\n var s = 1.70158;\n return pos*pos*((s+1)*pos - s);\n },\n \n swingTo: function(pos) {\n var s = 1.70158;\n return (pos-=1)*pos*((s+1)*pos + s) + 1;\n },\n \n bounce: function(pos) {\n if (pos < (1/2.75)) {\n return (7.5625*pos*pos);\n } else if (pos < (2/2.75)) {\n return (7.5625*(pos-=(1.5/2.75))*pos + 0.75);\n } else if (pos < (2.5/2.75)) {\n return (7.5625*(pos-=(2.25/2.75))*pos + 0.9375);\n } else {\n return (7.5625*(pos-=(2.625/2.75))*pos + 0.984375);\n }\n },\n \n bouncePast: function(pos) {\n if (pos < (1/2.75)) {\n return (7.5625*pos*pos);\n } else if (pos < (2/2.75)) {\n return 2 - (7.5625*(pos-=(1.5/2.75))*pos + 0.75);\n } else if (pos < (2.5/2.75)) {\n return 2 - (7.5625*(pos-=(2.25/2.75))*pos + 0.9375);\n } else {\n return 2 - (7.5625*(pos-=(2.625/2.75))*pos + 0.984375);\n }\n },\n \n easeFromTo: function(pos) {\n if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,4);\n return -0.5 * ((pos-=2)*Math.pow(pos,3) - 2);\n },\n \n easeFrom: function(pos) {\n return Math.pow(pos,4);\n },\n \n easeTo: function(pos) {\n return Math.pow(pos,0.25);\n }\n }));","// Module\nvar code = \"

txtFloorplan

\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
  • \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
  • \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
    \\\"\\\"
    txtAskDealer
      txtAskQuestion
      -->
      Kliknij aby
      rozpocząc chat
      txtStart
      \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"

      Zapraszamy do kontaktu

      X

      Cześć, widzę, że interesuje Cię ta nieruchomość. Jeśli chcesz ze mną porozmawiać to pozostaw swój numer telefonu lub adres e-mail. Skontaktuję się z Tobą jak tylko będę dostępny.

      Skontaktujemy się z Tobą jak tylko to będzie możliwe

      \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
      txtCameraDisabled

      txtWelcome 

      txtTimeToScheduledStart
      \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
      txtYouAreInControl
      \";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"
      \";\n// Exports\nmodule.exports = code;","import i18n from \"i18next\";\nimport Backend from \"i18next-http-backend\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\n\nexport const initTranslations = () => {\n const promise = i18n\n .use(Backend)\n .use(LanguageDetector)\n .init({\n fallbackLng: \"en\",\n debug: false,\n detection: {\n order: [\"navigator\", \"querystring\", \"cookie\"],\n lookupQuerystring: 'lang',\n cache: [\"cookie\"],\n },\n interpolation: {\n escapeValue: false,\n },\n backend: {\n loadPath: ([lng]) => {\n // console.log(lng);\n return `${window.apiUrl}/api/translations/translations/${lng}.json?applicationType=2`;\n },\n parse: (data) => {\n const parsed = JSON.parse(data);\n const merged = Object.entries(parsed).reduce(\n (prev, curr) => Object.assign(prev, curr[1]),\n {}\n );\n // console.log(\"Parsed data\", merged);\n return merged;\n },\n },\n });\n \n customElements.define('i18n-t', class extends HTMLElement {\n connectedCallback() {\n this.innerHTML = i18n.t(this.innerHTML);\n }\n })\n \n return promise;\n};\n\nexport default i18n;\n","import i18n from \"../config/i18n\";\nimport loaderTemplate from \"../pages/loader.html\";\n\nclass Utils {\n addClass(control, css) {\n if (css) {\n control.classList.add(css.trim());\n }\n /*if (control.className.indexOf(css) < 0) {\n control.className += css;\n }*/\n }\n removeClass(control, css) {\n if (css) {\n control.classList.remove(css.trim());\n }\n /*const index = control.className.indexOf(css);\n if (index >= 0) {\n control.className = control.className.substr(0, index);\n }*/\n }\n checkClass(control, css) {\n if (css) {\n return control.classList.contains(css.trim());\n }\n }\n setVisibility(control, visibility) {\n if ((!this.checkClass(control, \"hidden\")) !== visibility) {\n if (visibility) {\n this.removeClass(control, \"hidden\");\n } else {\n this.addClass(control, \"hidden\");\n }\n }\n }\n registerEvent(sender, eventType, handler) {\n if (eventType === \"click\") {\n let touchEvent = \"ontouchend\" in window ? \"touchend\" : \"click\";\n sender.addEventListener(touchEvent, handler);\n } else {\n sender.addEventListener(eventType, handler);\n }\n }\n getParameterValue(parameter, def) {\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has(parameter)) {\n return urlParams.get(parameter);\n } else {\n return def || null;\n }\n }\n isObject(obj) {\n return typeof obj === \"object\" && !Array.isArray(obj) && obj !== null;\n }\n translateAttributes(element) {\n const toTranslation = element?.querySelectorAll(\"*[data-translate]\") || [];\n toTranslation.forEach((node) => {\n const attributeToTranslate = node.dataset.translate;\n if (\n attributeToTranslate in node &&\n typeof node[attributeToTranslate] === \"string\"\n ) {\n node[attributeToTranslate] = i18n.t(node[attributeToTranslate]);\n }\n });\n }\n getCookie(cname) {\n const name = cname + \"=\";\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == \" \") {\n c = c.substring(1);\n }\n if (c.indexOf(name) == 0) {\n return c.substring(name.length, c.length);\n }\n }\n return \"\";\n }\n getProjectLang() {\n const languageFromNavigator = navigator?.language?.split(\"-\")?.[0];\n const languageFromQuery = this.getParameterValue(\"lang\");\n const languageFromCookie = this.getCookie(\"i18next\");\n\n if (languageFromNavigator) {\n return languageFromNavigator;\n } else if (languageFromQuery && languageFromQuery !== \"\") {\n return languageFromQuery;\n } else if (languageFromCookie) {\n return languageFromCookie;\n } else {\n return \"en\";\n }\n }\n getProjectCreationLanguage() {\n const languageFromQuery = this.getParameterValue(\"lang\");\n return languageFromQuery || this.getProjectLang();\n }\n async isPermissionDenied(permissionName) {\n if (navigator.permissions) {\n try {\n const result = await navigator.permissions.query({\n name: permissionName,\n });\n return result.state === \"denied\" || result.state === \"prompt\";\n } catch {\n return false;\n }\n } else {\n return false;\n }\n }\n\n showLoader() {\n const backdrop = document.createElement(\"div\");\n backdrop.classList.add(\"backdrop\");\n\n const loader = document.createElement(\"div\");\n loader.innerHTML = loaderTemplate;\n\n document.body.appendChild(backdrop);\n document.body.appendChild(loader);\n\n return () => {\n backdrop.remove();\n loader.remove();\n };\n }\n}\nexport default new Utils();\n","class EventBus {\n constructor() {\n this.eventCallbacksPairs = [];\n }\n\n subscribe(eventType, callback) {\n const eventCallbacksPair = this._findEventCallbacksPair(eventType);\n\n if (eventCallbacksPair) {\n for (let existing of eventCallbacksPair.callbacks) {\n if (existing.toString() === callback.toString()) {\n return;\n }\n }\n eventCallbacksPair.callbacks.push(callback);\n } else {\n this.eventCallbacksPairs.push(new EventCallbacksPair(eventType, callback));\n }\n }\n\n post(eventType, args) {\n const eventCallbacksPair = this._findEventCallbacksPair(eventType);\n \n if (!eventCallbacksPair) {\n console.error(\"no subscribers for event \" + eventType);\n return;\n }\n\n eventCallbacksPair.callbacks.forEach(callback => callback(args));\n }\n\n _findEventCallbacksPair(eventType) {\n return this.eventCallbacksPairs.find(eventObject => eventObject.eventType === eventType);\n }\n}\n\nclass EventCallbacksPair {\n constructor(eventType, callback) {\n this.eventType = eventType;\n this.callbacks = [callback];\n }\n}\n\nexport const Bus = new EventBus();\nexport const GOT_USER_MEDIA = \"GOT_USER_MEDIA\";\nexport const INVOKE = \"INVOKE\";\nexport const GOT_REMOTE_STREAM = \"GOT_REMOTE_STREAM\";\nexport const ERROR = \"ERROR\";\nexport const END_CALL = \"END_CALL\";\nexport const NEW_MESSAGE = \"NEW_MESSAGE\";\nexport const CONNECTED = \"CONNECTED\";\nexport const CONNECTION_FAILURE = \"CONNECTION_FAILURE\";","export const SCENE_CHANGED = 'SCENE_CHANGED';\nexport const INTRO_CLOSED = 'INTRO_CLOSED';\nexport const VIEW_CHANGED = 'VIEW_CHANGED';\nexport const MEDIA_PREVIEW_OPENED = 'MEDIA_PREVIEW_OPENED';\nexport const MEDIA_PREVIEW_CLOSED = 'MEDIA_PREVIEW_CLOSED';\nexport const CHAT_STARTED = 'CHAT_STARTED';\nexport const FIRST_VISIT_SCHENE = 'FIRST_VISIT_SCHENE';","import Utils from \"App/js/utils.js\";\n\nclass Logo {\n constructor(project, property, selector) {\n this.url = project[property];\n this.src = this.url;\n this.container = document.querySelector(selector);\n this.img = this.container.querySelector(\".img\");\n }\n show() {\n if(this.src) {\n this.img.src = this.src;\n Utils.removeClass(this.container, \"hidden\");\n }\n }\n}\nexport default Logo;","// import Quill from 'quill';\n// import theme from 'quill/dist/quill.snow.css';\nimport Utils from \"App/js/utils.js\";\nimport { Bus } from \"App/js/simple-bus.js\";\nimport { INTRO_CLOSED } from \"App/js/events.js\";\nimport Logo from \"App/js/logo\";\nimport i18n from \"../config/i18n\";\n\nclass Intro {\n constructor(container, minMode, config) {\n this.minMode = minMode;\n this.active = true;\n this.container = container.querySelector(\".intro\");\n this.config = config;\n }\n show(project, status, onClick) {\n const introDescription = document.querySelector(\".intro-description\");\n if (this.config.OgImage) {\n this.container.style.backgroundImage = `url(${this.config.OgImage})`;\n }\n const title = project.Name;\n const description = project.Description;\n const logoUrl = project.GroupLogoUrl;\n this.status = status;\n /*const control = new Quill('.placeholder', {\n modules: {\n toolbar: null\n },\n readOnly: true,\n theme: 'snow'\n });\n const content = JSON.parse(description);\n control.setContents(content);*/\n\n if (!this.minMode) {\n //// logo w intro\n //new Logo(project, \"GroupLogoUrl\", \".intro\").show();\n\n // logo w intro\n if (project.GroupLogoUrl !== null) {\n new Logo(project, \"GroupLogoUrl\", \".company-logo\").show();\n } else {\n Utils.removeClass(document.querySelector(\".img360\"), \"hidden\");\n }\n\n // intro - avatar\n new Logo(project, \"OwnerAvatarUrl\", \".owner-avatar\").show();\n }\n\n //Utils.removeClass(logo, 'hidden');\n const titleControl = this.container.querySelector(\".title\");\n titleControl.innerText = title;\n\n const infoControl = this.container.querySelector(\".info\");\n if (!this.minMode) {\n infoControl.innerText = i18n.t(\"txtIntroDescription\");\n } else {\n Utils.addClass(infoControl, \" hidden\");\n }\n\n /*this.showPlay(onClick);*/\n this.showStartButton(onClick);\n Utils.addClass(this.container, \" visible\");\n if (this.container.clientHeight <= 500) {\n this.container.classList.add(\"isMobile\");\n }\n window.addEventListener(\"resize\", (e) => {\n if (e.target.innerHeight <= 500) {\n this.container.classList.add(\"isMobile\");\n }\n if (e.target.innerHeight > 500) {\n this.container.classList.remove(\"isMobile\");\n }\n });\n\n /*const desc = this.container.querySelector(\".description\");*/\n /*const placeholder = this.container.querySelector(\".placeholder\");\n if (placeholder.clientHeight > desc.clientHeight) {\n const last = this.getLastVisibleChild(desc, this.container.clientHeight - 18);//elipsis height\n const top = last.getBoundingClientRect().top;\n desc.setAttribute(\"style\", `bottom: ${this.container.clientHeight - top}px`);\n Utils.addClass(last, ' hidden');\n const elipsis = document.querySelector(\".elipsis\");\n Utils.addClass(elipsis, ' visible');\n }*/\n }\n showLoadFailed(serverNotResponse) {\n const titleControl = this.container.querySelector(\".title\");\n titleControl.innerText = \"Not found\";\n const infoControl = this.container.querySelector(\".info\");\n\n if (serverNotResponse) {\n infoControl.innerText = i18n.t(\"txtServerError\");\n } else {\n infoControl.innerText = i18n.t(\"txtWalkDisabled\");\n }\n\n Utils.addClass(this.container, \" visible\");\n\n const button = this.container.querySelector(\".start-button\");\n button.remove();\n //let buttonText = 'Wirtualny spacer nie istnieje lub został usunięty.';\n //button.innerText = buttonText;\n }\n getLastVisibleChild(control, max) {\n if (control.children.length === 0) {\n return control;\n }\n for (let i = 0; i < control.children.length; i++) {\n const child = control.children[i];\n const bottom = child.getBoundingClientRect().bottom;\n if (bottom > max) {\n return this.getLastVisibleChild(child, max);\n }\n }\n return null;\n }\n hide(cb) {\n this.active = false;\n Utils.removeClass(this.container, \" visible\");\n // this.container.parentElement.style.display = 'none';\n document.querySelector(\".watermark\").classList.remove(\"watermark--intro\");\n let viewport = document.getElementById(\"viewport\");\n viewport.classList.remove(\"blur\");\n Bus.post(INTRO_CLOSED);\n if (typeof cb === \"function\") {\n cb(this);\n }\n }\n showPlay(onClick) {\n const button = this.container.querySelector(\".play\");\n if (!button) {\n console.warn(\"Play button does not exist.\");\n return;\n }\n Utils.addClass(button, \" visible\");\n button.addEventListener(\"click\", onClick);\n }\n showStartButton(onClick) {\n const container = this.container.querySelector(\".intro-description\");\n const button = this.container.querySelector(\".start-button\");\n let buttonText = i18n.t(\"txtWalkNotAvailable\");\n\n if (this.status == 1) {\n container.innerText = \"\";\n var node = document.createElement(\"p\");\n node.classList = \"info\";\n node.innerText = i18n.t(\"txtWalkDisabled\");\n container.appendChild(node);\n } else if (this.status == 2) {\n buttonText = i18n.t(\"txtStartBtnText\");\n button.addEventListener(\"click\", onClick);\n Utils.addClass(button, \"active\");\n } else {\n console.warn(\"Status: \" + this.status);\n }\n button.innerText = buttonText;\n\n var node = document.createElement(\"i\");\n node.classList.add(\"fas\");\n node.classList.add(\"fa-play-circle\");\n button.appendChild(node);\n }\n}\n\nexport default Intro;\n","import floorplanWindowTemplate from \"App/pages/floorplanWindow.html\";\nimport floorplanTabTemplate from \"App/pages/floorplanTab.html\";\nimport floorplanLevelTemplate from \"App/pages/floorplanLevel.html\";\nimport tippy from \"tippy.js\";\nimport 'tippy.js/dist/tippy.css';\n\nexport default class Floorplan {\n constructor(container, photos) {\n this.container = container;\n this.photos = photos;\n this.events = {};\n this.levels = [];\n this.points = [];\n this.onPointClickEvent = new CustomEvent(\"onPointClick\");\n }\n\n addEventListener(name, handler) {\n if (this.events.hasOwnProperty(name)) {\n this.events[name].push(handler);\n } else {\n this.events[name] = [handler];\n }\n }\n\n removeEventListener(name, handler) {\n if (!this.events.hasOwnProperty(name)) {\n return;\n }\n var index = this.events[name].indexOf(handler);\n if (index != -1) {\n this.events[name].splice(index, 1);\n }\n }\n\n fireEvent(name, args) {\n if (!this.events.hasOwnProperty(name)) {\n return;\n }\n if (!args || !args.length) {\n args = [];\n }\n var evs = this.events[name], l = evs.length;\n for (var i = 0; i < l; i++) {\n evs[i].apply(null, args);\n }\n }\n\n buildWindow() {\n let floorplanElement = document.createElement('div');\n floorplanElement.innerHTML = floorplanWindowTemplate;\n return floorplanElement.firstChild;\n }\n\n buildTab(level, index) {\n const tabElementDiv = document.createElement('div');\n tabElementDiv.innerHTML = floorplanTabTemplate;\n const tabElement = tabElementDiv.firstChild;\n tabElement.setAttribute(\"id\", `floorplanTab-${level.Id}`);\n const link = tabElement.querySelector(\".floorplan-tab-link\");\n link.innerHTML = (index+1).toString();\n link.addEventListener(\"click\", function (e) {\n e.preventDefault();\n this.onTabClick(level.Id);\n }.bind(this));\n return tabElement;\n }\n\n buildLevelPoint(point, levelId) {\n const photo = this.getPhotoById(point.PhotoId);\n if (photo) {\n const pointElementDiv = document.createElement('div');\n pointElementDiv.innerHTML = `
    • `;\n const pointElement = pointElementDiv.firstChild;\n pointElement.setAttribute(\"id\", `floorplanPoint-${point.PhotoId}`);\n pointElement.dataset.label = photo.Name;\n pointElement.style.left = `${point.X}%`;\n pointElement.style.top = `${point.Y}%`;\n pointElement.addEventListener(\"click\", function (e) {\n this.onPointClick(point.PhotoId);\n }.bind(this));\n this.points.push({\n ...point,\n level: levelId,\n element: pointElement,\n });\n return pointElement;\n }\n return false;\n }\n\n buildLevel(level) {\n const levelElementDiv = document.createElement('div');\n levelElementDiv.innerHTML = floorplanLevelTemplate;\n const levelElement = levelElementDiv.firstChild;\n levelElement.setAttribute(\"id\", `floorplanLevel-${level.Id}`);\n levelElement.querySelector(\".floorplan-level-img\").setAttribute(\"src\", level.Url);\n const levelPoints = levelElement.querySelector(\".floorplan-points\");\n for (var i = 0; i < level.Points.length; i++) {\n const point = level.Points[i];\n const pointElement = this.buildLevelPoint(point, level.Id);\n if (pointElement) {\n levelPoints.appendChild(pointElement);\n }\n }\n return levelElement;\n }\n\n rebuildLevels(levels) {\n this.levels = [];\n this.points = [];\n this.floorplanTabs.querySelectorAll(\".floorplan-tab\").forEach(function (el) {\n el.remove();\n });\n this.floorplanLevels.querySelectorAll(\".floorplan-level\").forEach(function (el) {\n el.remove();\n });\n for (var i = 0; i < levels.length; i++) {\n const level = levels[i];\n const florplanTab = this.buildTab(level, i);\n const florplanLevel = this.buildLevel(level);\n this.floorplanTabs.appendChild(florplanTab);\n this.floorplanLevels.appendChild(florplanLevel);\n this.levels.push({\n ...level,\n tab: florplanTab,\n level: florplanLevel,\n });\n }\n\n this.floorplanLevels.querySelectorAll(\".floorplan-level .floorplan-points\").forEach(pointsContainer => {\n pointsContainer.querySelectorAll('.floorplan-point').forEach(point => {\n const label = point.dataset.label;\n tippy(point, {\n content: label,\n arrow: false,\n theme: 'green',\n appendTo: 'parent',\n placement: 'auto',\n offset: [0, 15],\n popperOptions: {\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n boundary: pointsContainer,\n },\n },\n {\n name: 'computeStyles',\n options: {\n roundOffsets: ({ x, y }) => ({\n x: Math.round(x + 10),\n y: Math.round(y + 10),\n }),\n },\n },\n ],\n }\n });\n });\n });\n }\n\n create(levels) {\n const floorplan = this.buildWindow();\n\n const floorplanTabs = floorplan.querySelector(\".floorplan-tabs ul\");\n const floorplanLevels = floorplan.querySelector(\".floorplan-levels ul\");\n\n this.floorplan = floorplan;\n this.floorplanTabs = floorplanTabs;\n this.floorplanLevels = floorplanLevels;\n\n const preparedLevels = levels.filter(level => Boolean(level));\n this.rebuildLevels(preparedLevels);\n\n if (this.levels.length > 0) {\n this.showLevel(this.levels[0].Id);\n }\n this.container.appendChild(floorplan);\n }\n\n show() {\n if (this.levels.length) {\n this.floorplan.classList.remove(\"hidden\");\n }\n }\n\n showLevel(id) {\n const tab = this.floorplanTabs.querySelector(`#floorplanTab-${id}`);\n const level = this.floorplanLevels.querySelector(`#floorplanLevel-${id}`);\n this.floorplanTabs.querySelectorAll(\".floorplan-tab\").forEach(function (el) {\n el.classList.remove(\"active\");\n });\n this.floorplanLevels.querySelectorAll(\".floorplan-level\").forEach(function (el) {\n el.classList.add(\"hidden\");\n });\n if (tab) {\n tab.classList.add(\"active\");\n }\n if (level) {\n level.classList.remove(\"hidden\");\n }\n }\n\n switchPoint(id, initial) {\n const withSwitchLevel = initial || false;\n this.floorplan.querySelectorAll(\".floorplan-point\").forEach(function (el) {\n el.classList.remove(\"active\");\n });\n const point = this.points.find(function (point) {\n return point.PhotoId === id;\n }.bind(this));\n if (point) {\n point.element.classList.add(\"active\");\n if (withSwitchLevel) {\n this.showLevel(point.level);\n }\n }\n }\n\n onTabClick(id) {\n this.showLevel(id);\n }\n\n onPointClick(id) {\n this.switchPoint(id);\n this.fireEvent(\"onPointClick\", [id]);\n }\n\n getPhotoById(id) {\n return this.photos.find(photo => photo.Id === id);\n }\n}\n","\"use strict;\";\n\nimport fontawesome from \"@fortawesome/fontawesome\";\nimport faSync from \"@fortawesome/fontawesome-free-solid/faSync\";\nimport faSignInAlt from \"@fortawesome/fontawesome-free-solid/faSignInAlt\";\nimport faPlay from \"@fortawesome/fontawesome-free-solid/faPlay\";\nimport faArrowLeft from \"@fortawesome/fontawesome-free-solid/faArrowLeft\";\nimport faArrowRight from \"@fortawesome/fontawesome-free-solid/faArrowRight\";\nimport faArrowUp from \"@fortawesome/fontawesome-free-solid/faArrowUp\";\nimport faArrowDown from \"@fortawesome/fontawesome-free-solid/faArrowDown\";\nimport faPlus from \"@fortawesome/fontawesome-free-solid/faPlus\";\nimport faMinus from \"@fortawesome/fontawesome-free-solid/faMinus\";\nimport faSpinner from \"@fortawesome/fontawesome-free-solid/faSpinner\";\nimport faPlayCircle from \"@fortawesome/fontawesome-free-solid/faPlayCircle\";\nimport faCircle from \"@fortawesome/fontawesome-free-solid/faCircle\";\nimport faLink from \"@fortawesome/fontawesome-free-solid/faLink\";\nimport faUnlink from \"@fortawesome/fontawesome-free-solid/faUnlink\";\nimport faPhone from \"@fortawesome/fontawesome-free-solid/faPhone\";\nimport faPhoneSlash from \"@fortawesome/fontawesome-free-solid/faPhoneSlash\";\nimport faMicrophone from \"@fortawesome/fontawesome-free-solid/faMicrophone\";\nimport faMicrophoneSlash from \"@fortawesome/fontawesome-free-solid/faMicrophoneSlash\";\nimport faExpand from \"@fortawesome/fontawesome-free-solid/faExpand\";\nimport faInfo from \"@fortawesome/fontawesome-free-solid/faInfo\";\nimport farCircle from \"@fortawesome/fontawesome-free-regular/faCircle\";\nimport faArrowAltCircleRight from \"@fortawesome/fontawesome-free-solid/faArrowAltCircleRight\";\nimport faComments from \"@fortawesome/fontawesome-free-solid/faComments\";\nimport faTimes from \"@fortawesome/fontawesome-free-solid/faTimes\";\nimport faCheck from \"@fortawesome/fontawesome-free-solid/faCheck\";\nimport faShoePrints from \"@fortawesome/fontawesome-free-solid/faShoePrints\";\nimport faWalking from \"@fortawesome/fontawesome-free-solid/faWalking\";\nimport faUserTie from \"@fortawesome/fontawesome-free-solid/faUserTie\";\nimport faEnvelope from \"@fortawesome/fontawesome-free-solid/faEnvelope\";\nimport faMap from \"@fortawesome/fontawesome-free-solid/faMap\";\nimport farSmile from \"@fortawesome/fontawesome-free-regular/faSmile\";\nimport faCamera from \"@fortawesome/fontawesome-free-solid/faCamera\";\nimport faVolumeDown from \"@fortawesome/fontawesome-free-solid/faVolumeDown\";\nimport faVolumeUp from \"@fortawesome/fontawesome-free-solid/faVolumeUp\";\nimport faVolumeOff from \"@fortawesome/fontawesome-free-solid/faVolumeOff\";\nimport comment from \"@fortawesome/fontawesome-free-solid/faComment\";\nimport commentSlash from \"@fortawesome/fontawesome-free-solid/faCommentSlash\";\n\nfontawesome.library.add(\n faSync,\n faSignInAlt,\n faEnvelope,\n faArrowLeft,\n faArrowRight,\n faArrowUp,\n faArrowDown,\n faPlus,\n faMinus,\n faSpinner,\n faPlayCircle,\n faCircle,\n faLink,\n faUnlink,\n faPhone,\n faPhoneSlash,\n faMicrophone,\n faMicrophoneSlash,\n faExpand,\n faInfo,\n farCircle,\n faArrowAltCircleRight,\n faComments,\n faTimes,\n faShoePrints,\n faWalking,\n faCheck,\n faPlay,\n faUserTie,\n faMap,\n farSmile,\n faCamera,\n faVolumeUp,\n faVolumeOff,\n comment,\n commentSlash\n);\n\nfontawesome.dom.i2svg();\n","import dayjs from \"dayjs\";\nimport {\n CHAT_STARTED,\n FIRST_VISIT_SCHENE,\n INTRO_CLOSED,\n MEDIA_PREVIEW_CLOSED,\n MEDIA_PREVIEW_OPENED,\n SCENE_CHANGED,\n VIEW_CHANGED,\n} from \"./events\";\nimport { Bus } from \"./simple-bus\";\n\nexport default class ActivityTracker {\n constructor(config) {\n this.config = config;\n this.currentSceneId = config?.StartingPhotoId ?? config?.Photos?.[0]?.Id;\n this.visitedRooms = {};\n this.visitedRooms[this.currentSceneId] = {\n time: 0,\n };\n this.lastSceneChange = dayjs();\n this.lastActivityCallbacks = [];\n\n this.isMediaPreviewOpen = false;\n this.isChatStarted = false;\n\n this.handleEvents();\n }\n\n handleEvents() {\n Bus.subscribe(VIEW_CHANGED, (data) => {\n this.onNewActivity(VIEW_CHANGED, data);\n });\n\n Bus.subscribe(SCENE_CHANGED, (data) => {\n if (!(data?.photoId in this.visitedRooms)) {\n this.onNewActivity(FIRST_VISIT_SCHENE, data);\n this.visitedRooms[data?.photoId] = {\n time: 0,\n };\n }\n this.visitedRooms[this.currentSceneId].time += dayjs().diff(\n this.lastSceneChange,\n \"second\"\n );\n this.currentSceneId = data?.photoId;\n this.lastSceneChange = dayjs();\n this.onNewActivity(SCENE_CHANGED, data);\n });\n\n Bus.subscribe(MEDIA_PREVIEW_OPENED, (data) => {\n this.isMediaPreviewOpen = true;\n this.onNewActivity(MEDIA_PREVIEW_OPENED, data);\n });\n\n Bus.subscribe(MEDIA_PREVIEW_CLOSED, (data) => {\n this.isMediaPreviewOpen = false;\n this.onNewActivity(MEDIA_PREVIEW_CLOSED, data);\n });\n\n Bus.subscribe(CHAT_STARTED, (data) => {\n this.isChatStarted = true;\n this.onNewActivity(CHAT_STARTED, data);\n });\n }\n\n onNewActivity(type, data) {\n console.log(`%c[event] ${type}`, \"color: #87A2FB\");\n this.lastActivityCallbacks.forEach((activity) => {\n if (activity.type && type !== activity.type) return;\n if (activity.timeout) {\n clearTimeout(activity.timeout);\n }\n if (activity.time > 0) {\n activity.timeout = setTimeout(\n () => activity.callback(data),\n activity.time\n );\n } else {\n activity.callback(data);\n }\n });\n }\n\n afterLastActivity(type, callback, time, fromNextEvent = true) {\n this.lastActivityCallbacks.push({\n callback,\n time,\n type,\n timeout: fromNextEvent ? null : setTimeout(callback, time),\n });\n }\n\n getUnvisitedRoom() {\n const unvisitedRooms = this.config.Photos.filter(\n (photo) => !(photo.Id in this.visitedRooms)\n );\n return unvisitedRooms.length\n ? unvisitedRooms[Math.floor(Math.random() * unvisitedRooms.length)]\n : null;\n }\n\n wasVisited(sceneId, time = 0) {\n return (\n sceneId in this.visitedRooms && this.visitedRooms[sceneId].time > time\n );\n }\n}\n","import Marzipano from \"marzipano\";\nimport viewportTemplate from \"App/pages/viewport.html\";\nimport hotspotDoorTemplate from \"App/pages/hotspotDoor.html\";\nimport hotspotDoorOnGroundTemplate from \"App/pages/hotspotDoorOnGround.html\";\nimport hotspotInfoTemplate from \"App/pages/hotspotInfo.html\";\nimport hotspotLogoTemplate from \"App/pages/hotspotLogo.html\";\nimport Intro from \"App/js/intro.js\";\nimport Utils from \"App/js/utils.js\";\nimport { Bus } from \"App/js/simple-bus.js\";\nimport { SCENE_CHANGED } from \"App/js/events.js\";\nimport Easing from \"App/js/easing\";\nimport Floorplan from \"App/js/floorplan\";\nimport icons from \"App/js/icons.js\";\nimport { text } from \"@fortawesome/fontawesome\";\nimport i18n from \"../config/i18n\";\nimport ActivityTracker from \"./activity-tracker\";\nimport {\n INTRO_CLOSED,\n MEDIA_PREVIEW_CLOSED,\n MEDIA_PREVIEW_OPENED,\n VIEW_CHANGED,\n} from \"./events\";\n\nconst POINT_DOOR = 0;\nconst POINT_INFO = 1;\nconst POINT_LOGO = 2;\n\nconst AUTOROTATE_ACTIVE = true;\nconst AUTOROTATE_CHANGE_SCENE_TIME = 10;\nconst AUTOROTATE_CHANGE_SCENE_DELAY = 5000;\nconst AUTOROTATE_MOVEMENT = Marzipano.autorotate({\n yawAccel: 8,\n yawSpeed: 0.05, // Yaw rotation speed\n targetPitch: 0.2, // Pitch value to converge to\n targetFov: Math.PI / 2, // Fov value to converge to\n});\n\nexport default class VirtualWalk {\n constructor(project, store, options, config) {\n const { minimalMode, autorotate, showNadir } = options;\n\n const containerCandidates = document.getElementsByTagName(\"body\");\n\n if (!containerCandidates.length) {\n return;\n }\n this.container = containerCandidates[0];\n if (!project) {\n console.warn(\"Missing project\");\n return;\n }\n\n this.autorotate = autorotate;\n this.minimalMode = minimalMode;\n this.showNadir = showNadir;\n\n this.config = config;\n const projectSplit = project.split(\"-\");\n this.projectId = Number(projectSplit[projectSplit.length - 1]);\n\n this.createViewer();\n this.intro = new Intro(this.container, minimalMode, config);\n this.store = store;\n this.switching = false;\n\n this.bigpic = document.getElementById(\"bigpic\");\n Utils.registerEvent(\n this.bigpic,\n \"click\",\n function () {\n this.hideBigPic();\n }.bind(this)\n );\n\n this.setupNavigator();\n }\n\n createFloorplam() {\n this.floorplan = new Floorplan(this.container, this.project.Photos);\n this.floorplan.addEventListener(\n \"onPointClick\",\n function (id) {\n const photo = this.project.map[id];\n if (photo) {\n this.switchSceneDirect(photo);\n }\n }.bind(this)\n );\n }\n\n load(ready) {\n this.hideSpinner();\n if (Object.prototype.toString.call(this.config) !== \"[object Object]\") {\n if (this.config === 404) {\n this.intro.showLoadFailed();\n } else {\n this.intro.showLoadFailed(true);\n }\n } else {\n this.buildMap(this.config);\n if (this.config.Status == 2) {\n //2 - published\n //const startScene = this.getStartScene();\n let first;\n if (this.config.StartingPhotoId != null) {\n first = this.getPhoto(this.config.StartingPhotoId);\n } else {\n first = this.getFirst();\n }\n\n if (first == null) {\n this.hideSpinner();\n this.showMessage(i18n.t(\"txtNoPhotosInWalk\"));\n return;\n }\n\n if (this.config.IsFloorplan) {\n this.createFloorplam();\n this.floorplan.create(this.config.Floorplans);\n }\n\n let entertrace = null;\n if (this.project.StartScene.Pitch != null) {\n entertrace = this.project.StartScene;\n } else if (first.StartScene) {\n entertrace = first.StartScene;\n } else {\n entertrace = first.PhotoPoints[0];\n }\n\n this.prepareScene(first, entertrace);\n this.switchScene(first, first.PhotoPoints[0]);\n }\n\n this.intro.show(\n this.project,\n this.config.Status,\n this.onClick.bind(this)\n );\n this.hideSpinner();\n // }.bind(this)\n // )\n // .catch(result => {\n // console.log(result);\n // this.hideSpinner();\n // if (result.request && result.request.status == 404) {\n // this.intro.showLoadFailed();\n // } else {\n // this.intro.showLoadFailed(true);\n // }\n // console.warn(result);\n // });\n }\n }\n\n getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n\n buildMap(config) {\n if (config.GroupLogoUrl !== null && !config.GroupLogoUrl.includes(\"http\")) {\n config.GroupLogoUrl = window.hubsUrl + \"/logo/\" + config.GroupLogoUrl;\n }\n if (config.Logo !== null && config.Logo !== \"\") {\n config.GroupLogoUrl = config.Logo;\n }\n this.project = config;\n const map = {};\n const points = {};\n this.store.photosCount = this.project.Photos.length;\n for (let i = 0; i < this.project.Photos.length; i++) {\n const photo = this.project.Photos[i];\n\n if (!photo.Filters) {\n photo.Filters = {\n Saturation: 1,\n Contrast: 1,\n Brightness: 1,\n };\n }\n\n for (let j = 0; j < photo.PhotoPoints.length; j++) {\n const point = photo.PhotoPoints[j];\n points[point.Id] = point;\n }\n map[photo.Id] = {\n ...photo,\n scene: null,\n };\n }\n this.project.map = map;\n this.project.points = points;\n this.project.leadPage = config.IsLeadPage;\n }\n\n startAutorotate(delay) {\n if (this.autorotate) {\n if (this.autorotateTimer == null) {\n this.autorotateCounter = AUTOROTATE_CHANGE_SCENE_TIME;\n this.autorotateTimer = setInterval(() => {\n var currentTime = performance.now();\n var elapsed = currentTime - this.viewer._idleTimer._startTime;\n var remaining = this.viewer._idleTimer._duration - elapsed;\n var isIdle = remaining + 100 >= this.viewer._idleTimer._duration;\n if (this.autorotateCounter <= 0) {\n this.autorotateChangeScene();\n return false;\n }\n if (isIdle) {\n this.autorotateCounter--;\n } else {\n this.autorotateCounter = AUTOROTATE_CHANGE_SCENE_TIME;\n }\n }, 1000);\n }\n\n this.viewer.startMovement(AUTOROTATE_MOVEMENT);\n this.viewer.setIdleMovement(delay, AUTOROTATE_MOVEMENT);\n }\n }\n\n stopAutorotate() {\n if (this.autorotateTimer !== null) {\n clearInterval(this.autorotateTimer);\n this.autorotateTimer = null;\n }\n this.viewer.stopMovement();\n this.viewer.setIdleMovement({});\n }\n\n autorotateSetDelay(delay) {\n this.viewer._idleTimer._duration = delay;\n }\n\n autorotateChangeScene() {\n this.stopAutorotate();\n var nextIndex =\n this.store.currentPhotoIndex + 1 >= this.store.photosCount\n ? 0\n : this.store.currentPhotoIndex + 1;\n var next = this.project.Photos[nextIndex];\n this.switchSceneAlternative(next, next.PhotoPoints[0]);\n this.startAutorotate(AUTOROTATE_CHANGE_SCENE_DELAY);\n }\n\n autorotateActivity() {\n this.stopAutorotate();\n this.startAutorotate(AUTOROTATE_CHANGE_SCENE_DELAY);\n }\n\n createViewer() {\n this.container.innerHTML = viewportTemplate;\n const element = document.getElementById(\"viewport\");\n const excludedElement = document.querySelector(\".viewPhotoRoomList\");\n\n const blockElement = function(el) {\n const tryPrevent = function(e) {\n if(e.cancelable && !excludedElement.contains(e.target)) {\n e.preventDefault();\n }\n };\n el.addEventListener('touchmove', tryPrevent, { passive: false });\n el.addEventListener('pointermove', tryPrevent, { passive: false });\n el.style && (el.style.touchAction = \"none\");\n }\n blockElement(element);\n blockElement(document);\n \n element.style.height = this.container.clientHeight;\n\n this.hotspots = document.createElement(\"div\");\n this.hotspots.className = \"hotspots\";\n this.container.appendChild(this.hotspots);\n // Create viewer.\n this.viewer = new Marzipano.Viewer(element, {\n stage: {\n progressive: true,\n },\n });\n\n this.onRenderStarted = this.renderStarted.bind(this);\n this.viewer.addEventListener(\"sceneChange\", this.onRenderStarted);\n this.currentFov = 0;\n this.logoHotspot = null;\n\n const tools = {};\n\n // Create geometry.\n tools.geometry = new Marzipano.CubeGeometry([\n { tileSize: 2048, size: 2048, fallbackOnly: true },\n { tileSize: 4096, size: 4096 },\n { tileSize: 8192, size: 8192 },\n ]);\n\n this.tools = tools;\n }\n\n renderStarted() {\n this.autorotateActivity();\n\n const layer = this.viewer.scene().layer();\n\n const textureStore = layer.textureStore();\n const view = this.viewer.view();\n\n function isRenderFinished() {\n if (!view.size() || view.size().width == 0) {\n return false;\n }\n const tileList = [];\n layer.visibleTiles(tileList);\n for (let i = 0; i < tileList.length; i++) {\n if (!textureStore.query(tileList[i]).hasTexture) {\n return false;\n }\n }\n return true;\n }\n function renderFinished() {\n if (isRenderFinished()) {\n this.hideSpinner();\n this.showButtons();\n this.showHotspots();\n\n this.viewer.removeEventListener(\"sceneChange\", this.onRenderStarted);\n textureStore.removeEventListener(\"textureLoad\", renderFinished);\n }\n }\n if (isRenderFinished()) {\n renderFinished.bind(this)();\n return;\n }\n textureStore.addEventListener(\"textureLoad\", renderFinished.bind(this));\n }\n\n hideSpinner() {\n const spinner = document.querySelector(\".spinner\");\n Utils.addClass(spinner, \" hidden\");\n }\n\n updateTitle(title) {\n const photoTitle = document.querySelector(\".photoname-label\");\n photoTitle.textContent = title;\n }\n\n showHotspots() {\n if (this.intro.active) {\n return;\n }\n const hotspots = document.querySelectorAll(\".spot-center\");\n for (let i = 0; i < hotspots.length; i++) {\n Utils.addClass(hotspots[i], \" visible\");\n }\n }\n\n showMessage(text) {\n const message = document.querySelector(\".message\");\n message.textContent = text;\n Utils.addClass(message, \" visible\");\n }\n\n showButtons() {\n if (this.intro.active) {\n return;\n }\n const back = document.querySelector(\".button-back\");\n Utils.addClass(back, \" visible\");\n const controls = document.querySelectorAll(\".viewControlElement\");\n for (let i = 0; i < controls.length; i++) {\n Utils.addClass(controls[i], \" visible\");\n }\n }\n\n loadImage(imageUrl, onprogress) {\n return new Promise((resolve, reject) => {\n var xhr = new XMLHttpRequest();\n var notifiedNotComputable = false;\n\n xhr.open(\"GET\", imageUrl, true);\n xhr.responseType = \"arraybuffer\";\n\n xhr.onprogress = function (ev) {\n if (ev.lengthComputable) {\n onprogress(parseInt((ev.loaded / ev.total) * 100));\n } else {\n if (!notifiedNotComputable) {\n notifiedNotComputable = true;\n onprogress(-1);\n }\n }\n };\n\n xhr.onloadend = function () {\n if (!xhr.status.toString().match(/^2/)) {\n reject(xhr);\n } else {\n if (!notifiedNotComputable) {\n onprogress(100);\n }\n\n var options = {};\n var headers = xhr.getAllResponseHeaders();\n var m = headers.match(/^Content-Type\\:\\s*(.*?)$/im);\n\n if (m && m[1]) {\n options.type = m[1];\n }\n\n var blob = new Blob([this.response], options);\n\n resolve(window.URL.createObjectURL(blob));\n }\n };\n\n xhr.send();\n });\n }\n\n loadFace(index, url) {\n //console.log('xxxx', this.loadFaceStore);\n\n this.loadFaceStore.elements[index] = {\n loaded: false,\n progress: 0,\n };\n\n this.loadFaceStore.updateProgress();\n\n let onprogress = function (ratio) {\n this.loadFaceStore.elements[index].progress = ratio;\n this.loadFaceStore.updateProgress();\n }.bind(this);\n\n this.loadImage(url, onprogress).then(\n function (imgSrc) {\n this.loadFaceStore.elements[index].loaded = true;\n }.bind(this)\n );\n }\n\n createScene(url, initial) {\n // Create source.\n let attempt = 0;\n let container = this.container;\n\n this.loadFaceStore = {\n hideInterval: null,\n elements: [],\n loading: [],\n loaded: [],\n progress: [],\n currentPercent: 0,\n updateProgress: function () {\n function animateValue(obj, start, end, duration, fn) {\n // assumes integer values for start and end\n\n var range = end - start;\n // no timer shorter than 50ms (not really visible any way)\n var minTimer = 50;\n // calc step time to show all interediate values\n var stepTime = Math.abs(Math.floor(duration / range));\n\n // never go below minTimer\n stepTime = Math.max(stepTime, minTimer);\n\n // get current time and calculate desired end time\n var startTime = new Date().getTime();\n var endTime = startTime + duration;\n var timer;\n\n function run() {\n var now = new Date().getTime();\n var remaining = Math.max((endTime - now) / duration, 0);\n var value = Math.round(end - remaining * range);\n obj.innerText = value + \"%\";\n if (value == end) {\n clearInterval(timer);\n if (fn !== undefined) {\n fn(obj, end);\n }\n }\n }\n\n timer = setInterval(run, stepTime);\n run();\n }\n\n let current = 0;\n let max = 0;\n\n Object.keys(this.elements).forEach(\n function (index, value) {\n let element = this.elements[index];\n current += element.progress;\n max += 100;\n element.loaded = true;\n }.bind(this)\n );\n\n let percent = parseFloat((current / max) * 100).toFixed(2);\n\n //console.log('viewPhotoLoader', viewPhotoLoader);\n\n let viewPhotoLoader = container.querySelector(\".viewPhotoLoader\");\n let viewPhotoLoaderValue = viewPhotoLoader.querySelector(\".value\");\n\n if (percent <= 1) {\n viewPhotoLoaderValue.innerText = \"0%\";\n } else if (percent >= 99) {\n viewPhotoLoaderValue.innerText = \"100%\";\n this.hideInterval = setTimeout(function () {\n Utils.addClass(viewPhotoLoader, \" hidden\");\n }, 2000);\n } else {\n clearInterval(this.hideInterval);\n viewPhotoLoaderValue.innerText = percent + \"%\";\n Utils.removeClass(viewPhotoLoader, \" hidden\");\n this.currentPercent = percent;\n }\n },\n };\n\n const source = new Marzipano.ImageUrlSource(\n function (tile) {\n const face = tile.face.toUpperCase();\n //if (attempt >= 12) {\n // this.loadFace(face, url + face);\n // return {\n // url: url + face\n // };\n //}\n //attempt++;\n\n if (tile.z === 0) {\n this.loadFace(\"L\" + face, url + \"L\" + face);\n return {\n url: url + \"L\" + face,\n };\n } else if (tile.z === 1) {\n this.loadFace(\"H\" + face, url + \"H\" + face);\n return {\n url: url + \"H\" + face,\n };\n }\n }.bind(this)\n );\n\n var limiter = Marzipano.RectilinearView.limit.traditional(\n 4096,\n (100 * Math.PI) / 180,\n (180 * Math.PI) / 180\n );\n // Create scene.\n return this.viewer.createScene({\n source: source,\n geometry: this.tools.geometry,\n view: new Marzipano.RectilinearView(\n initial || { yaw: (3 / 4) * Math.PI, fov: Math.PI },\n limiter\n ),\n pinFirstLevel: true,\n });\n }\n\n prepareScene(photo, entrance) {\n if (photo.scene == null) {\n if (entrance) {\n var initial = this.mapPoint(entrance, false);\n photo.scene = this.createScene(photo.ImageUrl, initial);\n } else if (photo.StartScene !== null) {\n var initial = this.mapPoint(photo.StartScene, false);\n photo.scene = this.createScene(photo.ImageUrl, initial);\n } else {\n photo.scene = this.createScene(photo.ImageUrl);\n }\n\n photo.scene.photoId = photo.Id;\n for (let key in photo.PhotoPoints) {\n if (photo.PhotoPoints.hasOwnProperty(key)) {\n const point = photo.PhotoPoints[key];\n this.createHotspot(photo.scene, point);\n }\n }\n if (this.showNadir) {\n if (\n !this.minimalMode &&\n this.project.GroupLogoUrl !== null &&\n this.project.GroupLogoUrl !== \"\"\n ) {\n this.createHotspot(photo.scene, {\n Id: 0,\n Type: POINT_LOGO,\n });\n }\n }\n }\n }\n\n //from remote source\n requestSwitchScene(data, reverse) {\n const points = this.project.map[data.photoId].PhotoPoints;\n const targetId = data.targetId || (points.length > 0 ? points[0].Id : null);\n const target = this.project.points[targetId];\n const photo = this.project.map[data.photoId];\n this.switchScene(photo, target, reverse);\n }\n\n switchSceneByUser(photo, target, reverse) {\n Bus.post(SCENE_CHANGED, {\n photoId: photo.Id,\n targetId: target?.Id,\n targetPhotoId: target?.TargetPhotoId,\n });\n this.switchScene(photo, target, reverse);\n }\n\n mapPoint(point, reverse) {\n const pitch = point.pitch || point.Pitch;\n const yaw = point.yaw || point.Yaw;\n return {\n pitch,\n yaw: reverse ? yaw + (180 * Math.PI) / 180 : yaw,\n fov: (120 * Math.PI) / 180,\n };\n }\n\n setCanvasEffects(canvas, filters) {\n var filterString = \"\";\n for (var key in filters) {\n filterString =\n filterString + \" \" + key.toLowerCase() + \"(\" + filters[key] + \")\";\n }\n Object.assign(canvas.style, {\n filter: filterString,\n });\n }\n\n switchSceneDirect(photo) {\n var afterCall = null;\n if (this.viewer && this.viewer.scene()) {\n var lastScene = this.viewer.scene();\n\n if (lastScene && lastScene.photoId === photo.Id) {\n if (photo.StartScene) {\n var exit = this.mapPoint(photo.StartScene);\n this.viewer.lookTo(exit, { transitionDuration: 500 });\n }\n return;\n }\n\n afterCall = function () {\n var lastPhoto = this.project.map[lastScene.photoId];\n lastPhoto.scene = null;\n this.viewer.destroyScene(lastScene);\n }.bind(this);\n }\n\n if (photo.StartScene) {\n const entertrace = this.mapPoint(photo.StartScene);\n this.prepareScene(photo, entertrace);\n } else {\n this.prepareScene(photo);\n }\n\n this.animateSwitching(\n photo,\n function () {\n this.updateTitle(photo.Name);\n if (this.floorplan) {\n this.floorplan.switchPoint(photo.Id, true);\n }\n if (typeof afterCall === \"function\") {\n afterCall();\n }\n }.bind(this)\n );\n\n this.store.currentPhotoIndex = this.findIndexByPhotoId(photo.Id);\n this.store.currentSceneId = photo.Id;\n //this.store.recentTargetId = target ? target.Id : null;\n\n this.showHotspots();\n }\n\n switchScene(photo, target, reverse) {\n var afterCall = null;\n\n if (this.viewer && this.viewer.scene()) {\n var lastScene = this.viewer.scene();\n afterCall = function () {\n var lastPhoto = this.project.map[lastScene.photoId];\n lastPhoto.scene = null;\n this.viewer.destroyScene(lastScene);\n }.bind(this);\n }\n\n //this.prepareScene(photo, target);\n this.prepareScene(photo);\n this.updateTitle(photo.Name);\n\n if (\n this.store.recentTargetId &&\n target &&\n target.Id != this.store.recentTargetId\n ) {\n const exitPoint = this.project.points[target.TargetId];\n const exit = this.mapPoint(exitPoint);\n const position = { ...exit, pitch: 0 };\n\n let targetView;\n if (photo.StartScene) {\n targetView = this.mapPoint(photo.StartScene);\n } else {\n targetView = this.mapPoint(\n target,\n { reverse },\n { transitionDuration: 0 }\n );\n }\n targetView.pitch = 0;\n photo.scene.view().setParameters(targetView);\n\n this.viewer.lookTo(\n position,\n { transitionDuration: 500 },\n this.nextTick(() => {\n this.animateSwitching(photo, afterCall);\n })\n );\n } else {\n this.animateSwitching(photo);\n }\n\n this.store.currentPhotoIndex = this.findIndexByPhotoId(photo.Id);\n this.store.currentSceneId = photo.Id;\n this.store.recentTargetId = target ? target.Id : null;\n\n if (this.floorplan) {\n this.floorplan.switchPoint(photo.Id, true);\n }\n\n if (reverse) {\n this.showHotspots();\n }\n }\n\n findIndexByPhotoId(photoId) {\n var photoIndex = 0;\n this.project.Photos.forEach((photo, index) => {\n if (photo.Id === photoId) {\n photoIndex = index;\n }\n });\n return photoIndex;\n }\n\n switchSceneAlternative(photo, target, reverse) {\n var afterCall = null;\n\n if (this.viewer && this.viewer.scene()) {\n var lastScene = this.viewer.scene();\n afterCall = function () {\n var lastPhoto = this.project.map[lastScene.photoId];\n lastPhoto.scene = null;\n this.viewer.destroyScene(lastScene);\n }.bind(this);\n }\n\n this.prepareScene(photo, target);\n this.updateTitle(photo.Name);\n\n this.animateSwitching(photo, null, true);\n\n this.store.currentPhotoIndex = this.findIndexByPhotoId(photo.Id);\n this.store.currentSceneId = photo.Id;\n this.store.recentTargetId = target ? target.Id : null;\n\n this.showHotspots();\n }\n\n animateSwitching(photo, done, autorotateMode) {\n this.switching = true;\n\n const hotspots = document.querySelectorAll(\".spot-center\");\n for (let i = 0; i < hotspots.length; i++) {\n Utils.addClass(hotspots[i], \" switching\");\n }\n\n photo.scene.switchTo(\n {\n transitionDuration: autorotateMode ? 1000 : 500,\n transitionUpdate: (val, newScene, oldScene) => {\n var newLayer = newScene.layer();\n var eased = Easing.easeInOutQuart(val);\n\n const opf = {\n Brightness: 1,\n Contrast: 1,\n Saturate: 1,\n };\n if (oldScene != null) {\n const oldScenePhoto = this.project.Photos.find(\n (p) => p.Id === oldScene.photoId\n );\n if (oldScenePhoto && oldScenePhoto.Filters) {\n Object.assign(opf, oldScenePhoto.Filters);\n }\n }\n\n const npf = {\n Brightness: 1,\n Contrast: 1,\n Saturate: 1,\n };\n if (newScene != null) {\n const newScenePhoto = this.project.Photos.find(\n (p) => p.Id === newScene.photoId\n );\n if (newScenePhoto && newScenePhoto.Filters) {\n Object.assign(npf, newScenePhoto.Filters);\n }\n }\n\n const nf = {\n Brightness:\n opf.Brightness +\n (opf.Brightness > npf.Brightness\n ? (opf.Brightness - npf.Brightness) * -1\n : npf.Brightness - opf.Brightness) *\n val,\n Contrast:\n opf.Contrast +\n (opf.Contrast > npf.Contrast\n ? (opf.Contrast - npf.Contrast) * -1\n : npf.Contrast - opf.Contrast) *\n val,\n Saturate:\n opf.Saturate +\n (opf.Saturate > npf.Saturate\n ? (opf.Saturate - npf.Saturate) * -1\n : npf.Saturate - opf.Saturate) *\n val,\n };\n var canvas = newScene.viewer().domElement().querySelector(\"canvas\");\n this.setCanvasEffects(canvas, nf);\n\n if (autorotateMode) {\n newLayer.mergeEffects({\n opacity: eased,\n });\n } else {\n newLayer.mergeEffects({\n rect: {\n relativeWidth: eased,\n relativeHeight: eased,\n relativeX: 0.5 - eased / 2,\n relativeY: 0.5 - eased / 2,\n },\n opacity: eased,\n });\n //if (oldScene != null) {\n // var oldLayer = oldScene.layer();\n // oldLayer.mergeEffects({\n // rect: {\n // relativeWidth: eased,\n // relativeHeight: eased,\n // relativeX: 0.5 - eased / 2,\n // relativeY: 0.5 - eased / 2\n // },\n // });\n //}\n }\n },\n },\n () => {\n this.switching = false;\n\n const hotspots = document.querySelectorAll(\".spot-center\");\n for (let i = 0; i < hotspots.length; i++) {\n Utils.removeClass(hotspots[i], \" switching\");\n }\n\n if (done) {\n done();\n }\n }\n );\n }\n\n nextTick(callback) {\n return function () {\n setTimeout(callback, 100);\n };\n }\n\n //unused\n updateViewFromExternalSource(data) {\n const destinationViewParameters = {\n yaw: data.yaw,\n pitch: data.pitch,\n fov: data.fov,\n };\n\n const options = {\n transitionDuration: 2000,\n };\n\n this.scene.lookTo(destinationViewParameters, options);\n }\n\n createHotspot(scene, point) {\n let hotspot = document.createElement(\"div\");\n this.hotspots.appendChild(hotspot);\n\n switch (point.Type) {\n case POINT_DOOR:\n hotspot.outerHTML =\n // this.config.PhotoPointStyle === 1 &&\n hotspotDoorOnGroundTemplate\n // Math.abs(point.Pitch) > 0.26\n // ? hotspotDoorOnGroundTemplate\n // : hotspotDoorTemplate;\n break;\n case POINT_INFO:\n hotspot.outerHTML = hotspotInfoTemplate;\n break;\n case POINT_LOGO:\n hotspot.outerHTML = hotspotLogoTemplate;\n break;\n }\n\n const hotspots = this.hotspots.getElementsByClassName(\"hotspot\");\n hotspot = hotspots[hotspots.length - 1];\n hotspot.setAttribute(\"id\", point.Id);\n\n switch (point.Type) {\n case POINT_DOOR:\n const target = this.project.points?.[point.TargetId];\n const photo = this.project.map[target?.PhotoId ?? point.TargetPhotoId];\n\n if (\n point?.PhotoPointStyle === 1\n ) {\n // 20 degrees = ~0.35 radians\n const rotationAngle = Math.round(\n 90 - (Math.abs(point.Pitch > 0.35 ? point.Pitch : 0.35) * 180) / Math.PI\n );\n\n hotspot.querySelector(\n \".spot-center\"\n ).style.transform = `rotateX(${rotationAngle}deg)`;\n\n Utils.registerEvent(\n hotspot,\n \"click\",\n function () {\n this.switchSceneByUser(photo, target, true);\n }.bind(this)\n );\n\n Utils.registerEvent(\n hotspot.querySelector(\".hotspot-door-ring\"),\n \"animationiteration\",\n function (e) {\n if (e.target.parentElement.matches(\":hover\")) {\n e.target.style.animationPlayState = \"paused\";\n }\n }.bind(this)\n );\n\n Utils.registerEvent(\n hotspot.querySelector(\".spot-center\"),\n \"pointerleave\",\n function (e) {\n const ring = e.target.querySelector(\".hotspot-door-ring\");\n if (ring.style.animationPlayState === \"paused\") {\n ring.style.animationPlayState = \"running\";\n }\n }.bind(this)\n );\n } else {\n hotspot.getElementsByClassName(\"label\")[0].textContent = photo.Name;\n\n Utils.registerEvent(\n hotspot.querySelector(\".spot-center\"),\n \"click\",\n function () {\n this.switchSceneByUser(photo, target, true);\n }.bind(this)\n );\n\n Utils.registerEvent(\n hotspot,\n \"mouseenter\",\n function () {\n Utils.addClass(\n hotspot.getElementsByClassName(\"label\")[0],\n \"full\"\n );\n }.bind(this)\n );\n\n Utils.registerEvent(\n hotspot,\n \"mouseleave\",\n function () {\n Utils.removeClass(\n hotspot.getElementsByClassName(\"label\")[0],\n \"full\"\n );\n }.bind(this)\n );\n }\n\n scene.hotspotContainer().createHotspot(hotspot, {\n yaw: point.Yaw,\n pitch: point.Pitch,\n });\n break;\n case POINT_INFO:\n const infoContent = hotspot.querySelector(\".info-content\");\n\n if (!!point.Info) {\n infoContent.textContent = point.Info;\n } else {\n infoContent.remove();\n }\n\n if (point.MediaType === \"image\" && point.PhotoInfoThumbnailUrl) {\n Utils.registerEvent(\n hotspot.getElementsByClassName(\"info-photo\")[0],\n \"click\",\n function (event) {\n event.preventDefault();\n this.showBigPicture(\n point.PhotoInfoUrl,\n point.VideoLink,\n point.Info,\n point.MediaType\n );\n }.bind(this)\n );\n\n //hotspot.getElementsByClassName(\"info-photo\")[0].href = point.PhotoInfoUrl;\n hotspot.getElementsByClassName(\"info-photo-thumb\")[0].src =\n point.PhotoInfoThumbnailUrl;\n } else {\n hotspot.getElementsByClassName(\"info-photo\")[0].remove();\n }\n\n const linkEl = hotspot.querySelector(\".info-link-a\");\n if (point.MediaType === \"link\" && !!point.Link) {\n linkEl.href = point.Link;\n // Parameter for walk preview in mobile app\n // Open links in the same tab\n if (Utils.getParameterValue(\"wv\", null) != null) {\n linkEl.target = \"_top\";\n linkEl.innerText = \"Otwórz link\";\n }\n } else {\n linkEl.remove();\n }\n\n if (point.MediaType === \"video\" && !!point.VideoLink) {\n Utils.registerEvent(\n hotspot.querySelector(\".info-video\"),\n \"click\",\n function (event) {\n event.preventDefault();\n this.showBigPicture(\n point.PhotoInfoUrl,\n point.VideoLink,\n point.Info,\n point.MediaType\n );\n }.bind(this)\n );\n\n this.getVideoThumbnail(point.VideoLink).then((src) => {\n hotspot.querySelector(\".info-video-thumb\").src = src;\n });\n } else {\n hotspot.querySelector(\".info-video\").remove();\n }\n\n const contentContainer = hotspot.querySelector(\".info-cloud\");\n if (contentContainer.children.length) {\n contentContainer.classList.remove(\"no-content\");\n } else {\n contentContainer.classList.add(\"no-content\");\n }\n\n scene.hotspotContainer().createHotspot(hotspot, {\n yaw: point.Yaw,\n pitch: point.Pitch,\n });\n\n break;\n case POINT_LOGO:\n this.logoHotspot = hotspot;\n\n var url = this.project.GroupLogoUrl;\n hotspot.getElementsByClassName(\"logo-image\")[0].src = url;\n\n point.Yaw = 0;\n point.Pitch = Math.PI * 0.5;\n\n scene.hotspotContainer().createHotspot(\n hotspot,\n {\n yaw: point.Yaw,\n pitch: point.Pitch,\n },\n {\n perspective: {\n radius: 512,\n },\n }\n );\n\n break;\n }\n }\n\n onClick() {\n //const first = this.getFirst();\n //this.switchScene(first, first.PhotoPoints[0]);\n this.intro.hide(\n function (intro) {\n if (this.floorplan) {\n this.floorplan.show();\n }\n }.bind(this)\n );\n this.showButtons();\n this.showHotspots();\n setTimeout(() => {\n document.querySelector(\".viewPhotoRoomList\").classList.remove(\"isOpen\");\n document.querySelector(\".photoname-button\").classList.remove(\"isOpen\");\n }, 500);\n //this.autorotateSetDelay(AUTOROTATE_CHANGE_SCENE_DELAY);\n }\n\n getFirst() {\n return this.project.Photos[0];\n }\n\n getPhoto(id) {\n return this.project.Photos.find((photo) => photo.Id === id);\n }\n\n getStartScene() {\n return this.project.StartScene;\n }\n\n showBigPicture(imageUrl, videoUrl, info, mediaType) {\n Bus.post(MEDIA_PREVIEW_OPENED);\n if (mediaType === \"video\") {\n Utils.removeClass(document.querySelector(\".video-container\"), \" hidden\");\n const type = this.getPlayerType(videoUrl);\n switch (type) {\n case \"youtube\": {\n const control = document.querySelector(\".youtube\");\n let link;\n const source = new URL(videoUrl);\n const videoId = source.searchParams.get(\"v\");\n if (videoId != null) {\n link = new URL(\"https://www.youtube.com/embed/\" + videoId);\n } else {\n link = source;\n }\n link.searchParams.append(\"enablejsapi\", 1);\n control.src = link.href;\n Utils.removeClass(control, \" hidden\");\n break;\n }\n case \"vimeo\": {\n const control = document.querySelector(\".vimeo\");\n let link;\n const source = new URL(videoUrl);\n if (\n source.pathname &&\n source.pathname.split(\"/\").filter((part) => part !== \"\").length ===\n 1\n ) {\n const videoId = source.pathname.substr(1);\n link = new URL(\"https://player.vimeo.com/video/\" + videoId);\n } else {\n link = source;\n }\n link.searchParams.append(\"title\", 0);\n link.searchParams.append(\"byline\", 0);\n link.searchParams.append(\"portrait\", 0);\n control.src = link.href;\n Utils.removeClass(control, \" hidden\");\n break;\n }\n case \"generic\": {\n const control = document.querySelector(\".generic\");\n Utils.removeClass(control, \" hidden\");\n control.src = videoUrl;\n break;\n }\n }\n } else if (mediaType === \"image\") {\n Utils.removeClass(document.querySelector(\".bigpic-img\"), \" hidden\");\n this.bigpic.getElementsByClassName(\"bigpic-img\")[0].src = imageUrl;\n }\n if (info != null) {\n this.bigpic.getElementsByClassName(\"bigpic-info\")[0].innerHTML = info;\n } else {\n this.bigpic.getElementsByClassName(\"bigpic-info\")[0].innerHTML = \"\";\n }\n\n Utils.removeClass(this.bigpic, \" hidden\");\n }\n\n hideBigPic() {\n Bus.post(MEDIA_PREVIEW_CLOSED);\n Utils.addClass(this.bigpic, \" hidden\");\n Utils.addClass(document.querySelector(\".video-container\"), \" hidden\");\n Utils.addClass(document.querySelector(\".bigpic-img\"), \" hidden\");\n {\n const control = document.querySelector(\".youtube\");\n control.contentWindow.postMessage(\n '{\"event\":\"command\",\"func\":\"' + \"stopVideo\" + '\",\"args\":\"\"}',\n \"*\"\n );\n control.src = \"about:blank\";\n Utils.addClass(control, \" hidden\");\n }\n {\n const control = document.querySelector(\".vimeo\");\n control.contentWindow.postMessage({ method: \"pause\" }, \"*\");\n control.src = \"about:blank\";\n Utils.addClass(control, \" hidden\");\n }\n {\n const control = document.querySelector(\".generic\");\n control.pause();\n control.src = null;\n Utils.addClass(control, \" hidden\");\n }\n }\n\n getPlayerType(url) {\n if (url.indexOf(\"youtu\") >= 0) return \"youtube\";\n if (url.indexOf(\"vimeo\") >= 0) return \"vimeo\";\n return \"generic\";\n }\n\n async getVideoThumbnail(url) {\n const videoType = this.getPlayerType(url);\n switch (videoType) {\n case \"youtube\":\n const regExp =\n /.*(?:youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=)([^#\\&\\?]*).*/;\n const match = url.match(regExp);\n return `https://img.youtube.com/vi/${match[1]}/0.jpg`;\n case \"vimeo\":\n const videoData = await fetch(\n `https://vimeo.com/api/oembed.json?url=${url}`\n );\n const thumbnailUrl = (await videoData.json()).thumbnail_url.split(\"_\");\n thumbnailUrl.splice(-1);\n return `${thumbnailUrl}_420`;\n default:\n return \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAEOCAIAAADe+FMwAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtaIVB4uIOGSoThakijhKFYtgobQVWnUwufRDaNKQpLg4Cq4FBz8Wqw4uzro6uAqC4AeIo5OToouU+L+k0CLGg+N+vLv3uHsHCPUyU82OCUDVLCMVj4nZ3IoYeEUXBtGLAKISM/VEeiEDz/F1Dx9f7yI8y/vcn6NPyZsM8InEs0w3LOJ14ulNS+e8TxxiJUkhPiceN+iCxI9cl11+41x0WOCZISOTmiMOEYvFNpbbmJUMlXiKOKyoGuULWZcVzluc1XKVNe/JXxjMa8tprtMcQRyLSCAJETKq2EAZFiK0aqSYSNF+zMM/7PiT5JLJtQFGjnlUoEJy/OB/8LtbszAZdZOCMaDzxbY/RoHALtCo2fb3sW03TgD/M3CltfyVOjDzSXqtpYWPgP5t4OK6pcl7wOUOMPSkS4bkSH6aQqEAvJ/RN+WAgVugZ9XtrbmP0wcgQ10t3QAHh8BYkbLXPN7d3d7bv2ea/f0AfwxyrPgI/pUAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmBhYMCAbeW3mFAAAC6UlEQVR42u3UMREAAAjEMMD028cFx5BI6NBOUgD8MxIAGDQABg1g0AAYNIBBA2DQABg0gEEDYNAABg2AQQNg0AAGDYBBAxg0AAYNYNAAGDQABg1g0AAYNIBBA2DQABg0gEEDYNAABg2AQQMYNAAGDYBBAxg0AAYNYNAAGDQABg1g0AAYNIBBA2DQAAYNgEEDYNAABg2AQQMYNAAGDYBBAxg0AAYNYNAAGDQABg1g0AAYNIBBA2DQAAYNgEEDYNAABg2AQQMYNAAGDYBBAxg0AAYNYNAAGDSAQQNg0AAYNIBBA2DQAAYNgEEDYNAABg2AQQMYNAAGDWDQABg0AAYNYNAAGDSAQQNg0AAYNIBBA2DQAAYNgEEDYNAABg2AQQMYNAAGDWDQABg0AAYNYNAAGDSAQQNg0AAYNIBBA2DQAAYNgEEDGDQABg2AQQMYNAAGDWDQABg0AAYNYNAAGDSAQQNg0AAGDYBBA2DQAAYNgEEDGDQABg2AQQMYNAAGDWDQABg0AAYNYNAAGDSAQQNg0AAGDYBBA2DQAAYNgEEDGDQABg2AQQMYNAAGDWDQABg0gEEDYNAAGDSAQQNg0AAGDYBBA2DQAAYNgEEDGDQABg1g0AAYNAAGDWDQABg0gEEDYNAAGDSAQQNg0AAGDYBBA2DQAAYNgEEDGDQABg1g0AAYNAAGDWDQABg0gEEDYNAAGDSAQQNg0AAGDYBBAxg0AAYNgEEDGDQABg1g0AAYNAAGDWDQABg0gEEDYNAABg2AQQNg0AAGDYBBAxg0AAYNgEEDGDQABg1g0AAYNAAGDWDQABg0gEEDYNAABg2AQQNg0AAGDYBBAxg0AAYNgEEDGDQABg1g0AAYNIBBA2DQABg0gEEDYNAABg2AQQNg0AAGDYBBAxg0AAYNYNAAGDQABg1g0AAYNIBBA2DQABg0gEEDYNAABg2AQQMYtAQABg2AQQMYNAAGDWDQABg0AAYNYNAAGDSAQQNwbQEdDQOBgCfUuAAAAABJRU5ErkJggg==\";\n }\n }\n\n // WALK NAVIGATOR\n setupNavigator() {\n if (!this.config.UserId) return;\n\n const navigatorBtn = document.querySelector(\".photoname-button\");\n const navigator = document.querySelector(\".viewPhotoRoomList\");\n\n navigatorBtn.classList.remove(\"disabled\");\n navigatorBtn.addEventListener(\"click\", () => {\n navigatorBtn.classList.toggle(\"isOpen\");\n });\n\n this.config?.Photos?.forEach(async (photo) => {\n const sceneThumbnail = document.createElement(\"button\");\n sceneThumbnail.classList.add(\"viewPhotoRoomListItem\");\n sceneThumbnail.addEventListener(\"click\", () => {\n this.switchSceneByUser(photo, null, true);\n });\n\n const photoLabel = document.createElement(\"small\");\n photoLabel.classList.add(\"viewPhotoRoomListItem__label\");\n photoLabel.innerText = photo.Name;\n sceneThumbnail.appendChild(photoLabel);\n\n const photoEl = document.createElement(\"img\");\n const thumbnail = await this.getPhotoThumbail(photo.Id);\n const url = thumbnail; // ?? photo.ImageUrl;\n photoEl.setAttribute(\"src\", url);\n sceneThumbnail.appendChild(photoEl);\n\n navigator.appendChild(sceneThumbnail);\n });\n\n navigatorBtn.addEventListener(\"click\", () => {\n navigator.classList.toggle(\"isOpen\");\n });\n }\n\n async getPhotoThumbail(photoId) {\n try {\n const res = await fetch(\n `${window.apiUrl}/api/folder/${this.projectId}/thumbnail/${photoId}/fetch?userId=${this.config.UserId}`\n );\n if (!res.ok) throw new Error(res.status);\n const blob = await res.blob();\n const url = URL.createObjectURL(blob);\n\n return url;\n } catch (error) {\n console.log(\"ERROR\", error);\n return null;\n }\n }\n}\n","import Marzipano from 'marzipano';\n\nexport default class Controls {\n\n constructor(viewer) {\n // DOM elements for view controls.\n const viewUpElement = document.querySelector('#viewUp');\n const viewDownElement = document.querySelector('#viewDown');\n const viewLeftElement = document.querySelector('#viewLeft');\n const viewRightElement = document.querySelector('#viewRight');\n const viewInElement = document.querySelector('#viewIn');\n const viewOutElement = document.querySelector('#viewOut');\n\n // Dynamic parameters for controls.\n const velocity = 0.7;\n const friction = 3;\n\n // Associate view controls with elements.\n const controls = viewer.controls();\n controls.registerMethod('upElement', new Marzipano.ElementPressControlMethod(viewUpElement, 'y', -velocity, friction), true);\n controls.registerMethod('downElement', new Marzipano.ElementPressControlMethod(viewDownElement, 'y', velocity, friction), true);\n controls.registerMethod('leftElement', new Marzipano.ElementPressControlMethod(viewLeftElement, 'x', -velocity, friction), true);\n controls.registerMethod('rightElement', new Marzipano.ElementPressControlMethod(viewRightElement, 'x', velocity, friction), true);\n controls.registerMethod('inElement', new Marzipano.ElementPressControlMethod(viewInElement, 'zoom', -velocity, friction), true);\n controls.registerMethod('outElement', new Marzipano.ElementPressControlMethod(viewOutElement, 'zoom', velocity, friction), true);\n }\n}\n","import Utils from \"./utils\";\nclass Fullscreen {\n constructor(selector) {\n this.button = document.querySelector(selector);\n Utils.registerEvent(this.button, \"click\", this.toggle.bind(this));\n this.container = document.documentElement;\n this.expandIcon = document.querySelector(\".icon-expand\");\n this.shrinkIcon = document.querySelector(\".icon-shrink\");\n }\n\n toggle() {\n if (this.isEnabled()) {\n this.disable();\n } else {\n this.enable(this.container);\n }\n }\n enable(element) {\n this.expandIcon.classList.add(\"hidden\");\n this.shrinkIcon.classList.remove(\"hidden\");\n if (element.requestFullscreen) element.requestFullscreen();\n else if (element.mozRequestFullScreen) element.mozRequestFullScreen();\n else if (element.webkitRequestFullscreen) element.webkitRequestFullscreen();\n else if (element.msRequestFullscreen) element.msRequestFullscreen();\n }\n disable() {\n this.shrinkIcon.classList.add(\"hidden\");\n this.expandIcon.classList.remove(\"hidden\");\n if (document.exitFullscreen) document.exitFullscreen();\n else if (document.mozCancelFullScreen) document.mozCancelFullScreen();\n else if (document.webkitExitFullscreen) document.webkitExitFullscreen();\n else if (document.msExitFullscreen) document.msExitFullscreen();\n }\n\n getCurrent() {\n return (\n document.fullscreenElement ||\n document.webkitFullscreenElement ||\n document.mozFullScreenElement ||\n document.msFullscreenElement ||\n null\n );\n }\n\n isEnabled() {\n var full_screen_element = this.getCurrent();\n\n // If no element is in full-screen\n return full_screen_element !== null;\n }\n\n register(callback) {\n document.addEventListener(\n \"fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange\",\n callback\n );\n }\n}\nexport default Fullscreen;\n","import Utils from \"./utils\";\nimport lobbyTemplate from \"../pages/presentationLobby.html\";\nimport { createLocalTracks } from \"twilio-video\";\nimport dayjs from \"dayjs\";\nimport i18n from \"../config/i18n\";\nimport camOn from \"../images/camOn.html\";\nimport camOff from \"../images/camOff.html\";\nimport micOn from \"../images/micOn.html\";\nimport micOff from \"../images/micOff.html\";\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\nconst HOURS_IN_DAY = 24;\n\nclass PresentationLobby {\n constructor(container, onLobbyClose) {\n this.presentationId = Utils.getParameterValue(\"pid\", null);\n this.localTracks = null;\n this.canJoin = false;\n\n this.onLobbyClose = onLobbyClose;\n this.container = document.querySelector(container);\n this.container.outerHTML = lobbyTemplate;\n this.container = document.querySelector(container);\n\n this.joinButton = document.querySelector(\".btn-join-presentation\");\n\n this.joinToPresentationLobby();\n }\n\n onJoin() {\n this.hasSentRequestToJoin = true;\n this.joinButton.setAttribute(\"disabled\", \"true\");\n const buttonContainer = document.querySelector(\".join-presentation\");\n const loadingMessage = document.createElement(\"strong\");\n loadingMessage.style.marginTop = \"1em\";\n loadingMessage.innerText = i18n.t(\"txtWaitingForAccept\");\n buttonContainer.appendChild(loadingMessage);\n\n if (typeof this.onLobbyClose === \"function\")\n this.onLobbyClose(this.lobbyData);\n else this.closeLobby();\n }\n\n closeLobby() {\n this.container.setAttribute(\"data-disabled\", \"true\");\n clearInterval(this.timeInterval);\n setTimeout(() => {\n this.container.remove();\n }, 1000);\n }\n\n async showLobby() {\n const { hasVideoInputDevices, hasAudioInputDevices } =\n await this.getDeviceInfo();\n\n navigator.mediaDevices\n .getUserMedia({\n audio: hasAudioInputDevices,\n video: hasVideoInputDevices,\n })\n .then((stream) => {\n this.fillDeviceInputs();\n })\n .catch((e) => {\n console.dir(e);\n document.querySelector(\".select-devices\").remove();\n createLocalTracks({\n audio: false,\n video: false,\n }).then((localTracks) => {\n this.localTracks = localTracks;\n });\n })\n .finally(() => {\n this.fillPresentationData();\n this.container.removeAttribute(\"data-disabled\");\n });\n }\n\n showError({ message }) {\n const modalContainer = document.querySelector(\".lobby-modal\");\n\n const messageEl = document.createElement(\"strong\");\n messageEl.classList.add(\"error-msg\");\n messageEl.innerText = i18n.t(message);\n\n modalContainer.replaceChildren(messageEl);\n this.container.removeAttribute(\"data-disabled\");\n }\n\n fillPresentationData() {\n const welcomeHeading = document.querySelector(\".welcome-heading\");\n if (this.lobbyData.clientDto.name)\n welcomeHeading.innerText = `${i18n.t(\"txtWelcome\")} ${\n this.lobbyData.clientDto.name\n }`;\n else {\n this.showAuthForm();\n }\n\n const remainingTime = document.querySelector(\".remaining-time\");\n\n this.timeInterval = setInterval(() => {\n const time = this.getRemainingTime(this.lobbyData.date);\n remainingTime.innerText = time;\n }, 1000);\n }\n\n showAuthForm() {\n const userForm = document.querySelector(\".user-data-form\");\n userForm.style.display = \"block\";\n const clientNameInput = document.querySelector(\"#client-name\");\n clientNameInput.placeholder = i18n.t(clientNameInput.placeholder);\n\n clientNameInput.addEventListener(\"change\", (e) => {\n this.lobbyData = {\n ...this.lobbyData,\n clientDto: {\n name: e.target.value,\n phone: \"000000000\",\n },\n };\n });\n }\n\n async joinToPresentationLobby() {\n const hideLoader = Utils.showLoader();\n\n try {\n const res = await fetch(\n `${window.hubsUrl}/client/presentation/${this.presentationId}/join-presentation-lobby`,\n {\n method: \"PATCH\",\n }\n );\n const data = await res.json();\n\n if (!res.ok) throw new Error(data?.title);\n\n this.lobbyData = data;\n hideLoader();\n this.showLobby();\n } catch (e) {\n hideLoader();\n this.showError(e);\n }\n }\n\n async isPermissionDenied(permissionName) {\n if (navigator.permissions) {\n try {\n const result = await navigator.permissions.query({\n name: permissionName,\n });\n return result.state === \"denied\" || result.state === \"prompt\";\n } catch {\n return false;\n }\n } else {\n return false;\n }\n }\n\n async getDeviceInfo() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n\n const audioInputDevices = devices.filter(\n (device) => device.kind === \"audioinput\"\n );\n const videoInputDevices = devices.filter(\n (device) => device.kind === \"videoinput\"\n );\n const audioOutputDevices = devices.filter(\n (device) => device.kind === \"audiooutput\"\n );\n const hasAudioInputDevices = devices.some(\n (device) => device.kind === \"audioinput\"\n );\n const hasVideoInputDevices = devices.some(\n (device) => device.kind === \"videoinput\"\n );\n\n return {\n audioInputDevices,\n videoInputDevices,\n audioOutputDevices,\n hasAudioInputDevices,\n hasVideoInputDevices,\n };\n }\n\n async fillDeviceInputs() {\n const selectContainer = document.querySelector(\".device-inputs\");\n const {\n audioInputDevices,\n videoInputDevices,\n hasVideoInputDevices,\n hasAudioInputDevices,\n } = await this.getDeviceInfo();\n\n if (!hasVideoInputDevices && !hasAudioInputDevices) {\n document.querySelector(\".select-devices\").remove();\n return;\n }\n\n if (hasVideoInputDevices) {\n const camSelect = this.createSelectElement(\n videoInputDevices,\n async (deviceId) => {\n this.selectedVideo = deviceId;\n await this.setLocalTracks({ video: deviceId });\n },\n \"camera\"\n );\n\n selectContainer.appendChild(camSelect);\n }\n\n if (hasAudioInputDevices) {\n const micSelect = this.createSelectElement(\n audioInputDevices,\n async (deviceId) => {\n this.selectedAudio = deviceId;\n await this.setLocalTracks({ audio: deviceId });\n },\n \"microphone\"\n );\n selectContainer.appendChild(micSelect);\n }\n }\n\n createSelectElement(devices, onChange, type) {\n const selectContainer = document.createElement(\"div\");\n selectContainer.classList.add(\"select-container\");\n\n const iconContainer = document.createElement(\"div\");\n iconContainer.classList.add(\"select-icon-container\");\n const selectIcon = document.createElement(\"i\");\n selectIcon.classList.add(\"fa\", `fa-${type}`);\n iconContainer.appendChild(selectIcon);\n selectContainer.appendChild(iconContainer);\n\n onChange(devices[0].deviceId);\n const select = document.createElement(\"select\");\n select.classList.add(\"select\");\n devices.forEach((device) => {\n const option = document.createElement(\"option\");\n option.value = device.deviceId;\n option.innerHTML = device.label;\n select.appendChild(option);\n });\n select.addEventListener(\"change\", (e) => {\n onChange(e.target.value);\n });\n selectContainer.appendChild(select);\n this.createActionButton(type);\n\n return selectContainer;\n }\n\n createActionButton(type) {\n const container = document.querySelector(\".room-actions\");\n const icon = type === \"microphone\" ? micOn : camOn;\n const className = type === \"microphone\" ? \"mute-button\" : \"cam-button\";\n const trackKind = type === \"microphone\" ? \"audio\" : \"video\";\n\n const buttonEl = document.createElement(\"button\");\n buttonEl.classList.add(\"action-button\", className);\n buttonEl.innerHTML = icon;\n buttonEl.addEventListener(\n \"click\",\n this.toggleLocalTrack.bind(this, trackKind)\n );\n\n container.appendChild(buttonEl);\n }\n\n toggleLocalTrack(kind) {\n const track = this.getTracks().find((track) => track.kind === kind);\n if (!track) return;\n\n if (track.isEnabled) track.disable();\n else track.enable();\n\n switch (kind) {\n case \"audio\":\n document.querySelector(\".mute-button\").innerHTML = track.isEnabled\n ? micOn\n : micOff;\n break;\n case \"video\":\n document.querySelector(\".cam-button\").innerHTML = track.isEnabled\n ? camOn\n : camOff;\n this.displayCamPreview();\n break;\n default:\n break;\n }\n }\n\n async setLocalTracks({ audio, video }) {\n const localTracks = await createLocalTracks({\n audio:\n audio !== undefined\n ? audio\n : this.selectedAudio\n ? { deviceId: this.selectedAudio }\n : false,\n video:\n video !== undefined\n ? video\n : this.selectedVideo\n ? { deviceId: this.selectedVideo }\n : false,\n });\n this.localTracks = localTracks;\n this.displayCamPreview();\n }\n\n getTracks() {\n return this.localTracks;\n }\n\n displayCamPreview() {\n if (!this.localTracks) return;\n const container = document.querySelector(\".video-container\");\n const videoTrack = this.localTracks.find((track) => track.kind === \"video\");\n if (videoTrack?.isEnabled) container.replaceChildren(videoTrack.attach());\n else {\n const placeholder = document.createElement(\"div\");\n placeholder.classList.add(\"video-placeholder\");\n placeholder.innerText = i18n.t(\"txtCameraDisabled\");\n container.replaceChildren(placeholder);\n }\n }\n\n getRemainingTime(date) {\n const parsedDate = dayjs(date);\n const now = dayjs();\n\n const durationInSeconds = parsedDate.diff(now, \"s\");\n\n const d = Math.floor(durationInSeconds / SECONDS_IN_DAY);\n const h = Math.floor((durationInSeconds / SECONDS_IN_HOUR) % HOURS_IN_DAY);\n const m = Math.floor(\n ((durationInSeconds - h * SECONDS_IN_HOUR) / SECONDS_IN_MINUTE) %\n SECONDS_IN_MINUTE\n );\n const s = durationInSeconds % SECONDS_IN_MINUTE;\n const difference = [d, h, m, s].map((x) =>\n x > 0 && durationInSeconds > 0\n ? x.toLocaleString(\"pl-PL\", {\n minimumIntegerDigits: 2,\n useGrouping: false,\n })\n : \"00\"\n );\n\n if (!this.canJoin && this.lobbyData.clientDto.name) {\n this.canJoin = true;\n this.joinButton.removeAttribute(\"disabled\");\n this.joinButton.addEventListener(\"click\", this.onJoin.bind(this));\n }\n\n return difference.join(\":\");\n }\n}\n\nexport default PresentationLobby;\n","import micOff from \"../../images/micOff.html\";\nimport micOn from \"../../images/micOn.html\";\nimport camOff from \"../../images/camOff.html\";\nimport camOn from \"../../images/camOn.html\";\n\nexport const trackIndicators = {\n audio: {\n className: \"muted-indicator\",\n disabled: micOff,\n enabled: micOn,\n },\n video: {\n className: \"nocam-indicator\",\n disabled: camOff,\n enabled: camOn,\n },\n};\n","export const throttle = (cb, delay = 1000) => {\n let shouldWait = false;\n let waitingArgs;\n const timeoutFunc = () => {\n if (waitingArgs == null) {\n shouldWait = false;\n } else {\n cb(...waitingArgs);\n waitingArgs = null;\n setTimeout(timeoutFunc, delay);\n }\n };\n\n return (...args) => {\n if (shouldWait) {\n waitingArgs = args;\n return;\n }\n\n cb(...args);\n shouldWait = true;\n setTimeout(timeoutFunc, delay);\n };\n};\n","import participantsTemplate from \"../pages/presentationParticipants.html\";\nimport { connect } from \"twilio-video\";\nimport micOff from \"../images/micOff.html\";\nimport micOn from \"../images/micOn.html\";\nimport camOff from \"../images/camOff.html\";\nimport camOn from \"../images/camOn.html\";\nimport { trackIndicators } from \"./utils/trackIndicators\";\nimport { Bus } from \"./simple-bus\";\nimport { SCENE_CHANGED, VIEW_CHANGED } from \"./events\";\nimport { throttle } from \"./utils/throttle\";\nimport utils from \"./utils\";\nimport i18n from \"../config/i18n\";\n\nconst THROTTLE_DELAY = 1000;\n\nclass VirtualPresentation {\n constructor(data, tracks, connection, roomId, container) {\n this.presentationId = utils.getParameterValue(\"pid\", null);\n this.roomData = data;\n this.tracks = tracks;\n this.connection = connection;\n this.roomId = roomId;\n\n this.hasControl = false;\n this.isMicMuted =\n tracks?.length > 0\n ? !tracks.find((track) => track.kind === \"audio\").isEnabled\n : true;\n this.isCamDisabled =\n tracks?.length > 0 && tracks.find((track) => track.kind === \"video\")\n ? !tracks.find((track) => track.kind === \"video\").isEnabled\n : true;\n\n this.container = document.querySelector(container);\n this.container.outerHTML = participantsTemplate;\n this.container = document.querySelector(container);\n\n this.joinRoom(data);\n }\n\n async joinRoom({ roomName, token }) {\n const config = {\n room: roomName,\n name: roomName,\n ...(this.tracks && {\n maxAudioBitrate: 16000,\n tracks: this.tracks,\n video: {\n height: 480,\n width: 640,\n frameRate: 24,\n },\n }),\n };\n\n const hideLoader = utils.showLoader();\n\n try {\n const room = await connect(token, config);\n\n // styling\n const viewport = document.querySelector(\".viewport\");\n const scenePickerButton = document.querySelector(\".photoname-button\");\n document.querySelector(\".logo\").style.display = \"none\";\n viewport.setAttribute(\"disabled\", \"true\");\n scenePickerButton.setAttribute(\"disabled\", \"disabled\");\n\n this.handleConnectedParticipant(room.localParticipant);\n room.participants.forEach(this.handleConnectedParticipant, this);\n room.on(\n \"participantConnected\",\n this.handleConnectedParticipant.bind(this)\n );\n\n // handle cleanup when a participant disconnects\n room.on(\"participantDisconnected\", this.handleDisconnectedParticipant);\n window.addEventListener(\"pagehide\", () => room.disconnect());\n window.addEventListener(\"beforeunload\", () => room.disconnect());\n\n this.room = room;\n\n const muteButton = document.querySelector(\".mute-button\");\n if (this.tracks.find((track) => track.kind === \"audio\")) {\n muteButton.addEventListener(\"click\", this.toggleMute.bind(this));\n muteButton.removeAttribute(\"disabled\");\n }\n if (this.isMicMuted) muteButton.innerHTML = micOff;\n\n const camButton = document.querySelector(\".cam-button\");\n if (this.tracks.find((track) => track.kind === \"video\")) {\n camButton.addEventListener(\"click\", this.toggleCam.bind(this));\n camButton.removeAttribute(\"disabled\");\n }\n if (this.isCamDisabled) camButton.innerHTML = camOff;\n\n document\n .querySelector(\".leave-button\")\n .addEventListener(\"click\", this.endCall.bind(this));\n\n this.container.removeAttribute(\"data-disabled\");\n this.handleEvents();\n hideLoader();\n } catch (error) {\n hideLoader();\n this.showError(error);\n console.dir(error);\n }\n }\n\n handleConnectedParticipant(participant) {\n this.toggleControl(false);\n const container = document.querySelector(\".video-container\");\n // create a div for this participant's tracks\n const participantDiv = document.createElement(\"div\");\n participantDiv.setAttribute(\"id\", participant.identity);\n\n const indicatorContainer = document.createElement(\"div\");\n indicatorContainer.classList.add(\"indicator-container\");\n\n participantDiv.append(indicatorContainer);\n container.appendChild(participantDiv);\n\n // iterate through the participant's published tracks and\n // call `handleTrackPublication` on them\n participant.tracks.forEach((trackPublication) => {\n this.handleTrackPublication(trackPublication, participant);\n }, this);\n\n // listen for any new track publications\n participant.on(\"trackPublished\", (trackPublication) =>\n this.handleTrackPublication.bind(this, trackPublication, participant)\n );\n }\n\n handleTrackPublication(trackPublication, participant) {\n function displayTrack(track) {\n // append this track to the participant's div and render it on the page\n const participantDiv = document.getElementById(participant.identity);\n\n // track.attach creates an HTMLVideoElement or HTMLAudioElement\n // (depending on the type of track) and adds the video or audio stream\n if (participantDiv) participantDiv.append(track?.attach());\n\n this.handleTrackState(participant, track);\n\n // Listen for track mute\n track.on(\n \"disabled\",\n this.handleTrackState.bind(this, participant, track)\n );\n track.on(\"enabled\", this.handleTrackState.bind(this, participant, track));\n }\n\n // check if the trackPublication contains a `track` attribute. If it does,\n // we are subscribed to this track. If not, we are not subscribed.\n if (trackPublication.track) {\n displayTrack.call(this, trackPublication.track);\n }\n\n // listen for any new subscriptions to this track publication\n trackPublication.on(\"subscribed\", displayTrack.bind(this));\n }\n\n handleDisconnectedParticipant(participant) {\n // stop listening for this participant\n participant.removeAllListeners();\n // remove this participant's div from the page\n const participantDiv = document.getElementById(participant.identity);\n participantDiv.remove();\n }\n\n toggleControl(value) {\n this.hasControl = value ?? !this.hasControl;\n const controlIndicator = document.querySelector(\".control-indicator\");\n const viewport = document.querySelector(\".viewport\");\n const scenePickerButton = document.querySelector(\".photoname-button\");\n\n if (this.hasControl) {\n controlIndicator.removeAttribute(\"data-disabled\");\n viewport.removeAttribute(\"disabled\");\n scenePickerButton.removeAttribute(\"disabled\");\n }\n if (!this.hasControl) {\n controlIndicator.setAttribute(\"data-disabled\", \"true\");\n viewport.setAttribute(\"disabled\", \"true\");\n scenePickerButton.setAttribute(\"disabled\", \"disabled\");\n }\n }\n\n toggleMute() {\n this.room.localParticipant.audioTracks.forEach(({ track }) => {\n if (this.isMicMuted) {\n track.enable();\n document.querySelector(\".mute-button\").innerHTML = micOn;\n }\n if (!this.isMicMuted) {\n track.disable();\n document.querySelector(\".mute-button\").innerHTML = micOff;\n }\n this.isMicMuted = !this.isMicMuted;\n }, this);\n }\n\n toggleCam() {\n this.room.localParticipant.videoTracks.forEach(({ track }) => {\n if (this.isCamDisabled) {\n track.enable();\n document.querySelector(\".cam-button\").innerHTML = camOn;\n }\n if (!this.isCamDisabled) {\n track.disable();\n document.querySelector(\".cam-button\").innerHTML = camOff;\n }\n this.isCamDisabled = !this.isCamDisabled;\n }, this);\n }\n\n endCall() {\n this.room.disconnect();\n this.container.remove();\n document.querySelector(\".logo\").style.display = \"block\";\n document.querySelector(\".viewport\").removeAttribute(\"disabled\");\n document.querySelector(\".photoname-button\").removeAttribute(\"disabled\");\n\n this.connection.off(\"ViewChanged\");\n this.connection.off(\"SceneChanged\");\n this.connection.off(\"ControlRevoked\");\n this.connection.off(\"ControlGained\");\n this.connection.off(\"PresentationFinished\");\n\n this.tracks.forEach((track) => track.stop());\n }\n\n handleTrackState(participant, track) {\n const participantDiv = document.getElementById(participant.identity);\n if (!participantDiv) return;\n\n const indicator = trackIndicators[track.kind];\n if (track.isEnabled) {\n this.removeDisabledTrackIndicator(participantDiv, indicator);\n } else {\n this.createDisabledTrackIndicator(participantDiv, indicator);\n }\n if (track.kind === \"video\")\n this.swapVideoThumbnail(\n participantDiv,\n participant.identity.substr(0, 1),\n !track.isEnabled\n );\n }\n\n swapVideoThumbnail(participantDiv, participantId, isDisabled) {\n const videoEl = participantDiv.querySelector(\"video\");\n const placeholderEl = participantDiv.querySelector(\".webcam-placeholder\");\n if (isDisabled) {\n videoEl.style.display = \"none\";\n\n if (placeholderEl) placeholderEl.style.display = \"grid\";\n else {\n const placeholder = document.createElement(\"div\");\n placeholder.classList.add(\"webcam-placeholder\");\n placeholder.innerText = participantId;\n participantDiv.appendChild(placeholder);\n }\n } else {\n videoEl.style.display = \"block\";\n if (placeholderEl) placeholderEl.style.display = \"none\";\n }\n }\n\n createDisabledTrackIndicator(participantDiv, indicator) {\n const container = participantDiv.querySelector(\".indicator-container\");\n const disabledIndicator = document.createElement(\"div\");\n disabledIndicator.classList.add(\"disabled-indicator\", indicator.className);\n disabledIndicator.innerHTML = indicator.disabled;\n\n container.appendChild(disabledIndicator);\n }\n\n removeDisabledTrackIndicator(participantDiv, indicator) {\n const disabledIndicator = participantDiv.querySelector(\n `.${indicator.className}`\n );\n\n if (disabledIndicator) disabledIndicator.remove();\n }\n\n handleEvents() {\n Bus.subscribe(VIEW_CHANGED, this.changeView());\n Bus.subscribe(SCENE_CHANGED, this.changeScene());\n }\n\n changeView() {\n return throttle((data) => {\n if (!this.hasControl) return;\n\n this.connection\n .invoke(\"ChangeView\", {\n roomId: this.roomId,\n presentaionId: this.presentationId,\n ...data,\n })\n .catch((e) => {\n console.dir(e);\n });\n }, THROTTLE_DELAY);\n }\n\n changeScene() {\n return throttle((data) => {\n if (!this.hasControl) return;\n this.connection\n .invoke(\"ChangeScene\", {\n roomId: this.roomId,\n presentaionId: this.presentationId,\n sceneId: data.photoId,\n })\n .catch((e) => {\n console.dir(e);\n });\n }, THROTTLE_DELAY);\n }\n\n showError({ message }) {\n const backdrop = document.createElement(\"div\");\n backdrop.classList.add(\"backdrop\");\n\n const messageContainer = document.createElement(\"div\");\n messageContainer.classList.add(\"lobby-modal\");\n messageContainer.style.flexDirection = \"column\";\n messageContainer.style.gap = \"1em\";\n\n const messageEl = document.createElement(\"h3\");\n messageEl.innerText = message;\n messageContainer.appendChild(messageEl);\n\n const refreshButton = document.createElement(\"button\");\n refreshButton.classList.add(\"btn-primary\");\n refreshButton.innerText = i18n.t(\"txtRefreshPage\");\n refreshButton.addEventListener(\n \"click\",\n window.location.reload.bind(window.location)\n );\n messageContainer.appendChild(refreshButton);\n\n document.body.appendChild(backdrop);\n document.body.appendChild(messageContainer);\n }\n}\n\nexport default VirtualPresentation;\n","//Watcher\nimport chatTemplate from \"App/pages/chat-widget.html\";\nimport leadPageTemplate from \"App/pages/leadPage.html\";\nimport Utils from \"App/js/utils.js\";\nimport Fullscreen from \"./fullscreen\";\nimport PokeWindow from \"./poke\";\nimport { HubConnectionBuilder } from \"@microsoft/signalr\";\nimport * as dayjs from \"dayjs\";\nimport * as EmojiMart from \"emoji-mart\";\nimport pl from \"@emoji-mart/data/i18n/pl.json\";\nimport en from \"@emoji-mart/data/i18n/en.json\";\nimport {\n Bus,\n CONNECTED,\n CONNECTION_FAILURE,\n END_CALL,\n ERROR,\n GOT_REMOTE_STREAM,\n INVOKE,\n NEW_MESSAGE,\n} from \"./simple-bus\";\nimport { SCENE_CHANGED } from \"App/js/events.js\";\nimport LiveChat from \"./rtc/live-chat\";\nimport i18n from \"../config/i18n\";\nimport { CHAT_STARTED } from \"./events\";\nimport utils from \"./utils\";\nimport PresentationLobby from \"./presentationLobby\";\nimport VirtualPresentation from \"./virtualPresentation\";\n\nconst nameMaxLength = 100;\nconst msgMaxLength = 300;\nconst minChatHeight = \"42px\";\nconst leadPageConfig = {\n showAfterIdleTime: 45000,\n showAfterBusyTime: 2000,\n};\nconst linkRegex =\n /(http(s)?:\\/\\/.)?(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/g;\n\nconst FIVE_MINUTES = 5 * 60 * 1000;\n\nclass Chat {\n constructor(selector, project, folderId, store, from, config) {\n this.minimalMode = config.mls;\n // this.noChat = config.nc || !this.hasFeature(folderId);\n this.noChat = config.nc;\n this.noLead = config.nl;\n //console.log({\n // project,\n // projectId\n //})\n\n this.project = project;\n const projectSplit = project.split(\"-\");\n this.projectId = Number(projectSplit[projectSplit.length - 1]);\n this.presentationId = Utils.getParameterValue(\"pid\", null);\n this.from = from;\n this.roomId = null;\n this.unreadMessageCount = 0;\n this.creationLanguage = utils.getProjectCreationLanguage();\n this.folderId = folderId;\n this.deviceId = localStorage.getItem(\"sb.deviceId\");\n this.getAgentAvailability().then((isAgentAvailable) => {\n if (\n !isAgentAvailable &&\n config?.HasVirtualGuide &&\n config.VirtualGuideMessages.Photos.length >= 3\n ) {\n this.container.querySelector(\"#contact-form\").style.display = \"none\";\n }\n });\n\n this.lastMessageDate = null;\n this.delayBetweenMessages = 3; // in seconds\n this.isChatStarted = false;\n this.timeToRemoveNewMessage = null;\n this.userStartedConversation = false;\n\n if (!this.minimalMode) {\n this.folderId = folderId;\n\n this.container = document.querySelector(selector);\n this.container.outerHTML = chatTemplate;\n this.container = document.querySelector(selector);\n\n Utils.translateAttributes(this.container);\n\n this.hideAlertsBtn = document.querySelector(\"#btn-hide-chat-notifications\");\n this.alerts = true\n this.updateIcon();\n Utils.registerEvent(this.hideAlertsBtn,\"click\", (e) => {\n e.stopPropagation();\n this.alerts = !this.alerts;\n this.updateIcon();\n })\n\n if (!this.noChat || this.presentationId) {\n if (this.presentationId) {\n this.presentationLobby = new PresentationLobby(\n \".presentation-lobby\",\n this.onLobbyClose.bind(this)\n );\n }\n // this.message = this.container.querySelector(\".currentMessage\");\n // this.message.addEventListener(\"keypress\", this.onMessageKeyPressed.bind(this));\n // const sender = this.container.querySelector(\".send\");\n // sender.addEventListener(\"click\", this.onMessageClicked.bind(this));\n\n // Chat icon and minimize button events\n this.chatContainer = this.container.querySelector(\n \".chat2__chat-container\"\n );\n\n if (config?.ownerAvatar) {\n const avatar = this.container.querySelector(\".chat-btn__avatar\");\n avatar.src = config.ownerAvatar;\n Utils.removeClass(avatar, \"hidden\");\n const icon = this.container.querySelector(\".chat-btn__icon\");\n Utils.addClass(icon, \"hidden\");\n }\n\n const chatBtn = this.container.querySelector(\".chat2__btn\");\n chatBtn.addEventListener(\"click\", () => {\n if (\n Utils.checkClass(\n this.chatContainer,\n \"chat2__chat-container--hidden\"\n )\n ) {\n Utils.removeClass(\n this.chatContainer,\n \"chat2__chat-container--hidden\"\n );\n this.unreadMessageCount = 0;\n Utils.addClass(this.unreadMessageCounter, \"hidden\");\n this.newMessageList.textContent = \"\";\n } else {\n Utils.addClass(this.chatContainer, \"chat2__chat-container--hidden\");\n }\n });\n const minimizeButton = this.container.querySelector(\"#minimize-chat\");\n minimizeButton.addEventListener(\"click\", () => {\n Utils.addClass(this.chatContainer, \"chat2__chat-container--hidden\");\n });\n\n // Start chat button event\n const contactForm = this.container.querySelector(\"#contact-form\");\n const contactFormFields = this.container.querySelector(\n \"#contact-form-fields\"\n );\n contactForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (Utils.checkClass(contactFormFields, \"hidden\")) {\n Utils.removeClass(contactFormFields, \"hidden\");\n contactForm.removeAttribute(\"novalidate\");\n } else {\n this.startChat(e);\n }\n });\n\n // User data and message forms\n this.userDataForm = this.container.querySelector(\"#contact-form\");\n this.messageForm = this.container.querySelector(\"#message-form\");\n this.messageForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n this.sendMessage.call(this);\n if (!this.userStartedConversation) {\n this.userStartedConversation = true;\n this.getAgentAvailability().then((isAgentAvailable) => {\n if (!isAgentAvailable) {\n setTimeout(() => {\n this.addMessage({\n message: i18n.t(\n \"txtVirtualGuideStartConversationWithUnavailableAgent\",\n {\n lng: utils.getProjectCreationLanguage(),\n }\n ),\n roomId: this.roomId,\n sendByClient: false,\n sent: new Date().toISOString(),\n userName: this.config?.UserName,\n });\n }, 1000);\n this.sendNotificationToAgent(this.phoneNumber);\n }\n });\n }\n });\n // Custom validation messages\n [\"phone\", \"name\", \"rules\"].forEach((name) => {\n const node = this.userDataForm.elements[name];\n node.addEventListener(\"input\", () => {\n node.setCustomValidity(\"\");\n node.checkValidity();\n });\n\n node.addEventListener(\"invalid\", () => {\n if (\n node.value === \"\" ||\n (node.type === \"checkbox\" && !node.checked)\n ) {\n node.setCustomValidity(i18n.t(\"txtRequiredField\"));\n } else {\n node.setCustomValidity(i18n.t(\"txtInvalidValue\"));\n }\n });\n });\n\n const message = this.messageForm.elements[\"message\"];\n message.addEventListener(\"input\", () => {\n message.setCustomValidity(\"\");\n message.checkValidity();\n });\n message.addEventListener(\"invalid\", () => {\n if (message.value === \"\") {\n message.setCustomValidity(i18n.t(\"txtEnterMessage\"));\n } else {\n message.setCustomValidity(i18n.t(\"txtInvalidValue\"));\n }\n });\n\n // Messages\n this.message = this.container.querySelector(\"#message\");\n this.messageList = this.container.querySelector(\"#message-list\");\n this.unreadMessageCounter =\n this.container.querySelector(\"#unread-messages\");\n this.newMessageList = this.container.querySelector(\"#new-message-list\");\n\n // New message sound\n Bus.subscribe(NEW_MESSAGE, function () {\n var audio = document.querySelector(\"#notification\");\n audio.currentTime = 0;\n audio.play();\n });\n\n // Emoji\n const emojiBtn = this.container.querySelector(\"#emoji-picker-btn\");\n const pickerOptions = {\n theme: \"light\",\n skinTonePosition: \"none\",\n perLine: 8,\n locale: [\"pl\", \"en\"].includes(Utils.getProjectLang())\n ? Utils.getProjectLang()\n : \"en\",\n onEmojiSelect: (e) => {\n this.message.value += e.native;\n this.messageForm.querySelector(\"em-emoji-picker\").remove();\n this.message.focus();\n },\n onClickOutside: () => {\n this.messageForm.querySelector(\"em-emoji-picker\").remove();\n },\n };\n const picker = new EmojiMart.Picker(pickerOptions);\n emojiBtn.addEventListener(\"click\", () => {\n const emojiPickerComponent =\n this.messageForm.querySelector(\"em-emoji-picker\");\n if (emojiPickerComponent) {\n emojiPickerComponent.remove();\n } else {\n this.messageForm.appendChild(picker);\n }\n });\n\n // this.userPhoto = this.container.querySelector(\"#user-photo\");\n // this.header = this.container.querySelector(\"#header\");\n // this.positionName = this.container.querySelector(\"#headerPositionName\");\n // this.phoneNumber = this.container.querySelector(\"#headerPhoneNumberPhone\");\n // this.contactEmail = this.container.querySelector(\"#headerContactEmail\");\n // this.indicator = this.container.querySelector(\".indicator\");\n // this.conversation = this.container.querySelector(\".conversation\");\n // this.conversationError = this.container.querySelector(\".conversation-error\");\n\n // this.main = this.container.querySelector(\".main-screen\");\n // this.sendWrapper = this.main.querySelector(\".send-wrapper\");\n // this.refreshWrapper = this.main.querySelector(\".refresh-wrapper\");\n // this.reconnectWrapper = this.main.querySelector(\".reconnect-wrapper\");\n // this.reconnectEl = this.reconnectWrapper.querySelector(\".reconnect\");\n // this.reconnectEl.addEventListener(\"click\", this.reconnect.bind(this));\n // this.userName = null;\n\n // this.minimize = this.container.querySelector(\"#minimize\");\n // this.minimize.addEventListener(\"click\", this.showHideChat.bind(this));\n\n // this.maximize = this.container.querySelector(\"#text-chat\");\n // this.maximize.addEventListener(\"click\", this.showHideChat.bind(this));\n // this.maximizelabel = this.maximize.querySelector(\".maximize-label\");\n // this.maximize.addEventListener(\"click\", this.onChatBtnClick.bind(this));\n\n // this.transmitting = false;\n // this.receiving = false;\n // this.linker = null;\n\n // this.refresh = this.container.querySelector(\".refresh\");\n // this.refresh.addEventListener(\"click\", this.onRefreshClick.bind(this));\n\n // this.rtcActions = this.container.querySelector(\".rtc-actions\");\n // this.linkEl = this.rtcActions.querySelector(\".link\");\n // this.linkEl.addEventListener(\"click\", this.onLinkClick.bind(this));\n // this.unlinkEl = this.rtcActions.querySelector(\".unlink\");\n // this.unlinkEl.addEventListener(\"click\", this.onUnlinkClick.bind(this));\n // Bus.subscribe(SCENE_CHANGED, this.changeScene.bind(this));\n // this.store = store;\n // this.live = new LiveChat(window.hubsUrl);\n // this.remoteVideo = this.rtcActions.querySelector(\".remote\");\n // this.callEl = this.rtcActions.querySelector(\".call\");\n // this.callEl.addEventListener(\"click\", this.onCallClick.bind(this));\n // this.hangupEl = this.rtcActions.querySelector(\".hangup\");\n // this.callIndicator = this.hangupEl.querySelector(\".indicator-inner\");\n // this.indicatorSpinner = this.callIndicator.querySelector(\".connecting\");\n\n // this.pokeWindow = new PokeWindow(\"#poke\", this.showHideChat.bind(this));\n // Bus.subscribe(\n // CONNECTED,\n // function () {\n // Utils.addClass(this.indicatorSpinner, \"hidden\");\n // Utils.addClass(this.callIndicator, \"green\");\n // }.bind(this)\n // );\n // this.hangupEl.addEventListener(\"click\", this.onHangupClick.bind(this));\n\n // this.photoContainer = this.container.querySelector(\".photo-container\");\n // this.userPhotoEl = this.photoContainer.querySelector(\".user-photo\");\n\n // this.showCaptureInfo = this.showCaptureInfo.bind(this);\n } else {\n this.container.replaceChildren();\n }\n }\n\n new Fullscreen(\".fullscreen-new\");\n\n // if (!this.minimalMode && !this.noLead && config.leadPage) {\n // this.phone = \"\";\n // this.email = \"\";\n\n // this.prepareLeadPage();\n // this.leadPageMaximize = document.getElementById(\"lead-page-maximize\");\n // Utils.removeClass(this.leadPageMaximize, 'hidden');\n // this.leadPageShowed = false;\n // this.leadPageMaximize.addEventListener(\"click\", () => {\n // if (!this.leadPageShowed) {\n // this.displayLeadPage();\n // }\n // });\n // this.leadPageTimeout = setTimeout(() => {\n // this.displayLeadPage();\n // }, leadPageConfig.showAfterIdleTime);\n // }\n\n //TODO: change to 15\n // this.connect();\n // this.selfPoke();\n // this.status = \"initial\";\n this.startStatsGather().then(({ stopGather, markAsAlive }) => {\n if (!stopGather) return;\n window.addEventListener(\"beforeunload\", () => {\n stopGather();\n });\n if (!markAsAlive) return;\n markAsAlive();\n\n if (this.presentationId) return;\n\n const handleInactivity = () => {\n stopGather();\n const backdrop = document.createElement(\"div\");\n backdrop.classList.add(\"backdrop\");\n\n const messageContainer = document.createElement(\"div\");\n messageContainer.classList.add(\"lobby-modal\");\n messageContainer.style.flexDirection = \"column\";\n messageContainer.style.gap = \"1em\";\n\n const message = document.createElement(\"h3\");\n message.innerText = i18n.t(\"txtYouHaveBeenInactiveForTooLong\");\n messageContainer.appendChild(message);\n\n const refreshButton = document.createElement(\"button\");\n refreshButton.classList.add(\"btn-primary\");\n refreshButton.innerText = i18n.t(\"txtRefreshPage\");\n refreshButton.addEventListener(\n \"click\",\n window.location.reload.bind(window.location)\n );\n messageContainer.appendChild(refreshButton);\n\n document.body.appendChild(backdrop);\n document.body.appendChild(messageContainer);\n };\n\n this.inactivityTimeout = setTimeout(handleInactivity, FIVE_MINUTES);\n\n window.addEventListener(\"mousemove\", () => {\n if (this.isStatGatherStopped) return;\n if (this.inactivityTimeout) clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(handleInactivity, FIVE_MINUTES);\n });\n });\n }\n\n async onLobbyClose({ clientDto }) {\n await this.authenticateClient(clientDto);\n\n this.connect(async () => {\n try {\n const data = await this.requestToJoin(this.presentationId);\n const roomId = data?.roomId;\n\n if (!roomId) return;\n this.joinRoomById(roomId).then(({ roomId, history }) => {\n this.connecting = false;\n this.roomId = roomId;\n console.log(\"message history\", history);\n Utils.addClass(this.userDataForm, \"hide\");\n Utils.removeClass(this.messageForm, \"hide\");\n this.loadChatHistory(history);\n });\n } catch (e) {\n this.presentationLobby.showError(e.message);\n setTimeout(() => {\n this.presentationLobby.closeLobby();\n }, 5 * 1000);\n }\n });\n }\n\n async getAgentAvailability() {\n const { isAgentAvailable } = await fetch(\n `${window.apiUrl}/api/forms/${this.folderId}/get-agent-availability`\n ).then((data) => data.json());\n return isAgentAvailable;\n }\n\n async authenticateClient({ name, phone }) {\n this.name = name;\n this.phone = phone ?? \"000000000\";\n const res = await fetch(`${window.hubsUrl}/client/authenticate`, {\n method: \"POST\",\n headers: new Headers({ \"content-type\": \"application/json\" }),\n body: JSON.stringify({\n name: this.name,\n phoneNumber: this.phone,\n ...(this.deviceId && { deviceId: this.deviceId }),\n }),\n });\n\n const data = await res.json();\n this.deviceId = data?.device;\n localStorage.setItem(\"sb.deviceId\", data?.device);\n\n this.signalR = data?.signalR;\n\n if (!res.ok) {\n console.warn(\"ERROR WHILE AUTHENTICATING CLIENT\");\n throw new Error(\"ERROR WHILE AUTHENTICATING CLIENT\");\n }\n\n return res.ok;\n }\n\n async startChat(e, nameArg, phoneArg) {\n Bus.post(CHAT_STARTED);\n this.isChatStarted = true;\n e.preventDefault();\n const name = nameArg || this.container.querySelector(\"#contact-name\").value;\n const phone =\n phoneArg || this.container.querySelector(\"#contact-phone\").value;\n this.name = name;\n this.phoneNumber = phone;\n\n await this.authenticateClient({ name, phone });\n\n this.connect(() =>\n this.joinRoomByClient(parseInt(this.folderId)).then(\n ({ roomId, history }) => {\n this.connecting = false;\n this.roomId = roomId;\n console.log(\"message history\", history);\n Utils.addClass(this.userDataForm, \"hide\");\n this.userDataForm.reset();\n Utils.removeClass(this.messageForm, \"hide\");\n this.loadChatHistory(history);\n }\n )\n );\n }\n\n showCaptureInfo() {\n var captureInfo = document.querySelector(\".captureInfo\");\n Utils.removeClass(captureInfo, \"hidden\");\n }\n\n createCORSRequest(method, url, async) {\n var xhr = new XMLHttpRequest();\n if (\"withCredentials\" in xhr) {\n xhr.open(method, url, async == null ? true : async);\n } else if (typeof window.XDomainRequest != \"undefined\") {\n xhr = new window.XDomainRequest();\n xhr.open(method, url);\n } else {\n xhr = null;\n }\n return xhr;\n }\n\n prepareLeadPage() {\n // dodawanie tematow\n const url = window.hubsUrl + \"/api/leadpage\";\n\n this.leadPageContainer = document.getElementById(\"lead-page\");\n this.leadPageContainer.outerHTML = leadPageTemplate;\n this.leadPageContainer = document.getElementById(\"lead-page\");\n\n this.subject = this.leadPageContainer.querySelector(\".lead-page-subject\");\n\n var xhr = this.createCORSRequest(\"GET\", url);\n xhr.onreadystatechange = () => {\n if (xhr.readyState == 4 && xhr.status == 200) {\n const response = xhr.responseText;\n const data = JSON.parse(response);\n data.forEach((item) => {\n var subjectOptionNode = document.createElement(\"option\");\n subjectOptionNode.value = item.id;\n subjectOptionNode.innerText = item[\"suggestedTitlePL\"];\n this.subject.appendChild(subjectOptionNode);\n });\n this.subject.disabled = false;\n }\n };\n xhr.send();\n\n // pobieranie danych firmy\n var policyCheck = document.getElementById(\"leadPolicyCheck\");\n policyCheck.addEventListener(\n \"change\",\n function (e) {\n this.leadPageSend.disabled = !e.target.checked;\n }.bind(this)\n );\n\n var policy = document.getElementById(\"leadPolicy\");\n var xhr2 = this.createCORSRequest(\"GET\", url + \"/\" + this.folderId);\n xhr2.onreadystatechange = () => {\n if (xhr2.readyState == 4 && xhr2.status == 200) {\n const response = xhr2.responseText;\n const data = JSON.parse(response);\n\n var policyText = window.ooc.t(\"txtLeadPolicy\", {\n company: data.company,\n address: data.address,\n city: data.city,\n zip_code: data.zipCode,\n });\n\n if (!data.company || !data.address || !data.city || !data.zipCode) {\n console.warn(\"company data not found\");\n clearTimeout(this.leadPageTimeout);\n this.leadPageShowed = true;\n this.leadPageMaximize.classList.add(\"hidden\");\n }\n\n policy.innerText = policyText;\n }\n };\n xhr2.send();\n }\n\n displayLeadPage() {\n if (this.leadPageTimeout) {\n clearTimeout(this.leadPageTimeout);\n }\n this.leadPageShowed = true;\n\n this.leadPageContainer = document.getElementById(\"lead-page\");\n Utils.removeClass(this.leadPageContainer, \"hidden\");\n\n this.leadPageSend = this.leadPageContainer.querySelector(\".send\");\n this.leadPageClose = this.leadPageContainer.querySelector(\".close\");\n this.leadPageMinimize = this.leadPageContainer.querySelector(\".minimize\");\n\n this.leadPageMaximize.addEventListener(\"click\", () => {\n Utils.removeClass(this.leadPageContainer, \"hidden\");\n Utils.addClass(this.leadPageMaximize, \"hidden\");\n });\n\n this.leadPageMinimize.addEventListener(\"click\", () => {\n Utils.addClass(this.leadPageContainer, \"hidden\");\n Utils.removeClass(this.leadPageMaximize, \"hidden\");\n });\n\n this.leadPageClose.addEventListener(\"click\", () => {\n this.leadPageContainer.remove();\n });\n\n this.leadPageSend.addEventListener(\"click\", () => {\n this.leadPageSend.disabled = true;\n Utils.addClass(this.leadPageSend, \"disabled\");\n this.sendLeadForm();\n });\n\n this.phone = this.leadPageContainer.querySelector(\".lead-page-phone\");\n this.email = this.leadPageContainer.querySelector(\".lead-page-email\");\n this.subject = this.leadPageContainer.querySelector(\".lead-page-subject\");\n\n this.phone.addEventListener(\"input\", () => {\n this.formControlReset(this.phone);\n if (this.email.value.length < 1) {\n this.formControlReset(this.email);\n }\n });\n\n this.email.addEventListener(\"input\", () => {\n this.formControlReset(this.email);\n if (this.phone.value.length < 1) {\n this.formControlReset(this.phone);\n }\n });\n\n this.email.addEventListener(\"change\", () => {\n this.formControlReset(this.subject);\n if (this.subject.value) {\n this.formControlReset(this.subject);\n }\n });\n }\n formControlError(node, msg) {\n let formGroup = node.parentNode.parentNode;\n Utils.addClass(formGroup, \" error\");\n formGroup.querySelector(\".details\").textContent = msg;\n }\n formControlReset(node) {\n let formGroup = node.parentNode.parentNode;\n Utils.removeClass(formGroup, \" error\");\n formGroup.querySelector(\".details\").textContent = \"\";\n }\n validEmail(email) {\n return email.match(\n /^([\\w\\!\\#$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`{\\|\\}\\~]+\\.)*[\\w\\!\\#$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`{\\|\\}\\~]+@((((([a-z0-9]{1}[a-z0-9\\-]{0,62}[a-z0-9]{1})|[a-z])\\.)+[a-z]{2,6})|(\\d{1,3}\\.){3}\\d{1,3}(\\:\\d{1,5})?)$/i\n );\n }\n sendLeadForm() {\n setTimeout(() => {\n this.leadPageSend.disabled = false;\n Utils.removeClass(this.leadPageSend, \"disabled\");\n }, 500);\n\n let ok = true;\n let phone = this.leadPageContainer.querySelector(\".lead-page-phone\");\n let email = this.leadPageContainer.querySelector(\".lead-page-email\");\n let subject = this.leadPageContainer.querySelector(\".lead-page-subject\");\n\n if (!phone.value.length && !email.value.length) {\n this.formControlError(phone, \"Wprowadź numer telefonu lub adres email\");\n this.formControlError(email, \"Wprowadź numer telefonu lub adres email\");\n ok = false;\n }\n\n if (phone.value.length) {\n if (!phone.value.match(/\\d/g)) {\n this.formControlError(phone, \"Wprowadź poprawny numer\");\n ok = false;\n } else {\n this.formControlReset(phone);\n }\n }\n\n if (email.value.length) {\n if (!this.validEmail(email.value)) {\n this.formControlError(email, \"Wprowadź poprawny adres\");\n ok = false;\n } else {\n this.formControlReset(email);\n }\n }\n\n if (!subject.value) {\n this.formControlError(subject, \"Wybierz temat wiadomości\");\n ok = false;\n }\n\n if (ok) {\n //this.invoke(\"LeadForm\", this.phone.value, this.email.value, this.subject.value);\n\n const sendLeadUrl = `${window.hubsUrl}/api/leadpage?folderId=${this.folderId}&phone=${phone.value}&email=${email.value}&id=${subject.value}`;\n var sendLead = this.createCORSRequest(\"POST\", sendLeadUrl);\n sendLead.send();\n sendLead.onreadystatechange = () => {\n if (sendLead.readyState == 4 && sendLead.status == 200) {\n this.leadThanks();\n }\n };\n }\n }\n leadThanks() {\n this.leadPageContainer.querySelector(\".card-header-title\").textContent =\n \"Dziękujemy!\";\n this.leadPageContainer.querySelector(\".lead-page-form\").remove();\n Utils.removeClass(\n this.leadPageContainer.querySelector(\".lead-page-thanks\"),\n \"hidden\"\n );\n Utils.addClass(this.leadPageSend, \"hidden\");\n Utils.removeClass(this.leadPageClose, \"hidden\");\n this.leadPageMinimize.remove();\n this.leadPageMaximize.remove();\n }\n\n loadChatHistory(history) {\n // this.messageList.innerHTML = \"\";\n this.addSeparator();\n if (!history || !history?.length) {\n // const noHistory = document.createElement(\"li\");\n // noHistory.innerText = \"Brak wiadomości\";\n this.addMessage({\n message: `${i18n.t(\"txtWelcome\")} ${this.name}. ${i18n.t(\n \"txtUserCta\"\n )}`,\n sent: new Date().toISOString(),\n });\n } else {\n history.forEach((message, index) => {\n this.addMessage(message, history?.[index - 1]?.sent);\n });\n }\n }\n\n connect(clb) {\n if (this.connecting) {\n return;\n }\n\n this.connecting = true;\n this.connection = new HubConnectionBuilder()\n .withUrl(\n window.hubsUrl +\n `/chat?signalr-auth-cookie=${this.signalR}&device_cookie=${this.deviceId}`\n )\n .build();\n\n this.connection.on(\"ReceiveMessage\", this.onMessage.bind(this));\n this.connection.on(\n \"RequestToJoinPresentationAccepted\",\n this.onRequestToJoinAccepted.bind(this)\n );\n this.connection.on(\n \"RequestToJoinPresentationDeclined\",\n this.onRequestToJoinPresentationDeclined.bind(this)\n );\n\n this.connection.on(\"ViewChanged\", (data) => {\n if (!this.linker) return;\n\n this.linker.set(data);\n });\n\n this.connection.on(\"SceneChanged\", (data) => {\n if (!this.linker) return;\n\n this.linker.requestChangeScene({\n photoId: data.sceneId,\n });\n });\n\n this.connection.on(\"ControlRevoked\", () => {\n if (!this.presentation) return;\n\n this.onMessage({\n message: i18n.t(\"txtControlRevoked\"),\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.config?.UserName,\n });\n\n this.presentation.toggleControl(false);\n });\n\n this.connection.on(\"ControlGained\", () => {\n if (!this.presentation) return;\n\n this.onMessage({\n message: i18n.t(\"txtControlGained\"),\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.config?.UserName,\n });\n\n this.presentation.toggleControl(true);\n });\n\n this.connection.on(\"PresentationFinished\", () => {\n if (!this.presentation) return;\n\n this.onMessage({\n message: i18n.t(\"txtPresentationEnded\"),\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.config?.UserName,\n });\n\n this.presentation.endCall();\n this.connection.off(\"ViewChanged\");\n this.connection.off(\"SceneChanged\");\n this.connection.off(\"ControlRevoked\");\n this.connection.off(\"ControlGained\");\n });\n\n if (this.connection.state === \"Connected\") return;\n this.connection.start().then(clb);\n }\n\n async joinRoomByClient(folderId) {\n return this.connection.invoke(\"JoinRoomByClient\", { folderId });\n }\n\n async joinRoomById(roomId) {\n return this.connection.invoke(\"JoinRoomByIdAsClient\", { roomId });\n }\n\n async requestToJoin(presentationId) {\n return this.connection.invoke(\"RequestToJoinPresentation\", {\n presentationId,\n });\n }\n\n startConverstation() {\n var name = window.ooc.t(\"txtDefaultName\");\n this.invoke(\"StartChat\", name);\n\n clearTimeout(this.leadPageTimeout);\n }\n\n reconnect(clb) {\n if (this.reconnecting) {\n return;\n }\n try {\n this.reconnecting = true;\n this.reconnectRefresh = true;\n this.connect(clb);\n } finally {\n this.reconnecting = false;\n }\n }\n invoke(command) {\n //arguments ommited on purpose\n if (this.connection && this.connection.connection.connectionState !== 1) {\n //not connected state\n this.onDisconnected({\n name: \"System\",\n timeStamp: new Date().toISOString(),\n message: window.ooc.t(\"txtChatInterrupted\"),\n });\n } else {\n if (this.connection && this.connection.invoke) {\n this.connection.invoke.apply(this.connection, arguments);\n }\n }\n }\n invokeForce(command) {\n //arguments ommited on purpose\n if (this.connection && this.connection.connection.connectionState !== 1) {\n //not connected state\n this.onDisconnected({\n name: \"System\",\n timeStamp: new Date().toISOString(),\n message: window.ooc.t(\"txtChatInterrupted\"),\n });\n } else {\n this.connection.invoke.apply(this.connection, arguments);\n }\n }\n\n onRequestToJoinAccepted(payload) {\n if (this.presentation) return;\n\n this.presentationLobby.closeLobby();\n\n this.presentation = new VirtualPresentation(\n payload,\n this.presentationLobby.getTracks(),\n this.connection,\n this.roomId,\n \".presentation-participants\"\n );\n }\n\n onRequestToJoinPresentationDeclined() {\n if (this.presentation) return;\n\n this.presentationLobby.showError(\n `${i18n.t(\"txtAgentDeclinedYourJoinRequest\")}. ${i18n.t(\n \"txtThisWindowWillCloseSoon\"\n )}.`\n );\n setTimeout(() => {\n this.presentationLobby.closeLobby();\n }, 5 * 1000);\n }\n\n onMessage(payload, dataAgent) {\n if (this.timeToRemoveNewMessage) {\n clearTimeout(this.timeToRemoveNewMessage);\n }\n this.timeToRemoveNewMessage = setTimeout(() => {\n const newMessageList = this.container.querySelector(\"#new-message-list\");\n if (newMessageList.childElementCount > 1) {\n newMessageList.removeChild(newMessageList.firstElementChild);\n }\n }, 5000);\n this.lastMessageDate = dayjs();\n Bus.post(NEW_MESSAGE);\n if (payload) {\n if (\n Utils.checkClass(this.chatContainer, \"chat2__chat-container--hidden\")\n ) {\n this.unreadMessageCount++;\n this.unreadMessageCounter.innerText = this.unreadMessageCount;\n Utils.removeClass(this.unreadMessageCounter, \"hidden\");\n\n if(this.alerts) {\n let message = typeof payload === \"string\" ? payload : payload?.message;\n if (message.startsWith(\"txt\")) {\n message = i18n.t(message);\n }\n if (message) {\n const messageContent = document.createElement(\"div\");\n Utils.addClass(messageContent, \"chat2__new-message-content\");\n if (payload?.onClick) {\n messageContent.addEventListener(\"click\", payload?.onClick);\n Utils.addClass(\n messageContent,\n \"chat2__new-message-content--clickable\"\n );\n }\n\n if (payload?.withQuestion) {\n this.addActionButtonsToMessage(messageContent, payload);\n } else if (payload?.withContactForm) {\n this.addContactFormToMessage(messageContent, payload);\n } else {\n messageContent.innerText = message;\n }\n\n const newMessage = document.createElement(\"div\");\n Utils.addClass(newMessage, \"chat2__new-message-container\");\n const messageId = payload?.sent\n ? new Date(payload.sent).getTime()\n : Math.random().toString().slice(2, 10);\n newMessage.dataset.id = messageId;\n newMessage.textContent = \"\";\n newMessage.appendChild(messageContent);\n if (this.newMessageList.childElementCount > 1) {\n this.newMessageList.removeChild(this.newMessageList.firstChild);\n }\n this.newMessageList.appendChild(newMessage);\n const wordCount = message.split(\" \").length;\n\n if (!payload?.disableAutoHiding) {\n this.newMessageTiemout = setTimeout(() => {\n const messageToRemove = this.newMessageList.querySelector(\n `.chat2__new-message-container[data-id=\"${messageId}\"]`\n );\n if (messageToRemove) {\n this.newMessageList.removeChild(messageToRemove);\n }\n }, payload?.hideAfter ?? 2500 + wordCount * 300);\n }\n }\n }\n }\n this.addMessage(payload);\n }\n }\n onDisconnected(payload) {\n this.live.stop();\n this.onHangUp();\n this.onMessage(payload);\n // Utils.addClass(this.sendWrapper, \" hidden\");\n // Utils.removeClass(this.reconnectWrapper, \" hidden\");\n Utils.addClass(this.rtcActions, \" hidden\");\n Utils.addClass(this.sendWrapper, \" hidden\");\n this.refreshWrapper.querySelector(\".refresh-text\").textContent =\n window.ooc.t(\"txtRefresh\");\n Utils.removeClass(this.refreshWrapper, \" hidden\");\n }\n onMessageKeyPressed(e) {\n if (e.key === \"Enter\") {\n e.preventDefault();\n this.sendMessage();\n } else {\n this.onMessageInput();\n }\n }\n onMessageInput() {\n this.setInputHeight();\n }\n onMessageClicked(e) {\n e.preventDefault();\n this.sendMessage();\n }\n\n setInputHeight() {\n this.message.style.height = \"auto\";\n let height = this.message.scrollHeight + 6;\n this.message.style.height = height + \"px\";\n height += 90;\n this.conversation.style.maxHeight = \"calc(280px + 200px - \" + height + \"px\";\n }\n\n onSetCookie(key, value) {\n const d = new Date();\n d.setTime(d.getTime() + 30 * 24 * 60 * 60 * 1000);\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = key + \"=\" + value + \";\" + expires;\n }\n onError(value) {\n this.addMessage({\n message: window.ooc.t(\"txtCommunicationError\"),\n timeStamp: new Date().toISOString(),\n direction: \"in\",\n error: true,\n });\n }\n capture(value, options) {\n console.log(\"capture 1\");\n this.onTrasmittingChanged(value, this.transmitting);\n this.transmitting = value;\n if (this.transmitting) {\n this.receiving = false;\n }\n if ((options && options.transfer !== false) || !options) {\n console.log(\"capture 2\");\n this.invoke(\"Capture\", value);\n }\n }\n selfPoke() {\n setTimeout(\n function () {\n this.invoke(\"SelfPoke\");\n }.bind(this),\n 5000\n );\n }\n onCapture(value) {\n console.log(\"on capture\");\n this.receiving = value;\n if (this.receiving) {\n console.log(\"on capture reciving\");\n\n this.showCaptureInfo();\n Utils.removeClass(this.callEl, \"hidden\");\n\n this.onTrasmittingChanged(false, this.transmitting);\n this.transmitting = false;\n }\n }\n onReceiveCapturedData(payload) {\n if (this.receiving) {\n if (this.store.currentSceneId != payload.scene) {\n this.linker.requestChangeScene({\n photoId: payload.scene,\n targetId: payload.target,\n });\n }\n this.linker.set(payload);\n }\n }\n sendCaptureData(data) {\n if (this.transmitting) {\n this.invoke(\n \"SendCapturedData\",\n data.pitch,\n data.yaw,\n data.fov,\n data.scene,\n data.target\n );\n }\n }\n changeScene(data) {\n if (this.transmitting) {\n if (this.store.photosCount != 1) {\n this.invoke(\"ChangeScene\", data.photoId, data.targetId);\n }\n var data = this.linker.get();\n //it was causing multiple scene switching\n //this.sendCaptureData(data);\n }\n }\n onChangeScene(payload) {\n if (this.receiving && this.store.currentSceneId != payload.photoId) {\n this.linker.requestChangeScene(payload);\n }\n }\n sendMessage() {\n const value = this.message.value.trim();\n if (!value || value.length > msgMaxLength) {\n console.log(\"message length error\");\n Utils.removeClass(this.conversationError, \" hidden\");\n this.conversationError.innerText =\n window.ooc.t(\"txtMaxMessageLength\") +\n msgMaxLength +\n window.ooc.t(\"txtChars\");\n } else if (!this.connection || this.connection.state !== \"Connected\") {\n console.log(\"connection error\");\n } else {\n this.connection.invoke(\"SendMessage\", {\n roomId: this.roomId,\n message: value,\n });\n this.message.value = \"\";\n this.addMessage({\n message: value,\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.name,\n roomId: this.roomId,\n });\n }\n }\n\n addDateMessage(date) {\n const separator = document.createElement(\"li\");\n Utils.addClass(separator, \"chat-container__message--title\");\n separator.innerText = dayjs(date).format(\"D MMMM YYYY r.\");\n this.messageList.appendChild(separator);\n }\n\n addSeparator() {\n const separator = document.createElement(\"li\");\n Utils.addClass(separator, \"chat-container__message--separator\");\n this.messageList.appendChild(separator);\n }\n\n addActionButtonsToMessage(element, payload) {\n if (payload?.withQuestion) {\n const question = document.createElement(\"div\");\n Utils.addClass(question, \"message-content\");\n question.innerHTML = payload?.message?.replaceAll(\n linkRegex,\n (match) =>\n `${match}`\n );\n const messageId = new Date(payload?.sent).getTime();\n element.appendChild(question);\n const buttonPositive = document.createElement(\"button\");\n buttonPositive.classList.add(\"chat-container__message-button--positive\");\n buttonPositive.innerText =\n payload?.positiveButtonText ||\n i18n.t(\"txtYes\", { lng: this.creationLanguage });\n if (\n payload?.positiveButtonAction &&\n typeof payload.positiveButtonAction === \"function\"\n ) {\n buttonPositive.addEventListener(\"click\", () => {\n const messagesFromId = this.container.querySelectorAll(\n `*[data-id=\"${messageId}\"]`\n );\n messagesFromId.forEach((message) => {\n const positiveButtonInMessage = message.querySelector(\n \".chat-container__message-button--positive\"\n );\n const negativeButtonInMessage = message.querySelector(\n \".chat-container__message-button--negative\"\n );\n positiveButtonInMessage.classList.add(\n \"chat-container__message-button--selected\"\n );\n positiveButtonInMessage.disabled = true;\n negativeButtonInMessage.disabled = true;\n });\n payload.positiveButtonAction();\n });\n }\n const buttonNegative = document.createElement(\"button\");\n buttonNegative.classList.add(\"chat-container__message-button--negative\");\n buttonNegative.innerText =\n payload?.negativeButtonText ||\n i18n.t(\"txtYes\", { lng: this.creationLanguage });\n if (\n payload?.negativeButtonAction &&\n typeof payload.negativeButtonAction === \"function\"\n ) {\n buttonNegative.addEventListener(\"click\", () => {\n const messagesFromId = this.container.querySelectorAll(\n `*[data-id=\"${messageId}\"]`\n );\n messagesFromId.forEach((message) => {\n const positiveButtonInMessage = message.querySelector(\n \".chat-container__message-button--positive\"\n );\n const negativeButtonInMessage = message.querySelector(\n \".chat-container__message-button--negative\"\n );\n negativeButtonInMessage.classList.add(\n \"chat-container__message-button--selected\"\n );\n negativeButtonInMessage.disabled = true;\n positiveButtonInMessage.disabled = true;\n });\n payload.negativeButtonAction();\n });\n }\n const buttonContainer = document.createElement(\"div\");\n buttonContainer.classList.add(\"chat-container__message-buttons\");\n buttonContainer.appendChild(buttonPositive);\n buttonContainer.appendChild(buttonNegative);\n element.appendChild(buttonContainer);\n }\n }\n\n async sendNotificationToAgent(phoneNumber) {\n await fetch(`${window.apiUrl}/api/forms/${this.folderId}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n phoneNumber,\n }),\n });\n }\n\n async addContactFormToMessage(element, payload) {\n if (payload?.withContactForm) {\n const isAgentAvailable = await this.getAgentAvailability();\n const uniqueId = `ct-label-${Math.random().toString().slice(2, 10)}`;\n const container = document.createElement(\"div\");\n Utils.addClass(container, \"message-content\");\n container.innerHTML = payload?.message?.replaceAll(\n linkRegex,\n (match) =>\n `${match}`\n );\n const messageId = new Date(payload?.sent).getTime();\n const form = document.createElement(\"form\");\n form.classList.add(\"chat-container__message-contact-form\");\n const inputWrapper = document.createElement(\"div\");\n inputWrapper.classList.add(\"chat-container__message-input-wrapper\");\n const phoneInput = document.createElement(\"input\");\n phoneInput.classList.add(\"chat-container__message-input\");\n phoneInput.type = \"phone\";\n phoneInput.placeholder = i18n.t(\"txtYourPhoneNumber\", {\n lng: this.creationLanguage,\n });\n const submitButton = document.createElement(\"button\");\n submitButton.classList.add(\"chat-container__message-form-submit\");\n submitButton.innerText = i18n.t(\n isAgentAvailable ? \"textStartConversationShort\" : \"txtSend\",\n {\n lng: this.creationLanguage,\n }\n );\n const checkboxWrapper = document.createElement(\"div\");\n checkboxWrapper.classList.add(\"chat-container__checkbox-wrapper\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.id = uniqueId;\n checkbox.required = true;\n const checkboxLabel = document.createElement(\"label\");\n checkboxLabel.innerText = i18n.t(\"txtMessageContactFormAcceptRulesText\", {\n lng: this.creationLanguage,\n });\n checkboxLabel.style.fontSize = \"10px\";\n checkboxLabel.htmlFor = uniqueId;\n checkboxWrapper.appendChild(checkbox);\n checkboxWrapper.appendChild(checkboxLabel);\n inputWrapper.appendChild(phoneInput);\n inputWrapper.appendChild(submitButton);\n form.appendChild(inputWrapper);\n form.appendChild(checkboxWrapper);\n container.appendChild(form);\n element.appendChild(container);\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (isAgentAvailable) {\n if (\n Utils.checkClass(\n this.chatContainer,\n \"chat2__chat-container--hidden\"\n )\n ) {\n Utils.removeClass(\n this.chatContainer,\n \"chat2__chat-container--hidden\"\n );\n this.unreadMessageCount = 0;\n Utils.addClass(this.unreadMessageCounter, \"hidden\");\n this.newMessageList.textContent = \"\";\n }\n this.startChat(e, phoneInput.value, phoneInput.value);\n } else {\n this.sendNotificationToAgent(phoneInput.value);\n const messagesFromId = this.container.querySelectorAll(\n `*[data-id=\"${messageId}\"] .message-content`\n );\n messagesFromId.forEach((container) => {\n const formInContainer = container.querySelector(\"form\");\n container.removeChild(formInContainer);\n });\n this.onMessage(\n {\n message: i18n.t(\"txtContactRequestSent\"),\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.config?.UserName,\n },\n false\n );\n }\n });\n }\n }\n\n addMessage(payload, lastMessageDate) {\n const messageElement = document.createElement(\"li\");\n const messageId = payload?.sent\n ? new Date(payload.sent).getTime()\n : Math.random().toString().slice(2, 10);\n messageElement.dataset.id = messageId;\n if (payload?.onClick) {\n messageElement.addEventListener(\"click\", payload.onClick);\n Utils.addClass(messageElement, \"chat-container__message--clickable\");\n }\n const date = dayjs(payload?.sent);\n if (lastMessageDate || this.messageList.lastChild) {\n const previousDate = dayjs(\n lastMessageDate\n ? lastMessageDate\n : this.messageList.lastChild?.dataset?.sent\n );\n const diffDays = date.startOf(\"day\").diff(previousDate, \"day\");\n if (diffDays > 0) {\n this.addDateMessage(date);\n }\n } else {\n this.addDateMessage(date);\n }\n\n if (typeof payload === \"string\" && !this.agentJoinedBefore) {\n Utils.addClass(messageElement, \"chat-container__message--title\");\n messageElement.innerText = payload;\n this.messageList.appendChild(messageElement);\n this.agentJoinedBefore = true;\n } else if (Utils.isObject(payload) && payload?.message) {\n Utils.addClass(\n messageElement,\n `chat-container__message--${\n payload?.type === \"tip\"\n ? \"tip\"\n : payload.userName === this.name\n ? \"right\"\n : \"left\"\n }`\n );\n if (payload?.withQuestion) {\n this.addActionButtonsToMessage(messageElement, payload);\n } else if (payload?.withContactForm) {\n this.addContactFormToMessage(messageElement, payload);\n } else {\n messageElement.innerHTML = payload?.message?.replaceAll(\n linkRegex,\n (match) =>\n `${match}`\n );\n }\n messageElement.title = dayjs(payload.sent).format(\"HH:mm:ss\");\n messageElement.dataset.sent = payload.sent;\n this.messageList.appendChild(messageElement);\n const conversationContainer = this.container.querySelector(\n \"#conversation-container\"\n );\n conversationContainer.scrollTop = conversationContainer.scrollHeight;\n } else {\n console.warn(\"New message in unknown format:\", payload);\n }\n // if (payload) {\n // const element = document.createElement(\"div\");\n // Utils.addClass(element, \"message-container\");\n // Utils.addClass(element, payload.direction);\n\n // const entryWr = document.createElement(\"div\");\n // Utils.addClass(entryWr, \"entry-wrapper\");\n // if (payload.direction == \"in\") {\n // } else {\n // }\n // const messageWr = document.createElement(\"div\");\n // Utils.addClass(messageWr, \"message-wrapper\");\n // const message = document.createElement(\"div\");\n // Utils.addClass(message, \"msg\");\n // if (payload.error) {\n // Utils.addClass(message, \"error\");\n // }\n // var matches = this.parseLinks(payload.message);\n // for (const match of matches) {\n // if (match.isLink) {\n // const link = document.createElement(\"a\");\n // link.href = match.value;\n // link.target = \"_blank\";\n // link.innerText = match.value;\n // message.appendChild(link);\n // } else {\n // const el = document.createElement(\"span\");\n // el.innerText = match.value;\n // message.appendChild(el);\n // }\n // }\n // messageWr.appendChild(message);\n // if (payload.direction == \"in\") {\n // entryWr.appendChild(messageWr);\n // } else {\n // entryWr.appendChild(messageWr);\n // }\n // element.appendChild(entryWr);\n\n // const timeWr = document.createElement(\"div\");\n // Utils.addClass(timeWr, \"time-wrapper\");\n // const timeEl = document.createElement(\"div\");\n // Utils.addClass(timeEl, \"time\");\n // const time = new Date(payload.timeStamp).toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n // timeEl.innerText = time;\n // timeWr.appendChild(timeEl);\n // element.appendChild(timeWr);\n\n // this.conversation.appendChild(element);\n // this.scrollToEnd();\n // }\n }\n\n parseLinks(msg) {\n let result = [];\n let cursor = 0;\n const matches =\n msg.match(\n /(https?:\\/\\/)?(www\\.)?[-\\w@:%.\\+~#=]{2,256}\\.[a-z]{2,6}\\b([\\w-@:%\\+.~#?&//=]*)/g\n ) || [];\n for (const match of matches) {\n const index = msg.indexOf(match, cursor);\n result.push({ isLink: false, value: msg.substring(cursor, index) });\n let link = msg.substr(index, match.length);\n link = link.startsWith(\"http\") ? link : \"http://\" + link;\n result.push({ isLink: true, value: link });\n cursor = index + match.length;\n }\n result.push({ isLink: false, value: msg.substring(cursor, msg.length) });\n return result;\n }\n getCookie(cname) {\n const name = cname + \"=\";\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(\";\");\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) == \" \") {\n c = c.substring(1);\n }\n if (c.indexOf(name) == 0) {\n return c.substring(name.length, c.length);\n }\n }\n return \"\";\n }\n\n onChatBtnClick() {\n this.onChatBtnClickCallback();\n }\n\n setChatBtnClickCallback(clb) {\n this.onChatBtnClickCallback = clb;\n }\n\n showHideChat(order) {\n if (!order || (order != \"show\" && order != \"hide\")) {\n order = this.isChatHidden() ? \"show\" : \"hide\";\n }\n if (this.status === \"initial\") {\n order = \"show\";\n this.startConverstation();\n Utils.addClass(this.maximizelabel, \"hidden\");\n }\n switch (order) {\n case \"show\":\n Utils.removeClass(this.container, \"hide\");\n Utils.addClass(this.container, \"show\");\n Utils.addClass(this.indicator, \"hidden\");\n this.container.style.maxHeight = \"460px\";\n Utils.addClass(this.maximize, \"hidden\");\n Utils.removeClass(this.minimize, \"hidden\");\n this.status = \"visible\";\n break;\n case \"hide\":\n Utils.removeClass(this.container, \"show\");\n Utils.addClass(this.container, \"hide\");\n Utils.addClass(this.container, \"no-trans\");\n Utils.removeClass(this.maximize, \"hidden\");\n Utils.addClass(this.minimize, \"hidden\");\n this.container.style.maxHeight = this.container.offsetHeight + \"px\";\n // this.container.offsetHeight = ; // trigger a reflow, flushing the CSS changes\n Utils.removeClass(this.container, \"no-trans\");\n this.container.style.maxHeight = minChatHeight;\n this.status = \"hidden\";\n break;\n }\n }\n isChatHidden() {\n return this.status === \"hidden\";\n }\n scrollToEnd() {\n const scrollableDiv = this.container.querySelector(\".conversation\");\n scrollableDiv.scrollTop = scrollableDiv.scrollHeight;\n }\n onRefreshClick() {\n this.reconnect(() => {\n var name = window.ooc.t(\"txtDefaultName\");\n this.invokeForce(\"StartChat\", name);\n });\n }\n onLinkClick() {\n this.capture(true);\n this.changeScene({\n photoId: this.store.currentSceneId,\n targetId: this.store.recentTargetId,\n });\n }\n onUnlinkClick() {\n this.capture(false);\n }\n onTrasmittingChanged(value, old) {\n if (old && !value) {\n Utils.addClass(this.unlinkEl, \" hidden\");\n Utils.removeClass(this.linkEl, \" hidden\");\n } else if (!old && value) {\n Utils.addClass(this.linkEl, \" hidden\");\n Utils.removeClass(this.unlinkEl, \" hidden\");\n }\n }\n onCallClick() {\n Utils.addClass(this.callEl, \" hidden\");\n this.invoke(\"Call\", true);\n Utils.removeClass(this.indicatorSpinner, \"hidden\");\n Utils.removeClass(this.hangupEl, \" hidden\");\n }\n onHangupClick() {\n this.live.stop();\n this.onHangUp();\n this.invoke(\"RejectCall\");\n }\n onHangUp() {\n Utils.addClass(this.hangupEl, \" hidden\");\n Utils.removeClass(this.callIndicator, \"green\");\n Utils.removeClass(this.callEl, \" hidden\");\n }\n onRejectCall() {\n this.onHangUp();\n }\n onWelcome(payload, userPhotoUrl, dataAgent) {\n this.showHideChat(\"show\");\n clearTimeout(this.waitingTimer);\n Utils.removeClass(this.rtcActions, \" hidden\");\n this.showPhoto(userPhotoUrl);\n this.onMessage(payload, dataAgent);\n }\n\n showPhoto(userPhotoUrl) {\n Utils.removeClass(this.photoContainer, \"hidden\");\n this.userPhotoEl.src = userPhotoUrl;\n }\n\n onDisableFeature(feature, message) {\n this.onMessage(message);\n if (feature == \"VoiceCalls\") {\n this.live.stop();\n this.onHangUp();\n } else if (feature == \"Presentations\") {\n this.capture(false, { transfer: false });\n }\n }\n\n onBanned(message) {\n this.onMessage(message);\n this.connection.stop();\n }\n\n onWaiting(message, unavailable) {\n this.unavailable = unavailable;\n this.onMessage(message);\n this.waitingTimer = setTimeout(this.afterWaiting.bind(this), 60 * 1000);\n }\n\n onPoke(payload, photoUrl, dataAgent) {\n this.showPhoto(photoUrl);\n this.pokeWindow.show(payload.message, payload.name, photoUrl, dataAgent);\n }\n\n onSellerBusy(busyMessage) {\n var message = {\n name: \"System\",\n message: busyMessage,\n timeStamp: new Date().toISOString(),\n };\n this.onMessage(message);\n clearTimeout(this.waitingTimer);\n }\n\n onSellerBusyClosed() {\n Utils.addClass(this.rtcActions, \" hidden\");\n Utils.addClass(this.sendWrapper, \" hidden\");\n\n this.refreshWrapper.querySelector(\".refresh-text\").textContent =\n window.ooc.t(\"txtTryAgain\");\n Utils.removeClass(this.refreshWrapper, \" hidden\");\n\n if (!this.leadPageShowed) {\n this.leadPageTimeout = setTimeout(() => {\n this.displayLeadPage();\n }, leadPageConfig.showAfterBusyTime);\n }\n }\n\n afterWaiting() {\n this.invoke(\"Deactivated\");\n var message = {\n name: \"System\",\n message: this.unavailable,\n timeStamp: new Date().toISOString(),\n };\n this.onMessage(message);\n }\n\n hasFeature(folderId) {\n const url = window.hubsUrl + \"/hasChat/\" + folderId;\n const xhr = this.createCORSRequest(\"GET\", url, false);\n xhr.send();\n if (xhr.readyState === 4 && xhr.status === 200) {\n const response = xhr.responseText;\n return JSON.parse(response);\n }\n }\n\n async startStatsGather() {\n const params = new URLSearchParams(window.location.search);\n const portal = params.has(\"portal\") ? params.get(\"portal\") : \"unknown\";\n\n try {\n const res = await fetch(\n `${window.hubsUrl}/statistics/start-visit?FolderId=${this.projectId}&Portal=${portal}`,\n {\n method: \"POST\",\n }\n );\n if (!res.ok) throw new Error(res.status);\n\n const token = await res.json();\n const intervals = [1, 3, 7, 15, 31];\n const markAsAlive = (intervalIndex) => {\n if (this.isStatGatherStopped) return;\n let index = intervalIndex || 0;\n if (intervals.length <= index) {\n index = intervals.length - 1;\n }\n this.markAsAliveTimeout = setTimeout(() => {\n fetch(\n `${window.hubsUrl}/statistics/continue-visit?FolderId=${this.projectId}&Token=${token}`,\n {\n method: \"PATCH\",\n }\n ).finally(() => markAsAlive(index + 1));\n }, intervals[index] * 1000);\n };\n return {\n stopGather: () => {\n clearTimeout(this.markAsAliveTimeout);\n fetch(\n `${window.hubsUrl}/statistics/stop-visit?FolderId=${this.projectId}&Token=${token}`,\n {\n method: \"PATCH\",\n }\n ).then(() => {\n this.isStatGatherStopped = true;\n });\n },\n markAsAlive,\n };\n } catch (error) {\n console.warn(\"FAILED STAT GATHER START\");\n return false;\n }\n }\n\n updateIcon() {\n this.alertsOffElement = this.hideAlertsBtn.querySelector(\"#alerts-off\");\n this.alertsOnElement = this.hideAlertsBtn.querySelector(\"#alerts-on\");\n Utils.setVisibility(this.alertsOffElement, this.alerts === false);\n Utils.setVisibility(this.alertsOnElement, this.alerts === true);\n Utils.setVisibility(this.container.querySelector(\"#new-message-list\"), this.alerts === true);\n }\n}\n\nexport default Chat;\n","export default {\n currentPhotoIndex: null,\n currentSceneId: null,\n recentTargetId: null,\n photosCount: 0\n}","import Store from \"App/js/store.js\";\nexport default class MarzipanoLinker {\n constructor(walk) {\n this.walk = walk;\n this.interval = null;\n }\n\n set(payload) {\n var scene = this.walk.viewer.scene();\n scene.lookTo(payload);\n }\n\n get() {\n var view = this.walk.viewer.view();\n var data = {\n yaw: view.yaw(),\n pitch: view.pitch(),\n fov: view.fov(),\n scene: Store.currentSceneId,\n target: Store.recentTargetId\n };\n return data;\n }\n\n requestChangeScene(data) {\n this.walk.requestSwitchScene(data, true);\n }\n setViewer(walk, publisher) {\n this.walk = walk;\n this.walk.viewer.addEventListener(\"viewChange\", () => {\n this.throttle(publisher);\n });\n }\n measure() {\n var now = new Date().getTime();\n if (this.lastCheck) {\n var temp = 1 / ((now - this.lastCheck) / 1000);\n this.range = this.range || [];\n if (this.range.length == 20) {\n this.range.shift();\n }\n this.range.push(temp);\n var sum = this.range.reduce((a, b) => a + b);\n console.log(sum / this.range.length);\n }\n this.lastCheck = now;\n }\n sample(publisher) {\n this.last = this.get();\n if (this.timeout) {\n return;\n }\n this.timeout = setTimeout(() => {\n //this.measure();\n publisher(this.last);\n this.timeout = null;\n }, 200);\n }\n\n throttle(publisher) {\n if (this.timeout) {\n clearTimeout(this.timeout);\n this.timeout = null;\n }\n this.timeout = setTimeout(() => {\n //this.measure();\n publisher(this.get());\n this.timeout = null;\n }, 200);\n }\n}\n","export default {\n pl : {\n \"txtStart\": \"Rozpocznij\",\n \"txtNickMaxLength\": \"Nick nie może być dłuższy niż \",\n \"txtChars\": \" znaków\",\n \"txtNickIsRequired\": \"Nick jest wymagany\",\n \"txtConversation\": \"Rozmowa\",\n \"txtConversationWith\": \"Rozmowa z \",\n \"txtCommunicationError\": \"Wystąpił niespodziewany bląd w komunikacji.\",\n \"txtMaxMessageLength\": \"maksymalna długość wiadomości to \",\n \"txtServerNotAvailable\": \"Server jest nieosiągalny.\",\n \"txtNoPhotosInWalk\": \"Spacer nie zawiera żadnych zdjęć.\",\n \"txtWalkLoadingFailed\": \"Nie udało się załadować spaceru.\",\n \"txtCallFailure\": \"Nie udało się nawiązać połączenia glosowego. Jeśli korzystasz z telefonu upewnij się, że masz wlączone WiFi.\",\n \"txtChatInterrupted\": \"Rozmowa została przerwana.\",\n \"txtDefaultName\": \"Nowy klient\",\n \"txtDefaultVisitor\": \"Zwiedzający\",\n \"txtPokeTitle\": \"Zaproszenie do rozmowy\",\n \"txtRefresh\": \"Odśwież\",\n \"txtTryAgain\": \"Spróbuj ponownie\",\n \"txtLeadPolicy\": \"Wyrażam zgodę na przetwarzanie przez administratora danych osobowych, firmę {company} znajdującą się pod adresem {address}, {zip_code} {city}, danych wysłanych w formularzu kontaktowym w celu udzielenia odpowiedzi na wysłane zapytanie.\"\n },\n en: {\n \"txtStart\": \"Begin\",\n \"txtNickMaxLength\": \"Nick can't be longer than \",\n \"txtChars\": \" characters\",\n \"txtNickIsRequired\": \"Nick is required\",\n \"txtConversation\": \"Conversation\",\n \"txtConversationWith\": \"Conversation with \",\n \"txtCommunicationError\": \"There was an unexpected error in communication.\",\n \"txtMaxMessageLength\": \"the maximum message length is \",\n \"txtServerNotAvailable\": \"Server is not available.\",\n \"txtNoPhotosInWalk\": \"The walk does not contain any photos.\",\n \"txtWalkLoadingFailed\": \"Failed to load the walk.\",\n \"txtCallFailure\": \"A voice call could not be made. If you use the phone, make sure you have WiFi enabled.\",\n \"txtChatInterrupted\": \"The call was interrupted.\",\n \"txtDefaultName\": \"New client\",\n \"txtDefaultVisitor\": \"Visitor\",\n \"txtPokeTitle\": \"Invitation to talk\",\n \"txtRefresh\": \"Refresh\",\n \"txtTryAgain\": \"Try again\",\n \"txtLeadPolicy\": \"Wyrażam zgodę na przetwarzanie przez administratora danych osobowych, firmę {company} znajdującą się pod adresem {address} {zip_code} {city}, danych wysłanych w formularzu kontaktowym w celu udzielenia odpowiedzi na wysłane zapytanie.\"\n },\n}","class Ajax {\n get(url) {\n return new Promise((resolve, reject) => {\n var request = new XMLHttpRequest();\n request.onreadystatechange = function() {\n if (request.readyState == 4) {\n if (request.status == 200) {\n const response = JSON.parse(request.response);\n resolve(response);\n } else {\n reject({\n message: window.ooc.t(\"txtServerNotAvailable\"),\n request: request\n });\n }\n }\n };\n request.open('GET', url, true);\n request.send();\n });\n }\n}\n\nexport default new Ajax();\n","import Utils from \"./utils\";\n\nexport class Speech {\n constructor(config) {\n this.muted = false;\n this.container = document.querySelector(\".chat2\")\n this.tracks = config?.VirtualGuideMessages?.Photos?.reduce((acc, photo) => {\n return photo?.Messages\n .filter(message => message?.SpeechUrl != null)\n .reduce((acc, message) => {\n const audioElement = document.createElement(\"audio\");\n audioElement.id = `vgm-${message?.Id}`\n audioElement.src = message?.SpeechUrl;\n this.container.appendChild(audioElement);\n acc[photo?.PhotoId] = audioElement;\n return acc;\n }, acc);\n }, {});\n this.muteButton = document.querySelector(\"#mute-btn\");\n this.updateIcon();\n Utils.registerEvent(this.muteButton,\"click\", (e) => {\n e.stopPropagation();\n this.muted = !this.muted;\n this.updateIcon();\n for (let photoId in this.tracks) {\n const track = this.tracks[photoId];\n track.volume = this.muted ? 0 : 1;\n }\n })\n }\n \n play(photoId) {\n const track = this.tracks[photoId];\n track.volume = this.muted ? 0 : 1;\n track.play();\n return (track.duration === 0 ? 10 : track.duration) * 1000;\n }\n \n stop() {\n for (let photoId in this.tracks) {\n const track = this.tracks[photoId];\n track.pause();\n track.currentTime = 0;\n }\n }\n \n updateIcon() {\n this.mutedElement = this.muteButton.querySelector(\"#muted\");\n this.unmutedElement = this.muteButton.querySelector(\"#unmuted\");\n Utils.setVisibility(this.mutedElement, this.muted === true);\n Utils.setVisibility(this.unmutedElement, this.muted === false)\n }\n}\n","import dayjs from \"dayjs\";\nimport i18n from \"../config/i18n\";\nimport { CHAT_STARTED, FIRST_VISIT_SCHENE, SCENE_CHANGED } from \"./events\";\nimport utils from \"./utils\";\nimport { Speech } from \"./speech\";\n\nexport default class VirtualGuide {\n constructor(chat, activityTracker, walk, config) {\n this.config = config;\n this.chat = chat;\n this.activityTracker = activityTracker;\n this.messages = {};\n this.language = utils.getProjectCreationLanguage();\n this.isGuideActive = true;\n\n this.startTime = dayjs();\n this.systeMessage1PhotoId = null;\n this.systeMessage2PhotoId = null;\n this.systeMessage3PhotoId = null;\n\n this.fetchGuideMessages();\n this.speech = new Speech(config);\n\n this.systemMessages = new SystemMessageQueue(chat, config, this.speech);\n\n if (\n this.config.VirtualGuideMessages.Photos.filter(\n (photo) => !!photo.Messages.length\n ).length < 3\n ) {\n this.isGuideActive = false;\n }\n\n const firstPhotoId =\n this.config.StartingPhotoId || this.config.Photos?.[0].Id;\n\n // Add message for starting photo to queue\n setTimeout(() => {\n if (\n this.isGuideActive &&\n !this.activityTracker.isChatStarted &&\n firstPhotoId in this.messages &&\n this.messages[firstPhotoId].length &&\n this.messages[firstPhotoId][0].Content\n ) {\n this.systemMessages.addToQueue({\n id: firstPhotoId,\n message: this.messages[firstPhotoId][0]?.Content,\n sentByClient: true,\n userName: this.config?.UserName,\n type: \"tip\",\n isSystemMessage: true,\n withLector: true,\n messageDelay: this.config?.Lector ? 0 : undefined,\n });\n }\n }, 1000);\n\n // Add first question to queue after 25s\n setTimeout(async () => {\n if (this.isGuideActive) {\n this.sendSystemMessage1();\n this.systeMessage1PhotoId = this.activityTracker.currentSceneId;\n }\n }, 25000);\n\n // Add second question to queue after 60s\n setTimeout(async () => {\n if (\n this.isGuideActive &&\n activityTracker.currentSceneId !== this.systeMessage1PhotoId\n ) {\n this.sendSystemMessage2();\n this.systeMessage2PhotoId = this.activityTracker.currentSceneId;\n }\n }, 60000);\n\n // Add third question to queue after 90s\n setTimeout(async () => {\n if (\n this.isGuideActive &&\n this.systeMessage2PhotoId != null &&\n activityTracker.currentSceneId !== this.systeMessage2PhotoId\n ) {\n this.sendSystemMessage3();\n this.systeMessage3PhotoId = this.activityTracker.currentSceneId;\n }\n }, 90000);\n\n // After 30s of inactivity, suggest to visit a unvisited room\n this.activityTracker.afterLastActivity(\n null,\n () => {\n if (\n !this.activityTracker.isMediaPreviewOpen &&\n !this.activityTracker.isChatStarted &&\n this.isGuideActive\n ) {\n const room = activityTracker.getUnvisitedRoom();\n if (room) {\n this.systemMessages.addToQueueOnTop({\n // Add on top of the queue\n id: \"room-suggestion\",\n message: i18n\n .t(\"txtVirtualGuideVisitRoomSuggestion\", { lng: this.language })\n .replace(\"\", room.Name),\n sentByClient: true,\n userName: config?.UserName,\n disableAutoHiding: true,\n onClick: () => {\n walk.switchSceneByUser(room, null, true);\n },\n type: \"tip\",\n isSystemMessage: true,\n });\n }\n }\n },\n 30000,\n false\n );\n\n // After changing the scene to unvisited room, add a message for that photo to the queue\n this.activityTracker.afterLastActivity(\n FIRST_VISIT_SCHENE,\n ({ photoId }) => {\n if (this.systemMessages.getSize() > 0) {\n this.handleVisitNewScene(photoId);\n } else {\n // If message would be sent immediately, wait 2s after photo change for better user experience\n setTimeout(() => {\n this.handleVisitNewScene(photoId);\n }, 2000);\n }\n }\n );\n\n // Stop the guide after chat started\n this.activityTracker.afterLastActivity(CHAT_STARTED, () => {\n this.systemMessages.clearQueue();\n this.speech.stop();\n });\n }\n\n handleVisitNewScene(photoId) {\n if (\n !this.activityTracker.isChatStarted &&\n photoId in this.messages &&\n this.messages[photoId].length &&\n this.messages[photoId]?.[0]?.Content &&\n this.isGuideActive\n ) {\n this.systemMessages.addToQueue({\n id: photoId,\n message: this.messages[photoId][0]?.Content,\n sentByClient: true,\n userName: this.config?.UserName,\n type: \"tip\",\n isSystemMessage: true,\n withLector: true,\n messageDelay: this.config?.Lector ? 0 : undefined,\n });\n }\n\n if (\n this.systeMessage2PhotoId == null &&\n dayjs().diff(this.startTime, \"s\") > 60 &&\n photoId !== this.systeMessage1PhotoId\n ) {\n this.sendSystemMessage2();\n this.systeMessage2PhotoId = this.activityTracker.currentSceneId;\n } else if (\n this.systeMessage2PhotoId != null &&\n this.systeMessage3PhotoId == null &&\n dayjs().diff(this.startTime, \"s\") > 90 &&\n photoId !== this.systeMessage2PhotoId\n ) {\n this.sendSystemMessage3();\n this.systeMessage3PhotoId = this.activityTracker.currentSceneId;\n }\n }\n\n async sendSystemMessage1() {\n if (this.activityTracker.isChatStarted || !this.isGuideActive) return;\n this.systemMessages.addToQueue({\n id: \"system-message-1\",\n message: i18n.t(\"txtVirtualGuideSystemMessage1Question\", {\n lng: this.language,\n }),\n sentByClient: true,\n userName: this.config?.UserName,\n hideAfter: 6000,\n type: \"tip\",\n withQuestion: true,\n isSystemMessage: true,\n positiveButtonAction: this.handleActionButtonClick.bind(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage1PositiveResponse\"\n )\n ),\n negativeButtonAction: async () => {\n this.handleActionButtonClick.call(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage1NegativeResponse\"\n ),\n false,\n true\n )();\n this.noteVirtualGuideInteraction();\n },\n positiveButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage1PositiveButton\",\n { lng: this.language }\n ),\n negativeButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage1NegativeButton\",\n { lng: this.language }\n ),\n });\n }\n\n async sendSystemMessage2() {\n if (this.activityTracker.isChatStarted || !this.isGuideActive) return;\n this.systemMessages.addToQueue({\n message: i18n.t(\"txtVirtualGuideSystemMessage2Question\", {\n lng: this.language,\n }),\n sentByClient: true,\n userName: this.config?.UserName,\n hideAfter: 6000,\n type: \"tip\",\n isSystemMessage: true,\n withQuestion: true,\n positiveButtonAction: this.handleActionButtonClick.bind(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage2PositiveResponse\"\n ),\n true\n ),\n negativeButtonAction: this.handleActionButtonClick.bind(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage2NegativeResponse\"\n )\n ),\n positiveButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage2PositiveButton\",\n { lng: this.language }\n ),\n negativeButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage2NegativeButton\",\n { lng: this.language }\n ),\n });\n }\n\n async sendSystemMessage3() {\n if (this.activityTracker.isChatStarted || !this.isGuideActive) return;\n this.systemMessages.addToQueue({\n delayMessage: false,\n message: i18n.t(\"txtVirtualGuideSystemMessage3Question\", {\n lng: this.language,\n }),\n sentByClient: true,\n userName: this.config?.UserName,\n hideAfter: 6000,\n type: \"tip\",\n isSystemMessage: true,\n withQuestion: true,\n positiveButtonAction: this.handleActionButtonClick.bind(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage3PositiveResponse\"\n ),\n true\n ),\n negativeButtonAction: this.handleActionButtonClick.bind(\n this,\n await this.getReponseTextDependingOnAgentStatus(\n \"txtVirtualGuideSystemMessage3NegativeResponse\"\n ),\n true\n ),\n positiveButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage3PositiveButton\",\n { lng: this.language }\n ),\n negativeButtonText: i18n.t(\n \"txtVirtualGuideSystemMessage3NegativeButton\",\n { lng: this.language }\n ),\n });\n }\n\n async getReponseTextDependingOnAgentStatus(key) {\n const noChatResponse = i18n.t(key, {\n lng: this.language,\n });\n const activeChatResponse = i18n.t(`${key}ActiveChat`, {\n lng: this.language,\n });\n if (activeChatResponse.startsWith(\"txt\")) {\n return noChatResponse;\n } else {\n const isAgentAvailable = await this.getAgentAvailability();\n if (isAgentAvailable) {\n return activeChatResponse;\n } else {\n return noChatResponse;\n }\n }\n }\n\n async getAgentAvailability() {\n const { isAgentAvailable } = await fetch(\n `${window.apiUrl}/api/forms/${this.chat.folderId}/get-agent-availability`\n ).then((data) => data.json());\n return isAgentAvailable;\n }\n\n handleActionButtonClick(\n message,\n withContactForm = false,\n stopVirtualGuide = false\n ) {\n if (!message) return;\n if (stopVirtualGuide) {\n this.isGuideActive = false;\n }\n setTimeout(() => {\n this.chat.onMessage(\n {\n message,\n sent: new Date().toISOString(),\n sentByClient: true,\n userName: this.config?.UserName,\n hideAfter: 6000,\n disableAutoHiding: withContactForm,\n type: \"tip\",\n isSystemMessage: true,\n withContactForm,\n },\n false\n );\n }, 1000);\n }\n\n fetchGuideMessages() {\n this.messages = this.config?.VirtualGuideMessages?.Photos?.reduce(\n (prev, curr) => {\n prev[curr?.PhotoId] = curr?.Messages;\n return prev;\n },\n {}\n );\n }\n\n async noteVirtualGuideInteraction() {\n await fetch(\n `${window.apiUrl}/api/project/stats/${this.chat.folderId}/virtual-guide-interact`,\n {\n method: \"PATCH\",\n }\n );\n }\n}\n\nclass SystemMessageQueue {\n constructor(chat, config, speech, { messageDelay = 3000 } = {}) {\n this.chat = chat;\n this.config = config;\n this.speech = speech;\n this.alreadyPlayed = [];\n this.queue = [];\n this.nextUpdate = null;\n this.current = null;\n this.messageDelay = messageDelay;\n }\n\n addToQueue(message) {\n this.queue.push(message);\n this.tryNext();\n }\n\n addToQueueOnTop(message) {\n this.queue.unshift(message);\n this.tryNext();\n }\n\n tryNext() {\n if (this.current !== null || this.queue.length == 0) return;\n\n this.current = this.queue.shift();\n if (this.alreadyPlayed.indexOf(this.current.id) >= 0) {\n setTimeout(this.finished.bind(this), 0); //avoid stack overflow\n return;\n }\n this.alreadyPlayed.push(this.current.id);\n let duration = 0 + (this.current?.messageDelay ?? this.messageDelay);\n if (this.config?.Lector && this.current?.withLector) {\n duration =\n this.speech.play(this.current.id) +\n (this.current?.messageDelay ?? this.messageDelay);\n console.log(\"Playing lector. Duration:\", duration, \"Delay:\", (this.current?.messageDelay ?? this.messageDelay));\n } else if (this.current.duration != null) {\n duration =\n this.current.duration +\n (this.current?.messageDelay ?? this.messageDelay);\n }\n this.chat.onMessage({\n delayMessage: false,\n sent: new Date().toISOString(),\n ...this.current,\n duration,\n });\n this.nextUpdate = setTimeout(this.finished.bind(this), duration);\n }\n\n finished() {\n this.current = null;\n this.tryNext();\n }\n\n clearQueue() {\n clearTimeout(this.nextUpdate);\n this.queue.length = 0;\n this.current = null;\n }\n\n getSize() {\n return this.queue.length;\n }\n}\n","import \"App/css/style.scss\";\nimport \"App/css/animated.css\";\nimport VirtualWalk from \"App/js/preview.js\";\nimport Controls from \"App/js/controls.js\";\nimport Chat from \"App/js/chat.js\";\nimport { Bus } from \"App/js/simple-bus.js\";\nimport MarzipanoLinker from \"App/js/marzipano-view-linker.js\";\nimport { INTRO_CLOSED } from \"App/js/events.js\";\nimport Store from \"App/js/store.js\";\nimport langs from \"App/js/languages.js\";\nimport Logo from \"App/js/logo.js\";\nimport Fullscreen from \"./js/fullscreen\";\nimport ajax from \"App/js/ajax\";\nimport Utils from \"./js/utils\";\nimport * as dayjs from \"dayjs\";\nimport { initTranslations } from \"./config/i18n\";\nimport \"dayjs/locale/pl\";\nimport \"dayjs/locale/en\";\nimport { VIEW_CHANGED } from \"./js/events\";\nimport ActivityTracker from \"./js/activity-tracker\";\nimport VirtualGuide from \"./js/virtual-guide\";\ndayjs.locale(\n [\"pl\", \"en\"].includes(Utils.getProjectLang()) ? Utils.getProjectLang() : \"en\"\n);\n\nconst app = async function () {\n function getFolderId() {\n const projectMatches = window.location.pathname.match(/\\/([^\\?#]*)|&|#|$/);\n if (!projectMatches[1]) {\n return;\n }\n return decodeURIComponent(projectMatches[1]);\n }\n\n function getFromConnection() {\n const value = Utils.getParameterValue(\"from\");\n if (value !== \"\") {\n return value;\n } else {\n return \"\";\n }\n }\n\n window.ooc = {\n t: function (value, data) {\n var tpl = \"\";\n if (typeof langs[lang][value] !== \"undefined\") {\n tpl = langs[lang][value];\n } else {\n tpl = value;\n }\n\n if (data) {\n var parsed = tpl;\n Object.keys(data).forEach((key) => {\n const replacer = data[key];\n parsed = parsed.replace(\"{\" + key + \"}\", replacer);\n });\n\n return parsed;\n }\n\n return tpl;\n },\n };\n\n const minimalMode = Utils.getParameterValue(\"min\", null) !== null;\n const project = getFolderId();\n const lang = Utils.getProjectLang() == \"en\" ? \"en\" : \"pl\";\n const from = getFromConnection();\n\n const configUrl =\n window.storageUrl + \"/\" + project + \"/config?ts=\" + Date.now();\n let config = null;\n try {\n config = await ajax.get(configUrl);\n } catch (err) {\n console.warn(err);\n config = err.request.status;\n }\n\n try {\n const embedDataResponse = await fetch(\n `${window.apiUrl}/api/group/user/${config.UserId}/embed-data`\n );\n const embedData = await embedDataResponse.json();\n config.OwnerAvatarUrl = embedData?.ownerAvatarUrl;\n config.UserName = embedData?.userName;\n } catch (err) {\n console.warn(err);\n }\n\n const autorotate =\n Utils.getParameterValue(\"na\", null) == null && config.AutorotationEnabled;\n const noChat = !(\n Utils.getParameterValue(\"nc\", false) == null && config.ChatEnabled\n );\n const noLead = !(\n Utils.getParameterValue(\"hl\", false) == null && config.ContactFormEnabled\n );\n const showNadir =\n Utils.getParameterValue(\"hn\", false) == null && !config.HideNadir;\n const webView = Utils.getParameterValue(\"wv\", false) == null;\n\n const viewer = new VirtualWalk(\n project,\n Store,\n {\n minimalMode,\n autorotate,\n showNadir,\n },\n config\n );\n if (viewer.viewer) {\n const controls = new Controls(viewer.viewer);\n Bus.subscribe(INTRO_CLOSED, () => {\n var folderId = project.match(\n /^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-5][0-9a-f]{3}-?[089ab][0-9a-f]{3}-?[0-9a-f]{12}-([0-9]+)$/\n )[1];\n\n // show logo\n if (!minimalMode) {\n const logo = new Logo(\n viewer.project,\n viewer.project.Logo ? \"Logo\" : \"GroupLogoUrl\",\n \".logo\"\n );\n logo.show();\n }\n\n if (webView) {\n new Fullscreen(\".fullscreen\");\n } else {\n document.querySelector(\".fullscreen\").style.display = \"none\";\n }\n\n // enable chat module\n const chat = new Chat(\".chat2\", project, folderId, Store, from, {\n leadPage: viewer.project.IsLeadPage,\n //leadPage: true,\n mls: minimalMode,\n nc: noChat,\n nl: noLead,\n ownerAvatar: config?.OwnerAvatarUrl,\n });\n\n if (!minimalMode) {\n const linker = new MarzipanoLinker();\n chat.setChatBtnClickCallback(function () {\n viewer.stopAutorotate();\n });\n linker.setViewer(viewer, (data) => {\n Bus.post(VIEW_CHANGED, data);\n chat.sendCaptureData.bind(chat);\n });\n chat.linker = linker;\n }\n\n // Activity tracker\n const activityTracker = new ActivityTracker(config);\n // Virtual guide\n if (\n !noChat &&\n !Utils.getParameterValue(\"pid\", null) &&\n config?.HasVirtualGuide\n ) {\n const virtualGuide = new VirtualGuide(\n chat,\n activityTracker,\n viewer,\n config\n );\n }\n });\n viewer.load();\n }\n};\n\nconst start = function () {\n var started = false,\n hiddenPropName,\n visibilityChangeEventName;\n if (typeof document.hidden !== \"undefined\") {\n hiddenPropName = \"hidden\";\n visibilityChangeEventName = \"visibilitychange\";\n } else if (typeof document.msHidden !== \"undefined\") {\n hiddenPropName = \"msHidden\";\n visibilityChangeEventName = \"msvisibilitychange\";\n } else if (typeof document.webkitHidden !== \"undefined\") {\n hiddenPropName = \"webkitHidden\";\n visibilityChangeEventName = \"webkitvisibilitychange\";\n }\n\n var innerStart = function (event) {\n var winHeight = window.innerHeight;\n var docHeight = document.body.scrollHeight;\n\n //console.log('innerStart', { event, started, winHeight, docHeight });\n\n if (\n started === false &&\n hiddenPropName &&\n document[hiddenPropName] === false &&\n winHeight > 0 &&\n docHeight > 0\n ) {\n //console.log('app start')\n fetch(\"/initial-settings.json\")\n .then((data) => data.json())\n .then((data) => {\n Object.keys(data || {}).forEach((key) => {\n window[key.charAt(0).toLowerCase() + key.slice(1)] = data[key];\n });\n initTranslations().then((value) => app());\n started = true;\n });\n } else {\n //console.log('app started or iframe is hidden')\n }\n };\n\n //console.log('start', { hiddenPropName, visibilityChangeEventName, started });\n\n if (hiddenPropName && visibilityChangeEventName) {\n document.addEventListener(visibilityChangeEventName, innerStart);\n window.addEventListener(\"resize\", innerStart);\n }\n innerStart();\n};\n\nif (typeof document.addEventListener === \"undefined\") {\n console.error(\"You have an old browser behind.\");\n} else {\n document.addEventListener(\"DOMContentLoaded\", start);\n}\n","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"\";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}