Current File : /home/pacjaorg/wpt.pacja.org/copwordpres/wp-content/plugins/taber-elementor/js/taber-elementor.js
/**
 * Taber for Elementor
 * Tabs for Elementor editor
 * Exclusively on https://1.envato.market/taber-elementor
 *
 * @encoding        UTF-8
 * @version         1.0.9
 * @copyright       (C) 2018 - 2022 Merkulove ( https://merkulov.design/ ). All rights reserved.
 * @license         Envato License https://1.envato.market/KYbje
 * @contributors    Nemirovskiy Vitaliy (nemirovskiyvitaliy@gmail.com), Cherviakov Vlad (vladchervjakov@gmail.com), Dmitry Merkulov (dmitry@merkulov.design)
 * @support         help@merkulov.design
 **/

"use strict";

/**
 * Mdp taber main object
 * @type {{addTabs: mdpTaber.addTabs, switchTab: mdpTaber.switchTab}}
 */
const mdpTaber = {

    /**
     * Switching tabs method
     * @param wrapperName
     */
    switchTab: function (wrapperName) {

        // Get tabs navigation and content
        const tabsNav = document.querySelectorAll( `.${wrapperName} .mdp-tab-nav-taber` );
        const tabsContent = document.querySelectorAll( `.${wrapperName} .mdp-tab-content-taber` );
        const openTabNumber = parseInt( document.querySelector( `.${wrapperName} .mdp-tabs-wrapper-taber` ).getAttribute( 'data-open' ) ) - 1;
        const toggle = document.querySelector( `.${wrapperName} .mdp-tabs-wrapper-taber` ).getAttribute( 'data-toggle' ) === 'on';
        const showNavigationArrows = document.querySelector( `.${wrapperName} .mdp-tabs-wrapper-taber` ).dataset.showNavArrows;

        const resetActiveTabs = function () {

            tabsContent.forEach(item => {
                item.classList.remove( 'is-active' );
            });

            tabsNav.forEach(item => {
                item.classList.remove( 'is-active' );
            });

        };

        //Resetting active tabs
        resetActiveTabs();

        for( let i = 0; i < tabsNav.length; i++ ) {

            // Set active tab on init
            if ( openTabNumber >= 0 ) {
                if ( tabsNav[ openTabNumber ] && tabsContent[ openTabNumber ] ) {
                    tabsNav[ openTabNumber ].classList.add( 'is-active' );
                    tabsContent[ openTabNumber ].classList.add( 'is-active' );
                }
            }

            tabsNav[i].addEventListener( 'click', () => {

                const isActive = tabsNav[i].classList.contains( 'is-active' );

                resetActiveTabs(); //resetting active tabs on click

                if ( toggle ) {

                    if ( !isActive ) {

                        tabsNav[i].classList.add( 'is-active' );
                        tabsContent[i].classList.add( 'is-active' );

                    }

                } else {

                    tabsNav[i].classList.add( 'is-active' );
                    tabsContent[i].classList.add( 'is-active' );

                }

            } );

        }

        // Tabs scrolling
        this.scrollTabs( wrapperName );

        // Set equal height
        this.setEqualHeight( wrapperName );

        // Add tabs scrolling on navigation arrows click
        if ( showNavigationArrows === 'yes' ) {
            const arrowScrollOffset = document.querySelector( `.${wrapperName} .mdp-tabs-wrapper-taber` )
                .dataset
                .arrowScrollOffset;
            this.navArrowsScroll( wrapperName, arrowScrollOffset );
        }

    },

    /**
     * Adding tabs method
     */
    addTabs: function () {

        const taberWrapper = document.querySelectorAll( '.mdp-taber-elementor-box' );

        for ( let i = 0; i < taberWrapper.length; i++ ) {
            taberWrapper[i].classList.add( 'mdp-taber-elementor-box-' + i );
            this.switchTab( 'mdp-taber-elementor-box-' + i );
        }

    },

    /**
     * Tabs scroll throughout click on navigation arrows
     * @param wrapperName
     * @param scrollOffset
     */
    navArrowsScroll: function ( wrapperName, scrollOffset ) {
        const $nextArrow = document.querySelector( `.${ wrapperName } .mdp-tabs-next-nav` );
        const $previousArrow = document.querySelector( `.${ wrapperName } .mdp-tabs-previous-nav` );
        const $tabsScroll = document.querySelector( `.${ wrapperName } .mdp-taber-scroll` );
        const tabsWidth = $tabsScroll.scrollWidth;
        const $tabsBar = document.querySelector( `.${ wrapperName } .mdp-tabs-nav-taber` );
        const tabsBarWidth = $tabsBar.getBoundingClientRect().width;
        let prevTranslate = 0;

        // Exit if scrolling unnecessary
        if ( tabsWidth <= tabsBarWidth ) {
            $nextArrow.style.display = 'none';
            $previousArrow.style.display = 'none';
            return;
        }

        const clickHandler = isPrevious => {
            prevTranslate = parseInt( $tabsScroll.style.transform.replace( /[()a-zA-Z]/g, "" ) );

            let delta = scrollOffset;

            if ( isPrevious ) { delta *= -1; }

            if ( isNaN( prevTranslate ) ) { prevTranslate = 0 }

            // Exit if dragging more than container width
            let newDelta = prevTranslate - delta;

            if ( $tabsBar.classList.contains( 'mdp-top-center-nav-tabs' ) ||
                $tabsBar.classList.contains( 'mdp-bottom-center-nav-tabs' ) ) {
                if ( tabsWidth - tabsBarWidth <= Math.abs( newDelta ) ) {
                    const offset = tabsWidth - tabsBarWidth;
                    document.querySelector( `.${ wrapperName } .mdp-taber-scroll` )
                        .style
                        .transform = `translateX(${ isPrevious ? offset : offset * -1 }px)`;
                    return;
                }
            } else {
                if ( newDelta > 0 || tabsWidth - tabsBarWidth <= Math.abs( newDelta ) ) {
                    const offset = tabsWidth - tabsBarWidth;
                    document.querySelector( `.${ wrapperName } .mdp-taber-scroll` )
                        .style
                        .transform = `translateX(${ isPrevious ? 0 : offset * -1 }px)`;
                    return;
                }
            }


            // Apply transforms for tabs wrapper
            document.querySelector( `.${ wrapperName } .mdp-taber-scroll` )
                .style
                .transform = `translateX(${ newDelta }px)`;

            prevTranslate = parseInt( $tabsScroll.style.transform.replace( /[()a-zA-Z]/g, "" ) );
        };

        $nextArrow.addEventListener( 'click', () => {
           clickHandler( false );
        } );

        $previousArrow.addEventListener( 'click', () => {
            clickHandler( true );
        } );

    },

    /**
     * Tabs scroll throughout dragging
     * @param wrapperName
     */
    scrollTabs: function ( wrapperName ) {

        const $tabsBar = document.querySelector( `.${ wrapperName } .mdp-tabs-nav-taber` );
        const $tabsScroll = document.querySelector( `.${ wrapperName } .mdp-taber-scroll` );
        const tabsBarWidth = $tabsBar.getBoundingClientRect().width;
        const tabsWidth = $tabsBar.scrollWidth;
        let startX = 0;
        let prevTranslate = 0;

        if ( $tabsBar.classList.contains( 'mdp-top-right-nav-tabs' ) || $tabsBar.classList.contains( 'mdp-bottom-right-nav-tabs' ) ) {
            document.querySelector( `.${ wrapperName } .mdp-taber-scroll` ).style.transform = `translateX(${ -(tabsWidth - tabsBarWidth) }px)`
        }

        // Exit if scrolling is unnecessary
        if ( tabsWidth <= tabsBarWidth ) { return; }

        // Bind mouse events
        $tabsBar.addEventListener( 'mousedown', startDragging, false );
        $tabsBar.addEventListener( 'mouseup', stopDragging, false );
        $tabsBar.addEventListener( 'mouseleave', stopDragging, false );

        // Bind touch events
        $tabsBar.addEventListener( 'touchstart', startDragging, false);
        $tabsBar.addEventListener( 'touchend', stopDragging, false);
        $tabsBar.addEventListener( 'touchcancel', stopDragging, false);

        /**
         * Start dragging
         * @param e
         */
        function startDragging( e ) {

            if ( 'touchstart' === e.type ) {

                startX = e.touches[0].clientX;
                $tabsBar.addEventListener( 'touchmove', moveTabs, false);

            } else {

                startX = e.clientX;
                $tabsBar.addEventListener( 'mousemove', moveTabs, false );

            }

        }

        /**
         * Stop dragging
         * @param e
         */
        function stopDragging( e ) {

            // Un-bind move events
            $tabsBar.removeEventListener( 'mousemove', moveTabs, false );
            $tabsBar.removeEventListener( 'touchmove', moveTabs, false );

            prevTranslate = parseInt( $tabsScroll.style.transform.replace( /[()a-zA-Z]/g, "" ) );

        }

        /**
         * Move tabs
         * @param e
         */
        function moveTabs ( e ) {

            const delta = 'touchmove' === e.type ?
                Math.round( startX - e.touches[0].clientX ) :
                startX - e.clientX;

            // Exit if new delta same as old delta
            const prevDelta = parseInt( $tabsScroll.style.transform.replace( /[()a-zA-Z]/g, "" ) );
            if ( delta === Math.abs( prevDelta ) ) { return; }

            if ( isNaN( prevTranslate ) ) { prevTranslate = 0 }

            // Exit if dragging more than container width
            let newDelta = prevTranslate - delta;

            if ( $tabsBar.classList.contains( 'mdp-top-center-nav-tabs' ) || $tabsBar.classList.contains( 'mdp-bottom-center-nav-tabs' ) ) {
                if ( tabsWidth - tabsBarWidth <= Math.abs( newDelta ) ) { return; }
            } else {
                if ( newDelta > 0 || tabsWidth - tabsBarWidth <= Math.abs( newDelta ) ) { return; }
            }
            // Apply transforms for tabs wrapper
            document.querySelector( `.${ wrapperName } .mdp-taber-scroll` ).style.transform = `translateX(${ newDelta }px)`;

        }

    },

    /**
     * Set height of the max content section for all section
     * @param wrapperName
     */
    setEqualHeight: function ( wrapperName ) {

        const $contentsWrapper = document.querySelector( `.${wrapperName} .mdp-tabs-content-taber` );
        const contents = document.querySelectorAll( `.${wrapperName} .mdp-tab-content-taber` );
        let tabMinHeight = 0;

        // Exit if min-height set in the Elementor
        if ( 'auto' !== window.getComputedStyle( $contentsWrapper ).minHeight ) { return; }

        for ( let singleContent of contents ) {

            // Render for calculate height
            singleContent.classList.add( 'equal-height' );

            // Save height of the longest tab
            if ( tabMinHeight < singleContent.getBoundingClientRect().height ) {

                tabMinHeight = singleContent.getBoundingClientRect().height

            }

            // Hide non-active tabs
            singleContent.classList.remove( 'equal-height' );

        }

        // Set tabs container height equal to longest tab
        document.querySelector( '.mdp-tabs-content-taber' ).style.minHeight = `${tabMinHeight}px`;

    }

};

/**
 * Init for Front-End
 * @param callback
 */
document.addEventListener( 'DOMContentLoaded', mdpTaber.addTabs.bind( mdpTaber ) );
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!