LittleDemon WebShell


Linux hkvL61zh9Vexzf 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64
Path : /www/wwwroot/fashion-kingdom.com/wp-content/plugins/kitify/assets/js/
File Upload :
Command :
Current File : /www/wwwroot/fashion-kingdom.com/wp-content/plugins/kitify/assets/js/kitify-base.js

(function ($, elementor) {
    "use strict";
    var getElementSettings = function( $element ) {
      var elementSettings = {},
        modelCID 		= $element.data( 'model-cid' );

      if ( isEditMode && modelCID ) {
        var settings     = elementorFrontend.config.elements.data[ modelCID ],
          settingsKeys = elementorFrontend.config.elements.keys[ settings.attributes.widgetType || settings.attributes.elType ];

        jQuery.each( settings.getActiveControls(), function( controlKey ) {
          if ( -1 !== settingsKeys.indexOf( controlKey ) ) {
            elementSettings[ controlKey ] = settings.attributes[ controlKey ];
          }
        } );
      } else {
        elementSettings = $element.data('settings') || {};
      }

      return elementSettings;
    };
    var isEditMode = false;

    function getHeaderHeight(){
        var _height = 0;
        var $stickySection = $('.elementor-location-header .elementor-top-section[data-settings*="sticky_on"]');
        if($stickySection.length){
            _height = $stickySection.innerHeight();
        }
        return _height;
    }

    function checkHeaderHeight(){
        document.documentElement.style.setProperty('--kitify-header-height', getHeaderHeight() + 'px');
    }

    document.addEventListener('DOMContentLoaded', function () {
        document.body.classList.add('kitify--js-ready');
        checkHeaderHeight();
        if(!Kitify.isPageSpeed()){
        Kitify.localCache.validCache(false);
        Kitify.ajaxTemplateHelper.init();
        $('.col-row').each(function (){
            if($(this).closest('[data-kitify_ajax_loadtemplate]').length == 0){
                $(this).trigger('kitify/LazyloadSequenceEffects');
            }
        })
      }
    });
    $(window).on('load', function (){
        $('.template-loaded[data-kitify_ajax_loadtemplate="true"] .col-row').trigger('kitify/LazyloadSequenceEffects');
    });

    $(document).on('kitify/LazyloadSequenceEffects', '.col-row, .swiper-container', function (e){
        var $this = $(this);
        if( $this.hasClass('swiper-container') ){
            Kitify.LazyLoad( $this, {rootMargin: '0px'} ).observe();
        }
        else{
            Kitify.LazyLoad( $('>*', $this), {rootMargin: '0px'} ).observe();
        }
    });
    $(window).on('load resize', checkHeaderHeight);

    $(document).on('kitify/woocommerce/single/init_product_slider', function (e, slider) {
        slider.controlNav.eq(slider.animatingTo).closest('li').get(0).scrollIntoView({
            inline: "center",
            block: "nearest",
            behavior: "smooth"
        });
        slider.viewport.closest('.woocommerce-product-gallery').css('--singleproduct-thumbs-height', slider.viewport.height() + 'px');
    });
    var Kitify = {
        log: function (...data){
            if(window.KitifySettings.devMode === 'true'){
                console.log(...data);
            }
        },
        addedScripts: {},
        addedStyles: {},
        addedAssetsPromises: [],
        carouselInited: [],
        swiperInstances: {},
        localCache: {
            cache_key: typeof KitifySettings.themeName !== "undefined" ? KitifySettings.themeName : 'kitify',
            /**
             * timeout for cache in seconds, default 5 mins
             * @type {number}
             */
            timeout: typeof KitifySettings.cache_ttl !== "undefined" && parseInt(KitifySettings.cache_ttl) > 0 ? parseInt(KitifySettings.cache_ttl) : (60 * 5),
            timeout2: 60 * 10,
            /**
             * @type {{_: number, data: {}}}
             **/
            data:{},
            remove: function (url) {
                delete Kitify.localCache.data[url];
            },
            exist: function (url) {
                return !!Kitify.localCache.data[url] && ((Date.now() - Kitify.localCache.data[url]._) / 1000 < Kitify.localCache.timeout2);
            },
            get: function (url) {
                //Kitify.log('Get cache for ' + url);
                return Kitify.localCache.data[url].data;
            },
            set: function (url, cachedData, callback) {
                Kitify.localCache.remove(url);
                Kitify.localCache.data[url] = {
                    _: Date.now(),
                    data: cachedData
                };
                if ("function" == typeof callback && "number" != typeof callback.nodeType) {
                    callback(cachedData)
                }
            },
            hashCode: function (s){
                var hash = 0;
                s = s.toString();
                if (s.length == 0) return hash;

                for (var i = 0; i < s.length; i++) {
                    var char = s.charCodeAt(i);
                    hash = (hash << 5) - hash + char;
                    hash = hash & hash; // Convert to 32bit integer
                }

                return Math.abs(hash);
            },
            validCache: function ( force ){
                var expiry = typeof KitifySettings.local_ttl !== "undefined" && parseInt(KitifySettings.local_ttl) > 0 ? parseInt(KitifySettings.local_ttl) : 60 * 30; // 30 mins
                var cacheKey = Kitify.localCache.cache_key + '_cache_timeout' + Kitify.localCache.hashCode(KitifySettings.homeURL);
                try{
                    var whenCached = localStorage.getItem(cacheKey);
                    if (whenCached !== null || force) {
                        var age = (Date.now() - whenCached) / 1000;
                        if (age > expiry || force) {
                            Object.keys(localStorage).forEach(function (key) {
                                if (key.indexOf(Kitify.localCache.cache_key) === 0) {
                                    localStorage.removeItem(key);
                                }
                            });
                            localStorage.setItem(cacheKey, Date.now());
                        }
                    } else {
                        localStorage.setItem(cacheKey, Date.now());
                    }
                }
                catch (ex) {
                    Kitify.log(ex);
                }
            }
        },
        isPageSpeed: function () {
            return (typeof navigator !== "undefined" && (/(lighthouse|gtmetrix)/i.test(navigator.userAgent.toLocaleLowerCase()) || /mozilla\/5\.0 \(x11; linux x86_64\)/i.test(navigator.userAgent.toLocaleLowerCase())));
        },
        addQueryArg: function (url, key, value) {
            var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
            var separator = url.indexOf('?') !== -1 ? "&" : "?";

            if (url.match(re)) {
                return url.replace(re, '$1' + key + "=" + value + '$2');
            } else {
                return url + separator + key + "=" + value;
            }
        },
        getUrlParameter: function (name, url) {
            if (!url) url = window.location.href;
            name = name.replace(/[\[\]]/g, "\\$&");
            var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
                results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, " "));
        },
        parseQueryString: function (query) {
            var urlparts = query.split("?");
            var query_string = {};

            if (urlparts.length >= 2) {
                var vars = urlparts[1].split("&");

                for (var i = 0; i < vars.length; i++) {
                    var pair = vars[i].split("=");
                    var key = decodeURIComponent(pair[0]);
                    var value = decodeURIComponent(pair[1]); // If first entry with this name

                    if (typeof query_string[key] === "undefined") {
                        query_string[key] = decodeURIComponent(value); // If second entry with this name
                    } else if (typeof query_string[key] === "string") {
                        var arr = [query_string[key], decodeURIComponent(value)];
                        query_string[key] = arr; // If third or later entry with this name
                    } else {
                        query_string[key].push(decodeURIComponent(value));
                    }
                }
            }

            return query_string;
        },
        removeURLParameter: function (url, parameter) {
            let urlparts = url?.split('?') ?? [];

            if (urlparts.length >= 2) {
                let prefix = encodeURIComponent(parameter) + '=';
                let pars = urlparts[1].split(/[&;]/g); //reverse iteration as may be destructive

                for (let i = pars.length; i-- > 0;) {
                    //idiom for string.startsWith
                    if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                        pars.splice(i, 1);
                    }
                }

                url = urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
                return url;
            } else {
                return url;
            }
        },
        initCarousel: function ($scope) {

            let $carousel = $scope.find('.kitify-carousel').first();

            if ($carousel.length === 0) {
                return;
            }

            const $swiperContainer = $carousel.find('>.swiper-container, >div>.swiper-container').first();

            if ($swiperContainer.length === 0) {
                return;
            }

            if ($carousel.hasClass('inited')) {
                return;
            }

            const totalSlides = $carousel.find('.swiper-wrapper').first().find('.swiper-slide').length;

            $carousel.addClass('inited');

            const isSwiperLatest = elementorFrontendConfig.experimentalFeatures.e_swiper_latest || false;

            let elementSettings = $carousel.data('slider_options'),
                slidesToShow = parseInt(elementSettings.slidesToShow.desktop) || 1,
                elementorBreakpoints = elementorFrontend.config.responsive.activeBreakpoints,
                carousel_id = elementSettings.uniqueID,
                eUniqueId = $carousel.closest('.elementor-element').data('id'),
                e_dRows = parseInt(elementSettings.rows.desktop || 1);

            let swiperOptions = {
                slidesPerView: slidesToShow,
                loop: elementSettings.infinite,
                speed: elementSettings.speed,
                handleElementorBreakpoints: true,
                slidesPerGroup: parseInt(elementSettings.slidesToScroll.desktop || 1),
                loopAdditionalSlides: 1,
                loopFillGroupWithBlank: 1,
                loopedSlides: 4,
                preloadImages: false,
                ...( isSwiperLatest ? {
                    grid: {
                        rows: e_dRows,
                        fill: 'row'
                    }
                } : {
                    slidesPerColumn: e_dRows,
                }),
                ...(e_dRows > 1 ? { rewind: elementSettings.infinite, loop: false } : {})
            }

            swiperOptions.breakpoints = {};

            let lastBreakpointSlidesToShowValue = 1;
            let defaultLGDevicesSlidesCount = 1;
            Object.keys(elementorBreakpoints).reverse().forEach(function (breakpointName) {
                // Tablet has a specific default `slides_to_show`.
                let defaultSlidesToShow = 'tablet' === breakpointName ? defaultLGDevicesSlidesCount : lastBreakpointSlidesToShowValue;
                swiperOptions.breakpoints[elementorBreakpoints[breakpointName].value] = {
                    slidesPerView: +elementSettings.slidesToShow[breakpointName] || defaultSlidesToShow,
                    slidesPerGroup: +elementSettings.slidesToScroll[breakpointName] || 1,
                    ...( isSwiperLatest ? {
                        grid: {
                            rows: +elementSettings.rows[breakpointName] || 1,
                            fill: 'row'
                        }
                    } : {
                        slidesPerColumn: +elementSettings.rows[breakpointName] || 1,
                    } )
                }
                lastBreakpointSlidesToShowValue = +elementSettings.slidesToShow[breakpointName] || defaultSlidesToShow;
            });

            if (elementSettings.autoplay) {
                swiperOptions.autoplay = {
                    delay: (elementSettings.effect === 'slide' && elementSettings.infiniteEffect ? 0 : elementSettings.autoplaySpeed),
                    disableOnInteraction: elementSettings.pauseOnInteraction,
                    pauseOnMouseEnter: elementSettings.pauseOnHover,
                    reverseDirection: elementSettings.reverseDirection || false,
                }
                if(elementSettings.effect === 'slide' && elementSettings.infiniteEffect){
                    swiperOptions.freeMode = {
                        enable: true
                    };
                    $carousel.addClass('kitify--linear-effect');
                    if(swiperOptions.slidesPerView === 1){
                        swiperOptions.slidesPerView = 'auto';
                        swiperOptions.breakpoints = {};
                        $carousel.addClass('kitify--linear-effect-auto');
                    }
                }
            }
            if (elementSettings.centerMode) {
                swiperOptions.centerInsufficientSlides = true;
                swiperOptions.centeredSlides = true;
                swiperOptions.centeredSlidesBounds = false;
            }

            switch (elementSettings.effect) {
                case 'fade':
                    if (slidesToShow === 1) {
                        swiperOptions.effect = elementSettings.effect;
                        swiperOptions.fadeEffect = {
                            crossFade: true
                        };
                    }
                    break;

                case 'coverflow':
                    swiperOptions.effect = 'coverflow';
                    swiperOptions.grabCursor = true;
                    swiperOptions.centeredSlides = true;
                    swiperOptions.slidesPerView = 'auto';
                    swiperOptions.coverflowEffect = {
                        rotate: 50,
                        stretch: 0,
                        depth: 100,
                        modifier: 1,
                        slideShadows: true
                    };
                    swiperOptions.coverflowEffect = $.extend( {}, {
                        rotate: 0,
                        stretch: 100,
                        depth: 100,
                        modifier: 2.6,
                        scale: 1,
                        slideShadows : true
                    }, elementSettings.coverflowEffect )
                    break;

                case 'cube':
                    swiperOptions.effect = 'cube';
                    swiperOptions.grabCursor = true;
                    swiperOptions.cubeEffect = {
                        shadow: true,
                        slideShadows: true,
                        shadowOffset: 20,
                        shadowScale: 0.94,
                    }
                    swiperOptions.slidesPerView = 1;
                    swiperOptions.slidesPerGroup = 1;
                    break;

                case 'flip':
                    swiperOptions.effect = 'flip';
                    swiperOptions.grabCursor = true;
                    swiperOptions.slidesPerView = 1;
                    swiperOptions.slidesPerGroup = 1;
                    break;

                case 'slide':
                    swiperOptions.effect = 'slide';
                    swiperOptions.grabCursor = true;
                    break;

                case 'cards':
                    swiperOptions.effect = 'cards';
                    swiperOptions.grabCursor = true;
                    swiperOptions.cardsEffect = {
                        perSlideOffset: 8,
                        perSlideRotate: 2,
                        rotate: true,
                        slideShadows: true,
                    }
                    break;

                case 'creative':
                    swiperOptions.effect = 'creative';
                    swiperOptions.grabCursor = true;
                    swiperOptions.creativeEffect = {
                        limitProgress: 1,
                        progressMultiplier: 1,
                        prev: {
                            shadow: false,
                            translate: ["-120%", 0, -500],
                        },
                        next: {
                            shadow: false,
                            translate: ["120%", 0, -500],
                        },
                    }
                    break;
            }

            if (elementSettings.arrows) {
                swiperOptions.navigation = {
                    prevEl: elementSettings.prevArrow,
                    nextEl: elementSettings.nextArrow
                };
            }
            if (elementSettings.dots) {

                let _dotType = elementSettings.dotType || 'bullets';
                swiperOptions.pagination = {
                    el: elementSettings.dotsElm || '.kitify-carousel__dots',
                    clickable: true,
                    renderFraction: function ( c, t ){
                        return `<span class="${c}"></span><span>/</span><span class="${t}"></span>`
                    }
                };
                if(_dotType !== 'custom'){
                    swiperOptions.pagination.type = _dotType
                }
                if (_dotType === 'bullets') {
                    swiperOptions.pagination.dynamicBullets = true;
                    swiperOptions.pagination.dynamicMainBullets = 0;
                    swiperOptions.pagination.renderBullet = function (index, className) {
                        return '<span class="' + className + '">' + (index + 1) + "</span>";
                    }
                }
                if (_dotType === 'custom') {
                    swiperOptions.pagination.modifierClass = 'kitify-swiper-pagination-'
                    swiperOptions.pagination.renderBullet = function (t, e) {
                        return '<span class="' + e + '"><svg width="65px" height="65px" viewBox="0 0 72 72" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><circle class="time" stroke-width="5" fill="none" stroke-linecap="round" cx="33" cy="33" r="28"></circle></svg></span>'
                    }
                }
            }

            var enableScrollbar = elementSettings.scrollbar || false;

            if (!enableScrollbar) {
                swiperOptions.scrollbar = false;
            }
            else {
                swiperOptions.scrollbar = {
                    el: '.kitify-carousel__scrollbar_' + eUniqueId,
                    draggable: true
                }
            }

            var _has_slidechange_effect = false,
                _slide_change_effect_in = elementSettings.content_effect_in || 'fadeInUp',
                _slide_change_effect_out = elementSettings.content_effect_out || 'fadeOutDown';

            if (elementSettings.content_selector !== undefined && $carousel.find(elementSettings.content_selector).length > 0) {
                _has_slidechange_effect = true;
            }

            if ($carousel.closest('.no-slide-animation').length || $carousel.closest('.slide-no-animation').length) {
                _has_slidechange_effect = false;
            }

            if (elementSettings.direction) {
                swiperOptions.direction = elementSettings.direction;
            }
            if (elementSettings.autoHeight) {
                swiperOptions.autoHeight = elementSettings.autoHeight
            }
            swiperOptions.watchSlidesProgress = true;
            swiperOptions.watchSlidesVisibility = true;
            swiperOptions.parallax = true;

            if(typeof elementSettings.asFor !== "undefined" && elementSettings.asFor.trim() !== ''){
                swiperOptions.slideToClickedSlide = true;
            }

            const Swiper = elementorFrontend.utils.swiper;

            $('.swiper-slide .kitify-has-entrance-animation', $scope).each(function (){
                const _settings = $(this).data('settings');
                const _animationName = elementorFrontend.getCurrentDeviceSetting(_settings, '_animation') || elementorFrontend.getCurrentDeviceSetting(_settings, 'animation');
                delete _settings?._animation;
                delete _settings?.animation;
                _settings.n_animation = _animationName;
                this.setAttribute('data-settings', JSON.stringify(_settings))
            });

            const slideContentAnimation_cb = ( _deactivateSlides, _activateSlides ) => {
                _activateSlides.forEach( _slide => {
                    _slide.querySelectorAll('.kitify-has-entrance-animation').forEach( _animation_item => {
                        let _settings = JSON.parse(_animation_item.getAttribute('data-settings'));
                        let _animationName = elementorFrontend.getCurrentDeviceSetting(_settings, 'n_animation') || elementorFrontend.getCurrentDeviceSetting(_settings, '_animation') || elementorFrontend.getCurrentDeviceSetting(_settings, 'animation');
                        let _animationDelay = elementorFrontend.getCurrentDeviceSetting(_settings, '_animation_delay') || elementorFrontend.getCurrentDeviceSetting(_settings, 'animation_delay') || 0;
                        if(_animationName === 'none'){
                            _animation_item.classList.remove('elementor-invisible')
                        }
                        else{
                            setTimeout( () => {
                                _animation_item.classList.remove('elementor-invisible')
                                _animation_item.classList.add('animated', _animationName)
                            }, _animationDelay )
                        }
                    } )
                    _slide.querySelectorAll('.elementor-background-video-hosted')?.forEach( (_video) => {
                        _video?.play()
                    } )
                } );

                _deactivateSlides.forEach( _slide => {
                    _slide.querySelectorAll('.kitify-has-entrance-animation').forEach( _animation_item => {
                        let _settings = JSON.parse(_animation_item.getAttribute('data-settings'));
                        let _animationName = elementorFrontend.getCurrentDeviceSetting(_settings, 'n_animation') || elementorFrontend.getCurrentDeviceSetting(_settings, '_animation') || elementorFrontend.getCurrentDeviceSetting(_settings, 'animation');
                        if(_animationName === 'none'){
                            _animation_item.classList.remove('animated')
                            _animation_item.classList.add('elementor-invisible')
                        }
                        else{
                            _animation_item.classList.add('elementor-invisible')
                            _animation_item.classList.remove('animated', _animationName)
                        }
                    } )
                    _slide.querySelectorAll('.elementor-background-video-hosted')?.forEach( (_video) => {
                        _video?.pause()
                    } )
                } )
                if (_has_slidechange_effect) {
                    _deactivateSlides.forEach( _slide => {
                        _slide.querySelectorAll(elementSettings.content_selector).forEach( _selector => {
                            _selector.classList.add('no-effect-class', _slide_change_effect_out)
                            _selector.classList.remove(_slide_change_effect_in)
                        } )
                    })
                    _activateSlides.forEach( _slide => {
                        _slide.querySelectorAll(elementSettings.content_selector).forEach( _selector => {
                            _selector.classList.remove('no-effect-class', _slide_change_effect_out)
                            _selector.classList.add(_slide_change_effect_in)
                        } )
                    })
                }
            }

            $swiperContainer.trigger('kitify/LazyloadSequenceEffects');

            $carousel.css({
                '--totalSlides': totalSlides,
                '--swiperSpeed': `${swiperOptions.speed}ms`
            });

            if(elementSettings?.variableWidth){
                swiperOptions.slidesPerView = 'auto';
                swiperOptions.loopedSlides = null;
                swiperOptions.loopPreventsSlide = false;
                swiperOptions.breakpoints = {};
                swiperOptions.on = {
                    init: function ( ) {
                        const swiper = this;
                        setTimeout( () => {
                            let _cheight = $('.swiper-slide-active', swiper.$el).first().innerHeight();
                            swiper.el.style.setProperty('--swiperHeight', _cheight + 'px');
                        }, 300)
                    },
                    resize: function ( ) {
                        const swiper = this;
                        setTimeout( () => {
                            let _cheight = $('.swiper-slide-active', swiper.$el).first().innerHeight();
                            swiper.el.style.setProperty('--swiperHeight', _cheight + 'px');
                        }, 50)
                    }
                }
            }

            swiperOptions.on = {
                ...swiperOptions?.on,
                beforeInit: ( _swiper ) => {
                    if(isSwiperLatest){
                        let _classFB = ['swiper-container', 'swiper-container-initialized'];
                        _classFB.push(`swiper-container-${_swiper.params.direction}`);
                        _classFB.push(`swiper-container-${_swiper.params.effect}`);
                        if( ['coverflow', 'cube', 'flip', 'creative', 'creative'].includes(_swiper.params.effect) ) {
                            _classFB.push('swiper-container-3d');
                        }
                        if( _swiper.params.autoHeight ){
                            _classFB.push('swiper-container-autoheight');
                        }
                        $swiperContainer.addClass(_classFB)
                    }
                },
                afterInit: ( _swiper ) => {
                    $('.swiper-slide-duplicate .kitify-embla_wrap.embla--inited', _swiper.$wrapperEl).removeClass('embla--inited').trigger('kitify/init-embla-slider');
                },
                changeDirection: function( ) {
                    if(isSwiperLatest){
                        $swiperContainer.removeClass('swiper-container-horizontal swiper-container-vertical').addClass(`swiper-container-${this.params.direction}`)
                    }
                },
                beforeResize: function (){
                    $('>.swiper-slide', this.$wrapperEl).css('width', '')
                },
                slideChangeTransitionEnd: function (){
                    const _swiper = this;
                    let _slides = [];
                    if(isSwiperLatest){
                        _slides = _swiper.slides;
                    }
                    else{
                        for (let i = 0; i < _swiper.slides.length; i += 1) {
                            _slides.push(_swiper.slides[i])
                        }
                    }
                    let _deactivateSlides = _slides.filter( (_item, _idx) => {
                        let _flag = !_swiper.visibleSlidesIndexes.includes(_idx);
                        if(_swiper.params.slidesPerView !== 'auto' && _swiper.params.slidesPerView > 1 && (_item.classList.contains('swiper-slide-duplicate-prev') || _item.classList.contains('swiper-slide-duplicate-next'))){
                            _flag = false;
                        }
                        return _flag;
                    });
                    let _activeSlides = _slides.filter( (_item, _idx) => {
                        return _swiper.visibleSlidesIndexes.includes(_idx)
                    });
                    slideContentAnimation_cb(_deactivateSlides, _activeSlides);

                },
                slideChange: function (){
                    const _swiper = this;
                    $('[data-carousel-goto="#'+carousel_id+'"]').removeClass('s-active');
                    $('[data-carousel-goto="#'+carousel_id+'"][data-carousel-index="'+_swiper.realIndex+'"]').addClass('s-active');
                },
                transitionStart: (_swiper) => {
                    if(elementSettings?.variableWidth){
                        setTimeout(() => {
                            _swiper.update()
                        }, 50)
                    }
                }
            };

            if( $scope.hasClass('elementor-kitify-portfolio') && $('.preset-grid-2b, .preset-grid-2b', $scope).length > 0){
                swiperOptions.autoHeight = false;
                for (const _bkp_key in swiperOptions.breakpoints) {
                    swiperOptions.breakpoints[_bkp_key].autoHeight = elementorBreakpoints?.mobile?.value === parseInt(_bkp_key)
                }
            }

            swiperOptions = elementorFrontend.hooks.applyFilters('kitify/carousel/options', swiperOptions, $scope, carousel_id);
            
            new Swiper($swiperContainer, swiperOptions).then(function (SwiperInstance) {

                Kitify.swiperInstances[carousel_id] = SwiperInstance

                if(elementSettings?.variableWidth || elementSettings?.infiniteEffect){
                    SwiperInstance.update()
                }

                Kitify.carouselInited.push({
                    id: carousel_id,
                    syncWith: elementSettings.asFor,
                    thumbs: elementSettings.thumbs
                })

                $swiperContainer.data('swiper', SwiperInstance);

                if(SwiperInstance?.pagination?.bullets?.length < 5){
                    SwiperInstance?.pagination?.$el?.addClass('no-bullets-dynamic');
                }

                if(elementSettings.autoplay && elementSettings.pauseOnHover && typeof SwiperInstance.autoplay !== "undefined" && typeof SwiperInstance.autoplay.onMouseEnter === "undefined"){
                    $swiperContainer.on('mouseenter', function (){
                        SwiperInstance.autoplay.stop();
                    }).on('mouseleave', function (){
                        SwiperInstance.autoplay.start();
                    });
                }

                if(elementSettings.autoHeight){
                    SwiperInstance.wrapperEl.style.height = 'auto';
                }

                $carousel.css('--data-autoplay-speed', SwiperInstance.params.autoplay.delay + 'ms');

                $swiperContainer.find('.e-parent').trigger('kitify/section/calculate-container-width');

                Kitify.carouselInited.forEach( _syncItem => {
                    if(_syncItem?.synced !== true && _syncItem?.syncWith !== ''){
                        const _c = _syncItem?.syncWith?.split(',')?.map( _a => _a?.trim())?.filter( _b => _b !== '' )
                        const _ok = _c?.filter( (_d) => {
                            return Kitify.carouselInited.filter( _e => _e.id === _d ).length > 0
                        })
                        if(_c?.length > 0 && _c?.length === _ok?.length){
                            _syncItem.synced = true;
                            let _main_instance = Kitify.swiperInstances[_syncItem.id]
                            let _synced = _ok?.map( _e => Kitify.swiperInstances[_e] )
                            _main_instance.controller.control = _synced
                        }
                    }
                    if(_syncItem?.syncedThumbs !== true && _syncItem?.thumbs !== '' && Kitify.swiperInstances[_syncItem?.thumbs]){
                        const _mainS = Kitify.swiperInstances[_syncItem.id],
                            _thumbS = Kitify.swiperInstances[_syncItem.thumbs];
                        _thumbS.params.slideToClickedSlide = true
                        _thumbS.update()
                        _mainS.params.thumbs.swiper = _thumbS
                        _mainS.update()
                        _mainS.thumbs.init()
                        _mainS.thumbs.update()
                        _syncItem.syncedThumbs = true;
                    }
                })

                if (_has_slidechange_effect) {
                    $carousel.find(elementSettings.content_selector).addClass('animated no-effect-class');
                    $carousel.find('.swiper-slide-visible ' + elementSettings.content_selector).removeClass('no-effect-class').addClass(_slide_change_effect_in);
                }

                $('.elementor-motion-effects-element', $scope).trigger('resize');

                $(document).trigger('kitify/carousel/init_success', { swiperContainer: $swiperContainer, SwiperInstance: SwiperInstance, parentContainer: $scope });
            });

        },
        initMasonry: function ($scope) {
            var $container = $scope.find('.kitify-masonry-wrapper').first();

            if ($container.length == 0) {
                return;
            }

            var $list_wrap = $scope.find($container.data('kitifymasonry_wrap')),
                itemSelector = $container.data('kitifymasonry_itemselector'),
                $advanceSettings = $container.data('kitifymasonry_layouts') || false,
                $itemsList = $scope.find(itemSelector),
                $masonryInstance,
                _configs;

            if ($list_wrap.length) {

                if ($advanceSettings !== false) {
                    $(document).trigger('kitify/masonry/calculate-item-sizes', [$container, false]);
                    $(window).on('resize', function () {
                        $(document).trigger('kitify/masonry/calculate-item-sizes', [$container, true]);
                    });
                    _configs = {
                        itemSelector: itemSelector,
                        percentPosition: true,
                        masonry: {
                            columnWidth: 1,
                            gutter: 0,
                        },
                    }
                } else {
                    _configs = {
                        itemSelector: itemSelector,
                        percentPosition: true,
                    }
                }

                $masonryInstance = $list_wrap.isotope(_configs);

                $('img', $itemsList).imagesLoaded().progress(function (instance, image) {
                    var $image = $(image.img),
                        $parentItem = $image.closest(itemSelector);
                    $parentItem.addClass('item-loaded');
                    if ($masonryInstance) {
                        $masonryInstance.isotope('layout');
                    }
                });
            }
        },
        initCustomHandlers: function () {
            $(document)
                .on('click', '.kitify .kitify-pagination_ajax_loadmore a', function (e){
                    e.preventDefault();
                    if ($('body').hasClass('elementor-editor-active')) {
                        return false;
                    }
                    var $kitWrap,$parentContainer, $container, ajaxType, $parentNav, widgetId, itemSelector;
                    $parentNav = $(this).closest('.kitify-pagination');
                    $kitWrap = $(this).closest('.kitify');
                    widgetId = $kitWrap.data('id');

                    if ($parentNav.hasClass('doing-ajax')) {
                        return false;
                    }

                    ajaxType = 'load_widget';
                    if($kitWrap.find('div[data-widget_current_query="yes"]').length > 0){
                        ajaxType = 'load_fullpage';
                    }

                    if($kitWrap.hasClass('elementor-kitify-wooproducts')){
                        $container = $kitWrap.find('.kitify-products__list');
                        $parentContainer = $kitWrap.find('.kitify-products');
                        itemSelector = '.kitify-product.product_item';
                    }
                    else{
                        $container = $($parentNav.data('container'));
                        $parentContainer = $($parentNav.data('parent-container'));
                        itemSelector = $parentNav.data('item-selector');
                    }

                    if ($('a.next', $parentNav).length) {
                        $parentNav.addClass('doing-ajax');
                        $parentContainer.addClass('doing-ajax');

                        var success_func = function (response) {
                            var $data = $(response).find('.elementor-element-' + widgetId + ' ' + itemSelector);

                            if ($parentContainer.find('.kitify-carousel').length > 0) {
                                var swiper = $parentContainer.find('.kitify-carousel').get(0).swiper;
                                swiper.appendSlide($data);
                            }
                            else if ($container.data('isotope')) {
                                $container.append($data);
                                $container.isotope('insert', $data);
                                $(document).trigger('kitify/masonry/calculate-item-sizes', [$parentContainer, true]);

                                $('img', $data).imagesLoaded().progress(function (instance, image) {
                                    var $image = $(image.img),
                                        $parentItem = $image.closest(itemSelector);
                                    $parentItem.addClass('item-loaded');
                                    $container.isotope('layout');
                                });
                            }
                            else {
                                $data.addClass('fadeIn animated').appendTo($container);
                            }

                            $parentContainer.removeClass('doing-ajax');
                            $parentNav.removeClass('doing-ajax kitify-ajax-load-first');

                            if ($(response).find( '.elementor-element-' + widgetId + ' .kitify-ajax-pagination').length) {
                                var $new_pagination = $(response).find( '.elementor-element-' + widgetId + ' .kitify-ajax-pagination');
                                $parentNav.replaceWith($new_pagination);
                                $parentNav = $new_pagination;
                            } else {
                                $parentNav.addClass('nothingtoshow');
                            }
                            $('body').trigger('jetpack-lazy-images-load');
                            $(document).trigger('kitify/ajax-loadmore/success', {
                                parentContainer: $parentContainer,
                                contentHolder: $container,
                                pagination: $parentNav
                            });
                        };

                        var url_request = $('a.next', $parentNav).get(0).href.replace(/^\//, '');
                        url_request = Kitify.removeURLParameter(url_request, '_');

                        var ajaxOpts = {
                            url: url_request,
                            type: "GET",
                            cache: true,
                            dataType: 'html',
                            success: function (res) {
                                success_func(res);
                            }
                        };
                        $.ajax(ajaxOpts);
                    }

                })
                .on('click', '.kitify .kitify-ajax-pagination .page-numbers a', function (e){
                    e.preventDefault();
                    if ($('body').hasClass('elementor-editor-active')) {
                        return false;
                    }
                    var $kitWrap,$parentContainer, $container, ajaxType, $parentNav, widgetId, itemSelector, templateId, pagedKey;
                    $parentNav = $(this).closest('.kitify-pagination');
                    $kitWrap = $(this).closest('.kitify');
                    widgetId = $kitWrap.data('id');

                    if ($parentNav.hasClass('doing-ajax')) {
                        return false;
                    }

                    templateId = $kitWrap.closest('.elementor[data-elementor-settings][data-elementor-id]').data('elementor-id');

                    if($kitWrap.hasClass('elementor-kitify-wooproducts')){
                        $container = $kitWrap.find('.kitify-products__list');
                        $parentContainer = $kitWrap.find('.kitify-products');
                        itemSelector = '.kitify-product.product_item';
                        var tmpClass = $parentContainer.closest('.woocommerce').attr('class').match(/\bkitify_wc_widget_([^\s]*)/);
                        if (tmpClass !== null && tmpClass[1]) {
                            pagedKey = 'product-page-' + tmpClass[1];
                        }
                        else{
                            pagedKey = 'paged';
                        }
                    }
                    else{
                        $container = $($parentNav.data('container'));
                        $parentContainer = $($parentNav.data('parent-container'));
                        itemSelector = $parentNav.data('item-selector');
                        pagedKey = $parentNav.data('ajax_request_id');
                    }

                    ajaxType = 'load_widget';
                    if($kitWrap.find('div[data-widget_current_query="yes"]').length > 0){
                        ajaxType = 'load_fullpage';
                        pagedKey = 'paged';
                    }

                    $parentNav.addClass('doing-ajax');
                    $parentContainer.addClass('doing-ajax');

                    var success_func = function (res, israw) {

                        var $response;

                        if(israw){
                            var jsoncontent = JSON.parse(res);
                            var contentraw = jsoncontent['template_content'];
                            $response = $('<div></div>').html(contentraw);
                        }
                        else{
                            $response = $(res);
                        }

                        var $data = $response.find('.elementor-element-' + widgetId + ' ' + itemSelector);

                        if ($parentContainer.find('.kitify-carousel').length > 0) {
                            var swiper = $parentContainer.find('.kitify-carousel').get(0).swiper;
                            swiper.removeAllSlides();
                            swiper.appendSlide($data);
                        }
                        else if ($container.data('isotope')) {
                            $container.isotope('remove', $container.isotope('getItemElements'));
                            $container.isotope('insert', $data);
                            $(document).trigger('kitify/masonry/calculate-item-sizes', [$parentContainer, true]);

                            $('img', $data).imagesLoaded().progress(function (instance, image) {
                                var $image = $(image.img),
                                    $parentItem = $image.closest(itemSelector);
                                $parentItem.addClass('item-loaded');
                                $container.isotope('layout');
                            });
                        }
                        else {
                            $data.addClass('fadeIn animated').appendTo($container.empty());
                        }

                        $parentContainer.removeClass('doing-ajax');
                        $parentNav.removeClass('doing-ajax kitify-ajax-load-first');

                        if ($response.find( '.elementor-element-' + widgetId + ' .kitify-ajax-pagination').length) {
                            var $new_pagination = $response.find( '.elementor-element-' + widgetId + ' .kitify-ajax-pagination');
                            $parentNav.replaceWith($new_pagination);
                            $parentNav = $new_pagination;
                        }
                        else {
                            $parentNav.addClass('nothingtoshow');
                        }

                        if($response.find( '.elementor-element-' + widgetId + ' .woocommerce-result-count').length && $kitWrap.find('.woocommerce-result-count').length){
                            $kitWrap.find('.woocommerce-result-count').replaceWith($response.find( '.elementor-element-' + widgetId + ' .woocommerce-result-count'));
                        }

                        $('html,body').animate({
                            'scrollTop': $parentContainer.offset().top - getHeaderHeight() - 50
                        }, 400);

                        $('body').trigger('jetpack-lazy-images-load');
                        $(document).trigger('kitify/ajax-pagination/success', {
                            parentContainer: $parentContainer,
                            contentHolder: $container,
                            pagination: $parentNav
                        });
                    };

                    var url_request = e.target.href.replace(/^\//, '');

                    if( ajaxType == 'load_widget' ){
                        var _tmpURL = url_request;
                        url_request = Kitify.addQueryArg(KitifySettings.widgetApiUrl, 'template_id', templateId);
                        url_request = Kitify.addQueryArg(url_request, 'widget_id', widgetId);
                        url_request = Kitify.addQueryArg(url_request, 'dev', KitifySettings.devMode);
                        url_request = Kitify.addQueryArg(url_request, pagedKey, Kitify.getUrlParameter(pagedKey, _tmpURL));
                        url_request = Kitify.addQueryArg(url_request, 'kitifypagedkey', pagedKey);
                    }

                    url_request = Kitify.removeURLParameter(url_request, '_');

                    var ajaxOpts = {
                        url: url_request,
                        type: "GET",
                        cache: true,
                        dataType: 'html',
                        ajax_request_id: Kitify.getUrlParameter(pagedKey, url_request),
                        success: function (res) {
                            if(ajaxType == 'load_widget'){
                                success_func(res, true);
                            }
                            else{
                                success_func(res, false);
                            }
                        }
                    };

                    $.ajax(ajaxOpts)

                })
                .on('click', '[data-kitify-element-link]', function (e) {
                    var $wrapper = $(this),
                        data = $wrapper.data('kitify-element-link'),
                        id = $wrapper.data('id'),
                        anchor = document.createElement('a'),
                        anchorReal;

                    anchor.id = 'nova-wrapper-link-' + id;
                    anchor.href = data.url;
                    anchor.target = data.is_external ? '_blank' : '_self';
                    anchor.rel = data.nofollow ? 'nofollow noreferer' : '';
                    anchor.style.display = 'none';

                    document.body.appendChild(anchor);

                    anchorReal = document.getElementById(anchor.id);
                    anchorReal.click();
                    anchorReal.remove();
                })
                .on('click', '.kitify-masonry_filter .kitify-masonry_filter-item', function (e){
                    e.preventDefault();
                    var $wrap = $(this).closest('.kitify-masonry_filter'),
                        $isotopeInstance = $($wrap.data('kitifymasonry_container')),
                        _filter = $(this).data('filter');
                    if (_filter != '*'){
                        _filter = '.' + _filter;
                    }
                    if ($isotopeInstance.data('isotope')) {
                        $(this).addClass('active').siblings('.kitify-masonry_filter-item').removeClass('active');
                        $isotopeInstance.isotope({
                            filter: _filter
                        });
                    }
                })
                .on('kitify/masonry/calculate-item-sizes', function (e, $isotope_container, need_relayout) {
                    var masonrySettings = $isotope_container.data('kitifymasonry_layouts') || false,
                        $isotopeInstance = $isotope_container.find($isotope_container.data('kitifymasonry_wrap'));

                    if (masonrySettings !== false) {
                        var win_w = $(window).width(),
                            selector = $isotope_container.data('kitifymasonry_itemselector');

                        if (win_w > 1023) {
                            $isotope_container.addClass('cover-img-bg');

                            var _base_w = masonrySettings.item_width,
                                _base_h = masonrySettings.item_height,
                                _container_width_base = masonrySettings.container_width,
                                _container_width = $isotope_container.width(),
                                item_per_page = Math.round(_container_width_base / _base_w),
                                itemwidth = Math.floor(_container_width / item_per_page),
                                margin = parseInt($isotope_container.data('kitifymasonry_itemmargin') || 0),
                                dimension = (_base_h ? parseFloat(_base_w / _base_h) : 1),
                                layout_mapping = masonrySettings.layout || [{w: 1, h: 1}];

                            var _idx = 0,
                                _idx2 = 0;

                            $(selector, $isotope_container).each(function () {
                                $(this)
                                    .css({
                                        'width': Math.floor(itemwidth * (layout_mapping[_idx]['w']) - (margin / 2)),
                                        'height': _base_h ? Math.floor(itemwidth / dimension * (layout_mapping[_idx]['h'])) : 'auto'
                                    })
                                    .addClass('kitify-disable-cols-style');
                                    // .attr('data-kitifymansory--item_setting', JSON.stringify({
                                    //     'index': _idx2 + '_' + _idx,
                                    //     'itemwidth': itemwidth,
                                    //     'layout': layout_mapping[_idx]
                                    // }));
                                _idx++;
                                if (_idx == layout_mapping.length) {
                                    _idx2++;
                                    _idx = 0;
                                }
                            });
                        } else {
                            $isotope_container.removeClass('kitify-masonry--cover-bg');
                            $(selector, $isotope_container).css({
                                'width': '',
                                'height': ''
                            }).removeClass('kitify-disable-cols-style');
                        }
                    }
                    if (need_relayout) {
                        if ($isotopeInstance.data('isotope')) {
                            $isotopeInstance.isotope('layout');
                        }
                    }
                })
                .on('keyup', function (e) {
                    if(e.keyCode == 27){
                        $('.kitify-cart').removeClass('kitify-cart-open');
                        $('.kitify-hamburger-panel').removeClass('open-state');
                        $('html').removeClass('kitify-hamburger-panel-visible');
                    }
                })
                .on('kitify/section/calculate-container-width', '.elementor-top-section', function (e){
                    var $scope = $(this);
                    var $child_container = $scope.find('>.e-con-inner');
                    if(!$child_container.length){
                        $child_container = $scope;
                    }
                    $child_container.css('--kitify-section-width', $child_container.width() + 'px');
                    $(window).on('resize', function (){
                        $child_container.css('--kitify-section-width', $child_container.width() + 'px');
                    });
                })
                .on('click', function (e){
                    if( $(e.target).closest('.kitify-cart').length == 0 ) {
                        $('.kitify-cart').removeClass('kitify-cart-open');
                    }
                })
        },
        ImageScrollHandler: function($scope) {
        var elementSettings  = getElementSettings( $scope ),
			      scrollElement    = $scope.find('.kitify-image-scroll-container'),
            scrollOverlay    = scrollElement.find('.kitify-image-scroll-overlay'),
            scrollVertical   = scrollElement.find('.kitify-image-scroll-vertical'),
            imageScroll      = scrollElement.find('.kitify-image-scroll-image img'),
            direction        = elementSettings.direction_type,
            reverse			 = elementSettings.reverse,
            trigger			 = elementSettings.trigger_type,
            transformOffset  = null;

        function startTransform() {
            imageScroll.css('transform', (direction === 'vertical' ? 'translateY' : 'translateX') + '( -' +  transformOffset + 'px)');
        }

        function endTransform() {
            imageScroll.css('transform', (direction === 'vertical' ? 'translateY' : 'translateX') + '(0px)');
        }

        function setTransform() {
            if( direction === 'vertical' ) {
                transformOffset = imageScroll.height() - scrollElement.height();
            } else {
                transformOffset = imageScroll.width() - scrollElement.width();
            }
        }

        if ( trigger === 'scroll' ) {
            scrollElement.addClass('kitify-container-scroll');
            if ( direction === 'vertical' ) {
                scrollVertical.addClass('kitify-image-scroll-ver');
            } else {
                scrollElement.imagesLoaded(function() {
                  scrollOverlay.css( { 'width': imageScroll.width(), 'height': imageScroll.height() } );
                });
            }
        } else {
            if ( reverse === 'yes' ) {
                scrollElement.imagesLoaded(function() {
                    scrollElement.addClass('kitify-container-scroll-instant');
                    setTransform();
                    startTransform();
                });
            }
            if ( direction === 'vertical' ) {
                scrollVertical.removeClass('kitify-image-scroll-ver');
            }
            scrollElement.mouseenter(function() {
                scrollElement.removeClass('kitify-container-scroll-instant');
                setTransform();
                reverse === 'yes' ? endTransform() : startTransform();
            });

            scrollElement.mouseleave(function() {
                reverse === 'yes' ? startTransform() : endTransform();
            });
        }
    },
        isEditMode: function () {
            return Boolean(elementorFrontend.isEditMode());
        },
        mobileAndTabletCheck: function () {
            return ( (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) && (window.innerWidth < 1400) )
        },
        loadStyle: function (style, uri) {

            if (Kitify.addedStyles.hasOwnProperty(style) && Kitify.addedStyles[style] === uri) {
                return style;
            }

            if (!uri) {
                return;
            }

            Kitify.addedStyles[style] = uri;

            return new Promise(function (resolve, reject) {
                var tag = document.createElement('link');

                tag.id = style + '-css';
                tag.rel = 'stylesheet';
                tag.href = uri;
                tag.type = 'text/css';
                tag.media = 'all';
                tag.onload = function () {
                    resolve(style);
                };
                tag.onerror = function () {
                    reject(`Can not load css file "${uri}"`);
                }

                document.head.appendChild(tag);
            });
        },
        loadScriptAsync: function (script, uri, callback, async) {
            if (Kitify.addedScripts.hasOwnProperty(script)) {
                return script;
            }
            if (!uri) {
                return;
            }
            Kitify.addedScripts[script] = uri;
            return new Promise(function (resolve, reject) {
                var tag = document.createElement('script');

                tag.src = uri;
                tag.id = script + '-js';
                tag.async = async;
                tag.onload = function () {
                    resolve(script);
                    if ("function" == typeof callback && "number" != typeof callback.nodeType) {
                        callback();
                    }
                };

                tag.onerror = function () {
                    reject(`Can not load javascript file "${uri}"`);
                    if ("function" == typeof callback && "number" != typeof callback.nodeType) {
                        callback();
                    }
                }

                document.head.appendChild(tag);
            });
        },
        detectWidgetsNotInHeader: function (){
            let itemDetected = ['.elementor-widget-icon-list', '.main-color', '.elementor-icon', '.elementor-heading-title', '.elementor-widget-text-editor', '.elementor-widget-divider', '.elementor-icon-list-item', '.elementor-social-icon', '.elementor-button', '.kitify-nav-wrap', '.kitify-nav', '.menu-item-link-depth-0'];
            let _q = [];
            itemDetected.forEach( _item => _q.push('.kitify-nav__sub ' + _item) );
            document.querySelectorAll(_q.join()).forEach( _item => _item.classList.add('ignore-docs-style') );
            
            $('.elementor-widget-icon-list .elementor-icon-list-item').each(function (){
                var $child_a = $('>a', $(this)),
                    _href = $child_a.attr('href');
                if($(this).closest('.kitify-nav__sub').length && $(this).closest('.menu-item.need-check-active').length){
                    if(window.location.href == _href){
                        $(this).addClass('current-menu-item')
                    }
                }
            })
        },
        isInViewport: function (element) {
            let bounding = element.getBoundingClientRect();
            return (bounding.top >= -element.offsetHeight
                && bounding.left >= -element.offsetWidth
                && bounding.right <= (window.innerWidth || document.documentElement.clientWidth) + element.offsetWidth
                && bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) + element.offsetHeight
            )
        },
        LazyLoad: function (){
            var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
            var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
            var _defaultConfig$option = $.extend({}, {
                    rootMargin: '50px',
                    threshold: 0,
                    load: function load(element) {
                        var base_src = element.getAttribute('data-src') || element.getAttribute('data-lazy') || element.getAttribute('data-lazy-src') || element.getAttribute('data-lazy-original'),
                            base_srcset = element.getAttribute('data-src') || element.getAttribute('data-lazy-srcset'),
                            base_sizes = element.getAttribute('data-sizes') || element.getAttribute('data-lazy-sizes');
                        if (base_src) {
                            element.src = base_src;
                        }
                        if (base_srcset) {
                            element.srcset = base_srcset;
                        }
                        if (base_sizes) {
                            element.sizes = base_sizes;
                        }
                        if (element.getAttribute('data-background-image')) {
                            element.style.backgroundImage = 'url("' + element.getAttribute('data-background-image') + '")';
                        }
                        element.setAttribute('data-element-loaded', true);
                        if (element.classList.contains('jetpack-lazy-image')) {
                            element.classList.add('jetpack-lazy-image--handled');
                        }
                    },
                    complete: function (elm) {}
                }, options),
                rootMargin = _defaultConfig$option.rootMargin,
                threshold = _defaultConfig$option.threshold,
                load = _defaultConfig$option.load,
                complete = _defaultConfig$option.complete; // // If initialized, then disconnect the observer

            var _target_cache = false,
                _counter = 0;

            function onIntersection(load) {
                return function (entries, observer) {
                    entries.forEach(function (entry) {
                        if(entry.isIntersecting){
                            if(_counter > 7){
                                _counter = 0;
                            }
                            if(_target_cache !== entry.target.offsetTop){
                                _counter = 0;
                                _target_cache = entry.target.offsetTop;
                            }
                            else{
                                _counter++;
                            }
                            observer.unobserve(entry.target);
                            entry.target.style.setProperty('--effect-delay', _counter);
                            load(entry.target);
                        }
                    });
                };
            }

            var observer = void 0;

            if ("IntersectionObserver" in window) {
                observer = new IntersectionObserver(onIntersection(load), {
                    rootMargin: rootMargin,
                    threshold: threshold
                });
            }
            return {
                observe: function observe() {
                    if(!selector){
                        return;
                    }
                    for (var i = 0; i < selector.length; i++) {
                        if(selector[i].getAttribute('data-element-loaded') === 'true'){
                            continue;
                        }
                        if (observer) {
                            observer.observe(selector[i]);
                            continue;
                        }
                        load(selector[i]);
                    }
                    complete(selector);
                }
            };
        },
        elementorFrontendInit: function ($container, reinit_global_trigger) {
            if( typeof window.elementorFrontend.hooks === "undefined"){
                return;
            }
            Kitify.detectWidgetsNotInHeader();
            if(reinit_global_trigger){
                $(window).trigger('elementor/frontend/init');
            }
            $container.removeClass('need-reinit-js');
            $container.find('[data-element_type]').each(function () {
                var $this = $(this),
                    elementType = $this.data('element_type');

                if (!elementType) {
                    return;
                }

                try {
                    if ('widget' === elementType) {
                        elementType = $this.data('widget_type');
                        window.elementorFrontend.hooks.doAction('frontend/element_ready/widget', $this, $);
                    }

                    window.elementorFrontend.hooks.doAction('frontend/element_ready/global', $this, $);
                    window.elementorFrontend.hooks.doAction('frontend/element_ready/' + elementType, $this, $);

                } catch (err) {
                    Kitify.log(err);
                    $this.remove();
                    return false;
                }
            });
        },
        initAnimationsHandlers: function ($selector) {
            $selector.find('[data-element_type]').each(function () {
                var $this = $(this),
                    elementType = $this.data('element_type');

                if (!elementType) {
                    return;
                }

                window.elementorFrontend.hooks.doAction('frontend/element_ready/global', $this, $);
            });
        },
        hamburgerPanel: function ($scope) {

            var wid = $scope.data('id'),
                _wid_tpl_id = $scope.find('.kitify-hamburger-panel__content').attr('data-template-id'),
                _need_add_remove = true,
                $wContent = $scope.find('>.elementor-widget-container').clone();

            if( !!$scope.data('hamburgerTemplateId') && ( _wid_tpl_id == $scope.data('hamburgerTemplateId') ) ){
                _need_add_remove = false;
            }
            else{
                $scope.data('hamburgerTemplateId', _wid_tpl_id);
            }

            if ($('.kitify-site-wrapper > .elementor-location-header >.kitify-burger-wrapall').length == 0) {
                $('<div/>').addClass('kitify-burger-wrapall').appendTo($('.kitify-site-wrapper > .elementor-location-header'));
            }

            var $burger_wrap_all = $('.kitify-burger-wrapall');

            if ( _need_add_remove && $('.elementor-element-' + wid, $burger_wrap_all).length) {
                $('.elementor-element-' + wid, $burger_wrap_all).remove();
            }

            var $new_scope = $scope;

            if($scope.closest('.elementor-location-header').length){
                if(_need_add_remove){
                    $('<div/>').addClass('elementor-element elementor-element-' + wid).append($wContent).appendTo($burger_wrap_all);
                }
                $('.kitify.elementor-element-' + wid + ' .kitify-hamburger-panel__instance').remove();
                $new_scope = $('.elementor-element-' + wid, $burger_wrap_all);
                $('.kitify-hamburger-panel__toggle', $new_scope).remove();
            }

            var $panel = $('.kitify-hamburger-panel', $new_scope),
                $toggleButton = $('.kitify-hamburger-panel__toggle', $scope),
                $instance = $('.kitify-hamburger-panel__instance', $new_scope),
                $cover = $('.kitify-hamburger-panel__cover', $new_scope),
                $inner = $('.kitify-hamburger-panel__inner', $new_scope),
                $closeButton = $('.kitify-hamburger-panel__close-button', $new_scope),
                $html = $('html'),
                settings = $panel.data('settings') || {},
                $panelInstance = $('.elementor-element-' + wid + ' .kitify-hamburger-panel');

            if (!settings['ajaxTemplate']) {
                Kitify.elementorFrontendInit($inner, false);
            }

            $toggleButton.on('click', function (e) {
                e.preventDefault();
                if (!$panel.hasClass('open-state')) {
                    $panelInstance.addClass('open-state');
                    $html.addClass('kitify-hamburger-panel-visible');
                    Kitify.initAnimationsHandlers($inner);
                } else {
                    $panelInstance.removeClass('open-state');
                    $html.removeClass('kitify-hamburger-panel-visible');
                }
            });
            $closeButton.on('click', function (e) {
                e.preventDefault();
                if (!$panel.hasClass('open-state')) {
                    $panelInstance.addClass('open-state');
                    $html.addClass('kitify-hamburger-panel-visible');
                    Kitify.initAnimationsHandlers($inner);
                }
                else {
                    $panelInstance.removeClass('open-state');
                    $html.removeClass('kitify-hamburger-panel-visible');
                }
            });

            $(document).on('click.kitifyHamburgerPanel', function (event) {

                if (($(event.target).closest('.kitify-hamburger-panel__toggle').length || $(event.target).closest('.kitify-hamburger-panel__instance').length)
                    && !$(event.target).closest('.kitify-hamburger-panel__cover').length
                ) {
                    return;
                }

                if (!$panel.hasClass('open-state')) {
                    return;
                }

                $('.elementor-element-' + wid + ' .kitify-hamburger-panel').removeClass('open-state');

                if (!$(event.target).closest('.kitify-hamburger-panel__toggle').length) {
                    $html.removeClass('kitify-hamburger-panel-visible');
                }

                event.stopPropagation();
            });
        },
        wooCard: function ($scope) {
            if (window.KitifyEditor && window.KitifyEditor.activeSection) {
                let section = window.KitifyEditor.activeSection,
                    isCart = -1 !== ['cart_list_style', 'cart_list_items_style', 'cart_buttons_style'].indexOf(section);

                $('.widget_shopping_cart_content').empty();
                $(document.body).trigger('wc_fragment_refresh');
            }

            var $target = $('.kitify-cart', $scope),
                $toggle = $('.kitify-cart__heading-link', $target),
                settings = $target.data('settings'),
                firstMouseEvent = true;

            switch (settings['triggerType']) {
                case 'hover':
                    hoverType();
                    break;
                case 'click':
                    clickType();
                    break;
            }

            $target.on('click', '.kitify-cart__close-button', function (event) {
                if (!$target.hasClass('kitify-cart-open-proccess')) {
                    $target.toggleClass('kitify-cart-open');
                }
            });

            function hoverType() {
                var scrollOffset = 0;
                if ('ontouchend' in window || 'ontouchstart' in window) {
                    $target.on('touchstart', function (event) {
                        scrollOffset = $(window).scrollTop();
                    });

                    $target.on('touchend', function (event) {

                        if (scrollOffset !== $(window).scrollTop()) {
                            return false;
                        }

                        var $this = $(this);

                        if ($this.hasClass('kitify-cart-open-proccess')) {
                            return;
                        }

                        setTimeout(function () {
                            $this.toggleClass('kitify-cart-open');
                        }, 10);
                    });

                    $(document).on('touchend', function (event) {

                        if ($(event.target).closest($target).length) {
                            return;
                        }

                        if ($target.hasClass('kitify-cart-open-proccess')) {
                            return;
                        }

                        if (!$target.hasClass('kitify-cart-open')) {
                            return;
                        }

                        $target.removeClass('kitify-cart-open');
                    });
                } else {

                    $target.on('mouseenter mouseleave', function (event) {

                        if (firstMouseEvent && 'mouseleave' === event.type) {
                            return;
                        }

                        if (firstMouseEvent && 'mouseenter' === event.type) {
                            firstMouseEvent = false;
                        }

                        if (!$(this).hasClass('kitify-cart-open-proccess')) {
                            $(this).toggleClass('kitify-cart-open');
                        }
                    });
                }
            }

            function clickType() {
                $toggle.on('click', function (event) {
                    event.preventDefault();

                    if (!$target.hasClass('kitify-cart-open-proccess')) {
                        $target.toggleClass('kitify-cart-open');
                    }
                });
            }
        },
        wooGallery: function ($scope) {
            if (Kitify.isEditMode()) {
                $('.woocommerce-product-gallery', $scope).wc_product_gallery();
            }

            var centerdots_cb = function () {
                if ($scope.find('.flex-viewport').length) {
                    $scope.find('.woocommerce-product-gallery').css('--singleproduct-thumbs-height', $scope.find('.flex-viewport').height() + 'px');
                    if ($scope.find('.woocommerce-product-gallery__trigger').length) {
                        $scope.find('.woocommerce-product-gallery__trigger').appendTo($scope.find('.flex-viewport'));
                    }
                    if ($('.la-custom-badge', $scope).length) {
                        $('.la-custom-badge', $scope).prependTo($scope.find('.flex-viewport'));
                    }
                    if ($('.woocommerce-product-gallery__actions', $scope).length) {
                        $('.woocommerce-product-gallery__actions', $scope).prependTo($scope.find('.flex-viewport'));
                    }
                }

                var $nav = $scope.find('.flex-direction-nav');
                if ($nav.length && $scope.find('.flex-viewport').length) {
                    $nav.appendTo($scope.find('.flex-viewport'))
                }

                var $thumbs = $scope.find('.flex-control-thumbs').get(0);
                if (typeof $thumbs === "undefined" || $scope.find('.kitify-product-images').hasClass('layout-type-wc')) {
                    return;
                }

                var pos = {top: 0, left: 0, x: 0, y: 0};
                var mouseDownHandler = function (e) {
                    $thumbs.style.cursor = 'grabbing';
                    $thumbs.style.userSelect = 'none';

                    pos = {
                        left: $thumbs.scrollLeft,
                        top: $thumbs.scrollTop,
                        // Get the current mouse position
                        x: e.clientX,
                        y: e.clientY,
                    };

                    document.addEventListener('mousemove', mouseMoveHandler);
                    document.addEventListener('mouseup', mouseUpHandler);
                };

                var mouseMoveHandler = function (e) {
                    // How far the mouse has been moved
                    const dx = e.clientX - pos.x;
                    const dy = e.clientY - pos.y;

                    // Scroll the element
                    $thumbs.scrollTop = pos.top - dy;
                    $thumbs.scrollLeft = pos.left - dx;
                };

                var mouseUpHandler = function () {
                    $thumbs.style.cursor = 'grab';
                    $thumbs.style.removeProperty('user-select');

                    document.removeEventListener('mousemove', mouseMoveHandler);
                    document.removeEventListener('mouseup', mouseUpHandler);
                };
                // Attach the handler
                $thumbs.addEventListener('mousedown', mouseDownHandler);
            }
            setTimeout(centerdots_cb, 300);

            function flexdestroy($els) {
                $els.each(function () {
                    var $el = jQuery(this);
                    var $elClean = $el.clone();

                    $elClean.find('.flex-viewport').children().unwrap();
                    $elClean.find('img.zoomImg, .woocommerce-product-gallery__trigger').remove();
                    $elClean
                        .removeClass('flexslider')
                        .find('.clone, .flex-direction-nav, .flex-control-nav')
                        .remove()
                        .end()
                        .find('*').removeAttr('style').removeClass(function (index, css) {
                        // If element is SVG css has an Object inside (?)
                        if (typeof css === 'string') {
                            return (css.match(/\bflex\S+/g) || []).join(' ');
                        }
                    });
                    $elClean.insertBefore($el);
                    $el.remove();
                });

            }

            if ($scope.find('.kitify-product-images').hasClass('layout-type-5') || $scope.find('.kitify-product-images').hasClass('layout-type-6')) {
                flexdestroy($scope.find('.kitify-product-images'));
            }


            var $gallery_target = $scope.find('.woocommerce-product-gallery');

            var data_columns = parseInt($gallery_target.data('columns'));
            if($scope.find('.kitify-product-images').hasClass('layout-type-4')){
                data_columns = parseInt($gallery_target.closest('.elementor-kitify-wooproduct-images').css('--singleproduct-image-column'));
            }

            if ($gallery_target.find('.woocommerce-product-gallery__image').length <= data_columns) {
                $gallery_target.addClass('center-thumb');
                if($scope.find('.kitify-product-images').hasClass('layout-type-4')){
                    flexdestroy($scope.find('.kitify-product-images'));
                    $gallery_target = $scope.find('.woocommerce-product-gallery');
                }
            }
            if( $scope.find('.kitify-product-images').hasClass('layout-type-5') || $scope.find('.kitify-product-images').hasClass('layout-type-6') ){
                $scope.find('.woocommerce-product-gallery__image a').attr('data-elementor-open-lightbox', 'yes');
                $scope.find('.woocommerce-product-gallery__image a').attr('data-elementor-lightbox-slideshow', $scope.data('id'));
            }
            else{
                $scope.find('.woocommerce-product-gallery__image a').attr('data-elementor-open-lightbox', 'no');
            }
            $scope.find('.woocommerce-product-gallery__image').each(function (){
                if( $(this).find('.zoominner').length == 0 ){
                    $(this).wrapInner('<div class="zoomouter"><div class="zoominner"></div></div>');
                }
            })
            var initZoom = function (zoomTarget) {

                var zoom_enabled = $.isFunction($.fn.zoom) && wc_single_product_params.zoom_enabled;
                if (!zoom_enabled) {
                    return;
                }
                var galleryWidth = $gallery_target.width(),
                    zoomEnabled = false,
                    zoom_options;

                if($scope.find('.kitify-product-images').hasClass('layout-type-4')){
                    galleryWidth = $(zoomTarget).width()
                }

                $(zoomTarget).each(function (index, target) {
                    var image = $(target).find('img');

                    if (image.data('large_image_width') > galleryWidth) {
                        zoomEnabled = true;
                        return false;
                    }
                });

                // But only zoom if the img is larger than its container.
                if (zoomEnabled) {

                    try {
                        zoom_options = $.extend({
                            touch: false
                        }, wc_single_product_params.zoom_options);
                    } catch (ex) {
                        zoom_options = {
                            touch: false
                        };
                    }

                    if ('ontouchstart' in document.documentElement) {
                        zoom_options.on = 'click';
                    }

                    zoomTarget.trigger('zoom.destroy');
                    zoomTarget.zoom(zoom_options);

                }
            }

            initZoom($gallery_target.find('.woocommerce-product-gallery__image .zoominner'));
        },
        wooTabs: function ($scope) {
            var $tabs = $scope.find('.wc-tabs-wrapper').first();
            if ($tabs) {
                $tabs.wrapInner('<div class="kitify-wc-tabs--content"></div>');
                $tabs.find('.wc-tabs').wrapAll('<div class="kitify-wc-tabs--controls"></div>');
                $tabs.find('.kitify-wc-tabs--controls').prependTo($tabs);
                $tabs.find('.wc-tab').wrapInner('<div class="tab-content"></div>');
                $tabs.find('.wc-tab').each(function () {
                    var _html = $('#' + $(this).attr('aria-labelledby')).html();
                    $(this).prepend('<div class="wc-tab-title">' + _html + '</div>');
                });
                $('.wc-tab-title a', $tabs).wrapInner('<span></span>');
                $('.wc-tab-title a', $tabs).on('click', function (e) {
                    e.preventDefault();
                    $tabs.find('.wc-tabs').find('li[aria-controls="' + $(this).attr('href').replace('#', '') + '"]').toggleClass('active').siblings().removeClass('active');
                    $(this).closest('.wc-tab').toggleClass('active').siblings().removeClass('active');
                });
                $('.wc-tabs li a', $tabs).on('click', function (e) {
                    var $wrapper = $(this).closest('.wc-tabs-wrapper, .woocommerce-tabs');
                    $wrapper.find($(this).attr('href')).addClass('active').siblings().removeClass('active');
                });
                $('.wc-tabs li', $tabs).removeClass('active');
                $('.wc-tab-title a', $tabs).first().trigger('click');
            }
        },
        SearchAnimate: function ($scope) {
          var $target = $scope.find('#js_header_search_modal');
          if (!$target.length) {
              return;
          }
          $("#js_header_search_modal").animatedModal({
      			animatedIn: 'slideInDown',
      			animatedOut: 'slideOutUp',
      			beforeOpen: function() {
      				window.setTimeout(function () {
      								$(".header-search").addClass('animate');
      				 }, 300);
      				 window.setTimeout(function () {
      								 $(".header-search").addClass('animate-line');
      					}, 1000);
      			},
      		});
        },
        animatedBoxHandler: function ($scope) {

            var $target = $scope.find('.kitify-animated-box'),
                toogleEvents = 'mouseenter mouseleave',
                scrollOffset = $(window).scrollTop(),
                firstMouseEvent = true;

            if (!$target.length) {
                return;
            }

            if ('ontouchend' in window || 'ontouchstart' in window) {
                $target.on('touchstart', function (event) {
                    scrollOffset = $(window).scrollTop();
                });

                $target.on('touchend', function (event) {

                    if (scrollOffset !== $(window).scrollTop()) {
                        return false;
                    }

                    if (!$(this).hasClass('flipped-stop')) {
                        $(this).toggleClass('flipped');
                    }
                });

            } else {
                $target.on(toogleEvents, function (event) {

                    if (firstMouseEvent && 'mouseleave' === event.type) {
                        return;
                    }

                    if (firstMouseEvent && 'mouseenter' === event.type) {
                        firstMouseEvent = false;
                    }

                    if (!$(this).hasClass('flipped-stop')) {
                        $(this).toggleClass('flipped');
                    }
                });
            }
        },

        ajaxTemplateHelper: {

            need_reinit_js : false,

            template_processed : {},

            template_processed_count : 0,

            template_loaded : [],

            total_template : 0,

            processInsertData: function ($el, templateContent, template_id){


                Kitify.ajaxTemplateHelper.template_processed_count++;

                if (templateContent) {
                    $el.html(templateContent);
                    if($el.find('div[data-kitify_ajax_loadtemplate]:not(.template-loaded,.is-loading)').length){
                        Kitify.log('found template in ajax content');
                        Kitify.ajaxTemplateHelper.init();
                    }
                }

                if(Kitify.ajaxTemplateHelper.template_processed_count >= Kitify.ajaxTemplateHelper.total_template && Kitify.ajaxTemplateHelper.need_reinit_js){
                    Kitify.ajaxTemplateHelper.need_reinit_js = false;
                    Promise.all(Kitify.addedAssetsPromises).then(function (value) {
                        // $(window).trigger('elementor/frontend/init');
                        Kitify.elementorFrontendInit($('.need-reinit-js[data-kitify_ajax_loadtemplate="true"]'), false);
                        $('.elementor-motion-effects-element').trigger('resize');
                        $('body').trigger('jetpack-lazy-images-load');
                        //Kitify.log('Kitify.addedAssetsPromises --- FINISHED');

                    }, function (reason){

                        Kitify.log(`An error occurred while insert the asset resources, however we still need to insert content. Reason detail: "${reason}"`);
                        // $(window).trigger('elementor/frontend/init');
                        Kitify.elementorFrontendInit($('.need-reinit-js[data-kitify_ajax_loadtemplate="true"]'), false);
                        $('.elementor-motion-effects-element').trigger('resize');
                        $('body').trigger('jetpack-lazy-images-load');
                        Kitify.log('Kitify.addedAssetsPromises --- ERROR');
                    });
                }

                $(document).trigger('kitify/ajax-load-template/after', {
                    target_id: template_id,
                    contentHolder: $el,
                    parentContainer: $el,
                    response: templateContent
                });
            },
            templateRenderCallback: function ( response, template_id ){
                var templateContent = response['template_content'],
                    templateScripts = response['template_scripts'],
                    templateStyles = response['template_styles'],
                    template_metadata = response['template_metadata'];

                for (var scriptHandler in templateScripts) {
                    if($( '#' + scriptHandler + '-js').length == 0) {
                        Kitify.addedAssetsPromises.push(Kitify.loadScriptAsync(scriptHandler, templateScripts[scriptHandler], '', true));
                    }
                }

                for (var styleHandler in templateStyles) {
                    if($( '#' + styleHandler + '-css').length == 0) {
                        Kitify.addedAssetsPromises.push(Kitify.loadStyle(styleHandler, templateStyles[styleHandler]));
                    }
                }
                document.querySelectorAll('body:not(.elementor-editor-active) div[data-kitify_ajax_loadtemplate][data-cache-id="' + template_id + '"]:not(.template-loaded)').forEach(function (elm) {
                    elm.classList.remove('is-loading');
                    elm.classList.add('template-loaded');
                    elm.classList.add('need-reinit-js');
                    Kitify.ajaxTemplateHelper.processInsertData($(elm), templateContent, template_id);
                });

                var wpbar = document.querySelectorAll('#wp-admin-bar-elementor_edit_page ul');

                if (wpbar && typeof template_metadata['title'] !== "undefined") {
                    setTimeout(function () {
                        var _tid = 'wp-admin-bar-elementor_edit_doc_'+template_metadata['id'];
                        if($('#'+_tid).length == 0){
                            $('<li id="'+_tid+'" class="elementor-general-section"><a class="ab-item" title="'+template_metadata['title']+'" data-title="'+template_metadata['title']+'" href="' + template_metadata['href'] + '"><span class="elementor-edit-link-title">' + template_metadata['title'] + '</span><span class="elementor-edit-link-type">' + template_metadata['sub_title'] + '</span></a></li>').prependTo($(wpbar));
                        }
                    }, 2000);
                }
            },
            init: function (){
                if(KitifySettings.isElementorAdmin){
                    /** do not run if current context is editor **/
                    return;
                }
                Kitify.ajaxTemplateHelper.need_reinit_js = false;
                Kitify.ajaxTemplateHelper.template_loaded = [];
                Kitify.ajaxTemplateHelper.template_processed_count = 0;
                Kitify.ajaxTemplateHelper.total_template = 0;
                Kitify.ajaxTemplateHelper.template_processed = {};

                var templates = document.querySelectorAll('body:not(.elementor-editor-active) div[data-kitify_ajax_loadtemplate]:not(.template-loaded)');
                if (templates.length) {
                    var template_ids = [];
                    var template_exist_ids = [];
                    templates.forEach(function (el) {
                        if (!el.classList.contains('is-loading') && !el.classList.contains('template-loaded')) {
                            el.classList.add('is-loading');
                            var _cache_key = el.getAttribute('data-template-id');
                            if (!template_ids.includes(_cache_key)) {
                                var exits_nodes = document.querySelectorAll('.elementor.elementor-'+_cache_key+'[data-elementor-type]:not([data-elementor-title])');
                                if(exits_nodes.length == 0){
                                    template_ids.push(_cache_key);
                                }
                                else{
                                    template_exist_ids.push(_cache_key);
                                }
                            }
                            el.setAttribute('data-cache-id', _cache_key);
                        }
                    });

                    var arr_ids = [], _idx1 = 0, _idx2 = 0, _bk = 6;

                    var ajaxCalling = function (template_ids){

                        var _ajax_data_sending = {
                            'action': 'kitify_ajax',
                            '_nonce': window.KitifySettings.ajaxNonce,
                            'actions': JSON.stringify({
                                'elementor_template' : {
                                    'action': 'elementor_template',
                                    'data': {
                                        'template_ids': template_ids,
                                        'current_url': window.location.href,
                                        'current_url_no_search': window.location.href.replace(window.location.search, ''),
                                        'dev': window.KitifySettings.devMode
                                    }
                                }
                            })
                        };
                        if(KitifySettings.useFrontAjax == 'true'){
                            _ajax_data_sending['kitify-ajax'] = 'yes';
                            delete _ajax_data_sending['action'];
                        }
                        $.ajax({
                            type: KitifySettings.useFrontAjax == 'true' ? 'GET' : 'POST',
                            url:  KitifySettings.useFrontAjax == 'true' ? window.location.href : window.KitifySettings.ajaxUrl,
                            dataType: 'json',
                            data: _ajax_data_sending,
                            success: function (resp, textStatus, jqXHR) {
                                var responses = resp.data.responses.elementor_template.data;
                                $.each( responses, function( templateId, response ) {
                                    var cached_key = 'kitifyTpl_' + templateId;
                                    var browserCacheKey = Kitify.localCache.cache_key + '_' + Kitify.localCache.hashCode(templateId);
                                    Kitify.localCache.set(cached_key, response);
                                    Kitify.ajaxTemplateHelper.templateRenderCallback(response, templateId);
                                    try{
                                        //Kitify.log('setup browser cache for ' + browserCacheKey);
                                        localStorage.setItem(browserCacheKey, JSON.stringify(response));
                                        localStorage.setItem(browserCacheKey + ':ts', Date.now());
                                    }
                                    catch (ajax_ex1){
                                        Kitify.log('Cannot setup browser cache', ajax_ex1);
                                    }
                                });
                            }
                        });
                    }

                    template_exist_ids.forEach(function (templateId){
                        var exist_tpl = document.querySelector('.elementor.elementor-'+templateId+'[data-elementor-type]');
                        Kitify.ajaxTemplateHelper.need_reinit_js = true;
                        Kitify.ajaxTemplateHelper.templateRenderCallback({
                            'template_content' : exist_tpl.outerHTML,
                            'template_scripts' : [],
                            'template_styles' : [],
                            'template_metadata' : {},
                        }, templateId);
                    });

                    template_ids.forEach(function (templateId){
                        var cached_key = 'kitifyTpl_' + templateId;
                        var cached_key2 = 'kitifyTplExist_' + templateId;

                        if(Kitify.localCache.exist(cached_key2)){
                            if(Kitify.localCache.exist(cached_key)){
                                Kitify.ajaxTemplateHelper.need_reinit_js = true;
                                Kitify.ajaxTemplateHelper.templateRenderCallback(Kitify.localCache.get(cached_key), templateId);
                            }
                            return;
                        }
                        Kitify.localCache.set(cached_key2, 'yes');

                        if(Kitify.localCache.exist(cached_key)){
                            Kitify.ajaxTemplateHelper.need_reinit_js = true;
                            Kitify.ajaxTemplateHelper.templateRenderCallback(Kitify.localCache.get(cached_key), templateId);
                        }
                        else{

                            $(document).trigger('kitify/ajax-load-template/before', {
                                target_id: templateId
                            });

                            var browserCacheKey = Kitify.localCache.cache_key + '_' + Kitify.localCache.hashCode(templateId);
                            var expiry = Kitify.localCache.timeout;
                            try{
                                var browserCached = localStorage.getItem(browserCacheKey);
                                var browserWhenCached = localStorage.getItem(browserCacheKey + ':ts');

                                if (browserCached !== null && browserWhenCached !== null) {
                                    var age = (Date.now() - browserWhenCached) / 1000;
                                    if (age < expiry) {
                                        //Kitify.log(`render from cache for ID: ${templateId} | Cache Key: ${browserCacheKey}`);
                                        Kitify.ajaxTemplateHelper.need_reinit_js = true;
                                        Kitify.ajaxTemplateHelper.templateRenderCallback(JSON.parse(browserCached), templateId);
                                        return;
                                    }
                                    else {
                                        //Kitify.log(`clear browser cache key for ID: ${templateId} | Cache Key: ${browserCacheKey}`);
                                        // We need to clean up this old key
                                        localStorage.removeItem(browserCacheKey);
                                        localStorage.removeItem(browserCacheKey + ':ts');
                                    }
                                }
                                //Kitify.log('run ajaxCalling() for ' + templateId);
                                _idx1++;
                                if(_idx1 > _bk){
                                    _idx1 = 0;
                                    _idx2++;
                                }
                                if( "undefined" == typeof arr_ids[_idx2] ) {
                                    arr_ids[_idx2] = [];
                                }
                                arr_ids[_idx2].push(templateId);
                                Kitify.ajaxTemplateHelper.template_loaded.push(templateId);
                            }
                            catch (ajax_ex) {
                                Kitify.log('Cannot setup browser cache ajaxCalling() for ' + templateId);
                                _idx1++;
                                if(_idx1 == _bk){
                                    _idx1 = 0;
                                    _idx2++;
                                }
                                if( "undefined" == typeof arr_ids[_idx2] ) {
                                    arr_ids[_idx2] = [];
                                }
                                arr_ids[_idx2].push(templateId);
                                Kitify.ajaxTemplateHelper.template_loaded.push(templateId);
                            }
                        }

                    });

                    Kitify.ajaxTemplateHelper.total_template = templates.length;

                    if(arr_ids.length){
                        Kitify.ajaxTemplateHelper.need_reinit_js = true;
                        arr_ids.forEach(function (arr_id){
                            ajaxCalling(arr_id);
                        });
                    }
                }
            }
        },
    };
    var KitifyTools = {

		getElementPercentageSeen: function( $element, offset ) {
			var offsetSettings      = offset || {},
				startOffset         = offsetSettings.start || 0,
				endOffset           = offsetSettings.end || 0,
				viewportHeight      = $( window ).height(),
				viewportStartOffset = viewportHeight * startOffset / 100,
				viewportEndOffset   = viewportHeight * endOffset / 100,
				scrollTop           = $( window ).scrollTop(),
				elementOffsetTop    = $element.offset().top,
				elementHeight       = $element.height(),
				percentage;

			percentage = (scrollTop + viewportHeight + viewportStartOffset - elementOffsetTop) / (viewportHeight + viewportStartOffset + viewportEndOffset + elementHeight);
			percentage = Math.min( 100, Math.max( 0, percentage * 100 ) );

			return parseFloat( percentage.toFixed( 2 ) );
		},

		isRTL: function() {
			return $( 'body' ).hasClass( 'rtl' );
		},

		inArray: function( needle, haystack ) {
			return -1 < haystack.indexOf( needle );
		},

		debounce: function( threshold, callback ) {
			var timeout;

			return function debounced( $event ) {
				function delayed() {
					callback.call( this, $event );
					timeout = null;
				}

				if ( timeout ) {
					clearTimeout( timeout );
				}

				timeout = setTimeout( delayed, threshold );
			};
		},

		getObjectNextKey: function( object, key ) {
			var keys      = Object.keys( object ),
				idIndex   = keys.indexOf( key ),
				nextIndex = idIndex += 1;

			if( nextIndex >= keys.length ) {
				//we're at the end, there is no next
				return false;
			}

			var nextKey = keys[ nextIndex ];

			return nextKey;
		},

		getObjectPrevKey: function( object, key ) {
			var keys      = Object.keys( object ),
				idIndex   = keys.indexOf( key ),
				prevIndex = idIndex -= 1;

			if ( 0 > idIndex ) {
				//we're at the end, there is no next
				return false;
			}

			var prevKey = keys[ prevIndex ];

			return prevKey;
		},

		getObjectFirstKey: function( object ) {
			return Object.keys( object )[0];
		},

		getObjectLastKey: function( object ) {
			return Object.keys( object )[ Object.keys( object ).length - 1 ];
		},

		getObjectValues: function( object ) {
			var values;

			if ( !Object.values ) {
				values = Object.keys( object ).map( function( e ) {
					return object[e]
				} );

				return values;
			}

			return Object.values( object );
		},

		validateEmail: function( email ) {
			var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

			return re.test( email );
		},

		mobileAndTabletcheck: function() {
			var check = false;

			(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);

			return check;
		},

		addThousandCommaSeparator: function ( nStr, separator ) {

			var nStr      = nStr + '',
				separator = separator.toString().replace(/[0-9]/g, ''),
				x         = nStr.split('.'),
				x1        = x[0],
				x2        = x.length > 1 ? '.' + x[1] : '',
				rgx       = /(\d+)(\d{3})/;

			if ( '' === separator )	{
				return nStr;
			}

			while ( rgx.test(x1) ) {
				x1 = x1.replace(rgx, '$1' + separator + '$2');
			}

			return x1 + x2;
		},

		getElementorElementSettings: function( $scope ) {

			if ( window.elementorFrontend && window.elementorFrontend.isEditMode() && $scope.hasClass( 'elementor-element-edit-mode' ) ) {
				return KitifyTools.getEditorElementSettings( $scope );
			}

			return $scope.data( 'settings' ) || {};
		},

		getEditorElementSettings: function( $scope ) {
			var modelCID = $scope.data( 'model-cid' ),
				elementData;

			if ( ! modelCID ) {
				return {};
			}

			if ( ! elementor.hasOwnProperty( 'config' ) ) {
				return {};
			}

			if ( ! elementor.config.hasOwnProperty( 'elements' ) ) {
				return {};
			}

			if ( ! elementor.config.elements.hasOwnProperty( 'data' ) ) {
				return {};
			}

			elementData = elementor.config.elements.data[ modelCID ];

			if ( ! elementData ) {
				return {};
			}

			return elementData.toJSON();
		}
	};

    $(window).on('elementor/frontend/init', function () {

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-advanced-carousel.default', function ($scope) {
            Kitify.initCarousel($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-slides.default', function ($scope) {
            Kitify.initCarousel($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-posts.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-portfolio.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-images-layout.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-team-member.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-testimonials.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });
        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-banner-list.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-instagram-feed.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-wooproduct-datatabs.default', function ($scope) {
            $scope.foundation();
        });
        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-woo-categories.default', function ($scope) {
            Kitify.initCarousel($scope);
        });
        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-scroll-image.default', function ($scope) {
            Kitify.ImageScrollHandler($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-hamburger-panel.default', function ($scope) {
            Kitify.hamburgerPanel($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-menucart.default', function ($scope) {
            Kitify.wooCard($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-animated-box.default', function ($scope) {
            Kitify.animatedBoxHandler($scope);
        });
        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-search.default', function ($scope) {
            Kitify.SearchAnimate($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-wooproducts.default', function ($scope) {
            Kitify.initCarousel($scope);
            Kitify.initMasonry($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-wooproduct-images.default', function ($scope) {
            Kitify.wooGallery($scope);
        });

        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-wooproduct-datatabs.default', function ($scope) {
            Kitify.wooTabs($scope);
        });
        elementorFrontend.hooks.addAction('frontend/element_ready/kitify-image-comparison.default', function ($scope) {
          var $target              = $scope.find( '.kitify-image-comparison__instance' ),
    				instance             = null,
    				imageComparisonItems = $( '.kitify-image-comparison__container', $target ),
    				settings             = $target.data( 'settings' ),
    				elementId            = $scope.data( 'id' );

    			if ( ! $target.length ) {
    				return;
    			}

    			window.juxtapose.scanPage( '.kitify-juxtapose' );


    			Kitify.initCarousel( $scope );
        });
        window.elementorFrontend.hooks.addAction('frontend/element_ready/section', function ($scope) {
            if( $scope.hasClass('elementor-top-section') ) {
                $scope.trigger('kitify/section/calculate-container-width');
            }
        });

        Kitify.initCustomHandlers();

    });

    window.Kitify = Kitify;
    window.KitifyTools = KitifyTools;

    $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
        if (options.cache) {
            //Here is our identifier for the cache. Maybe have a better, safer ID (it depends on the object string representation here) ?
            // on $.ajax call we could also set an ID in originalOptions
            var id = Kitify.removeURLParameter(originalOptions.url, '_') + ("undefined" !== typeof originalOptions.ajax_request_id ? JSON.stringify(originalOptions.ajax_request_id) : "undefined" !== typeof originalOptions.data ? JSON.stringify(originalOptions.data) : '');
            id = Kitify.localCache.hashCode(id.replace(/null$/g, ''));
            options.cache = false;

            options.beforeSend = function () {
                if (!Kitify.localCache.exist(id)) {
                    jqXHR.promise().done(function (data, textStatus) {
                        Kitify.localCache.set(id, data);
                    });
                }
                return true;
            };
        }
    });
    $.ajaxTransport("+*", function (options, originalOptions, jqXHR) {
        //same here, careful because options.url has already been through jQuery processing
        var id = Kitify.removeURLParameter(originalOptions.url, '_') + ("undefined" !== typeof originalOptions.ajax_request_id ? JSON.stringify(originalOptions.ajax_request_id) : "undefined" !== typeof originalOptions.data ? JSON.stringify(originalOptions.data) : '');
        options.cache = false;
        id = Kitify.localCache.hashCode(id.replace(/null$/g, ''));
        if (Kitify.localCache.exist(id)) {
            return {
                send: function (headers, completeCallback) {
                    setTimeout(function () {
                        completeCallback(200, "OK", [Kitify.localCache.get(id)]);
                    }, 50);
                },
                abort: function () {
                    /* abort code, nothing needed here I guess... */
                }
            };
        }
    });

}(jQuery, window.elementorFrontend));

(function ($) {

    class _eContainerHandler extends elementorModules.frontend.handlers.Base {
        _editorInit(){
            setTimeout( () => {
                if(this.$element.data('nesting-level') > 0){
                    this.$element.removeClass('e-root-container elementor-top-section');
                }
                else{
                    this.$element.addClass('e-root-container elementor-top-section');
                    this._FullwidthRight();
                }
            }, 50);
        }
        _FullwidthRight() {
            const $scope = this.$element;
            if( $scope.hasClass('elementor-top-section') ) {
                $scope.trigger('kitify/section/calculate-container-width');
            }
        }
        bindEvents() {
            if(this.isEdit){
                this._editorInit()
            }
            else{
                this._FullwidthRight()
            }
        }
    }

    $( window ).on( 'elementor/frontend/init', () => {
        elementorFrontend.hooks.addAction( 'frontend/element_ready/container', ( $element ) => {
            elementorFrontend.elementsHandler.addHandler( _eContainerHandler, {
                $element,
            } );
        } );
    } );
    
}(jQuery));

LittleDemon - FACEBOOK
[ KELUAR ]