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';
 | 
						|
});
 |