281 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| document.addEventListener('DOMContentLoaded', () => {
 | |
|     let floors = [
 | |
|         /* { number: 0, name: 'Main'},
 | |
|         { number: 1},
 | |
|         { number: 2, code: '1234' },
 | |
|         { number: 3},
 | |
|         { number: 4, code: '5678' },
 | |
|         { number: 5, name: 'Roof'},
 | |
|         { number: 6},
 | |
|         { number: 7},
 | |
|         { number: 8, code: '8765' },
 | |
|         { number: 9},
 | |
|         { number: 10},
 | |
|         { number: 11},
 | |
|         { number: 12, code: '4321' }, */
 | |
|     ];
 | |
| 
 | |
|     const floorColumnsContainer = document.getElementById('floor-columns');
 | |
|     const digit1 = document.getElementById('digit-1');
 | |
|     const digit2 = document.getElementById('digit-2');
 | |
|     const directionUp = document.getElementById('direction-up');
 | |
|     const directionDown = document.getElementById('direction-down');
 | |
|     const stopButton = document.getElementById('stop-button');
 | |
|     const buttonSound = document.getElementById('button-sound');
 | |
|     const arrivalSound = document.getElementById('arrival-sound');
 | |
|     const ambientSound = document.getElementById('ambient-sound');
 | |
|     const modal = document.getElementById('modal');
 | |
|     const closeButton = document.querySelector('.close-button');
 | |
|     const submitPasswordButton = document.getElementById('submit-password');
 | |
|     const passwordInput = document.getElementById('password-input');
 | |
|     const errorMessage = document.getElementById('error-message');
 | |
| 
 | |
|     let currentFloor = 1;
 | |
|     let isAnimating = false;
 | |
|     let activeButton = null;
 | |
|     let animationInterval = null;
 | |
|     let targetFloor = null;
 | |
|     let targetFloorButton = null;
 | |
|     let targetFloorCode = null;
 | |
|     const floorTravelTime = 2500;
 | |
|     const startDelay = 5000;
 | |
| 
 | |
|     // esc
 | |
|     document.addEventListener('keydown', (event) => {
 | |
|         if (event.key === 'Escape') {
 | |
|             if (activeButton) { return; }
 | |
|             closeElevatorUI();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     function closeElevatorUI() {
 | |
|         $.post(`https://${GetParentResourceName()}/CLOSE_UI`);
 | |
|         document.body.classList.add('hidden');
 | |
|         setTimeout(() => {
 | |
|             document.body.style.display = 'none';
 | |
|         }, 500);
 | |
|     }
 | |
| 
 | |
|     function openElevatorUI() {
 | |
|         document.body.style.display = 'flex';
 | |
|         setTimeout(() => {
 | |
|             document.body.classList.remove('hidden');
 | |
|         }, 10);
 | |
|     }
 | |
| 
 | |
|     function createColumn(floors) {
 | |
|         const columnDiv = document.createElement('div');
 | |
|         columnDiv.classList.add('floor-column');
 | |
|         floors.reverse().forEach(floor => {
 | |
|             const button = document.createElement('button');
 | |
|             button.classList.add('floor-button');
 | |
|             button.setAttribute('data-floor', floor.number);
 | |
|             button.textContent = floor.number;
 | |
|             columnDiv.appendChild(button);
 | |
|     
 | |
|             if (floor.name) {
 | |
|                 const tooltip = document.createElement('span');
 | |
|                 tooltip.classList.add('tooltip');
 | |
|                 tooltip.textContent = floor.name;
 | |
|                 button.appendChild(tooltip);
 | |
|             }
 | |
|     
 | |
|             button.addEventListener('click', () => {
 | |
|                 if (activeButton) { return; }
 | |
| 
 | |
|                 targetFloor = parseInt(button.getAttribute('data-floor'));
 | |
|                 targetFloorButton = button;
 | |
|                 targetFloorCode = floor.code;
 | |
| 
 | |
|                 if (floor.code) {
 | |
|                     openModal();
 | |
|                 } else {
 | |
|                     proceedToFloor(button, targetFloor, floor);
 | |
|                 }
 | |
|             });
 | |
|         });
 | |
|         return columnDiv;
 | |
|     }
 | |
| 
 | |
|     function proceedToFloor(button, targetFloor, data) {
 | |
|         if (targetFloor !== currentFloor && !isAnimating) {
 | |
|             $.post(`https://${GetParentResourceName()}/USE_ELEVATOR`, 
 | |
|                 JSON.stringify({ pos: data.pos }
 | |
|             )); 
 | |
| 
 | |
|             buttonSound.pause();
 | |
|             buttonSound.currentTime = 0;
 | |
|             buttonSound.play();
 | |
| 
 | |
|             ambientSound.pause();
 | |
|             ambientSound.currentTime = 0;
 | |
|             ambientSound.play();
 | |
| 
 | |
|             if (activeButton) {
 | |
|                 activeButton.classList.remove('active-floor');
 | |
|             }
 | |
|             button.classList.add('active-floor');
 | |
|             activeButton = button;
 | |
|             setTimeout(() => animateFloorChange(currentFloor, targetFloor, data.pos), startDelay);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function openModal() {
 | |
|         modal.style.display = 'block';
 | |
|         setTimeout(() => {
 | |
|             modal.classList.add('show');
 | |
|             modal.classList.remove('hide');
 | |
|         }, 10);
 | |
|         errorMessage.textContent = '';
 | |
|         passwordInput.value = '';
 | |
|     }
 | |
|     
 | |
|     function closeModal() {
 | |
|         modal.classList.add('hide');
 | |
|         modal.classList.remove('show');
 | |
|         setTimeout(() => {
 | |
|             modal.style.display = 'none';
 | |
|         }, 300);
 | |
|     }
 | |
|     
 | |
|     closeButton.addEventListener('click', closeModal);
 | |
| 
 | |
|     window.addEventListener('click', (event) => {
 | |
|         if (event.target === modal) {
 | |
|             closeModal();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     submitPasswordButton.addEventListener('click', () => {
 | |
|         const inputCode = passwordInput.value;
 | |
|         if (inputCode === targetFloorCode) {
 | |
|             closeModal();
 | |
|             proceedToFloor(targetFloorButton, targetFloor, floors[targetFloor]);
 | |
|         } else {
 | |
|             errorMessage.textContent = 'Incorrect code!';
 | |
|             errorMessage.classList.add('shake');
 | |
|             setTimeout(() => errorMessage.classList.remove('shake'), 300);
 | |
|         }
 | |
|     });    
 | |
| 
 | |
|     const leftColumnFloors = floors.filter((floor, index) => index % 2 === 0);
 | |
|     const rightColumnFloors = floors.filter((floor, index) => index % 2 !== 0);
 | |
| 
 | |
|     floorColumnsContainer.appendChild(createColumn(leftColumnFloors));
 | |
|     floorColumnsContainer.appendChild(createColumn(rightColumnFloors));
 | |
| 
 | |
|     function updateFloorDisplay(floor) {
 | |
|         const floorStr = floor.toString();
 | |
|         if (floorStr.length === 1) {
 | |
|             digit1.textContent = floorStr;
 | |
|             digit2.textContent = '';
 | |
|             digit1.style.left = '60%';
 | |
|         } else {
 | |
|             digit1.textContent = floorStr[0];
 | |
|             digit2.textContent = floorStr[1];
 | |
|             digit1.style.left = '51%';
 | |
|             digit2.style.left = '60%';
 | |
|         }
 | |
| 
 | |
|         if (floor === 1) {
 | |
|             digit1.style.left = '70%';
 | |
|         } else if (floor === 11) {
 | |
|             digit1.style.left = '70%'; 
 | |
|             digit2.style.left = '52%';
 | |
|         } else if (floor === 20) {
 | |
|             digit1.style.left = '40%'; 
 | |
|             digit2.style.left = '60%';
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function animateFloorChange(from, to, pos) {
 | |
|         isAnimating = true;
 | |
|         let step = from < to ? 1 : -1;
 | |
|         if (step === 1) {
 | |
|             directionUp.style.color = 'white';
 | |
|             directionDown.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|         } else {
 | |
|             directionUp.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|             directionDown.style.color = 'white';
 | |
|         }
 | |
| 
 | |
|         animationInterval = setInterval(() => {
 | |
|             currentFloor += step;
 | |
|             updateFloorDisplay(currentFloor);
 | |
| 
 | |
|             if (currentFloor === to) {
 | |
|                 clearInterval(animationInterval);
 | |
|                 directionUp.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|                 directionDown.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|                 isAnimating = false;
 | |
| 
 | |
|                 $.post(`https://${GetParentResourceName()}/TELEPORT`, 
 | |
|                     JSON.stringify({ pos: pos }
 | |
|                 )); 
 | |
| 
 | |
|                 ambientSound.pause();
 | |
| 
 | |
|                 setTimeout(() => {
 | |
|                     arrivalSound.play();
 | |
|                     if (activeButton) {
 | |
|                         activeButton.classList.remove('active-floor');
 | |
|                         activeButton = null;
 | |
|                     }
 | |
|                 }, 500);
 | |
|             }
 | |
|         }, floorTravelTime);
 | |
|     }
 | |
| 
 | |
|     stopButton.addEventListener('click', () => {
 | |
|         buttonSound.currentTime = 0;
 | |
|         buttonSound.play();
 | |
| 
 | |
|         if (isAnimating) {
 | |
|             clearInterval(animationInterval);
 | |
|             directionUp.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|             directionDown.style.color = 'rgba(255, 255, 255, 0.3)';
 | |
|             isAnimating = false;
 | |
|             if (activeButton) {
 | |
|                 $.post(`https://${GetParentResourceName()}/TELEPORT`, 
 | |
|                     JSON.stringify({ pos: floors[currentFloor].pos }
 | |
|                 ));
 | |
|                 ambientSound.pause();
 | |
|                 arrivalSound.play();
 | |
|                 activeButton.classList.remove('active-floor');
 | |
|                 activeButton = null;
 | |
|             }
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     window.addEventListener("message", (event) => {
 | |
|         const data = event.data;
 | |
|         const action = data.action;
 | |
|         if (action === "SHOW_UI") {
 | |
|             const initialData = {
 | |
|                 current: data.current,
 | |
|                 floors: data.floors
 | |
|             };
 | |
|             initializeElevatorUI(initialData);
 | |
|             openElevatorUI()
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     updateFloorDisplay(currentFloor);
 | |
| 
 | |
|     function initializeElevatorUI(data) {
 | |
|         floors = data.floors;
 | |
|         currentFloor = data.current;
 | |
|         floorColumnsContainer.innerHTML = '';
 | |
|     
 | |
|         const leftColumnFloors = floors.filter((floor, index) => index % 2 === 0);
 | |
|         const rightColumnFloors = floors.filter((floor, index) => index % 2 !== 0);
 | |
|     
 | |
|         floorColumnsContainer.appendChild(createColumn(leftColumnFloors));
 | |
|         floorColumnsContainer.appendChild(createColumn(rightColumnFloors));
 | |
|     
 | |
|         updateFloorDisplay(currentFloor);
 | |
|     }
 | |
| 
 | |
|     // close UI on start
 | |
|     document.body.style.display = 'none';
 | |
| });
 | 
