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.