PageSourceSearch

https://bsm.org.bd/wp-content/plugins/master-addons/assets/js/master-addons-scripts.js?ver=2.0.9.6

js bsm.org.bd collected 2026-09-25 10:09:42 UTC 172,808 bytes, 3,965 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            
1106            var adata = Object.assign({}, optValues);
1107
1108            if (layoutMode === 'fitRows')
1109            {
1110                optValues['layoutMode'] = 'fitRows';
1111            }
1112
1113            if(layoutMode === 'masonry'){
1114                adata['macolumnWidthsonry'] = '.jltma-image-filter-item';
1115                adata['horizontalOrder'] = true;
1116            };
1117
1118            var $grid = $container.isotope(adata);
1119            $grid.imagesLoaded().progress(function() {
1120                $grid.isotope('layout');
1121                $scope.find('.jltma-image-filter-gallery').css({"min-height":"300px"});
1122            });
1123
1124            if ($.isFunction($.fn.imagesLoaded))
1125            {
1126                $ma_el_image_filter_gallery_container.imagesLoaded(function ()
1127                {
1128                    if ($.isFunction($.fn.isotope))
1129                    {
1130                        $ma_el_image_filter_gallery_container.isotope(optValues);
1131                    }
1132                });
1133            }
1134            //Masonry End
1135
1136
1137            // Tilt Effect Start
1138            if ($axis === 'x')
1139            {
1140                $axis = 'y';
1141            } else if ($axis === 'y')
1142            {
1143                $axis = 'x';
1144            } else
1145            {
1146                $axis = 'both';
1147            }
1148
1149            if ($glare === 'yes')
1150            {
1151                var $max_glare = elementSettings.ma_el_image_gallery_max_glare;
1152            }
1153
1154            if ($glare === 'yes')
1155            {
1156                $glare = true;
1157            } else
1158            {
1159                $glare = false;
1160            }
1161
1162            if ($scope.find('.jltma-tilt-enable'))
1163            {
1164                var tilt_args = {
1165                    maxTilt: $maxtilt,
1166                    perspective: $perspective,   // Transform perspective, the lower the more extreme the tilt gets.
1167                    //easing:         "cubic-bezier(.03,.98,.52,.99)",   // Easing on enter/exit.
1168                    easing: "linear",
1169                    scale: 1,      // 2 = 200%, 1.5 = 150%, etc..
1170                    speed: $speed,    // Speed of the enter/exit transition.
1171                    disableAxis: $axis,
1172                    transition: true,   // Set a transition on enter/exit.
1173                    reset: true,   // If the tilt effect has to be reset on exit.
1174                    glare: $glare,  // Enables glare effect
1175                    maxGlare: $max_glare       // From 0 - 1.
1176                }
1177
1178                $scope.find('.jltma-tilt').tilt(tilt_args);
1179            }
1180            // Tilt Effect End
1181
1182
1183            $ma_el_image_filter_gallery_nav.on('click', 'li', function ()
1184            {
1185                $ma_el_image_filter_gallery_nav.find('.active').removeClass('active');
1186                $(this).addClass('active');
1187
1188                if ($.isFunction($.fn.isotope))
1189                {
1190                    var selector = $(this).attr('data-filter');
1191                    $ma_el_image_filter_gallery_container.isotope({
1192                        filter: selector,
1193                    });
1194                    return false;
1195                }
1196            });
1197            $("jltma-fancybox").fancybox({
1198            // $(".elementor-widget.elementor-widget-ma-image-filter-gallery .jltma-fancybox").fancybox({
1199                protect: true,
1200                animationDuration: 366,
1201                transitionDuration: 366,
1202                transitionEffect: "fade", // Transition effect between slides
1203                animationEffect: "fade",
1204                preventCaptionOverlap: true,
1205                // loop: false,
1206                infobar: false,
1207                buttons: [
1208                    "zoom",
1209                    "share",
1210                    "slideShow",
1211                    "fullScreen",
1212                    "download",
1213                    "thumbs",
1214                    "close"
1215                ],
1216                afterLoad: function (instance, current)
1217                {
1218                    var pixelRatio = window.devicePixelRatio || 1;
1219
1220                    if (pixelRatio > 1.5)
1221                    {
1222                        current.width = current.width / pixelRatio;
1223                        current.height = current.height / pixelRatio;
1224                    }
1225                }
1226            });
1227
1228        },
1229
1230
1231        MA_Carousel: function ($swiper, settings)
1232        {
1233            var $slides = $swiper.find('.jltma-swiper__slide'),
1234
1235                elementorBreakpoints = elementorFrontend.config.breakpoints,
1236
1237                swiperInstance = $swiper.data('swiper'),
1238                swiperArgs = {
1239                    autoHeight: settings.element.autoHeight || false,
1240                    direction: settings.element.direction || settings.default.direction,
1241                    effect: settings.element.effect || settings.default.effect,
1242                    slidesPerView: settings.default.slidesPerView,
1243                    slidesPerColumn: settings.default.slidesPerColumn,
1244                    slidesPerColumnFill: 'row',
1245                    slidesPerGroup: settings.default.slidesPerGroup,
1246                    spaceBetween: settings.default.spaceBetween,
1247                    pagination: {},
1248                    navigation: {},
1249                    autoplay: settings.element.autoplay || false,
1250                    grabCursor: true,
1251                    watchSlidesProgress: true,
1252                    watchSlidesVisibility: true,
1253                };
1254
1255            if (settings.default.breakpoints)
1256            {
1257                swiperArgs.breakpoints = {};
1258                swiperArgs.breakpoints[elementorBreakpoints.md] = settings.default.breakpoints.tablet;
1259                swiperArgs.breakpoints[elementorBreakpoints.lg] = settings.default.breakpoints.desktop;
1260            }
1261
1262            if (!elementorFrontend.isEditMode())
1263            {
1264                // Observer messes with free mode
1265                if (!settings.element.freeMode)
1266                {
1267                    swiperArgs.observer = true;
1268                    swiperArgs.observeParents = true;
1269                    swiperArgs.observeSlideChildren = true;
1270                }
1271            } else
1272            { // But we're safe in edit mode
1273                swiperArgs.observer = true;
1274                swiperArgs.observeParents = true;
1275                swiperArgs.observeSlideChildren = true;
1276            }
1277
1278            Master_Addons.MA_Carousel.init = function ()
1279            {
1280                if (swiperInstance)
1281                {
1282                    Master_Addons.MA_Carousel.destroy();
1283                    return;
1284                }
1285
1286                // Number of columns
1287                if (swiperArgs.breakpoints)
1288                {
1289                    if (settings.element.breakpoints.desktop.slidesPerView)
1290                    {
1291                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerView = settings.stretch ? Math.min($slides.length, +settings.element.breakpoints.desktop.slidesPerView || 3) : +settings.element.breakpoints.desktop.slidesPerView || 3;
1292                    }
1293
1294                    if (settings.element.breakpoints.tablet.slidesPerView)
1295                    {
1296                        swiperArgs.breakpoints[ elementorBreakpoints.md ].slidesPerView = settings.stretch ? Math.min( $slides.length, +settings.element.breakpoints.tablet.slidesPerView || 2 ) : +settings.element.breakpoints.tablet.slidesPerView || 2;
1297                    }
1298                }
1299
1300                if (settings.element.slidesPerView)
1301                {
1302                    swiperArgs.slidesPerView = settings.stretch ? Math.min($slides.length, +settings.element.slidesPerView || 1
1302) : +settings.element.slidesPerView || 1;
1303                }
1304
1305                // Number of slides to scroll
1306                if (swiperArgs.breakpoints)
1307                {
1308                    if (settings.element.breakpoints.desktop.slidesPerGroup) {
1309                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerGroup = Math.min($slides.length, +settings.element.breakpoints.desktop.slidesPerGroup || 3);
1310                    }
1311
1312                    if (settings.element.breakpoints.tablet.slidesPerGroup) {
1313                        swiperArgs.breakpoints[elementorBreakpoints.md].slidesPerGroup = Math.min($slides.length, +settings.element.breakpoints.tablet.slidesPerGroup || 2);
1314                    }
1315                }
1316
1317                if (settings.element.slidesPerGroup)
1318                {
1319                    swiperArgs.slidesPerGroup = Math.min($slides.length, +settings.element.slidesPerGroup || 1);
1320                }
1321
1322                // Rows
1323                if (swiperArgs.breakpoints)
1324                {
1325                    if (settings.element.breakpoints.desktop.slidesPerColumn) {
1326                        swiperArgs.breakpoints[elementorBreakpoints.lg].slidesPerColumn = settings.element.breakpoints.desktop.slidesPerColumn;
1327                    }
1328
1329                    if (settings.element.breakpoints.tablet.slidesPerColumn) {
1330                        swiperArgs.breakpoints[elementorBreakpoints.md].slidesPerColumn = settings.element.breakpoints.tablet.slidesPerColumn;
1331                    }
1332                }
1333
1334                if (settings.element.slidesPerColumn)
1335                {
1336                    swiperArgs.slidesPerColumn = settings.element.slidesPerColumn;
1337                }
1338
1339                // Column spacing
1340
1341                if (swiperArgs.breakpoints)
1342                {
1343                    swiperArgs.breakpoints[elementorBreakpoints.lg].spaceBetween = settings.element.breakpoints.desktop.spaceBetween || 0;
1344                    swiperArgs.breakpoints[elementorBreakpoints.md].spaceBetween = settings.element.breakpoints.tablet.spaceBetween || 0;
1345                }
1346
1347                if (settings.element.spaceBetween){
1348                    swiperArgs.spaceBetween = settings.element.spaceBetween || 0;
1349                }
1350
1351                if (settings.element.slidesPerColumnFill) {
1352                    swiperArgs.slidesPerColumnFill = settings.element.slidesPerColumnFill;
1353                }
1354
1355                // Arrows and pagination
1356                if (settings.element.arrows)
1357                {
1358                    swiperArgs.navigation.disabledClass = 'jltma-swiper__button--disabled';
1359
1360                    var $prevButton = settings.scope.find(settings.element.arrowPrev),
1361                        $nextButton = settings.scope.find(settings.element.arrowNext);
1362
1363                    if ($prevButton.length && $nextButton.length)
1364                    {
1365
1366                        var arrowPrev = settings.element.arrowPrev + '-' + settings.id,
1367                            arrowNext = settings.element.arrowNext + '-' + settings.id;
1368
1369                        $prevButton.addClass(arrowPrev.replace('.', ''));
1370                        $nextButton.addClass(arrowNext.replace('.', ''));
1371
1372                        swiperArgs.navigation.prevEl = arrowPrev;
1373                        swiperArgs.navigation.nextEl = arrowNext;
1374                    }
1375                }
1376
1377                if (settings.element.pagination)
1378                {
1379                    swiperArgs.pagination.el = '.jltma-swiper__pagination-' + settings.id;
1380                    swiperArgs.pagination.type = settings.element.paginationType;
1381
1382                    if (settings.element.paginationClickable)
1383                    {
1384                        swiperArgs.pagination.clickable = true;
1385                    }
1386                }
1387
1388                // Loop
1389                if (settings.element.loop)
1390                {
1391                    swiperArgs.loop = true;
1392                    // swiperArgs.loopedSlides = $slides.length;
1393                }
1394
1395                // Autoplay
1396                if (swiperArgs.autoplay && (settings.element.autoplaySpeed || settings.element.disableOnInteraction)) {
1397                    swiperArgs.autoplay = {};
1398
1399                    if (settings.element.autoplaySpeed) {
1400                        swiperArgs.autoplay.delay = settings.element.autoplaySpeed;
1401                    }
1402
1403                    if (settings.element.autoplaySpeed) {
1404                        swiperArgs.autoplay.disableOnInteraction = settings.element.disableOnInteraction;
1405                    }
1406                } else {
1407
1408                }
1409
1410                // Speed
1411                if (settings.element.speed)
1412                {
1413                    swiperArgs.speed = settings.element.speed;
1414                }
1415
1416                // Resistance
1417                if (settings.element.resistance)
1418                {
1419                    swiperArgs.resistanceRatio = 1 - settings.element.resistance;
1420                }
1421
1422                // Free Mode
1423                if (settings.element.freeMode)
1424                {
1425                    swiperArgs.freeMode = true;
1426                    swiperArgs.freeModeSticky = settings.element.freeModeSticky;
1427                    swiperArgs.freeModeMomentum = settings.element.freeModeMomentum;
1428                    swiperArgs.freeModeMomentumBounce = settings.element.freeModeMomentumBounce;
1429
1430                    if (settings.element.freeModeMomentumRatio)
1431                    {
1432                        swiperArgs.freeModeMomentumRatio = settings.element.freeModeMomentumRatio;
1433                    }
1434
1435                    if (settings.element.freeModeMomentumVelocityRatio)
1436                    {
1437                        swiperArgs.freeModeMomentumVelocityRatio = settings.element.freeModeMomentumVelocityRatio;
1438                    }
1439
1440                    if (settings.element.freeModeMomentumBounceRatio)
1441                    {
1442                        swiperArgs.freeModeMomentumBounceRatio = settings.element.freeModeMomentumBounceRatio;
1443                    }
1444                }
1445
1446                return swiperArgs;
1447
1448                // Conditional asset loading of the Swiper library with backwards compatibility
1449                // since Elementor 3.1
1450                // @link https://developers.elementor.com/experiment-optimized-asset-loading/
1451                // var swiper;
1452                // if ('undefined' === typeof Swiper)
1453                // {
1454                //     const asyncSwiper = elementorFrontend.utils.swiper;
1455
1456                //     new asyncSwiper($swiper, swiperArgs).then(function (newSwiperInstance)
1457                //     {
1458                //         swiper = newSwiperInstance;
1459                //     });
1460                // } else
1461                // {
1462                //     swiper = new Swiper($swiper, swiperArgs);
1463                // }
1464
1465                // if (settings.element.stopOnHover)
1466                // {
1467                //     $swiper.on('mouseover', function ()
1468                //     {
1469                //         swiper.autoplay.stop();
1470                //     });
1471
1472                //     $swiper.on('mouseout', function ()
1473                //     {
1474                //         swiper.autoplay.start();
1475                //     });
1476                // }
1477
1478                // if (settings.element.slideChangeTriggerResize)
1479                // {
1480                //     swiper.on('slideChange', function ()
1481                //     {
1482                //         $(window).trigger('resize');
1483                //     });
1484                // }
1485
1486                // $swiper.data('swiper', swiper);
1487                // return swiper;
1488            };
1489
1490            Master_Addons.MA_Carousel.onAfterInit = function ($swiper, swiper, settings) {
1491                if ('undefined' == typeof settings || 'undefined' == typeof swiper) {
1492                    return;
1493                }
1494
1495                if (settings.element.stopOnHover) {
1496                    $swiper.on('mouseover', function () {
1497                        swiper.autoplay.stop();
1498                    });
1499
1500                    $swiper.on('mouseout', function () {
1501                        swiper.autoplay.start();
1502                    });
1503                }
1504
1505                if (settings.element.slideChangeTriggerResize) {
1506                    swiper.on('slideChange', function () {
1507                        $(window).trigger('resize');
1508                    });
1509                }
1510
1511                $swiper.data('swiper', swiper);
1512            };
1513
1514
1515            return Master_Addons.MA_Carousel.init();
1516        },
1517
1518        // Gallery Slider
1519        MA_Gallery_Slider: function ($scope, $)
1520        {
1521            // var swiper = new Swiper(".jltma-gallery-slider__gallery", {
1522            //     loop: true,
1523            //     spaceBetween: 10,
1524            //     slidesPerView: 2,
1525            //     freeMode: true,
1526            //     watchSlidesProgress: true,
1527            // });
1528            // var swiper2 = new Swiper(".jltma-gallery-slider__slider", {
1529            //     loop: true,
1530            //     spaceBetween: 10,
1531            //     navigation: {
1532            //         nextEl: ".jltma-swiper__button--next",
1533            //         prevEl: ".jltma-swiper__button--prev",
1534            //     },
1535            //     thumbs: {
1536            //         swiper: swiper,
1537            //     },
1538            // });
1539            // return;
1540
1541            var elementSettings   = getElementSettings($scope),
1542                $swiperSlider     = $scope.find('.jltma-gallery-slider__slider'), // The main slider area
1543                $swiperCarousel   = $scope.find('.jltma-gallery-slider__carousel'), // The main slider area when it is carousel
1544                uniqueId          = getUniqueLoopScopeId($scope),
1545                // console.log($scope);
1546                scopeId           = $scope.data('id'),
1547                $preview          = $scope.find('.jltma-gallery-slider__preview'),
1548                $thumbs           = $scope.find('.jltma-swiper__wrapper .jltma-gallery__item'), // Thumbs will be there
1549                $thumbnailsSlider = $scope.find(".jltma-gallery-slider__gallery .jltma-gallery"), // list all thumbs
1550                $thumbtype        = elementSettings.jltma_gallery_slider_thumb_type,
1551                $thumbposition    = elementSettings.jltma_gallery_slider_preview_position,
1552                $thumbVertical    = ($thumbposition == "top" || $thumbposition == "bottom") ? false : true,
1553
1554                start       = elementorFrontend.config.is_rtl ? 'right' : 'left',
1555                end         = elementorFrontend.config.is_rtl ? 'left' : 'right',
1556                hasCarousel = $swiperCarousel.length,
1557
1558                swiperSlider   = null,
1559                swiperCarousel = null,
1560
1561                sliderSettings = {
1562                    key    : 'slider',
1563                    scope  : $scope,
1564                    id     : uniqueId,
1565                    element: {
1566                        autoHeight          : 'yes' === elementSettings.jltma_gallery_slider_adaptive_height ? true                                                                                                    : false,
1567                        autoplay            : 'yes' === elementSettings.jltma_gallery_slider_autoplay ? true                                                                                                           : false,
1568                        autoplaySpeed       : 'yes' === elementSettings.jltma_gallery_slider_autoplay && elementSettings.jltma_gallery_slider_autoplay_speed ? elementSettings.jltma_gallery_slider_autoplay_speed.size: false,
1569                        disableOnInteraction: '' !== elementSettings.autoplay_disable_on_interaction,
1570                        stopOnHover         : 'yes' === elementSettings.jltma_gallery_slider_pause_on_hover,
1571                        loop                : 'yes' === elementSettings.jltma_gallery_slider_infinite,
1572                        arrows              : '' !== elementSettings.jltma_gallery_slider_show_arrows,
1573                        arrowPrev           : '.jltma-arrow--prev',
1574                        arrowNext           : '.jltma-arrow--next',
1575                        effect              : elementSettings.jltma_gallery_slider_effect,
1576                        speed               : elementSettings.speed ? elementSettings.speed.size                                                                                                                       : 500,
1577                        resistance          : elementSettings.resistance ? elementSettings.resistance.size                                                                                                             : 0.25,
1578                        keyboard            : {
1579                            // enabled: "yes" === slider_data.jltma_slider_keyboard ? true : false
1580                            enabled: true
1581                        },
1582                    },
1583                    default: {
1584                        effect         : 'slide',
1585                        direction      : 'horizontal',
1586                        slidesPerView  : 1,
1587                        slidesPerGroup : 1,
1588                        slidesPerColumn: 1,
1589                        spaceBetween   : 0,
1590                    }
1591                };
1592
1593            // If Carousel
1594            if (hasCarousel)
1595            {
1596                var carouselSettings = {
1597                    key    : 'carousel',
1598                    scope  : $scope,
1599                    id     : uniqueId,
1600                    // stretch: 'yes' === elementSettings.thumbnails_stretch,
1601                    element: {
1602                        direction      : elementSettings.carousel_orientation,
1603                        arrows         : '' !== elementSettings.jltma_gallery_slider_thumb_show_arrows,
1604                        arrowPrev      : '.jltma-arrow--prev',
1605                        arrowNext      : '.jltma-arrow--next',
1606                        autoHeight     : false,
1607                        loop           : 'yes' === elementSettings.jltma_gallery_slider_thumb_infinite ? true : false,
1608                        autoplay       : 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay ? true : false,
1609                        autoplaySpeed  : 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay && elementSettings.jltma_gallery_slider_thumb_autoplay_speed ? elementSettings.jltma_gallery_slider_thumb_autoplay_speed.size: false,
1610                        stopOnHover    : 'yes' === elementSettings.jltma_gallery_slider_thumb_pause_on_hover,
1611                        speed          : elementSettings.jltma_gallery_slider_thumb_speed ? elementSettings.jltma_gallery_slider_thumb_speed.size : 500,
1612                        slidesPerView  : elementSettings.jltma_gallery_slider_thumb_items_mobile,
1613                        slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_mobile,
1614                        slidesPerGroup : elementSettings.carousel_slides_to_scroll_mobile,
1615                        resistance     : elementSettings.carousel_resistance ? elementSettings.carousel_resistance.size : 0.15,
1616                        spaceBetween   : elementSettings.carousel_spacing_mobile ? elementSettings.carousel_spacing_mobile.size : 0,
1617                        breakpoints    : {
1618                            tablet: {
1619                                slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_tablet,
1620                                slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_tablet,
1621                                slidesPerGroup: elementSettings.carousel_slides_to_scroll_tablet,
1622                                spaceBetween: elementSettings.carousel_spacing_tablet ? elementSettings.carousel_spacing_tablet.size : 0,
1623                            },
1624                            desktop: {
1625                                slidesPerView: elementSettings.jltma_gallery_slider_thumb_items,
1626                                slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column,
1627                                slidesPerGroup: elementSettings.carousel_slides_to_scroll,
1628                                spaceBetween: elementSettings.carousel_spacing ? elementSettings.carousel_spacing.size : 0,
1629                            },
1630                        },
1631                    },
1632                    default: {
1633                        effect: 'slide',
1634                        slidesPerView: 1,
1635                        slidesPerGroup: 1,
1636                        slidesPerColumn: 1,
1637                        spaceBetween: 6,
1638                        breakpoints: {
1639                            tablet: {
1640                                slidesPerView: 2,
1641                                slidesPerGroup: 1,
1642                                slidesPerColumn: 2,
1643                                spaceBetween: 12,
1644                            },
1645                            desktop: {
1646                                slidesPerView: 3,
1647                                slidesPerGroup: 1,
1648                                slidesPerColumn: 3,
1649                                spaceBetween: 24,
1650                            },
1651                        },
1652                    },
1653                };
1654            }
1655
1656
1657            Master_Addons.MA_Gallery_Slider.init = function ()
1658            {
1659                var sliderArgs = Master_Addons.MA_Carousel( $swiperSlider, sliderSettings );
1660
1661                if (hasCarousel) {
1662                    var carouselArgs = Master_Addons.MA_Carousel($swiperCarousel, carouselSettings);
1663                }
1664
1665                // Master_Addons.MA_Gallery_Slider.onSlideChange();
1666                // Master_Addons.MA_Gallery_Slider.events();
1667
1668
1669                if ('undefined' === typeof Swiper) {
1670                    const asyncSwiper = elementorFrontend.utils.swiper;
1671
1672                    new asyncSwiper($swiperSlider, sliderArgs).then(function (sliderSwiperInstance) {
1673
1674                        if (!hasCarousel) {
1675                            Master_Addons.MA_Gallery_Slider.initSliders($scope, sliderSwiperInstance, false);
1676
1677                            Master_Addons.MA_Carousel.onAfterInit($swiperSlider, sliderSwiperInstance, sliderSettings);
1678                        } else {
1679                            new asyncSwiper($swiperCarousel, carouselArgs).then(function (carou
1679selSwiperInstance) {
1680                                Master_Addons.MA_Gallery_Slider.initSliders($scope, sliderSwiperInstance, carouselSwiperInstance);
1681
1682                                Master_Addons.MA_Carousel.onAfterInit($swiperSlider, sliderSwiperInstance, sliderSettings);
1683                                Master_Addons.MA_Carousel.onAfterInit($swiperCarousel, carouselSwiperInstance, carouselSettings);
1684                            });
1685                        }
1686                    });
1687
1688                } else {
1689                    if (hasCarousel) {
1690                        var swiper = new Swiper($swiperSlider[1], {
1691                            ...carouselArgs,
1692                        });
1693                        var swiperSlider = new Swiper($swiperSlider[0], {
1694                            ...sliderArgs,
1695                            thumbs: {
1696                                swiper: swiper,
1697                            },
1698                        });
1699                    }else{
1700                        var swiperSlider = new Swiper($swiperSlider[0], {
1701                            ...sliderArgs
1702                        });
1703                    }
1704                    // swiperSlider = new Swiper($swiperSlider, sliderArgs);
1705
1706                    if (hasCarousel) {
1707                        swiperCarousel = new Swiper($swiperCarousel, carouselArgs);
1708                    }
1709
1710                    Master_Addons.MA_Gallery_Slider.initSliders($scope, swiperSlider, swiperCarousel);
1711
1712                    Master_Addons.MA_Carousel.onAfterInit($swiperSlider, swiperSlider, sliderSettings);
1713
1714                    if (hasCarousel) {
1715                        Master_Addons.MA_Carousel.onAfterInit($swiperCarousel, swiperCarousel, carouselSettings);
1716                    }
1717                }
1718
1719            };
1720
1721            Master_Addons.MA_Gallery_Slider.getSlider = function () {
1722                return $scope.find('.jltma-gallery-slider__slider');
1723            };
1724
1725
1726            Master_Addons.MA_Gallery_Slider.getCarousel = function () {
1727                return $scope.find('.jltma-gallery-slider__carousel');
1728            };
1729
1730
1731            Master_Addons.MA_Gallery_Slider.initSliders = function ($scope, swiperSlider, swiperCarousel) {
1732                var data = {
1733                    scope: $scope,
1734                    slider: swiperSlider,
1735                    carousel: swiperCarousel,
1736                };
1737
1738                Master_Addons.MA_Gallery_Slider.onSlideChange(data);
1739                Master_Addons.MA_Gallery_Slider.events(data);
1740            };
1741
1742
1743            Master_Addons.MA_Gallery_Slider.events = function ( data )
1744            {
1745
1746                var $thumbs = data.scope.find('.jltma-gallery__item');
1747
1748                data.slider.on('slideChange', function (instance) {
1749                    Master_Addons.MA_Gallery_Slider.onSlideChange(data);
1750                });
1751
1752                $thumbs.on('click', function () {
1753                    var offset = sliderSettings.element.loop ? 1 : 0;
1754
1755                    event.preventDefault();
1756                    data.slider.slideTo($(this).index() + offset);
1757                });
1758            };
1759
1760            Master_Addons.MA_Gallery_Slider.onSlideChange = function (data)
1761            {
1762                var activeIndex = sliderSettings.element.loop ? data.slider.realIndex : data.slider.activeIndex;
1763
1764                if (hasCarousel) {
1765                    data.carousel.slideTo(activeIndex);
1766                }
1767
1768                var $thumbs = data.scope.find('.jltma-gallery__item');
1769
1770                $thumbs.removeClass('is--active');
1771                $thumbs.eq(activeIndex).addClass('is--active');
1772
1773            };
1774
1775            Master_Addons.MA_Gallery_Slider.onThumbClicked = function (event)
1776            {
1777                var offset = sliderSettings.element.loop ? 1 : 0;
1778                event.preventDefault();
1779                swiperSlider.slideTo($(this).index() + offset, 500, true);
1780            };
1781
1782            Master_Addons.onElementRemove($scope, function ()
1783            {
1784                $scope.find('.swiper-container').each(function () {
1785                    if ($(this).data('swiper')) {
1786                        $(this).data('swiper').destroy();
1787                    }
1788                });
1789            });
1790
1791
1792            Master_Addons.MA_Gallery_Slider.init();
1793        },
1794        // MA_Gallery_Slider: function ($scope, $) {
1795        //     var elementSettings = getElementSettings($scope),
1796        //         $swiperSlider = $scope.find('.jltma-gallery-slider__slider'),
1797        //         $swiperCarousel = $scope.find('.jltma-gallery-slider__carousel'),
1798        //         uniqueId = getUniqueLoopScopeId($scope),
1799        //         scopeId = $scope.data('id'),
1800        //         $preview = $scope.find('.jltma-gallery-slider__preview'),
1801        //         $thumbs = $scope.find('.jltma-swiper__wrapper .jltma-gallery__item'),
1802        //         $thumbnailsSlider = $scope.find(".jltma-gallery-slider__gallery .jltma-gallery"),
1803        //         $thumbtype = elementSettings.jltma_gallery_slider_thumb_type,
1804        //         $thumbposition = elementSettings.jltma_gallery_slider_preview_position,
1805        //         $thumbVertical = ($thumbposition == "top" || $thumbposition == "bottom") ? false : true,
1806        //         start = elementorFrontend.config.is_rtl ? 'right' : 'left',
1807        //         end = elementorFrontend.config.is_rtl ? 'left' : 'right',
1808        //         hasCarousel = $swiperCarousel.length,
1809        //         swiperSlider = null,
1810        //         swiperCarousel = null,
1811        //         sliderSettings = {
1812        //             key: 'slider',
1813        //             scope: $scope,
1814        //             id: uniqueId,
1815        //             element: {
1816        //                 autoHeight: 'yes' === elementSettings.jltma_gallery_slider_adaptive_height ? true : false,
1817        //                 autoplay: 'yes' === elementSettings.jltma_gallery_slider_autoplay ? true : false,
1818        //                 autoplaySpeed: 'yes' === elementSettings.jltma_gallery_slider_autoplay && elementSettings.jltma_gallery_slider_autoplay_speed ? elementSettings.jltma_gallery_slider_autoplay_speed.size : false,
1819        //                 disableOnInteraction: '' !== elementSettings.autoplay_disable_on_interaction,
1820        //                 stopOnHover: 'yes' === elementSettings.jltma_gallery_slider_pause_on_hover,
1821        //                 loop: 'yes' === elementSettings.jltma_gallery_slider_infinite,
1822        //                 arrows: '' !== elementSettings.jltma_gallery_slider_show_arrows,
1823        //                 arrowPrev: '.jltma-arrow--prev',
1824        //                 arrowNext: '.jltma-arrow--next',
1825        //                 effect: elementSettings.jltma_gallery_slider_effect,
1826        //                 speed: elementSettings.speed ? elementSettings.speed.size : 500,
1827        //                 resistance: elementSettings.resistance ? elementSettings.resistance.size : 0.25,
1828        //                 keyboard: {
1829        //                     enabled: true
1830        //                 },
1831        //             },
1832        //             default: {
1833        //                 effect: 'slide',
1834        //                 direction: 'horizontal',
1835        //                 slidesPerView: 1,
1836        //                 slidesPerGroup: 1,
1837        //                 slidesPerColumn: 1,
1838        //                 spaceBetween: 0,
1839        //             }
1840        //         };
1841
1842        //     if (hasCarousel) {
1843        //         var carouselSettings = {
1844        //             key: 'carousel',
1845        //             scope: $scope,
1846        //             id: uniqueId,
1847        //             element: {
1848        //                 direction: elementSettings.carousel_orientation,
1849        //                 arrows: '' !== elementSettings.jltma_gallery_slider_thumb_show_arrows,
1850        //                 arrowPrev: '.jltma-arrow--prev',
1851        //                 arrowNext: '.jltma-arrow--next',
1852        //                 autoHeight: false,
1853        //                 loop: 'yes' === elementSettings.jltma_gallery_slider_thumb_infinite ? true : false,
1854        //                 autoplay: 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay ? true : false,
1855        //                 autoplaySpeed: 'yes' === elementSettings.jltma_gallery_slider_thumb_autoplay && elementSettings.jltma_gallery_slider_thumb_autoplay_speed ? elementSettings.jltma_gallery_slider_thumb_autoplay_speed.size : false,
1856        //                 stopOnHover: 'yes' === elementSettings.jltma_gallery_slider_thumb_pause_on_hover,
1857        //                 speed: elementSettings.jltma_gallery_slider_thumb_speed ? elementSettings.jltma_gallery_slider_thumb_speed.size : 500,
1858        //                 slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_mobile,
1859        //                 slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_mobile,
1860        //                 slidesPerGroup: elementSettings.carousel_slides_to_scroll_mobile,
1861        //                 resistance: elementSettings.carousel_resistance ? elementSettings.carousel_resistance.size : 0.15,
1862        //                 spaceBetween: elementSettings.carousel_spacing_mobile ? elementSettings.carousel_spacing_mobile.size : 0,
1863        //                 breakpoints: {
1864        //                     tablet: {
1865        //                         slidesPerView: elementSettings.jltma_gallery_slider_thumb_items_tablet,
1866        //                         slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column_tablet,
1867        //                         slidesPerGroup: elementSettings.carousel_slides_to_scroll_tablet,
1868        //                         spaceBetween: elementSettings.carousel_spacing_tablet ? elementSettings.carousel_spacing_tablet.size : 0,
1869        //                     },
1870        //                     desktop: {
1871        //                         slidesPerView: elementSettings.jltma_gallery_slider_thumb_items,
1872        //                         slidesPerColumn: 'vertical' === elementSettings.carousel_orientation ? 1 : elementSettings.carousel_slides_per_column,
1873        //                         slidesPerGroup: elementSettings.carousel_slides_to_scroll,
1874        //                         spaceBetween: elementSettings.carousel_spacing ? elementSettings.carousel_spacing.size : 0,
1875        //                     },
1876        //                 },
1877        //             },
1878        //             default: {
1879        //                 effect: 'slide',
1880        //                 slidesPerView: 1,
1881        //                 slidesPerGroup: 1,
1882        //                 slidesPerColumn: 1,
1883        //                 spaceBetween: 6,
1884        //                 breakpoints: {
1885        //                     tablet: {
1886        //                         slidesPerView: 2,
1887        //                         slidesPerGroup: 1,
1888        //                         slidesPerColumn: 2,
1889        //                         spaceBetween: 12,
1890        //                     },
1891        //                     desktop: {
1892        //                         slidesPerView: 3,
1893        //                         slidesPerGroup: 1,
1894        //                         slidesPerColumn: 3,
1895        //                         spaceBetween: 24,
1896        //                     },
1897        //                 },
1898        //             },
1899        //         };
1900        //     }
1901
1902        //     Master_Addons.MA_Gallery_Slider.init = function () {
1903        //         if ($swiperSlider.length) {
1904        //             swiperSlider = Master_Addons.MA_Carousel($swiperSlider, sliderSettings);
1905        //             console.log('Swiper Slider Initialized:', swiperSlider);
1906        //         }
1907        //         if (hasCarousel && $swiperCarousel.length) {
1908        //             swiperCarousel = Master_Addons.MA_Carousel($swiperCarousel, carouselSettings);
1909        //             console.log('Swiper Carousel Initialized:', swiperCarousel);
1910        //         }
1911        //         alert("slider ready");
1912        //         Master_Addons.MA_Gallery_Slider.events();
1913        //         Master_Addons.MA_Gallery_Slider.onSlideChange();
1914        //     };
1915
1916        //     Master_Addons.MA_Gallery_Slider.events = function () {
1917        //         alert("slider events");
1918        //         if (swiperSlider) {
1919        //             swiperSlider.on('slideChange', Master_Addons.MA_Gallery_Slider.onSlideChange);
1920        //         }
1921        //         if (hasCarousel && swiperCarousel) {
1922        //             swiperCarousel.on('slideChange', Master_Addons.MA_Gallery_Slider.onSlideChange);
1923        //         }
1924        //         $thumbs.on('click', Master_Addons.MA_Gallery_Slider.onThumbClicked);
1925        //     };
1926
1927        //     // Master_Addons.MA_Gallery_Slider.onSlideChange = function () {
1928        //     //     if (hasCarousel && swiperCarousel) {
1929        //     //         var activeIndex = sliderSettings.element.loop ? swiperCarousel.realIndex : swiperCarousel.activeIndex;
1930        //     //         swiperCarousel.slideTo(activeIndex, 500, true);
1931        //     //     } else if (swiperSlider) {
1932        //     //         var activeIndex = sliderSettings.element.loop ? swiperSlider.realIndex : swiperSlider.activeIndex;
1933        //     //         swiperSlider.slideTo(activeIndex, 500, false);
1934        //     //     }
1935
1936        //     //     $thumbs.removeClass('is--active');
1937        //     //     $thumbs.eq(activeIndex).addClass('is--active');
1938        //     // };
1939        //     Master_Addons.MA_Gallery_Slider.onSlideChange = function () {
1940        //         alert("slider change");
1941        //         if (hasCarousel && swiperCarousel) {
1942        //             var activeIndex = sliderSettings.element.loop ? swiperCarousel.realIndex : swiperCarousel.activeIndex;
1943        //             swiperCarousel.slideTo(activeIndex, 500, true);
1944        //         } else if (swiperSlider) {
1945        //             var activeIndex = sliderSettings.element.loop ? swiperSlider.realIndex : swiperSlider.activeIndex;
1946        //             swiperSlider.slideTo(activeIndex, 500, false);
1947        //         }
1948
1949        //         $thumbs.removeClass('is--active');
1950        //         $thumbs.eq(activeIndex).addClass('is--active');
1951        //     };
1952
1953        //     Master_Addons.MA_Gallery_Slider.onThumbClicked = function (event) {
1954        //         event.preventDefault();
1955        //         if (swiperSlider) {
1956        //             var offset = sliderSettings.element.loop ? 1 : 0;
1957        //             swiperSlider.slideTo($(this).index() + offset, 500, true);
1958        //         }
1959        //     };
1960
1961        //     Master_Addons.onElementRemove($scope, function () {
1962        //         $scope.find('.swiper').each(function () {
1963        //             if ($(this).data('swiper')) {
1964        //                 $(this).data('swiper').destroy();
1965        //             }
1966        //         });
1967        //     });
1968
1969        //     $(document).ready(function () {
1970        //         Master_Addons.MA_Gallery_Slider.init();
1971        //     });
1972        // },
1973
1974        // On Remove Event
1975        onElementRemove: function ($element, callback)
1976        {
1977            if (elementorFrontend.isEditMode())
1978            {
1979                // Make sure it is destroyed when element is removed in editor mode
1980                elementor.channels.data.on('element:before:remove', function (model)
1981                {
1982                    if ($element.data('id') === model.id)
1983                    {
1984                        callback();
1985                    }
1986                });
1987            }
1988        },
1989
1990        //Master Addons: Timeline
1991        MA_Timeline: function ($scope, $)
1992        {
1993
1994            var elementSettings = getElementSettings($scope),
1995                $timeline = $scope.find('.jltma-timeline'),
1996                $swiperSlider = $scope.find('.jltma-timeline-slider'),
1997                $timeline_type = elementSettings.ma_el_timeline_type,
1998                $timeline_layout = elementSettings.ma_el_timeline_design_type,
1999                swiperSlider = null,
2000                timelineArgs = {},
2001                hasCarousel = $swiperSlider.length,
2002                $uniqueId = getUniqueLoopScopeId($scope);
2002
2003
2004            if ($timeline_layout === 'horizontal')
2005            {
2006
2007                var $carousel = $scope.find('.jltma-timeline-carousel-slider');
2008
2009                if (!$carousel.length)
2010                {
2011                    return;
2012                }
2013
2014                var $carouselContainer = $scope.find('.swiper'),
2015                    $settings = $carousel.data('settings'),
2016                    Swiper = elementorFrontend.utils.swiper;
2017
2018                initSwiper();
2019
2020                async function initSwiper()
2021                {
2022                    var swiper = await new Swiper($carouselContainer, $settings);
2023                    if ($settings.pauseOnHover)
2024                    {
2025                        $($carouselContainer).hover(function ()
2026                        {
2027                            (this).swiper.autoplay.stop();
2028                        }, function ()
2029                        {
2030                            (this).swiper.autoplay.start();
2031                        });
2032                    }
2033                };
2034            }
2035
2036
2037            if ($timeline_layout === 'vertical' || $timeline_type === "post")
2038            {
2039                var $timeline = $scope.find('.jltma-timeline'),
2040                    timelineArgs = {};
2041
2042                Master_Addons.MA_Timeline.init = function ()
2043                {
2044                    if (elementorFrontend.isEditMode())
2045                    {
2046                        timelineArgs.scope = window.elementor.$previewContents;
2047                    }
2048
2049                    if ('undefined' !== typeof elementSettings.line_location && elementSettings.line_location.size)
2050                    {
2051                        timelineArgs.lineLocation = elementSettings.line_location.size;
2052                    }
2053                    $timeline.maTimeline(timelineArgs);
2054                };
2055                Master_Addons.MA_Timeline.init();
2056            }
2057
2058        },
2059
2060
2061        //Master Addons: News Ticker
2062        MA_NewsTicker: function ($scope, $)
2063        {
2064
2065            try
2066            {
2067                (function ($)
2068                {
2069                    $(window).load(function (e)
2070                    {
2071
2072                        var newsTickerWrapper = $scope.find(".jltma-news-ticker"),
2073                            tickerType = newsTickerWrapper.data('tickertype'),
2074                            tickerid = newsTickerWrapper.data('tickerid'),
2075                            feedUrl = newsTickerWrapper.data('feedurl'),
2076                            feedAnimation = newsTickerWrapper.data('feedanimation'),
2077                            limitPosts = newsTickerWrapper.data('limitposts'),
2078                            tickerStyleEffect = newsTickerWrapper.data('scroll'),
2079                            autoplay = newsTickerWrapper.data('autoplay'),
2080                            timer = newsTickerWrapper.data('timer');
2081
2082                        if (tickerType === "content")
2083                        {
2084
2085                            $("#" + tickerid + "").breakingNews({
2086                                effect: "" + tickerStyleEffect + "",
2087                                autoplay: autoplay,
2088                                timer: timer,
2089                                border: false,
2090                                feed: false,
2091                                feedlabels: false
2092                            });
2093                        }
2094
2095                        if (tickerType === "feed")
2096                        {
2097
2098                            jQuery(function ($)
2099                            {
2100
2101                                var feed_container = $("#" + tickerid + ' .jltma-ticker-content-inner');
2102
2103                                $(feed_container).rss(feedUrl,
2104                                    {
2105                                        // how many entries do you want?
2106                                        // default: 4
2107                                        // valid values: any integer
2108                                        limit: limitPosts,
2109
2110                                        // want to offset results being displayed?
2111                                        // default: false
2112                                        // valid values: any integer
2113                                        offsetStart: false, // offset start point
2114                                        offsetEnd: false, // offset end point
2115
2116                                        // will request the API via https
2117                                        // default: false
2118                                        // valid values: false, true
2119                                        ssl: true,
2120
2121
2122                                        // which server should be requested for feed parsing
2123                                        // the server implementation is here: https://github.com/sdepold/feedr
2124                                        // default: feedrapp.info
2125                                        // valid values: any string
2126                                        // host: 'my-own-feedr-instance.com',
2127
2128
2129                                        // option to seldomly render ads
2130                                        // ads help covering the costs for the feedrapp server hosting and future improvements
2131                                        // default: true
2132                                        // valid values: false, true
2133                                        support: false,
2134
2135
2136                                        // formats the date with moment.js (optional)
2137                                        // default: 'dddd MMM Do'
2138                                        // valid values: see http://momentjs.com/docs/#/displaying/
2139                                        dateFormat: 'MMMM Do, YYYY',
2140
2141
2142                                        // localizes the date with moment.js (optional)
2143                                        // default: 'en'
2144                                        dateLocale: 'de',
2145
2146
2147                                        // outer template for the html transformation
2148                                        // default: "<ul>{entries}</ul>"
2149                                        // valid values: any string
2150
2151
2152                                        layoutTemplate: '<ul class="jltma-ticker-content-items">{entries}</ul>',
2153
2154                                        // inner template for each entry
2155                                        // default: '<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>'
2156                                        // valid values: any string
2157                                        // entryTemplate: '<p>{title}</p>',
2158                                        // entryTemplate: '<li><a href="{url}">[{author}@{date}] {title}</a>{teaserImage}{shortBodyPlain}</li>'
2159                                        entryTemplate: '<li> {teaserImage} <a href="{url}"> {title}</a></li>',
2160
2161                                        // the effect, which is used to let the entries appear
2162                                        // default: 'show'
2163                                        // valid values: 'show', 'slide', 'slideFast', 'slideSynced', 'slideFastSynced'
2164                                        effect: feedAnimation,
2165
2166                                    }, function ()
2167                                {
2168
2169                                    $("#" + tickerid + "").breakingNews({
2170                                        effect: "" + tickerStyleEffect + "",
2171                                        autoplay: autoplay,
2172                                        timer: timer
2173                                    });
2174                                })
2175                            });
2176
2177                        }
2178
2179                    }); // End of Window load
2180
2181                })(jQuery);
2182            } catch (e)
2183            {
2184                //We can also throw from try block and catch it here
2185                // No Error Show
2186            }
2187
2188
2189        },
2190
2191
2192        /*
2193         * Master Addons: MA Blog Posts
2194         */
2195
2196        MA_Blog: function ($scope, $)
2197        {
2198            var elementSettings = getElementSettings($scope),
2199                uniqueId = getUniqueLoopScopeId($scope),
2200                scopeId = $scope.data('id'),
2201                $swiper = $scope.find('.jltma-swiper__container'),
2202                $thumbs = $scope.find('.jltma-grid__item'),
2203                blogElement = $scope.find(".jltma-blog-wrapper"),
2204                colsNumber = blogElement.data("col"),
2205                carousel = blogElement.data("carousel"),
2206                grid = blogElement.data("grid");
2207
2208            $scope.find(".jltma-blog-cats-container li a").click(function (e)
2209            {
2210                e.preventDefault();
2211
2212                $scope
2213                    .find(".jltma-blog-cats-container li .active")
2214                    .removeClass("active");
2215
2216                $(this).addClass("active");
2217
2218                var selector = $(this).attr("data-filter");
2219
2220                blogElement.isotope({ filter: selector });
2221
2222                return false;
2223            });
2224
2225            var masonryBlog = blogElement.hasClass("jltma-blog-masonry");
2226
2227            if (masonryBlog && !carousel)
2228            {
2229                blogElement.imagesLoaded(function ()
2230                {
2231                    blogElement.isotope({
2232                        itemSelector: ".jltma-post-outer-container",
2233                        percentPosition: true,
2234                        animationOptions: {
2235                            duration: 750,
2236                            easing: "linear",
2237                            queue: false
2238                        }
2239                    });
2240                });
2241            }
2242
2243
2244            // Carousel
2245            var $carousel = $scope.find('.jltma-blog-carousel-slider');
2246
2247            if (!$carousel.length)
2248            {
2249                return;
2250            }
2251
2252            var $carouselContainer = $scope.find('.swiper'),
2253                $settings = $carousel.data('settings'),
2254                Swiper = elementorFrontend.utils.swiper;
2255
2256            initSwiper();
2257
2258            async function initSwiper()
2259            {
2260                var swiper = await new Swiper($carouselContainer, $settings);
2261                if ($settings.pauseOnHover)
2262                {
2263                    $($carouselContainer).hover(function ()
2264                    {
2265                        (this).swiper.autoplay.stop();
2266                    }, function ()
2267                    {
2268                        (this).swiper.autoplay.start();
2269                    });
2270                }
2271            };
2272
2273        },
2274
2275
2276        /**** MA Image Carousel ****/
2277        MA_Image_Carousel: function ($scope, $)
2278        {
2279
2280            var $carousel = $scope.find('.jltma-image-carousel-slider');
2281
2282            if (!$carousel.length)
2283            {
2284                return;
2285            }
2286
2287            var $carouselContainer = $scope.find('.swiper'),
2288                $settings = $carousel.data('settings'),
2289                Swiper = elementorFrontend.utils.swiper;
2290
2291            initSwiper();
2292
2293            async function initSwiper()
2294            {
2295                var swiper = await new Swiper($carouselContainer, $settings);
2296                if ($settings.pauseOnHover)
2297                {
2298                    $($carouselContainer).hover(function ()
2299                    {
2300                        (this).swiper.autoplay.stop();
2301                    }, function ()
2302                    {
2303                        (this).swiper.autoplay.start();
2304                    });
2305                }
2306            };
2307        },
2308
2309        /**** MA Logo Slider ****/
2310        MA_Logo_Slider: function ($scope, $)
2311        {
2312
2313            var $carousel = $scope.find('.jltma-logo-carousel-slider');
2314
2315            if (!$carousel.length)
2316            {
2317                return;
2318            }
2319
2320            var $carouselContainer = $scope.find('.swiper'),
2321                $settings = $carousel.data('settings'),
2322                Swiper = elementorFrontend.utils.swiper;
2323
2324            initSwiper();
2325
2326            async function initSwiper()
2327            {
2328                var swiper = await new Swiper($carouselContainer, $settings);
2329                if ($settings.pauseOnHover)
2330                {
2331                    $($carouselContainer).hover(function ()
2332                    {
2333                        (this).swiper.autoplay.stop();
2334                    }, function ()
2335                    {
2336                        (this).swiper.autoplay.start();
2337                    });
2338                }
2339            };
2340
2341
2342            /**
2343             * Icon click for hover
2344             */
2345            $carousel.find('.jltma-logo-slider-figure').on('click', '.item-hover-icon', function ()
2346            {
2347                var $this = $(this);
2348                $this.toggleClass('hide');
2349                $this.siblings('.jltma-hover-click').toggleClass('show');
2350            });
2351
2352            /**
2353             * Tooltip jS
2354             */
2355            var $tooltipSelector = $carousel.find('.jltma-logo-slider-item');
2356            $tooltipSelector.each(function (e)
2357            {
2358                var $currentTooltip = $(this).attr('id');
2359                if ($currentTooltip)
2360                {
2361                    var $dataId = $(this).data('id');
2362                    var $tooltipSettings = $(this).data('tooltip-settings');
2363                    var selector = '#' + $currentTooltip;
2364                    var $follow_cursor = $tooltipSettings.follow_cursor;
2365                    var placement_cursor;
2366                    if ($follow_cursor == 1)
2367                    {
2368                        placement_cursor = {
2369                            followCursor: true,
2370                        };
2371                    } else
2372                    {
2373                        placement_cursor = {
2374                            placement: $tooltipSettings.placement,
2375                            followCursor: false,
2376                        };
2377                    }
2378
2379
2380                    var arrowType = false;
2381                    if ($tooltipSettings.arrow == 1)
2382                    {
2383                        if ($tooltipSettings.arrow_type == 'round')
2384                        {
2385                            arrowType = tippy.roundArrow;
2386                        } else
2387                        {
2388                            arrowType = true;
2389                        }
2390                    }
2391
2392                    tippy(selector, {
2393                        content: $tooltipSettings.text,
2394                        ...placement_cursor,
2395                        animation: $tooltipSettings.animation,
2396                        arrow: arrowType,
2397                        duration: $tooltipSettings.duration,
2398                        delay: $tooltipSettings.delay,
2399                        trigger: $tooltipSettings.trigger, // mouseenter,click, manual
2400                        // flipOnUpdate: true,
2401                        // interactive: true,
2402                        offset: [$tooltipSettings.x_offset, $tooltipSettings.y_offset],
2403                        zIndex: 999999,
2404                        allowHTML: false,
2405                        theme: 'jltma-tippy-' + $dataId,
2406                        onShow(instance)
2407                        {
2408                            var tippyPopper = instance.popper;
2409                            $(tippyPopper).addClass($dataId);
2410                        }
2411                    });
2412                }
2413            });
2414        },
2415
2416
2417
2418        /**** MA Team Slider ****/
2419        MA_TeamSlider: function ($scope, $)
2420        {
2421
2422            var elementSettings = getElementSettings($scope),
2423                uniqueId = getUniqueLoopScopeId($scope),
2424                scopeId = $scope.data('id'),
2425                $teamCarouselWrapper = $scope.find('.jltma-team-carousel-wrapper').eq(0),
2426                $team_preset = $teamCarouselWrapper.data("team-preset"),
2427                $ma_el_team_circle_image_animation = $teamCarouselWrapper.data("ma_el_team_circle_image_animation");
2428
2429            if ($team_preset == "-content-drawer")
2430            {
2431
2432                try
2433                {
2434                    (function ($)
2435                    {
2436
2437                        $('.gridder').gridderExpander({
2438                            scroll: false,
2439                            scrollOffset: 0,
2440                            scrollTo: "panel",                  // panel or listitem
2441                            animationSpeed: 400,
2442                            animationEasing: "easeInOutExpo",
2443                            showNav: true, // Show Navigation
2444                            nextText: "<span></span>", // Next button text
2445                            prevText: "<span></span>", // Previous button text
2446                            closeText: "", // Close button text
2447                            onStart: function ()
2448                            {
2449                                //Gridder Inititialized
2450                            },
2451                            onContent: function ()
2452                            {
2453                                //Gridder Content Loaded
2454                            },
2455                            onClosed: function ()
2456                            {
2457                                //Gridder Closed
2458                            }
2459                        });
2460
2461                    })(jQuery);
2462                } catch (e)
2463                {
2464                    //We can also throw from try block and catch it here
2465                    // No Error Show
2466                }
2467
2468
2469            } else {
2470
2471                var $carousel = $scope.find('.jltma-team-carousel-slider');
2472
2473                if (!$carousel.length)
2474                {
2475                    return;
2476                }
2477
2478                var $carouselContainer = $scope.find('.swiper'),
2479                    $settings = $carousel.data('settings'),
2480                    Swiper = elementorFrontend.utils.swiper;
2481
2482                initSwiper();
2483
2484                async function initSwiper()
2485                {
2486                    var swiper = await new Swiper($carouselContainer, $settings);
2487                    if ($settings.pauseOnHover)
2488                    {
2489                        $($carouselContainer).hover(function ()
2490                        {
2491                            (this).swiper.autoplay.stop();
2492                        }, function ()
2493                        {
2494                            (this).swiper.autoplay.start();
2495                        });
2496                    }
2497                };
2498            }
2499
2500            // else if ($team_preset == "-circle-animation"){
2501            //     if($ma_el_team_circle_image_animation == "animation_svg_04"){
2502            //
2503            //     }
2504            // }
2505
2506        },
2507
2508        /**** MA Advanced Image ****/
2509        MA_Advanced_Image: function ($scope, $)
2510        {
2511
2512            Master_Addons.MA_Advanced_Image.elementSettings = getElementSettings($scope);
2513
2514            $scope.find('.jltma-img-dynamic-dropshadow').each(function ()
2515            {
2516
2517                var imgFrame, clonedImg, img;
2518
2519                if (this instanceof jQuery)
2520                {
2521                    if (this && this[0])
2522                    {
2523                        img = this[0];
2524                    } else
2525                    {
2526                        return;
2527                    }
2528                } else
2529                {
2530                    img = this;
2531                }
2532
2533                if (!img.classList.contains('jltma-img-has-shadow'))
2534                {
2535                    imgFrame = document.createElement('div');
2536                    clonedImg = img.cloneNode();
2537
2538                    clonedImg.classList.add('jltma-img-dynamic-dropshadow-cloned');
2539                    clonedImg.classList.remove('jltma-img-dynamic-dropshadow');
2540                    img.classList.add('jltma-img-has-shadow');
2541                    imgFrame.classList.add('jltma-img-dynamic-dropshadow-frame');
2542
2543                    img.parentNode.appendChild(imgFrame);
2544                    imgFrame.appendChild(img);
2545                    imgFrame.appendChild(clonedImg);
2546                }
2547            });
2548
2549            //Tilt Effect
2550            $scope.find('.jltma-tilt-box').tilt({
2551                maxTilt: $(this).data('max-tilt'),
2552                easing: 'cubic-bezier(0.23, 1, 0.32, 1)',
2553                speed: $(this).data('time'),
2554                perspective: 2000
2555            });
2556        },
2557
2558        /* MA Tooltip */
2559        MA_Tooltip: function ($scope, $)
2560        {
2561            var elementSettings = getElementSettings($scope),
2562                scopeId = $scope.data('id'),
2563                $currentTooltip = '#jltma-tooltip-' + scopeId,
2564                $jltma_el_tooltip_text = elementSettings.ma_el_tooltip_text ? stripTags(elementSettings.ma_el_tooltip_text) : 'This is the tooltip text',
2565                $jltma_el_tooltip_direction = elementSettings.jltma_tooltip_follow_cursor ? elementSettings.jltma_tooltip_follow_cursor : elementSettings.ma_el_tooltip_direction,
2566                $jltma_tooltip_animation = elementSettings.jltma_tooltip_animation ? elementSettings.jltma_tooltip_animation : '',
2567                $jltma_tooltip_arrow = elementSettings.jltma_tooltip_arrow ? elementSettings.jltma_tooltip_arrow : true,
2568                $jltma_tooltip_duration = elementSettings.jltma_tooltip_duration ? elementSettings.jltma_tooltip_duration : 300,
2569                $jltma_tooltip_delay = elementSettings.jltma_tooltip_delay ? elementSettings.jltma_tooltip_delay : 300,
2570                $jltma_el_tooltip_text_width = elementSettings.ma_el_tooltip_text_width ? elementSettings.ma_el_tooltip_text_width : '200px',
2571                $jltma_tooltip_arrow_type = elementSettings.jltma_tooltip_arrow_type ? elementSettings.jltma_tooltip_arrow_type : 'sharp',
2572                $jltma_tooltip_distance = elementSettings.jltma_tooltip_distance ? elementSettings.jltma_tooltip_distance : 10,
2573                $jltma_tooltip_trigger = elementSettings.jltma_tooltip_trigger ? elementSettings.jltma_tooltip_trigger : 'mouseenter',
2574                $animateFill = elementSettings.jltma_tooltip_animation == "fill" ? true : false;
2575
2576            var $ma_tooltip = $scope.find('.jltma-tooltip');
2577
2578            if (!$ma_tooltip.length)
2579            {
2580                return;
2581            }
2582
2583            var tooltipConfig = {
2584                content: $jltma_el_tooltip_text,
2585                animation: $jltma_tooltip_animation,
2586                arrow: $jltma_tooltip_arrow,
2587                arrowType: $jltma_tooltip_arrow_type,
2588                duration: $jltma_tooltip_duration,
2589                distance: $jltma_tooltip_distance,
2590                delay: $jltma_tooltip_delay,
2591                size: $jltma_el_tooltip_text_width,
2592                trigger: $jltma_tooltip_trigger,
2593                animateFill: $animateFill,
2594                flipOnUpdate: true,
2595                maxWidth: $jltma_el_tooltip_text_width,
2596                zIndex: 999,
2597                allowHTML: false,
2598                theme: 'jltma-image-filter-tippy-' + scopeId,
2599                interactive: true,
2600                appendTo: 'parent',
2601                onShow(instance) {
2602                    var tippyPopper = instance.popper;
2603                    jQuery(tippyPopper).attr('data-tippy-popper-id', scopeId);
2604                }
2605            };
2606            if ($jltma_el_tooltip_direction === "yes") {
2607                tooltipConfig.followCursor = true;  // Use followCursor if "yes"
2608            } else {
2609                tooltipConfig.placement = $jltma_el_tooltip_direction;  // Use placement if it's not "yes"
2610            }
2611
2612            // Initialize Tippy with the dynamic configuration
2613            tippy($currentTooltip, tooltipConfig);
2614        },
2615
2616        /**** MA Twitter Slider ****/
2617
2618        MA_Twitter_Slider: function ($scope, $)
2619        {
2620
2621            var $carousel = $scope.find('.jltma-twitter-carousel-slider');
2622
2623            if (!$carousel.length)
2624            {
2625                return;
2626            }
2627
2628            var $carouselContainer = $scope.find('.swiper'),
2629                $settings = $carousel.data('settings'),
2630                Swiper = elementorFrontend.utils.swiper;
2631
2632            initSwiper();
2633
2634            async function initSwiper()
2635            {
2636                var swiper = await new Swiper($carouselContainer, $settings);
2637                if ($settings.pauseOnHover)
2638                {
2639                    $($carouselContainer).hover(function ()
2640                    {
2641                        (this).swiper.autoplay.stop();
2642                    }, function ()
2643                    {
2644                        (this).swiper.autoplay.start();
2645                    });
2646                }
2647            };
2648
2649
2650        },
2651
2652
2653        MA_ParticlesBG: function ($scope, $)
2654        {
2655            // Helper function to check if we're in editor
2656            function isElementorEditor() {
2657                return typeof elementorFrontend !== 'undefined' && elementorFrontend.isEditMode();
2658            }
2659
2660            // Debug logging (remove in production)
2661            // console.log('MA_ParticlesBG called for element:', $scope.data('id'));
2662            // console.log('Is editor:', isElementorEditor());
2663            // console.log('Has particle class:', $scope.hasClass('jltma-particle-yes'));
2664            // console.log('Data attribute:', $scope.attr('data-jltma-particle'));
2665            // console.log('Wrapper editor data:', $scope.find('.jltma-particle-wrapper').attr('data-jltma-particles-editor'));
2666
2667            // Check if particles are enabled - either through class or data attribute or wrapper
2668            if ($scope.hasClass('jltma-particle-yes') || $scope.attr('data-jltma-particle') || $scope.find('.jltma-particle-wrapper').attr('data-jltma-particles-editor')) {
2669                
2670                let element_type = $scope.data('element_type');
2671                let sectionID = encodeURIComponent($scope.data('id'));
2672                let particlesJSON;
2673
2674                // Get particle JSON based on context (editor vs frontend)
2675                if (!isElementorEditor()) {
2676                    // Frontend - get from data attribute
2677                    particlesJSON = $scope.attr('data-jltma-particle');
2678                } else {
2679                    // Editor - get from wrapper data attribute
2680                    particlesJSON = $scope.find('.jltma-particle-wrapper').attr('data-jltma-particles-editor');
2681                }
2682
2683                if (('section' === element_type || 'column' === element_type || 'container' === element_type) && particlesJSON) {
2684                    
2685                    // Frontend
2686                    if (!isElementorEditor()) {
2687                        // Create wrapper for frontend
2688                        $scope.prepend('<div class="jltma-particle-wrapper" id="jltma-particle-' + sectionID + '"></div>');
2689                        
2690                        try {
2691                            let parsedData = JSON.parse(particlesJSON);
2692                            particlesJS('jltma-particle-' + sectionID, parsedData);
2693                            
2694                            // Dispatch resize events to ensure proper rendering
2695                            setTimeout(function() {
2696                                window.dispatchEvent(new Event('resize'));
2697                            }, 500);
2698                            
2699                            setTimeout(function() {
2700                                window.dispatchEvent(new Event('resize'));
2701                            }, 1500);
2702                        } catch(e) {
2703                            console.warn('Invalid particle JSON:', e);
2704                        }
2705                        
2706                    // Editor
2707                    } else {
2708                        if ($scope.hasClass('jltma-particle-yes')) {
2709                            try {
2710                                let parsedData = JSON.parse(particlesJSON);
2711                                particlesJS('jltma-particle-' + sectionID, parsedData);
2712                                
2713                                // Set z-index for columns in editor
2714                                $scope.find('.elementor-column').css('z-index', 9);
2715                                
2716                                setTimeout(function() {
2717                                    window.dispatchEvent(new Event('resize'));
2718                                }, 500);
2719                                
2720                                setTimeout(function() {
2721                                    window.dispatchEvent(new Event('resize'));
2722                                }, 1500);
2723                            } catch(e) {
2724                                console.warn('Invalid particle JSON:', e);
2725                            }
2726                        } else {
2727                            // Remove wrapper if particles are disabled
2728                            $scope.find('.jltma-particle-wrapper').remove();
2729                        }
2730                    }
2731                }
2732            }
2733        },
2734
2735        MA_BgSlider: function ($scope, $)
2736        {
2737            // Check if we're in Elementor editor mode
2738            function isElementorEditor() {
2739                return typeof elementorFrontend !== 'undefined' && elementorFrontend.isEditMode();
2740            }
2741
2742            // Check if this element has bg-slider enabled first
2743            if (!isElementorEditor()) {
2744                // Frontend: check for class (which is only added when bg slider is enabled and has images)
2745                if (!$scope.hasClass('has_ma_el_bg_slider')) {
2746                    return; // No bg slider configured or enabled
2747                }
2748            } else {
2749                // Editor: check for template elements (template only shows when enabled)
2750                if (!$scope.find('.ma-el-section-bs').length) {
2751                    return; // No bg slider template or not enabled
2752                }
2753            }
2754
2755            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;
2756            var slider_images;
2757
2758            // Get slider data based on editor vs frontend
2759            if (!isElementorEditor()) {
2760                // Frontend: use data from _before_render (on main element)
2761                slider_images = $scope.attr('data-ma-el-bg-slider-images');
2762            } else {
2763                // Editor: use data from _print_template (on inner wrapper)
2764                var slider_wrapper = $scope.find('.ma-el-section-bs-inner');
2765                if (slider_wrapper.length) {
2766                    slider_images = slider_wrapper.attr('data-ma-el-bg-slider');
2767                }
2768            }
2769
2770            if (!slider_images) {
2771                return; // No slider data available
2772            }
2773
2774            // Get configuration data based on context
2775            if (!isElementorEditor()) {
2776                // Frontend: read from main element
2777                ma_el_transition = $scope.attr('data-ma-el-bg-slider-transition');
2778                ma_el_animation = $scope.attr('data-ma-el-bg-slider-animation');
2779                ma_el_custom_overlay = $scope.attr('data-ma-el-bg-custom-overlay');
2780                ma_el_cover = $scope.attr('data-ma-el-bg-slider-cover');
2781                ma_el_delay = $scope.attr('data-ma-el-bs-slider-delay');
2782                ma_el_timer = $scope.attr('data-ma-el-bs-slider-timer');
2783                
2784                if (ma_el_custom_overlay == 'yes') {
2785                    ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/00.png';
2786                } else {
2787                    var overlay_file = $scope.attr('data-ma-el-bg-slider-overlay');
2788                    if (overlay_file) {
2789                        ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/' + overlay_file + '.png';
2790                    } else {
2791                        ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/00.png';
2792                    }
2793                }
2794            } else {
2795                // Editor: read from template wrapper
2796                var slider_wrapper = $scope.find('.ma-el-section-bs-inner');
2797                ma_el_transition = slider_wrapper.attr('data-ma-el-bg-slider-transition');
2798                ma_el_animation = slider_wrapper.attr('data-ma-el-bg-slider-animation');
2799                ma_el_custom_overlay = slider_wrapper.attr('data-ma-el-bg-custom-overlay');
2800                ma_el_cover = slider_wrapper.attr('data-ma-el-bg-slider-cover');
2801                ma_el_delay = slider_wrapper.attr('data-ma-el-bs-slider-delay');
2802                ma_el_timer = slider_wrapper.attr('data-ma-el-bs-slider-timer');
2803                
2804                if (ma_el_custom_overlay == 'yes') {
2805                    ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/00.png';
2806                } else {
2807                    var overlay_file = slider_wrapper.attr('data-ma-el-bg-slider-overlay');
2808                    if (overlay_file && overlay_file !== '00.png') {
2809                        ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/' + overlay_file;
2810                    } else {
2811                        ma_el_overlay = jltma_scripts.plugin_url + '/assets/vendor/vegas/overlays/00.png';
2812                    }
2813                }
2814            }
2815
2816            // Split images and create slides array
2817            ma_el_slides = slider_images.split(",");
2818
2819            jQuery.each(ma_el_slides, function (key, value) {
2820                var slide = [];
2821                slide.src = value;
2822                ma_el_slides_json.push(slide);
2823            });
2824
2825            // Create slider wrapper if it doesn't exist
2826            var slider_container;
2827            if (!$scope.find('.ma-el-section-bs').length) {
2828                $scope.prepend('<div class="ma-el-section-bs"><div class="ma-el-section-bs-inner"></div></div>');
2829            }
2830            slider_container = $scope.find('.ma-el-section-bs-inner');
2831
2832            slider_container.vegas({
2833                slides: ma_el_slides_json,
2834                transition: ma_el_transition,
2835                animation: ma_el_animation,
2836                overlay: ma_el_overlay,
2837                cover: ma_el_cover == 'true' ? true : false,
2838                delay: parseInt(ma_el_delay) || 5000,
2839                timer: ma_el_timer == 'true' ? true : false,
2840                init: function () {
2841                    if (ma_el_custom_overlay == 'yes') {
2842                        var ob_vegas_overlay = slider_container.children('.vegas-overlay');
2843                        ob_vegas_overlay.css('background-image', '');
2844                    }
2845                }
2846            });
2847        },
2848
2849        MA_AnimatedGradient: function ($scope, $)
2850        {
2851            
2852            if ($scope.hasClass('ma-el-animated-gradient-yes'))
2853            {
2854                let color = $scope.data('color') || $scope.attr('data-color');
2855                let angle = $scope.data('angle') || $scope.attr('data-angle');
2856                let duration = $scope.data('duration') || $scope.attr('data-duration') || '6s';
2857                
2858                
2859                if (!color || !angle) {
2860                    return;
2861                }
2862
2863                // Parse colors from the comma-separated string
2864                let colors = color.split(',');
2865                if (colors.length < 2) {
2866                    return;
2867                }
2868
2869                // Create animated gradient CSS with proper timing distribution
2870                let animationName = 'jltma-animated-gradient-' + Math.random().toString(36).substring(2, 11);
2871                let keyframes = `@keyframes ${animationName} {`;
2872                let totalSteps = colors.length;
2873                
2874                // Create keyframes with proper timing distribution
2875                for (let i = 0; i <= totalSteps; i++) {
2876                    let percentage = (i / totalSteps) * 100;
2877                    let currentColorIndex = i % colors.length;
2878                    let nextColorIndex = (i + 1) % colors.length;
2879                    
2880                    // Create smooth transition between current and next color
2881                    keyframes += `${percentage}% { background: linear-gradient(${angle}, ${colors[currentColorIndex].trim()}, ${colors[nextColorIndex].trim()}); }`;
2882                }
2883                
2884                keyframes += '}';
2885
2886                // Add keyframes to document
2887                let style = document.createElement('style');
2888                style.textContent = keyframes;
2889                document.head.appendChild(style);
2890
2891                // Apply the animation
2892                $scope.css({
2893                    'animation': `${animationName} ${duration} ease-in-out infinite`,
2894                    'background-size': '400% 400%'
2895                });
2896
2897                // For editor mode - handle the .animated-gradient div
2898                if ($scope.hasClass('elementor-element-edit-mode'))
2899                {
2900                    let editorGradient = $scope.find('.animated-gradient');
2901                    if (editorGradient.length > 0) {
2902                        let editorColor = editorGradient.data('color') || editorGradient.attr('data-color');
2903                        let editorAngle = editorGradient.data('angle') || editorGradient.attr('data-angle');
2904                        let editorDuration = editorGradient.data('duration') || editorGradient.attr('data-duration') || '6s';
2905                        
2906                        if (editorColor && editorAngle) {
2907                            let editorColors = editorColor.split(',');
2908                            if (editorColors.length >= 2) {
2909                                let editorAnimationName = 'jltma-animated-gradient-editor-' + Math.random().toString(36).substring(2, 11);
2910                                let editorKeyframes = `@keyframes ${editorAnimationName} {`;
2911                                let totalSteps = editorColors.length;
2912                                
2913                                // Create keyframes with proper timing distribution
2914                                for (let i = 0; i <= totalSteps; i++) {
2915                                    let percentage = (i / totalSteps) * 100;
2916                                    let currentColorIndex = i % editorColors.length;
2917                                    let nextColorIndex = (i + 1) % editorColors.length;
2918                                    
2919                                    // Create smooth transition between current and next color
2920                                    editorKeyframes += `${percentage}% { background: linear-gradient(${editorAngle}, ${editorColors[currentColorIndex].trim()}, ${editorColors[nextColorIndex].trim()}); }`;
2921                                }
2922                                
2923                                editorKeyframes += '}';
2924                                
2925                                let editorStyle = document.createElement('style');
2926                                editorStyle.textContent = editorKeyframes;
2927                                document.head.appendChild(editorStyle);
2928
2929                                editorGradient.css({
2930                                    'animation': `${editorAnimationName} ${editorDuration} ease-in-out infinite`,
2931                                    'background-size': '400% 400%'
2932                                });
2933                            }
2934                        }
2935                    }
2936                }
2937            }
2938
2939        },
2940
2941
2942        MA_Image_Comparison: function ($scope, $)
2943        {
2944            var $jltma_image_comp_wrap = $scope.find('.jltma-image-comparison').eq(0),
2945                $jltma_image_data = $jltma_image_comp_wrap.data('image-comparison-settings');
2946
2947            $jltma_image_comp_wrap.twentytwenty({
2948                default_offset_pct: $jltma_image_data.visible_ratio,
2949                orientation: $jltma_image_data.orientation,
2950                before_label: $jltma_image_data.before_label,
2951                after_label: $jltma_image_data.after_label,
2952                move_slider_on_hover: $jltma_image_data.slider_on_hover,
2953                move_with_handle_only: $jltma_image_data.slider_with_handle,
2954                click_to_move: $jltma_image_data.slider_with_click,
2955                no_overlay: $jltma_image_data.no_overlay
2956            });
2957        },
2958
2959        MA_BarCharts: function BarChart($scope) {
2960            jltMAObserveTarget($scope[0], function () {
2961                var $container = $scope.find('.jltma-bar-chart-container'),
2962                    $chart_canvas = $scope.find('#jltma-bar-chart'),
2963                    settings = $container.data('settings');
2964                if ($container.length) {
2965                    new Chart($chart_canvas, settings);
2966                }
2967            });
2968        },
2969
2970        MA_PieCharts: function ($scope, $)
2971        {
2972            jltMAObserveTarget($scope[0], function () {
2973                $scope.find('.ma-el-piechart .ma-el-percentage').each(function () {
2974                    var track_color = $(this).data('track-color');
2975                    var bar_color = $(this).data('bar-color');
2976
2977                    $(this).easyPieChart({
2978                        animate: 2000,
2979                        lineWidth: 10,
2980                        barColor: bar_color,
2981                        trackColor: track_color,
2982                        scaleColor: false,
2983                        lineCap: 'square',
2984                        size: 220
2985                    });
2986                });
2987            });
2988        },
2989
2990        ProgressBars: function ($scope, $)
2991        {
2992            jltMAObserveTarget($scope[0], function () {
2993                $scope.find('.jltma-stats-bar-content').each(function () {
2994                    var dataperc = $(this).data('perc');
2995                    $(this).animate({ "width": dataperc + "%" }, dataperc * 20);
2996                });
2997            });
2998        },
2999
3000
3001        // Toggle Content
3002        MA_Toggle_Content: function ($scope, $)
3003        {
3004            Master_Addons.getElementSettings = getElementSettings($scope);
3005            var $wrapper = $scope.find('.jltma-toggle-content'),
3006                toggleElementArgs = {
3007                    active: Master_Addons.getElementSettings.jltma_toggle_content_active_index,
3008                };
3009
3010            if ('' !== Master_Addons.getElementSettings.jltma_toggle_content_indicator_color)
3011            {
3012                toggleElementArgs.indicatorColor = Master_Addons.getElementSettings.jltma_toggle_content_indicator_color;
3013            }
3014
3015            if (Master_Addons.getElementSettings.jltma_toggle_content_indicator_speed.size)
3016            {
3017                toggleElementArgs.speed = Master_Addons.getElementSettings.jltma_toggle_content_indicator_speed.size;
3018            }
3019
3020            if (elementorFrontend.isEditMode())
3021            {
3022                toggleElementArgs.watchControls = true;
3023            }
3024
3025            $wrapper.MA_ToggleElement(toggleElementArgs);
3026        },
3027
3028
3029        // Comment Form reCaptcha
3030        MA_Comment_Form_reCaptcha: function ($scope, $)
3031        {
3032            Master_Addons.getElementSettings = getElementSettings($scope);
3033            var $commentsWrapper = $scope.find(".jltma-comments-wrap"),
3034                $comments_recaptcha_data = $commentsWrapper.data("recaptcha"),
3035                $recaptcha_protected = $commentsWrapper.data("jltma-comment-settings"),
3036                jltma_comment_form;
3037
3038            if ($recaptcha_protected.reCaptchaprotected == "yes")
3039            {
3040                var onloadCallback = function ()
3041                {
3042                    jltma_comment_form = grecaptcha.render("jltma_comment_form", {
3043                        "sitekey": $comments_recaptcha_data.sitekey,
3044                        "theme": $comments_recaptcha_data.theme
3045                    });
3046                    grecaptcha.reset(jltma_comment_form);
3047                };
3048            }
3049
3050        },
3051
3052
3053        // Master Addons: Counter Up
3054        MA_Counter_Up: function ($scope, $)
3055        {
3056            var $counterup = $scope.find(".jltma-counter-up-number");
3057
3058            if ($.isFunction($.fn.counterUp))
3059            {
3060                $counterup.counterUp({
3061                    duration: 2000,
3062                    delay: 15,
3063
3064                });
3065            }
3066        },
3067
3068
3069        // Master Addons: Countdown Timer
3070        MA_CountdownTimer: function ($scope, $)
3071        {
3072
3073            var $countdownWidget = $scope.find(".jltma-widget-countdown");
3074            $.fn.MasterCountDownTimer = function ()
3075            {
3076                var $wrapper = $(this).find(".jltma-countdown-wrapper"),
3077                    data = {
3078                        year: $wrapper.data("countdown-year"),
3079                        month: $wrapper.data("countdown-month"),
3080                        day: $wrapper.data("countdown-day"),
3081                        hour: $wrapper.data("countdown-hour"),
3082                        min: $wrapper.data("countdown-min"),
3083                        sec: $wrapper.data("countdown-sec")
3084                    },
3085
3086                    targetDate = new Date(data.year, data.month, data.day, data.hour, data.min, data.sec);
3087                var $year = $wrapper.find('.jltma-countdown-year'),
3088                    $month = $wrapper.find('.jltma-countdown-month'),
3089                    $day = $wrapper.find('.jltma-countdown-day'),
3090                    $hour = $wrapper.find('.jltma-countdown-hour'),
3091                    $min = $wrapper.find('.jltma-countdown-min'),
3092                    $sec = $wrapper.find('.jltma-countdown-sec');
3093
3094                setInterval(function ()
3095                {
3096                    var diffTime = (Date.parse(targetDate) - Date.parse(new Date())) / 1000;
3097
3098                    if (diffTime < 0) return;
3099
3100                    $year.text(Math.floor(diffTime / (31536000))); // 1 year = 3153600 second
3101                    $month.text(Math.floor((diffTime / 2592000) % 12)); // 1 month = 2592000 second
3102                    $day.text(Math.floor((diffTime / 86400) % 365)); // 1 day = 86400 second
3103                    $hour.text(Math.floor((diffTime / 3600) % 24)); // 1 hour = 3600 second
3104                    $min.text(Math.floor((diffTime / 60) % 60)); // 1 min  = 60 second
3105                    $sec.text(Math.floor((diffTime) % 60));
3106                }, 1e3)
3107            }, $countdownWidget.each(function ()
3108            {
3109                $(this).MasterCountDownTimer()
3110            })
3111
3112
3113        },
3114
3115        /**
3116         * Fancybox popup
3117         */
3118        MA_Fancybox_Popup: function ($scope, $)
3119        {
3120            (function ($)
3121            {
3122                if ($.isFunction($.fn.fancybox))
3123                {
3124                    $("[data-fancybox]").fancybox({});
3125                }
3126            })(jQuery);
3127        },
3128
3129        /*
3130        * REVEAL
3131        */
3132        MA_Reveal: function ($scope, $)
3133        {
3134
3135            Master_Addons.MA_Reveal.elementSettings = getElementSettings($scope);
3136
3137            var rev1,
3138                isReveal = false;
3139
3140            Master_Addons.MA_Reveal.revealAction = function ()
3141            {
3142                rev1 = new RevealFx(revealistance, {
3143                    revealSettings: {
3144                        bgcolor: Master_Addons.MA_Reveal.elementSettings.reveal_bgcolor,
3145                        direction: Master_Addons.MA_Reveal.elementSettings.reveal_direction,
3146                        duration: Number(Master_Addons.MA_Reveal.elementSettings.reveal_speed.size) * 100,
3147                        delay: Number(Master_Addons.MA_Reveal.elementSettings.reveal_delay.size) * 100,
3148                        onCover: function (contentEl, revealerEl)
3149                        {
3150                            contentEl.style.opacity = 1;
3151                        }
3152                    }
3153                });
3154            }
3155
3156            Master_Addons.MA_Reveal.runReveal = function ()
3157            {
3158                rev1.reveal();
3159            }
3160
3161            if (Master_Addons.MA_Reveal.elementSettings.enabled_reveal)
3162            {
3163
3164                var revealId = '#reveal-' + $scope.data('id'),
3165                    revealistance = document.querySelector(revealId);
3166
3167                if (!jQuery(revealId).hasClass('block-revealer')) {
3168                    Master_Addons.MA_Reveal.revealAction();
3169                }
3170
3171                Master_Addons.MA_Reveal.waypointOptions = {
3172                    offset: '100%',
3173                    triggerOnce: true
3174                };
3175
3176                jltMAObserveTarget(revealistance, Master_Addons.MA_Reveal.runReveal, Master_Addons.MA_Reveal.waypointOptions);
3177            }
3178        },
3179
3180        /*
3181        * MA Rellax
3182        */
3183        MA_Rellax: function ($scope, $)
3184        {
3185
3186            var elementSettings = getElementSettings($scope);
3187            var rellax = null;
3188
3189            $(window).on('resize', function ()
3190            {
3191
3192                if (rellax)
3193                {
3194                    rellax.destroy();
3195                    if (rellax)
3196                        initRellax();
3197                }
3198            });
3199
3200            var initRellax = function ()
3201            {
3202                if (elementSettings.enabled_rellax)
3203                {
3204
3205                    currentDevice = elementorFrontend.getCurrentDeviceMode();
3206
3207                    var setting_speed = 'speed_rellax';
3208                    var value_speed = 0;
3209
3210                    if (currentDevice != 'desktop')
3211                    {
3212                        setting_speed = 'speed_rellax_' + currentDevice;
3213                    }
3214
3215                    if (eval('elementSettings.' + setting_speed + '.size'))
3216                        value_speed = eval('elementSettings.' + setting_speed + '.size');
3217
3218
3219                    var rellaxId = '#rellax-' + $scope.data('id');
3220
3221                    if ($(rellaxId).length)
3222                        rellax = new Rellax(rellaxId, {
3223                            speed: value_speed
3224                        }
3225                        );
3226                    isRellax = true;
3227                };
3228            };
3229
3230            initRellax();
3231
3232        },
3233
3234        MA_Rellax_Final: function (panel, model, view)
3235        {
3236            Master_Addons.getElementSettings = getElementSettings($scope);
3237            var $scope = view.$el;
3238            var scene = $scope.find('#scene');
3239        },
3240
3241
3242        // Entrance Animations
3243        MA_Entrance_Animation: function ($scope, $)
3244        {
3245
3246            $scope = $scope || $(this);
3247
3248            var $target = $scope.hasClass('jltma-appear-watch-animation') ? $scope : $scope.find('.jltma-appear-watch-animation'),
3249                hasAnimation = $('body').hasClass('jltma-page-animation');
3250
3251            if (!$target.length)
3252            {
3253                return;
3254            }
3255
3256            if (hasAnimation)
3257            {
3258                document.body.addEventListener('JltmaPageAnimationDone', function (event)
3259                {
3260                    $target.appearl({
3261                        offset: '200px',
3262                        insetOffset: '0px'
3263                    }).one('appear', function (event, data)
3264                    {
3265                        this.classList.add('jltma-animated');
3266                        this.classList.add('jltma-animated-once');
3267                    });
3268                });
3269            } else
3270            {
3271                $target.appearl({
3272                    offset: '200px',
3273                    insetOffset: '0px'
3274                }).one('appear', function (event, data)
3275                {
3276                    this.classList.add('jltma-animated');
3277                    this.classList.add('jltma-animated-once');
3278                });
3279            }
3280
3281        },
3282
3283
3284        // Wrapper Link
3285        MA_Wrapper_Link: function ($scope, $)
3286        {
3287            $('body').on('click.onWrapperLink', '[data-jltma-wrapper-link]', function(e) {
3288                var $wrapper = $(this),
3289                  data = $wrapper.data("jltma-wrapper-link"),
3290                  id = $wrapper.data("id"),
3291                  anchor = document.createElement("a"),
3292                  anchorReal,
3293                  timeout = 100;
3294                anchor.id = "master-addons-wrapper-link-" + id;
3295                anchor.href = data.url;
3296                anchor.target = data.is_external ? "_blank" : "_self";
3297                anchor.rel = data.nofollow ? "nofollow noreferer" : "";
3298                anchor.style.display = "none";
3299                document.body.appendChild(anchor);
3300                anchorReal = document.getElementById(anchor.id);
3301                anchorReal.click();
3302
3303                timeout = setTimeout(function () {
3304                    document.body.removeChild(anchorReal);
3305                    clearTimeout(timeout);
3306                });
3307            });
3308        },
3309
3310        /**
3311         * Restrict Content
3312         */
3313        MA_Restrict_Content_Ajax: function ($scope, $)
3314        {
3315
3316            Master_Addons.getElementSettings = getElementSettings($scope);
3317
3318            var $restrictwrapper = $scope.find('.jltma-restrict-content-wrap').eq(0),
3319                $scopeId = $scope.data('id'),
3320                $restrict_layout = $restrictwrapper.data('restrict-layout-type'),
3321                $restrict_type = $restrictwrapper.data('restrict-type'),
3322                $error_message = $restrictwrapper.data('error-message'),
3323                $rc_ajaxify = $restrictwrapper.data('rc-ajaxify'),
3324
3325                $storageID = 'ma_el_rc_' + $scopeId,
3326                $formID = $scope.find('.jltma-restrict-form').eq(0).data('form-id'),
3327
3328                // Content
3329                $content_div = '#restrict-content-' + $scopeId,
3330
3331                // Popup Settings
3332                $popup = $scope.find('.jltma-restrict-content-popup-content'),
3333                $content_pass = $restrictwrapper.data('content-pass') ? $restrictwrapper.data('content-pass') : '',
3334                $popup_type = $popup.data('popup-type') ? $popup.data('popup-type') : '',
3335
3336                // Restrict Age
3337                $age_wrapper = $scope.find('.jltma-restrict-age-wrapper').eq(0),
3338
3339                $restrict_age = {
3340                    min_age: $age_wrapper.data('min-age'),
3341                    age_type: $age_wrapper.data('age-type'),
3342                    age_title: $age_wrapper.data('age-title'),
3343                    age_content: $age_wrapper.data('age-content'),
3344                    age_submit: $('#' + $formID).find('button[name="submit"]').val(),
3345                    checkbox_msg: $age_wrapper.data('checkbox-msg') ? $age_wrapper.data('checkbox-msg') : "",
3346                    empty_bday: $age_wrapper.data('empty-bday') ? $age_wrapper.data('empty-bday') : "",
3347                    non_exist_bday: $age_wrapper.data('non-exist-bday') ? $age_wrapper.data('non-exist-bday') : ""
3348                };
3349
3350
3351            //Check it the user has been accpeted the agreement
3352            if (localStorage.getItem($storageID))
3353            {
3354
3355                $('.jltma-rc-button').addClass('d-none');
3356                $('#' + $formID).addClass('d-none');
3357                $('#jltma-restrict-age-' + $scopeId).removeClass('card');
3358                $('#jltma-restrict-age-' + $scopeId).removeClass('text-center');
3359                $('#restrict-content-' + $scopeId).addClass('d-block');
3360
3361            } else
3362            {
3363
3364                // Dom Selector for Onpage/Popup
3365                if ($restrict_layout == "popup")
3366                {
3367                    var dom_selector = '#jltma-rc-modal-' + $scopeId;
3368                } else
3369                {
3370                    var dom_selector = '#jltma-restrict-content-' + $scopeId;
3371                }
3372
3373                $(dom_selector).on('click', '.jltma_ra_select', function ()
3374                {
3375                    var wrap = $(this).closest('.jltma_ra_select_wrap');
3376                    if (!wrap.find('.jltma_ra_options').hasClass('jltma_ra_active'))
3377                    {
3378                        $('.jltma_ra_options').removeClass('jltma_ra_active');
3379                        wrap.find('.jltma_ra_options').addClass('jltma_ra_active');
3380                        wrap.find('.jltma_ra_options').find('li:contains("' + wrap.find('.jltma_ra_select_val').html() + '")').addClass('jltma_ra_active');
3381                    }
3382                    else
3383                    {
3384                        wrap.find('.jltma_ra_options').removeClass('jltma_ra_active');
3385                    }
3386                });
3387
3388                $(dom_selector).on('click', '.jltma_ra_options ul li', function ()
3389                {
3390                    var wrap = $(this).closest('.jltma_ra_select_wrap');
3391                    wrap.find('.jltma_ra_select_val').html($(this).html());
3392                    wrap.find('select').val($(this).attr('data-val'));
3393                    wrap.find('.jltma_ra_options').removeClass('jltma_ra_active');
3394                });
3395
3396                $(dom_selector).on('mouseover', '.jltma_ra_options ul li', function ()
3397                {
3398                    if ($('.jltma_ra_options ul li').hasClass('jltma_ra_active'))
3399                    {
3400                        $('.jltma_ra_options ul li').removeClass('jltma_ra_active');
3401                    }
3402                });
3403
3404                $(document).click(function (e)
3405                {
3406                    if ($(e.target).attr('class') != 'jltma_ra_select' && !$('.jltma_ra_select').find($(e.target)).length)
3407                    {
3408                        if ($('.jltma_ra_options.jltma_ra_active').length)
3409                        {
3410                            $('.jltma_ra_options').removeClass('jltma_ra_active');
3411                        }
3412                    }
3413                });
3414
3415
3416                //Onload Fancybox
3417                if ($popup_type == "windowload" || $popup_type == "windowloadfullscreen")
3418                {
3419                    $("#ma-el-rc-modal-hidden").fancybox().trigger('click');
3420                } else
3421                {
3422                    $("[data-fancybox]").fancybox({});
3423                }
3424
3425                $(dom_selector).on('submit', '#' + $formID, function (event)
3426                {
3427                    event.preventDefault();
3428
3429                    var form = $(this);
3430                    form.find('.jltma_rc_result').remove();
3431
3432                    $.ajax({
3433                        type: "POST",
3434                        url: jltma_scripts.ajaxurl,
3435                        data: {
3436                            action: 'jltma_restrict_content',
3437                            fields: form.serialize(),
3438                            restrict_type: $restrict_type,
3439                            error_message: $error_message,
3440                            content_pass: $content_pass,
3441                            restrict_age: $restrict_age
3442                        },
3443                        cache: false,
3444                        success: function (result)
3445                        {
3446
3447                            try
3448                            {
3449                                result = jQuery.parseJSON(result);
3450
3451                                if (result['result'] == 'success')
3452                                {
3453
3454                                    $('#restrict-content-' + $scopeId).removeClass('d-none').addClass('d-block');
3455
3456                                    //Custom Classes add/remove
3457                                    $('#' + $formID).addClass('d-none');
3458                                    $('#jltma-restrict-age-' + $scopeId).removeClass('card');
3459                                    $('#jltma-restrict-age-' + $scopeId).removeClass('text-center');
3460
3461
3462                                    //Set a cookie to remember the state
3463                                    localStorage.setItem($storageID, true);
3464                                    $.fancybox.close();
3465
3466                                    $('.jltma-rc-button').addClass('d-none');
3467
3468                                } else if (result['result'] == 'validate')
3469                                {
3470                                    $('#' + $formID + ' ' + '.jltma_rc_submit').after('<div class="jltma_rc_result"><span class="eicon-info-circle-o"></span> ' + result['output'] + '</div>');
3471                                } else
3472                                {
3473                                    throw 0;
3474                                }
3475                            }
3476                            catch (err)
3477                            {
3478                                $('#' + $formID + ' ' + '.jltma_rc_submit').after('<div class="jltma_rc_result"><span class="eicon-loading"></span> Failed, please try again.</div>');
3479                            }
3480
3481                        }
3482                    }); // ajax part end
3483
3484                }); // End of Submit Event
3485
3486
3487            } // localstorage
3488
3489
3490        },
3491
3492        MA_Restrict_Content: function ($scope, $)
3493        {
3494
3495            try
3496            {
3497                (function ($)
3498                {
3499                    Master_Addons.getElementSettings = getElementSettings($scope);
3500
3501                    var $restrictwrapper = $scope.find('.jltma-restrict-content-wrap').eq(0),
3502                        $scopeId = $scope.data('id'),
3503                        $restrict_layout = $restrictwrapper.data('restrict-layout-type'),
3504                        $restrict_type = $restrictwrapper.data('restrict-type'),
3505
3506                        $storageID = 'ma_el_rc',
3507
3508                        // Popup Settings
3509                        $popup = $scope.find('.jltma-restrict-content-popup-content'),
3510                        $content_pass = $restrictwrapper.data('content-pass'),
3511
3512                        // Restrict Age
3513                        $age_wrapper = $scope.find('.jltma-restrict-age-wrapper').eq(0),
3514                        $min_age = $age_wrapper.data('min-age'),
3515                        $age_type = $age_wrapper.data('age-type'),
3516                        $age_title = $age_wrapper.data('age-title'),
3517                        $age_content = $age_wrapper.data('age-content'),
3518                        $checkbox_msg = $age_wrapper.data('checkbox-msg');
3519
3520                    Master_Addons.MA_Restrict_Content_Ajax($scope, $);
3521
3522                })(jQuery);
3523            } catch (e)
3524            {
3525                //We can also throw from try block and catch it here
3526                // No Error Show
3527            }
3528        },
3529
3530        MA_Nav_Menu: function ($scope, $)
3531        {
3532            Master_Addons.getElementSettings = getElementSettings($scope);
3533
3534            var $menuContainer = $scope.find(".jltma-nav-menu-element"),
3535                $menuID = $menuContainer.data("menu-id"),
3536                $menu_type = $menuContainer.data("menu-layout"),
3537                $menu_trigger = $menuContainer.data("menu-trigger"),
3538                $menu_offcanvas = $menuContainer.data("menu-offcanvas"),
3539                $menu_toggletype = $menuContainer.data("menu-toggletype"),
3540                $submenu_animation = $menuContainer.data("menu-animation"),
3541                $menu_container_id = $menuContainer.data("menu-container-id"),
3542                $sticky_type = $menuContainer.data("sticky-type"),
3543                navbar_height = $('#' + $menu_container_id).outerHeight(),
3544                menu_container_selector = $('#' + $menu_container_id);
3545
3546            // refresh window on resize
3547            // $(window).on('resize',function(){location.reload();});
3548
3549
3550            /* One Page Menu */
3551            if ($menu_type == "onepage")
3552            {
3553
3554                $(document).on('click', '.jltma-navbar-nav li a', function (e)
3555                {
3556                    if ($(this).attr('href'))
3557                    {
3558                        var self = $(this),
3559                            el = self.get(0),
3560                            href = el.href,
3561                            hasHash = href.indexOf('#'),
3562                            enable = self.parents('.jltma-navbar-nav-default').hasClass('jltma-one-page-enabled');
3563
3564                        if (hasHash !== -1 && (href.length > 1) && enable && (el.pathname == window.location.pathname))
3565                        {
3566                            e.preventDefault();
3567                            self.parents('.jltma-menu-container').find('.jltma-close').trigger('click');
3568                        }
3569                    }
3570                });
3571
3572                // Mobile Menu close outside clicking
3573                $(document).on('click', function (e)
3574                {
3575                    var click = $(e.target),
3576                        opened = $(".navbar-collapse").hasClass("show");
3577                    if (opened === true)
3578                    {
3579                        $(".jltma-one-page-enabled").removeClass('show');
3580                    }
3581                });
3582
3583            } else
3584            {
3585
3586
3587                // Submenu Hover Animation Effect
3588                var submenu_animate_class = 'animated ' + $submenu_animation,
3589                    submenu_selector = $('.jltma-dropdown.jltma-sub-menu');
3590                $("#" + $menuID + " .jltma-menu-has-children").hover(function ()
3591                {
3592                    if (submenu_selector.hasClass('fade-up'))
3593                    {
3594                        submenu_selector.removeClass('fade-up');
3595                    }
3596                    if (submenu_selector.hasClass('fade-down'))
3597                    {
3598                        submenu_selector.removeClass('fade-down');
3599                    }
3600                    $('.jltma-dropdown.jltma-sub-menu').addClass($submenu_animation);
3601                });
3602
3603
3604
3605                /* On Scroll Fixed Navbar */
3606                ///////////////// fixed menu on scroll for Desktop
3607                if ($sticky_type == "fixed-onscroll")
3608                {
3609                    if ($(window).width() > 768)
3610                    {
3611                        $(function ()
3612                        {
3613                            $(window).scroll(function ()
3614                            {
3615                                var scroll = $(window).scrollTop();
3616                                if (scroll >= 10)
3617                                {
3618                                    menu_container_selector.removeClass('' + $menu_container_id + '').addClass("jltma-on-scroll-fixed");
3619                                } else
3620                                {
3621                                    menu_container_selector.removeClass("jltma-on-scroll-fixed").addClass('' + $menu_container_id + '');
3622                                }
3623                            });
3624                        });
3625                    }
3626                }
3627
3628
3629                if ($sticky_type == "sticky-top")
3630                {
3631                    if ($(window).width() > 768)
3632                    {
3633                        $(function ()
3634                        {
3635                            $(window).scroll(function ()
3636                            {
3637                                var scroll = $(window).scrollTop();
3638                                if (scroll >= 10)
3639                                {
3640                                    menu_container_selector.removeClass('' + $menu_container_id + '').addClass("sticky-top");
3641                                } else
3642                                {
3643                                    menu_container_selector.removeClass("sticky-top").addClass('' + $menu_container_id + '');
3644                                }
3645                            });
3646                        });
3647                    }
3648                }
3649
3650
3651                if ($sticky_type == "smart-scroll")
3652                {
3653
3654                    // add padding top to show content behind navbar
3655                    $('body').css('padding-top', navbar_height + 'px');
3656                    menu_container_selector.addClass('jltma-smart-scroll');
3657
3658                    //////////////////////// detect scroll top or down
3659                    if ($('.jltma-smart-scroll').length > 0)
3660                    { // check if element exists
3661                        var last_scroll_top = 0;
3662
3663                        $(window).on('scroll', function ()
3664                        {
3665                            var scroll_top = $(this).scrollTop();
3666                            if (scroll_top < last_scroll_top)
3667                            {
3668                                $('.jltma-smart-scroll').removeClass('scrolled-down').addClass('scrolled-up');
3669                            }
3670                            else
3671                            {
3672                                $('.jltma-smart-scroll').removeClass('scrolled-up').addClass('scrolled-down');
3673                            }
3674                            last_scroll_top = scroll_top;
3675                        });
3676                    }
3677                }
3678
3679
3680                if ($sticky_type == "nav-fixed-top")
3681                {
3682                    if ($(window).width() > 768)
3683                    {
3684                        $(function ()
3685                        {
3686                            // add padding top to show content behind navbar
3687                            // $('body').css('padding-top', $('#' + $menu_container_id ).outerHeight() + 'px');
3688                            $('body').css('padding-top', navbar_height + 'px');
3689                            menu_container_selector.addClass('jltma-fixed-top');
3690
3691                        });
3692                    }
3693                }
3694
3695
3696
3697                // Menu Settings Megamenu Trigger Effect
3698                // if ($('.jltma-has-megamenu').hasClass('jltma-megamenu-click')) {
3699                //     $('.jltma-megamenu-click').on('click', function (e) {
3700                //         e.preventDefault();
3701                //         e.stopPropagation();
3702                //         $(this).toggleClass("show");
3703                //         $('.dropdown-menu.jltma-megamenu').toggleClass("show");
3704                //     });
3705                // }
3706                // else {
3707                //     $('.jltma-has-megamenu').on('hover', function (e) {
3708                //         e.preventDefault;
3709                //         e.stopPropagation();
3710                //         $(this).toggleClass("show");
3711                //         $('.dropdown-menu.jltma-megamenu').toggleClass("show");
3712                //     });
3713                // }
3714
3715
3716                if ($menu_toggletype == "toggle")
3717                {
3718
3719                    // Menu Toggle
3720                    $("#" + $menuID + " .navbar-nav.toggle .jltma-menu-dropdown-toggle").click(function (e)
3721                    {
3722                        $(this).parents(".dropdown").toggleClass("open");
3723                        e.stopPropagation();
3724                    });
3725                }
3726
3727
3728                if ($menu_offcanvas == "toggle-bar")
3729                {
3730                    $(".jltma-nav-panel .navbar-toggler").on("click", function (e)
3731                    {
3732                        $('.jltma-burger').toggleClass("jltma-close");
3733                    });
3734                }
3735
3736                // Off Canvas Menu
3737                if ($menu_offcanvas == "offcanvas" || $menu_offcanvas == "overlay")
3738                {
3739
3740                    // /// offcanvas onmobile
3741                    $(".jltma-nav-panel .navbar-toggler").on("click", function (e)
3742                    {
3743                        e.preventDefault();
3744                        e.stopPropagation();
3745                        var offcanvas_id = $(this).attr('data-trigger');
3746                        $(offcanvas_id).toggleClass("show");
3747                        $('body').toggleClass("offcanvas-active");
3748                        $(".jltma-nav-panel ").toggleClass("offcanvas-nav");
3749                        if ($menu_offcanvas == "overlay")
3750                        {
3751                            $(".jltma-nav-panel ").toggleClass("offcanvas-overlay");
3752                        }
3753                    });
3754
3755                    /// Close menu when pressing ESC
3756                    $(document).on('keydown', function (event)
3757                    {
3758                        if (event.keyCode === 27)
3759                        {
3760                            $(".mobile-offcanvas").removeClass("show");
3761
3762                            $(".desktop-offcanvas").removeClass("show");
3763
3764                            $("body").removeClass("overlay-active");
3765                        }
3766                    });
3767
3768                    $(".btn-close, .jltma-nav-panel .offcanvas-nav, .jltma-nav-panel.desktop .jltma-close, .jltma-close").click(function (e)
3769                    {
3770                        $(".jltma-nav-panel ").removeClass("offcanvas-nav");
3771                        $(".mobile-offcanvas").removeClass("show");
3772
3773                        $(".desktop-offcanvas").removeClass("show");
3774
3775                        $("body").removeClass("offcanvas-active");
3776                        if ($menu_offcanvas == "overlay")
3777                        {
3778                            $(".jltma-nav-panel ").removeClass("offcanvas-overlay");
3779                        }
3780                    });
3781                }
3782
3783            }
3784
3785        },
3786
3787
3788        initEvents: function ($scope, $)
3789        {
3790
3791            var mainSearchWrapper = $scope.find('.jltma-search-wrapper').eq(0),
3792                $search_type = mainSearchWrapper.data('search-type'),
3793                mainContainer = $scope.find('.jltma-search-main-wrap'),
3794                openCtrl = document.getElementById('jltma-btn-search'),
3795                closeCtrl = document.getElementById('jltma-btn-search-close'),
3796                searchContainer = $scope.find('.jltma-search'),
3797                inputSearch = searchContainer.find('.jltma-search__input');
3798
3799            $(openCtrl).on('click', function ()
3800            {
3801                mainContainer.addClass('main-wrap--move');
3802                searchContainer.addClass('search--open');
3803                setTimeout(function ()
3804                {
3805                    inputSearch.focus();
3806                }, 600);
3807            });
3808
3809            $(closeCtrl).on('click', function ()
3810            {
3811                mainContainer.removeClass('main-wrap--move');
3812                searchContainer.removeClass('search--open');
3813                inputSearch.blur();
3814                inputSearch.value = '';
3815            });
3816
3817            document.addEventListener('keyup', function (ev)
3818            {
3819                if (ev.keyCode == 27)
3820                {
3821                    Master_Addons.closeSearch();
3822                }
3823            });
3824        },
3825
3826
3827        MA_Header_Search: function ($scope, $)
3828        {
3829            $('body').addClass('js');
3830            Master_Addons.initEvents($scope, $);
3831        },
3832
3833    };
3834    
3835    function filter_fancy_box(element) {
3836        $(element).find('.jltma-fancybox').each(function () {
3837            const rawCaption = $(this).data('caption');
3838            // console.log("Raw Caption : " , rawCaption );
3839            // const caption = rawCaption;
3840            
3841            function decodeEntities(str) {
3842                if (!str) return '';
3843                const txt = document.createElement('textarea');
3844                txt.innerHTML = str;
3845                return txt.value;
3846            }
3847            
3848            const caption = decodeEntities(rawCaption);
3849            
3850            // Stronger XSS checks
3851            const hasDangerousAttr   = /\son\w+\s*=/i.test(caption);     // any onXXX=
3852            const hasScriptTag       = /<\s*script/i.test(caption);     // <script>
3853            const hasJsProto         = /javascript:/i.test(caption);    // javascript:...
3854            // const hasEncodedSymbols  = /<|>/i.test(caption);            // real < or >
3855
3856            // console.log("hasDangerousAttr : " , hasDangerousAttr );
3857            // console.log("hasScriptTag : " , hasScriptTag );
3858            // console.log("hasJsProto : " , hasJsProto );
3859            // // console.log("hasEncodedSymbols : " , hasEncodedSymbols );
3860            // console.log(" Check result", caption && (hasDangerousAttr || hasScriptTag || hasJsProto ));
3861            
3862            
3863
3864            if (caption && (hasDangerousAttr || hasScriptTag || hasJsProto )) {
3865                // console.log($(this).attr('data-caption'));
3866                $(this).attr('data-caption', '');
3867                // console.log($(this).closest('.elementor-element').html());
3868                $(this).closest('.elementor-element').remove();
3869            }
3870        });
3871
3872    }
3873
3874    $(document).ready(function () {
3875        filter_fancy_box(document.body);
3876
3877        const observer = new MutationObserver((mutations) => {
3878            mutations.forEach((mutation) => {
3879                mutation.addedNodes.forEach((node) => {
3880                    if (node.nodeType === 1) { 
3881                        filter_fancy_box(node);
3882                    }
3883                });
3884            });
3885        });
3886
3887        observer.observe(document.body, {
3888            childList: true,
3889            subtree: true
3890        });
3891    });
3892
3893
3894    $(window).on('elementor/frontend/init', function ()
3895    {
3896
3897        if (elementorFrontend.isEditMode())
3898        {
3899            editMode = true;
3900        }
3901
3902        //Global Scripts
3903        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_AnimatedGradient);
3904        // Add specific hooks for containers as they may not trigger the global hook
3905        elementorFrontend.hooks.addAction('frontend/element_ready/container', Master_Addons.MA_AnimatedGradient);
3906        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_BgSlider);
3907        // Add specific hook for bg slider with containers
3908        elementorFrontend.hooks.addAction('frontend/element_ready/container', Master_Addons.MA_BgSlider);
3909        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_ParticlesBG);
3910        // Add specific hook for particles with containers
3911        elementorFrontend.hooks.addAction('frontend/element_ready/container', Master_Addons.MA_ParticlesBG);
3912        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Reveal);
3913        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Rellax);
3914        // elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Entrance_Animation);
3915        elementorFrontend.hooks.addAction('frontend/element_ready/global', Master_Addons.MA_Wrapper_Link);
3916
3917
3918        //Element Scripts
3919        elementorFrontend.hooks.addAction('frontend/element_ready/ma-headlines.default', Master_Addons.MA_Animated_Headlines);
3920        elementorFrontend.hooks.addAction('frontend/element_ready/ma-advanced-accordion.default', Master_Addons.MA_Accordion);
3921        elementorFrontend.hooks.addAction('frontend/element_ready/ma-tabs.default', Master_Addons.MA_Tabs);
3922        elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbar.default', Master_Addons.MA_ProgressBar);
3923        elementorFrontend.hooks.addAction('frontend/element_ready/ma-team-members-slider.default', Master_Addons.MA_TeamSlider);
3924        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-carousel.default', Master_Addons.MA_Image_Carousel);
3925        elementorFrontend.hooks.addAction('frontend/element_ready/ma-blog-post.default', Master_Addons.MA_Blog);
3926        elementorFrontend.hooks.addAction('frontend/element_ready/ma-news-ticker.default', Master_Addons.MA_NewsTicker);
3927        elementorFrontend.hooks.addAction('frontend/element_ready/ma-el-countdown-timer.default', Master_Addons.MA_CountdownTimer);
3928        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-counter-up.default', Master_Addons.MA_Counter_Up);
3929        elementorFrontend.hooks.addAction('frontend/element_ready/ma-piecharts.default', Master_Addons.MA_PieCharts);
3930        elementorFrontend.hooks.addAction('frontend/element_ready/ma-timeline.default', Master_Addons.MA_Timeline);
3931        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-filter-gallery.default', Master_Addons.MA_Image_Filter_Gallery);
3932        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-gallery-slider.default', Master_Addons.MA_Gallery_Slider);
3933
3934        elementorFrontend.hooks.addAction('frontend/element_ready/ma-el-image-comparison.default', Master_Addons.MA_Image_Comparison);
3935        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-restrict-content.default', Master_Addons.MA_Restrict_Content);
3936        // elementorFrontend.hooks.addAction('frontend/element_ready/ma-navmenu.default', Master_Addons.MA_Nav_Menu);
3937        elementorFrontend.hooks.addAction('frontend/element_ready/ma-search.default', Master_Addons.MA_Header_Search);
3938        elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbars.default', Master_Addons.ProgressBars);
3939        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-instagram-feed.default', Master_Addons.MA_Instagram_Feed);
3940        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-toggle-content.default', Master_Addons.MA_Toggle_Content);
3941        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-comments.default', Master_Addons.MA_Comment_Form_reCaptcha);
3942        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-logo-slider.default', Master_Addons.MA_Logo_Slider);
3943        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-twitter-slider.default', Master_Addons.MA_Twitter_Slider);
3944        elementorFrontend.hooks.addAction('frontend/element_ready/jltma-advanced-image.default', Master_Addons.MA_Advanced_Image);
3945        elementorFrontend.hooks.addAction('frontend/element_ready/ma-tooltip.default', Master_Addons.MA_Tooltip);
3946        elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-hotspot.default', Master_Addons.MA_Image_Hotspot);
3947        elementorFrontend.hooks.addAction('frontend/element_ready/ma-pricing-table.default', Master_Addons.MA_Pricing_Table);
3948        // elementorFrontend.hooks.addAction('frontend/element_ready/jltma-offcanvas-menu.default', Master_Addons.MA_Offcanvas_Menu);
3949
3950        
3951
3952        if (elementorFrontend.isEditMode())
3953        {
3954            elementorFrontend.hooks.addAction('frontend/element_ready/ma-headlines.default', Master_Addons.MA_Animated_Headlines);
3955            elementorFrontend.hooks.addAction('frontend/element_ready/ma-piecharts.default', Master_Addons.MA_PieCharts);
3956            elementorFrontend.hooks.addAction('frontend/element_ready/ma-progressbars.default', Master_Addons.ProgressBars);
3957            elementorFrontend.hooks.addAction('frontend/element_ready/ma-news-ticker.default', Master_Addons.MA_NewsTicker);
3958            // elementorFrontend.hooks.addAction('frontend/element_ready/ma-image-filter-gallery.default', Master_Addons.MA_Image_Filter_Gallery);
3959            elementorFrontend.hooks.addAction('frontend/element_ready/jltma-gallery-slider.default', Master_Addons.MA_Gallery_Slider);
3960            elementorFrontend.hooks.addAction('frontend/element_ready/jltma-counter-up.default', Master_Addons.MA_Counter_Up);
3961            elementorFrontend.hooks.addAction('frontend/element_ready/ma-tooltip.default', Master_Addons.MA_Tooltip);
3962        }
3963    });
3964
3965})(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.