document.addEventListener('DOMContentLoaded', () => {
    var accessOpen = false;
    var grayscale = false;
    var underline = false;
    const accessBtn = document.getElementById('access-tab');
    const accessCtn = document.getElementById('access-container')

    const elements = document.querySelectorAll('.text-content p, #index-info p, #hyperlink-container, #page-header, .list-title, .list-artists, .list-details, #article-title, #article-text, .page-info-title, .page-info-entry, #article-information, #article-book');
    const elements_underline = document.querySelectorAll('#page-header a, a, .hyperlink, #hyperlink-container a, .hyperlink-header');

    const accessTextIncrease = document.getElementById('access-increase-text-size');
    const accessTextDecrease = document.getElementById('access-decrease-text-size');
    const accessUnderline = document.getElementById('access-underline');
    const accessGrayscale = document.getElementById('access-grayscale');
    const accessReset = document.getElementById('access-reset');

    const accessItems = document.querySelectorAll('.access-item'); // New: Select access items

    // Map to store original font sizes and line heights
    const originalStyles = new Map();

    // Store original styles
    elements.forEach(element => {
        const computedStyle = window.getComputedStyle(element);
        originalStyles.set(element, {
            fontSize: computedStyle.fontSize,
            lineHeight: computedStyle.lineHeight
        });
    });

    accessTextDecrease.addEventListener('click', () => {
        adjustTextSize(0.9)
    });

    accessTextIncrease.addEventListener('click', () => {
        adjustTextSize(1.1)
    });

    accessGrayscale.addEventListener('click', () => {
        if (grayscale) {
            deactivateGS();
            grayscale = false;
        } else {
            activateGS();
            grayscale = true;
        }
    });

    accessUnderline.addEventListener('click', () => {
        if (underline) {
            removeUnderline();
            underline = false;
        } else {
            addUnderline();
            underline = true;
        }
    });

    accessBtn.addEventListener('click', () => {
        if (accessOpen) {
            // close i
            accessCtn.style.display = 'none'
            accessItems.forEach(item => item.classList.remove('animate')); // Remove animation classes
            accessOpen = false;
        } else {
            // open it
            
            setTimeout(() => { // Ensure the display is set before starting the animation
                accessCtn.style.right = '20px'; // Slide in
            }, 10);
             accessCtn.style.display = 'flex';
            animateAccessItems(); // Animate items
            accessOpen = true;
        }
    });

    accessReset.addEventListener('click', () => {
        reset();
    });

    function adjustTextSize(factor) {
        elements.forEach(element => {
            // Get the current font size of the element
            const currentSize = parseFloat(window.getComputedStyle(element, null).getPropertyValue('font-size'));
            // Calculate the new size based on the factor
            const newSize = currentSize * factor;
            // Apply the new size to the element
            element.style.fontSize = `${newSize}px`;
            element.style.lineHeight = `${newSize}px`;
        });  
    }

    function addUnderline() {
        elements_underline.forEach(element => {
            element.style.textDecoration = 'underline';
        });  
    }

    function removeUnderline() {
        elements_underline.forEach(element => {
            element.style.textDecoration = 'none';
        });  
    }

    function activateGS() {
        document.documentElement.style.filter = 'grayscale(1) contrast(150%)';
    }

    function deactivateGS() {
        document.documentElement.style.filter = '';
    }

    function reset() {
        // Reset grayscale and underline
        deactivateGS();
        removeUnderline();

        // Reset text size and line height
        elements.forEach(element => {
            if (originalStyles.has(element)) {
                const { fontSize, lineHeight } = originalStyles.get(element);
                element.style.fontSize = fontSize;
                element.style.lineHeight = lineHeight;
            }
        });

        // Reset flags
        grayscale = false;
        underline = false;
    }

    function animateAccessItems() {
        accessItems.forEach((item, index) => {
            setTimeout(() => {
                item.classList.add('animate');
            }, index * 150); // Stagger animation by 100ms per item
        });
    }
    
});