PageSourceSearch

https://moiyakutsk.ru/wp-content/plugins/master-addons/assets/js/master-addons-scripts.js?ver=2.0.8.7

js moiyakutsk.ru collected 2026-09-25 01:39:27 UTC 161,966 bytes, 3,759 lines download raw bytes

1/*
2* Frontend Script for Elementor
3*/
4; (function ($)
5{
6    "use strict";
7
8    var editMode = false;
9    var isRellax = false;
10    var currentDevice = '';
11
12    var getElementSettings = function ($element, setting)
13    {
14
15        var elementSettings = {},
16            modelCID = $element.data('model-cid');
17
18        if (elementorFrontend.isEditMode() && modelCID)
19        {
20            var settings = elementorFrontend.config.elements.data[modelCID],
21                type = settings.attributes.widgetType || settings.attributes.elType,
22                settingsKeys = elementorFrontend.config.elements.keys[type];
23
24            if (!settingsKeys)
25            {
26                settingsKeys = elementorFrontend.config.elements.keys[type] = [];
27
28                jQuery.each(settings.controls, function (name, control)
29                {
30                    if (control.frontend_available)
31                    {
32                        settingsKeys.push(name);
33                    }
34                });
35            }
36
37            jQuery.each(settings.getActiveControls(), function (controlKey)
38            {
39                if (-1 !== settingsKeys.indexOf(controlKey))
40                {
41                    elementSettings[controlKey] = settings.attributes[controlKey];
42                }
43            });
44        } else
45        {
46            elementSettings = $element.data('settings') || {};
47        }
48
49        return getItems(elementSettings, setting);
50
51    };
52
53    var getItems = function (items, itemKey)
54    {
55        if (itemKey)
56        {
57            var keyStack = itemKey.split('.'),
58                currentKey = keyStack.splice(0, 1);
59
60            if (!keyStack.length)
61            {
62                return items[currentKey];
63            }
64
65            if (!items[currentKey])
66            {
67                return;
68            }
69
70            return this.getItems(items[currentKey], keyStack.join('.'));
71        }
72
73        return items;
74    };
75
76    var getUniqueLoopScopeId = function ($scope)
77    {
78        if ($scope.data('jltma-template-widget-id'))
79        {
80            return $scope.data('jltma-template-widget-id');
81        }
82        return $scope.data('id');
83    };
84
85    // IntersectionObserver API integration
86    function jltMAObserveTarget(target, callback) {
87        var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
88        var observer = new IntersectionObserver(function (entries, observer) {
89            entries.forEach(function (entry) {
90                if (entry.isIntersecting) {
91                    callback(entry);
92                }
93            });
94        }, options);
95        observer.observe(target);
96    }
97
98    function sanitizeTooltipText(text) {
99        const tempDiv = document.createElement('div');
100        tempDiv.textContent = text;
101        return tempDiv.innerHTML;
102    }
103
104    function stripTags(text) {
105        return text.replace(/<\/?[^>]+(>|$)/g, '');
106    }
107
108
109    var Master_Addons = {
110
111        animatedProgressbar: function (id, type, value, strokeColor, trailColor, strokeWidth, strokeTrailWidth)
112        {
113            var triggerClass = '.jltma-progress-bar-' + id;
114            if ("line" == type)
115            {
116                new ldBar(triggerClass, {
117                    "type": 'stroke',
118                    "path": 'M0 10L100 10',
119                    "aspect-ratio": 'none',
120                    "stroke": strokeColor,
121                    "stroke-trail": trailColor,
122                    "stroke-width": strokeWidth,
123                    "stroke-trail-width": strokeTrailWidth
124                }).set(value);
125            }
126            if ("line-bubble" == type)
127            {
128                new ldBar(triggerClass, {
129                    "type": 'stroke',
130                    "path": 'M0 10L100 10',
131                    "aspect-ratio": 'none',
132                    "stroke": strokeColor,
133                    "stroke-trail": trailColor,
134                    "stroke-width": strokeWidth,
135                    "stroke-trail-width": strokeTrailWidth
136                }).set(value);
137                $($('.jltma-progress-bar-' + id).find('.ldBar-label')).animate({
138                    left: value + '%'
139                }, 1000, 'swing');
140            }
141            if ("circle" == type)
142            {
143                new ldBar(triggerClass, {
144                    "type": 'stroke',
145                    "path": 'M50 10A40 40 0 0 1 50 90A40 40 0 0 1 50 10',
146                    "stroke-dir": 'normal',
147                    "stroke": strokeColor,
148                    "stroke-trail": trailColor,
149                    "stroke-width": strokeWidth,
150                    "stroke-trail-width": strokeTrailWidth,
151                }).set(value);
152            }
153            if ("fan" == type)
154            {
155                new ldBar(triggerClass, {
156                    "type": 'stroke',
157                    "path": 'M10 90A40 40 0 0 1 90 90',
158                    "stroke": strokeColor,
159                    "stroke-trail": trailColor,
160                    "stroke-width": strokeWidth,
161                    "stroke-trail-width": strokeTrailWidth,
162                }).set(value);
163            }
164        },
165
166
167        // Master Addons: Headlines
168
169        MA_Animated_Headlines: function ($scope, $)
170        {
171            try
172            {
173                (function ($)
174                {
175
176                    Master_Addons.MA_Animated_Headlines.elementSettings = getElementSettings($scope);
177
178                    /*----------- Animated Headlines --------------*/
179                    //set animation timing
180                    var $animatedHeaderContainer = $scope.find('.jltma-animated-headline').eq(0),
181
182                        animationDelay = Master_Addons.MA_Animated_Headlines.elementSettings.anim_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.anim_delay : 2500,
183
184                        //loading bar effect
185                        barAnimationDelay = Master_Addons.MA_Animated_Headlines.elementSettings.bar_anim_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.bar_anim_delay : 3800,
186                        barWaiting = barAnimationDelay - 3000, //3000 is the duration of the transition on the loading bar - set in the scss/css file
187
188                        //letters effect
189                        lettersDelay = Master_Addons.MA_Animated_Headlines.elementSettings.letters_anim_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.letters_anim_delay : 50,
190
191                        //type effect
192                        typeLettersDelay = Master_Addons.MA_Animated_Headlines.elementSettings.type_anim_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.type_anim_delay : 150,
193                        selectionDuration = Master_Addons.MA_Animated_Headlines.elementSettings.type_selection_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.type_selection_delay : 500,
194                        typeAnimationDelay = selectionDuration + 800,
195
196                        //clip effect
197                        revealDuration = Master_Addons.MA_Animated_Headlines.elementSettings.clip_reveal_delay ? Master_Addons.MA_Animated_Headlines.elementSettings.clip_reveal_delay : 600,
198                        revealAnimationDelay = Master_Addons.MA_Animated_Headlines.elementSettings.clip_anim_duration ? Master_Addons.MA_Animated_Headlines.elementSettings.clip_anim_duration : 1500;
199
200
201                    Master_Addons.MA_Animated_Headlines.singleLetters = function ($words)
202                    {
203                        $words.each(function ()
204                        {
205                            var word = $(this),
206                                letters = word.text().trim().split(''),
207                                selected = word.hasClass('is-visible');
208
209                            for (var i = 0; i < letters.length; i++)
210                            {
211                                if (word.parents('.rotate-2').length > 0) { letters[i] = '<em>' + letters[i] + '</em>'; }
212                                letters[i] = (selected) ? '<i class="in">' + letters[i] + '</i>' : '<i>' + letters[i] + '</i>';
213                            }
214                            var newLetters = letters.join('');
215                            word.html(newLetters).css('opacity', 1);
216                        });
217                    }
218
219                    // function animateHeadline($headlines) {
220                    Master_Addons.MA_Animated_Headlines.animateHeadline = function ($headlines)
221                    {
222
223                        var duration = animationDelay;
224
225                        $headlines.each(function ()
226                        {
227                            var headline = $(this);
228
229                            if (headline.hasClass('loading-bar'))
230                            {
231                                duration = barAnimationDelay;
232                                setTimeout(function () { headline.find('.ma-el-words-wrapper').addClass('is-loading') }, barWaiting);
233                            } else if (headline.hasClass('clip'))
234                            {
235                                var spanWrapper = headline.find('.ma-el-words-wrapper'),
236                                    newWidth = spanWrapper.width() + 10
237                                spanWrapper.css('width', newWidth);
238                            } else if (!headline.hasClass('type'))
239                            {
240                                //assign to .ma-el-words-wrapper the width of its longest word
241                                var words = headline.find('.ma-el-words-wrapper b'),
242                                    width = 0;
243
244                                words.each(function ()
245                                {
246                                    var wordWidth = $(this).width();
247                                    if (wordWidth > width) width = wordWidth;
248                                });
249                                headline.find('.ma-el-words-wrapper').css('width', width);
250                            };
251
252                            //trigger animation
253                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord(headline.find('.is-visible').eq(0)) }, duration);
254                        });
255                    }
256
257
258                    Master_Addons.MA_Animated_Headlines.hideWord = function ($word)
259                    {
260
261                        var nextWord = Master_Addons.MA_Animated_Headlines.takeNext($word);
262
263                        if ($word.parents('.jltma-animated-headline').hasClass('type'))
264                        {
265                            var parentSpan = $word.parent('.jltma-words-wrapper');
266                            parentSpan.addClass('selected').removeClass('waiting');
267                            setTimeout(function ()
268                            {
269                                parentSpan.removeClass('selected');
270                                $word.removeClass('is-visible').addClass('is-hidden').children('i').removeClass('in').addClass('out');
271                            }, selectionDuration);
272                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.showWord(nextWord, typeLettersDelay) }, typeAnimationDelay);
273
274                        } else if ($word.parents('.jltma-animated-headline').hasClass('letters'))
275                        {
276                            var bool = ($word.children('i').length >= nextWord.children('i').length) ? true : false;
277                            Master_Addons.MA_Animated_Headlines.hideLetter($word.find('i').eq(0), $word, bool, lettersDelay);
278                            Master_Addons.MA_Animated_Headlines.showLetter(nextWord.find('i').eq(0), nextWord, bool, lettersDelay);
279
280                        } else if ($word.parents('.jltma-animated-headline').hasClass('clip'))
281                        {
282                            $word.parents('.jltma-words-wrapper').animate({ width: '2px' }, revealDuration, function ()
283                            {
284                                Master_Addons.MA_Animated_Headlines.switchWord($word, nextWord);
285                                Master_Addons.MA_Animated_Headlines.showWord(nextWord);
286                            });
287
288                        } else if ($word.parents('.jltma-animated-headline').hasClass('loading-bar'))
289                        {
290                            $word.parents('.jltma-words-wrapper').removeClass('is-loading');
291                            Master_Addons.MA_Animated_Headlines.switchWord($word, nextWord);
292                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord(nextWord) }, barAnimationDelay);
293                            setTimeout(function () { $word.parents('.jltma-words-wrapper').addClass('is-loading') }, barWaiting);
294
295                        } else
296                        {
297                            Master_Addons.MA_Animated_Headlines.switchWord($word, nextWord);
298                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord(nextWord) }, animationDelay);
299                        }
300                    }
301
302                    Master_Addons.MA_Animated_Headlines.showWord = function ($word, $duration)
303                    {
304                        if ($word.parents('.jltma-animated-headline').hasClass('type'))
305                        {
306                            Master_Addons.MA_Animated_Headlines.showLetter($word.find('i').eq(0), $word, false, $duration);
307                            $word.addClass('is-visible').removeClass('is-hidden');
308
309                        } else if ($word.parents('.jltma-animated-headline').hasClass('clip'))
310                        {
311                            $word.parents('.jltma-words-wrapper').animate({ 'width': $word.width() + 10 }, revealDuration, function ()
312                            {
313                                setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord($word) }, revealAnimationDelay);
314                            });
315                        }
316                    }
317
318                    Master_Addons.MA_Animated_Headlines.hideLetter = function ($letter, $word, $bool, $duration)
319                    {
320                        $letter.removeClass('in').addClass('out');
321
322                        if (!$letter.is(':last-child'))
323                        {
324                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideLetter($letter.next(), $word, $bool, $duration); }, $duration);
325                        } else if ($bool)
326                        {
327                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord(Master_Addons.MA_Animated_Headlines.takeNext($word)) }, animationDelay);
328                        }
329
330                        if ($letter.is(':last-child') && $('html').hasClass('no-csstransitions'))
331                        {
332                            var nextWord = Master_Addons.MA_Animated_Headlines.takeNext($word);
333                            Master_Addons.MA_Animated_Headlines.switchWord($word, nextWord);
334                        }
335                    }
336
337                    Master_Addons.MA_Animated_Headlines.showLetter = function ($letter, $word, $bool, $duration)
338                    {
339                        $letter.addClass('in').removeClass('out');
340
341                        if (!$letter.is(':last-child'))
342                        {
343                            setTimeout(function () { Master_Addons.MA_Animated_Headlines.showLetter($letter.next(), $word, $bool, $duration); }, $duration);
344                        } else
345                        {
346                            if ($word.parents('.jltma-animated-headline').hasClass('type')) { setTimeout(function () { $word.parents('.jltma-words-wrapper').addClass('waiting'); }, 200); }
347                            if (!$bool) { setTimeout(function () { Master_Addons.MA_Animated_Headlines.hideWord($word) }, animationDelay) }
348                        }
349                    }
350
351                    Master_Addons.MA_Animated_Headlines.takeNext = function ($word)
352                    {
353                        return (!$word.is(':last-child')) ? $word.next() : $word.parent().children().eq(0);
354                    }
355
356                    Master_Addons.MA_Animated_Headlines.takePrev = function ($word)
357                    {
358                        return (!$word.is(':first-child')) ? $word.prev() : $word.parent().children().last(
358);
359                    }
360
361                    Master_Addons.MA_Animated_Headlines.switchWord = function ($oldWord, $newWord)
362                    {
363                        $oldWord.removeClass('is-visible').addClass('is-hidden');
364                        $newWord.removeClass('is-hidden').addClass('is-visible');
365                    }
366
367                    Master_Addons.MA_Animated_Headlines.initHeadline = function ()
368                    {
369                        //insert <i> element for each letter of a changing word
370                        Master_Addons.MA_Animated_Headlines.singleLetters($('.jltma-animated-headline.letters').find('b'));
371                        //initialise headline animation
372                        Master_Addons.MA_Animated_Headlines.animateHeadline($('.jltma-animated-headline'));
373                    }
374
375                    Master_Addons.MA_Animated_Headlines.initHeadline();
376
377                })(jQuery);
378            } catch (e)
379            {
380                //We can also throw from try block and catch it here
381                // No Error Show
382            }
383
384        },
385
386        // Master Addons: Accordion
387        MA_Accordion: function ($scope, $)
388        {
389
390            var elementSettings = getElementSettings($scope),
391                $accordionHeader = $scope.find(".jltma-accordion-header"),
392                $accordionType = elementSettings.accordion_type,
393                $accordionSpeed = elementSettings.toggle_speed ? elementSettings.toggle_speed : 300;
394
395            // Open default actived tab
396            $accordionHeader.each(function ()
397            {
398                if ($(this).hasClass("active-default"))
399                {
400                    $(this).addClass("show active");
401                    $(this).next().slideDown($accordionSpeed);
402                }
403            });
404
405            // Remove multiple click event for nested accordion
406            $accordionHeader.unbind("click");
407
408            $accordionHeader.click(function (e)
409            {
410                e.preventDefault();
411                var $this = $(this);
412                if ($accordionType === "accordion")
413                {
414                    if ($this.hasClass("show"))
415                    {
416                        $this.removeClass("show active");
417                        $this.next().slideUp($accordionSpeed);
418                    } else
419                    {
420                        $this.parent().parent().find(".jltma-accordion-header").removeClass("show active");
421                        $this.parent().parent().find(".jltma-accordion-tab-content").slideUp($accordionSpeed);
422                        $this.toggleClass("show active");
423                        $this.next().slideDown($accordionSpeed);
424                    }
425                } else
426                {
427                    // Toggle type Accordion
428                    if ($this.hasClass("show"))
429                    {
430                        $this.removeClass("show active");
431                        $this.next().slideUp($accordionSpeed);
432                    } else
433                    {
434                        $this.addClass("show active");
435                        $this.next().slideDown($accordionSpeed);
436                    }
437                }
438            });
439
440        },
441
442
443
444        // Master Addons: Tabs
445
446        MA_Tabs: function ($scope, $)
447        {
448
449            try
450            {
451                (function ($)
452                {
453
454                    var $tabsWrapper = $scope.find('[data-tabs]'),
455                        $tabEffect = $tabsWrapper.data('tab-effect');
456
457
458                    $tabsWrapper.each(function ()
459                    {
460                        var tab = $(this);
461                        var isTabActive = false;
462                        var isContentActive = false;
463
464                        tab.find('[data-tab]').each(function ()
465                        {
466                            if ($(this).hasClass('active'))
467                            {
468                                isTabActive = true;
469                            }
470                        });
471                        tab.find('.jltma--advance-tab-content').each(function ()
472                        {
473                            if ($(this).hasClass('active'))
474                            {
475                                isContentActive = true;
476                            }
477                        });
478                        if (!isContentActive)
479                        {
480                            tab.find('.jltma--advance-tab-content').eq(0).addClass('active');
481                        }
482
483                        if ($tabEffect == "hover")
484                        {
485                            tab.find('[data-tab]').hover(function ()
486                            {
487                                var $data_tab_id = $(this).data('tab-id');
488                                $(this).siblings().removeClass('active');
489                                $(this).addClass('active');
490                                $(this).closest('[data-tabs]').find('.jltma--advance-tab-content').removeClass('active');
491                                $('#' + $data_tab_id).addClass('active');
492                            });
493                        } else
494                        {
495                            tab.find('[data-tab]').click(function ()
496                            {
497                                var $data_tab_id = $(this).data('tab-id');
498                                $(this).siblings().removeClass('active');
499                                $(this).addClass('active');
500                                $(this).closest('[data-tabs]').find('.jltma--advance-tab-content').removeClass('active');
501                                $('#' + $data_tab_id).addClass('active');
502                            });
503                        }
504                    });
505
506                })(jQuery);
507            } catch (e)
508            {
509                //We can also throw from try block and catch it here
510                // No Error Show
511            }
512
513
514        },
515
516
517        //Master Addons: Progressbar
518        MA_ProgressBar: function ($scope, $)
519        {
520            var id = $scope.data('id'),
521                $progressBarWrapper = $scope.find('.jltma-progress-bar-' + id),
522                type = $progressBarWrapper.data('type'),
523                value = $progressBarWrapper.data('progress-bar-value'),
524                strokeWidth = $progressBarWrapper.data('progress-bar-stroke-width'),
525                strokeTrailWidth = $progressBarWrapper.data('progress-bar-stroke-trail-width'),
526                color = $progressBarWrapper.data('stroke-color'),
527                trailColor = $progressBarWrapper.data('stroke-trail-color');
528            Master_Addons.animatedProgressbar(id, type, value, color, trailColor, strokeWidth, strokeTrailWidth);
529        },
530
531        //Master Addons: Image Hotspot
532        MA_Image_Hotspot: function ($scope, $)
533        {
534
535            var elementSettings = getElementSettings($scope),
536                $ma_hotspot = $scope.find('.jltma-hotspots-container');
537
538            if (!$ma_hotspot.length)
539            {
540                return;
541            }
542
543            var $tooltip = $ma_hotspot.find('> .jltma-tooltip-item'),
544                widgetID = $scope.data('id');
545
546            $tooltip.each(function (index)
547            {
548                tippy(this, {
549                    allowHTML: false,
550                    theme: 'jltma-tippy-' + widgetID
551                });
552            });
553        },
554
555
556        //Master Addons: Pricing Table
557        MA_Pricing_Table: function ($scope, $)
558        {
559
560            var $jltma_pricing_table = $scope.find('.jltma-price-table-details ul');
561
562            if (!$jltma_pricing_table.length)
563            {
564                return;
565            }
566
567            var $tooltip = $jltma_pricing_table.find('> .jltma-tooltip-item'),
568                widgetID = $scope.data('id');
569
570            $tooltip.each(function (index)
571            {
572                tippy(this, {
573                    allowHTML: false,
574                    theme: 'jltma-pricing-table-tippy-' + widgetID,
575                });
576            });
577        },
578
579
580        
581
582        // Dynamic Data Tables
583        JLTMA_Data_Table: function ($scope, $)
584        {
585            var a = $scope.find(".jltma-data-table-container"),
586                n = a.data("source"),
587                r = a.data("sourcecsv");
588            if (1 == a.data("buttons")) var l = "Bfrtip";
589            else l = "frtip";
590            if ("custom" == n)
591            {
592                var i = $scope.find("table thead tr th").length;
593                $scope.find("table tbody tr").each(function ()
594                {
595                    if (e(this).find("td").length < i)
596                    {
597                        var t = i - e(this).find("td").length;
598                        e(this).append(new Array(++t).join("<td></td>"))
599                    }
600                }), $scope.find(".jltma-data-table").DataTable({
601                    dom: l,
602                    paging: a.data("paging"),
603                    pagingType: "numbers",
604                    pageLength: a.data("pagelength"),
605                    info: a.data("info"),
606                    scrollX: !0,
607                    searching: a.data("searching"),
608                    ordering: a.data("ordering"),
609                    buttons: [{
610                        extend: "csvHtml5",
611                        text: jltma_data_table_vars.csvHtml5
612                    }, {
613                        extend: "excelHtml5",
614                        text: jltma_data_table_vars.excelHtml5
615                    }, {
616                        extend: "pdfHtml5",
617                        text: jltma_data_table_vars.pdfHtml5
618                    }, {
619                        extend: "print",
620                        text: jltma_data_table_vars.print
621                    }],
622                    language: {
623                        lengthMenu: jltma_data_table_vars.lengthMenu,
624                        zeroRecords: jltma_data_table_vars.zeroRecords,
625                        info: jltma_data_table_vars.info,
626                        infoEmpty: jltma_data_table_vars.infoEmpty,
627                        infoFiltered: jltma_data_table_vars.infoFiltered,
628                        search: "",
629                        searchPlaceholder: jltma_data_table_vars.searchPlaceholder,
630                        processing: jltma_data_table_vars.processing
631                    }
632                })
633            } else if ("csv" == n)
634            {
635                ({
636                    init: function (t)
637                    {
638                        var a = (t = t || {}).csv_path || "",
639                            n = $scope.element || $("#table-container"),
640                            r = $scope.csv_options || {},
641                            l = $scope.datatables_options || {},
642                            i = $scope.custom_formatting || [],
643                            s = {};
644                        $.each(i, function (e, t)
645                        {
646                            var a = t[0],
647                                n = t[1];
648                            s[a] = n
649                        });
650                        var d = $('<table class="jltma-data-table cell-border" style="width:100%;visibility:hidden;">');
651                        n.empty().append(d), $.when($.get(a)).then(function (t)
652                        {
653                            for (var a = e.csv.toArrays(t, r), n = $("<thead></thead>"), i = a[0], o = $("<tr></tr>"), c = 0; c < i.length; c++) o.append($("<th></th>").text(i[c]));
654                            n.append(o), d.append(n);
655                            for (var m = $("<tbody></tbody>
655"), p = 1; p < a.length; p++)
656                                for (var _ = $("<tr></tr>"), g = 0; g < a[p].length; g++)
657                                {
658                                    var b = $("<td></td>"),
659                                        f = s[g];
660                                    f ? b.html(f(a[p][g])) : b.text(a[p][g]), _.append(b), m.append(_)
661                                }
662                            d.append(m), d.DataTable(l)
663                        })
664                    }
665                }).init({
666                    csv_path: r,
667                    element: a,
668                    datatables_options: {
669                        dom: l,
670                        paging: a.data("paging"),
671                        pagingType: "numbers",
672                        pageLength: a.data("pagelength"),
673                        info: a.data("info"),
674                        scrollX: !0,
675                        searching: a.data("searching"),
676                        ordering: a.data("ordering"),
677                        buttons: [{
678                            extend: "csvHtml5",
679                            text: jltma_data_table_vars.csvHtml5
680                        }, {
681                            extend: "excelHtml5",
682                            text: jltma_data_table_vars.excelHtml5
683                        }, {
684                            extend: "pdfHtml5",
685                            text: jltma_data_table_vars.pdfHtml5
686                        }, {
687                            extend: "print",
688                            text: jltma_data_table_vars.print
689                        }],
690                        language: {
691                            lengthMenu: jltma_data_table_vars.lengthMenu,
692                            zeroRecords: jltma_data_table_vars.zeroRecords,
693                            info: jltma_data_table_vars.info,
694                            infoEmpty: jltma_data_table_vars.infoEmpty,
695                            infoFiltered: jltma_data_table_vars.infoFiltered,
696                            search: "",
697                            searchPlaceholder: jltma_data_table_vars.searchPlaceholder,
698                            processing: jltma_data_table_vars.processing
699                        }
700                    }
701                })
702            }
703            $scope.find(".jltma-data-table").css("visibility", "visible");
704        },
705
706        // Dropdown Button
707        JLTMA_Dropdown_Button: function ($scope, $)
708        {
709
710            $scope.find(".jltma-dropdown").hover(
711                function ()
712                {
713                    $scope.find(".jltma-dd-menu").addClass("jltma-dd-menu-opened");
714                },
715                function ()
716                {
717                    $scope.find(".jltma-dd-menu").removeClass("jltma-dd-menu-opened");
718                }
719            );
720        },
721
722        JLTMA_WC_Add_To_Cart: function ($scope, $)
723        {
724            $(document).on('click', '.ajax_add_to_cart', function (e)
725            {
726                $(this).append('<i class="fa fa-spinner animated rotateIn infinite"></i>');
727            });
728
729            $(".jltma-wc-add-to-cart-btn-custom-js").each(function (index)
730            {
731                var custom_css = $(this).attr("data-jltma-wc-add-to-cart-btn-custom-css");
732                $(custom_css).appendTo("head");
733            });
734        },
735
736        /* Offcanvas Menu */
737        MA_Offcanvas_Menu: function ($scope, $)
738        {
739            Master_Addons.MA_Offcanvas_Menu.elementSettings = $scope.data('settings');
740
741            var widgetSelector = 'jltma-offcanvas-menu',
742                getID = $scope.data('id'),
743                getElementSettings = $scope.data('settings'),
744                is_esc_close = getElementSettings.esc_close ? getElementSettings.esc_close : '',
745                classes = {
746                    widget: widgetSelector,
747                    triggerButton: 'jltma-offcanvas__trigger',
748                    offcanvasContent: 'jltma-offcanvas__content',
749                    offcanvasContentBody: "".concat(widgetSelector, "__body"),
750                    offcanvasContainer: "".concat(widgetSelector, "__container"),
751                    offcanvasContainerOverlay: "".concat(widgetSelector, "__container__overlay"),
752                    offcanvasWrapper: "".concat(widgetSelector, "__wrapper"),
753                    closeButton: "".concat(widgetSelector, "__close"),
754                    menuArrow: "".concat(widgetSelector, "__arrow"),
755                    menuInner: "".concat(widgetSelector, "__menu-inner"),
756                    itemHasChildrenLink: 'menu-item-has-children > a',
757                    contentClassPart: 'jltma-offcanvas-content',
758                    contentOpenClass: 'jltma-offcanvas-content-open',
759                    customContainer: "".concat(widgetSelector, "__custom-container")
760                },
761                selectors = {
762                    widget: ".".concat(classes.widget),
763                    triggerButton: ".".concat(classes.triggerButton),
764                    offcanvasContent: ".".concat(classes.offcanvasContent),
765                    offcanvasContentBody: ".".concat(classes.offcanvasContentBody),
766                    offcanvasContainer: ".".concat(classes.offcanvasContainer),
767                    offcanvasContainerOverlay: ".".concat(classes.offcanvasContainerOverlay),
768                    offcanvasWrapper: ".".concat(classes.offcanvasWrapper),
769                    closeButton: ".".concat(classes.closeButton),
770                    menuArrow: ".".concat(classes.menuArrow),
771                    menuParent: ".".concat(classes.menuInner, " .").concat(classes.itemHasChildrenLink),
772                    contentClassPart: ".".concat(classes.contentClassPart),
773                    contentOpenClass: ".".concat(classes.contentOpenClass),
774                    customContainer: ".".concat(classes.customContainer)
775                },
776                elements = {
777                    $document: jQuery(document),
778                    $html: jQuery(document).find('html'),
779                    $body: jQuery(document).find('body'),
780                    $outsideContainer: jQuery(selectors.offcanvasContainer),
781                    $containerOverlay: jQuery(selectors.offcanvasContainerOverlay),
782                    $triggerButton: $scope.find(selectors.triggerButton),
783                    $offcanvasContent: $scope.find(selectors.offcanvasContent),
784                    $offcanvasContentBody: $scope.find(selectors.offcanvasContentBody),
785                    $offcanvasContainer: $scope.find(selectors.offcanvasContainer),
786                    $offcanvasWrapper: $scope.find(selectors.offcanvasWrapper),
787                    $closeButton: $scope.find(selectors.closeButton),
788                    $menuParent: $scope.find(selectors.menuParent)
789                };
790
791            // resetCanvas
792            Master_Addons.MA_Offcanvas_Menu.resetCanvas = function ()
793            {
794                var contentId = getID;
795                elements.$html.addClass("".concat(classes.offcanvasContent, "-widget"));
796
797                if (!elements.$outsideContainer.length)
798                {
799                    elements.$body.append("<div class=\"".concat(classes.offcanvasContainerOverlay, "\" />"));
800                    elements.$body.wrapInner("<div class=\"".concat(classes.offcanvasContainer, "\" />"));
801                    elements.$offcanvasContent.insertBefore(selectors.offcanvasContainer);
802                }
803
804                var $wrapperContent = elements.$offcanvasWrapper.find(selectors.offcanvasContent);
805
806                if ($wrapperContent.length)
807                {
808
809                    var $containerContent = elements.$outsideContainer.find("> .".concat(classes.contentClassPart, "-").concat(contentId));
810
811                    if ($containerContent.length)
812                    {
813                        $containerContent.remove();
814                    }
815
816                    var $bodyContent = elements.$body.find("> .".concat(classes.contentClassPart, "-").concat(contentId));
817
818                    if ($bodyContent.length)
819                    {
820                        $bodyContent.remove();
821                    }
822
823                    if (elements.$html.hasClass(classes.contentOpenClass))
824                    {
825                        $wrapperContent.addClass('active');
826                    }
827
828                    elements.$body.prepend($wrapperContent);
829                }
830            }
831
832
833
834            //Master_Addons.MA_Offcanvas_Menu.offcanvasClose
835            Master_Addons.MA_Offcanvas_Menu.offcanvasClose = function ()
836            {
837                var openId = elements.$html.data('open-id');
838                var regex = new RegExp("".concat(classes.contentClassPart, "-.*"));
839                var classList = elements.$html.attr('class').split(/\s+/);
840
841                jQuery("".concat(selectors.contentClassPart, "-").concat(openId)).removeClass('active');
842                elements.$triggerButton.removeClass('trigger-active');
843                classList.forEach(function (className)
844                {
845                    if (!className.match(regex))
846                    {
847                        return;
848                    }
849                    elements.$html.removeClass(className);
850                });
851                elements.$html.removeData('open-id');
852            }
853
854            // containerClick
855            Master_Addons.MA_Offcanvas_Menu.containerClick = function (event)
856            {
857
858                var openId = elements.$html.data('open-id');
859
860                if (getID !== openId || !getElementSettings.overlay_close)
861                {
862                    return;
863                }
864
865                if (!elements.$html.hasClass(classes.contentOpenClass))
866                {
867                    return;
868                }
869                Master_Addons.MA_Offcanvas_Menu.offcanvasClose();
870            }
871
872            Master_Addons.MA_Offcanvas_Menu.closeESC = function (event)
873            {
874
875                if (27 !== event.keyCode)
876                {
877                    return;
878                }
879                Master_Addons.MA_Offcanvas_Menu.offcanvasClose();
880                $(elements.$triggerButton).removeClass('trigger-active');
881            }
882
883
884            Master_Addons.MA_Offcanvas_Menu.addLoaderIcon = function ()
885            {
886                jQuery(document).find('.jltma-offcanvas__content').addClass('jltma-loading');
887            }
888            Master_Addons.MA_Offcanvas_Menu.removeLoaderIcon = function ()
889            {
890                jQuery(document).find('.jltma-offcanvas__content').removeClass('jltma-loading');
891            }
892
893            // bindEvents
894            Master_Addons.MA_Offcanvas_Menu.bindEvents = function ()
895            {
896
897                elements.$body.on('click', selectors.offcanvasContainerOverlay, Master_Addons.MA_Offcanvas_Menu.containerClick.bind(this));
898
899                if ('yes' === is_esc_close)
900                {
901                    elements.$document.on('keydown', Master_Addons.MA_Offcanvas_Menu.closeESC.bind(this));
902                }
903
904                elements.$triggerButton.on('click', Master_Addons.MA_Offcanvas_Menu.offcanvasContent.bind(this));
905                elements.$closeButton.on('click', Master_Addons.MA_Offcanvas_Menu.offcanvasClose.bind(this));
906                elements.$menuParent.on('click', Master_Addons.MA_Offcanvas_Menu.onParentClick.bind(this));
907
908                $(elements.$menuParent).on('change', function ()
909                {
910                    Master_Addons.MA_Offcanvas_Menu.onParentClick.bind($(this));
911                });
912
913                $("[data-settings=animation_type]").on('click', function ()
914                {
915                    Master_Addons.MA_Offcanvas_Menu.changeControl.bind($(this));
916                });
917            }
918
919
920            //perfectScrollInit
921            Master_Addons.MA_Offcanvas_Menu.perfectScrollInit = function ()
922            {
923                if (!Master_Addons.MA_Offcanvas_Menu.scrollPerfect)
924                {
925                    Master_Addons.MA_Offcanvas_Menu.scrollPerfect = new PerfectScrollbar(elements.$offcanvasContentBody.get(0), {
926                        wheelSpeed: 0.5,
927                        suppressScrollX: true
928                    });
929                    return;
930                }
931
932                Master_Addons.MA_Offcanvas_Menu.scrollPerfect.update();
933            }
934
935            //onEdit
936            Master_Addons.MA_Offcanvas_Menu.onEdit = function ()
937            {
938                // elementorFrontend.isEditMode()
939                if (!Master_Addons.MA_Offcanvas_Menu.isEdit)
940                {
941                    return;
942                }
943
944                if (undefined === $element.data('opened'))
945                {
946                    $element.data('opened', 'false');
947                }
948
949                elementor.channels.editor.on('section:activated', Master_Addons.MA_Offcanvas_Menu.sectionActivated.bind(this));
950            }
951
952
953            //sectionActivated
954            Master_Addons.MA_Offcanvas_Menu.sectionActivated = function (sectionName, editor)
955            {
956                var elementsData = elementorFrontend.config.elements.data[this.getModelCID()];
957                var editedElement = editor.getOption('editedElementView');
958
959                if (this.getModelCID() !== editor.model.cid || elementsData.get('widgetType') !== editedElement.model.get('widgetType'))
960                {
961                    return;
962                }
963
964                if (-1 !== this.sectionsArray.indexOf(sectionName))
965                {
966                    if ('true' === $element.data('opened'))
967                    {
968                        var editedModel = editor.getOption('model');
969                        Master_Addons.MA_Offcanvas_Menu.offcanvasContent(null, editedModel.get('id'));
970                    }
971
972                    $element.data('opened', 'true');
973
974                } else
975                {
976                    Master_Addons.MA_Offcanvas_Menu.offcanvasClose();
977                }
978            }
979
980            //offcanvasContent
981            Master_Addons.MA_Offcanvas_Menu.offcanvasContent = function (event)
982            {
983                var widgetId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
984
985                var boxPosition = getElementSettings.canvas_position;
986                var offcanvasType = getElementSettings.animation_type;
987                var contentId = getID;
988
989                if (null !== widgetId)
990                {
991                    contentId = widgetId;
992                }
993                elements.$triggerButton.addClass('trigger-active');
994
995                jQuery("".concat(selectors.contentClassPart, "-").concat(contentId)).addClass('active');
996                elements.$html.addClass("".concat(classes.contentOpenClass)).addClass("".concat(classes.contentOpenClass, "-").concat(contentId)).addClass("".concat(classes.contentClassPart, "-").concat(boxPosition)).addClass("".concat(classes.contentClassPart, "-").concat(offcanvasType)).data('open-id', contentId);
997            }
998
999
1000            //onParentClick
1001            Master_Addons.MA_Offcanvas_Menu.onParentClick = function (event)
1002            {
1003                var $clickedItem = jQuery(event.target);
1004                var noLinkArray = ['', '#'];
1005                var $menuParent = $clickedItem.hasClass(classes.menuArrow) ? $clickedItem.parent() : $clickedItem;
1006
1007                if ($clickedItem.hasClass(classes.menuArrow) || -1 !== noLinkArray.indexOf($clickedItem.attr('href')) || !$menuParent.hasClass('active'))
1008                {
1009                    event.preventDefault();
1010                }
1011
1012                var $menuParentNext = $menuParent.next();
1013                $menuParent.removeClass('active');
1014                $menuParentNext.slideUp('normal');
1015
1016                if ($menuParentNext.is('ul') && !$menuParentNext.is(':visible'))
1017                {
1018                    $menuParent.addClass('active');
1019                    $menuParentNext.slideDown('normal');
1020                }
1021            }
1022
1023
1024            //changeControl
1025            Master_Addons.MA_Offcanvas_Menu.changeControl = function ()
1026            {
1027                Master_Addons.MA_Offcanvas_Menu.offcanvasClose();
1028            }
1029
1030            // onInit
1031            Master_Addons.MA_Offcanvas_Menu.onInit = function ()
1032            {
1033
1034                Master_Addons.MA_Offcanvas_Menu.resetCanvas();
1035
1036                // Master_Addons.MA_Offcanvas_Menu.perfectScrollInit();
1037                // Master_Addons.MA_Offcanvas_Menu.onEdit();
1038                Master_Addons.MA_Offcanvas_Menu.bindEvents();
1039            }
1040            // onInit
1041
1042            return Master_Addons.MA_Offcanvas_Menu.onInit();
1043        },
1044
1045
1046        //Master Addons: Image Filter Gallery
1047        MA_Image_Filter_Gallery: function ($scope, $)
1048        {
1049
1050            var elementSettings = getElementSettings($scope),
1051                $jltma_image_filter_gallery_wrapper = $scope.find('.jltma-image-filter-gallery-wrapper').eq(0),
1052                $ma_el_image_filter_gallery_container = $scope.find('.jltma-image-filter-gallery'),
1053                $ma_el_image_filter_gallery_nav = $scope.find('.jltma-image-filter-nav'),
1054                $ma_el_image_filter_gallery_wrapper = $scope.find('.jltma-image-filter-gallery-wrapper'),
1055                $uniqueId = getUniqueLoopScopeId($scope),
1056                $maxtilt = elementSettings.ma_el_image_gallery_max_tilt,
1057                $perspective = elementSettings.ma_el_image_gallery_perspective,
1058                $speed = elementSettings.ma_el_image_gallery_speed,
1059                $axis = elementSettings.ma_el_image_gallery_tilt_axis,
1060                $glare = elementSettings.ma_el_image_gallery_glare,
1061                $overlay_speed = elementSettings.line_location,
1062                $ma_el_image_gallery_tooltip = elementSettings.ma_el_image_gallery_tooltip,
1063                $container = $('.elementor-element-' + $uniqueId + ' .jltma-image-filter-gallery'),
1064                layoutMode = $ma_el_image_filter_gallery_wrapper.hasClass('jltma-masonry-yes') ? 'masonry' : 'fitRows';
1065
1066            if (!$jltma_image_filter_gallery_wrapper.length)
1067            {
1068                return;
1069            }
1070
1071            if ($ma_el_image_gallery_tooltip == "yes")
1072            {
1073
1074                var $img_filter_gallery = $jltma_image_filter_gallery_wrapper.find('ul.jltma-tooltip');
1075
1076                if (!$img_filter_gallery.length)
1077                {
1078                    return;
1079                }
1080
1081                var $tooltip = $img_filter_gallery.find('> .jltma-tooltip-item'),
1082                    widgetID = $scope.data('id');
1083
1084                $tooltip.each(function (index)
1085                {
1086                    tippy(this, {
1087                        allowHTML: false,
1088                        theme: 'jltma-image-filter-tippy-' + widgetID
1089                    });
1090                });
1091            }
1092
1093            //Masonry Start
1094            // let container_outerheight = $container.outerHeight();
1095            var optValues = {
1096                filter: '*',
1097                itemSelector: '.jltma-image-filter-item',
1098                percentPosition: true,
1099                animationOptions: {
1100                    duration: 750,
1101                    easing: 'linear',
1102                    queue: false
1103                }
1104            };
1105            if (layoutMode === 'fitRows')
1106            {
1107                optValues['layoutMode'] = 'fitRows';
1108            }
1109
1110            // if(layoutMode === 'masonry'){
1111            //     adata['macolumnWidthsonry'] = '.jltma-image-filter-item';
1112            //     adata['horizontalOrder'] = true;
1113            // };
1114
1115            // var $grid = $container.isotope(adata);
1116            // $grid.imagesLoaded().progress(function() {
1117            //     $grid.isotope('layout');
1118            //     $scope.find('.jltma-image-filter-gallery').css({"min-height":"300px" ,"height" : container_outerheight});
1119            // });
1120
1121            if ($.isFunction($.fn.imagesLoaded))
1122            {
1123                $ma_el_image_filter_gallery_container.imagesLoaded(function ()
1124                {
1125                    if ($.isFunction($.fn.isotope))
1126                    {
1127                        $ma_el_image_filter_gallery_container.isotope(optValues);
1128                    }
1129                });
1130            }
1131            //Masonry End
1132
1133
1134            // Tilt Effect Start
1135            if ($axis === 'x')
1136            {
1137                $axis = 'y';
1138            } else if ($axis === 'y')
1139            {
1140                $axis = 'x';
1141            } else
1142            {
1143                $axis = 'both';
1144            }
1145
1146            if ($glare === 'yes')
1147            {
1148                var $max_glare = elementSettings.ma_el_image_gallery_max_glare;
1149            }
1150
1151            if ($glare === 'yes')
1152            {
1153                $glare = true;
1154            } else
1155            {
1156                $glare = false;
1157            }
1158
1159            if ($scope.find('.jltma-tilt-enable'))
1160            {
1161                var tilt_args = {
1162                    maxTilt: $maxtilt,
1163                    perspective: $perspective,   // Transform perspective, the lower the more extreme the tilt gets.
1164                    //easing:         "cubic-bezier(.03,.98,.52,.99)",   // Easing on enter/exit.
1165                    easing: "linear",
1166                    scale: 1,      // 2 = 200%, 1.5 = 150%, etc..
1167                    speed: $speed,    // Speed of the enter/exit transition.
1168                    disableAxis: $axis,
1169                    transition: true,   // Set a transition on enter/exit.
1170                    reset: true,   // If the tilt effect has to be reset on exit.
1171                    glare: $glare,  // Enables glare effect
1172                    maxGlare: $max_glare       // From 0 - 1.
1173                }
1174
1175                $scope.find('.jltma-tilt').tilt(tilt_args);
1176            }
1177            // Tilt Effect End
1178
1179
1180            $ma_el_image_filter_gallery_nav.on('click', 'li', function ()
1181            {
1182                $ma_el_image_filter_gallery_nav.find('.active').removeClass('active');
1183                $(this).addClass('active');
1184
1185                if ($.isFunction($.fn.isotope))
1186                {
1187                    var selector = $(this).attr('data-filter');
1188                    $ma_el_image_filter_gallery_container.isotope({
1189                        filter: selector,
1190                    });
1191                    return false;
1192                }
1193            });
1194            // $("jltma-fancybox").fancybox({
1195            $(".elementor-widget.elementor-widget-ma-image-filter-gallery .jltma-fancybox").fancybox({
1196                protect: true,
1197                animationDuration: 366,
1198                transitionDuration: 366,
1199                transitionEffect: "fade", // Transition effect between slides
1200                animationEffect: "fade",
1201                preventCaptionOverlap: true,
1202                // loop: false,
1203                infobar: false,
1204                buttons: [
1205                    "zoom",
1206                    "share",
1207                    "slideShow",
1208                    "fullScreen",
1209                    "download",
1210                    "thumbs",
1211                    "close"
1212                ],
1213                afterLoad: function (instance, current)
1214                {
1215                    var pixelRatio = window.devicePixelRatio || 1;
1216
1217                    if (pixelRatio > 1.5)
1218                    {
1219                        current.width = current.width / pixelRatio;
1220                        current.height = current.height / pixelRatio;
1221                    }
1222                }
1223            });
1224
1225        },
1226
1227
1228        MA_Carousel: function ($swiper, settings)
1229        {
1230            var $slides = $swiper.find('.jltma-swiper__slide'),
1231
1232                elementorBreakpoints = elementorFrontend.config.breakpoints,
1233
1234                swiperInstance = $swiper.data('swiper'),
1235                swiperArgs = {
1236                    autoHeight: settings.element.autoHeight || false,
1237                    direction: settings.element.direction || settings.default.direction,
1238                    effect: settings.element.effect || settings.default.effect,
1239                    slidesPerView: settings.default.slidesPerView,
1240                    slidesPerColumn: settings.default.slidesPerColumn,
1241                    slidesPerColumnFill: 'row',
1242                    slidesPerGroup: settings.default.slidesPerGroup,
1243                    spaceBetween: settings.default.spaceBetween,
1244                    pagination: {},
1245                    navigation: {},
1246                    autoplay: settings.element.autoplay || false,
1247                    grabCursor: true,
1248                    watchSlidesProgress: true,
1249                    watchSlidesVisibility: true,
1250                };
1251
1252            if (settings.default.breakpoints)
1253            {
1254                swiperArgs.breakpoints = {};
1255                swiperArgs.breakpoints[elementorBreakpoints.md] = settings.default.breakpoints.tablet;
1256                swiperArgs.breakpoints[elementorBreakpoints.lg] = settings.default.breakpoints.desktop;
1257            }
1258
1259            if (!elementorFrontend.isEditMode())
1260            {
1261                // Observer messes with free mode
1262                if (!settings.element.freeMode)
1263                {
1264                    swiperArgs.observer = true;
1265                    swiperArgs.observeParents = true;
1266                    swiperArgs.observeSlideChildren = true;
1267                }
1268            } else
1269            { // But we're safe in edit mode
1270                swiperArgs.observer = true;
1271                swiperArgs.observeParents = true;
1272                swiperArgs.observeSlideChildren = true;
1273            }
1274
1275            Master_Addons.MA_Carousel.init = function ()
1276            {
1277                if (swiperInstance)
1278                {
1279                    Master_Addons.MA_Carousel.destroy();
1280                    return;
1281                }
1282
1283                // Number of columns
1284                if (swiperArgs.breakpoints)
1285                {
1286                    if (settings.element.breakpoints.desktop.slidesPerView)
1287                    {
1288                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerView = settings.stretch ? Math.min($slides.length, +settings.element.breakpoints.desktop.slidesPerView || 3) : +settings.element.breakpoints.desktop.slidesPerView || 3;
1289                    }
1290
1291                    if (settings.element.breakpoints.tablet.slidesPerView)
1292                    {
1293                        swiperArgs.breakpoints[ elementorBreakpoints.md ].slidesPerView = settings.stretch ? Math.min( $slides.length, +settings.element.breakpoints.tablet.slidesPerView || 2 ) : +settings.element.breakpoints.tablet.slidesPerView || 2;
1294                    }
1295                }
1296
1297                if (settings.element.slidesPerView)
1298                {
1299                    swiperArgs.slidesPerView = settings.stretch ? Math.min($slides.length, +settings.element.slidesPerView || 1
1299) : +settings.element.slidesPerView || 1;
1300                }
1301
1302                // Number of slides to scroll
1303                if (swiperArgs.breakpoints)
1304                {
1305                    if (settings.element.breakpoints.desktop.slidesPerGroup) {
1306                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerGroup = Math.min($slides.length, +settings.element.breakpoints.desktop.slidesPerGroup || 3);
1307                    }
1308
1309                    if (settings.element.breakpoints.tablet.slidesPerGroup) {
1310                        swiperArgs.breakpoints[elementorBreakpoints.md].slidesPerGroup = Math.min($slides.length, +settings.element.breakpoints.tablet.slidesPerGroup || 2);
1311                    }
1312                }
1313
1314                if (settings.element.slidesPerGroup)
1315                {
1316                    swiperArgs.slidesPerGroup = Math.min($slides.length, +settings.element.slidesPerGroup || 1);
1317                }
1318
1319                // Rows
1320                if (swiperArgs.breakpoints)
1321                {
1322                    if (settings.element.breakpoints.desktop.slidesPerColumn) {
1323                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerColumn = settings.element.breakpoints.desktop.slidesPerColumn;
1324                    }
1325
1326                    if (settings.element.breakpoints.tablet.slidesPerColumn) {
1327                        swiperArgs.breakpoints[elementorBreakpoints.md].slidesPerColumn = settings.element.breakpoints.tablet.slidesPerColumn;
1328                    }
1329                }
1330
1331                if (settings.element.slidesPerColumn)
1332                {
1333                    swiperArgs.slidesPerColumn = settings.element.slidesPerColumn;
1334                }
1335
1336                // Column spacing
1337
1338                if (swiperArgs.breakpoints)
1339                {
1340                    swiperArgs.breakpoints[elementorBreakpoints.lg].spaceBetween = settings.element.breakpoints.desktop.spaceBetween || 0;
1341                    swiperArgs.breakpoints[elementorBreakpoints.md].spaceBetween = settings.element.breakpoints.tablet.spaceBetween || 0;
1342                }
1343
1344                if (settings.element.spaceBetween){
1345                    swiperArgs.spaceBetween = settings.element.spaceBetween || 0;
1346                }
1347
1348                if (settings.element.slidesPerColumnFill) {
1349                    swiperArgs.slidesPerColumnFill = settings.element.slidesPerColumnFill;
1350                }
1351
1352                // Arrows and pagination
1353                if (settings.element.arrows)
1354                {
1355                    swiperArgs.navigation.disabledClass = 'jltma-swiper__button--disabled';
1356
1357                    var $prevButton = settings.scope.find(settings.element.arrowPrev),
1358                        $nextButton = settings.scope.find(settings.element.arrowNext);
1359
1360                    if ($prevButton.length && $nextButton.length)
1361                    {
1362
1363                        var arrowPrev = settings.element.arrowPrev + '-' + settings.id,
1364                            arrowNext = settings.element.arrowNext + '-' + settings.id;
1365
1366                        $prevButton.addClass(arrowPrev.replace('.', ''));
1367                        $nextButton.addClass(arrowNext.replace('.', ''));
1368
1369                        swiperArgs.navigation.prevEl = arrowPrev;
1370                        swiperArgs.navigation.nextEl = arrowNext;
1371                    }
1372                }
1373
1374                if (settings.element.pagination)
1375                {
1376                    swiperArgs.pagination.el = '.jltma-swiper__pagination-' + settings.id;
1377                    swiperArgs.pagination.type = settings.element.paginationType;
1378
1379                    if (settings.element.paginationClickable)
1380                    {
1381                        swiperArgs.pagination.clickable = true;
1382                    }
1383                }
1384
1385                // Loop
1386                if (settings.element.loop)
1387                {
1388                    swiperArgs.loop = true;
1389                    // swiperArgs.loopedSlides = $slides.length;
1390                }
1391
1392                // Autoplay
1393                if (swiperArgs.autoplay && (settings.element.autoplaySpeed || settings.element.disableOnInteraction)) {
1394                    swiperArgs.autoplay = {};
1395
1396                    if (settings.element.autoplaySpeed) {
1397                        swiperArgs.autoplay.delay = settings.element.autoplaySpeed;
1398                    }
1399
1400                    if (settings.element.autoplaySpeed) {
1401                        swiperArgs.autoplay.disableOnInteraction = settings.element.disableOnInteraction;
1402                    }
1403                } else {
1404
1405                }
1406
1407                // Speed
1408                if (settings.element.speed)
1409                {
1410                    swiperArgs.speed = settings.element.speed;
1411                }
1412
1413                // Resistance
1414                if (settings.element.resistance)
1415                {
1416                    swiperArgs.resistanceRatio = 1 - settings.element.resistance;
1417                }
1418
1419                // Free Mode
1420                if (settings.element.freeMode)
1421                {
1422                    swiperArgs.freeMode = true;
1423                    swiperArgs.freeModeSticky = settings.element.freeModeSticky;
1424                    swiperArgs.freeModeMomentum = settings.element.freeModeMomentum;
1425                    swiperArgs.freeModeMomentumBounce = settings.element.freeModeMomentumBounce;
1426
1427                    if (settings.element.freeModeMomentumRatio)
1428                    {
1429                        swiperArgs.freeModeMomentumRatio = settings.element.freeModeMomentumRatio;
1430                    }
1431
1432                    if (settings.element.freeModeMomentumVelocityRatio)
1433                    {
1434                        swiperArgs.freeModeMomentumVelocityRatio = settings.element.freeModeMomentumVelocityRatio;
1435                    }
1436
1437                    if (settings.element.freeModeMomentumBounceRatio)
1438                    {
1439                        swiperArgs.freeModeMomentumBounceRatio = settings.element.freeModeMomentumBounceRatio;
1440                    }
1441                }
1442
1443                return swiperArgs;
1444
1445                // Conditional asset loading of the Swiper library with backwards compatibility
1446                // since Elementor 3.1
1447                // @link https://developers.elementor.com/experiment-optimized-asset-loading/
1448                // var swiper;
1449                // if ('undefined' === typeof Swiper)
1450                // {
1451                //     const asyncSwiper = elementorFrontend.utils.swiper;
1452
1453                //     new asyncSwiper($swiper, swiperArgs).then(function (newSwiperInstance)
1454                //     {
1455                //         swiper = newSwiperInstance;
1456                //     });
1457                // } else
1458                // {
1459                //     swiper = new Swiper($swiper, swiperArgs);
1460                // }
1461
1462                // if (settings.element.stopOnHover)
1463                // {
1464                //     $swiper.on('mouseover', function ()
1465                //     {
1466                //         swiper.autoplay.stop();
1467                //     });
1468
1469                //     $swiper.on('mouseout', function ()
1470                //     {
1471                //         swiper.autoplay.start();
1472                //     });
1473                // }
1474
1475                // if (settings.element.slideChangeTriggerResize)
1476                // {
1477                //     swiper.on('slideChange', function ()
1478                //     {
1479                //         $(window).trigger('resize');
1480                //     });
1481                // }
1482
1483                // $swiper.data('swiper', swiper);
1484                // return swiper;
1485            };
1486
1487            Master_Addons.MA_Carousel.onAfterInit = function ($swiper, swiper, settings) {
1488                if ('undefined' == typeof settings || 'undefined' == typeof swiper) {
1489                    return;
1490                }
1491
1492                if (settings.element.stopOnHover) {
1493                    $swiper.on('mouseover', function () {
1494                        swiper.autoplay.stop();
1495                    });
1496
1497                    $swiper.on('mouseout', function () {
1498                        swiper.autoplay.start();
1499                    });
1500                }
1501
1502                if (settings.element.slideChangeTriggerResize) {
1503                    swiper.on('slideChange', function () {
1504                        $(window).trigger('resize');
1505                    });
1506                }
1507
1508                $swiper.data('swiper', swiper);
1509            };
1510
1511
1512            return Master_Addons.MA_Carousel.init();
1513        },
1514
1515        // Gallery Slider
1516        MA_Gallery_Slider: function ($scope, $)
1517        {
1518            // var swiper = new Swiper(".jltma-gallery-slider__gallery", {
1519            //     loop: true,
1520            //     spaceBetween: 10,
1521            //     slidesPerView: 2,
1522            //     freeMode: true,
1523            //     watchSlidesProgress: true,
1524            // });
1525            // var swiper2 = new Swiper(".jltma-gallery-slider__slider", {
1526            //     loop: true,
1527            //     spaceBetween: 10,
1528            //     navigation: {
1529            //         nextEl: ".jltma-swiper__button--next",
1530            //         prevEl: ".jltma-swiper__button--prev",
1531            //     },
1532            //     thumbs: {
1533            //         swiper: swiper,
1534            //     },
1535            // });
1536            // return;
1537
1538            var elementSettings   = getElementSettings($scope),
1539                $swiperSlider     = $scope.find('.jltma-gallery-slider__slider'), // The main slider area
1540                $swiperCarousel   = $scope.find('.jltma-gallery-slider__carousel'), // The main slider area when it is carousel
1541                uniqueId          = getUniqueLoopScopeId($scope),
1542                // console.log($scope);
1543                scopeId           = $scope.data('id'),
1544                $preview          = $scope.find('.jltma-gallery-slider__preview'),
1545                $thumbs           = $scope.find('.jltma-swiper__wrapper .jltma-gallery__item'), // Thumbs will be there
1546                $thumbnailsSlider = $scope.find(".jltma-gallery-slider__gallery .jltma-gallery"), // list all thumbs
1547                $thumbtype        = elementSettings.jltma_gallery_slider_thumb_type,
1548                $thumbposition    = elementSettings.jltma_gallery_slider_preview_position,
1549                $thumbVertical    = ($thumbposition == "top" || $thumbposition == "bottom") ? false : true,
1550
1551                start       = elementorFrontend.config.is_rtl ? 'right' : 'left',
1552                end         = elementorFrontend.config.is_rtl ? 'left' : 'right',
1553                hasCarousel = $swiperCarousel.length,
1554
1555                swiperSlider   = null,
1556                swiperCarousel = null,
1557
1558                sliderSettings = {
1559                    key    : 'slider',
1560                    scope  : $scope,
1561                    id     : uniqueId,
1562                    element: {
1563                        autoHeight          : 'yes' === elementSettings.jltma_gallery_slider_adaptive_height ? true                                                                                                    : false,
1564                        autoplay            : 'yes' === elementSettings.jltma_gallery_slider_autoplay ? true                                                                                                           : false,
1565                        autoplaySpeed       : 'yes' === elementSettings.jltma_gallery_slider_autoplay && elementSettings.jltma_gallery_slider_autoplay_speed ? elementSettings.jltma_gallery_slider_autoplay_speed.size: false,
1566                        disableOnInteraction: '' !== elementSettings.autoplay_disable_on_interaction,
1567                        stopOnHover         : 'yes' === elementSettings.jltma_gallery_slider_pause_on_hover,
1568                        loop                : 'yes' === elementSettings.jltma_gallery_slider_infinite,
1569                        arrows              : '' !== elementSettings.jltma_gallery_slider_show_arrows,
1570                        arrowPrev           : '.jltma-arrow--prev',
1571                        arrowNext           : '.jltma-arrow--next',
1572                        effect              : elementSettings.jltma_gallery_slider_effect,
1573                        speed               : elementSettings.speed ? elementSettings.speed.size                                                                                                                       : 500,
1574                        resistance          : elementSettings.resistance ? elementSettings.resistance.size                                                                                                             : 0.25,
1575                        keyboard            : {
1576                            // enabled: "yes" === slider_data.jltma_slider_keyboard ? true : false
1577                            enabled: true
1578                        },
1579                    },
1580                    default: {
1581                        effect         : 'slide',
1582                        direction      : 'horizontal',
1583                        slidesPerView  : 1,
1584                        slidesPerGroup : 1,
1585                        slidesPerColumn: 1,
1586                        spaceBetween   : 0,
1587                    }
1588                };
1589
1590            // If Carousel
1591            if (hasCarousel)
1592            {
1593                var carouselSettings = {
1594                    key    : 'carousel',
1595                    scope  : $scope,
1596                    id     : uniqueId,
1597                    // stretch: 'yes' === elementSettings.thumbnails_stretch,
1598                    element: {
1599                        direction      : elementSettings.carousel_orientation,
1600                        arrows         : '' !== elementSettings.jltma_gallery_slider_thumb_show_arrows,
1601                        arrowPrev      : '.jltma-arrow--prev',
1602                        arrowNext      : '.jltma-arrow--next',
1603                        autoHeight     : false,
1604                        loop           : 'yes' === elementSettings.jltma_gallery_slider_thumb_infinite ? true : false,
1605                        autoplay       : 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay ? true : false,
1606                        autoplaySpeed  : 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay && elementSettings.jltma_gallery_slider_thumb_autoplay_speed ? elementSettings.jltma_gallery_slider_thumb_autoplay_speed.size: false,
1607                        stopOnHover    : 'yes' === elementSettings.jltma_gallery_slider_thumb_pause_on_hover,
1608                        speed          : elementSettings.jltma_gallery_slider_thumb_speed ? elementSettings.jltma_gallery_slider_thumb_speed.size : 500,
1609                        slidesPerView  : elementSettings.jltma_gallery_slider_thumb_items_mobile,
1610                        slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_mobile,
1611                        slidesPerGroup : elementSettings.carousel_slides_to_scroll_mobile,
1612                        resistance     : elementSettings.carousel_resistance ? elementSettings.carousel_resistance.size : 0.15,
1613                        spaceBetween   : elementSettings.carousel_spacing_mobile ? elementSettings.carousel_spacing_mobile.size : 0,
1614                        breakpoints    : {
1615                            tablet: {
1616                                slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_tablet,
1617                                slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_tablet,
1618                                slidesPerGroup: elementSettings.carousel_slides_to_scroll_tablet,
1619                                spaceBetween: elementSettings.carousel_spacing_tablet ? elementSettings.carousel_spacing_tablet.size : 0,
1620                            },
1621                            desktop: {
1622                                slidesPerView: elementSettings.jltma_gallery_slider_thumb_items,
1623                                slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column,
1624                                slidesPerGroup: elementSettings.carousel_slides_to_scroll,
1625                                spaceBetween: elementSettings.carousel_spacing ? elementSettings.carousel_spacing.size : 0,
1626                            },
1627                        },
1628                    },
1629                    default: {
1630                        effect: 'slide',
1631                        slidesPerView: 1,
1632                        slidesPerGroup: 1,
1633                        slidesPerColumn: 1,
1634                        spaceBetween: 6,
1635                        breakpoints: {
1636                            tablet: {
1637                                slidesPerView: 2,
1638                                slidesPerGroup: 1,
1639                                slidesPerColumn: 2,
1640                                spaceBetween: 12,
1641                            },
1642                            desktop: {
1643                                slidesPerView: 3,
1644                                slidesPerGroup: 1,
1645                                slidesPerColumn: 3,
1646                                spaceBetween: 24,
1647                            },
1648                        },
1649                    },
1650                };
1651            }
1652
1653
1654            Master_Addons.MA_Gallery_Slider.init = function ()
1655            {
1656                var sliderArgs = Master_Addons.MA_Carousel( $swiperSlider, sliderSettings );
1657
1658                if (hasCarousel) {
1659                    var carouselArgs = Master_Addons.MA_Carousel($swiperCarousel, carouselSettings);
1660                }
1661
1662                // Master_Addons.MA_Gallery_Slider.onSlideChange();
1663                // Master_Addons.MA_Gallery_Slider.events();
1664
1665
1666                if ('undefined' === typeof Swiper) {
1667                    const asyncSwiper = elementorFrontend.utils.swiper;
1668
1669                    new asyncSwiper($swiperSlider, sliderArgs).then(function (sliderSwiperInstance) {
1670
1671                        if (!hasCarousel) {
1672                            Master_Addons.MA_Gallery_Slider.initSliders($scope, sliderSwiperInstance, false);
1673
1674                            Master_Addons.MA_Carousel.onAfterInit($swiperSlider, sliderSwiperInstance, sliderSettings);
1675                        } else {
1676                            new asyncSwiper($swiperCarousel, carouselArgs).then(function (carou
1676selSwiperInstance) {
1677                                Master_Addons.MA_Gallery_Slider.initSliders($scope, sliderSwiperInstance, carouselSwiperInstance);
1678
1679                                Master_Addons.MA_Carousel.onAfterInit($swiperSlider, sliderSwiperInstance, sliderSettings);
1680                                Master_Addons.MA_Carousel.onAfterInit($swiperCarousel, carouselSwiperInstance, carouselSettings);
1681                            });
1682                        }
1683                    });
1684
1685                } else {
1686                    if (hasCarousel) {
1687                        var swiper = new Swiper($swiperSlider[1], {
1688                            ...carouselArgs,
1689                        });
1690                        var swiperSlider = new Swiper($swiperSlider[0], {
1691                            ...sliderArgs,
1692                            thumbs: {
1693                                swiper: swiper,
1694                            },
1695                        });
1696                    }else{
1697                        var swiperSlider = new Swiper($swiperSlider[0], {
1698                            ...sliderArgs
1699                        });
1700                    }
1701                    // swiperSlider = new Swiper($swiperSlider, sliderArgs);
1702
1703                    if (hasCarousel) {
1704                        swiperCarousel = new Swiper($swiperCarousel, carouselArgs);
1705                    }
1706
1707                    Master_Addons.MA_Gallery_Slider.initSliders($scope, swiperSlider, swiperCarousel);
1708
1709                    Master_Addons.MA_Carousel.onAfterInit($swiperSlider, swiperSlider, sliderSettings);
1710
1711                    if (hasCarousel) {
1712                        Master_Addons.MA_Carousel.onAfterInit($swiperCarousel, swiperCarousel, carouselSettings);
1713                    }
1714                }
1715
1716            };
1717
1718            Master_Addons.MA_Gallery_Slider.getSlider = function () {
1719                return $scope.find('.jltma-gallery-slider__slider');
1720            };
1721
1722
1723            Master_Addons.MA_Gallery_Slider.getCarousel = function () {
1724                return $scope.find('.jltma-gallery-slider__carousel');
1725            };
1726
1727
1728            Master_Addons.MA_Gallery_Slider.initSliders = function ($scope, swiperSlider, swiperCarousel) {
1729                var data = {
1730                    scope: $scope,
1731                    slider: swiperSlider,
1732                    carousel: swiperCarousel,
1733                };
1734
1735                Master_Addons.MA_Gallery_Slider.onSlideChange(data);
1736                Master_Addons.MA_Gallery_Slider.events(data);
1737            };
1738
1739
1740            Master_Addons.MA_Gallery_Slider.events = function ( data )
1741            {
1742
1743                var $thumbs = data.scope.find('.jltma-gallery__item');
1744
1745                data.slider.on('slideChange', function (instance) {
1746                    Master_Addons.MA_Gallery_Slider.onSlideChange(data);
1747                });
1748
1749                $thumbs.on('click', function () {
1750                    var offset = sliderSettings.element.loop ? 1 : 0;
1751
1752                    event.preventDefault();
1753                    data.slider.slideTo($(this).index() + offset);
1754                });
1755            };
1756
1757            Master_Addons.MA_Gallery_Slider.onSlideChange = function (data)
1758            {
1759                var activeIndex = sliderSettings.element.loop ? data.slider.realIndex : data.slider.activeIndex;
1760
1761                if (hasCarousel) {
1762                    data.carousel.slideTo(activeIndex);
1763                }
1764
1765                var $thumbs = data.scope.find('.jltma-gallery__item');
1766
1767                $thumbs.removeClass('is--active');
1768                $thumbs.eq(activeIndex).addClass('is--active');
1769
1770            };
1771
1772            Master_Addons.MA_Gallery_Slider.onThumbClicked = function (event)
1773            {
1774                var offset = sliderSettings.element.loop ? 1 : 0;
1775                event.preventDefault();
1776                swiperSlider.slideTo($(this).index() + offset, 500, true);
1777            };
1778
1779            Master_Addons.onElementRemove($scope, function ()
1780            {
1781                $scope.find('.swiper-container').each(function () {
1782                    if ($(this).data('swiper')) {
1783                        $(this).data('swiper').destroy();
1784                    }
1785                });
1786            });
1787
1788
1789            Master_Addons.MA_Gallery_Slider.init();
1790        },
1791        // MA_Gallery_Slider: function ($scope, $) {
1792        //     var elementSettings = getElementSettings($scope),
1793        //         $swiperSlider = $scope.find('.jltma-gallery-slider__slider'),
1794        //         $swiperCarousel = $scope.find('.jltma-gallery-slider__carousel'),
1795        //         uniqueId = getUniqueLoopScopeId($scope),
1796        //         scopeId = $scope.data('id'),
1797        //         $preview = $scope.find('.jltma-gallery-slider__preview'),
1798        //         $thumbs = $scope.find('.jltma-swiper__wrapper .jltma-gallery__item'),
1799        //         $thumbnailsSlider = $scope.find(".jltma-gallery-slider__gallery .jltma-gallery"),
1800        //         $thumbtype = elementSettings.jltma_gallery_slider_thumb_type,
1801        //         $thumbposition = elementSettings.jltma_gallery_slider_preview_position,
1802        //         $thumbVertical = ($thumbposition == "top" || $thumbposition == "bottom") ? false : true,
1803        //         start = elementorFrontend.config.is_rtl ? 'right' : 'left',
1804        //         end = elementorFrontend.config.is_rtl ? 'left' : 'right',
1805        //         hasCarousel = $swiperCarousel.length,
1806        //         swiperSlider = null,
1807        //         swiperCarousel = null,
1808        //         sliderSettings = {
1809        //             key: 'slider',
1810        //             scope: $scope,
1811        //             id: uniqueId,
1812        //             element: {
1813        //                 autoHeight: 'yes' === elementSettings.jltma_gallery_slider_adaptive_height ? true : false,
1814        //                 autoplay: 'yes' === elementSettings.jltma_gallery_slider_autoplay ? true : false,
1815        //                 autoplaySpeed: 'yes' === elementSettings.jltma_gallery_slider_autoplay && elementSettings.jltma_gallery_slider_autoplay_speed ? elementSettings.jltma_gallery_slider_autoplay_speed.size : false,
1816        //                 disableOnInteraction: '' !== elementSettings.autoplay_disable_on_interaction,
1817        //                 stopOnHover: 'yes' === elementSettings.jltma_gallery_slider_pause_on_hover,
1818        //                 loop: 'yes' === elementSettings.jltma_gallery_slider_infinite,
1819        //                 arrows: '' !== elementSettings.jltma_gallery_slider_show_arrows,
1820        //                 arrowPrev: '.jltma-arrow--prev',
1821        //                 arrowNext: '.jltma-arrow--next',
1822        //                 effect: elementSettings.jltma_gallery_slider_effect,
1823        //                 speed: elementSettings.speed ? elementSettings.speed.size : 500,
1824        //                 resistance: elementSettings.resistance ? elementSettings.resistance.size : 0.25,
1825        //                 keyboard: {
1826        //                     enabled: true
1827        //                 },
1828        //             },
1829        //             default: {
1830        //                 effect: 'slide',
1831        //                 direction: 'horizontal',
1832        //                 slidesPerView: 1,
1833        //                 slidesPerGroup: 1,
1834        //                 slidesPerColumn: 1,
1835        //                 spaceBetween: 0,
1836        //             }
1837        //         };
1838
1839        //     if (hasCarousel) {
1840        //         var carouselSettings = {
1841        //             key: 'carousel',
1842        //             scope: $scope,
1843        //             id: uniqueId,
1844        //             element: {
1845        //                 direction: elementSettings.carousel_orientation,
1846        //                 arrows: '' !== elementSettings.jltma_gallery_slider_thumb_show_arrows,
1847        //                 arrowPrev: '.jltma-arrow--prev',
1848        //                 arrowNext: '.jltma-arrow--next',
1849        //                 autoHeight: false,
1850        //                 loop: 'yes' === elementSettings.jltma_gallery_slider_thumb_infinite ? true : false,
1851        //                 autoplay: 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay ? true : false,
1852        //                 autoplaySpeed: 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay && elementSettings.jltma_gallery_slider_thumb_autoplay_speed ? elementSettings.jltma_gallery_slider_thumb_autoplay_speed.size : false,
1853        //                 stopOnHover: 'yes' === elementSettings.jltma_gallery_slider_thumb_pause_on_hover,
1854        //                 speed: elementSettings.jltma_gallery_slider_thumb_speed ? elementSettings.jltma_gallery_slider_thumb_speed.size : 500,
1855        //                 slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_mobile,
1856        //                 slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_mobile,
1857        //                 slidesPerGroup: elementSettings.carousel_slides_to_scroll_mobile,
1858        //                 resistance: elementSettings.carousel_resistance ? elementSettings.carousel_resistance.size : 0.15,
1859        //                 spaceBetween: elementSettings.carousel_spacing_mobile ? elementSettings.carousel_spacing_mobile.size : 0,
1860        //                 breakpoints: {
1861        //                     tablet: {
1862        //                         slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_tablet,
1863        //                         slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_tablet,
1864        //                         slidesPerGroup: elementSettings.carousel_slides_to_scroll_tablet,
1865        //                         spaceBetween: elementSettings.carousel_spacing_tablet ? elementSettings.carousel_spacing_tablet.size : 0,
1866        //                     },
1867        //                     desktop: {
1868        //                         slidesPerView: elementSettings.jltma_gallery_slider_thumb_items,
1869        //                         slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column,
1870        //                         slidesPerGroup: elementSettings.carousel_slides_to_scroll,
1871        //                         spaceBetween: elementSettings.carousel_spacing ? elementSettings.carousel_spacing.size : 0,
1872        //                     },
1873        //                 },
1874        //             },
1875        //             default: {
1876        //                 effect: 'slide',
1877        //                 slidesPerView: 1,
1878        //                 slidesPerGroup: 1,
1879        //                 slidesPerColumn: 1,
1880        //                 spaceBetween: 6,
1881        //                 breakpoints: {
1882        //                     tablet: {
1883        //                         slidesPerView: 2,
1884        //                         slidesPerGroup: 1,
1885        //                         slidesPerColumn: 2,
1886        //                         spaceBetween: 12,
1887        //                     },
1888        //                     desktop: {
1889        //                         slidesPerView: 3,
1890        //                         slidesPerGroup: 1,
1891        //                         slidesPerColumn: 3,
1892        //                         spaceBetween: 24,
1893        //                     },
1894        //                 },
1895        //             },
1896        //         };
1897        //     }
1898
1899        //     Master_Addons.MA_Gallery_Slider.init = function () {
1900        //         if ($swiperSlider.length) {
1901        //             swiperSlider = Master_Addons.MA_Carousel($swiperSlider, sliderSettings);
1902        //             console.log('Swiper Slider Initialized:', swiperSlider);
1903        //         }
1904        //         if (hasCarousel && $swiperCarousel.length) {
1905        //             swiperCarousel = Master_Addons.MA_Carousel($swiperCarousel, carouselSettings);
1906        //             console.log('Swiper Carousel Initialized:', swiperCarousel);
1907        //         }
1908        //         alert("slider ready");
1909        //         Master_Addons.MA_Gallery_Slider.events();
1910        //         Master_Addons.MA_Gallery_Slider.onSlideChange();
1911        //     };
1912
1913        //     Master_Addons.MA_Gallery_Slider.events = function () {
1914        //         alert("slider events");
1915        //         if (swiperSlider) {
1916        //             swiperSlider.on('slideChange', Master_Addons.MA_Gallery_Slider.onSlideChange);
1917        //         }
1918        //         if (hasCarousel && swiperCarousel) {
1919        //             swiperCarousel.on('slideChange', Master_Addons.MA_Gallery_Slider.onSlideChange);
1920        //         }
1921        //         $thumbs.on('click', Master_Addons.MA_Gallery_Slider.onThumbClicked);
1922        //     };
1923
1924        //     // Master_Addons.MA_Gallery_Slider.onSlideChange = function () {
1925        //     //     if (hasCarousel && swiperCarousel) {
1926        //     //         var activeIndex = sliderSettings.element.loop ? swiperCarousel.realIndex : swiperCarousel.activeIndex;
1927        //     //         swiperCarousel.slideTo(activeIndex, 500, true);
1928        //     //     } else if (swiperSlider) {
1929        //     //         var activeIndex = sliderSettings.element.loop ? swiperSlider.realIndex : swiperSlider.activeIndex;
1930        //     //         swiperSlider.slideTo(activeIndex, 500, false);
1931        //     //     }
1932
1933        //     //     $thumbs.removeClass('is--active');
1934        //     //     $thumbs.eq(activeIndex).addClass('is--active');
1935        //     // };
1936        //     Master_Addons.MA_Gallery_Slider.onSlideChange = function () {
1937        //         alert("slider change");
1938        //         if (hasCarousel && swiperCarousel) {
1939        //             var activeIndex = sliderSettings.element.loop ? swiperCarousel.realIndex : swiperCarousel.activeIndex;
1940        //             swiperCarousel.slideTo(activeIndex, 500, true);
1941        //         } else if (swiperSlider) {
1942        //             var activeIndex = sliderSettings.element.loop ? swiperSlider.realIndex : swiperSlider.activeIndex;
1943        //             swiperSlider.slideTo(activeIndex, 500, false);
1944        //         }
1945
1946        //         $thumbs.removeClass('is--active');
1947        //         $thumbs.eq(activeIndex).addClass('is--active');
1948        //     };
1949
1950        //     Master_Addons.MA_Gallery_Slider.onThumbClicked = function (event) {
1951        //         event.preventDefault();
1952        //         if (swiperSlider) {
1953        //             var offset = sliderSettings.element.loop ? 1 : 0;
1954        //             swiperSlider.slideTo($(this).index() + offset, 500, true);
1955        //         }
1956        //     };
1957
1958        //     Master_Addons.onElementRemove($scope, function () {
1959        //         $scope.find('.swiper').each(function () {
1960        //             if ($(this).data('swiper')) {
1961        //                 $(this).data('swiper').destroy();
1962        //             }
1963        //         });
1964        //     });
1965
1966        //     $(document).ready(function () {
1967        //         Master_Addons.MA_Gallery_Slider.init();
1968        //     });
1969        // },
1970
1971        // On Remove Event
1972        onElementRemove: function ($element, callback)
1973        {
1974            if (elementorFrontend.isEditMode())
1975            {
1976                // Make sure it is destroyed when element is removed in editor mode
1977                elementor.channels.data.on('element:before:remove', function (model)
1978                {
1979                    if ($element.data('id') === model.id)
1980                    {
1981                        callback();
1982                    }
1983                });
1984            }
1985        },
1986
1987        //Master Addons: Timeline
1988        MA_Timeline: function ($scope, $)
1989        {
1990
1991            var elementSettings = getElementSettings($scope),
1992                $timeline = $scope.find('.jltma-timeline'),
1993                $swiperSlider = $scope.find('.jltma-timeline-slider'),
1994                $timeline_type = elementSettings.ma_el_timeline_type,
1995                $timeline_layout = elementSettings.ma_el_timeline_design_type,
1996                swiperSlider = null,
1997                timelineArgs = {},
1998                hasCarousel = $swiperSlider.length,
1999                $uniqueId = getUniqueLoopScopeId($scope);
1999
2000
2001            if ($timeline_layout === 'horizontal')
2002            {
2003
2004                var $carousel = $scope.find('.jltma-timeline-carousel-slider');
2005
2006                if (!$carousel.length)
2007                {
2008                    return;
2009                }
2010
2011                var $carouselContainer = $scope.find('.swiper'),
2012                    $settings = $carousel.data('settings'),
2013                    Swiper = elementorFrontend.utils.swiper;
2014
2015                initSwiper();
2016
2017                async function initSwiper()
2018                {
2019                    var swiper = await new Swiper($carouselContainer, $settings);
2020                    if ($settings.pauseOnHover)
2021                    {
2022                        $($carouselContainer).hover(function ()
2023                        {
2024                            (this).swiper.autoplay.stop();
2025                        }, function ()
2026                        {
2027                            (this).swiper.autoplay.start();
2028                        });
2029                    }
2030                };
2031            }
2032
2033
2034            if ($timeline_layout === 'vertical' || $timeline_type === "post")
2035            {
2036                var $timeline = $scope.find('.jltma-timeline'),
2037                    timelineArgs = {};
2038
2039                Master_Addons.MA_Timeline.init = function ()
2040                {
2041                    if (elementorFrontend.isEditMode())
2042                    {
2043                        timelineArgs.scope = window.elementor.$previewContents;
2044                    }
2045
2046                    if ('undefined' !== typeof elementSettings.line_location && elementSettings.line_location.size)
2047                    {
2048                        timelineArgs.lineLocation = elementSettings.line_location.size;
2049                    }
2050                    $timeline.maTimeline(timelineArgs);
2051                };
2052                Master_Addons.MA_Timeline.init();
2053            }
2054
2055        },
2056
2057
2058        //Master Addons: News Ticker
2059        MA_NewsTicker: function ($scope, $)
2060        {
2061
2062            try
2063            {
2064                (function ($)
2065                {
2066                    $(window).load(function (e)
2067                    {
2068
2069                        var newsTickerWrapper = $scope.find(".jltma-news-ticker"),
2070                            tickerType = newsTickerWrapper.data('tickertype'),
2071                            tickerid = newsTickerWrapper.data('tickerid'),
2072                            feedUrl = newsTickerWrapper.data('feedurl'),
2073                            feedAnimation = newsTickerWrapper.data('feedanimation'),
2074                            limitPosts = newsTickerWrapper.data('limitposts'),
2075                            tickerStyleEffect = newsTickerWrapper.data('scroll'),
2076                            autoplay = newsTickerWrapper.data('autoplay'),
2077                            timer = newsTickerWrapper.data('timer');
2078
2079                        if (tickerType === "content")
2080                        {
2081
2082                            $("#" + tickerid + "").breakingNews({
2083                                effect: "" + tickerStyleEffect + "",
2084                                autoplay: autoplay,
2085                                timer: timer,
2086                                border: false,
2087                                feed: false,
2088                                feedlabels: false
2089                            });
2090                        }
2091
2092                        if (tickerType === "feed")
2093                        {
2094
2095                            jQuery(function ($)
2096                            {
2097
2098                                var feed_container = $("#" + tickerid + ' .jltma-ticker-content-inner');
2099
2100                                $(feed_container).rss(feedUrl,
2101                                    {
2102                                        // how many entries do you want?
2103                                        // default: 4
2104                                        // valid values: any integer
2105                                        limit: limitPosts,
2106
2107                                        // want to offset results being displayed?
2108                                        // default: false
2109                                        // valid values: any integer
2110                                        offsetStart: false, // offset start point
2111                                        offsetEnd: false, // offset end point
2112
2113                                        // will request the API via https
2114                                        // default: false
2115                                        // valid values: false, true
2116                                        ssl: true,
2117
2118
2119                                        // which server should be requested for feed parsing
2120                                        // the server implementation is here: https://github.com/sdepold/feedr
2121                                        // default: feedrapp.info
2122                                        // valid values: any string
2123                                        // host: 'my-own-feedr-instance.com',
2124
2125
2126                                        // option to seldomly render ads
2127                                        // ads help covering the costs for the feedrapp server hosting and future improvements
2128                                        // default: true
2129                                        // valid values: false, true
2130                                        support: false,
2131
2132
2133                                        // formats the date with moment.js (optional)
2134                                        // default: 'dddd MMM Do'
2135                                        // valid values: see http://momentjs.com/docs/#/displaying/
2136                                        dateFormat: 'MMMM Do, YYYY',
2137
2138
2139                                        // localizes the date with moment.js (optional)
2140                                        // default: 'en'
2141                                        dateLocale: 'de',
2142
2143
2144                                        // outer template for the html transformation
2145                                        // default: "<ul>{entries}</ul>"
2146                                        // valid values: any string
2147
2148
2149                                        layoutTemplate: '<ul class="jltma-ticker-content-items">{entries}</ul>',
2150
2151                                        // inner template for each entry
2152                                        // default: '<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>'
2153                                        // valid values: any string
2154                                        // entryTemplate: '<p>{title}</p>',
2155                                        // entryTemplate: '<li><a href="{url}">[{author}@{date}] {title}</a>{teaserImage}{shortBodyPlain}</li>'
2156                                        entryTemplate: '<li> {teaserImage} <a href="{url}"> {title}</a></li>',
2157
2158                                        // the effect, which is used to let the entries appear
2159                                        // default: 'show'
2160                                        // valid values: 'show', 'slide', 'slideFast', 'slideSynced', 'slideFastSynced'
2161                                        effect: feedAnimation,
2162
2163                                    }, function ()
2164                                {
2165
2166                                    $("#" + tickerid + "").breakingNews({
2167                                        effect: "" + tickerStyleEffect + "",
2168                                        autoplay: autoplay,
2169                                        timer: timer
2170                                    });
2171                                })
2172                            });
2173
2174                        }
2175
2176                    }); // End of Window load
2177
2178                })(jQuery);
2179            } catch (e)
2180            {
2181                //We can also throw from try block and catch it here
2182                // No Error Show
2183            }
2184
2185
2186        },
2187
2188
2189        /*
2190         * Master Addons: MA Blog Posts
2191         */
2192
2193        MA_Blog: function ($scope, $)
2194        {
2195            var elementSettings = getElementSettings($scope),
2196                uniqueId = getUniqueLoopScopeId($scope),
2197                scopeId = $scope.data('id'),
2198                $swiper = $scope.find('.jltma-swiper__container'),
2199                $thumbs = $scope.find('.jltma-grid__item'),
2200                blogElement = $scope.find(".jltma-blog-wrapper"),
2201                colsNumber = blogElement.data("col"),
2202                carousel = blogElement.data("carousel"),
2203                grid = blogElement.data("grid");
2204
2205            $scope.find(".jltma-blog-cats-container li a").click(function (e)
2206            {
2207                e.preventDefault();
2208
2209                $scope
2210                    .find(".jltma-blog-cats-container li .active")
2211                    .removeClass("active");
2212
2213                $(this).addClass("active");
2214
2215                var selector = $(this).attr("data-filter");
2216
2217                blogElement.isotope({ filter: selector });
2218
2219                return false;
2220            });
2221
2222            var masonryBlog = blogElement.hasClass("jltma-blog-masonry");
2223
2224            if (masonryBlog && !carousel)
2225            {
2226                blogElement.imagesLoaded(function ()
2227                {
2228                    blogElement.isotope({
2229                        itemSelector: ".jltma-post-outer-container",
2230                        percentPosition: true,
2231                        animationOptions: {
2232                            duration: 750,
2233                            easing: "linear",
2234                            queue: false
2235                        }
2236                    });
2237                });
2238            }
2239
2240
2241            // Carousel
2242            var $carousel = $scope.find('.jltma-blog-carousel-slider');
2243
2244            if (!$carousel.length)
2245            {
2246                return;
2247            }
2248
2249            var $carouselContainer = $scope.find('.swiper'),
2250                $settings = $carousel.data('settings'),
2251                Swiper = elementorFrontend.utils.swiper;
2252
2253            initSwiper();
2254
2255            async function initSwiper()
2256            {
2257                var swiper = await new Swiper($carouselContainer, $settings);
2258                if ($settings.pauseOnHover)
2259                {
2260                    $($carouselContainer).hover(function ()
2261                    {
2262                        (this).swiper.autoplay.stop();
2263                    }, function ()
2264                    {
2265                        (this).swiper.autoplay.start();
2266                    });
2267                }
2268            };
2269
2270        },
2271
2272
2273        /**** MA Image Carousel ****/
2274        MA_Image_Carousel: function ($scope, $)
2275        {
2276
2277            var $carousel = $scope.find('.jltma-image-carousel-slider');
2278
2279            if (!$carousel.length)
2280            {
2281                return;
2282            }
2283
2284            var $carouselContainer = $scope.find('.swiper'),
2285                $settings = $carousel.data('settings'),
2286                Swiper = elementorFrontend.utils.swiper;
2287
2288            initSwiper();
2289
2290            async function initSwiper()
2291            {
2292                var swiper = await new Swiper($carouselContainer, $settings);
2293                if ($settings.pauseOnHover)
2294                {
2295                    $($carouselContainer).hover(function ()
2296                    {
2297                        (this).swiper.autoplay.stop();
2298                    }, function ()
2299                    {
2300                        (this).swiper.autoplay.start();
2301                    });
2302                }
2303            };
2304        },
2305
2306        /**** MA Logo Slider ****/
2307        MA_Logo_Slider: function ($scope, $)
2308        {
2309
2310            var $carousel = $scope.find('.jltma-logo-carousel-slider');
2311
2312            if (!$carousel.length)
2313            {
2314                return;
2315            }
2316
2317            var $carouselContainer = $scope.find('.swiper'),
2318                $settings = $carousel.data('settings'),
2319                Swiper = elementorFrontend.utils.swiper;
2320
2321            initSwiper();
2322
2323            async function initSwiper()
2324            {
2325                var swiper = await new Swiper($carouselContainer, $settings);
2326                if ($settings.pauseOnHover)
2327                {
2328                    $($carouselContainer).hover(function ()
2329                    {
2330                        (this).swiper.autoplay.stop();
2331                    }, function ()
2332                    {
2333                        (this).swiper.autoplay.start();
2334                    });
2335                }
2336            };
2337
2338
2339            /**
2340             * Icon click for hover
2341             */
2342            $carousel.find('.jltma-logo-slider-figure').on('click', '.item-hover-icon', function ()
2343            {
2344                var $this = $(this);
2345                $this.toggleClass('hide');
2346                $this.siblings('.jltma-hover-click').toggleClass('show');
2347            });
2348
2349            /**
2350             * Tooltip jS
2351             */
2352            var $tooltipSelector = $carousel.find('.jltma-logo-slider-item');
2353            $tooltipSelector.each(function (e)
2354            {
2355                var $currentTooltip = $(this).attr('id');
2356                if ($currentTooltip)
2357                {
2358                    var $dataId = $(this).data('id');
2359                    var $tooltipSettings = $(this).data('tooltip-settings');
2360                    var selector = '#' + $currentTooltip;
2361                    var $follow_cursor = $tooltipSettings.follow_cursor;
2362                    var placement_cursor;
2363                    if ($follow_cursor == 1)
2364                    {
2365                        placement_cursor = {
2366                            followCursor: true,
2367                        };
2368                    } else
2369                    {
2370                        placement_cursor = {
2371                            placement: $tooltipSettings.placement,
2372                            followCursor: false,
2373                        };
2374                    }
2375
2376
2377                    var arrowType = false;
2378                    if ($tooltipSettings.arrow == 1)
2379                    {
2380                        if ($tooltipSettings.arrow_type == 'round')
2381                        {
2382                            arrowType = tippy.roundArrow;
2383                        } else
2384                        {
2385                            arrowType = true;
2386                        }
2387                    }
2388
2389                    tippy(selector, {
2390                        content: $tooltipSettings.text,
2391                        ...placement_cursor,
2392                        animation: $tooltipSettings.animation,
2393                        arrow: arrowType,
2394                        duration: $tooltipSettings.duration,
2395                        delay: $tooltipSettings.delay,
2396                        trigger: $tooltipSettings.trigger, // mouseenter,click, manual
2397                        // flipOnUpdate: true,
2398                        // interactive: true,
2399                        offset: [$tooltipSettings.x_offset, $tooltipSettings.y_offset],
2400                        zIndex: 999999,
2401                        allowHTML: false,
2402                        theme: 'jltma-tippy-' + $dataId,
2403                        onShow(instance)
2404                        {
2405                            var tippyPopper = instance.popper;
2406                            $(tippyPopper).addClass($dataId);
2407                        }
2408                    });
2409                }
2410            });
2411        },
2412
2413
2414
2415        /**** MA Team Slider ****/
2416        MA_TeamSlider: function ($scope, $)
2417        {
2418
2419            var elementSettings = getElementSettings($scope),
2420                uniqueId = getUniqueLoopScopeId($scope),
2421                scopeId = $scope.data('id'),
2422                $teamCarouselWrapper = $scope.find('.jltma-team-carousel-wrapper').eq(0),
2423                $team_preset = $teamCarouselWrapper.data("team-preset"),
2424                $ma_el_team_circle_image_animation = $teamCarouselWrapper.data("ma_el_team_circle_image_animation");
2425
2426            if ($team_preset == "-content-drawer")
2427            {
2428
2429                try
2430                {
2431                    (function ($)
2432                    {
2433
2434                        $('.gridder').gridderExpander({
2435                            scroll: false,
2436                            scrollOffset: 0,
2437                            scrollTo: "panel",                  // panel or listitem
2438                            animationSpeed: 400,
2439                            animationEasing: "easeInOutExpo",
2440                            showNav: true, // Show Navigation
2441                            nextText: "<span></span>", // Next button text
2442                            prevText: "<span></span>", // Previous button text
2443                            closeText: "", // Close button text
2444                            onStart: function ()
2445                            {
2446                                //Gridder Inititialized
2447                            },
2448                            onContent: function ()
2449                            {
2450                                //Gridder Content Loaded
2451                            },
2452                            onClosed: function ()
2453                            {
2454                                //Gridder Closed
2455                            }
2456                        });
2457
2458                    })(jQuery);
2459                } catch (e)
2460                {
2461                    //We can also throw from try block and catch it here
2462                    // No Error Show
2463                }
2464
2465
2466            } else {
2467
2468                var $carousel = $scope.find('.jltma-team-carousel-slider');
2469
2470                if (!$carousel.length)
2471                {
2472                    return;
2473                }
2474
2475                var $carouselContainer = $scope.find('.swiper'),
2476                    $settings = $carousel.data('settings'),
2477                    Swiper = elementorFrontend.utils.swiper;
2478
2479                initSwiper();
2480
2481                async function initSwiper()
2482                {
2483                    var swiper = await new Swiper($carouselContainer, $settings);
2484                    if ($settings.pauseOnHover)
2485                    {
2486                        $($carouselContainer).hover(function ()
2487                        {
2488                            (this).swiper.autoplay.stop();
2489                        }, function ()
2490                        {
2491                            (this).swiper.autoplay.start();
2492                        });
2493                    }
2494                };
2495            }
2496
2497            // else if ($team_preset == "-circle-animation"){
2498            //     if($ma_el_team_circle_image_animation == "animation_svg_04"){
2499            //
2500            //     }
2501            // }
2502
2503        },
2504
2505        /**** MA Advanced Image ****/
2506        MA_Advanced_Image: function ($scope, $)
2507        {
2508
2509            Master_Addons.MA_Advanced_Image.elementSettings = getElementSettings($scope);
2510
2511            $scope.find('.jltma-img-dynamic-dropshadow').each(function ()
2512            {
2513
2514                var imgFrame, clonedImg, img;
2515
2516                if (this instanceof jQuery)
2517                {
2518                    if (this && this[0])
2519                    {
2520                        img = this[0];
2521                    } else
2522                    {
2523                        return;
2524                    }
2525                } else
2526                {
2527                    img = this;
2528                }
2529
2530                if (!img.classList.contains('jltma-img-has-shadow'))
2531                {
2532                    imgFrame = document.createElement('div');
2533                    clonedImg = img.cloneNode();
2534
2535                    clonedImg.classList.add('jltma-img-dynamic-dropshadow-cloned');
2536                    clonedImg.classList.remove('jltma-img-dynamic-dropshadow');
2537                    img.classList.add('jltma-img-has-shadow');
2538                    imgFrame.classList.add('jltma-img-dynamic-dropshadow-frame');
2539
2540                    img.parentNode.appendChild(imgFrame);
2541                    imgFrame.appendChild(img);
2542                    imgFrame.appendChild(clonedImg);
2543                }
2544            });
2545
2546            //Tilt Effect
2547            $scope.find('.jltma-tilt-box').tilt({
2548                maxTilt: $(this).data('max-tilt'),
2549                easing: 'cubic-bezier(0.23, 1, 0.32, 1)',
2550                speed: $(this).data('time'),
2551                perspective: 2000
2552            });
2553        },
2554
2555        /* MA Tooltip */
2556        MA_Tooltip: function ($scope, $)
2557        {
2558            var elementSettings = getElementSettings($scope),
2559                scopeId = $scope.data('id'),
2560                $currentTooltip = '#jltma-tooltip-' + scopeId,
2561                $jltma_el_tooltip_text = elementSettings.ma_el_tooltip_text ? stripTags(elementSettings.ma_el_tooltip_text) : 'This is the tooltip text',
2562                $jltma_el_tooltip_direction = elementSettings.jltma_tooltip_follow_cursor ? elementSettings.jltma_tooltip_follow_cursor : elementSettings.ma_el_tooltip_direction,
2563                $jltma_tooltip_animation = elementSettings.jltma_tooltip_animation ? elementSettings.jltma_tooltip_animation : '',
2564                $jltma_tooltip_arrow = elementSettings.jltma_tooltip_arrow ? elementSettings.jltma_tooltip_arrow : true,
2565                $jltma_tooltip_duration = elementSettings.jltma_tooltip_duration ? elementSettings.jltma_tooltip_duration : 300,
2566                $jltma_tooltip_delay = elementSettings.jltma_tooltip_delay ? elementSettings.jltma_tooltip_delay : 300,
2567                $jltma_el_tooltip_text_width = elementSettings.ma_el_tooltip_text_width ? elementSettings.ma_el_tooltip_text_width : '200px',
2568                $jltma_tooltip_arrow_type = elementSettings.jltma_tooltip_arrow_type ? elementSettings.jltma_tooltip_arrow_type : 'sharp',
2569                $jltma_tooltip_distance = elementSettings.jltma_tooltip_distance ? elementSettings.jltma_tooltip_distance : 10,
2570                $jltma_tooltip_trigger = elementSettings.jltma_tooltip_trigger ? elementSettings.jltma_tooltip_trigger : 'mouseenter',
2571                $animateFill = elementSettings.jltma_tooltip_animation == "fill" ? true : false;
2572
2573            var $ma_tooltip = $scope.find('.jltma-tooltip');
2574
2575            if (!$ma_tooltip.length)
2576            {
2577                return;
2578            }
2579
2580            var tooltipConfig = {
2581                content: $jltma_el_tooltip_text,
2582                animation: $jltma_tooltip_animation,
2583                arrow: $jltma_tooltip_arrow,
2584                arrowType: $jltma_tooltip_arrow_type,
2585                duration: $jltma_tooltip_duration,
2586                distance: $jltma_tooltip_distance,
2587                delay: $jltma_tooltip_delay,
2588                size: $jltma_el_tooltip_text_width,
2589                trigger: $jltma_tooltip_trigger,
2590                animateFill: $animateFill,
2591                flipOnUpdate: true,
2592                maxWidth: $jltma_el_tooltip_text_width,
2593                zIndex: 999,
2594                allowHTML: false,
2595                theme: 'jltma-image-filter-tippy-' + scopeId,
2596                interactive: true,
2597                appendTo: 'parent',
2598                onShow(instance) {
2599                    var tippyPopper = instance.popper;
2600                    jQuery(tippyPopper).attr('data-tippy-popper-id', scopeId);
2601                }
2602            };
2603            if ($jltma_el_tooltip_direction === "yes") {
2604                tooltipConfig.followCursor = true;  // Use followCursor if "yes"
2605            } else {
2606                tooltipConfig.placement = $jltma_el_tooltip_direction;  // Use placement if it's not "yes"
2607            }
2608
2609            // Initialize Tippy with the dynamic configuration
2610            tippy($currentTooltip, tooltipConfig);
2611        },
2612
2613        /**** MA Twitter Slider ****/
2614
2615        MA_Twitter_Slider: function ($scope, $)
2616        {
2617
2618            var $carousel = $scope.find('.jltma-twitter-carousel-slider');
2619
2620            if (!$carousel.length)
2621            {
2622                return;
2623            }
2624
2625            var $carouselContainer = $scope.find('.swiper'),
2626                $settings = $carousel.data('settings'),
2627                Swiper = elementorFrontend.utils.swiper;
2628
2629            initSwiper();
2630
2631            async function initSwiper()
2632            {
2633                var swiper = await new Swiper($carouselContainer, $settings);
2634                if ($settings.pauseOnHover)
2635                {
2636                    $($carouselContainer).hover(function ()
2637                    {
2638                        (this).swiper.autoplay.stop();
2639                    }, function ()
2640                    {
2641                        (this).swiper.autoplay.start();
2642                    });
2643                }
2644            };
2645
2646
2647        },
2648
2649
2650        MA_ParticlesBG: function ($scope, $)
2651        {
2652            if ($scope.hasClass('jltma-particle-yes'))
2653            {
2654                let id = $scope.data('id');
2655                let element_type = $scope.data('element_type');
2656                let pdata = $scope.data('jltma-particle');
2657                let pdata_wrapper = $scope.find('.jltma-particle-wrapper').data('ma-el-pdata');
2658                if (typeof pdata != 'undefined' && pdata != '')
2659                {
2660                    if ($scope.find('.ma-el-section-bs').length > 0)
2661                    {
2662                        $scope.find('.ma-el-section-bs').after('<div class="jltma-particle-wrapper"' +
2663                            ' id="jltma-particle-' + id + '"></div>');
2664                        particlesJS('jltma-particle-' + id, pdata);
2665                    } else
2666                    {
2667                        if (element_type == 'column')
2668                        {
2669                            // $scope.prepend('<div class="jltma-particle-wrapper" id="jltma-particle-' + id + '"></div>');
2670
2671                            $scope.find('.elementor-widget-wrap').prepend('<div class="jltma-particle-wrapper"' +
2672                                ' id="jltma-particle-' + id + '"></div>');
2673                        } else
2674                        {
2675                            $scope.prepend('<div class="jltma-particle-wrapper" id="jltma-particle-' + id + '"></div>');
2676                        }
2677
2678                        particlesJS('jltma-particle-' + id, pdata);
2679                    }
2680
2681
2682                } else if (typeof pdata_wrapper != 'undefined' && pdata_wrapper != '')
2683                {
2684                    $scope.prepend('<div class="jltma-particle-wrapper" id="jltma-particle-'+ id +'"></div>');
2685
2686                    if (element_type == 'column')
2687                    {
2688                        $scope.find('.elementor-widget-wrap').prepend('<div class="jltma-particle-wrapper"' +
2689                            ' id="jltma-particle-' + id + '"></div>');
2690                    }
2691                    else
2692                    {
2693                        $scope.prepend('<div class="jltma-particle-wrapper" id="jltma-particle-' + id + '"></div>');
2694                    }
2695
2696                    particlesJS('jltma-particle-' + id, JSON.parse(pdata_wrapper));
2697                }
2698
2699            }
2700            //
2701            //     })(jQuery);
2702            // } catch(e) {
2703            //     //We can also throw from try block and catch it here
2704            //     // No Error Show
2705            // }
2706
2707        },
2708
2709        MA_BgSlider: function ($scope, $)
2710        {
2711            var ma_el_slides = [], ma_el_slides_json = [], ma_el_transition, ma_el_animation, ma_el_custom_overlay, ma_el_overlay, ma_el_cover, ma_el_delay, ma_el_timer;
2712            var slider_wrapper = $scope.children('.ma-el-section-bs').children('.ma-el-section-bs-inner');
2713
2714            if (slider_wrapper && slider_wrapper.data('ma-el-bg-slider'))
2715            {
2716
2717                var slider_images = slider_wrapper.data('ma-el-bg-slider');
2718                ma_el_transition = slider_wrapper.data('ma-el-bg-slider-transition');
2719                ma_el_animation = slider_wrapper.data('ma-el-bg-slider-animation');
2720                ma_el_custom_overlay = slider_wrapper.data('ma-el-bg-custom-overlay');
2721                if (ma_el_custom_overlay == 'yes')
2722                {
2723                    ma_el_overlay = jltma_scripts.plugin_url + 'assets/lib/vegas/overlays/' + slider_wrapper.data('ma-el-bg-slider-overlay');
2724                } else
2725                {
2726                    if (slider_wrapper.data('ma-el-bg-slider-overlay'))
2727                    {
2728                        ma_el_overlay = jltma_scripts.plugin_url + 'assets/lib/vegas/overlays/' + slider_wrapper.data('ma-el-bg-slider-overlay');
2729                    } else
2730                    {
2731                        ma_el_overlay = jltma_scripts.plugin_url + 'assets/lib/vegas/overlays/' + slider_wrapper.data('ma-el-bg-slider-overlay');
2732                    }
2733                }
2734
2735                ma_el_cover = slider_wrapper.data('ma-el-bg-slider-cover');
2736                ma_el_delay = slider_wrapper.data('ma-el-bs-slider-delay');
2737                ma_el_timer = slider_wrapper.data('ma-el-bs-slider-timer');
2738
2739                if (typeof slider_images != 'undefined')
2740                {
2741                    ma_el_slides = slider_images.split(",");
2742
2743                    jQuery.each(ma_el_slides, function (key, value)
2744                    {
2745                        var slide = [];
2746                        slide.src = value;
2747                        ma_el_slides_json.push(slide);
2748                    });
2749
2750                    slider_wrapper.vegas({
2751                        slides: ma_el_slides_json,
2752                        transition: ma_el_transition,
2753                        animation: ma_el_animation,
2754                        overlay: ma_el_overlay,
2755                        cover: ma_el_cover,
2756                        delay: ma_el_delay,
2757                        timer: ma_el_timer,
2758                        init: function ()
2759                        {
2760                            if (ma_el_custom_overlay == 'yes')
2761                            {
2762                                var ob_vegas_overlay = slider_wrapper.children('.vegas-overlay');
2763                                ob_vegas_overlay.css('background-image', '');
2764                            }
2765                        }
2766                    });
2767
2768                }
2769            }
2770        },
2771
2772        MA_AnimatedGradient: function ($scope, $)
2773        {
2774
2775            if ($scope.hasClass('ma-el-animated-gradient-yes'))
2776            {
2777                let id = $scope.data('id');
2778                let color = $scope.data('color');
2779                let angle = $scope.data('angle');
2780                let gradient_color = 'linear-gradient(' + angle + ',' + color + ')';
2781                let heading = $scope.find('.elementor-heading-title');
2782                $scope.css('background-image', gradient_color);
2783
2784                if ($scope.hasClass('elementor-element-edit-mode'))
2785                {
2786                    color = $scope.find('.animated-gradient').data('color');
2787                    angle = $scope.find('.animated-gradient').data('angle');
2788                    let gradient_color_editor = 'linear-gradient(' + angle + ',' + color + ')';
2789                    $scope.prepend('<div class="animated-gradient" style="background-image : ' + gradient_color_editor + ' "></div>');
2790                    //$scope.find('.animated-gradient').css('background-image', gradient_color_editor);
2791                    //$scope.find('.animated-gradient').css('background-color', 'red');
2792                }
2793                //$scope.css('position', 'relative');
2794                //$scope.css('background-color', 'black');
2795
2796            }
2797
2798        },
2799
2800
2801        MA_Image_Comparison: function ($scope, $)
2802        {
2803            var $jltma_image_comp_wrap = $scope.find('.jltma-image-comparison').eq(0),
2804                $jltma_image_data = $jltma_image_comp_wrap.data('image-comparison-settings');
2805
2806            $jltma_image_comp_wrap.twentytwenty({
2807                default_offset_pct: $jltma_image_data.visible_ratio,
2808                orientation: $jltma_image_data.orientation,
2809                before_label: $jltma_image_data.before_label,
2810                after_label: $jltma_image_data.after_label,
2811                move_slider_on_hover: $jltma_image_data.slider_on_hover,
2812                move_with_handle_only: $jltma_image_data.slider_with_handle,
2813                click_to_move: $jltma_image_data.slider_with_click,
2814                no_overlay: $jltma_image_data.no_overlay
2815            });
2816        },
2817
2818        MA_BarCharts: function BarChart($scope) {
2819            jltMAObserveTarget($scope[0], function () {
2820                var $container = $scope.find('.jltma-bar-chart-container'),
2821                    $chart_canvas = $scope.find('#jltma-bar-chart'),
2822                    settings = $container.data('settings');
2823                if ($container.length) {
2824                    new Chart($chart_canvas, settings);
2825                }
2826            });
2827        },
2828
2829        MA_PieCharts: function ($scope, $)
2830        {
2831            jltMAObserveTarget($scope[0], function () {
2832                $scope.find('.ma-el-piechart .ma-el-percentage').each(function () {
2833                    var track_color = $(this).data('track-color');
2834                    var bar_color = $(this).data('bar-color');
2835
2836                    $(this).easyPieChart({
2837                        animate: 2000,
2838                        lineWidth: 10,
2839                        barColor: bar_color,
2840                        trackColor: track_color,
2841                        scaleColor: false,
2842                        lineCap: 'square',
2843                        size: 220
2844                    });
2845                });
2846            });
2847        },
2848
2849        ProgressBars: function ($scope, $)
2850        {
2851            jltMAObserveTarget($scope[0], function () {
2852                $scope.find('.jltma-stats-bar-content').each(function () {
2853                    var dataperc = $(this).data('perc');
2854                    $(this).animate({ "width": dataperc + "%" }, dataperc * 20);
2855                });
2856            });
2857        },
2858
2859
2860        // Toggle Content
2861        MA_Toggle_Content: function ($scope, $)
2862        {
2863            Master_Addons.getElementSettings = getElementSettings($scope);
2864            var $wrapper = $scope.find('.jltma-toggle-content'),
2865                toggleElementArgs = {
2866                    active: Master_Addons.getElementSettings.jltma_toggle_content_active_index,
2867                };
2868
2869            if ('' !== Master_Addons.getElementSettings.jltma_toggle_content_indicator_color)
2870            {
2871                toggleElementArgs.indicatorColor = Master_Addons.getElementSettings.jltma_toggle_content_indicator_color;
2872            }
2873
2874            if (Master_Addons.getElementSettings.jltma_toggle_content_indicator_speed.size)
2875            {
2876                toggleElementArgs.speed = Master_Addons.getElementSettings.jltma_toggle_content_indicator_speed.size;
2877            }
2878
2879            if (elementorFrontend.isEditMode())
2880            {
2881                toggleElementArgs.watchControls = true;
2882            }
2883
2884            $wrapper.MA_ToggleElement(toggleElementArgs);
2885        },
2886
2887
2888        // Comment Form reCaptcha
2889        MA_Comment_Form_reCaptcha: function ($scope, $)
2890        {
2891            Master_Addons.getElementSettings = getElementSettings($scope);
2892            var $commentsWrapper = $scope.find(".jltma-comments-wrap"),
2893                $comments_recaptcha_data = $commentsWrapper.data("recaptcha"),
2894                $recaptcha_protected = $commentsWrapper.data("jltma-comment-settings"),
2895                jltma_comment_form;
2896
2897            if ($recaptcha_protected.reCaptchaprotected == "yes")
2898            {
2899                var onloadCallback = function ()
2900                {
2901                    jltma_comment_form = grecaptcha.render("jltma_comment_form", {
2902                        "sitekey": $comments_recaptcha_data.sitekey,
2903                        "theme": $comments_recaptcha_data.theme
2904                    });
2905                    grecaptcha.reset(jltma_comment_form);
2906                };
2907            }
2908
2909        },
2910
2911
2912        // Master Addons: Counter Up
2913        MA_Counter_Up: function ($scope, $)
2914        {
2915            var $counterup = $scope.find(".jltma-counter-up-number");
2916
2917            if ($.isFunction($.fn.counterUp))
2918            {
2919                $counterup.counterUp({
2920                    duration: 2000,
2921                    delay: 15,
2922
2923                });
2924            }
2925        },
2926
2927
2928        // Master Addons: Countdown Timer
2929        MA_CountdownTimer: function ($scope, $)
2930        {
2931
2932            var $countdownWidget = $scope.find(".jltma-widget-countdown");
2933            $.fn.MasterCountDownTimer = function ()
2934            {
2935                var $wrapper = $(this).find(".jltma-countdown-wrapper"),
2936                    data = {
2937                        year: $wrapper.data("countdown-year"),
2938                        month: $wrapper.data("countdown-month"),
2939                        day: $wrapper.data("countdown-day"),
2940                        hour: $wrapper.data("countdown-hour"),
2941                        min: $wrapper.data("countdown-min"),
2942                        sec: $wrapper.data("countdown-sec")
2943                    },
2944
2945                    targetDate = new Date(data.year, data.month, data.day, data.hour, data.min, data.sec);
2946                var $year = $wrapper.find('.jltma-countdown-year'),
2947                    $month = $wrapper.find('.jltma-countdown-month'),
2948                    $day = $wrapper.find('.jltma-countdown-day'),
2949                    $hour = $wrapper.find('.jltma-countdown-hour'),
2950                    $min = $wrapper.find('.jltma-countdown-min'),
2951                    $sec = $wrapper.find('.jltma-countdown-sec');
2952
2953                setInterval(function ()
2954                {
2955                    var diffTime = (Date.parse(targetDate) - Date.parse(new Date())) / 1000;
2956
2957                    if (diffTime < 0) return;
2958
2959                    $year.text(Math.floor(diffTime / (31536000))); // 1 year = 3153600 second
2960                    $month.text(Math.floor((diffTime / 2592000) % 12)); // 1 month = 2592000 second
2961                    $day.text(Math.floor((diffTime / 86400) % 365)); // 1 day = 86400 second
2962                    $hour.text(Math.floor((diffTime / 3600) % 24)); // 1 hour = 3600 second
2963                    $min.text(Math.floor((diffTime / 60) % 60)); // 1 min  = 60 second
2964                    $sec.text(Math.floor((diffTime) % 60));
2965                }, 1e3)
2966            }, $countdownWidget.each(function ()
2967            {
2968                $(this).MasterCountDownTimer()
2969            })
2970
2971
2972        },
2973
2974        /**
2975         * Fancybox popup
2976         */
2977        MA_Fancybox_Popup: function ($scope, $)
2978        {
2979            (function ($)
2980            {
2981                if ($.isFunction($.fn.fancybox))
2982                {
2983                    $("[data-fancybox]").fancybox({});
2984                }
2985            })(jQuery);
2986        },
2987
2988        /*
2989        * REVEAL
2990        */
2991        MA_Reveal: function ($scope, $)
2992        {
2993
2994            Master_Addons.MA_Reveal.elementSettings = getElementSettings($scope);
2995
2996            var rev1,
2997                isReveal = false;
2998
2999            Master_Addons.MA_Reveal.revealAction = function ()
3000            {
3001                rev1 = new RevealFx(revealistance, {
3002                    revealSettings: {
3003                        bgcolor: Master_Addons.MA_Reveal.elementSettings.reveal_bgcolor,
3004                        direction: Master_Addons.MA_Reveal.elementSettings.reveal_direction,
3005                        duration: Number(Master_Addons.MA_Reveal.elementSettings.reveal_speed.size) * 100,
3006                        delay: Number(Master_Addons.MA_Reveal.elementSettings.reveal_delay.size) * 100,
3007                        onCover: function (contentEl, revealerEl)
3008                        {
3009                            contentEl.style.opacity = 1;
3010                        }
3011                    }
3012                });
3013            }
3014
3015            Master_Addons.MA_Reveal.runReveal = function ()
3016            {
3017                rev1.reveal();
3018            }
3019
3020            if (Master_Addons.MA_Reveal.elementSettings.enabled_reveal)
3021            {
3022
3023                var revealId = '#reveal-' + $scope.data('id'),
3024                    revealistance = document.querySelector(revealId);
3025
3026                if (!jQuery(revealId).hasClass('block-revealer')) {
3027                    Master_Addons.MA_Reveal.revealAction();
3028                }
3029
3030                Master_Addons.MA_Reveal.waypointOptions = {
3031                    offset: '100%',
3032                    triggerOnce: true
3033                };
3034
3035                jltMAObserveTarget(revealistance, Master_Addons.MA_Reveal.runReveal, Master_Addons.MA_Reveal.waypointOptions);
3036            }
3037        },
3038
3039        /*
3040        * MA Rellax
3041        */
3042        MA_Rellax: function ($scope, $)
3043        {
3044
3045            var elementSettings = getElementSettings($scope);
3046            var rellax = null;
3047
3048            $(window).on('resize', function ()
3049            {
3050
3051                if (rellax)
3052                {
3053                    rellax.destroy();
3054                    if (rellax)
3055                        initRellax();
3056                }
3057            });
3058
3059            var initRellax = function ()
3060            {
3061                if (elementSettings.enabled_rellax)
3062                {
3063
3064                    currentDevice = elementorFrontend.getCurrentDeviceMode();
3065
3066                    var setting_speed = 'speed_rellax';
3067                    var value_speed = 0;
3068
3069                    if (currentDevice != 'desktop')
3070                    {
3071                        setting_speed = 'speed_rellax_' + currentDevice;
3072                    }
3073
3074                    if (eval('elementSettings.' + setting_speed + '.size'))
3075                        value_speed = eval('elementSettings.' + setting_speed + '.size');
3076
3077
3078                    var rellaxId = '#rellax-' + $scope.data('id');
3079
3080                    if ($(rellaxId).length)
3081                        rellax = new Rellax(rellaxId, {
3082                            speed: value_speed
3083                        }
3084                        );
3085                    isRellax = true;
3086                };
3087            };
3088
3089            initRellax();
3090
3091        },
3092
3093        MA_Rellax_Final: function (panel, model, view)
3094        {
3095            Master_Addons.getElementSettings = getElementSettings($scope);
3096            var $scope = view.$el;
3097            var scene = $scope.find('#scene');
3098        },
3099
3100
3101        // Entrance Animations
3102        MA_Entrance_Animation: function ($scope, $)
3103        {
3104
3105            $scope = $scope || $(this);
3106
3107            var $target = $scope.hasClass('jltma-appear-watch-animation') ? $scope : $scope.find('.jltma-appear-watch-animation'),
3108                hasAnimation = $('body').hasClass('jltma-page-animation');
3109
3110            if (!$target.length)
3111            {
3112                return;
3113            }
3114
3115            if (hasAnimation)
3116            {
3117                document.body.addEventListener('JltmaPageAnimationDone', function (event)
3118                {
3119                    $target.appearl({
3120                        offset: '200px',
3121                        insetOffset: '0px'
3122                    }).one('appear', function (event, data)
3123                    {
3124                        this.classList.add('jltma-animated');
3125                        this.classList.add('jltma-animated-once');
3126                    });
3127                });
3128            } else
3129            {
3130                $target.appearl({
3131                    offset: '200px',
3132                    insetOffset: '0px'
3133                }).one('appear', function (event, data)
3134                {
3135                    this.classList.add('jltma-animated');
3136                    this.classList.add('jltma-animated-once');
3137                });
3138            }
3139
3140        },
3141
3142
3143        // Wrapper Link
3144        MA_Wrapper_Link: function ($scope, $)
3145        {
3146            $('body').on('click.onWrapperLink', '[data-jltma-wrapper-link]', function(e) {
3147                var $wrapper = $(this),
3148                  data = $wrapper.data("jltma-wrapper-link"),
3149                  id = $wrapper.data("id"),
3150                  anchor = document.createElement("a"),
3151                  anchorReal,
3152                  timeout = 100;
3153                anchor.id = "master-addons-wrapper-link-" + id;
3154                anchor.href = data.url;
3155                anchor.target = data.is_external ? "_blank" : "_self";
3156                anchor.rel = data.nofollow ? "nofollow noreferer" : "";
3157                anchor.style.display = "none";
3158                document.body.appendChild(anchor);
3159                anchorReal = document.getElementById(anchor.id);
3160                anchorReal.click();
3161
3162                timeout = setTimeout(function () {
3163                    document.body.removeChild(anchorReal);
3164                    clearTimeout(timeout);
3165                });
3166            });
3167        },
3168
3169        /**
3170         * Restrict Content
3171         */
3172        MA_Restrict_Content_Ajax: function ($scope, $)
3173        {
3174
3175            Master_Addons.getElementSettings = getElementSettings($scope);
3176
3177            var $restrictwrapper = $scope.find('.jltma-restrict-content-wrap').eq(0),
3178                $scopeId = $scope.data('id'),
3179                $restrict_layout = $restrictwrapper.data('restrict-layout-type'),
3180                $restrict_type = $restrictwrapper.data('restrict-type'),
3181                $error_message = $restrictwrapper.data('error-message'),
3182                $rc_ajaxify = $restrictwrapper.data('rc-ajaxify'),
3183
3184                $storageID = 'ma_el_rc_' + $scopeId,
3185                $formID = $scope.find('.jltma-restrict-form').eq(0).data('form-id'),
3186
3187                // Content
3188                $content_div = '#restrict-content-' + $scopeId,
3189
3190                // Popup Settings
3191                $popup = $scope.find('.jltma-restrict-content-popup-content'),
3192                $content_pass = $restrictwrapper.data('content-pass') ? $restrictwrapper.data('content-pass') : '',
3193                $popup_type = $popup.data('popup-type') ? $popup.data('popup-type') : '',
3194
3195                // Restrict Age
3196                $age_wrapper = $scope.find('.jltma-restrict-age-wrapper').eq(0),
3197
3198                $restrict_age = {
3199                    min_age: $age_wrapper.data('min-age'),
3200                    age_type: $age_wrapper.data('age-type'),
3201                    age_title: $age_wrapper.data('age-title'),
3202                    age_content: $age_wrapper.data('age-content'),
3203                    age_submit: $('#' + $formID).find('button[name="submit"]').val(),
3204                    checkbox_msg: $age_wrapper.data('checkbox-msg') ? $age_wrapper.data('checkbox-msg') : "",
3205                    empty_bday: $age_wrapper.data('empty-bday') ? $age_wrapper.data('empty-bday') : "",
3206                    non_exist_bday: $age_wrapper.data('non-exist-bday') ? $age_wrapper.data('non-exist-bday') : ""
3207                };
3208
3209
3210            //Check it the user has been accpeted the agreement
3211            if (localStorage.getItem($storageID))
3212            {
3213
3214                $('.jltma-rc-button').addClass('d-none');
3215                $('#' + $formID).addClass('d-none');
3216                $('#jltma-restrict-age-' + $scopeId).removeClass('card');
3217                $('#jltma-restrict-age-' + $scopeId).removeClass('text-center');
3218                $('#restrict-content-' + $scopeId).addClass('d-block');
3219
3220            } else
3221            {
3222
3223                // Dom Selector for Onpage/Popup
3224                if ($restrict_layout == "popup")
3225                {
3226                    var dom_selector = '#jltma-rc-modal-' + $scopeId;
3227                } else
3228                {
3229                    var dom_selector = '#jltma-restrict-content-' + $scopeId;
3230                }
3231
3232                $(dom_selector).on('click', '.jltma_ra_select', function ()
3233                {
3234                    var wrap = $(this).closest('.jltma_ra_select_wrap');
3235                    if (!wrap.find('.jltma_ra_options').hasClass('jltma_ra_active'))
3236                    {
3237                        $('.jltma_ra_options').removeClass('jltma_ra_active');
3238                        wrap.find('.jltma_ra_options').addClass('jltma_ra_active');
3239                        wrap.find('.jltma_ra_options').find('li:contains("' + wrap.find('.jltma_ra_select_val').html() + '")').addClass('jltma_ra_active');
3240                    }
3241                    else
3242                    {
3243                        wrap.find('.jltma_ra_options').removeClass('jltma_ra_active');
3244                    }
3245                });
3246
3247                $(dom_selector).on('click', '.jltma_ra_options ul li', function ()
3248                {
3249                    var wrap = $(this).closest('.jltma_ra_select_wrap');
3250                    wrap.find('.jltma_ra_select_val').html($(this).html());
3251                    wrap.find('select').val($(this).attr('data-val'));
3252                    wrap.find('.jltma_ra_options').removeClass('jltma_ra_active');
3253                });
3254
3255                $(dom_selector).on('mouseover', '.jltma_ra_options ul li', function ()
3256                {
3257                    if ($('.jltma_ra_options ul li').hasClass('jltma_ra_active'))
3258                    {
3259                        $('.jltma_ra_options ul li').removeClass('jltma_ra_active');
3260                    }
3261                });
3262
3263                $(document).click(function (e)
3264                {
3265                    if ($(e.target).attr('class') != 'jltma_ra_select' && !$('.jltma_ra_select').find($(e.target)).length)
3266                    {
3267                        if ($('.jltma_ra_options.jltma_ra_active').length)
3268                        {
3269                            $('.jltma_ra_options').removeClass('jltma_ra_active');
3270                        }
3271                    }
3272                });
3273
3274
3275                //Onload Fancybox
3276                if ($popup_type == "windowload" || $popup_type == "windowloadfullscreen")
3277                {
3278                    $("#ma-el-rc-modal-hidden").fancybox().trigger('click');
3279                } else
3280                {
3281                    $("[data-fancybox]").fancybox({});
3282                }
3283
3284                $(dom_selector).on('submit', '#' + $formID, function (event)
3285                {
3286                    event.preventDefault();
3287
3288                    var form = $(this);
3289                    form.find('.jltma_rc_result').remove();
3290
3291                    $.ajax({
3292                        type: "POST",
3293                        url: jltma_scripts.ajaxurl,
3294                        data: {
3295                            action: 'jltma_restrict_content',
3296                            fields: form.serialize(),
3297                            restrict_type: $restrict_type,
3298                            error_message: $error_message,
3299                            content_pass: $content_pass,
3300                            restrict_age: $restrict_age
3301                        },
3302                        cache: false,
3303                        success: function (result)
3304                        {
3305
3306                            try
3307                            {
3308                                result = jQuery.parseJSON(result);
3309
3310                                if (result['result'] == 'success')
3311                                {
3312
3313                                    $('#restrict-content-' + $scopeId).removeClass('d-none').addClass('d-block');
3314
3315                                    //Custom Classes add/remove
3316                                    $('#' + $formID).addClass('d-none');
3317                                    $('#jltma-restrict-age-' + $scopeId).removeClass('card');
3318                                    $('#jltma-restrict-age-' + $scopeId).removeClass('text-center');
3319
3320
3321                                    //Set a cookie to remember the state
3322                                    localStorage.setItem($storageID, true);
3323                                    $.fancybox.close();
3324
3325                                    $('.jltma-rc-button').addClass('d-none');
3326
3327                                } else if (result['result'] == 'validate')
3328                                {
3329                                    $('#' + $formID + ' ' + '.jltma_rc_submit').after('<div class="jltma_rc_result"><span class="eicon-info-circle-o"></span> ' + result['output'] + '</div>');
3330                                } else
3331                                {
3332                                    throw 0;
3333                                }
3334                            }
3335                            catch (err)
3336                            {
3337                                $('#' + $formID + ' ' + '.jltma_rc_submit').after('<div class="jltma_rc_result"><span class="eicon-loading"></span> Failed, please try again.</div>');
3338                            }
3339
3340                        }
3341                    }); // ajax part end
3342
3343                }); // End of Submit Event
3344
3345
3346            } // localstorage
3347
3348
3349        },
3350
3351        MA_Restrict_Content: function ($scope, $)
3352        {
3353
3354            try
3355            {
3356                (function ($)
3357                {
3358                    Master_Addons.getElementSettings = getElementSettings($scope);
3359
3360                    var $restrictwrapper = $scope.find('.jltma-restrict-content-wrap').eq(0),
3361                        $scopeId = $scope.data('id'),
3362                        $restrict_layout = $restrictwrapper.data('restrict-layout-type'),
3363                        $restrict_type = $restrictwrapper.data('restrict-type'),
3364
3365                        $storageID = 'ma_el_rc',
3366
3367                        // Popup Settings
3368                        $popup = $scope.find('.jltma-restrict-content-popup-content'),
3369                        $content_pass = $restrictwrapper.data('content-pass'),
3370
3371                        // Restrict Age
3372                        $age_wrapper = $scope.find('.jltma-restrict-age-wrapper').eq(0),
3373                        $min_age = $age_wrapper.data('min-age'),
3374                        $age_type = $age_wrapper.data('age-type'),
3375                        $age_title = $age_wrapper.data('age-title'),
3376                        $age_content = $age_wrapper.data('age-content'),
3377                        $checkbox_msg = $age_wrapper.data('checkbox-msg');
3378
3379                    Master_Addons.MA_Restrict_Content_Ajax($scope, $);
3380
3381                })(jQuery);
3382            } catch (e)
3383            {
3384                //We can also throw from try block and catch it here
3385                // No Error Show
3386            }
3387        },
3388
3389        MA_Nav_Menu: function ($scope, $)
3390        {
3391            Master_Addons.getElementSettings = getElementSettings($scope);
3392
3393            var $menuContainer = $scope.find(".jltma-nav-menu-element"),
3394                $menuID = $menuContainer.data("menu-id"),
3395                $menu_type = $menuContainer.data("menu-layout"),
3396                $menu_trigger = $menuContainer.data("menu-trigger"),
3397                $menu_offcanvas = $menuContainer.data("menu-offcanvas"),
3398                $menu_toggletype = $menuContainer.data("menu-toggletype"),
3399                $submenu_animation = $menuContainer.data("menu-animation"),
3400                $menu_container_id = $menuContainer.data("menu-container-id"),
3401                $sticky_type = $menuContainer.data("sticky-type"),
3402                navbar_height = $('#' + $menu_container_id).outerHeight(),
3403                menu_container_selector = $('#' + $menu_container_id);
3404
3405            // refresh window on resize
3406            // $(window).on('resize',function(){location.reload();});
3407
3408
3409            /* One Page Menu */
3410            if ($menu_type == "onepage")
3411            {
3412
3413                $(document).on('click', '.jltma-navbar-nav li a', function (e)
3414                {
3415                    if ($(this).attr('href'))
3416                    {
3417                        var self = $(this),
3418                            el = self.get(0),
3419                            href = el.href,
3420                            hasHash = href.indexOf('#'),
3421                            enable = self.parents('.jltma-navbar-nav-default').hasClass('jltma-one-page-enabled');
3422
3423                        if (hasHash !== -1 && (href.length > 1) && enable && (el.pathname == window.location.pathname))
3424                        {
3425                            e.preventDefault();
3426                            self.parents('.jltma-menu-container').find('.jltma-close').trigger('click');
3427                        }
3428                    }
3429                });
3430
3431                // Mobile Menu close outside clicking
3432                $(document).on('click', function (e)
3433                {
3434                    var click = $(e.target),
3435                        opened = $(".navbar-collapse").hasClass("show");
3436                    if (opened === true)
3437                    {
3438                        $(".jltma-one-page-enabled").removeClass('show');
3439                    }
3440                });
3441
3442            } else
3443            {
3444
3445
3446                // Submenu Hover Animation Effect
3447                var submenu_animate_class = 'animated ' + $submenu_animation,
3448                    submenu_selector = $('.jltma-dropdown.jltma-sub-menu');
3449                $("#" + $menuID + " .jltma-menu-has-children").hover(function ()
3450                {
3451                    if (submenu_selector.hasClass('fade-up'))
3452                    {
3453                        submenu_selector.removeClass('fade-up');
3454                    }
3455                    if (submenu_selector.hasClass('fade-down'))
3456                    {
3457                        submenu_selector.removeClass('fade-down');
3458                    }
3459                    $('.jltma-dropdown.jltma-sub-menu').addClass($submenu_animation);
3460                });
3461
3462
3463
3464                /* On Scroll Fixed Navbar */
3465                ///////////////// fixed menu on scroll for Desktop
3466                if ($sticky_type == "fixed-onscroll")
3467                {
3468                    if ($(window).width() > 768)
3469                    {
3470                        $(function ()
3471                        {
3472                            $(window).scroll(function ()
3473                            {
3474                                var scroll = $(window).scrollTop();
3475                                if (scroll >= 10)
3476                                {
3477                                    menu_container_selector.removeClass('' + $menu_container_id + '').addClass("jltma-on-scroll-fixed");
3478                                } else
3479                                {
3480                                    menu_container_selector.removeClass("jltma-on-scroll-fixed").addClass('' + $menu_container_id + '');
3481                                }
3482                            });
3483                        });
3484                    }
3485                }
3486
3487
3488                if ($sticky_type == "sticky-top")
3489                {
3490                    if ($(window).width() > 768)
3491                    {
3492                        $(function ()
3493                        {
3494                            $(window).scroll(function ()
3495                            {
3496                                var scroll = $(window).scrollTop();
3497                                if (scroll >= 10)
3498                                {
3499                                    menu_container_selector.removeClass('' + $menu_container_id + '').addClass("sticky-top");
3500                                } else
3501                                {
3502                                    menu_container_selector.removeClass("sticky-top").addClass('' + $menu_container_id + '');
3503                                }
3504                            });
3505                        });
3506                    }
3507                }
3508
3509
3510                if ($sticky_type == "smart-scroll")
3511                {
3512
3513                    // add padding top to show content behind navbar
3514                    $('body').css('padding-top', navbar_height + 'px');
3515                    menu_container_selector.addClass('jltma-smart-scroll');
3516
3517                    //////////////////////// detect scroll top or down
3518                    if ($('.jltma-smart-scroll').length > 0)
3519                    { // check if element exists
3520                        var last_scroll_top = 0;
3521
3522                        $(window).on('scroll', function ()
3523                        {
3524                            var scroll_top = $(this).scrollTop();
3525                            if (scroll_top < last_scroll_top)
3526                            {
3527                                $('.jltma-smart-scroll').removeClass('scrolled-down').addClass('scrolled-up');
3528                            }
3529                            else
3530                            {
3531                                $('.jltma-smart-scroll').removeClass('scrolled-up').addClass('scrolled-down');
3532                            }
3533                            last_scroll_top = scroll_top;
3534                        });
3535                    }
3536                }
3537
3538
3539                if ($sticky_type == "nav-fixed-top")
3540                {
3541                    if ($(window).width() > 768)
3542                    {
3543                        $(function ()
3544                        {
3545                            // add padding top to show content behind navbar
3546                            // $('body').css('padding-top', $('#' + $menu_container_id ).outerHeight() + 'px');
3547                            $('body').css('padding-top', navbar_height + 'px');
3548                            menu_container_selector.addClass('jltma-fixed-top');
3549
3550                        });
3551                    }
3552                }
3553
3554
3555
3556                // Menu Settings Megamenu Trigger Effect
3557                // if ($('.jltma-has-megamenu').hasClass('jltma-megamenu-click')) {
3558                //     $('.jltma-megamenu-click').on('click', function (e) {
3559                //         e.preventDefault();
3560                //         e.stopPropagation();
3561                //         $(this).toggleClass("show");
3562                //         $('.dropdown-menu.jltma-megamenu').toggleClass("show");
3563                //     });
3564                // }
3565                // else {
3566                //     $('.jltma-has-megamenu').on('hover', function (e) {
3567                //         e.preventDefault;
3568                //         e.stopPropagation();
3569                //         $(this).toggleClass("show");
3570                //         $('.dropdown-menu.jltma-megamenu').toggleClass("show");
3571                //     });
3572                // }
3573
3574
3575                if ($menu_toggletype == "toggle")
3576                {
3577
3578                    // Menu Toggle
3579                    $("#" + $menuID + " .navbar-nav.toggle .jltma-menu-dropdown-toggle").click(function (e)
3580                    {
3581                        $(this).parents(".dropdown").toggleClass("open");
3582                        e.stopPropagation();
3583                    });
3584                }
3585
3586
3587                if ($menu_offcanvas == "toggle-bar")
3588                {
3589                    $(".jltma-nav-panel .navbar-toggler").on("click", function (e)
3590                    {
3591                        $('.jltma-burger').toggleClass("jltma-close");
3592                    });
3593                }
3594
3595                // Off Canvas Menu
3596                if ($menu_offcanvas == "offcanvas" || $menu_offcanvas == "overlay")
3597                {
3598
3599                    // /// offcanvas onmobile
3600                    $(".jltma-nav-panel .navbar-toggler").on("click", function (e)
3601                    {
3602                        e.preventDefault();
3603                        e.stopPropagation();
3604                        var offcanvas_id = $(this).attr('data-trigger');
3605                        $(offcanvas_id).toggleClass("show");
3606                        $('body').toggleClass("offcanvas-active");
3607                        $(".jltma-nav-panel ").toggleClass("offcanvas-nav");
3608                        if ($menu_offcanvas == "overlay")
3609                        {
3610                            $(".jltma-nav-panel ").toggleClass("offcanvas-overlay");
3611                        }
3612                    });
3613
3614                    /// Close menu when pressing ESC
3615                    $(document).on('keydown', function (event)
3616                    {
3617                        if (event.keyCode === 27)
3618                        {
3619                            $(".mobile-offcanvas").removeClass("show");
3620
3621                            $(".desktop-offcanvas").removeClass("show");
3622
3623                            $("body").removeClass("overlay-active");
3624                        }
3625                    });
3626
3627                    $(".btn-close, .jltma-nav-panel .offcanvas-nav, .jltma-nav-panel.desktop .jltma-close, .jltma-close").click(function (e)
3628                    {
3629                        $(".jltma-nav-panel ").removeClass("offcanvas-nav");
3630                        $(".mobile-offcanvas").removeClass("show");
3631
3632                        $(".desktop-offcanvas").removeClass("show");
3633
3634                        $("body").removeClass("offcanvas-active");
3635                        if ($menu_offcanvas == "overlay")
3636                        {
3637                            $(".jltma-nav-panel ").removeClass("offcanvas-overlay");
3638                        }
3639                    });
3640                }
3641
3642            }
3643
3644        },
3645
3646
3647        initEvents: function ($scope, $)
3648        {
3649
3650            var mainSearchWrapper = $scope.find('.jltma-search-wrapper').eq(0),
3651                $search_type = mainSearchWrapper.data('search-type'),
3652                mainContainer = $scope.find('.jltma-search-main-wrap'),
3653                openCtrl = document.getElementById('jltma-btn-search'),
3654                closeCtrl = document.getElementById('jltma-btn-search-close'),
3655                searchContainer = $scope.find('.jltma-search'),
3656                inputSearch = searchContainer.find('.jltma-search__input');
3657
3658            $(openCtrl).on('click', function ()
3659            {
3660                mainContainer.addClass('main-wrap--move');
3661                searchContainer.addClass('search--open');
3662                setTimeout(function ()
3663                {
3664                    inputSearch.focus();
3665                }, 600);
3666            });
3667
3668            $(closeCtrl).on('click', function ()
3669            {
3670                mainContainer.removeClass('main-wrap--move');
3671                searchContainer.removeClass('search--open');
3672                inputSearch.blur();
3673                inputSearch.value = '';
3674            });
3675
3676            document.addEventListener('keyup', function (ev)
3677            {
3678                if (ev.keyCode == 27)
3679                {
3680                    Master_Addons.closeSearch();
3681                }
3682            });
3683        },
3684
3685
3686        MA_Header_Search: function ($scope, $)
3687        {
3688            $('body').addClass('js');
3689            Master_Addons.initEvents($scope, $);
3690        }
3691
3692    };
3693
3694    $(window).on('elementor/frontend/init', function ()
3695    {
3696
3697        if (elementorFrontend.isEditMode())
3698        {
3699            editMode = true;
3700        }
3701
3702        //Global Scripts
3703        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_AnimatedGradient);
3704        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_BgSlider);
3705        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_ParticlesBG);
3706        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Reveal);
3707        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Rellax);
3708        // elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Entrance_Animation);
3709        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Wrapper_Link);
3710
3711
3712        //Element Scripts
3713        elementorFrontend.hooks.addAction('frontend/element_ready/ma-headlines.default', Master_Addons.MA_Animated_Headlines);
3714        elementorFrontend.hooks.addAction('frontend/element_ready/ma-advanced-accordion.default', Master_Addons.MA_Accordion);
3715        elementorFrontend.hooks.addAction('frontend/element_ready/ma-tabs.default', Master_Addons.MA_Tabs);
3716        elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbar.default', Master_Addons.MA_ProgressBar);
3717        elementorFrontend.hooks.addAction('frontend/element_ready/ma-team-members-slider.default', Master_Addons.MA_TeamSlider);
3718        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-carousel.default', Master_Addons.MA_Image_Carousel);
3719        elementorFrontend.hooks.addAction('frontend/element_ready/ma-blog-post.default', Master_Addons.MA_Blog);
3720        elementorFrontend.hooks.addAction('frontend/element_ready/ma-news-ticker.default', Master_Addons.MA_NewsTicker);
3721        elementorFrontend.hooks.addAction('frontend/element_ready/ma-el-countdown-timer.default', Master_Addons.MA_CountdownTimer);
3722        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-counter-up.default', Master_Addons.MA_Counter_Up);
3723        elementorFrontend.hooks.addAction('frontend/element_ready/ma-piecharts.default', Master_Addons.MA_PieCharts);
3724        elementorFrontend.hooks.addAction('frontend/element_ready/ma-timeline.default', Master_Addons.MA_Timeline);
3725        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-filter-gallery.default', Master_Addons.MA_Image_Filter_Gallery);
3726        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-gallery-slider.default', Master_Addons.MA_Gallery_Slider);
3727
3728        elementorFrontend.hooks.addAction('frontend/element_ready/ma-el-image-comparison.default', Master_Addons.MA_Image_Comparison);
3729        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-restrict-content.default', Master_Addons.MA_Restrict_Content);
3730        // elementorFrontend.hooks.addAction('frontend/element_ready/ma-navmenu.default', Master_Addons.MA_Nav_Menu);
3731        elementorFrontend.hooks.addAction('frontend/element_ready/ma-search.default', Master_Addons.MA_Header_Search);
3732        elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbars.default', Master_Addons.ProgressBars);
3733        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-instagram-feed.default', Master_Addons.MA_Instagram_Feed);
3734        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-toggle-content.default', Master_Addons.MA_Toggle_Content);
3735        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-comments.default', Master_Addons.MA_Comment_Form_reCaptcha);
3736        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-logo-slider.default', Master_Addons.MA_Logo_Slider);
3737        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-twitter-slider.default', Master_Addons.MA_Twitter_Slider);
3738        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-advanced-image.default', Master_Addons.MA_Advanced_Image);
3739        elementorFrontend.hooks.addAction('frontend/element_ready/ma-tooltip.default', Master_Addons.MA_Tooltip);
3740        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-hotspot.default', Master_Addons.MA_Image_Hotspot);
3741        elementorFrontend.hooks.addAction('frontend/element_ready/ma-pricing-table.default', Master_Addons.MA_Pricing_Table);
3742        // elementorFrontend.hooks.addAction('frontend/element_ready/jltma-offcanvas-menu.default', Master_Addons.MA_Offcanvas_Menu);
3743
3744        
3745
3746        if (elementorFrontend.isEditMode())
3747        {
3748            elementorFrontend.hooks.addAction('frontend/element_ready/ma-headlines.default', Master_Addons.MA_Animated_Headlines);
3749            elementorFrontend.hooks.addAction('frontend/element_ready/ma-piecharts.default', Master_Addons.MA_PieCharts);
3750            elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbars.default', Master_Addons.ProgressBars);
3751            elementorFrontend.hooks.addAction('frontend/element_ready/ma-news-ticker.default', Master_Addons.MA_NewsTicker);
3752            // elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-filter-gallery.default', Master_Addons.MA_Image_Filter_Gallery);
3753            elementorFrontend.hooks.addAction('frontend/element_ready/jltma-gallery-slider.default', Master_Addons.MA_Gallery_Slider);
3754            elementorFrontend.hooks.addAction('frontend/element_ready/jltma-counter-up.default', Master_Addons.MA_Counter_Up);
3755            elementorFrontend.hooks.addAction('frontend/element_ready/ma-tooltip.default', Master_Addons.MA_Tooltip);
3756        }
3757    });
3758
3759})(jQuery);

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.