HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/marisrental/boldt.tech/resources/js/site/tabSliderHandler.js
/* ==========================================================================
   Tabslider handler
   - Handles the tabslider component which has the proper classes.
 ========================================================================== */

const TabsliderHandler = {
    tabsliderList : null,
    tabslider : null,
    tabsliderTimeouts: [],
    autoSlideTiming: 5000,

    init: function () {
        TabsliderHandler.tabsliderList = document.querySelectorAll('.js-tabslider');
        const tabsliderListCount = TabsliderHandler.tabsliderList.length;

        if(isset(TabsliderHandler.tabsliderList) && tabsliderListCount !== 0){
            for(let i = 0; i < tabsliderListCount; i++){
                const tabslider = TabsliderHandler.tabsliderList[i];
                TabsliderHandler.initTabslider(tabslider);
            }
        }
    },

    initTabslider: function (tabslider) {

        const container = tabslider.querySelector('.js-tabslider-container');
        // Check if container element exists
        if (container == null) {
            console.error(`There is no container for the content tabs defined.`);
            return;
        }

        let hasAutoSlide = false;
        if( tabslider.getAttribute('data-auto-slide') == 'true' ) {

            if(tabslider.id == '') console.warn('Provide the tabslider with a (unique) id to be able to auto slide');
            else {

                hasAutoSlide = true;
                TabsliderHandler.tabsliderTimeouts['tabslider-' + tabslider.id] = setTimeout(function () {
                    TabsliderHandler.triggerAutoSlide(tabslider);
                }, TabsliderHandler.autoSlideTiming);

            }
        }

        tabslider.addEventListener('click', function (event) {

            // Bail if we didn't click on the trigger element
            if (!event.target.classList.contains('js-tabslider-trigger')) return;

            // Bail if already active
            if (event.target.classList.contains('is-active')) { return; }

            TabsliderHandler.toggleTabslider(event.target.dataset.tabId, tabslider);

            // Only scroll to when tab are below
            if(window.innerWidth < 1200) {
                const activeTabHeading = tabslider.querySelector('.js-tabslider-container .js-tabslider-content.is-active h2');
                ScrollToHandler.scrollToElement(activeTabHeading);
            }

            if(hasAutoSlide) {
                clearTimeout(TabsliderHandler.tabsliderTimeouts['tabslider-' + tabslider.id]);
                TabsliderHandler.tabsliderTimeouts['tabslider-' + tabslider.id] = setTimeout(function () {
                    TabsliderHandler.triggerAutoSlide(tabslider);
                }, TabsliderHandler.autoSlideTiming);
            }

        });
    },

    triggerAutoSlide: function (tabslider) {

        let activeTab = parseInt(tabslider.querySelector('.is-active').getAttribute('data-tab-id'));
        const tabs = tabslider.querySelectorAll('.js-tabslider-container .js-tabslider-content');

        activeTab++;
        if(activeTab > tabs.length) activeTab = 1;

        TabsliderHandler.toggleTabslider(activeTab, tabslider);
        TabsliderHandler.tabsliderTimeouts['tabslider-' + tabslider.id] = setTimeout(function () {
            TabsliderHandler.triggerAutoSlide(tabslider);
        }, TabsliderHandler.autoSlideTiming);
    },

    toggleTabslider: function (tabId, tabslider) {

        const triggers = tabslider.querySelectorAll('.js-tabslider-trigger');
        const tabs = tabslider.querySelectorAll('.js-tabslider-container .js-tabslider-content');
        const images = document.querySelectorAll('.js-tabslider-image');

        // Check if number of triggers and tabs match
        if(triggers.length !== tabs.length) {
            console.error(`There are ${triggers.length} trigger buttons and ${tabs.length} tabs. These must match.`)
        }

        if(isset(triggers) && triggers.length > 0){

            // Loop through all tabs
            for(let i = 0; i < triggers.length; i++){
                const tabsliderTab = tabs[i];
                const tabsliderTrigger = triggers[i];

                tabsliderTrigger.classList.remove('is-active');
                tabsliderTab.classList.remove('is-active');

                if (tabsliderTab.dataset.tabId == tabId) {
                    tabsliderTab.classList.add('is-active');
                    tabsliderTrigger.classList.add('is-active');
                    // event.target.classList.toggle('is-active');
                }

                // Check if images in header are set for the tabslider
                if(images.length > 0) {

                    // Bail if not the first tabslider. Only the first tabslider gets to control the header/hero images
                    if (tabsliderTab.closest('.js-tabslider') !== TabsliderHandler.tabsliderList[0]) { return; }

                    const tabsliderImage = images[i];

                    if(typeof tabsliderImage != 'undefined') {
                        tabsliderImage.classList.remove('is-active');
                        if (tabsliderImage.dataset.tabId === tabId) {
                            tabsliderImage.classList.add('is-active');
                        }
                    }
                    else {
                        console.error(`There are ${triggers.length} trigger buttons and ${images.length} tabslider images. These must match.`);
                    }
                }

            }
        }
    }
};

TabsliderHandler.init();