PageSourceSearch

https://cholita.gal/wp-content/plugins/cafe-lite/assets/js/frontend.min.js

js cholita.gal collected 2026-10-08 07:25:26 UTC 111,712 bytes, 2,482 lines download raw bytes

1/**
2 * frontend.js
3 *
4 * @copyright  2018 CleverSoft. All rights reserved.
5 * @license MIT
6 */
7(function ($) {
8    "use strict";
9    var cafe = {
10        init: function () {
11            var wrap = $('.append-class:not(.slick-slider)');
12            cafe.cafe_StickyHeader();
13            cafe.cafe_carousel();
14            cafe.cafe_tabs();
15            cafe.productFilter(wrap);
16            cafe.cafe_category_accordion();
17            cafe.cafe_Tabsfiler_Mobile(992);
18            cafe.cafe_PaginationAjax('.cafe-products-wrap ul.products', '.product', 'a.cafe-pagination-next');
19            cafe.cafe_AjaxSearch();
20            cafe.cafe_AjaxCart();
21            cafe.cafe_AjaxLogin();
22            cafe.cafe_site_nav_menu();
23            cafe.cafe_site_nav_menu_toggle();
24            cafe.cafe_site_nav_widget();
25            cafe.cafe_WipeBanner();
26            cafe.cafe_TextonHover();
27            cafe.cafe_masonry_layout();
28        },
29        //Cafe Text on Hover
30        cafe_TextonHover: function () {
31            if ($('.cafe-text-on-hover')[0]) {
32                $('.cafe-text-on-hover .cafe-text').each(function () {
33                    let $parent = $(this).closest('.cafe-text-on-hover');
34                    if (!!$parent.data('video')) {
35                        $parent.prepend('<div class="cafe-bg-cursor"><video src="' + $parent.data('video') + '" loop muted></div>');
36                    } else {
37                        if (!!$parent.data('image')) {
38                            $parent.prepend('<div class="cafe-bg-cursor" style="background-image: url(' + $parent.data('image') + ')"></div>');
39                        }
40                    }
41                });
42                $(document).on('mousemove', '.cafe-text', function (e) {
43                    let $parent = $(this).closest('.cafe-text-on-hover');
44                    $parent.find('.cafe-bg-cursor').css({
45                        left: e.clientX,
46                        top: e.clientY
47                    });
48                })
49                $(document).on('mouseover', '.cafe-text', function (e) {
50                    let $parent = $(this).closest('.cafe-text-on-hover');
51                    $parent.addClass('active');
52                    if ($parent.find('video')[0]) {
53                        $parent.find('video').get(0).play();
54                    }
55                })
56                $(document).on('mouseout', '.cafe-text', function (e) {
57                    let $parent = $(this).closest('.cafe-text-on-hover');
58                    $parent.removeClass('active');
59                    if ($parent.find('video')[0]) {
60                        $parent.find('video').get(0).pause();
61                        $parent.find('video').get(0).load();
62                    }
63                })
64            }
65        },
66        //Cafe Wipe Banner
67        cafe_WipeBanner: function () {
68            $('.cafe-wiper').each(function () {
69                let total = $(this).find('.cafe-banner-img').length;
70                $(this).find('.cafe-banner-img').each(function () {
71                    $(this).css('z-index', total);
72                    total--;
73                })
74            });
75            $(window).on('scroll', function () {
76                $('.elementor-widget-clever-wipe-banner .cafe-wipe-banner:not(.on-screen)').each(function () {
77                    if ($(window).scrollTop() + $(window).height() * 0.7 > $(this).offset().top) {
78                        $(this).addClass('on-screen');
79                        $(this).find('.wrap-heading .cafe-heading:first-child').addClass('active');
80                        $(this).find('.cafe-banner-img:first-child').addClass('active');
81                        $('body').addClass('disable-scroll');
82                        $('html, body').animate({
83                            scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top
84                        }, 900);
85                    }
86                });
87            });
88            let allScroll = true;
89            $('.elementor-widget-clever-wipe-banner .cafe-wipe-banner').on('mousewheel', function (e) {
90                if (allScroll) {
91                    let $activeItem = $(this).find('.cafe-heading.active');
92                    let $activeImg = $(this).find('.cafe-banner-img.active');
93                    if (e.deltaY < 0) {
94                        if ($activeItem.next()[0]) {
95                            $activeItem.removeClass('active').addClass('after-active');
96                            $activeItem.next().addClass('active');
97                            $activeImg.removeClass('active').addClass('after-active');
98                            $activeImg.next().addClass('active');
99                            $('body:not(.disable-scroll)').addClass('disable-scroll');
100                            if ($(window).scrollTop() < $(this).closest('.elementor-widget-clever-wipe-banner').offset().top) {
101                                $('html, body').animate({
102                                    scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top
103                                }, 900);
104                            }
105                        } else {
106                            $('body').removeClass('disable-scroll');
107                        }
108                    } else {
109                        if ($activeItem.prev()[0]) {
110                            $activeItem.prev().removeClass('after-active').addClass('active');
111                            $activeItem.removeClass('active');
112                            $activeImg.prev().removeClass('after-active').addClass('active');
113                            $activeImg.removeClass('active');
114                            $('body:not(.disable-scroll)').addClass('disable-scroll');
115                            if ($(window).scrollTop() > $(this).closest('.elementor-widget-clever-wipe-banner').offset().top) {
116                                $('html, body').animate({
117                                    scrollTop: $(this).closest('.elementor-widget-clever-wipe-banner').offset().top
118                                }, 900);
119                            }
120                        } else {
121                            $('body').removeClass('disable-scroll');
122                        }
123                    }
124                    allScroll = false;
125                    setTimeout(function () {
126                        allScroll = true;
127                    }, 900)
128                }
129            });
130        },
131        //Sticky Header
132        cafe_StickyHeader: function () {
133            if ($('.cafe-row-sticky')[0]) {
134                $(window).on('load', function () {
135                    $('.cafe-row-sticky').each(function () {
136                        var $this = $(this);
137                        var $parent = $(this).parent();
138                        var current_width = 0;
139                        $(window).resize(function () {
140                            if (current_width != $(window).width()) {
141                                current_width = $(window).width();
142                                $parent.height('');
143                                if (current_width > 1024.98 && $this.hasClass('desktop-sticky')) {
144                                    setTimeout(function () {
145                                        $parent.height($this.outerHeight());
146                                    }, 500);
147                                } else if (current_width < 1024.98 && current_width > 768.98 && $this.hasClass('tablet-sticky')) {
148                                    setTimeout(function () {
149                                        $parent.height($this.outerHeight());
150                                    }, 500);
151                                } else if (current_width < 768.98 && $this.hasClass('mobile-sticky')) {
152                                    setTimeout(function () {
153                                        $parent.height($this.outerHeight());
154                                    }, 500);
155                                } else {
156                                    $this.removeClass('is-sticky');
157                                    $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky');
158                                }
159                            }
160                        }).resize();
161                        var HeaderTop = $parent.offset().top - $('body').offset().top;
162                        var windowWidth = $(window).width();
163                        var old_top_position = 0;
164                        $(window).on('scroll', function () {
165                            var top = $(window).scrollTop();
166                            if ($this.hasClass('cafe-scroll-up-sticky')) {
167                                top = top - $parent.outerHeight();
168                                if (old_top_position > top && top > $parent.outerHeight() * 3) {
169                                    $this.not('.active-sticky').addClass('active-sticky');
170                                } else {
171                                    $this.removeClass('active-sticky');
172                                }
173                                old_top_position = top;
174                            }
175                            if (current_width > 1024.98 && $this.hasClass('desktop-sticky')) {
176                                if (HeaderTop < top) {
177                                    $this.not('.is-sticky').addClass('is-sticky');
178                                    $this.find('.elementor-widget-clever-site-logo:not(.header-is-sticky)').addClass('header-is-sticky');
179                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active');
180                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp();
181                                } else {
182                                    $this.removeClass('is-sticky');
183                                    $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky');
184                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active');
185                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown();
186                                }
187                            } else if (current_width < 1024.98 && current_width > 768.98 && $this.hasClass('tablet-sticky')) {
188                                if (HeaderTop < top) {
189                                    $this.not('.is-sticky').addClass('is-sticky');
190                                    $this.find('.elementor-widget-clever-site-logo').addClass('header-is-sticky');
191                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active');
192                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp();
193                                } else {
194                                    $this.removeClass('is-sticky');
195                                    $this.find('.elementor-widget-clever-site-logo').removeClass('header-is-sticky');
196                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active');
197                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown();
198                                }
199                            } else if (current_width < 768.98 && $this.hasClass('mobile-sticky')) {
200                                if (HeaderTop < top) {
201                                    $this.not('.is-sticky').addClass('is-sticky');
202                                    $this.find('.elementor-widget-clever-site-logo:not(.header-is-sticky)').addClass('header-is-sticky');
203                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').removeClass('toggle-active');
204                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideUp();
205                                } else {
206                                    $this.removeClass('is-sticky');
207                                    $this.find('.elementor-widget-clever-site-logo.header-is-sticky').removeClass('header-is-sticky');
208                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').addClass('toggle-active');
209                                    $('.cafe-wrap-menu .toggle .arrow.on-scroll').parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideDown();
210                                }
211                            }
212                        });
213                    })
214                });
215            }
216        },
217        cafe_Animated_Headlines: function () {
218            $('.cafe-headline.animated-text').cafeAnimatedHeadlines();
219        },
220        //Ajax login
221        cafe_AjaxLogin: function () {
222            $('.cafe-account-modal .woocommerce-form-login').on('submit', function (e) {
223                e.preventDefault();
224                var user = {};
225                var $form = $(this);
226                user.username = $form.find('input[name=username]').val();
227                user.password = $form.find('input[name=password]').val();
228                user.rememberme = $form.find('input[name=rememberme]').is(":checked") ? true : false;
229                $form.closest('.cafe-account-modal').addClass('cafe-loading');
230                $.ajax({
231                    url: ajaxurl,
232                    type: "POST",
233                    data: {
234                        action: "cafe_user_login",
235                        loginParam: JSON.stringify(user)
236                    }
237                }).done(function (result) {
238                    if (!!result) {
239                        if ($form.find('.cafe-notice')[0]) {
240                            $form.find('.cafe-notice').html(result);
241                        } else {
242                            $form.prepend('<p class="cafe-notice">' + result + '</p>');
243                        }
244                        $form.closest('.cafe-account-modal').removeClass('cafe-loading');
245                    } else {
246                        location.reload(true);
247                    }
248                }).fail(function (result) {
249                    console.log('Err' + result);
250                });
251            })
252        },
253        //Ajax cart. All ajax cart feature will work follow theme trigger;
254        cafe_AjaxCart: function () {
255            /*Close cart*/
256            $(document).on('click', '.cafe-close-cart, .cafe-canvas-cart-mask', function (e) {
257                e.preventDefault();
258                $('.elementor-widget-clever-canvas-cart .cafe-toggle-input').prop('checked', false);
259            });
260            /* Remove Class cart empty with site install vanish cache after loaded*/
261            if (typeof Cookies != 'undefined') {
262                if (Cookies.get('woocommerce_items_in_cart') > 0) {
263                    $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty');
264                }
265            }
266            //Update mini top cart ajax
267            $(document).on('added_to_cart', function (event, fragments) {
268                $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty');
269                $('.cafe-canvas-cart-content.loading').removeClass('loading');
270                $('.cafe-cart-count').html(fragments['cart_count']);
271                $('.cafe-cart-subtotal').html(fragments['cart_subtotal']);
272            });
273            //Ajax cart of single product after added
274            $(document).on('zoo_single_product_cart_added', function (event, res) {
275                $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty');
276                $('.cafe-canvas-cart-content.loading').removeClass('loading');
277                var $response = $(res.response);
278                $('.cafe-cart-count').html($response.find('.cafe-cart-count').html());
279                $('.cafe-cart-subtotal').html($response.find('.cafe-cart-subtotal').html());
280            });
281            //Open cart when user click to button add to cart
282            $(document).on('zoo_starting_add_to_cart', function () {
283                $('.elementor-widget-clever-canvas-cart:visible input.cafe-toggle-input').prop("checked", true);
284                $('.cafe-canvas-cart-content').addClass('loading');
285            });
286            $(document).on('adding_to_cart', function () {
287                $('.elementor-widget-clever-canvas-cart:visible input.cafe-toggle-input').prop("checked", true);
288                $('.cafe-canvas-cart-content').addClass('loading');
289            });
290            //Remove and revert cart item
291            $(document).on('zoo_after_remove_product_item', function (event, response) {
292                var fragments = response.fragments;
293                if (fragments.cart_count == 0) {
294                    $('.cafe-canvas-cart').addClass('cart-empty');
295                }
296                $('.cafe-cart-count').html(fragments['cart_count']);
297                $('.cafe-cart-subtotal').html(fragments['cart_subtotal']);
298            });
299            $(document).on('zoo_after_restore_product_item', function (event, response) {
300                var fragments = response.fragments;
301                $('.cafe-canvas-cart.cart-empty').removeClass('cart-empty');
302                $('.cafe-cart-count').html(fragments['cart_count']);
303                $('.cafe-cart-subtotal').html(fragments['cart_subtotal']);
304            });
305        },
306        // Ajax Search
307        cafe_AjaxSearch: function () {
308            $(document).on('click', function (e) {
309                var $target = e.target;
310                $('.cafe-search-form.searched').each(function () {
311                    if (!$(this).is($target) && $target.closest('.cafe-search-form') == null) {
312                        $(this).removeClass('searched');
313                    }
314                })
315            });
316            $(".cafe-search-form.ajax-search").each(function () {
317                var inputtingTimer = null;
318                var cafeSearchForm = $(this),
319                    cafeSearchFormInputField = $(this).find(".cafe-search-field"),
320                    cafeSearchFormSelectField = $(".cafe-product-cat", cafeSearchForm),
321                    cafeSearchMaxResult = $("input[name=max_result]", cafeSearchForm),
322                    cafeSearchPostType = $("input[name=post_type]", cafeSearchForm),
323                    cafeSearchLayout = $("input[name=layout]", cafeSearchForm),
324                    cafeSearchBySKU = $("input[name=searchBySKU]", cafeSearchForm);
325                cafeSearchFormInputField.on("keypress", function (e) {
326                    if (e.which === 13) // Abort enter action.
327                        e.preventDefault();
328                    cafe_ajax_searching();
329                });
330                cafeSearchFormSelectField.on('change', function () {
331                    cafe_ajax_searching();
332                });
333
334                function cafe_ajax_searching() {
335                    // Clear delayed timer before another key press.
336                    clearTimeout(inputtingTimer);
337                    // Delay 1s before handling user input.
338                    inputtingTimer = setTimeout(function () {
339                        var cafeSearchFormInputFieldVal = cafeSearchFormInputField.val();
340                        if (cafeSearchFormInputFieldVal.length >= 3) {
341                            var queryData = {
342                                queryString: cafeSearchFormInputFieldVal
343                            };
344                            if (cafeSearchFormSelectField.length) {
345                                queryData.productCat = cafeSearchFormSelectField.val();
346                            }
347                            if (cafeSearchPostType.length) {
348                                queryData.postType = cafeSearchPostType.val();
349                            }
350                            if (cafeSearchMaxResult.length) {
351                                queryData.maxResult = cafeSearchMaxResult.val();
352                            }
353                            if (cafeSearchLayout.length) {
354                                queryData.layout = cafeSearchLayout.val();
355                            }
356                            if (cafeSearchBySKU.length) {
357                                queryData.searchBySKU = cafeSearchBySKU.val();
358                            }
359                            cafeSearchForm.addClass('searching');
360                            cafeSearchForm.removeClass('searched');
361                            $.ajax({
362                                url: ajaxurl,
363                                type: "POST",
364                                data: {
365                                    action: "cafe_live_search_results",
366                                    searchQuery: JSON.stringify(queryData)
367                                }
368                            }).done(function (result) {
369                                if ($('.cafe-wrap-search-result .cafe-row')[0]) {
370                                    $('.cafe-wrap-search-result .cafe-row').html(result);
371                                } else {
372                                    cafeSearchForm.find('.cafe-wrap-search-form-content .cafe-row').append(result);
373                                }
374                                cafeSearchForm.removeClass('searching');
375                                cafeSearchForm.addClass('searched');
376                            }).fail(function (result) {
377                                cafeSearchForm.removeClass('searching');
378                                cafeSearchForm.addClass('searched');
379                                console.log(result);
380                            });
381                        }
382                    }, 500);
383                }
384            });
385        },
386        // Pagination Ajax
387        cafe_PaginationAjax: function (wrap, item, path) {
388            $(document).on('click', '.view-more-button', function (e) {
389                e.preventDefault();
390            });
391            if ($('.pagination-ajax')[0]) {
392                if ($(path)[0]) {
393                    var button = false;
394                    var scrollThreshold = true;
395                    if ($('.view-more-button')[0]) {
396                        button = '.view-more-button';
397                        scrollThreshold = false;
398                        $(document).on('click', '.view-more-button', function () {
399                            $(this).hide();
400                        });
401                    }
402                    var infScroll = new InfiniteScroll(wrap, {
403                        path: path,
404                        append: item,
405                        status: '.scroller-status',
406                        hideNav: '.cafe-pagination',
407                        button: button,
408                        scrollThreshold: scrollThreshold,
409                    });
410
411                    $(wrap).on('history.infiniteScroll', function (event, response, path) {
412                        $('.view-more-button').show();
413                        if (typeof deferimg != "undefined") {
414                            deferimg(wrap + ' img:not(.sec-img)', 0, 'loaded',
415                                function () {
416                                    $(this).closest('.loading').removeClass('loading');
417                                });
418                        }
419                    });
420                    $(wrap).on('last.infiniteScroll', function (event, response, path) {
421                        $('.view-more-button').remove();
422                    });
423                } else {
424                    $('.pagination-ajax,.infinite-scroll-error,.infinite-scroll-request,.view-more-button').remove();
425                }
426            }
427
428        },
429        //Image Comparison
430        cafe_image_comparison: function ($target) {
431            let $currentTarget = $target.find('.cafe-wrap-image-comparison');
432            let beforelabel = !!$currentTarget.find('.before-img').attr('alt') ? $currentTarget.find('.before-img').attr('alt') : 'Before';
433            let afterlabel = !!$currentTarget.find('.after-img').attr('alt') ? $currentTarget.find('.after-img').attr('alt') : 'After';
434            let _orientation = !!$currentTarget.data('orientation') ? $currentTarget.data('orientation') : 'horizontal';
435            $currentTarget.twentytwenty({
436                orientation: _orientation,
437                before_label: beforelabel, // Set a custom before label
438                after_label: afterlabel, // Set a custom after label
439            });
440        },
441        //Video Light Box
442        cafe_video_light_box: function ($target) {
443            $target.find('.cafe-wrap-content-video').on('click', function (e) {
444                e.preventDefault();
445                var $this = $(this).find('.cafe-video-button');
446                var url = $this.attr('href');
447                var config = $this.data('cafe-config');
448                var height = config.height;
449                var width = config.width;
450                var html = '<div class="cafe-video-mask"></div><div class="cafe-wrap-video-popup"><iframe src="' + url + '" height="' + height + '" width="' + width + '" ></iframe></div>';
451                $('body').append(html);
452            });
453            $(document).on('click', '.cafe-video-mask', function () {
454                $('.cafe-wrap-video-popup, .cafe-video-mask').fadeOut();
455                setTimeout(function () {
456                    $('.cafe-wrap-video-popup, .cafe-video-mask').remove();
457                }, 500)
458            });
459        },
460        //Auto Typing
461        cafe_auto_typing: function ($target) {
462            let $currentTarget = $target.find('.cafe-auto-typing');
463            let data = $currentTarget.data('cafe-config');
464            $currentTarget.find(".cafe-content-auto-typing").typed({
465                strings: data.text,
466                typeSpeed: data.speed,
467                startDelay: data.delay,
468                showCursor: data.cursor ? true : false,
469                loop: data.loop ? true : false,
470            });
471        },
472        // Image 360 view
473        cafe_image_360_view: function ($target) {
474
475            let $currentTarget = $target.find(".cafe-image-360-view");
476
477            var config = JSON.parse($currentTarget.attr('data-cafe-config'));
478            var frame_width = config['width'];
479            var frame_height = config['height'];
480            if (parseInt(frame_width) > $currentTarget.find('.cafe-wrap-img-360-view').width()) {
481                var res = parseInt(frame_width) / parseInt(frame_height);
482                frame_width = $currentTarget.find('.cafe-wrap-img-360-view').width();
483                frame_height = parseInt(parseInt(frame_width) / res);
484            }
485            $currentTarget.find('.cafe-wrap-content-view').spritespin({
486                // path to the source images.
487                source: config['source'].split(','),
488                width: frame_width,  // width in pixels of the window/frame
489                height: frame_height,  // height in pixels of the window/frame
490                animate: false,
491            });
492            $(document).on('click', '.cafe-control-view.cafe-center:not(.active)', function () {
493                $(this).addClass('active');
494                $('.cafe-wrap-content-view').spritespin({
495                    // path to the source images.
496                    source: config['source'].split(','),
497                    width: frame_width,  // width in pixels of the window/frame
498                    height: frame_height,  // height in pixels of the window/frame
499                    animate: true,
500                    frameTime: 300,
501                    sense: -1,
502                });
503            });
504            $(document).on('click', '.cafe-control-view.cafe-center.active', function () {
505                $(this).removeClass('active');
506                $('.cafe-wrap-content-view').spritespin({
507                    // path to the source images.
508                    source: config['source'].split(','),
509                    width: frame_width,  // width in pixels of the window/frame
510                    height: frame_height,  // height in pixels of the window/frame
511                    animate: false,
512                });
513            });
514
515            var api = $currentTarget.find('.cafe-wrap-content-view').spritespin("api");
516            // call function next/previous frame when click to button next/previous
517            $currentTarget.find('.cafe-control-view.cafe-prev-item').on('click', function () {
518                api.prevFrame();
519            });
520            $currentTarget.find('.cafe-control-view.cafe-next-item').on('click', function () {
521                api.nextFrame();
522            });
523        },
524
525        //For productCarousel
526        cafe_carousel: function ($target, wrap_config, wrap_slider) {
527            if (typeof $.fn.slick === 'undefined') {
528                return false;
529            }
530            var $currentTarget = !!$target ? $target.find(".cafe-carousel:not(.slick-slider)") : $(".cafe-carousel:not(.slick-slider)");
531
532            $currentTarget.each(function () {
533                var data = JSON.parse($(this).attr('data-cafe-config'));
534                var slides_to_show = data['slides_to_show'];
535                var slides_to_show_tablet = data['slides_to_show_tablet'];
536                var slides_to_show_mobile = data['slides_to_show_mobile'];
537                var scroll = data['scroll'];
538                var autoplay = data['autoplay'];
539                var autoplay_tablet = data['autoplay_tablet'];
540                var autoplay_mobile = data['autoplay_mobile'];
541                var speed = data['speed'];
542                var show_pag = data['show_pag'];
543                var show_pag_tablet = data['show_pag_tablet'];
544                var show_pag_mobile = data['show_pag_mobile'];
545                var show_nav = data['show_nav'];
546                var show_nav_tablet = data['show_nav_tablet'];
547                var show_nav_mobile = data['show_nav_mobile'];
548                var wrap = data['wrap'] != undefined ? data['wrap'] : '';
549                var arrow_left = data['arrow_left'] != undefined ? data['arrow_left'] : 'cs-font clever-icon-arrow-left-1';
550                var arrow_right = data['arrow_right'] != undefined ? data['arrow_right'] : 'cs-font clever-icon-arrow-right-1';
551                var center_mode = data['center_mode'] != undefined ? data['center_mode'] : false;
552                var infinite = data['infinite'] != undefined ? data['infinite'] : true;
553                var wrapcaroul = !!wrap ? $(this).find(wrap) : $(this);
554
555                var row = data['row'] != undefined ? data['row'] : 0;
556
557                if (!wrapcaroul.hasClass('slick-slider')) {
558                    if (typeof wrap_config != 'function') {
559                        if (!!wrap_config || !!wrap_slider) {
560                            if (!!wrap_slider) {
561                                wrapcaroul = wrap_slider;
562                            } else {
563                                wrapcaroul = $(wrap_config).find($(wrap).not('.ajax-loaded'));
564                            }
565                        }
566                        wrapcaroul.slick({
567                            infinite: infinite,
568                            slidesToShow: slides_to_show,
569                            slidesToScroll: scroll > slides_to_show ? slides_to_show : scroll,
570                            arrows: show_nav,
571                            dots: show_pag,
572                            prevArrow: '<span class="cafe-carousel-btn prev-item"><i class="' + arrow_left + '"></i></span>',
573                            nextArrow: '<span class="cafe-carousel-btn next-item "><i class="' + arrow_right + '"></i></span>',
574                            autoplay: autoplay,
575                            autoplaySpeed: speed,
576                            rows: row,
577                            rtl: $('body.rtl')[0] ? true : false,
578                            centerMode: center_mode,
579                            centerPadding: '0',
580                            responsive: [
581
582                                {
583                                    breakpoint: 1024,
584                                    settings: {
585                                        slidesToShow: slides_to_show_tablet,
586                                        slidesToScroll: scroll > slides_to_show_tablet ? slides_to_show_tablet : scroll,
587                                        autoplay: autoplay_tablet,
588                                        arrows: show_nav_tablet,
589                                        dots: show_pag_mobile,
590                                    }
591                                },
592                                {
593                                    breakpoint: 768.98,
594                                    settings: {
595                                        slidesToShow: slides_to_show_mobile,
596                                        slidesToScroll: scroll > slides_to_show_mobile ? slides_to_show_mobile : scroll,
597                                        autoplay: autoplay_mobile,
598                                        arrows: show_nav_tablet,
599                                        dots: show_pag_mobile,
600                                    }
601                                }
602                            ]
603                        });
604                    }
605                }
606            });
607        },
608        //Tabs
609        cafe_tabs: function () {
610            $(document).on('click', '.cafe-wrap-tab-head .cafe-tab-item:not(.active)', function () {
611                let tab_class = $(this).data('tab');
612                $(this).closest('.cafe-wrap-tab-head').find('.active').removeClass('active');
613                $(this).addClass('active');
614                $(this).closest('.cafe-tabs').find('.cafe-tab.active').removeClass('active');
615                $(this).closest('.cafe-tabs').find('.cafe-tab.' + tab_class).addClass('active');
616                if ($(this).closest('.cafe-tabs').find('.slick-slider')[0]) {
617                    $(this).closest('.cafe-tabs').find('.slick-slider').slick('reinit');
618                }
619            });
620        },
621        // Filter Product
622        productFilter: function (wrap) {
623
624            wrap.find('.cafe-ajax-load a.ajax-load').on('click', function (e) {
625                e.preventDefault();
626                var $this = $(this);
627                var key = $this.data('value');
628                wrap = $this.parents('.append-class');
629                if ($this.hasClass('active')) {
630                    return;
631                }
632                $this.parents('.cafe-ajax-load ').find('a').removeClass('active');
633                $this.addClass('active');
634                if ($this.hasClass('opened')) {
635                    wrap.find('.products').html(wrap.find('.products').data(key));
636                    if (wrap.hasClass('cafe-carousel')) {
637                        wrap.find('.products').removeClass('slick-initialized slick-slider slick-dotted');
638                        cafe.cafe_carousel(null, wrap, null);
639                    }
640                    return;
641                }
642
643                $this.addClass('opened');
644                wrap.addClass('loading');
645                var data = wrap.data('args');
646                data['action'] = 'cafe_ajax_product_filter';
647                if ($this.data('type') == 'product_cat') {
648                    data['filter_categories'] = $this.data('value');
649                }
650                if ($this.data('type') == 'asset_type') {
651                    data['asset_type'] = $this.data('value');
652                }
653                wrap.data('args', data);
654                $.ajax({
655                    url: wrap.data('url'),
656                    data: data,
657                    type: 'POST',
658                }).success(function (response) {
659                    wrap.removeClass('loading');
660                    let content = $(response).html();
661                    wrap.find('.products').html(content);
662                    wrap.find('.products').data(key, content);
663                    if (wrap.hasClass('cafe-carousel')) {
664                        wrap.find('.products').removeClass('slick-initialized slick-slider slick-dotted');
665                        cafe.cafe_carousel(null, wrap, null);
666                    }
667                }).error(function (ex) {
668                    console.log(ex);
669                });
670            });
671        },
672        // Image 360 view
673        cafe_category_accordion: function () {
674            $(document).on('click', '.cafe-btn-accordion', function () {
675                $(this).closest('.cafe-cat-item').toggleClass('activated');
676                $(this).next('.cafe-sub-cat').slideToggle();
677            });
678        },
679        // Progress bar
680        cafe_progress_bar: function () {
681            $(window).load(function () {
682                $('.cafe-wrap-progress-bar:not(.loaded)').each(function () {
683                    if ($(window).scrollTop() + $(window).height() > $(this).offset().top) {
684                        cafe_progress_bar_animate($(this));
685                    }
686                });
687            });
688            $(window).on('scroll', function () {
689                $('.cafe-wrap-progress-bar:not(.loaded)').each(function () {
690                    if ($(window).scrollTop() + $(window).height() > $(this).offset().top) {
691                        cafe_progress_bar_animate($(this));
692                    }
693                });
694            });
695
696            function cafe_progress_bar_animate($current) {
697                $current.addClass('loaded');
698                var config = $current.data('cafe-config');
699                var percent = config.percent;
700                if (!!percent) {
701                    var duration = Math.round(config.duration / (percent + 10));
702                    var width = 0;
703                    var id = setInterval(frame, duration);
704
705                    function frame() {
706                        if (width >= percent) {
707                            clearInterval(id);
708                        } else {
709                            width++;
710                            $current.find('.value').text(width);
711                            $current.find('.cafe-progress-bar').
711css('width', width + '%');
712                        }
713                    }
714                }
715            }
716        },
717
718        //Tabs filter in mobile
719        cafe_Tabsfiler_Mobile: function ($poiter) {
720            $('.cafe-head-product-filter.has-tabs .cafe-title').css('cursor', 'pointer');
721            $(document).on('click', '.cafe-head-product-filter.has-tabs .cafe-title', function () {
722                var w = $(window).width();
723                if (w <= $poiter) {
724                    $(this).parent().find('.cafe-ajax-load').slideToggle();
725                    $(this).toggleClass('active');
726
727                    return false;
728                }
729            });
730        },
731        //Site nav Menu
732        cafe_site_nav_menu: function () {
733            var current_width = 0;
734            $(window).resize(function () {
735                if (current_width != $(window).width()) {
736                    current_width = $(window).width();
737                    //Fix menu out of screen.
738                    $('.cafe-site-menu .pos-left').removeClass('pos-left');
739                    $('.cafe-site-menu .menu-item>ul, .cafe-site-menu li>.cmm4e-sub-panel').each(function () {
740                        if (current_width < parseInt($(this).offset()['left'] + $(this).width())) {
741                            $(this).addClass('pos-left');
742                        }
743                    });
744                }
745            }).resize();
746            $(document).on('click', '.cafe-site-menu a', function (e) {
747                let href = $(this).attr('href');
748                if (!!href) {
749                    if (href.startsWith("#")) {
750                        if ($(href)[0]) {
751                            $(this).closest('ul').find('.current-menu-item').removeClass('current-menu-item');
752                            $(this).closest('.menu-item').addClass('current-menu-item');
753                            $(this).closest('.cafe-site-menu').find('input:checked').prop('checked', false);
754                            if (!$(href).hasClass('elementor-element')) {
755                                let headerHeight = $('.site-header')[0] ? $('.site-header').height() : 0;
756                                $('html, body').animate({
757                                    scrollTop: $(href).offset().top - $('.site-header').height()
758                                }, 500);
759                            }
760                        }
761                    }
762                }
763            })
764            //Scroll
765            $('.cafe-menu>.menu-item>a').each(function () {
766                let href = $(this).attr('href');
767                if (!!href) {
768                    if (href.startsWith("#")) {
769                        if ($(href)[0]) {
770                            $(this).addClass('is-static-link');
771                        }
772                    }
773                }
774            });
775            $(window).on("scroll", function () {
776                $('.is-static-link').each(function () {
777                    let href = $(this).attr('href');
778                    if (!!href) {
779                        if (href.startsWith("#")) {
780                            if ($(href)[0]) {
781
782                                let top_of_element = $(href).offset().top;
783                                let bottom_of_element = $(href).offset().top + $(href).outerHeight();
784                                let bottom_of_screen = $(window).scrollTop() + $(window).innerHeight() / 2;
785                                let top_of_screen = $(window).scrollTop();
786                                let at_bottom = $(document).height();
787                                if (bottom_of_screen > top_of_element || ((bottom_of_element + 50) > at_bottom && top_of_element < ($(window).scrollTop() + $(window).innerHeight()))) {
788                                    $('.cafe-menu>.current-menu-item').removeClass('current-menu-item');
789                                    $(this).closest('.menu-item').addClass('current-menu-item');
790                                }
791                            }
792                        }
793                    }
794                })
795            });
796        },
797        //Site nav Menu Toggle
798        cafe_site_nav_menu_toggle: function () {
799            $(document).on('click', '.cafe-site-menu .menu-item:not(.is-mega-menu) .cafe-menu-arrow', function (e) {
800                if ($(this).closest('.horizontal')[0]) {
801                    if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) {
802                        return;
803                    }
804                    if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) {
805                        return;
806                    }
807                }
808                if (e.target !== this)
809                    return;
810                else {
811                    e.preventDefault();
812                    $(this).toggleClass('active');
813                    $(this).closest('.menu-item:not(.is-mega-menu)').children('ul').slideToggle();
814                    if (!$(this).hasClass('active')) {
815                        $(this).closest('.menu-item:not(.is-mega-menu)').find('ul').slideUp();
816                        $(this).closest('.menu-item:not(.is-mega-menu)').find('.active').removeClass('active');
817                    }
818                }
819            });
820            $(document).on('click', '.cafe-site-menu .is-mega-menu>a>.cafe-menu-arrow', function (e) {
821                if ($(this).closest('.horizontal')[0]) {
822                    if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) {
823                        return;
824                    }
825                    if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) {
826                        return;
827                    }
828                }
829                if (e.target !== this)
830                    return;
831                else {
832                    e.preventDefault();
833                    $(this).toggleClass('active');
834                    $(this).closest('.menu-item').children('.mega-menu-content').slideToggle();
835                    if (!$(this).hasClass('active')) {
836                        $(this).closest('.menu-item').find('.mega-menu-content').slideUp();
837                        $(this).closest('.menu-item').find('.active').removeClass('active');
838                    }
839                }
840            });
841            $(document).on('click', '.cafe-site-menu .menu-item-mega .cafe-menu-arrow', function (e) {
842                if ($(this).closest('.horizontal')[0]) {
843                    if ($(this).closest('.cafe-lg-width')[0] && $(window).width() > 1025) {
844                        return;
845                    }
846                    if ($(this).closest('.cafe-md-width')[0] && $(window).width() > 768) {
847                        return;
848                    }
849                }
850                if (e.target !== this)
851                    return;
852                else {
853                    e.preventDefault();
854                    $(this).toggleClass('active');
855                    $(this).closest('.menu-item-mega').children('.mega-menu-submenu').slideToggle();
856                    if (!$(this).hasClass('active')) {
857                        $(this).closest('.menu-item-mega').find('.mega-menu-submenu').slideUp();
858                        $(this).closest('.menu-item-mega').find('.active').removeClass('active');
859                    }
860                }
861            });
862            $(document).on('click', '.cafe-wrap-menu .toggle .arrow', function (e) {
863                $(this).parents('.cafe-wrap-menu').toggleClass('toggle-active');
864                $(this).parents('.cafe-wrap-menu').find('.wrap-menu-inner').slideToggle();
865            });
866        },
867        //Site Menu widget
868        cafe_site_nav_widget: function () {
869            if ($('.cafe-hamburger-slide-left-effect')[0] && $('.cafe-site-header')[0]) {
870                $('body').wrapInner('<div class="cafe-wrap-body-content-inner"/>');
871                $('body').wrapInner('<div class="cafe-wrap-body-content"/>');
872                $('body').append('<div class="cafe-wrap-menu-slide-left elementor-' + $('.cafe-site-header').attr('data-elementor-id') + '"/>')
873                $('.cafe-hamburger-slide-left-effect').each(function () {
874                    let id = $(this).find('.cafe-hamburger-input-control').attr('id');
875                    let current_menu = $(this).closest('.elementor-widget-clever-site-nav-menu').clone();
876                    current_menu.find('.cafe-hamburger-button, .cafe-hamburger-input-control').remove();
877                    $('.cafe-wrap-menu-slide-left').append(current_menu);
878
879                    $(this).find('.cafe-wrap-menu').remove();
880                    $(this).find('.cafe-hamburger-mask').remove();
881                });
882            }
883            $(document).on('click', '.cafe-hamburger-slide-left-effect .cafe-hamburger-button', function (e) {
884                e.preventDefault();
885                let target = $(this).closest('.elementor-widget-clever-site-nav-menu').attr('data-id');
886                $('body').toggleClass('cafe-hamburger-slide-left-active');
887                $('.cafe-wrap-menu-slide-left .elementor-element-' + target).toggleClass('hamburger-active');
888                $(window).trigger('resize')
889            });
890            $(document).on('click', '.cafe-hamburger-slide-left-active .cafe-wrap-body-content', function (e) {
891                e.preventDefault();
892                if (!$(e.target).hasClass('cafe-hamburger-input-control')) {
893                    $('body.cafe-hamburger-slide-left-active').removeClass('cafe-hamburger-slide-left-active');
894                    $('.cafe-wrap-menu-slide-left .hamburger-active').removeClass('hamburger-active');
895                    $(window).trigger('resize')
896                }
897            });
898        },
899        //Cafe Masonry
900        cafe_masonry_layout: function(){
901            if($('.masonry-layout')[0]){
902                $('.masonry-layout .cafe-row').isotope({
903                    itemSelector: '.cafe-banner',
904                });
905
906            }
907        }
908    };
909    window.cafe = cafe;
910    // DOCUMENT READY
911    $(function () {
912        cafe.init();
913    });
914    $(window).on('elementor/frontend/init', function () {
915        //Animated Headlines
916        elementorFrontend.hooks.addAction(
917            "frontend/element_ready/clever-animated-headlines.default",
918            cafe.cafe_Animated_Headlines
919        );
920        //Image Comparison
921        elementorFrontend.hooks.addAction(
922            "frontend/element_ready/clever-image-comparison.default",
923            cafe.cafe_image_comparison
924        );
925        //Testimonial Slider
926        elementorFrontend.hooks.addAction(
927            "frontend/element_ready/clever-testimonial.default",
928            cafe.cafe_carousel
929        );
930        //Carousel Tabs
931        elementorFrontend.hooks.addAction(
932            "frontend/element_ready/clever-carousel-tabs.default",
933            cafe.cafe_carousel,
934            cafe.cafe_tabs,
935        );
936        //Carousel Tabs
937        elementorFrontend.hooks.addAction(
938            "frontend/element_ready/clever-multi-banner.default",
939            cafe.cafe_carousel
940        );
941        //Image 360 view
942        elementorFrontend.hooks.addAction(
943            "frontend/element_ready/clever-image-360-view.default",
944            cafe.cafe_image_360_view
945        );
946        //Auto Typing
947        elementorFrontend.hooks.addAction(
948            "frontend/element_ready/clever-auto-typing.default",
949            cafe.cafe_auto_typing
950        );
951        //Video Lightbox
952        elementorFrontend.hooks.addAction(
953            "frontend/element_ready/clever-video-light-box.default",
954            cafe.cafe_video_light_box
955        );
956        //Progress bar
957        elementorFrontend.hooks.addAction(
958            "frontend/element_ready/clever-progress-bar.default",
959            cafe.cafe_progress_bar
960        );
961        //Site Nav Menu
962        elementorFrontend.hooks.addAction(
963            "frontend/element_ready/clever-site-nav-menu.default",
964            cafe.cafe_site_nav_menu,
965            cafe.cafe_site_nav_menu_toggle
966        );
967    });
968
969    jQuery.fn.extend({
970        cafeAnimatedHeadlines: function () {
971            var $this = $(this);
972            if (!$this[0]) {
973                return;
974            }
975            if($this.hasClass('marquee')) {
976                let speed = $(this).attr('data-speed')?parseInt($(this).attr('data-speed')):1, animAmount, animInterval;
977
978                animateNews();
979
980                function animateNews() {
981                    $this.find('.cafe-words-wrapper b').eq(0).animate({
982                        'marginLeft': '-=' + speed + 'px'
983                    }, 1, function () {
984                        animAmount = speed;
985                        let animNews_W =  $this.find('.cafe-words-wrapper b').eq(0).outerWidth(true);
986                        if (animAmount >= animNews_W) {
987                            $(this).parent().append($(this));
988                            $(this).removeAttr('style');
989                        }
990                        animInterval = setTimeout(function () {
991                            animateNews();
992                        });
993                    });
994                }
995
996                $this.hover(function () {
997                    clearTimeout(animInterval);
998                    $this.find('.cafe-words-wrapper b').eq(0).stop();
999                }, function () {
1000                    animateNews();
1001                });
1002                return;
1003            }
1004            //set animation timing
1005            var animationDelay = 2500,
1006                //loading bar effect
1007                barAnimationDelay = 3800,
1008                barWaiting = barAnimationDelay - 3000, //3000 is the duration of the transition on the loading bar - set in the scss/css file
1009                //letters effect
1010                lettersDelay = 50,
1011                //type effect
1012                typeLettersDelay = 150,
1013                selectionDuration = 500,
1014                typeAnimationDelay = selectionDuration + 800,
1015                //clip effect
1016                revealDuration = 600,
1017                revealAnimationDelay = 1500;
1018
1019            initHeadline();
1020
1021
1022            function initHeadline() {
1023                //insert <i> element for each letter of a changing word
1024                $this.each(function () {
1025                    if ($this.hasClass('letters'))
1026                        singleLetters($this.find('b'));
1027                });
1028                //initialise headline animation
1029                animateHeadline($this);
1030            }
1031
1032            function singleLetters($words) {
1033                $words.each(function () {
1034                    var word = $(this),
1035                        letters = word.text().split(''),
1036                        selected = word.hasClass('is-visible');
1037                    for (var i in letters) {
1038                        if (word.parents('.rotate-2').length > 0) letters[i] = '<em>' + letters[i] + '</em>';
1039                        letters[i] = (selected) ? '<i class="in">' + letters[i] + '</i>' : '<i>' + letters[i] + '</i>';
1040                    }
1041                    var newLetters = letters.join('');
1042                    word.html(newLetters).css('opacity', 1);
1043                });
1044            }
1045
1046            function animateHeadline($headlines) {
1047                var duration = animationDelay;
1048                $headlines.each(function () {
1049                    var headline = $(this);
1050                    if (headline.hasClass('random-selected')) {
1051                        let total_item = headline.find('.cafe-words-wrapper b').length;
1052                        headline.data('total_item', total_item);
1053                        //trigger animation
1054                        setInterval(function () {
1055                            hideWord(headline.find('.is-visible'));
1056                        }, duration);
1057
1058                    } else {
1059                        if (headline.hasClass('loading-bar')) {
1060                            duration = barAnimationDelay;
1061                            setTimeout(function () {
1062                                headline.find('.cafe-words-wrapper').addClass('is-loading')
1063                            }, barWaiting);
1064                        } else if (headline.hasClass('clip')) {
1065                            var spanWrapper = headline.find('.cafe-words-wrapper'),
1066                                newWidth = spanWrapper.width() + 10;
1067                            spanWrapper.css('width', newWidth);
1068                        } else if (!headline.hasClass('type')) {
1069                            //assign to .cafe-words-wrapper the width of its longest word
1070                            var words = headline.find('.cafe-words-wrapper b'),
1071                                width = 0;
1072                            words.each(function () {
1073                                var wordWidth = $(this).width();
1074                                if (wordWidth > width) width = wordWidth;
1075                            });
1076                            headline.find('.cafe-words-wrapper').css('width', width);
1077                        }
1078                        //trigger animation
1079                        setTimeout(function () {
1080                            hideWord(headline.find('.is-visible').eq(0))
1081                        }, duration);
1082                    }
1083                });
1084            }
1085
1086            function randomIndex(max) {
1087                return Math.floor(Math.random() * Math.floor(max));
1088            }
1089
1090            function hideWord($word) {
1091                var nextWord = takeNext($word);
1092                if ($word.parents('.cafe-headline').hasClass('random-selected')) {
1093                    let total_item = $word.parents('.cafe-headline').data('total_item');
1094                    nextWord = $word.parents('.cafe-headline').find('.cafe-words-wrapper b:eq(' + randomIndex(total_item) + ')');
1095                    switchWord($word, nextWord);
1096                } else if ($word.parents('.cafe-headline').hasClass('type')) {
1097                    var parentSpan = $word.parent('.cafe-words-wrapper');
1098                    parentSpan.addClass('selected').removeClass('waiting');
1099                    setTimeout(function () {
1100                        parentSpan.removeClass('selected');
1101                        $word.removeClass('is-visible').addClass('is-hidden').children('i').removeClass('in').addClass('out');
1102                    }, selectionDuration);
1103                    setTimeout(function () {
1104                        showWord(nextWord, typeLettersDelay)
1105                    }, typeAnimationDelay);
1106
1107                } else if ($word.parents('.cafe-headline').hasClass('letters')) {
1108                    var bool = ($word.children('i').length >= nextWord.children('i').length) ? true : false;
1109                    hideLetter($word.find('i').eq(0), $word, bool, lettersDelay);
1110                    showLetter(nextWord.find('i').eq(0), nextWord, bool, lettersDelay);
1111
1112                } else if ($word.parents('.cafe-headline').hasClass('clip')) {
1113                    $word.parents('.cafe-words-wrapper').animate({width: '2px'}, revealDuration, function () {
1114                        switchWord($word, nextWord);
1115                        showWord(nextWord);
1116                    });
1117
1118                } else if ($word.parents('.cafe-headline').hasClass('loading-bar')) {
1119                    $word.parents('.cafe-words-wrapper').removeClass('is-loading');
1120                    switchWord($word, nextWord);
1121                    setTimeout(function () {
1122                        hideWord(nextWord)
1123                    }, barAnimationDelay);
1124                    setTimeout(function () {
1125                        $word.parents('.cafe-words-wrapper').addClass('is-loading')
1126                    }, barWaiting);
1127
1128                } else {
1129                    switchWord($word, nextWord);
1130                    setTimeout(function () {
1131                        hideWord(nextWord)
1132                    }, animationDelay);
1133                }
1134            }
1135
1136            function showWord($word, $duration) {
1137                if ($word.parents('.cafe-headline').hasClass('type')) {
1138                    showLetter($word.find('i').eq(0), $word, false, $duration);
1139                    $word.addClass('is-visible').removeClass('is-hidden');
1140
1141                } else if ($word.parents('.cafe-headline').hasClass('clip')) {
1142                    $word.parents('.cafe-words-wrapper').animate({'width': $word.width() + 10}, revealDuration, function () {
1143                        setTimeout(function () {
1144                            hideWord($word)
1145                        }, revealAnimationDelay);
1146                    });
1147                }
1148            }
1149
1150            function hideLetter($letter, $word, $bool, $duration) {
1151                $letter.removeClass('in').addClass('out');
1152
1153                if (!$letter.is(':last-child')) {
1154                    setTimeout(function () {
1155                        hideLetter($letter.next(), $word, $bool, $duration);
1156                    }, $duration);
1157                } else if ($bool) {
1158                    setTimeout(function () {
1159                        hideWord(takeNext($word))
1160                    }, animationDelay);
1161                }
1162
1163                if ($letter.is(':last-child') && $('html').hasClass('no-csstransitions')) {
1164                    var nextWord = takeNext($word);
1165                    switchWord($word, nextWord);
1166                }
1167            }
1168
1169            function showLetter($letter, $word, $bool, $duration) {
1170                $letter.addClass('in').removeClass('out');
1171
1172                if (!$letter.is(':last-child')) {
1173                    setTimeout(function () {
1174                        showLetter($letter.next(), $word, $bool, $duration);
1175                    }, $duration);
1176                } else {
1177                    if ($word.parents('.cafe-headline').hasClass('type')) {
1178                        setTimeout(function () {
1179                            $word.parents('.cafe-words-wrapper').addClass('waiting');
1180                        }, 200);
1181                    }
1182                    if (!$bool) {
1183                        setTimeout(function () {
1184                            hideWord($word)
1185                        }, animationDelay)
1186                    }
1187                }
1188            }
1189
1190            function takeNext($word) {
1191                return (!$word.is(':last-child')) ? $word.next() : $word.parent().children().eq(0);
1192            }
1193
1194            function takePrev($word) {
1195                return (!$word.is(':first-child')) ? $word.prev() : $word.parent().children().last(
1195);
1196            }
1197
1198            function switchWord($oldWord, $newWord) {
1199                $oldWord.removeClass('is-visible').addClass('is-hidden');
1200                $newWord.removeClass('is-hidden').addClass('is-visible');
1201            }
1202
1203
1204        }
1205    });
1206})(jQuery);
1207
1208/*Assign video backgound of slider to YT API*/
1209function onYouTubeIframeAPIReady() {
1210    jQuery('.slick-slide:not(.slick-cloned) .cafe-viewer-video.youtube-embed iframe').each(function () {
1211        if (jQuery(this).attr('id') != '') ;
1212        {
1213            let sound = jQuery(this).parent().data('cafe-config').sound;
1214            let player = new YT.Player(jQuery(this).attr('id'), {
1215                    playerVars: {
1216                        'autoplay': 0,
1217                        'controls': 0,
1218                        'modestbranding': 1,
1219                        'rel': 0,
1220                        'showinfo': 0
1221                    },
1222                    events: {
1223                        onReady: function (e) {
1224                            if (sound != 'yes') {
1225                                e.target.mute();
1226                            }
1227                            jQuery('#progressBar').hide();
1228                        }
1229                    }
1230                }
1231            );
1232            jQuery(this).parent().data('player', player);
1233        }
1234    })
1235
1236}
1237
1238/*End Assign video backgound of slider to YT API*/
1239
1240// webpackModules
1241(function (modules) {
1242    // The module cache
1243    var $ = jQuery,
1244        installedModules = {};
1245
1246    // The require function
1247    function __webpack_require__(moduleId) {
1248
1249        // Check if module is in cache
1250        if (installedModules[moduleId]) {
1251            return installedModules[moduleId].exports;
1252        }
1253        // Create a new module (and put it into the cache)
1254        var module = installedModules[moduleId] = {
1255            i: moduleId,
1256            l: false,
1257            exports: {}
1258        };
1259
1260        // Execute the module function
1261        modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
1262
1263        // Flag the module as loaded
1264        module.l = true;
1265
1266        // Return the exports of the module
1267        return module.exports;
1268    }
1269
1270    // expose the modules object (__webpack_modules__)
1271    __webpack_require__.m = modules;
1272
1273    // expose the module cache
1274    __webpack_require__.c = installedModules;
1275
1276    // define getter function for harmony exports
1277    __webpack_require__.d = function (exports, name, getter) {
1278        if (!__webpack_require__.o(exports, name)) {
1279            Object.defineProperty(exports, name, {
1280                enumerable: true,
1281                get: getter
1282            });
1283        }
1284    };
1285
1286    // define __esModule on exports
1287    __webpack_require__.r = function (exports) {
1288        if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1289            Object.defineProperty(exports, Symbol.toStringTag, {
1290                value: 'Module'
1291            });
1292        }
1293        Object.defineProperty(exports, '__esModule', {
1294            value: true
1295        });
1296    };
1297
1298    // create a fake namespace object
1299    // mode & 1: value is a module id, require it
1300    // mode & 2: merge all properties of value into the ns
1301    // mode & 4: return value when already ns object
1302    // mode & 8|1: behave like require
1303    __webpack_require__.t = function (value, mode) {
1304        if (mode & 1) value = __webpack_require__(value);
1305        if (mode & 8) return value;
1306        if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
1307        var ns = Object.create(null);
1308        __webpack_require__.r(ns);
1309        Object.defineProperty(ns, 'default', {
1310            enumerable: true,
1311            value: value
1312        });
1313        if (mode & 2 && typeof value != 'string')
1314            for (var key in value) __webpack_require__.d(ns, key, function (key) {
1315                return value[key];
1316            }.bind(null, key));
1317        return ns;
1318    };
1319
1320    // getDefaultExport function for compatibility with non-harmony modules
1321    __webpack_require__.n = function (module) {
1322        var getter = module && module.__esModule ?
1323            function getDefault() {
1324                return module['default'];
1325            } :
1326            function getModuleExports() {
1327                return module;
1328            };
1329        __webpack_require__.d(getter, 'a', getter);
1330        return getter;
1331    };
1332
1333    // Object.prototype.hasOwnProperty.call
1334    __webpack_require__.o = function (object, property) {
1335        return Object.prototype.hasOwnProperty.call(object, property);
1336    };
1337
1338    // __webpack_public_path__
1339    __webpack_require__.p = '';
1340
1341    // Load entry module and return exports
1342    return __webpack_require__(__webpack_require__.s = 0);
1343})
1344([
1345    /* 0 */
1346    (function (module, exports, __webpack_require__) {
1347        'use strict';
1348
1349        function CleverAddonsForElementor(elementor) {
1350            var self = this,
1351                handlers = {
1352                    slider: __webpack_require__(1)
1353                };
1354            this.modules = {};
1355            self.modules = {};
1356            jQuery.each(handlers, function (moduleName) {
1357                self.modules[moduleName] = new this(elementor);
1358            });
1359
1360        }
1361
1362        jQuery(window).on('elementor/frontend/init', function () {
1363            window.cafeFrontend = new CleverAddonsForElementor(elementorFrontend);
1364        });
1365    }),
1366    /* 1 */
1367    (function (module, exports, __webpack_require__) {
1368        'use strict';
1369
1370        module.exports = function (elementor) {
1371            elementor.hooks.addAction('frontend/element_ready/clever-slider.default', __webpack_require__(2));
1372            elementor.hooks.addAction('frontend/element_ready/clever-section-bookmark.default', __webpack_require__(3));
1373            elementor.hooks.addAction('frontend/element_ready/clever-edd-tabs.default', __webpack_require__(4));
1374            elementor.hooks.addAction('frontend/element_ready/clever-scroll-to.default', __webpack_require__(7));
1375        };
1376    }),
1377    /* 2 */
1378    (function (module, exports, __webpack_require__) {
1379        'use strict';
1380
1381        var CleverSlider = elementorModules.frontend.handlers.Base.extend({
1382            getDefaultSettings: function () {
1383                return {
1384                    selectors: {
1385                        slider: '.cafe-slider-slides',
1386                        slideBackground: '.slick-slide-bg',
1387                        slideContent: '.cafe-slide-content'
1388                    },
1389                    classes: {
1390                        animated: 'animated'
1391                    },
1392                    attributes: {
1393                        dataSliderOptions: 'slider_options',
1394                        dataAnimation: 'animation'
1395                    }
1396                };
1397            },
1398            /*Resize iframe fit to slider size*/
1399            resizeIframe: function ($slider) {
1400                let slide_res = $slider.width() / $slider.height();
1401                $slider.find('.cafe-viewer-video iframe').each(function () {
1402                    let frame_res = jQuery(this).attr('width') / jQuery(this).attr('height');
1403                    if (frame_res > slide_res) {
1404                        jQuery(this).attr('width', frame_res * $slider.height());
1405                        jQuery(this).width(frame_res * $slider.height());
1406                        jQuery(this).attr('height', $slider.height());
1407                    } else {
1408                        jQuery(this).attr('width', $slider.width());
1409                        jQuery(this).width($slider.width());
1410                        jQuery(this).attr('height', $slider.width() / frame_res);
1411                    }
1412                })
1413            },
1414
1415            getDefaultElements: function () {
1416                var selectors = this.getSettings('selectors');
1417                return {
1418                    $slider: this.$element.find(selectors.slider)
1419                };
1420            },
1421
1422            initSlider: function () {
1423                var $slider = this.elements.$slider;
1424                var settings = this.getSettings();
1425                if (!$slider.length) {
1426                    return;
1427                }
1428
1429                $slider.slick($slider.data(this.getSettings('attributes.dataSliderOptions')));
1430                /*JS for slider video*/
1431                this.resizeIframe($slider);
1432                $slider.find('.cafe-viewer-video.vimeo-embed').each(function () {
1433                    var options = {
1434                        background: true
1435                    };
1436                    if (typeof Vimeo != 'undefined') {
1437                        var player = new Vimeo.Player(jQuery(this).find('iframe'), options);
1438                        player.setLoop(true);
1439                        var arg = jQuery(this).data('cafe-config');
1440                        if (arg.sound != 'yes') {
1441                            player.setVolume(0);
1442                        }
1443                        player.disableTextTrack();
1444                        jQuery(this).data('player', player);
1445                    }
1446                })
1447                if ($slider.find('.slick-active .cafe-viewer-video.vimeo-embed')[0]) {
1448                    let player = $slider.find('.slick-active .cafe-viewer-video.vimeo-embed').data('player');
1449                    player.play();
1450                }
1451                if ($slider.find('.slick-active .cafe-viewer-video.youtube-embed')[0]) {
1452                    let player = $slider.find('.slick-active .cafe-viewer-video.youtube-embed').data('player');
1453                    player.playVideo();
1454                }
1455                /*End JS for slider video*/
1456            },
1457
1458            goToActiveSlide: function () {
1459                this.elements.$slider.slick('slickGoTo', this.getEditSettings('activeItemIndex') - 1);
1460            },
1461
1462            onPanelShow: function () {
1463                var $slider = this.elements.$slider;
1464
1465                $slider.slick('slickPause');
1466
1467                // On switch between slides while editing. stop again.
1468                $slider.on('afterChange', function () {
1469                    $slider.slick('slickPause');
1470                });
1471            },
1472
1473            bindEvents: function () {
1474                var $slider = this.elements.$slider,
1475                    settings = this.getSettings(),
1476                    animation = $slider.data(settings.attributes.dataAnimation);
1477
1478                if (!animation) {
1479                    return;
1480                }
1481
1482                if (elementorFrontend.isEditMode()) {
1483                    elementor.hooks.addAction('panel/open_editor/widget/clever-slider', this.onPanelShow);
1484                }
1485
1486                $slider.on({
1487                    init: function (event, slick) {
1488                        let $currentSlide = $slider.find('.slick-current').find(settings.selectors.slideContent);
1489                        let $currentBgSlide = $slider.find('.slick-current').find(settings.selectors.slideBackground);
1490
1491                        let selfAnimation = $currentSlide.data('animation');
1492                        let selfBgAnimation = $currentBgSlide.data('animation');
1493
1494                        selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation;
1495
1496                        $currentSlide.addClass(settings.classes.animated + ' ' + selfAnimation);
1497                        if (selfBgAnimation != 'inherit') {
1498                            $currentBgSlide.addClass(settings.classes.animated + ' ' + selfBgAnimation);
1499                        }
1500                    },
1501                    beforeChange: function (event, slick, currentSlide) {
1502                        let $sliderContent = $slider.find(settings.selectors.slideContent);
1503                        let $slideBackground = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideBackground);
1504
1505                        let selfAnimation = $sliderContent.data('animation');
1506                        let selfBgAnimation = $slideBackground.data('animation');
1507
1508                        selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation;
1509
1510                        $sliderContent.removeClass(settings.classes.animated + ' ' + selfAnimation);
1511
1512                        if (selfBgAnimation != 'inherit') {
1513                            $slideBackground.removeClass(settings.classes.animated + ' ' + selfBgAnimation);
1514                        }
1515                    },
1516                    afterChange: function (event, slick, currentSlide) {
1517                        let $currentSlide = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideContent);
1518                        let $currentBgSlide = jQuery(slick.$slides.get(currentSlide)).find(settings.selectors.slideBackground);
1519
1520                        let selfAnimation = $currentSlide.data('animation');
1521                        let selfBgAnimation = $currentBgSlide.data('animation');
1522
1523                        selfAnimation = selfAnimation == 'inherit' ? animation : selfAnimation;
1524
1525                        $currentSlide.addClass(settings.classes.animated + ' ' + selfAnimation);
1526                        if (selfBgAnimation != 'inherit') {
1527                            $currentBgSlide.addClass(settings.classes.animated + ' ' + selfBgAnimation);
1528                        }
1529                        /*Video background control play/pause when change slide*/
1530                        $slider.find('.cafe-viewer-video.vimeo-embed').each(function () {
1531                            let player = jQuery(this).data('player');
1532                            if (jQuery(this).parents('.slick-active')[0]) {
1533                                player.play();
1534                            } else {
1535                                player.pause();
1536                            }
1537                        });
1538                        $slider.find('.cafe-viewer-video.youtube-embed').each(function () {
1539                            let player = jQuery(this).data('player');
1540                            if (typeof player != 'undefined') {
1541                                if (jQuery(this).parents('.slick-active')[0]) {
1542                                    player.playVideo();
1543                                } else {
1544                                    player.pauseVideo();
1545                                }
1546                            }
1547                        });
1548                        /*End Video background control play/pause when change slide*/
1549                    }
1550                });
1551                var $this = this;
1552                jQuery(window).on('resize', function () {
1553                    $this.resizeIframe($slider);
1554                })
1555            },
1556
1557            onInit: function () {
1558                elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1559
1560                this.initSlider();
1561
1562                if (this.isEdit) {
1563                    this.goToActiveSlide();
1564                }
1565            },
1566
1567            onEditSettingsChange: function (propertyName) {
1568                if ('activeItemIndex' === propertyName) {
1569                    this.goToActiveSlide();
1570                }
1571            }
1572        });
1573
1574        module.exports = function ($scope) {
1575            new CleverSlider({
1576                $element: $scope
1577            });
1578        };
1579    }),
1580    /* 3 */
1581    (function (module, exports, __webpack_require__) {
1582        'use strict';
1583
1584        var CleverSectionBookmark = elementorModules.frontend.handlers.Base.extend({
1585            addSection: function () {
1586                var context = jQuery(this.$element.context),
1587                    section = context.find('.cafe-bookmark-section'),
1588                    sectionId = section.attr('id'),
1589                    sectionIcon = section.data('icon'),
1590                    sectionLabel = section.data('label'),
1591                    sectionModelId = section.data('modelId');
1592
1593                if (!elementorFrontend.isEditMode() && !context.hasClass('cafe-section-bookmark-container')) {
1594                    context.addClass('cafe-section-bookmark-container');
1595                }
1596
1597                if (!context.hasClass('bookmarked')) {
1598                    this.navBar.append('<li><a class="cafe-section-bookmark-link ' + sectionIcon + ' section-link-' + sectionModelId + '" href="#' + sectionId + '"><span class="screen-reader-text">' + sectionLabel + '</span></a></li>');
1599                    context.addClass('bookmarked');
1600                } else {
1601                    this.navBar.find('a[href="#' + sectionId + '"]').replaceWith('<li><a class="cafe-section-bookmark-link ' + sectionIcon + ' section-link-' + sectionModelId + '" href="#' + sectionId + '"><span class="screen-reader-text">' + sectionLabel + '</span></a></li>');
1602                }
1603            },
1604            setActiveSection: function () {
1605                navLinks.removeClass('current');
1606                $('#navigation li a[href="#' + id + '"]').addClass('current');
1607            },
1608            goToActiveSection: function () {
1609                if (target.length) {
1610                    $('html, body').stop().animate({
1611                        scrollTop: target.offset().top
1612                    }, 1000);
1613                }
1614            },
1615            initNavBar: function () {
1616                var navBar = jQuery('#cafe-bookmark-bar');
1617                if (!navBar.length) {
1618                    var $ul = document.createElement('ul');
1619                    $ul.id = 'cafe-bookmark-bar';
1620                    $ul.style = 'list-style:none;margin:0;padding:0;position:fixed;width:20px;height:100px;right:1em;top:calc(50vh - 50px)';
1621                    document.body.appendChild($ul);
1622                    this.navBar = jQuery('#cafe-bookmark-bar');
1623                } else {
1624                    this.navBar = navBar;
1625                }
1626            },
1627            onInit: function () {
1628                elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1629
1630                this.initNavBar();
1631
1632                this.addSection();
1633
1634                // draft code
1635                jQuery('.cafe-section-bookmark-link').on('click', function (e) {
1636                    var target = jQuery(this.getAttribute('href'));
1637
1638                    if (target.length) {
1639                        e.preventDefault();
1640                        jQuery('html, body').stop().animate({
1641                            scrollTop: target.offset().top
1642                        }, 1000);
1643                    }
1644                });
1645
1646                jQuery(window).scroll(function () {
1647                    var position = window.pageYOffset;
1648                    jQuery('.cafe-bookmark-section').each(function () {
1649                        var target = jQuery(this).offset().top;
1650                        var id = jQuery(this).attr('id');
1651                        var navLinks = jQuery('#cafe-bookmark-bar li a');
1652                        if (position >= target) {
1653                            navLinks.removeClass('current');
1654                            jQuery('#cafe-bookmark-bar li a[href="#' + id + '"]').addClass('current');
1655                        }
1656                    });
1657                });
1658            },
1659            onEditSettingsChange: function (propertyName) {
1660                console.log(propertyName);
1661            }
1662        });
1663
1664        module.exports = function ($scope) {
1665            new CleverSectionBookmark({
1666                $element: $scope
1667            });
1668        };
1669    }),
1670    /* 4 */
1671    (function (module, exports, __webpack_require__) {
1672        'use strict';
1673
1674        var TabsModule = __webpack_require__(5);
1675
1676        module.exports = function ($scope) {
1677            new TabsModule({
1678                $element: $scope,
1679                toggleSelf: false
1680            });
1681        };
1682    }),
1683    /* 5 */
1684    (function (module, exports, __webpack_require__) {
1685        "use strict";
1686
1687        var HandlerModule = __webpack_require__(6);
1688
1689        module.exports = HandlerModule.extend({
1690            $activeContent: null,
1691
1692            getDefaultSettings: function getDefaultSettings() {
1693                return {
1694                    selectors: {
1695                        tabTitle: '.elementor-tab-title',
1696                        tabContent: '.elementor-tab-content'
1697                    },
1698                    classes: {
1699                        active: 'elementor-active'
1700                    },
1701                    showTabFn: 'show',
1702                    hideTabFn: 'hide',
1703                    toggleSelf: true,
1704                    hidePrevious: true,
1705                    autoExpand: true
1706                };
1707            },
1708
1709            getDefaultElements: function getDefaultElements() {
1710                var selectors = this.getSettings('selectors');
1711
1712                return {
1713                    $tabTitles: this.findElement(selectors.tabTitle),
1714                    $tabContents: this.findElement(selectors.tabContent)
1715                };
1716            },
1717
1718            activateDefaultTab: function activateDefaultTab() {
1719                var settings = this.getSettings();
1720
1721                if (!settings.autoExpand || 'editor' === settings.autoExpand && !this.isEdit) {
1722                    return;
1723                }
1724
1725                var defaultActiveTab = this.getEditSettings('activeItemIndex') || 1,
1726                    originalToggleMethods = {
1727                        showTabFn: settings.showTabFn,
1728                        hideTabFn: settings.hideTabFn
1729                    };
1730
1731                // Toggle tabs without animation to avoid jumping
1732                this.setSettings({
1733                    showTabFn: 'show',
1734                    hideTabFn: 'hide'
1735                });
1736
1737                this.changeActiveTab(defaultActiveTab);
1738
1739                // Return back original toggle effects
1740                this.setSettings(originalToggleMethods);
1741            },
1742
1743            deactivateActiveTab: function deactivateActiveTab(tabIndex) {
1744                var settings = this.getSettings(),
1745                    activeClass = settings.classes.active,
1746                    activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : '.' + activeClass,
1747                    $activeTitle = this.elements.$tabTitles.filter(activeFilter),
1748                    $activeContent = this.elements.$tabContents.filter(activeFilter);
1749
1750                $activeTitle.add($activeContent).removeClass(activeClass);
1751
1752                $activeContent[settings.hideTabFn]();
1753            },
1754
1755            activateTab: function activateTab(tabIndex) {
1756                var settings = this.getSettings(),
1757                    activeClass = settings.classes.active,
1758                    $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'),
1759                    $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]');
1760
1761                $requestedTitle.add($requestedContent).addClass(activeClass);
1762
1763                $requestedContent[settings.showTabFn]();
1764            },
1765
1766            isActiveTab: function isActiveTab(tabIndex) {
1767                return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings('classes.active'));
1768            },
1769
1770            bindEvents: function bindEvents() {
1771                var _this = this;
1772
1773                this.elements.$tabTitles.on({
1774                    keydown: function keydown(event) {
1775                        if ('Enter' === event.key) {
1776                            event.preventDefault();
1777
1778                            _this.changeActiveTab(event.currentTarget.dataset.tab);
1779                        }
1780                    },
1781                    click: function click(event) {
1782                        event.preventDefault();
1783
1784                        _this.changeActiveTab(event.currentTarget.dataset.tab);
1785                    }
1786                });
1787            },
1788
1789            onInit: function onInit() {
1790                HandlerModule.prototype.onInit.apply(this, arguments);
1791
1792                this.activateDefaultTab();
1793            },
1794
1795            onEditSettingsChange: function onEditSettingsChange(propertyName) {
1796                if ('activeItemIndex' === propertyName) {
1797                    this.activateDefaultTab();
1798                }
1799            },
1800
1801            changeActiveTab: function changeActiveTab(tabIndex) {
1802                var isActiveTab = this.isActiveTab(tabIndex),
1803                    settings = this.getSettings();
1804
1805                if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) {
1806                    this.deactivateActiveTab();
1807                }
1808
1809                if (!settings.hidePrevious && isActiveTab) {
1810                    this.deactivateActiveTab(tabIndex);
1811                }
1812
1813                if (!isActiveTab) {
1814                    this.activateTab(tabIndex);
1815                }
1816            }
1817        });
1818    }),
1819    /* 6 */
1820    (function (module, exports, __webpack_require__) {
1821
1822        "use strict";
1823
1824
1825        module.exports = elementorModules.ViewModule.extend({
1826            $element: null,
1827
1828            editorListeners: null,
1829
1830            onElementChange: null,
1831
1832            onEditSettingsChange: null,
1833
1834            onGeneralSettingsChange: null,
1835
1836            onPageSettingsChange: null,
1837
1838            isEdit: null,
1839
1840            __construct: function __construct(settings) {
1841                this.$element = settings.$element;
1842
1843                this.isEdit = this.$element.hasClass('elementor-element-edit-mode');
1844
1845                if (this.isEdit) {
1846                    this.addEditorListeners();
1847                }
1848            },
1849
1850            findElement: function findElement(selector) {
1851                var $mainElement = this.$element;
1852
1853                return $mainElement.find(selector).filter(function () {
1854                    return jQuery(this).closest('.elementor-element').is($mainElement);
1855                });
1856            },
1857
1858            getUniqueHandlerID: function getUniqueHandlerID(cid, $element) {
1859                if (!cid) {
1860                    cid = this.getModelCID();
1861                }
1862
1863                if (!$element) {
1864                    $element = this.$element;
1865                }
1866
1867                return cid + $element.attr('data-element_type') + this.getConstructorID();
1868            },
1869
1870            initEditorListeners: function initEditorListeners() {
1871                var self = this;
1872
1873                self.editorListeners = [{
1874                    event: 'element:destroy',
1875                    to: elementor.channels.data,
1876                    callback: function callback(removedModel) {
1877                        if (removedModel.cid !== self.getModelCID()) {
1878                            return;
1879                        }
1880
1881                        self.onDestroy();
1882                    }
1883                }];
1884
1885                if (self.onElementChange) {
1886                    var elementName = self.getElementName(),
1887                        eventName = 'change';
1888
1889                    if ('global' !== elementName) {
1890                        eventName += ':' + elementName;
1891                    }
1892
1893                    self.editorListeners.push({
1894                        event: eventName,
1895                        to: elementor.channels.editor,
1896                        callback: function callback(controlView, elementView) {
1897                            var elementViewHandlerID = self.getUniqueHandlerID(elementView.model.cid, elementView.$el);
1898
1899                            if (elementViewHandlerID !== self.getUniqueHandlerID()) {
1900                                return;
1901                            }
1902
1903                            self.onElementChange(controlView.model.get('name'), controlView, elementView);
1904                        }
1905                    });
1906                }
1907
1908                if (self.onEditSettingsChange) {
1909                    self.editorListeners.push({
1910                        event: 'change:editSettings',
1911                        to: elementor.channels.editor,
1912                        callback: function callback(changedModel, view) {
1913                            if (view.model.cid !== self.getModelCID()) {
1914                                return;
1915                            }
1916
1917                            self.onEditSettingsChange(Object.keys(changedModel.changed)[0]);
1918                        }
1919                    });
1920                }
1921
1922                ['page', 'general'].forEach(function (settingsType) {
1923                    var listenerMethodName = 'on' + settingsType[0].toUpperCase() + settingsType.slice(1) + 'SettingsChange';
1924
1925                    if (self[listenerMethodName]) {
1926                        self.editorListeners.push({
1927                            event: 'change',
1928                            to: elementor.settings[settingsType].model,
1929                            callback: function callback(model) {
1930                                self[listenerMethodName](model.changed);
1931                            }
1932                        });
1933                    }
1934                });
1935            },
1936
1937            getEditorListeners: function getEditorListeners() {
1938                if (!this.editorListeners) {
1939                    this.initEditorListeners();
1940                }
1941
1942                return this.editorListeners;
1943            },
1944
1945            addEditorListeners: function addEditorListeners() {
1946                var uniqueHandlerID = this.getUniqueHandlerID();
1947
1948                this.getEditorListeners().forEach(function (listener) {
1949                    elementorFrontend.addListenerOnce(uniqueHandlerID, listener.event, listener.callback, listener.to);
1950                });
1951            },
1952
1953            removeEditorListeners: function removeEditorListeners() {
1954                var uniqueHandlerID = this.getUniqueHandlerID();
1955
1956                this.getEditorListeners().forEach(function (listener) {
1957                    elementorFrontend.removeListeners(uniqueHandlerID, listener.event, null, listener.to);
1958                });
1959            },
1960
1961            getElementName: function getElementName() {
1962                return this.$element.data('element_type').split('.')[0];
1963            },
1964
1965            getID: function getID() {
1966                return this.$element.data('id');
1967            },
1968
1969            getModelCID: function getModelCID() {
1970                return this.$element.data('model-cid');
1971            },
1972
1973            getElementSettings: function getElementSettings(setting) {
1974                var elementSettings = {},
1975                    modelCID = this.getModelCID();
1976
1977                if (this.isEdit && modelCID) {
1978                    var settings = elementorFrontend.config.elements.data[modelCID],
1979                        settingsKeys = elementorFrontend.config.elements.keys[settings.attributes.widgetType || settings.attributes.elType];
1980
1981                    jQuery.each(settings.getActiveControls(), function (controlKey) {
1982                        if (-1 !== settingsKeys.indexOf(controlKey)) {
1983                            elementSettings[controlKey] = settings.attributes[controlKey];
1984                        }
1985                    });
1986                } else {
1987                    elementSettings = this.$element.data('settings') || {};
1988                }
1989
1990                return this.getItems(elementSettings, setting);
1991            },
1992
1993            getEditSettings: function getEditSettings(setting) {
1994                var attributes = {};
1995
1996                if (this.isEdit) {
1997                    attributes = elementorFrontend.config.elements.editSettings[this.getModelCID()].attributes;
1998                }
1999
2000                return this.getItems(attributes, setting);
2001            },
2002
2003            onDestroy: function onDestroy() {
2004                this.removeEditorListeners();
2005
2006                if (this.unbindEvents) {
2007                    this.unbindEvents();
2008                }
2009            }
2010        });
2011    }),
2012    /* 7 */
2013    (function (module, exports, __webpack_require__) {
2014
2015        function CleverScrollTo($selector, settings) {
2016            var $ = jQuery,
2017                self = this,
2018                $window = $(window),
2019                $instance = $selector,
2020                checkTemps = $selector.find(".cafe-scrollto-sections-wrap").length,
2021                $htmlBody = $("html, body"),
2022                deviceType = $("body").data("elementor-device-mode"),
2023                $itemsList = $(".cafe-scrollto-nav-item", $instance),
2024                $menuItems = $(".cafe-scrollto-nav-menu-item", $instance),
2025                defaultSettings = {
2026                    speed: 1000,
2027                    offset: 1,
2028                    fullSection: true
2029                },
2030                settings = $.extend({}, defaultSettings, settings),
2031                sections = {},
2032                currentSection = null,
2033                isScrolling = false;
2034
2035            jQuery.extend(jQuery.easing, {
2036                easeInOutCirc: function (x, t, b, c, d) {
2037                    if ((t /= d / 2) < 1) return (-c / 2) * (Math.sqrt(1 - t * t) - 1) + b;
2038                    return (c / 2) * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
2039                }
2040            });
2041
2042            self.checkNextSection = function (object, key) {
2043                var keys = Object.keys(object),
2044                    idIndex = keys.indexOf(key),
2045                    nextIndex = (idIndex += 1);
2046
2047                if (nextIndex >= keys.length) {
2048                    return false;
2049                }
2050
2051                var nextKey = keys[nextIndex];
2052
2053                return nextKey;
2054            };
2055
2056            self.checkPrevSection = function (object, key) {
2057                var keys = Object.keys(object),
2058                    idIndex = keys.indexOf(key),
2059                    prevIndex = (idIndex -= 1);
2060
2061                if (0 > idIndex) {
2062                    return false;
2063                }
2064
2065                var prevKey = keys[prevIndex];
2066
2067                return prevKey;
2068            };
2069
2070            self.debounce = function (threshold, callback) {
2071                var timeout;
2072
2073                return function debounced($event) {
2074                    function delayed() {
2075                        callback.call(this, $event);
2076                        timeout = null;
2077                    }
2078
2079                    if (timeout) {
2080                        clearTimeout(timeout);
2081                    }
2082
2083                    timeout = setTimeout(delayed, threshold);
2084                };
2085            };
2086            self.visible = function (selector, partial, hidden) {
2087
2088                var s = selector.get(0),
2089                    vpHeight = $window.outerHeight(),
2090                    clientSize = hidden === true ? s.offsetWidth * s.offsetHeight : true;
2091                if (typeof s.getBoundingClientRect === 'function') {
2092                    var rec = s.getBoundingClientRect();
2093                    var tViz = rec.top >= 0 && rec.top < vpHeight,
2094                        bViz = rec.bottom > 0 && rec.bottom <= vpHeight,
2095                        vVisible = partial ? tViz || bViz : tViz && bViz,
2096                        vVisible = (rec.top < 0 && rec.bottom > vpHeight) ? true : vVisible;
2097                    return clientSize && vVisible;
2098                } else {
2099                    var viewTop = 0,
2100                        viewBottom = viewTop + vpHeight,
2101                        position = $window.position(),
2102                        _top = position.top,
2103                        _bottom = _top + $window.height(),
2104                        compareTop = partial === true ? _bottom : _top,
2105                        compareBottom = partial === true ? _top : _bottom;
2106                    return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
2107                }
2108
2109            };
2110
2111            self.init = function () {
2112                self.setSectionsData();
2113                $itemsList.on("click.premiumVerticalScroll", self.onNavDotChange);
2114                $menuItems.on("click.premiumVerticalScroll", self.onNavDotChange);
2115
2116                $itemsList.on("mouseenter.premiumVerticalScroll", self.onNavDotEnter);
2117
2118                $itemsList.on("mouseleave.premiumVerticalScroll", self.onNavDotLeave);
2119
2120                if (deviceType === "desktop") {
2121                    $window.on("scroll.premiumVerticalScroll", self.onWheel);
2122                }
2123                $window.on(
2124                    "resize.premiumVerticalScroll orientationchange.premiumVerticalScroll",
2125                    self.debounce(50, self.onResize)
2126                );
2127                $window.on("load", function () {
2128                    self.setSectionsData();
2129                });
2130
2131                $(document).keydown(function (event) {
2132                    if (38 == event.keyCode) {
2133                        self.onKeyUp(event, "up");
2134                    }
2135
2136                    if (40 == event.keyCode) {
2137                        self.onKeyUp(event, "down");
2138                    }
2139                });
2140                if (settings.fullSection) {
2141                    var vSection = document.getElementById($instance.attr("id"));
2142                    if (checkTemps) {
2143                        document.addEventListener ?
2144                            vSection.addEventListener("wheel", self.onWheel, !1) :
2145                            vSection.attachEvent("onmousewheel", self.onWheel);
2146                    } else {
2147                        document.addEventListener ?
2148                            document.addEventListener("wheel", self.onWheel, !1) :
2149                            document.attachEvent("onmousewheel", self.onWheel);
2150                    }
2151                }
2152
2153                for (var section in sections) {
2154                    var $section = sections[section].selector;
2155                    elementorFrontend.waypoint(
2156                        $section,
2157                        function (direction) {
2158                            var $this = $(this),
2159                                sectionId = $this.attr("id");
2160                            if ("down" === direction && !isScrolling) {
2161                                currentSection = sectionId;
2162                                $itemsList.removeClass("active");
2163                                $menuItems.removeClass("active");
2164                                $("[data-menuanchor=" + sectionId + "]", $instance).addClass(
2165                                    "active"
2166                                );
2167                            }
2168                        }, {
2169                            offset: "95%",
2170                            triggerOnce: false
2171                        }
2172                    );
2173
2174                    elementorFrontend.waypoint(
2175                        $section,
2176                        function (direction) {
2177                            var $this = $(this),
2178                                sectionId = $this.attr("id");
2179                            if ("up" === direction && !isScrolling) {
2180                                currentSection = sectionId;
2181                                $itemsList.removeClass("active");
2182                                $menuItems.removeClass("active");
2183                                $("[data-menuanchor=" + sectionId + "]", $instance).addClass(
2184                                    "active"
2185                                );
2186                            }
2187                        }, {
2188                            offset: "0%",
2189                            triggerOnce: false
2190                        }
2191                    );
2192                }
2193            };
2194
2195            self.setSectionsData = function () {
2196                $itemsList.each(function () {
2197                    var $this = $(this),
2198                        sectionId = $this.data("menuanchor"),
2199                        $section = $("#" + sectionId);
2200                    if ($section[0]) {
2201                        sections[sectionId] = {
2202                            selector: $section,
2203                            offset: Math.round($section.offset().top),
2204                            height: $section.outerHeight()
2205                        };
2206                    }
2207                });
2208            };
2209
2210            self.onNavDotEnter = function () {
2211                var $this = $(this),
2212                    index = $this.data("index");
2213                if (settings.tooltips) {
2214                    $('<div class="cafe-scrollto-nav-item-tooltip"><span>' + $this.data('label') + '</span></div>').hide().appendTo($this).fadeIn(200);
2215                }
2216            };
2217
2218            self.onNavDotLeave = function () {
2219                $(".cafe-scrollto-nav-item-tooltip").fadeOut(200, function () {
2220                    $(this).remove();
2221                });
2222            };
2223
2224            self.onNavDotChange = function (event) {
2225                var $this = $(this),
2226                    index = $this.index(),
2227                    sectionId = $this.data("menuanchor"),
2228                    offset = null;
2229
2230                if (!sections.hasOwnProperty(sectionId)) {
2231                    return false;
2232                }
2233
2234                offset = sections[sectionId].offset - settings.offset;
2235
2236                if (!isScrolling) {
2237                    isScrolling = true;
2238
2239                    currentSection = sectionId;
2240                    $menuItems.removeClass("active");
2241                    $itemsList.removeClass("active");
2242
2243                    if ($this.hasClass("cafe-scrollto-nav-menu-item")) {
2244                        $($itemsList[index]).addClass("active");
2245                    } else {
2246                        $($menuItems[index]).addClass("active");
2247                    }
2248
2249                    $this.addClass("active");
2250
2251                    $htmlBody
2252                        .stop()
2253                        .clearQueue()
2254                        .animate({
2255                                scrollTop: offset
2256                            },
2257                            settings.speed,
2258                            "easeInOutCirc",
2259                            function () {
2260                                isScrolling = false;
2261                            }
2262                        );
2263                }
2264            };
2265
2266            self.onKeyUp = function (event, direction) {
2267                var direction = direction || "up",
2268                    sectionId,
2269                    nextItem = $(
2270                        ".cafe-scrollto-nav-item[data-menuanchor=" + currentSection + "]",
2271                        $instance
2272                    ).next(),
2273                    prevItem = $(
2274                        ".cafe-scrollto-nav-item[data-menuanchor=" + currentSection + "]",
2275                        $instance
2276                    ).prev();
2277
2278                event.preventDefault();
2279
2280                if (isScrolling) {
2281                    return false;
2282                }
2283
2284                if ("up" === direction) {
2285                    if (prevItem[0]) {
2286                        prevItem.trigger("click.premiumVerticalScroll");
2287                    }
2288                }
2289
2290                if ("down" === direction) {
2291                    if (nextItem[0]) {
2292                        nextItem.trigger("click.premiumVerticalScroll");
2293                    }
2294                }
2295            };
2296
2297            self.onScroll = function (event) {
2298                /* On Scroll Event */
2299                if (isScrolling) {
2300                    event.preventDefault();
2301                }
2302            };
2303
2304            function getFirstSection(object) {
2305                return Object.keys(object)[0];
2306            }
2307
2308            function getLastSection(object) {
2309                return Object.keys(object)[Object.keys(object).length - 1];
2310            }
2311
2312            function getDirection(e) {
2313                e = window.event || e;
2314                var t = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY || -e.detail));
2315                return t;
2316            }
2317
2318            self.onWheel = function (event) {
2319                if (isScrolling) {
2320                    event.preventDefault();
2321                    return false;
2322                }
2323
2324                var $target = $(event.target),
2325                    sectionSelector = checkTemps ?
2326                        ".cafe-scrollto-temp" :
2327                        ".elementor-top-section",
2328                    $section = $target.closest(sectionSelector),
2329                    $vTarget = self.visible($instance, true, false),
2330                    sectionId = $section.attr("id"),
2331                    offset = 0,
2332                    newSectionId = false,
2333                    prevSectionId = false,
2334                    nextSectionId = false,
2335                    delta = getDirection(event),
2336                    direction = 0 > delta ? "down" : "up",
2337                    windowScrollTop = $window.scrollTop(),
2338                    dotIndex = $(".cafe-scrollto-nav-item.active").index();
2339                if ("mobile" === deviceType || "tablet" === deviceType) {
2340                    $(".cafe-scrollto-nav-item-tooltip").hide();
2341                    if (dotIndex === $itemsList.length - 1 && !$vTarget) {
2342                        $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass(
2343                            "cafe-scrollto-nav-icons-hide"
2344                        );
2345                    } else if (dotIndex === 0 && !$vTarget) {
2346                        if ($instance.offset().top - $(document).scrollTop() > 200) {
2347                            $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass(
2348                                "cafe-scrollto-nav-icons-hide"
2349                            );
2350                        }
2351                    } else {
2352                        $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").removeClass(
2353                            "cafe-scrollto-nav-icons-hide"
2354                        );
2355                    }
2356                }
2357
2358                if (beforeCheck()) {
2359                    sectionId = getFirstSection(sections);
2360                }
2361
2362                if (afterCheck()) {
2363                    sectionId = getLastSection(sections);
2364                }
2365                if (sectionId && sections.hasOwnProperty(sectionId)) {
2366                    prevSectionId = self.checkPrevSection(sections, sectionId);
2367                    nextSectionId = self.checkNextSection(sections, sectionId);
2368                    if ("up" === direction) {
2369                        if (!nextSectionId && sections[sectionId].offset < windowScrollTop) {
2370                            newSectionId = sectionId;
2371                        } else {
2372                            newSectionId = prevSectionId;
2373                        }
2374                    }
2375
2376                    if ("down" === direction) {
2377                        if (
2378                            !prevSectionId &&
2379                            sections[sectionId].offset > windowScrollTop + 5
2380                        ) {
2381                            newSectionId = sectionId;
2382                        } else {
2383                            newSectionId = nextSectionId;
2384                        }
2385                    }
2386
2387                    if (newSectionId) {
2388                        $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").removeClass(
2389                            "cafe-scrollto-nav-icons-hide"
2390                        );
2391                        event.preventDefault();
2392                        offset = sections[newSectionId].offset - settings.offset;
2393                        currentSection = newSectionId;
2394                        $itemsList.removeClass("active");
2395                        $menuItems.removeClass("active");
2396                        $("[data-menuanchor=" + newSectionId + "]", $instance).addClass(
2397                            "active"
2398                        );
2399
2400                        isScrolling = true;
2401                        self.scrollStop();
2402                        $htmlBody.animate({
2403                                scrollTop: offset
2404                            },
2405                            settings.speed,
2406                            "easeInOutCirc",
2407                            function () {
2408                                isScrolling = false;
2409                            }
2410                        );
2411                    } else {
2412                        var $lastselector = checkTemps ? $instance : $("#" + sectionId);
2413                        if ("down" === direction) {
2414                            if (
2415                                $lastselector.offset().top +
2416                                $lastselector.innerHeight() -
2417                                $(document).scrollTop() >
2418                                600
2419                            ) {
2420                                $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass(
2421                                    "cafe-scrollto-nav-icons-hide"
2422                                );
2423                            }
2424                        } else if ("up" === direction) {
2425                            if ($lastselector.offset().top - $(document).scrollTop() > 200) {
2426                                $(".cafe-scrollto-nav-icons, .cafe-scrollto-nav-menu").addClass(
2427                                    "cafe-scrollto-nav-icons-hide"
2428                                );
2429                            }
2430                        }
2431                    }
2432                }
2433            }
2434
2435            function beforeCheck(event) {
2436                var windowScrollTop = $window.scrollTop(),
2437                    firstSectionId = getFirstSection(sections),
2438                    offset = sections[firstSectionId].offset,
2439                    topBorder = windowScrollTop + $window.outerHeight(),
2440                    visible = self.visible($instance, true, false);
2441
2442                if (topBorder > offset) {
2443                    return false;
2444                } else if (visible) {
2445                    return true;
2446                }
2447                return false;
2448            }
2449
2450            function afterCheck(event) {
2451                var windowScrollTop = $window.scrollTop(),
2452                    lastSectionId = getLastSection(sections),
2453                    offset = sections[lastSectionId].offset,
2454                    bottomBorder =
2455                        sections[lastSectionId].offset + sections[lastSectionId].height,
2456                    visible = self.visible($instance, true, false);
2457
2458                if (windowScrollTop < bottomBorder) {
2459                    return false;
2460                } else if (visible) {
2461                    return true;
2462                }
2463
2464                return false;
2465            }
2466
2467            self.onResize = function (event) {
2468                self.setSectionsData();
2469            };
2470
2471            self.scrollStop = function () {
2472                $htmlBody.stop(true);
2473            };
2474        }
2475
2476        module.exports = function ($scope) {
2477            var section = $scope.find(".cafe-scrollto-section");
2478            var module = new CleverScrollTo(section, section.data("settings"));
2479            module.init();
2480        }
2481    })
2482]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.