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/SBogers95/rentman.io/resources/assets/js/site/customerLogoSliderHandler.js
/* ==========================================================================
   Customer logos slider handler
   - Slide to next logo.
 ========================================================================== */

export const CustomerLogoSliderHandler = {

    customerLogoSliderArea: null,
    customerLogoSlides: null,
    activeLogo: 2,
    lazyLoadInstance: null,

    init: function (lazyLoadInstance) {

        CustomerLogoSliderHandler.customerLogoSliderArea = document.querySelector('.js-customer-logo-slider');
        CustomerLogoSliderHandler.lazyLoadInstance = lazyLoadInstance;

        // Only continue the init if the customer logo area is found
        if (isset(CustomerLogoSliderHandler.customerLogoSliderArea)) {

            CustomerLogoSliderHandler.replaceSources = CustomerLogoSliderHandler.customerLogoSliderArea.getAttribute('data-replace-source')
            CustomerLogoSliderHandler.hasSwipeEvents = CustomerLogoSliderHandler.customerLogoSliderArea.getAttribute('data-has-swipe-events')

                CustomerLogoSliderHandler.customerLogoSlides = CustomerLogoSliderHandler.customerLogoSliderArea.querySelectorAll('.js-customer-logo-slide');

            if (CustomerLogoSliderHandler.customerLogoSlides.length >= 5 && CustomerLogoSliderHandler.replaceSources === 'true') {
                // debugger

                // Ajax.post('/api/customerLogos/slider', CustomerLogoSliderHandler.getLogoIds(), CustomerLogoSliderHandler._loadCountryBasedLogos);
                Ajax.get('/api/customerLogos/slider', CustomerLogoSliderHandler._loadCountryBasedLogos);

            } else {
                console.log('CustomerLogoSlider: Add more customer logos to the slider');
            }

            CustomerLogoSliderHandler.addEvents();

            if (CustomerLogoSliderHandler.hasSwipeEvents === 'true') {
                CustomerLogoSliderHandler.addSwipeEvents();
            }

        }
    },

    addEvents: function () {

        const next = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.c-customer-logo-slider__button.next');
        const previous = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.c-customer-logo-slider__button.previous');

        next.addEventListener('click', function () {
            CustomerLogoSliderHandler.nextLogo();
            CustomerLogoSliderHandler.updateSlider();
        });
        previous.addEventListener('click', function () {
            CustomerLogoSliderHandler.previousLogo();
            CustomerLogoSliderHandler.updateSlider();
        });
    },

    addSwipeEvents: function () {

        // Swipe interaction
        const swipeGestures = new Hammer(CustomerLogoSliderHandler.customerLogoSliderArea);
        swipeGestures.on('swipeleft', function () {
            CustomerLogoSliderHandler.nextLogo();
            CustomerLogoSliderHandler.updateSlider();
        });

        swipeGestures.on('swiperight', function () {
            CustomerLogoSliderHandler.previousLogo();
            CustomerLogoSliderHandler.updateSlider();
        });

    },


    getLogoIds: function() {

        const customerLogosLength = CustomerLogoSliderHandler.customerLogoSlides.length;
        let customerLogoIds = [];

        for(let i =0; i < customerLogosLength; i++) {

            const customerLogo = CustomerLogoSliderHandler.customerLogoSlides[i];
            const customerLogoId = customerLogo.getAttribute('data-logo-id');
            customerLogoIds.push(customerLogoId);
        }

        return {ids: customerLogoIds};
    },

    finishLoading: function() {
        CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide-container').classList.remove('is-loading');
        CustomerLogoSliderHandler.lazyLoadInstance.update();
    },

    nextLogo: function () {
        // Increment active logo id
        CustomerLogoSliderHandler.activeLogo++;

        // If it's the same as length then reset it to zero
        if (CustomerLogoSliderHandler.activeLogo === CustomerLogoSliderHandler.customerLogoSlides.length) CustomerLogoSliderHandler.activeLogo = 0;
    },

    previousLogo: function () {

        // Decrement active logo id
        CustomerLogoSliderHandler.activeLogo--;

        // If it's below zero reset it to last item
        if (CustomerLogoSliderHandler.activeLogo < 0) CustomerLogoSliderHandler.activeLogo = CustomerLogoSliderHandler.customerLogoSlides.length - 1;

    },

    resetLogosOrder: function() {

        CustomerLogoSliderHandler.customerLogoSlides = CustomerLogoSliderHandler.customerLogoSliderArea.querySelectorAll('.js-customer-logo-slide');
        const customerLogosLength = CustomerLogoSliderHandler.customerLogoSlides.length;
        for(let i = 0; i < customerLogosLength; i++) {
            const customerLogo = CustomerLogoSliderHandler.customerLogoSlides[i];
            customerLogo.setAttribute('data-slide-id', i);
        }

        CustomerLogoSliderHandler.updateSlider();

    },

    updateSlider: function () {

        const previousLocator = CustomerLogoSliderHandler._calcPreviousPositions(3);
        const previouser = CustomerLogoSliderHandler._calcPreviousPositions(2);
        const previous = CustomerLogoSliderHandler._calcPreviousPositions(1);
        const next = CustomerLogoSliderHandler._calcNextPositions(1);
        const nexter = CustomerLogoSliderHandler._calcNextPositions(2);
        const nexterLocator = CustomerLogoSliderHandler._calcNextPositions(3);

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

            const slide = CustomerLogoSliderHandler.customerLogoSlides[i];

            // Reset all possible classes
            slide.classList.remove('c-customer-logo-slider__item--pre-previous');
            slide.classList.remove('c-customer-logo-slider__item--position-1');
            slide.classList.remove('c-customer-logo-slider__item--position-2');
            slide.classList.remove('c-customer-logo-slider__item--position-3');
            slide.classList.remove('c-customer-logo-slider__item--position-4');
            slide.classList.remove('c-customer-logo-slider__item--position-5');
            slide.classList.remove('c-customer-logo-slider__item--pre-next');
            slide.classList.remove('is-hidden');

            switch (i) {
                case previousLocator:
                    slide.classList.add('c-customer-logo-slider__item--pre-previous');
                    break;
                case previouser:
                    slide.classList.add('c-customer-logo-slider__item--position-1');
                    break;
                case previous:
                    slide.classList.add('c-customer-logo-slider__item--position-2');
                    break;
                case CustomerLogoSliderHandler.activeLogo:
                    slide.classList.add('c-customer-logo-slider__item--position-3');
                    break;
                case next:
                    slide.classList.add('c-customer-logo-slider__item--position-4');
                    break;
                case nexter:
                    slide.classList.add('c-customer-logo-slider__item--position-5');
                    break;
                case nexterLocator:
                    slide.classList.add('c-customer-logo-slider__item--pre-next');
                    break;
                default:
                    slide.classList.add('is-hidden');
            }

        }

    },

    _calcPreviousPositions: function($amount) {
        let location = CustomerLogoSliderHandler.activeLogo - $amount;
        if (location < 0) return CustomerLogoSliderHandler.customerLogoSlides.length + location;
        return location
    },

    _calcNextPositions: function($amount) {
        let location = CustomerLogoSliderHandler.activeLogo + $amount;
        if(location >= CustomerLogoSliderHandler.customerLogoSlides.length) return location - CustomerLogoSliderHandler.customerLogoSlides.length;
        return location;

    },

    _loadCountryBasedLogos:function (request) {

        if(request.status === 204) {
            console.log('CustomerLogoSlider: Empty response');
            CustomerLogoSliderHandler.finishLoading();
            return;
        }

        if(request.status !== 200) {
            console.log('CustomerLogoSlider: Unexpected response ' + request.status);
            CustomerLogoSliderHandler.finishLoading();
            return;
        }

        const customerLogoResponse = JSON.parse(request.response);
        const customerLogos = customerLogoResponse.data;

        let customerLogosHtml = '';

        customerLogos.forEach(function (item) {
            customerLogosHtml = CustomerLogoSliderHandler._prepareCustomerLogoHtml(customerLogosHtml, item);

            // Check if a logo is already from generated in the cache / blade
            const alreadyRenderLogo = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide[data-logo-id="' + item.id + '"]');
            if(isset(alreadyRenderLogo)){

                // console.log('delete: ' + item.id);

                // Delete if found because it would be at the end.
                alreadyRenderLogo.remove();
            }
        });

        const customerLogoContainer = CustomerLogoSliderHandler.customerLogoSliderArea.querySelector('.js-customer-logo-slide-container');
        let currentInnerHtml = customerLogoContainer.innerHTML;
        customerLogoContainer.innerHTML = customerLogosHtml + currentInnerHtml;

        CustomerLogoSliderHandler.resetLogosOrder();

        CustomerLogoSliderHandler.finishLoading();
    },

    _prepareCustomerLogoHtml: function(customerLogosHtml, customerLogo) {

        if(isset(customerLogo.url) && customerLogo.url !== '') customerLogosHtml += '<a target="_blank" rel="nofollow noopener noreferrer" href="' + customerLogo.url + '" aria-label="Go to our partners website: ' + customerLogo.url + '" ';
        else customerLogosHtml += '<div';
        customerLogosHtml += ' class="c-customer-logo-slider__item  js-customer-logo-slide" ';
        customerLogosHtml += 'data-slide-id="" data-logo-id="' + customerLogo.id + '">' +
            '<div class="c-customer-logo-slider__logo  js-lazy" data-bg="' + customerLogo.image + '"></div>';

        if(isset(customerLogo.url)  && customerLogo.url !== '') customerLogosHtml += '</a>';
        else customerLogosHtml += '</div>';

        return customerLogosHtml;

    }
};