PageSourceSearch

https://fanhero.com/wp-content/plugins/happy-elementor-addons-pro/assets/js/happy-addons-pro.js?ver=2.16.0

js fanhero.com collected 2026-10-02 05:29:24 UTC 163,649 bytes, 4,074 lines download raw bytes

1"use strict";
2
3function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4window.Happy = window.Happy || {};
5(function ($, Happy, w) {
6  var $window = $(w);
7  $(function () {
8    var $container = $('.ha-fsb-container');
9    if ($container.length > 0) {
10      if (window.history && window.history.pushState) {
11        ha_manage_fsb();
12      }
13      ;
14      $(document.body).on("added_to_cart", function (event, fragments, cart_hash, $button) {
15        ha_manage_fsb();
16      });
17      $(document.body).on("removed_from_cart", function (event, fragments, cart_hash, $button) {
18        ha_manage_fsb();
19      });
20    }
21    function ha_manage_fsb() {
22      $.ajax({
23        url: HappyProLocalize.ajax_url,
24        type: "POST",
25        data: {
26          action: "ha_get_cart_subtotal_action",
27          security: HappyProLocalize.nonce
28        },
29        success: function success(response) {
30          var $data = JSON.parse(response);
31          var $subTotalAmount = $data.subTotalAmount;
32          if ($data.status == 'true' && $subTotalAmount >= 0) {
33            var $container = $('.ha-fsb-container');
34            var $elem = $container.find('.ha-fsb-size');
35            var $settings = $container.data('fsb_settings');
36            if ($settings != undefined) {
37              var $aimationSpeed = $settings.hasOwnProperty('ha_fsb_animation_speed') ? $settings.ha_fsb_animation_speed : 15;
38              var $progressType = $settings.hasOwnProperty('progress_type') ? $settings.progress_type : 'percent';
39              var $currencySymbol = $settings.hasOwnProperty('currencySymbol') && $progressType == 'percent' ? '%' : $settings.currencySymbol;
40              var $targetAmount = $settings.hasOwnProperty('target_amount') ? $settings.target_amount : 0;
41              var $totalPercent = 0;
42              if (parseFloat($subTotalAmount) >= parseFloat($targetAmount)) {
43                $totalPercent = 100;
44              } else {
45                if (parseFloat($targetAmount) == 0) {
46                  $totalPercent = 0;
47                } else {
48                  $totalPercent = parseFloat($subTotalAmount) * 100 / parseFloat($targetAmount);
49                }
50              }
51              $totalPercent = parseFloat(Math.round($totalPercent)) >= 100 ? 100 : parseFloat(Math.round($totalPercent));
52              var $progressText = $progressType == 'percent' ? $totalPercent : $subTotalAmount;
53              var defaultWidth = $(window).width() <= 768 ? 12 : 5;
54              if ($totalPercent > 0) {
55                $elem.text($progressText + $currencySymbol);
56                $elem.css({
57                  'width': $totalPercent + "%",
58                  'transition': 'width ' + $aimationSpeed + 'ms ease-in-out'
59                });
60              }
61              fsbMessageControl($totalPercent);
62              if ($progressText <= 0) {
63                $elem.css('width', +defaultWidth + "%");
64                $elem.text('0' + $currencySymbol);
65              }
66            }
67          }
68        },
69        error: function error(_error) {}
70      });
71    }
72    ;
73    function fsbMessageControl() {
74      var totalPercent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
75      var fsbContainer = $('.ha-fsb-container');
76      var settings = fsbContainer.data('fsb_settings');
77      if (fsbContainer && settings) {
78        if (totalPercent >= 100) {
79          $('.ha-fsb-inner-content').html(settings.fsb_success_message);
80        } else {
81          $('.ha-fsb-inner-content').html(settings.announcement);
82        }
83      }
84    }
85    ;
86    function log(event, item, level) {
87      $(document).on(event, item, level);
88    }
89    var e;
90    e = $(".ha-menu-container");
91    $(e).each(function () {
92      var button = $(this);
93      if ("yes" != button.attr("ha-dom-added")) {
94        if (0 === button.parents(".elementor-widget-ha-nav-menu").length) {
95          button.parents(".ha-wid-con").addClass("ha_menu_responsive_tablet");
96        }
97        button.attr("ha-dom-added", "yes");
98      }
99    });
100    $(".ha-dropdown-has > a").on("click", function (event) {
101      if (!$(this).parents(".ha-navbar-nav, .ha-vertical-navbar-nav").hasClass("submenu-click-on-icon") || $(event.target).hasClass("ha-submenu-indicator-wrap")) {
102        event.preventDefault();
103        var $oElemDragged = $(this).parent().find(">.ha-dropdown, >.ha-megamenu-panel");
104        $oElemDragged.find(".ha-dropdown-open").removeClass("ha-dropdown-open");
105        if ($oElemDragged.hasClass("ha-dropdown-open")) {
106          $oElemDragged.removeClass("ha-dropdown-open");
107        } else {
108          $oElemDragged.addClass("ha-dropdown-open");
109        }
110      }
111    });
112
113    // $(".ha-menu-toggler").on("click", function(event) {
114    //     event.preventDefault();
115
116    //     var el_form_group = $(this).parents(".ha-menu-container").parent();
117    //     if (el_form_group.length < 1) {
118    //         el_form_group = $(this).parent();
119    //     }
120    //     var $wrapElement = el_form_group.find(".ha-menu-offcanvas-elements");
121    //     if ($wrapElement.hasClass("active")) {
122    //         $wrapElement.removeClass("active");
123    //     } else {
124    //         $wrapElement.addClass("active");
125    //     }
126    // });
127
128    $(".ha-navbar-nav li a").on("click", function (event) {
129      if (!$(this).attr("href") && "ha-submenu-indicator-wrap" == event.target.className) {
130        var thirdItem = $(this);
131        var lnk = thirdItem.get(0);
132        var oldUrl = lnk.href;
133        var sepor = oldUrl.indexOf("#");
134        var s = thirdItem.parents(".ha-menu-container").hasClass("ha-nav-menu-one-page-yes");
135        if (-1 !== sepor && oldUrl.length > 1 && s && lnk.pathname == window.location.pathname) {
136          event.preventDefault();
137          thirdItem.parents(".ha-wid-con").find(".ha-menu-close").trigger("click");
138        }
139      }
140    });
141  });
142  function debounce(func, wait, immediate) {
143    var timeout;
144    return function () {
145      var context = this,
146        args = arguments;
147      var later = function later() {
148        timeout = null;
149        if (!immediate) func.apply(context, args);
150      };
151      var callNow = immediate && !timeout;
152      clearTimeout(timeout);
153      timeout = setTimeout(later, wait);
154      if (callNow) func.apply(context, args);
155    };
156  }
157  $window.on("elementor/frontend/init", function () {
158    if (typeof haDisplayCondition != "undefined" && haDisplayCondition.status == "true") {
159      // Set user time in cookie
160      var HappyLocalTimeZone = new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1];
161      var ha_secure = document.location.protocol === "https:" ? "secure" : "";
162      document.cookie = "HappyLocalTimeZone=" + HappyLocalTimeZone + ";SameSite=Strict;" + ha_secure;
163    } else {
164      var now = new Date();
165      now.setTime(now.getTime() - 1000 * 3600);
166      document.cookie = "HappyLocalTimeZone=;expires=" + now.toUTCString() + ";";
167    }
168    var CountDown = function CountDown($scope) {
169      var $item = $scope.find(".ha-countdown");
170      var $countdown_item = $item.find(".ha-countdown-item");
171      var $end_action = $item.data("end-action");
172      var $redirect_link = $item.data("redirect-link");
173      var $end_action_div = $item.find(".ha-countdown-end-action");
174      var $editor_mode_on = $scope.hasClass("elementor-element-edit-mode");
175      $item.countdown({
176        end: function end() {
177          if (("message" === $end_action || "img" === $end_action) && $end_action_div !== undefined) {
178            $countdown_item.css("display", "none");
179            $end_action_div.css("display", "block");
180          } else if ("url" === $end_action && $redirect_link !== undefined && $editor_mode_on !== true) {
181            window.location.replace($redirect_link);
182          }
183        }
184      });
185    };
186    var SliderBase = elementorModules.frontend.handlers.Base.extend({
187      onInit: function onInit() {
188        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
189        this.run();
190      },
191      getDefaultSettings: function getDefaultSettings() {
192        return {
193          selectors: {
194            container: ".ha-slider-container"
195          }
196        };
197      },
198      getDefaultElements: function getDefaultElements() {
199        var selectors = this.getSettings("selectors");
200        return {
201          $container: this.$element.find(selectors.container)
202        };
203      },
204      getReadySettings: function getReadySettings() {
205        var $this = this;
206        var slidesPerView = parseInt(this.getElementSettings("slides_per_view")) || 1;
207        if (this.getElementSettings("thumbs_navigation") == "yes") {
208          var selectorThumbs = this.elements.$container.find(".ha-slider-gallery-thumbs");
209          var haGallaryThumbs = new HaSwiper(selectorThumbs[0], {
210            spaceBetween: this.getElementSettings("space_between_thumbs"),
211            freeMode: true,
212            watchSlidesVisibility: true,
213            watchSlidesProgress: true
214          });
215        }
216        // TODO: Need to fix that in future. Currently, Disabled
217        var tempEffect = this.getElementSettings("effect");
218        if (tempEffect == 'cube') {
219          tempEffect = false;
220        }
221        var settings = {
222          direction: this.getElementSettings("slider_direction"),
223          slidesPerView: slidesPerView || 1,
224          spaceBetween: parseInt(this.getElementSettings("space_between_slides")) || 0,
225          loop: !!(this.getElementSettings("infinity_loop") || false),
226          speed: parseInt(this.getElementSettings("effect_speed")),
227          effect: this.getElementSettings("slider_type") == "multiple" ? this.getElementSettings("effect_multiple") : tempEffect,
228          ha_animation: this.getElementSettings("slider_content_animation"),
229          sliderType: this.getElementSettings("slider_type")
230        };
231        if (this.getElementSettings("effect") == "flip") {
232          settings.flipEffect = {
233            limitRotation: true,
234            slideShadows: true
235          };
236        }
237        // TODO: Need to fix that in future. Currently, Disabled
238        // if (this.getElementSettings("effect") == "cube") {
239        //     settings.cubeEffect = {
240        //         shadow: true,
241        //         slideShadows: true,
242        //         shadowOffset: 20,
243        //         shadowScale: 0.94,
244        //     };
245        // }
246        if (this.getElementSettings("effect_multiple") == "coverflow") {
247          settings.coverflowEffect = {
248            rotate: 50,
249            stretch: 0,
250            depth: 100,
251            modifier: 1,
252            slideShadows: true
253          };
254        }
255        if (this.getElementSettings("slider_type") == "multiple") {
256          var bpObj = {
257            desktop: {
258              slidesPerView: slidesPerView || 1,
259              spaceBetween: parseInt(this.getElementSettings("space_between_slides")) || 0
260            }
261          };
262          var breakpoints = elementorFrontend.config.responsive.breakpoints;
263          $.each(breakpoints, function (idx, val) {
264            if (val.is_enabled) {
265              bpObj[idx] = {
266                screenSize: val.value,
267                slidesPerView: parseInt($this.getElementSettings("slides_per_view_" + idx)) || slidesPerView,
268                spaceBetween: parseInt($this.getElementSettings("space_between_slides_" + idx)) || 0
269              };
270            }
271          });
272          settings.customBreakpoints = bpObj;
273          settings.customMultiple = true;
274        }
275        if (this.getElementSettings("autoplay") == "yes") {
276          settings.autoplay = {
277            delay: this.getElementSettings("autoplay_speed"),
278            disableOnInteraction: false,
279            stopOnLastSlide: !(this.getElementSettings("infinity_loop") || false)
280          };
281        }
282        if (this.getElementSettings("arrow_navigation") == "yes") {
283          var selectorNext = this.elements.$container.find(".ha-slider-next");
284          var selectorPrev = this.elements.$container.find(".ha-slider-prev");
285          settings.navigation = {
286            nextEl: selectorNext[0],
287            prevEl: selectorPrev[0]
288          };
289        }
290        if (this.getElementSettings("pagination_type") == "dots") {
291          var selectorPagi = this.elements.$container.find(".ha-slider-pagination");
292          settings.pagination = {
293            el: selectorPagi[0],
294            clickable: true
295          };
296        }
297        if (this.getElementSettings("pagination_type") == "progressbar") {
298          var selectorPagi = this.elements.$container.find(".ha-slider-pagination");
299          settings.pagination = {
300            el: selectorPagi[0],
301            clickable: true,
302            type: "progressbar"
303          };
304        }
305        if (this.getElementSettings("pagination_type") == "numbers") {
306          var selectorPagi = this.elements.$container.find(".ha-slider-pagination");
307          settings.pagination = {
308            el: selectorPagi[0],
309            clickable: true,
310            type: this.getElementSettings("number_pagination_type"),
311            renderBullet: function renderBullet(index, className) {
312              return '<span class="' + className + '">' + (index + 1) + "</span>";
313            },
314            renderFraction: function renderFraction(currentClass, totalClass) {
315              return '<span class="' + currentClass + '"></span>' + "<span>/</span>" + '<span class="' + totalClass + '"></span>';
316            }
317          };
318        }
319        if (this.getElementSettings("scroll_bar") == "yes") {
320          var selectorScroll = this.elements.$container.find(".ha-slider-scrollbar");
321          settings.scrollbar = {
322            el: selectorScroll[0],
323            hide: this.getElementSettings("scroll_bar_visibility") == "true",
324            draggable: true
325          };
326        }
327        if (this.getElementSettings("thumbs_navigation") == "yes") {
328          settings.thumbs = {
329            swiper: haGallaryThumbs
330          };
331        }
332        return $.extend({}, settings);
333      },
334      run: function run() {
335        var elContainer = this.elements.$container;
336        var slider = elContainer.find(".ha-slider-container");
337        var readySettings = this.getReadySettings();
338        var sliderObj = new HaSwiper(slider[0], readySettings);
339        if (readySettings.customMultiple) {
340          $(window).on('resize', function () {
341            var mode = $('body').attr('data-elementor-device-mode');
342            sliderObj.params.slidesPerView = readySettings.customBreakpoints[mode].slidesPerView;
343            sliderObj.params.spaceBetween = readySettings.customBreakpoints[mode].spaceBetween;
344            sliderObj.update();
345          }).resize();
346        }
347        sliderObj.on("slideChange", function () {
348          if (readySettings.sliderType == "multiple") {
349            return;
350          }
351          var aI = sliderObj.activeIndex;
352          var elSlide = elContainer.find(".ha-slider-slide");
353          var elSlideContent = elContainer.find(".ha-slider-content");
354          var currentSlide = elSlideContent.eq(aI);
355          currentSlide.hide();
356          if (currentSlide.length <= 0) {}
357          setTimeout(function () {
358            currentSlide.show();
359          }, readySettings.speed);
360          elSlide.eq(aI).find(".elementor-invisible, .animated").each(function (e, t) {
361            var i = $(this).data("settings");
362            if (i && (i._animation || i.animation)) {
363              var n = i._animation_delay ? i._animation_delay : 0,
364                a = i._animation || i.animation;
365              $(this).removeClass("elementor-invisible");
366              $(this).addClass(a + " animated");
367            }
368          });
369        });
370        sliderObj.on("transitionEnd", function () {
371          var aI = sliderObj.activeIndex;
372          var elSlide = elContainer.find(".ha-slider-slide");
373          var elSlideContent = elContainer.find(".ha-slider-content");
374          var currentSlide = elSlideContent.eq(aI);
375          setTimeout(function () {
376            elSlide.eq(aI).find(".animated").each(function (e, t) {
377              var i = $(this).data("settings");
378              if (i && (i._animation || i.animation)) {
379                var n = i._animation_delay ? i._animation_delay : 0,
380                  a = i._animation || i.animation;
381                $(this).removeClass(a);
382              }
383            });
384          }, readySettings.speed);
385        });
386      }
387    });
388    var CarouselBase = elementorModules.frontend.handlers.Base.extend({
389      onInit: function onInit() {
390        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
391        this.run();
392      },
393      getDefaultSettings: function getDefaultSettings() {
394        return {
395          selectors: {
396            container: ".ha-carousel-container"
397          },
398          arrows: false,
399          dots: false,
400          checkVisible: false,
401          infinite: true,
402          slidesToShow: 3,
403          rows: 0,
404          prevArrow: '<button type="button" class="slick-prev"><i class="fa fa-chevron-left"></i></button>',
405          nextArrow: '<button type="button" class="slick-next"><i class="fa fa-chevron-right"></i></button>'
406        };
407      },
408      getDefaultElements: function getDefaultElements() {
409        var selectors = this.getSettings("selectors");
410        return {
411          $container: this.findElement(selectors.container)
412        };
413      },
414      onElementChange: function onElementChange() {
415        this.elements.$container.slick("unslick");
416        this.run();
417      },
418      getReadySettings: function getReadySettings() {
419        var $rtl = $('html[dir="rtl"]').length == 1 || $('body').hasClass('rtl');
420        if ('yes' == this.getElementSettings('vertical')) {
421          $rtl = false; // for vertical direction rtl is off
422        }
423        var settings = {
424          infinite: !!this.getElementSettings("loop"),
425          autoplay: !!this.getElementSettings("autoplay"),
426          autoplaySpeed: this.getElementSettings("autoplay_speed"),
427          speed: this.getElementSettings("animation_speed"),
428          centerMode: !!this.getElementSettings("center"),
429          vertical: !!this.getElementSettings("vertical"),
430          //slidesToScroll: 1,
431          rtl: $rtl
432        };
433        switch (this.getElementSettings("navigation")) {
434          case "arrow":
435            settings.arrows = true;
436            break;
437          case "dots":
438            settings.dots = true;
439            break;
440          case "both":
441            settings.arrows = true;
442            settings.dots = true;
443            break;
444        }
445        var slides_to_scroll = !!this.getElementSettings('slides_to_scroll');
446        settings.slidesToShow = parseInt(this.getElementSettings("slides_to_show")) || 1;
447        settings.slidesToScroll = slides_to_scroll ? parseInt(this.getElementSettings('slides_to_show')) || 1 : 1;
448        settings.responsive = [{
449          breakpoint: elementorFrontend.config.breakpoints.lg,
450          settings: {
451            slidesToShow: parseInt(this.getElementSettings("slides_to_show_tablet")) || settings.slidesToShow,
452            slidesToScroll: slides_to_scroll ? parseInt(this.getElementSettings('slides_to_show_tablet')) || settings.slidesToShow : 1
453          }
454        }, {
455          breakpoint: elementorFrontend.config.breakpoints.md,
456          settings: {
457            slidesToShow: parseInt(this.getElementSettings("slides_to_show_mobile")) || parseInt(this.getElementSettings("slides_to_show_tablet")) || settings.slidesToShow,
458            slidesToScroll: slides_to_scroll ? parseInt(this.getElementSettings('slides_to_show_mobile')) || parseInt(this.getElementSettings('slides_to_show_tablet')) || settings.slidesToShow : 1
459          }
460        }];
461        return $.extend({}, this.getSettings(), settings);
462      },
463      run: function run() {
464        this.elements.$container.slick(this.getReadySettings());
465      }
466    });
467
468    // Source Code
469    var SourceCode = function SourceCode($scope) {
470      var $item = $scope.find('.ha-source-code');
471      var $lng_type = $item.data('lng-type');
472      var $after_copy_text = $item.data('after-copy');
473      var $code = $item.find('code.language-' + $lng_type);
474      var $copy_btn = $scope.find('.ha-copy-code-button');
475      $copy_btn.on('click', function () {
476        var $temp = $("<textarea>");
477        $(this).append($temp);
478        $temp.val($code.text()).select();
479        document.execCommand("copy");
480        $temp.remove();
481        if ($after_copy_text.length) {
482          $(this).text($after_copy_text);
483        }
484      });
485      if ($lng_type !== undefined && $code !== undefined) {
486        Prism.highlightElement($code.get(0));
487      }
488    };
489
490    // Animated text
491    var AnimatedText = function AnimatedText($scope) {
492      var $item = $scope.find(".cd-headline"),
493        $animationDelay = $item.data("animation-delay");
494      happyAnimatedText({
495        selector: $item,
496        animationDelay: $animationDelay
497      });
498    };
499    //Instagram Feed
500    var InstagramFeed = function InstagramFeed($scope) {
501      var button = $scope.find(".ha-insta-load-more");
502      var instagram_wrap = $scope.find(".ha-insta-default");
503      button.on("click", function (e) {
504        e.preventDefault();
505        var $self = $(this),
506          query_settings = $self.data("settings"),
507          total = $self.data("total"),
508          items = $scope.find(".ha-insta-item").length;
509        $.ajax({
510          url: HappyProLocalize.ajax_url,
511          type: "POST",
512          data: {
513            action: "ha_instagram_feed_action",
514            security: HappyProLocalize.nonce,
515            query_settings: query_settings,
516            loaded_item: items
517          },
518          success: function success(response) {
519            if (total > items) {
520              $(response).appendTo(instagram_wrap);
521            } else {
522              $self.text("All Loaded").addClass("loaded");
523              setTimeout(function () {
524                $self.css({
525                  display: "none"
526                });
527              }, 800);
528            }
529          },
530          error: function error(_error2) {}
531        });
532      });
533    };
534    //Scrolling Image
535    var ScrollingImage = elementorModules.frontend.handlers.Base.extend({
536      onInit: function onInit() {
537        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
538        this.wrapper = this.$element.find(".ha-scrolling-image-wrapper");
539        this.run();
540      },
541      onElementChange: function onElementChange() {
542        this.run();
543      },
544      run: function run() {
545        var container_height = this.wrapper.innerHeight(),
546          container_width = this.wrapper.innerWidth(),
547          image_align = this.wrapper.data("align"),
548          scroll_direction = this.wrapper.data("scroll-direction"),
549          items = this.wrapper.find(".ha-scrolling-image-container"),
550          single_image_box = items.find(".ha-scrolling-image-item"),
551          scroll = "scroll" + image_align + scroll_direction + parseInt(container_height) + parseInt(container_width),
552          duration = this.wrapper.data("duration"),
553          direction = "normal",
554          horizontal_align_width = 10,
555          vertical_align_height = 10;
556        var start = {
557            transform: "translateY(" + container_height + "px)"
558          },
559          end = {
560            transform: "translateY(-101%)"
561          };
562        if ("bottom" === scroll_direction || "right" === scroll_direction) {
563          direction = "reverse";
564        }
565        if ("ha-horizontal" === image_align) {
566          start = {
567            transform: "translateX(" + container_width + "px)"
568          };
569          end = {
570            transform: "translateX(-101%)"
571          };
572          single_image_box.each(function () {
573            horizontal_align_width += $(this).outerWidth(true);
574          });
575          items.css({
576            width: horizontal_align_width,
577            display: "flex"
578          });
579          items.find("img").css({
580            "max-width": "100%"
581          });
582          single_image_box.css({
583            display: "inline-flex"
584          });
585        }
586        if ("ha-vertical" === image_align) {
587          single_image_box.each(function () {
588            vertical_align_height += $(this).outerHeight(true);
589          });
590        }
591        $.keyframe.define([{
592          name: scroll,
593          "0%": start,
594          "100%": end
595        }]);
596        items.playKeyframe({
597          name: scroll,
598          duration: duration.toString() + "ms",
599          timingFunction: "linear",
600          delay: "0s",
601          iterationCount: "infinite",
602          direction: direction,
603          fillMode: "none",
604          complete: function complete() {}
605        });
606      }
607    });
608    //Pricing Table ToolTip
609    var PricingTableToolTip = function PricingTableToolTip($scope) {
610      var tooltip_area = $scope.find(".ha-pricing-table-feature-tooltip");
611      tooltip_area.on({
612        mouseenter: function mouseenter(e) {
613          var $this = $(this),
614            direction = $this[0].getBoundingClientRect(),
615            tooltip = $this.find(".ha-pricing-table-feature-tooltip-text"),
616            tooltipW = tooltip.outerWidth(true),
617            tooltipH = tooltip.outerHeight(true),
618            W_width = $(window).width(),
619            W_height = $(window).height();
620          tooltip.css({
621            left: "0",
622            right: "auto",
623            top: "calc(100% + 1px)",
624            bottom: "auto"
625          });
626          if (W_width - direction.left < tooltipW && direction.right < tooltipW) {
627            tooltip.css({
628              left: "calc(50% - (" + tooltipW + "px/2))"
629            });
630          } else if (W_width - direction.left < tooltipW) {
631            tooltip.css({
632              left: "auto",
633              right: "0"
634            });
635          }
636          if (W_height - direction.bottom < tooltipH) {
637            tooltip.css({
638              top: "auto",
639              bottom: "calc(100% + 1px)"
640            });
641          }
642        }
643      });
644    };
645    var TabHandlerBase = elementorModules.frontend.handlers.Base.extend({
646      $activeContent: null,
647      getDefaultSettings: function getDefaultSettings() {
648        return {
649          selectors: {
650            tabTitle: ".ha-tab__title",
651            tabContent: ".ha-tab__content"
652          },
653          classes: {
654            active: "ha-tab--active"
655          },
656          showTabFn: "show",
657          hideTabFn: "hide",
658          toggleSelf: false,
659          hidePrevious: true,
660          autoExpand: true
661        };
662      },
663      getDefaultElements: function getDefaultElements() {
664        var selectors = this.getSettings("selectors");
665        return {
666          $tabTitles: this.findElement(selectors.tabTitle),
667          $tabContents: this.findElement(selectors.tabContent)
668        };
669      },
670      activateDefaultTab: function activateDefaultTab() {
671        var settings = this.getSettings();
672        if (!settings.autoExpand || "editor" === settings.autoExpand && !this.isEdit) {
673          return;
674        }
675        var defaultActiveTab = this.getEditSettings("activeItemIndex") || 1,
676          originalToggleMethods = {
677            showTabFn: settings.showTabFn,
678            hideTabFn: settings.hideTabFn
679          };
680        // Toggle tabs without animation to avoid jumping
681        this.setSettings({
682          showTabFn: "show",
683          hideTabFn: "hide"
684        });
685        this.changeActiveTab(defaultActiveTab);
686        // Return back original toggle effects
687        this.setSettings(originalToggleMethods);
688      },
689      deactivateActiveTab: function deactivateActiveTab(tabIndex) {
690        var settings = this.getSettings(),
691          activeClass = settings.classes.active,
692          activeFilter = tabIndex ? '[data-tab="' + tabIndex + '"]' : "." + activeClass,
693          $activeTitle = this.elements.$tabTitles.filter(activeFilter),
694          $activeContent = this.elements.$tabContents.filter(activeFilter);
695        $activeTitle.add($activeContent).removeClass(activeClass);
696        $activeContent[settings.hideTabFn]();
697      },
698      activateTab: function activateTab(tabIndex) {
699        var settings = this.getSettings(),
700          activeClass = settings.classes.active,
701          $requestedTitle = this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]'),
702          $requestedContent = this.elements.$tabContents.filter('[data-tab="' + tabIndex + '"]');
703        $requestedTitle.add($requestedContent).addClass(activeClass);
704        $requestedContent[settings.showTabFn]();
705      },
706      isActiveTab: function isActiveTab(tabIndex) {
707        return this.elements.$tabTitles.filter('[data-tab="' + tabIndex + '"]').hasClass(this.getSettings("classes.active"));
708      },
709      bindEvents: function bindEvents() {
710        var _this = this;
711        this.elements.$tabTitles.on({
712          keydown: function keydown(event) {
713            if ("Enter" === event.key) {
714              if ('A' == event.currentTarget.tagName && event.currentTarget.classList.contains('ha-tab__title')) {
715                //this conditional scope in only for advance tab widget
716                return;
717              }
718              event.preventDefault();
719              _this.changeActiveTab(event.currentTarget.getAttribute("data-tab"));
720            }
721          },
722          click: function click(event) {
723            if ('A' == event.currentTarget.tagName && event.currentTarget.classList.contains('ha-tab__title')) {
724              //this conditional scope in only for advance tab widget
725              return;
726            }
727            event.preventDefault();
728            _this.changeActiveTab(event.currentTarget.getAttribute("data-tab"));
729            // iphone specific scroll to top
730            if (/iPhone/i.test(navigator.userAgent)) {
731              $("body,html,document").scrollTop($(this).offset().top);
732            }
733          }
734        });
735      },
736      onInit: function onInit() {
737        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
738        this.activateDefaultTab();
739      },
740      onEditSettingsChange: function onEditSettingsChange(propertyName) {
741        if ("activeItemIndex" === propertyName) {
742          this.activateDefaultTab();
743        }
744      },
745      changeActiveTab: function changeActiveTab(tabIndex) {
746        var isActiveTab = this.isActiveTab(tabIndex),
747          settings = this.getSettings();
748        if ((settings.toggleSelf || !isActiveTab) && settings.hidePrevious) {
749          this.deactivateActiveTab();
750        }
751        if (!settings.hidePrevious && isActiveTab) {
752          this.deactivateActiveTab(tabIndex);
753        }
754        if (!isActiveTab) {
755          this.activateTab(tabIndex);
756        }
757        $(window).trigger("resize");
758      }
759    });
760    var TimeLine = function TimeLine($scope) {
761      var T_ID = $scope.data("id");
762      var timeline = $scope.find(".ha-timeline-wrap");
763      var dataScroll = timeline.data("scroll");
764      var timeline_block = timeline.find(".ha-timeline-block");
765      var event = "scroll.timelineScroll" + T_ID + " resize.timelineScroll" + T_ID;
766      function scroll_tree() {
767        timeline_block.each(function () {
768          var block_height = $(this).outerHeight(true);
769          var $offsetTop = $(this).offset().top;
770          var window_middle_p = $window.scrollTop() + $window.height() / 2;
771          if ($offsetTop < window_middle_p) {
772            $(this).addClass("ha-timeline-scroll-tree");
773          } else {
774            $(this).removeClass("ha-timeline-scroll-tree");
775          }
776          var scroll_tree_wrap = $(this).find(".ha-timeline-tree-inner");
777          var scroll_height = $window.scrollTop() - scroll_tree_wrap.offset().top + $window.outerHeight() / 2;
778          if ($offsetTop < window_middle_p && timeline_block.hasClass("ha-timeline-scroll-tree")) {
779            if (block_height > scroll_height) {
780              scroll_tree_wrap.css({
781                height: scroll_height * 1.5 + "px"
782              });
783            } else {
784              scroll_tree_wrap.css({
785                height: block_height * 1.2 + "px"
786              });
787            }
788          } else {
789            scroll_tree_wrap.css("height", "0px");
790          }
791        });
792      }
793      if ("yes" === dataScroll) {
794        scroll_tree();
795        $window.on(event, scroll_tree);
796      } else {
797        $window.off(event);
798      }
799    };
800    var HotSpots = elementorModules.frontend.handlers.Base.extend({
801      onInit: function onInit() {
802        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
803        this.init();
804      },
805      bindEvents: function bindEvents() {
806        if (!this.isEdit) {
807          this.elements.$items.on("click.spotClick", function (e) {
808            e.preventDefault();
809          });
810        }
811      },
812      getDefaultSettings: function getDefaultSettings() {
813        return {
814          selectors: {
815            item: ".ha-hotspots__item"
816          }
817        };
818      },
819      getDefaultElements: function getDefaultElements() {
820        return {
821          $items: this.findElement(this.getSettings("selectors.item"))
822        };
823      },
824      onElementChange: function onElementChange(changedProp) {
825        if (!this.hasTipso()) {
826          return;
827        }
828        if (changedProp.indexOf("tooltip_") === 0) {
829          this.elements.$items.tipso("destroy");
830          this.init();
831        }
832      },
833      hasTipso: function hasTipso() {
834        return $.fn["tipso"];
835      },
836      init: function init() {
837        var position = this.getElementSettings("tooltip_position"),
838          width = this.getElementSettings("tooltip_width"),
839          background = this.getElementSettings("tooltip_bg_color"),
840          color = this.getElementSettings("tooltip_color"),
841          speed = this.getElementSettings("tooltip_speed"),
842          delay = this.getElementSettings("tooltip_delay"),
843          hideDelay = this.getElementSettings("tooltip_hide_delay"),
844          hideArrow = this.getElementSettings("tooltip_hide_arrow"),
845          hover = this.getElementSettings("tooltip_hover"),
846          elementId = this.getID();
847        if (!this.hasTipso()) {
848          return;
849        }
850        this.elements.$items.each(function (index, item) {
851          var $item = $(item),
852            target = $item.data("target"),
853            settings = $item.data("settings"),
854            classes = ["ha-hotspots--" + elementId, "elementor-repeater-item-" + target];
855          $item.tipso({
856            color: color,
857            width: width.size || 200,
858            position: settings.position || position,
859            speed: speed,
860            delay: delay,
861            showArrow: !hideArrow,
862            tooltipHover: !!hover,
863            hideDelay: hideDelay,
864            background: background,
865            useTitle: false,
866            content: $("#ha-" + target).html(),
867            onBeforeShow: function onBeforeShow($e, e, tooltip) {
868              $(document).find('.elementor-repeater-item-' + target).remove();
869              tooltip.tipso_bubble.addClass(classes.join(" "));
870            }
871          });
872        });
873      }
874    });
875    var LineChart = function LineChart($scope) {
876      haObserveTarget($scope[0], function () {
877        var $container = $scope.find(".ha-line-chart-container"),
878          $chart_canvas = $scope.find("#ha-line-chart"),
879          settings = $container.data("settings");
880        if ($container.length) {
881          var chart = new Chart($chart_canvas, settings);
882        }
883      });
884    };
885    var RadarChart = function RadarChart($scope) {
886      haObserveTarget($scope[0], function () {
887        var $container = $scope.find(".ha-radar-chart-container"),
888          $chart_canvas = $scope.find("#ha-radar-chart"),
889          settings = $container.data("settings");
890        if ($container.length) {
891          var chart = new Chart($chart_canvas, settings);
892        }
893      });
894    };
895    var PolarChart = function PolarChart($scope) {
896      haObserveTarget($scope[0], function () {
897        var $container = $scope.find(".ha-polar-chart-container"),
898          $chart_canvas = $scope.find("#ha-polar-chart"),
899          settings = $container.data("settings");
900        if ($container.length) {
901          var chart = new Chart($chart_canvas, settings);
902        }
903      });
904    };
905    var PieChart = function PieChart($scope) {
906      haObserveTarget($scope[0], function () {
907        var $container = $scope.find(".ha-pie-chart-container"),
908          $chart_canvas = $scope.find("#ha-pie-chart"),
909          settings = $container.data("settings");
910        if ($container.length) {
911          var chart = new Chart($chart_canvas, settings);
912        }
913      });
914    };
915    var StickyVideoArray = [];
916    var StickyVideo = function StickyVideo($scope) {
917      var $id = "#ha-sticky-video-player-" + $scope.data("id"),
918        $wrap = $scope.find(".ha-sticky-video-wrap"),
919        $settting = $wrap.data("ha-player"),
920        $box = $wrap.find(".ha-sticky-video-box"),
921        $overlay_box = $wrap.find(".ha-sticky-video-overlay"),
922        $overlay_play = $overlay_box.find(".ha-sticky-video-overlay-icon"),
923        $sticky_close = $wrap.find(".ha-sticky-video-close i"),
924        $all_box = $(".ha-sticky-video-box"),
925        event = "scroll.haStickyVideo" + $scope.data("id"),
926        set;
927      var playerAbc = new Plyr($id);
928      var StickyVideoObject = {
929        player: playerAbc,
930        event: event,
931        player_box: $box
932      };
933      StickyVideoArray.push(StickyVideoObject);
934
935      //on ready
936      playerAbc.on("ready", function (e) {
937        var $box_plyr = $box.find('.plyr.plyr--video');
938        if (true == $settting.autoplay) {
939          $box_plyr.trigger("click");
940        }
941      });
942
943      //on overlay click
944      if (0 !== $overlay_box.length) {
945        var $el = 0 !== $overlay_play.length ? $overlay_play : $overlay_box;
946        $el.on("click", function () {
947          playerAbc.play();
948        });
949      }
950      //on close sticky
951      $sticky_close.on("click", function () {
952        $box.removeClass("sticky");
953        $box.addClass("sticky-close");
954        playerAbc.pause();
955      });
956      //on Play
957      playerAbc.on("play", function (e) {
958        $overlay_box.css("display", "none");
959        if ($box.hasClass("sticky-close")) {
960          $box.removeClass("sticky-close");
961        }
962        StickyVideoArray.forEach(function (item, index) {
963          if (item.player !== playerAbc) {
964            item.player.pause();
965          }
966          if (item.event !== event) {
967            $window.off(item.event);
968          }
969          if (item.player_box !== $box) {
970            item.player_box.removeClass("sticky");
971          }
972        });
973        if (true === $settting.sticky) {
974          $window.on(event, function () {
975            var height = $box.outerHeight(true);
976            var $offsetTop = $wrap.offset().top;
977            var videoBoxTopPoint = $window.scrollTop();
978            var videoBoxMiddlePoint = $offsetTop + height / 2;
979            if (!$box.hasClass("sticky-close")) {
980              if (videoBoxMiddlePoint < videoBoxTopPoint) {
981                $box.addClass("sticky");
982              } else {
983                $box.removeClass("sticky");
984              }
985            }
986          });
987        } else {
988          $window.off(event);
989        }
990      });
991      // on pause
992      playerAbc.on("pause", function (e) {
993        $window.off(event);
994      });
995      $window.on("load resize", debounce(function () {
996        var height = $box.find(".plyr").height();
997        $wrap.css("min-height", height + "px");
998      }, 100));
999    };
1000
1001    //facebook feed
1002    var FacebookFeed = function FacebookFeed($scope) {
1003      var button = $scope.find(".ha-facebook-load-more");
1004      var facebook_wrap = $scope.find(".ha-facebook-items");
1005      button.on("click", function (e) {
1006        e.preventDefault();
1007        var $self = $(this),
1008          query_settings = $self.data("settings"),
1009          total = $self.data("total"),
1010          items = $scope.find(".ha-facebook-item").length;
1011        $.ajax({
1012          url: HappyProLocalize.ajax_url,
1013          type: "POST",
1014          data: {
1015            action: "ha_facebook_feed_action",
1016            security: HappyProLocalize.nonce,
1017            query_settings: query_settings,
1018            loaded_item: items
1019          },
1020          success: function success(response) {
1021            if (total > items) {
1022              $(response).appendTo(facebook_wrap);
1023            } else {
1024              $self.text("All Loaded").addClass("loaded");
1025              setTimeout(function () {
1026                $self.css({
1027                  display: "none"
1028                });
1029              }, 800);
1030            }
1031          },
1032          error: function error(_error3) {}
1033        });
1034      });
1035    };
1036    //SmartPostList
1037    var SmartPostList = function SmartPostList($scope) {
1038      var filterWrap = $scope.find(".ha-spl-filter"),
1039        customSelect = $scope.find(".ha-spl-custom-select"),
1040        gridWrap = $scope.find(".ha-spl-grid-area"),
1041        mainWrapper = $scope.find(".ha-spl-wrapper"),
1042        querySettings = mainWrapper.data("settings"),
1043        dataOffset = mainWrapper.attr("data-offset"),
1044        nav = $scope.find(".ha-spl-pagination button"),
1045        navPrev = $scope.find(".ha-spl-pagination button.prev"),
1046        navNext = $scope.find(".ha-spl-pagination button.next"),
1047        filter = $scope.find("ul.ha-spl-filter-list li span"),
1048        event;
1049      customSelect.niceSelect();
1050      var select = $scope.find(".ha-spl-custom-select li");
1051      function afterClick(e) {
1052        e.preventDefault();
1053        var $self = $(this),
1054          dataFilter = filterWrap.attr("data-active"),
1055          dataTotalOffset = mainWrapper.attr("data-total-offset"),
1056          offset = "",
1057          termId = "";
1058        if (e.target.classList.contains("prev") || e.target.classList.contains("fa-angle-left")) {
1059          if (0 == parseInt(dataTotalOffset)) {
1060            navPrev.attr("disabled", true);
1061            return;
1062          }
1063          offset = 0 !== parseInt(dataTotalOffset) ? parseInt(dataTotalOffset) - parseInt(dataOffset) : "0";
1064          if (undefined !== dataFilter) {
1065            termId = dataFilter;
1066          }
1067        } else if (e.target.classList.contains("next") || e.target.classList.contains("fa-angle-right")) {
1068          offset = parseInt(dataTotalOffset) + parseInt(dataOffset);
1069          if (undefined !== dataFilter) {
1070            termId = dataFilter;
1071          }
1072        }
1073        if (e.target.hasAttribute("data-value")) {
1074          termId = e.target.dataset["value"];
1075          filterWrap[0].setAttribute("data-active", termId);
1076          if ("SPAN" === e.target.tagName) {
1077            filter.removeClass("ha-active");
1078            e.target.classList.toggle("ha-active");
1079          }
1080          offset = 0;
1081          navPrev.attr("disabled", true);
1082          navNext.removeAttr("disabled");
1083        }
1084        $.ajax({
1085          url: HappyProLocalize.ajax_url,
1086          type: "POST",
1087          data: {
1088            action: "ha_smart_post_list_action",
1089            security: HappyProLocalize.nonce,
1090            querySettings: querySettings,
1091            offset: offset,
1092            termId: termId
1093          },
1094          success: function success(response) {
1095            if ($(response).length > 0) {
1096              gridWrap.css("height", gridWrap.outerHeight(true) + "px");
1097              gridWrap.html("");
1098              $(response).appendTo(gridWrap);
1099              gridWrap.css("height", "");
1100              mainWrapper[0].attributes["data-total-offset"].value = offset;
1101              if (e.target.classList.contains("prev") || e.target.classList.contains("fa-angle-left")) {
1102                navNext.removeAttr("disabled");
1103              }
1104              if (e.target.classList.contains("next") || e.target.classList.contains("fa-angle-right")) {
1105                navPrev.removeAttr("disabled");
1106              }
1107            } else {
1108              if (e.target.classList.contains("next") || e.target.classList.contains("fa-angle-right")) {
1109                navNext.attr("disabled", true);
1110              }
1111            }
1112          },
1113          error: function error(_error4) {}
1114        });
1115      }
1116      nav.on("click", afterClick);
1117      filter.on("click", afterClick);
1118      select.on("click", afterClick);
1119    };
1120
1121    //PostGrid
1122    var postGridSkins = ["classic", "hawai", "standard", "monastic", "stylica", "outbox", "crossroad"];
1123    var PostGrid = function PostGrid($scope) {
1124      var wrapper = $scope.find(".ha-pg-wrapper"),
1125        gridWrap = wrapper.find(".ha-pg-grid-wrap"),
1126        button = wrapper.find("button.ha-pg-loadmore");
1127      button.on("click", function (e) {
1128        e.preventDefault();
1129        var $self = $(this),
1130          querySettings = $self.data("settings"),
1131          items = wrapper.find(".ha-pg-item").length;
1132        $self.attr("disabled", true);
1133        $.ajax({
1134          url: HappyProLocalize.ajax_url,
1135          type: "POST",
1136          data: {
1137            action: "hapro_post_grid_action",
1138            security: HappyProLocalize.nonce,
1139            querySettings: querySettings,
1140            loadedItem: items
1141          },
1142          beforeSend: function beforeSend() {
1143            $self.find(".eicon-loading").css({
1144              display: "inline-block"
1145            });
1146          },
1147          success: function success(response) {
1148            if (response) {
1149              $(response).each(function () {
1150                var $self = $(this);
1151                if ($self.hasClass("ha-pg-item")) {
1152                  $self.addClass("ha-pg-item-loaded").appendTo(gridWrap);
1153                } else {
1154                  $self.appendTo(gridWrap);
1155                }
1156              });
1157            } else {
1158              $self.text("All Loaded").addClass("loaded");
1159              setTimeout(function () {
1160                $self.css({
1161                  display: "none"
1162                });
1163              }, 800);
1164            }
1165            $self.find(".eicon-loading").css({
1166              display: "none"
1167            });
1168            $self.removeAttr("disabled");
1169          },
1170          error: function error(_error5) {}
1171        });
1172      });
1173    };
1174
1175    // Happy Loop Grid
1176    var LoopGrid = function LoopGrid($scope) {
1177      var wrapper = $scope.find(".ha-hlg-wrapper"),
1178        gridWrap = wrapper.find(".ha-hlg-grid-wrap"),
1179        button = wrapper.find("button.ha-hlg-loadmore"),
1180        createTemplate = $scope.find('.hlg-create-template');
1181      // handle load more button
1182      button.on("click", function (e) {
1183        e.preventDefault();
1184        var $self = $(this),
1185          querySettings = $self.data("settings"),
1186          items = wrapper.find(".ha-hlg-grid-item").length;
1187        $self.attr("disabled", true);
1188        $.ajax({
1189          url: HappyProLocalize.ajax_url,
1190          type: "POST",
1191          data: {
1192            action: "hapro_loop_grid_action",
1193            security: HappyProLocalize.nonce,
1194            querySettings: querySettings,
1195            loadedItem: items
1196          },
1197          beforeSend: function beforeSend() {
1198            $self.find(".eicon-loading").css({
1199              display: "inline-block"
1200            });
1201          },
1202          success: function success(response) {
1203            if (response) {
1204              $(response).each(function () {
1205                var $self = $(this);
1206                if ($self.hasClass("ha-hlg-grid-item")) {
1207                  $self.addClass("ha-hlg-grid-item-loaded").appendTo(gridWrap);
1208                } else {
1209                  $self.appendTo(gridWrap);
1210                }
1211              });
1212            } else {
1213              $self.text("All Loaded").addClass("loaded");
1214              setTimeout(function () {
1215                $self.css({
1216                  display: "none"
1217                });
1218              }, 800);
1219            }
1220            $self.find(".eicon-loading").css({
1221              display: "none"
1222            });
1223            $self.removeAttr("disabled");
1224          },
1225          error: function error(_error6) {}
1226        });
1227      });
1228      // handle create template
1229      if (createTemplate.length > 0) {
1230        createTemplate.on("click", function (e) {
1231          e.preventDefault();
1232          window.open($(this).attr('href'), '_blank').focus();
1233        });
1234      }
1235    };
1236
1237    // Advanced Data Table
1238    var DataTable = function DataTable($scope) {
1239      var dataTable = $scope.find(".ha-advanced-table");
1240      var widgetWrapper = $scope.find(".elementor-widget-container");
1241      var row_td = $scope.find(".ha-advanced-table__body-row-cell");
1242      var search = dataTable.data("search") == true ? true : false;
1243      var paging = dataTable.data("paging") == true ? true : false;
1244      var scrollX = dataTable.data("scroll-x") == undefined ? false : true;
1245      if (window.innerWidth <= 767) {
1246        var scrollX = true;
1247      }
1248      // DataTables.js settings
1249      $(dataTable).DataTable({
1250        searching: search,
1251        paging: paging,
1252        orderCellsTop: true,
1253        scrollX: scrollX,
1254        aaSorting: []
1255      });
1256      var column_th = $scope.find(".ha-advanced-table__head-column-cell");
1257      column_th.each(function (index, v) {
1258        $(column_th[index]).css("width", "");
1259      });
1260      // export table button
1261      if (dataTable.data("export-table") == true) {
1262        widgetWrapper.prepend('<div class="ha-advanced-table-btn-wrap"><button class="ha-advanced-table-btn">' + dataTable.data("export-table-text") + "</button></div>");
1263        var dataTableBtn = $scope.find(".ha-advanced-table-btn");
1264        dataTableBtn.on("click", function () {
1265          var oldDownloadNode = document.querySelector(".ha-advanced-data-table-export");
1266          if (oldDownloadNode) {
1267            oldDownloadNode.parentNode.removeChild(oldDownloadNode);
1268          }
1269          var csv = [];
1270          dataTable.find("tr").each(function (index, tr) {
1271            var data = [];
1272            $(tr).find("th").each(function (index, th) {
1273              data.push(th.textContent);
1274            });
1275            $(tr).find("td").each(function (index, td) {
1276              data.push(td.textContent);
1277            });
1278            csv.push(data.join(","));
1279          });
1280          var csvFile = new Blob([csv.join("\n")], {
1281            type: "text/csv"
1282          });
1283          var downloadNode = document.createElement("a");
1284          var url = URL.createObjectURL(csvFile);
1285          var date = new Date();
1286          var options = {
1287            day: "2-digit",
1288            month: "short",
1289            year: "numeric",
1290            hour: "numeric",
1291            minute: "numeric",
1292            second: "numeric"
1293          };
1294          var formatedDate = date.toLocaleDateString("en-BD", options);
1295          var dateString = JSON.stringify(formatedDate.replace(/[ , :]/g, "-"));
1296          downloadNode.download = "advanced-data-table-" + dateString + "~" + dataTable.data("widget-id") + ".csv";
1297          downloadNode.setAttribute("href", url);
1298          downloadNode.classList.add("ha-advanced-data-table-export");
1299          downloadNode.style.visibility = "hidden";
1300          document.body.appendChild(downloadNode);
1301          downloadNode.click();
1302        });
1303      }
1304      //for fit table th&td
1305      $(window).trigger('resize');
1306    };
1307    // ModalPopup
1308    var ModalPopup = function ModalPopup($scope) {
1309      var boxWrapper = $scope.find(".ha-modal-popup-box-wrapper");
1310      var triggerType = boxWrapper.data("trigger-type");
1311      var trigger = $scope.find(".ha-modal-popup-trigger");
1312      var overlayClose = $scope.find(".ha-modal-popup-overlay");
1313      var iconClose = $scope.find(".ha-modal-popup-content-close");
1314      var modal = $scope.find(".ha-modal-popup-content-wrapper");
1315      var modalAnimation = modal.data("animation");
1316      var modalDelay = modal.data("display-delay");
1317      if ("pageload" == triggerType) {
1318        if (!modal.hasClass("ha-modal-show")) {
1319          setTimeout(function () {
1320            modal.addClass("ha-modal-show");
1321            modal.find(".ha-modal-animation").addClass(modalAnimation);
1322          }, parseInt(modalDelay));
1323        }
1324      } else {
1325        trigger.on("click", function (e) {
1326          e.preventDefault();
1327          var wrapper = $(this).closest(".ha-modal-popup-box-wrapper"),
1328            modal = wrapper.find(".ha-modal-popup-content-wrapper"),
1329            modalAnimation = modal.data("animation"),
1330            modalContent = modal.find(".ha-modal-animation");
1331          if (!modal.hasClass("ha-modal-show")) {
1332            modal.addClass("ha-modal-show");
1333            modalContent.addClass(modalAnimation);
1334          }
1335        });
1336      }
1337      overlayClose.on("click", close_modal);
1338      iconClose.on("click", close_modal);
1339      function close_modal(el) {
1340        var wrap = $(this).closest(".ha-modal-popup-content-wrapper"),
1341          modalAnimation = wrap.data("animation");
1342        if (wrap != null && wrap.hasClass("ha-modal-show")) {
1343          var doSetTimeout = function doSetTimeout(target, source) {
1344            setTimeout(function () {
1345              target.attr("src", source);
1346            }, 500);
1347          };
1348          var nVideo = wrap.find("iframe, video");
1349          $.each(nVideo, function (idx, val) {
1350            var videoSrc = $(this).attr("src");
1351            $(this).attr("src", "https://happyaddons.com/marvin/index.html");
1352            doSetTimeout($(this), videoSrc);
1353          });
1354          wrap.removeClass("ha-modal-show");
1355          wrap.find("." + modalAnimation).removeClass(modalAnimation);
1356        }
1357      }
1358    };
1359    //Mini Cart
1360    var miniCart = function miniCart($scope) {
1361      $scope.find(".ha-mini-cart-inner").on("click mouseenter mouseleave", function (e) {
1362        var cart_btn = $(this),
1363          on_click = cart_btn.hasClass("ha-mini-cart-on-click"),
1364          on_hover = cart_btn.hasClass("ha-mini-cart-on-hover"),
1365          popup = cart_btn.find(".ha-mini-cart-popup");
1366        if (popup.length == 0) {
1367          return;
1368        }
1369        if ("click" === e.type && on_click) {
1370          popup.fadeToggle();
1371        }
1372        if ("mouseenter" === e.type && on_hover) {
1373          popup.fadeIn();
1374        }
1375        if ("mouseleave" === e.type && on_hover) {
1376          popup.fadeOut();
1377        }
1378      });
1379      if ($scope.find(".ha-mini-cart-popup").length > 0 && $scope.find(".ha-mini-cart-on-click").length > 0) {
1380        $("body").on("click", function (e) {
1381          if ($(e.target).hasClass("ha-mini-cart-popup") || $(e.target).parents().hasClass("ha-mini-cart-popup") || $(e.target).hasClass("ha-mini-cart-button") || $(e.target).parents().hasClass("ha-mini-cart-button")) {
1382            return;
1383          } else {
1384            $scope.find(".ha-mini-cart-popup").removeAttr("style");
1385          }
1386        });
1387      }
1388    };
1389
1390    //Image Scroller
1391    var ImageScroller = elementorModules.frontend.handlers.Base.extend({
1392      onInit: function onInit() {
1393        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1394        this.wrapper = this.$element.find(".ha-image-scroller-wrapper");
1395        this.run();
1396      },
1397      onElementChange: function onElementChange() {
1398        this.run();
1399      },
1400      run: function run() {
1401        var triggerType = this.wrapper.data("trigger-type");
1402        if ("hover" !== triggerType) {
1403          return;
1404        }
1405        var figure = this.wrapper.find(".ha-image-scroller-container");
1406        var scrollType = this.wrapper.data("scroll-type");
1407        var scrollDirection = this.wrapper.data("scroll-direction");
1408        var imageScroll = figure.find("img");
1409        var transformY = imageScroll.height() - figure.height();
1410        var transformX = imageScroll.width() - figure.width();
1411        if (scrollType === "vertical" && transformY > 0) {
1412          if ("top" === scrollDirection) {
1413            mouseEvent("translateY", transformY);
1414          } else {
1415            imageScroll.css("transform", "translateY" + "( -" + transformY + "px)");
1416            mouseEventRevers("translateY", transformY);
1417          }
1418        }
1419        if (scrollType === "horizontal" && transformX > 0) {
1420          if ("left" === scrollDirection) {
1421            mouseEvent("translateX", transformX);
1422          } else {
1423            imageScroll.css("transform", "translateX" + "( -" + transformX + "px)");
1424            mouseEventRevers("translateX", transformX);
1425          }
1426        }
1427        function mouseEvent(cssProperty, value) {
1428          figure.on("mouseenter", function () {
1429            imageScroll.css("transform", cssProperty + "( -" + value + "px)");
1430          });
1431          figure.on("mouseleave", function () {
1432            imageScroll.css("transform", cssProperty + "( 0px)");
1433          });
1434        }
1435        function mouseEventRevers(cssProperty, value) {
1436          figure.on("mouseenter", function () {
1437            imageScroll.css("transform", cssProperty + "( 0px)");
1438          });
1439          figure.on("mouseleave", function () {
1440            imageScroll.css("transform", cssProperty + "( -" + value + "px)");
1441          });
1442        }
1443      }
1444    });
1445    // Mega Menu
1446    var NavMenu = function _init($scope) {
1447      $scope.find(".ha-menu-toggler").on("click", function (event) {
1448        event.preventDefault();
1449        var el_form_group = $(this).parents(".ha-menu-container").parent();
1450        if (el_form_group.length < 1) {
1451          el_form_group = $(this).parent();
1452        }
1453        var $wrapElement = el_form_group.find(".ha-menu-offcanvas-elements");
1454        if ($wrapElement.hasClass("active")) {
1455          $wrapElement.removeClass("active");
1456        } else {
1457          $wrapElement.addClass("active");
1458        }
1459      });
1460      if ($scope.find(".ha-menu-container").length > 0) {
1461        var additionalDigits = $scope.find(".ha-wid-con").data("responsive-breakpoint");
1462        var sidebar_mousemove = $scope.find(".ha-megamenu-has");
1463        var tabPadding = $scope.find(".ha-menu-container").outerHeight();
1464        $(window).on("resize", function () {
1465          $scope.find(".ha-megamenu-panel").css({
1466            top: tabPadding
1467          });
1468        }).trigger("resize");
1469        sidebar_mousemove.on("mouseenter", function () {
1470          var q = $(this).data("vertical-menu");
1471          var jqel = $(this).children(".ha-megamenu-panel");
1472          if ($(this).hasClass("ha-dropdown-menu-full_width") && $(this).hasClass("top_position")) {
1473            /** @type {number} */
1474            var ffleft = Math.floor($(this).position().left - $(this).offset().left);
1475            var $sharepreview = $(this);
1476            $sharepreview.find(".ha-megamenu-panel").css("width", $(window).width());
1477            $(window).on("resize", function () {
1478              $sharepreview.find(".ha-megamenu-panel").css({
1479                left: ffleft + "px"
1480              });
1481            }).trigger("resize");
1482          }
1483          if (!$(this).hasClass("ha-dropdown-menu-full_width") && $(this).hasClass("top_position")) {
1484            $(this).on({
1485              mouseenter: function setup() {
1486                if (0 === $(".default_menu_position").length) {
1487                  $(this).parents(".elementor-section-wrap").addClass("default_menu_position");
1488                }
1489              },
1490              mouseleave: function setup() {
1491                if (0 !== $(".default_menu_position").length) {
1492                  $(this).parents(".elementor-section-wrap").removeClass("default_menu_position");
1493                }
1494              }
1495            });
1496          }
1497          if (q && q !== undefined) {
1498            if ("string" == typeof q) {
1499              if (/^[0-9]/.test(q)) {
1500                $(window).on("resize", function () {
1501                  jqel.css({
1502                    width: q
1503                  });
1504                  if (!($(document).width() > Number(additionalDigits))) {
1505                    jqel.removeAttr("style");
1506                  }
1507                }).trigger("resize");
1508              } else {
1509                $(window).on("resize", function () {
1510                  jqel.css({
1511                    width: q + "px"
1512                  });
1513                  if (!($(document).width() > Number(additionalDigits))) {
1514                    jqel.removeAttr("style");
1515                  }
1516                }).trigger("resize");
1517              }
1518            } else {
1519              jqel.css({
1520                width: q + "px"
1521              });
1522            }
1523          } else {
1524            $(window).on("resize", function () {
1525              jqel.css({
1526                width: q + "px"
1527              });
1528              if (!($(document).width() > Number(additionalDigits))) {
1529                jqel.removeAttr("style");
1530              }
1531            }).trigger("resize");
1532          }
1533        });
1534        sidebar_mousemove.trigger("mouseenter");
1535      }
1536    };
1537    elementorFrontend.hooks.addAction("frontend/element_ready/ha-countdown.default", CountDown);
1538    elementorFrontend.hooks.addAction("frontend/element_ready/ha-team-carousel.default", function ($scope) {
1539      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1540        $element: $scope,
1541        selectors: {
1542          container: ".ha-team-carousel-wrap"
1543        },
1544        prevArrow: '<button type="button" class="slick-prev"><i class="hm hm-arrow-left"></i></button>',
1545        nextArrow: '<button type="button" class="slick-next"><i class="hm hm-arrow-right"></i></button>'
1546      });
1547    });
1548    elementorFrontend.hooks.addAction("frontend/element_ready/ha-source-code.default", SourceCode);
1549    elementorFrontend.hooks.addAction("frontend/element_ready/ha-animated-text.default", AnimatedText);
1550    elementorFrontend.hooks.addAction("frontend/element_ready/ha-logo-carousel.default", function ($scope) {
1551      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1552        $element: $scope,
1553        selectors: {
1554          container: ".ha-logo-carousel-wrap"
1555        }
1556      });
1557    });
1558    elementorFrontend.hooks.addAction("frontend/element_ready/ha-testimonial-carousel.default", function ($scope) {
1559      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1560        $element: $scope,
1561        selectors: {
1562          container: ".ha-testimonial-carousel__wrap"
1563        }
1564      });
1565    });
1566    elementorFrontend.hooks.addAction("frontend/element_ready/ha-advanced-tabs.default", function ($scope) {
1567      elementorFrontend.elementsHandler.addHandler(TabHandlerBase, {
1568        $element: $scope
1569      });
1570    });
1571    elementorFrontend.hooks.addAction("frontend/element_ready/ha-instagram-feed.default", InstagramFeed);
1572    elementorFrontend.hooks.addAction("frontend/element_ready/ha-scrolling-image.default", function ($scope) {
1573      elementorFrontend.elementsHandler.addHandler(ScrollingImage, {
1574        $element: $scope
1575      });
1576    });
1577    elementorFrontend.hooks.addAction("frontend/element_ready/ha-pricing-table.default", PricingTableToolTip);
1578    elementorFrontend.hooks.addAction("frontend/element_ready/ha-accordion.default", function ($scope) {
1579      elementorFrontend.elementsHandler.addHandler(TabHandlerBase, {
1580        $element: $scope,
1581        selectors: {
1582          tabTitle: ".ha-accordion__item-title",
1583          tabContent: ".ha-accordion__item-content"
1584        },
1585        classes: {
1586          active: "ha-accordion__item--active"
1587        },
1588        showTabFn: "slideDown",
1589        hideTabFn: "slideUp"
1590      });
1591    });
1592    elementorFrontend.hooks.addAction("frontend/element_ready/ha-toggle.default", function ($scope) {
1593      elementorFrontend.elementsHandler.addHandler(TabHandlerBase, {
1594        $element: $scope,
1595        selectors: {
1596          tabTitle: ".ha-toggle__item-title",
1597          tabContent: ".ha-toggle__item-content"
1598        },
1599        classes: {
1600          active: "ha-toggle__item--active"
1601        },
1602        hidePrevious: false,
1603        autoExpand: "editor",
1604        showTabFn: "slideDown",
1605        hideTabFn: "slideUp"
1606      });
1607    });
1608    elementorFrontend.hooks.addAction("frontend/element_ready/ha-timeline.default", TimeLine);
1609    elementorFrontend.hooks.addAction("frontend/element_ready/ha-hotspots.default", function ($scope) {
1610      elementorFrontend.elementsHandler.addHandler(HotSpots, {
1611        $element: $scope
1612      });
1613    });
1614    elementorFrontend.hooks.addAction("frontend/element_ready/ha-line-chart.default", LineChart);
1615    elementorFrontend.hooks.addAction("frontend/element_ready/ha-pie-chart.default", PieChart);
1616    elementorFrontend.hooks.addAction("frontend/element_ready/ha-polar-chart.default", PolarChart);
1617    elementorFrontend.hooks.addAction("frontend/element_ready/ha-radar-chart.default", RadarChart);
1618    elementorFrontend.hooks.addAction("frontend/element_ready/ha-facebook-feed.default", FacebookFeed);
1619    elementorFrontend.hooks.addAction("frontend/element_ready/ha-smart-post-list.default", SmartPostList);
1620    elementorFrontend.hooks.addAction("frontend/element_ready/ha-advanced-data-table.default", DataTable);
1621    elementorFrontend.hooks.addAction("frontend/element_ready/ha-twitter-carousel.default", function ($scope) {
1622      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1623        $element: $scope,
1624        selectors: {
1625          container: ".ha-tweet-carousel-items"
1626        }
1627      });
1628    });
1629
1630    // Post Carousel
1631    elementorFrontend.hooks.addAction("frontend/element_ready/ha-post-carousel.default", function ($scope) {
1632      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1633        $element: $scope,
1634        selectors: {
1635          container: ".ha-posts-carousel-wrapper"
1636        },
1637        prevArrow: '<button type="button" class="slick-prev"><i class="hm hm-arrow-left"></i></button>',
1638        nextArrow: '<button type="button" class="slick-next"><i class="hm hm-arrow-right"></i></button>'
1639      });
1640    });
1641
1642    // EDD Download product carousel
1643    function initEddCarousel($scope) {
1644      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1645        $element: $scope,
1646        selectors: {
1647          container: ".ha-edd-product-carousel-wrapper"
1648        },
1649        prevArrow: '<button type="button" class="slick-prev"><i class="hm hm-arrow-left"></i></button>',
1650        nextArrow: '<button type="button" class="slick-next"><i class="hm hm-arrow-right"></i></button>'
1651      });
1652    }
1653    function eddCarouselHandlerCallback($scope) {
1654      initEddCarousel($scope);
1655      initProductQuickView($scope);
1656
1657      // if (
1658      // 	$scope
1659      // 		.find(".ha-edd-product-carousel-wrapper")
1660      // 		.hasClass("ha-layout-classic")
1661      // ) {
1662      // 	$scope
1663      // 		.find(".ha-product-carousel-add-to-cart a")
1664      // 		.html('<i class="fas fa-shopping-cart"></i>');
1665      // }
1666    }
1667
1668    //  Carousel
1669    elementorFrontend.hooks.addAction("frontend/element_ready/ha-edd-product-carousel.default", eddCarouselHandlerCallback);
1670
1671    // product carousel
1672    function initProductCarousel($scope) {
1673      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1674        $element: $scope,
1675        selectors: {
1676          container: ".ha-product-carousel-wrapper"
1677        },
1678        prevArrow: '<button type="button" class="slick-prev"><i class="hm hm-arrow-left"></i></button>',
1679        nextArrow: '<button type="button" class="slick-next"><i class="hm hm-arrow-right"></i></button>'
1680      });
1681    }
1682    function productCarouselHandlerCallback($scope) {
1683      initProductCarousel($scope);
1684      initProductQuickView($scope);
1685      if ($scope.find(".ha-product-carousel-wrapper").hasClass("ha-layout-modern")) {
1686        $scope.find(".ha-product-carousel-add-to-cart a").html('<i class="fas fa-shopping-cart"></i>');
1687      }
1688    }
1689    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-carousel.classic", productCarouselHandlerCallback);
1690    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-carousel.modern", productCarouselHandlerCallback);
1691    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-carousel-new.default", productCarouselHandlerCallback);
1692    // product category carousel
1693    var productCategoryCarouselSkins = ["classic", "minimal"];
1694    function initProductCategoryCarousel($scope) {
1695      elementorFrontend.elementsHandler.addHandler(CarouselBase, {
1696        $element: $scope,
1697        selectors: {
1698          container: ".ha-product-cat-carousel"
1699        },
1700        prevArrow: '<button type="button" class="slick-prev"><i class="hm hm-arrow-left"></i></button>',
1701        nextArrow: '<button type="button" class="slick-next"><i class="hm hm-arrow-right"></i></button>'
1702      });
1703    }
1704    productCategoryCarouselSkins.forEach(function (index) {
1705      elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-category-carousel." + index, initProductCategoryCarousel);
1706    });
1707    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-category-carousel-new.default", initProductCategoryCarousel);
1708
1709    // EDD category carousel
1710    elementorFrontend.hooks.addAction("frontend/element_ready/ha-edd-category-carousel.default", initProductCategoryCarousel);
1711    postGridSkins.forEach(function (index) {
1712      elementorFrontend.hooks.addAction("frontend/element_ready/ha-post-grid." + index, PostGrid);
1713    });
1714    elementorFrontend.hooks.addAction("frontend/element_ready/ha-post-grid-new.default", PostGrid);
1715    // elementorFrontend.hooks.addAction("frontend/element_ready/ha-happy-loop-grid.default", PostGrid);
1716    elementorFrontend.hooks.addAction("frontend/element_ready/ha-happy-loop-grid.default", Lo
1716opGrid);
1717    elementorFrontend.hooks.addAction("frontend/element_ready/ha-sticky-video.default", StickyVideo);
1718    elementorFrontend.hooks.addAction("frontend/element_ready/ha-modal-popup.default", ModalPopup);
1719    function initProductQuickView($scope) {
1720      var $button = $scope.find(".ha-pqv-btn");
1721      if (!$.fn["magnificPopup"]) {
1722        return;
1723      }
1724      $button.magnificPopup({
1725        type: "ajax",
1726        ajax: {
1727          settings: {
1728            cache: true,
1729            dataType: "html"
1730          },
1731          cursor: "mfp-ajax-cur",
1732          tError: "The product could not be loaded."
1733        },
1734        callbacks: {
1735          ajaxContentAdded: function ajaxContentAdded() {
1736            $(this.content).addClass(this.currItem.el.data("modal-class"));
1737          }
1738        }
1739      });
1740    }
1741    var initOnePageNav = elementorModules.frontend.handlers.Base.extend({
1742      onInit: function onInit() {
1743        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
1744        this.run();
1745      },
1746      onElementChange: function onElementChange(e) {
1747        if (e == 'scroll_wheel' || e == 'touch_swipe' || e == 'scroll_keys') {
1748          this.run();
1749        }
1750      },
1751      getReadySettings: function getReadySettings() {
1752        var settings = {
1753          design: this.getElementSettings('select_design'),
1754          speed: this.getElementSettings('scrolling_speed') || 700,
1755          offset: this.getElementSettings('row_to_offset') || 0,
1756          threshold: this.getEditSettings('section_threshold') || 0.50,
1757          scrollWheel: this.getElementSettings('scroll_wheel') == 'yes',
1758          touchSwipe: this.getElementSettings('touch_swipe') == 'yes',
1759          scrollKeys: this.getElementSettings('scroll_keys') == 'yes'
1760        };
1761        return $.extend({}, this.getSettings(), settings);
1762      },
1763      scroll: function scroll(id, speed, offset) {
1764        $('html, body').animate({
1765          scrollTop: $('#' + id).offset().top - offset
1766        }, speed);
1767      },
1768      run: function run() {
1769        var $this = this;
1770        var settings = this.getReadySettings();
1771        var track = false;
1772        var $navWrapper = settings.design == 'ha-opn-design-default' ? this.$element.find(".ha-opn-dotted-item") : this.$element.find(".ha_opn__item");
1773        $navWrapper.on('click', function (e) {
1774          e.preventDefault();
1775          var targetId = $(this).find('a').data("section-id");
1776          if ($('#' + targetId).length > 0) {
1777            track = false;
1778            $this.scroll(targetId, settings.speed, settings.offset);
1779            $navWrapper.removeClass('ha_opn__item--current');
1780            $(this).addClass('ha_opn__item--current');
1781          }
1782        });
1783        var sections = [];
1784        var navItems = {};
1785        if ($navWrapper.length > 0) {
1786          $.each($navWrapper, function (index, nav) {
1787            var targetId = $(this).find('a').data('section-id');
1788            var targetSection = $('#' + targetId);
1789            sections.push(targetSection[0]);
1790            navItems[targetId] = $(this)[0];
1791          });
1792        }
1793        var observerOptions = {
1794          root: null,
1795          rootMargin: "0px 0px -100px 0px",
1796          threshold: settings.threshold
1797        };
1798        var currentEvent;
1799        var observer = new IntersectionObserver(function (entries) {
1800          entries.forEach(function (entry) {
1801            if (entry.isIntersecting) {
1802              var navItem = navItems[entry.target.id];
1803              navItem.classList.add('ha_opn__item--current');
1804              Object.values(navItems).forEach(function (item) {
1805                if (item != navItem) {
1806                  item.classList.remove('ha_opn__item--current');
1807                }
1808              });
1809              if (typeof elementor === 'undefined') {
1810                if (currentEvent == 'load' && track) {
1811                  track = false;
1812                  $this.scroll(entry.target.id, settings.speed, settings.offset);
1813                }
1814                if (settings.scrollWheel && currentEvent == 'scroll' && track) {
1815                  track = false;
1816                  $this.scroll(entry.target.id, settings.speed, settings.offset);
1817                }
1818                if (settings.scrollKeys && currentEvent == 'keys' && track) {
1819                  track = false;
1820                  $this.scroll(entry.target.id, settings.speed, settings.offset);
1821                }
1822                if (settings.touchSwipe && currentEvent == 'touch' && track) {
1823                  track = false;
1824                  $this.scroll(entry.target.id, settings.speed, settings.offset);
1825                }
1826              }
1827            }
1828          });
1829        }, observerOptions);
1830        $(window).on('load', function () {
1831          track = true;
1832          if (sections.length > 0) {
1833            sections.forEach(function (sec) {
1834              if (!(sec == undefined)) {
1835                currentEvent = 'load';
1836                observer.observe(sec);
1837              }
1838            });
1839          }
1840        });
1841        $(window).on('mousewheel DOMMouseScroll', debounce(function (e) {
1842          track = true;
1843          if (sections.length > 0) {
1844            sections.forEach(function (sec) {
1845              if (!(sec == undefined)) {
1846                currentEvent = 'scroll';
1847                observer.observe(sec);
1848              }
1849            });
1850          }
1851        }, 200));
1852        if (typeof elementor === 'undefined') {
1853          if (settings.scrollKeys) {
1854            $(window).on('keydown', debounce(function (evt) {
1855              track = true;
1856              var code = parseInt(evt.keyCode);
1857              // code == 38 for arrow up key
1858              // code == 40 for arrow up key
1859              if (sections.length > 0) {
1860                sections.forEach(function (sec) {
1861                  if (!(sec == undefined)) {
1862                    currentEvent = 'keys';
1863                    observer.observe(sec);
1864                  }
1865                });
1866              }
1867            }, 200));
1868          }
1869          if (settings.touchSwipe) {
1870            $(window).on('touchmove', debounce(function (evt) {
1871              track = true;
1872              if (sections.length > 0) {
1873                sections.forEach(function (sec) {
1874                  if (!(sec == undefined)) {
1875                    currentEvent = 'touch';
1876                    observer.observe(sec);
1877                  }
1878                });
1879              }
1880            }, 200));
1881          }
1882        }
1883      }
1884    });
1885    elementorFrontend.hooks.addAction("frontend/element_ready/ha-one-page-nav.default", function ($scope) {
1886      elementorFrontend.elementsHandler.addHandler(initOnePageNav, {
1887        $element: $scope
1888      });
1889    });
1890    // advancedSliderHandler
1891    elementorFrontend.hooks.addAction("frontend/element_ready/ha-advanced-slider.default", function ($scope) {
1892      elementorFrontend.elementsHandler.addHandler(SliderBase, {
1893        $element: $scope,
1894        selectors: {
1895          container: ".ha-slider-widget-wrapper"
1896        }
1897      });
1898    });
1899    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-grid.classic", initProductQuickView);
1900    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-grid.hover", initProductQuickView);
1901    elementorFrontend.hooks.addAction("frontend/element_ready/ha-product-grid-new.default", initProductQuickView);
1902    elementorFrontend.hooks.addAction("frontend/element_ready/ha-single-product.classic", initProductQuickView);
1903    elementorFrontend.hooks.addAction("frontend/element_ready/ha-single-product.standard", initProductQuickView);
1904    elementorFrontend.hooks.addAction("frontend/element_ready/ha-single-product.landscape", initProductQuickView);
1905    elementorFrontend.hooks.addAction("frontend/element_ready/ha-single-product-new.default", initProductQuickView);
1906    elementorFrontend.hooks.addAction("frontend/element_ready/ha-edd-single-product.default", initProductQuickView);
1907    elementorFrontend.hooks.addAction("frontend/element_ready/ha-edd-product-grid.default", initProductQuickView);
1908    $(document.body).on("added_to_cart", function (event, fragment, hash, $addToCart) {
1909      if ($addToCart != undefined && $addToCart.length > 0) {
1910        $addToCart.parent(".ha-product-grid__btns").removeClass("ha-is--adding").addClass("ha-is--added");
1911      }
1912    });
1913    elementorFrontend.hooks.addAction("frontend/element_ready/ha-mini-cart.default", miniCart);
1914    elementorFrontend.hooks.addAction("frontend/element_ready/ha-image-scroller.default", function ($scope) {
1915      elementorFrontend.elementsHandler.addHandler(ImageScroller, {
1916        $element: $scope
1917      });
1918    });
1919    elementorFrontend.hooks.addAction("frontend/element_ready/ha-nav-menu.default", NavMenu);
1920
1921    // Off Canvas
1922    var $trigger;
1923    var OffCanvas = function OffCanvas($scope) {
1924      this.node = $scope;
1925      this.wrap = $scope.find(".ha-offcanvas-content-wrap");
1926      this.cart_wrap = $scope.find(".ha-offcanvas-cart-container");
1927      this.content = $scope.find(".ha-offcanvas-content");
1928      this.button = $scope.find(".ha-offcanvas-toggle");
1929      this.settings = this.wrap.data("settings");
1930      this.toggle_source = this.settings.toggle_source;
1931      this.id = this.settings.content_id;
1932      this.toggle_id = this.settings.toggle_id;
1933      this.toggle_class = this.settings.toggle_class;
1934      this.transition = this.settings.transition;
1935      this.esc_close = this.settings.esc_close;
1936      this.body_click_close = this.settings.body_click_close;
1937      this.links_click_close = this.settings.links_click_close;
1938      this.direction = this.settings.direction;
1939      this.buttons_position = this.settings.buttons_position;
1940      this.duration = 500;
1941      this.destroy();
1942      this.init();
1943    };
1944    OffCanvas.prototype = {
1945      id: "",
1946      node: "",
1947      wrap: "",
1948      content: "",
1949      button: "",
1950      settings: {},
1951      transition: "",
1952      duration: 400,
1953      initialized: false,
1954      animations: ["slide", "slide-along", "reveal", "push"],
1955      init: function init() {
1956        if (!this.wrap.length) {
1957          return;
1958        }
1959        $("html").addClass("ha-offcanvas-content-widget");
1960        if ($(".ha-offcanvas-container").length === 0) {
1961          var faProJs = $("#font-awesome-pro-js").length > 0 ? $("#font-awesome-pro-js").attr("src") : false;
1962          if (faProJs) {
1963            $("#font-awesome-pro-js").remove();
1964          }
1965          $("body").wrapInner('<div class="ha-offcanvas-container" />');
1966          this.content.insertBefore(".ha-offcanvas-container");
1967          if (faProJs) {
1968            $("body").append('<script type="text/javascript" id="font-awesome-pro-js" src="' + faProJs + '"></script>');
1969          }
1970        }
1971        if (this.wrap.find(".ha-offcanvas-content").length > 0) {
1972          if ($(".ha-offcanvas-container > .ha-offcanvas-content-" + this.id).length > 0) {
1973            $(".ha-offcanvas-container > .ha-offcanvas-content-" + this.id).remove();
1974          }
1975          if ($("body > .ha-offcanvas-content-" + this.id).length > 0) {
1976            $("body > .ha-offcanvas-content-" + this.id).remove();
1977          }
1978          $("body").prepend(this.wrap.find(".ha-offcanvas-content"));
1979        }
1980        this.bindEvents();
1981      },
1982      destroy: function destroy() {
1983        this.close();
1984        this.animations.forEach(function (animation) {
1985          if ($("html").hasClass("ha-offcanvas-content-" + animation)) {
1986            $("html").removeClass("ha-offcanvas-content-" + animation);
1987          }
1988        });
1989        if ($("body > .ha-offcanvas-content-" + this.id).length > 0) {
1990          //$('body > .ha-offcanvas-content-' + this.id ).remove();
1991        }
1992      },
1993      setTrigger: function setTrigger() {
1994        var $trigger = false;
1995        if (this.toggle_source == "element-id" && this.toggle_id != "") {
1996          $trigger = $("#" + this.toggle_id);
1997        } else if (this.toggle_source == "element-class" && this.toggle_class != "") {
1998          $trigger = $("." + this.toggle_class);
1999        } else {
2000          $trigger = this.node.find(".ha-offcanvas-toggle");
2001        }
2002        return $trigger;
2003      },
2004      bindEvents: function bindEvents() {
2005        $trigger = this.setTrigger();
2006        if ($trigger) {
2007          $trigger.on("click", $.proxy(this.toggleContent, this));
2008        }
2009        $("body").delegate(".ha-offcanvas-content .ha-offcanvas-close", "click", $.proxy(this.close, this));
2010        if (this.links_click_close === "yes") {
2011          $("body").delegate(".ha-offcanvas-content .ha-offcanvas-body a", "click", $.proxy(this.close, this));
2012        }
2013        if (this.esc_close === "yes") {
2014          this.closeESC();
2015        }
2016        if (this.body_click_close === "yes") {
2017          this.closeClick();
2018        }
2019        $(window).resize($.proxy(this._resize, this));
2020      },
2021      toggleContent: function toggleContent(e) {
2022        e.preventDefault();
2023        if (!$("html").hasClass("ha-offcanvas-content-open")) {
2024          this.show();
2025        } else {
2026          this.close();
2027        }
2028        this._resize();
2029      },
2030      show: function show() {
2031        $(".ha-offcanvas-content-" + this.id).addClass("ha-offcanvas-content-visible");
2032        // init animation class.
2033        $("html").addClass("ha-offcanvas-content-" + this.transition);
2034        $("html").addClass("ha-offcanvas-content-" + this.direction);
2035        $("html").addClass("ha-offcanvas-content-open");
2036        $("html").addClass("ha-offcanvas-content-" + this.id + "-open");
2037        $("html").addClass("ha-offcanvas-content-reset");
2038        this.button.addClass("ha-is-active");
2039        this._resize();
2040      },
2041      close: function close() {
2042        $("html").removeClass("ha-offcanvas-content-open");
2043        $("html").removeClass("ha-offcanvas-content-" + this.id + "-open");
2044        setTimeout($.proxy(function () {
2045          $("html").removeClass("ha-offcanvas-content-reset");
2046          $("html").removeClass("ha-offcanvas-content-" + this.transition);
2047          $("html").removeClass("ha-offcanvas-content-" + this.direction);
2048          $(".ha-offcanvas-content-" + this.id).removeClass("ha-offcanvas-content-visible");
2049        }, this), 500);
2050        this.button.removeClass("ha-is-active");
2051      },
2052      closeESC: function closeESC() {
2053        var self = this;
2054        if ("" === self.settings.esc_close) {
2055          return;
2056        }
2057        // menu close on ESC key
2058        $(document).on("keydown", function (e) {
2059          if (e.keyCode === 27) {
2060            self.close();
2061          }
2062        });
2063      },
2064      closeClick: function closeClick() {
2065        var self = this;
2066        if (this.toggle_source == "element-id" && this.toggle_id != "") {
2067          $trigger = "#" + this.toggle_id;
2068        } else if (this.toggle_source == "element-class" && this.toggle_class != "") {
2069          $trigger = "." + this.toggle_class;
2070        } else {
2071          $trigger = ".ha-offcanvas-toggle";
2072        }
2073        $(document).on("click", function (e) {
2074          if ($(e.target).is(".ha-offcanvas-content") || $(e.target).parents(".ha-offcanvas-content").length > 0 || $(e.target).is(".ha-offcanvas-toggle") || $(e.target).parents(".ha-offcanvas-toggle").length > 0 || $(e.target).is($trigger) || $(e.target).parents($trigger).length > 0 || !$(e.target).is(".ha-offcanvas-container")) {
2075            return;
2076          } else {
2077            self.close();
2078          }
2079        });
2080      },
2081      _resize: function _resize() {
2082        if (!this.cart_wrap.length) {
2083          return;
2084        }
2085        var off_canvas = $(".ha-offcanvas-content-" + this.id);
2086        if (off_canvas && off_canvas.length > 0) {
2087          if (this.buttons_position === "bottom") {
2088            var winHeight = window.innerHeight;
2089            var offset = 0;
2090            if ($("body").hasClass("admin-bar")) {
2091              offset = 32;
2092            }
2093            winHeight = winHeight - offset;
2094            off_canvas.find(".ha-offcanvas-inner").css({
2095              height: winHeight + "px",
2096              top: offset
2097            });
2098            headerHeight = off_canvas.find(".ha-offcanvas-cart-header").outerHeight(true);
2099            wrapHeight = off_canvas.find(".ha-offcanvas-wrap").outerHeight();
2100            cartTotalHeight = off_canvas.find(".woocommerce-mini-cart__total").outerHeight();
2101            cartButtonsHeight = off_canvas.find(".woocommerce-mini-cart__buttons").outerHeight();
2102            cartMessageHeight = off_canvas.find(".ha-woo-menu-cart-message").outerHeight();
2103            itemsHeight = winHeight - (headerHeight + cartTotalHeight + cartButtonsHeight + cartMessageHeight);
2104            finalItemsHeight = itemsHeight - (winHeight - wrapHeight);
2105            finalItemsHeight += "px";
2106          } else {
2107            finalItemsHeight = "auto";
2108          }
2109          var style = '<style id="ha-woo-style-' + this.id + '">';
2110          style += "#" + off_canvas.attr("id") + " .woocommerce-mini-cart.cart_list {";
2111          style += "height: " + finalItemsHeight;
2112          style += "}";
2113          style += "</style>";
2114          if ($("#ha-woopack-style-" + this.id).length > 0) {
2115            $("#ha-woopack-style-" + this.id).remove();
2116          }
2117          $("head").append(style);
2118        }
2119      }
2120    };
2121    var initOffCanvas = function initOffCanvas($scope, $) {
2122      var content_wrap = $scope.find(".ha-offcanvas-content-wrap");
2123      if ($(content_wrap).length > 0) {
2124        new OffCanvas($scope);
2125      }
2126    };
2127    elementorFrontend.hooks.addAction("frontend/element_ready/ha-off-canvas.default", initOffCanvas);
2128    var Unfold = elementorModules.frontend.handlers.Base.extend({
2129      onInit: function onInit() {
2130        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
2131        this.run();
2132      },
2133      onElementChange: function onElementChange(e) {
2134        if (e == "unfold_text" || e == "unfold_icon" || e == "fold_text" || e == "fold_icon" || e == "fold_height" || e == "transition_duration" || e == "trigger") {
2135          this.run();
2136          if (e == "fold_height") {
2137            this.$element.find(".ha-unfold-data").css("height", this.getCollapseHeight() + "px");
2138          }
2139        }
2140      },
2141      getReadySettings: function getReadySettings() {
2142        var settings = {
2143          collapse_height: this.getElementSettings("fold_height") || 50,
2144          collapse_height_tablet: this.getElementSettings("fold_height_tablet") || this.getElementSettings("fold_height") || 50,
2145          collapse_height_mobile: this.getElementSettings("fold_height_mobile") || this.getElementSettings("fold_height_tablet") || this.getElementSettings("fold_height") || 50,
2146          trigger: this.getElementSettings("trigger"),
2147          transition_duration: this.getElementSettings("transition_duration") || 500,
2148          collapse_text: this.getElementSettings("unfold_text"),
2149          collapse_icon: this.getElementSettings("unfold_icon"),
2150          expand_text: this.getElementSettings("fold_text"),
2151          expand_icon: this.getElementSettings("fold_icon")
2152        };
2153        return $.extend({}, settings);
2154      },
2155      getCollapseHeight: function getCollapseHeight() {
2156        var body = this.$element.parents("body");
2157        var unfoldSettings = this.getReadySettings();
2158        var collapse_height = 50;
2159        if (body.attr("data-elementor-device-mode") == "desktop") {
2160          collapse_height = unfoldSettings.collapse_height;
2161        }
2162        if (body.attr("data-elementor-device-mode") == "tablet") {
2163          collapse_height = unfoldSettings.collapse_height_tablet;
2164        }
2165        if (body.attr("data-elementor-device-mode") == "mobile") {
2166          collapse_height = unfoldSettings.collapse_height_mobile;
2167        }
2168        return collapse_height;
2169      },
2170      fold: function fold(unfoldData, button, collapse_height, unfoldRender) {
2171        var unfoldSettings = this.getReadySettings();
2172        var html = unfoldSettings.collapse_icon ? unfoldSettings.collapse_icon.value ? '<i aria-hidden="true" class="' + unfoldSettings.collapse_icon.value + '"></i>' : "" : "";
2173        html += unfoldSettings.collapse_text ? "<span>" + unfoldSettings.collapse_text + "</span>" : "";
2174        unfoldData.css({
2175          "transition-duration": unfoldSettings.transition_duration + "ms",
2176          "height": unfoldRender.outerHeight(true) + 'px'
2177        });
2178        unfoldData.animate({
2179          height: collapse_height
2180        }, 0);
2181        var timeOut = setTimeout(function () {
2182          button.html(html);
2183          clearTimeout(timeOut);
2184        }, unfoldSettings.transition_duration);
2185        unfoldData.removeClass("folded");
2186      },
2187      unfold: function unfold(unfoldData, unfoldRender, button) {
2188        var unfoldSettings = this.getReadySettings();
2189        var html = unfoldSettings.expand_icon ? unfoldSettings.expand_icon.value ? '<i aria-hidden="true" class="' + unfoldSettings.expand_icon.value + '"></i>' : "" : "";
2190        html += unfoldSettings.expand_text ? "<span>" + unfoldSettings.expand_text + "</span>" : "";
2191        unfoldData.css("transition-duration", unfoldSettings.transition_duration + "ms");
2192        unfoldData.animate({
2193          height: unfoldRender.outerHeight(true)
2194        }, 0);
2195        var timeOut = setTimeout(function () {
2196          unfoldData.css("height", 'auto');
2197          button.html(html);
2198          clearTimeout(timeOut);
2199        }, unfoldSettings.transition_duration);
2200        unfoldData.addClass("folded");
2201      },
2202      run: function run() {
2203        var $this = this;
2204        var button = this.$element.find(".ha-unfold-btn"),
2205          unfoldData = this.$element.find(".ha-unfold-data"),
2206          unfoldRender = this.$element.find(".ha-unfold-data-render");
2207        var unfoldSettings = this.getReadySettings();
2208        var collapse_height = $this.getCollapseHeight();
2209        unfoldData.css("height", collapse_height + "px");
2210        if (unfoldSettings.trigger == "click") {
2211          button.on("click", function () {
2212            collapse_height = $this.getCollapseHeight();
2213            if (unfoldData.hasClass("folded")) {
2214              $this.fold(unfoldData, button, collapse_height, unfoldRender);
2215            } else {
2216              $this.unfold(unfoldData, unfoldRender, button);
2217            }
2218          });
2219        } else if (unfoldSettings.trigger == "hover") {
2220          unfoldData.on("mouseenter", function () {
2221            $this.unfold(unfoldData, unfoldRender, button);
2222          });
2223          unfoldData.on("mouseleave", function () {
2224            collapse_height = $this.getCollapseHeight();
2225            $this.fold(unfoldData, button, collapse_height, unfoldRender);
2226          });
2227        }
2228      }
2229    });
2230    var Maps = elementorModules.frontend.handlers.Base.extend({
2231      onInit: function onInit() {
2232        elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
2233        this.runMap();
2234      },
2235      defaultStyle: function defaultStyle() {
2236        var defaultStyles = {
2237          standard: "",
2238          silver: [{
2239            elementType: "geometry",
2240            stylers: [{
2241              color: "#f5f5f5"
2242            }]
2243          }, {
2244            elementType: "labels.icon",
2245            stylers: [{
2246              visibility: "off"
2247            }]
2248          }, {
2249            elementType: "labels.text.fill",
2250            stylers: [{
2251              color: "#616161"
2252            }]
2253          }, {
2254            elementType: "labels.text.stroke",
2255            stylers: [{
2256              color: "#f5f5f5"
2257            }]
2258          }, {
2259            featureType: "administrative.land_parcel",
2260            elementType: "labels.text.fill",
2261            stylers: [{
2262              color: "#bdbdbd"
2263            }]
2264          }, {
2265            featureType: "poi",
2266            elementType: "geometry",
2267            stylers: [{
2268              color: "#eeeeee"
2269            }]
2270          }, {
2271            featureType: "poi",
2272            elementType: "labels.text.fill",
2273            stylers: [{
2274              color: "#757575"
2275            }]
2276          }, {
2277            featureType: "poi.park",
2278            elementType: "geometry",
2279            stylers: [{
2280              color: "#e5e5e5"
2281            }]
2282          }, {
2283            featureType: "poi.park",
2284            elementType: "labels.text.fill",
2285            stylers: [{
2286              color: "#9e9e9e"
2287            }]
2288          }, {
2289            featureType: "road",
2290            elementType: "geometry",
2291            stylers: [{
2292              color: "#ffffff"
2293            }]
2294          }, {
2295            featureType: "road.arterial",
2296            elementType: "labels.text.fill",
2297            stylers: [{
2298              color: "#757575"
2299            }]
2300          }, {
2301            featureType: "road.highway",
2302            elementType: "geometry",
2303            stylers: [{
2304              color: "#dadada"
2305            }]
2306          }, {
2307            featureType: "road.highway",
2308            elementType: "labels.text.fill",
2309            stylers: [{
2310              color: "#616161"
2311            }]
2312          }, {
2313            featureType: "road.local",
2314            elementType: "labels.text.fill",
2315            stylers: [{
2316              color: "#9e9e9e"
2317            }]
2318          }, {
2319            featureType: "transit.line",
2320            elementType: "geometry",
2321            stylers: [{
2322              color: "#e5e5e5"
2323            }]
2324          }, {
2325            featureType: "transit.station",
2326            elementType: "geometry",
2327            stylers: [{
2328              color: "#eeeeee"
2329            }]
2330          }, {
2331            featureType: "water",
2332            elementType: "geometry",
2333            stylers: [{
2334              color: "#c9c9c9"
2335            }]
2336          }, {
2337            featureType: "water",
2338            elementType: "labels.text.fill",
2339            stylers: [{
2340              color: "#9e9e9e"
2341            }]
2342          }],
2343          retro: [{
2344            elementType: "geometry",
2345            stylers: [{
2346              color: "#ebe3cd"
2347            }]
2348          }, {
2349            elementType: "labels.text.fill",
2350            stylers: [{
2351              color: "#523735"
2352            }]
2353          }, {
2354            elementType: "labels.text.stroke",
2355            stylers: [{
2356              color: "#f5f1e6"
2357            }]
2358          }, {
2359            featureType: "administrative",
2360            elementType: "geometry.stroke",
2361            stylers: [{
2362              color: "#c9b2a6"
2363            }]
2364          }, {
2365            featureType: "administrative.land_parcel",
2366            elementType: "geometry.stroke",
2367            stylers: [{
2368              color: "#dcd2be"
2369            }]
2370          }, {
2371            featureType: "administrative.land_parcel",
2372            elementType: "labels.text.fill",
2373            stylers: [{
2374              color: "#ae9e90"
2375            }]
2376          }, {
2377            featureType: "landscape.natural",
2378            elementType: "geometry",
2379            stylers: [{
2380              color: "#dfd2ae"
2381            }]
2382          }, {
2383            featureType: "poi",
2384            elementType: "geometry",
2385            stylers: [{
2386              color: "#dfd2ae"
2387            }]
2388          }, {
2389            featureType: "poi",
2390            elementType: "labels.text.fill",
2391            stylers: [{
2392              color: "#93817c"
2393            }]
2394          }, {
2395            featureType: "poi.park",
2396            elementType: "geometry.fill",
2397            stylers: [{
2398              color: "#a5b076"
2399            }]
2400          }, {
2401            featureType: "poi.park",
2402            elementType: "labels.text.fill",
2403            stylers: [{
2404              color: "#447530"
2405            }]
2406          }, {
2407            featureType: "road",
2408            elementType: "geometry",
2409            stylers: [{
2410              color: "#f5f1e6"
2411            }]
2412          }, {
2413            featureType: "road.arterial",
2414            elementType: "geometry",
2415            stylers: [{
2416              color: "#fdfcf8"
2417            }]
2418          }, {
2419            featureType: "road.highway",
2420            elementType: "geometry",
2421            stylers: [{
2422              color: "#f8c967"
2423            }]
2424          }, {
2425            featureType: "road.highway",
2426            elementType: "geometry.stroke",
2427            stylers: [{
2428              color: "#e9bc62"
2429            }]
2430          }, {
2431            featureType: "road.highway.controlled_access",
2432            elementType: "geometry",
2433            stylers: [{
2434              color: "#e98d58"
2435            }]
2436          }, {
2437            featureType: "road.highway.controlled_access",
2438            elementType: "geometry.stroke",
2439            stylers: [{
2440              color: "#db8555"
2441            }]
2442          }, {
2443            featureType: "road.local",
2444            elementType: "labels.text.fill",
2445            stylers: [{
2446              color: "#806b63"
2447            }]
2448          }, {
2449            featureType: "transit.line",
2450            elementType: "geometry",
2451            stylers: [{
2452              color: "#dfd2ae"
2453            }]
2454          }, {
2455            featureType: "transit.line",
2456            elementType: "labels.text.fill",
2457            stylers: [{
2458              color: "#8f7d77"
2459            }]
2460          }, {
2461            featureType: "transit.line",
2462            elementType: "labels.text.stroke",
2463            stylers: [{
2464              color: "#ebe3cd"
2465            }]
2466          }, {
2467            featureType: "transit.station",
2468            elementType: "geometry",
2469            stylers: [{
2470              color: "#dfd2ae"
2471            }]
2472          }, {
2473            featureType: "water",
2474            elementType: "geometry.fill",
2475            stylers: [{
2476              color: "#b9d3c2"
2477            }]
2478          }, {
2479            featureType: "water",
2480            elementType: "labels.text.fill",
2481            stylers: [{
2482              color: "#92998d"
2483            }]
2484          }],
2485          dark: [{
2486            elementType: "geometry",
2487            stylers: [{
2488              color: "#212121"
2489            }]
2490          }, {
2491            elementType: "labels.icon",
2492            stylers: [{
2493              visibility: "off"
2494            }]
2495          }, {
2496            elementType: "labels.text.fill",
2497            stylers: [{
2498              color: "#757575"
2499            }]
2500          }, {
2501            elementType: "labels.text.stroke",
2502            stylers: [{
2503              color: "#212121"
2504            }]
2505          }, {
2506            featureType: "administrative",
2507            elementType: "geometry",
2508            stylers: [{
2509              color: "#757575"
2510            }]
2511          }, {
2512            featureType: "administrative.country",
2513            elementType: "labels.text.fill",
2514            stylers: [{
2515              color: "#9e9e9e"
2516            }]
2517          }, {
2518            featureType: "administrative.land_parcel",
2519            stylers: [{
2520              visibility: "off"
2521            }]
2522          }, {
2523            featureType: "administrative.locality",
2524            elementType: "labels.text.fill",
2525            stylers: [{
2526              color: "#bdbdbd"
2527            }]
2528          }, {
2529            featureType: "poi",
2530            elementType: "labels.text.fill",
2531            stylers: [{
2532              color: "#757575"
2533            }]
2534          }, {
2535            featureType: "poi.park",
2536            elementType: "geometry",
2537            stylers: [{
2538              color: "#181818"
2539            }]
2540          }, {
2541            featureType: "poi.park",
2542            elementType: "labels.text.fill",
2543            stylers: [{
2544              color: "#616161"
2545            }]
2546          }, {
2547            featureType: "poi.park",
2548            elementType: "labels.text.stroke",
2549            stylers: [{
2550              color: "#1b1b1b"
2551            }]
2552          }, {
2553            featureType: "road",
2554            elementType: "geometry.fill",
2555            stylers: [{
2556              color: "#2c2c2c"
2557            }]
2558          }, {
2559            featureType: "road",
2560            elementType: "labels.text.fill",
2561            stylers: [{
2562              color: "#8a8a8a"
2563            }]
2564          }, {
2565            featureType: "road.arterial",
2566            elementType: "geometry",
2567            stylers: [{
2568              color: "#373737"
2569            }]
2570          }, {
2571            featureType: "road.highway",
2572            elementType: "geometry",
2573            stylers: [{
2574              color: "#3c3c3c"
2575            }]
2576          }, {
2577            featureType: "road.highway.controlled_access",
2578            elementType: "geometry",
2579            stylers: [{
2580              color: "#4e4e4e"
2581            }]
2582          }, {
2583            featureType: "road.local",
2584            elementType: "labels.text.fill",
2585            stylers: [{
2586              color: "#616161"
2587            }]
2588          }, {
2589            featureType: "transit",
2590            elementType: "labels.text.fill",
2591            stylers: [{
2592              color: "#757575"
2593            }]
2594          }, {
2595            featureType: "water",
2596            elementType: "geometry",
2597            stylers: [{
2598              color: "#000000"
2599            }]
2600          }, {
2601            featureType: "water",
2602            elementType: "labels.text.fill",
2603            stylers: [{
2604              color: "#3d3d3d"
2605            }]
2606          }],
2607          night: [{
2608            elementType: "geometry",
2609            stylers: [{
2610              color: "#242f3e"
2611            }]
2612          }, {
2613            elementType: "labels.text.fill",
2614            stylers: [{
2615              color: "#746855"
2616            }]
2617          }, {
2618            elementType: "labels.text.stroke",
2619            stylers: [{
2620              color: "#242f3e"
2621            }]
2622          }, {
2623            featureType: "administrative.locality",
2624            elementType: "labels.text.fill",
2625            stylers: [{
2626              color: "#d59563"
2627            }]
2628          }, {
2629            featureType: "poi",
2630            elementType: "labels.text.fill",
2631            stylers: [{
2632              color: "#d59563"
2633            }]
2634          }, {
2635            featureType: "poi.park",
2636            elementType: "geometry",
2637            stylers: [{
2638              color: "#263c3f"
2639            }]
2640          }, {
2641            featureType: "poi.park",
2642            elementType: "labels.text.fill",
2643            stylers: [{
2644              color: "#6b9a76"
2645            }]
2646          }, {
2647            featureType: "road",
2648            elementType: "geometry",
2649            stylers: [{
2650              color: "#38414e"
2651            }]
2652          }, {
2653            featureType: "road",
2654            elementType: "geometry.stroke",
2655            stylers: [{
2656              color: "#212a37"
2657            }]
2658          }, {
2659            featureType: "road",
2660            elementType: "labels.text.fill",
2661            stylers: [{
2662              color: "#9ca5b3"
2663            }]
2664          }, {
2665            featureType: "road.highway",
2666            elementType
2666: "geometry",
2667            stylers: [{
2668              color: "#746855"
2669            }]
2670          }, {
2671            featureType: "road.highway",
2672            elementType: "geometry.stroke",
2673            stylers: [{
2674              color: "#1f2835"
2675            }]
2676          }, {
2677            featureType: "road.highway",
2678            elementType: "labels.text.fill",
2679            stylers: [{
2680              color: "#f3d19c"
2681            }]
2682          }, {
2683            featureType: "transit",
2684            elementType: "geometry",
2685            stylers: [{
2686              color: "#2f3948"
2687            }]
2688          }, {
2689            featureType: "transit.station",
2690            elementType: "labels.text.fill",
2691            stylers: [{
2692              color: "#d59563"
2693            }]
2694          }, {
2695            featureType: "water",
2696            elementType: "geometry",
2697            stylers: [{
2698              color: "#17263c"
2699            }]
2700          }, {
2701            featureType: "water",
2702            elementType: "labels.text.fill",
2703            stylers: [{
2704              color: "#515c6d"
2705            }]
2706          }, {
2707            featureType: "water",
2708            elementType: "labels.text.stroke",
2709            stylers: [{
2710              color: "#17263c"
2711            }]
2712          }],
2713          aubergine: [{
2714            elementType: "geometry",
2715            stylers: [{
2716              color: "#1d2c4d"
2717            }]
2718          }, {
2719            elementType: "labels.text.fill",
2720            stylers: [{
2721              color: "#8ec3b9"
2722            }]
2723          }, {
2724            elementType: "labels.text.stroke",
2725            stylers: [{
2726              color: "#1a3646"
2727            }]
2728          }, {
2729            featureType: "administrative.country",
2730            elementType: "geometry.stroke",
2731            stylers: [{
2732              color: "#4b6878"
2733            }]
2734          }, {
2735            featureType: "administrative.land_parcel",
2736            elementType: "labels.text.fill",
2737            stylers: [{
2738              color: "#64779e"
2739            }]
2740          }, {
2741            featureType: "administrative.province",
2742            elementType: "geometry.stroke",
2743            stylers: [{
2744              color: "#4b6878"
2745            }]
2746          }, {
2747            featureType: "landscape.man_made",
2748            elementType: "geometry.stroke",
2749            stylers: [{
2750              color: "#334e87"
2751            }]
2752          }, {
2753            featureType: "landscape.natural",
2754            elementType: "geometry",
2755            stylers: [{
2756              color: "#023e58"
2757            }]
2758          }, {
2759            featureType: "poi",
2760            elementType: "geometry",
2761            stylers: [{
2762              color: "#283d6a"
2763            }]
2764          }, {
2765            featureType: "poi",
2766            elementType: "labels.text.fill",
2767            stylers: [{
2768              color: "#6f9ba5"
2769            }]
2770          }, {
2771            featureType: "poi",
2772            elementType: "labels.text.stroke",
2773            stylers: [{
2774              color: "#1d2c4d"
2775            }]
2776          }, {
2777            featureType: "poi.park",
2778            elementType: "geometry.fill",
2779            stylers: [{
2780              color: "#023e58"
2781            }]
2782          }, {
2783            featureType: "poi.park",
2784            elementType: "labels.text.fill",
2785            stylers: [{
2786              color: "#3C7680"
2787            }]
2788          }, {
2789            featureType: "road",
2790            elementType: "geometry",
2791            stylers: [{
2792              color: "#304a7d"
2793            }]
2794          }, {
2795            featureType: "road",
2796            elementType: "labels.text.fill",
2797            stylers: [{
2798              color: "#98a5be"
2799            }]
2800          }, {
2801            featureType: "road",
2802            elementType: "labels.text.stroke",
2803            stylers: [{
2804              color: "#1d2c4d"
2805            }]
2806          }, {
2807            featureType: "road.highway",
2808            elementType: "geometry",
2809            stylers: [{
2810              color: "#2c6675"
2811            }]
2812          }, {
2813            featureType: "road.highway",
2814            elementType: "geometry.stroke",
2815            stylers: [{
2816              color: "#255763"
2817            }]
2818          }, {
2819            featureType: "road.highway",
2820            elementType: "labels.text.fill",
2821            stylers: [{
2822              color: "#b0d5ce"
2823            }]
2824          }, {
2825            featureType: "road.highway",
2826            elementType: "labels.text.stroke",
2827            stylers: [{
2828              color: "#023e58"
2829            }]
2830          }, {
2831            featureType: "transit",
2832            elementType: "labels.text.fill",
2833            stylers: [{
2834              color: "#98a5be"
2835            }]
2836          }, {
2837            featureType: "transit",
2838            elementType: "labels.text.stroke",
2839            stylers: [{
2840              color: "#1d2c4d"
2841            }]
2842          }, {
2843            featureType: "transit.line",
2844            elementType: "geometry.fill",
2845            stylers: [{
2846              color: "#283d6a"
2847            }]
2848          }, {
2849            featureType: "transit.station",
2850            elementType: "geometry",
2851            stylers: [{
2852              color: "#3a4762"
2853            }]
2854          }, {
2855            featureType: "water",
2856            elementType: "geometry",
2857            stylers: [{
2858              color: "#0e1626"
2859            }]
2860          }, {
2861            featureType: "water",
2862            elementType: "labels.text.fill",
2863            stylers: [{
2864              color: "#4e6d70"
2865            }]
2866          }]
2867        };
2868        return defaultStyles;
2869      },
2870      settings: function settings(wrapper) {
2871        var item = document.querySelector(wrapper);
2872        var settings = {
2873          latitude: parseFloat(item.dataset.latitude),
2874          longitude: parseFloat(item.dataset.longitude),
2875          mapType: item.dataset.mapType,
2876          markers: item.dataset.markers,
2877          polylines: item.dataset.polylines,
2878          mapZoom: parseInt(item.dataset.mapZoom),
2879          mapZoomMobile: parseInt(item.dataset.mapZoomMobile),
2880          mapZoomTablet: parseInt(item.dataset.mapZoomTablet),
2881          scrollWheelZoom: item.dataset.scrollWheelZoom,
2882          zoomControl: item.dataset.zoomControl,
2883          fullscreenControl: item.dataset.fullScreen,
2884          mapDraggable: item.dataset.disableMapDrag,
2885          showLegend: item.dataset.showLegend,
2886          showRoute: item.dataset.showRoute,
2887          googleMapType: item.dataset.googleMapType,
2888          mapTypeControl: item.dataset.mapTypeControl,
2889          streetViewControl: item.dataset.streetView,
2890          infoOpen: item.dataset.infoOpen,
2891          infoOpenHover: item.dataset.infoOpenHover,
2892          mapStyle: item.dataset.mapStyle,
2893          customMapStyles: item.dataset.customMapStyle,
2894          defaultStyle: this.defaultStyle(),
2895          strokeColor: item.dataset.strokeColor,
2896          strokeOpacity: item.dataset.strokeOpacity,
2897          strokeWeight: item.dataset.strokeWeight,
2898          strokeFill: item.dataset.strokeFill,
2899          strokeFillOpacity: item.dataset.strokeFillOpacity,
2900          originLat: item.dataset.originLat,
2901          originLng: item.dataset.originLng,
2902          destLat: item.dataset.destLat,
2903          destLng: item.dataset.destLng,
2904          travelMode: item.dataset.travelMode
2905        };
2906        return settings;
2907      },
2908      isValidJsonString: function isValidJsonString(jsonString) {
2909        try {
2910          JSON.parse(jsonString);
2911        } catch (e) {
2912          return false;
2913        }
2914        return true;
2915      },
2916      mapInit: function mapInit(wrapper) {
2917        var settings = this.settings(wrapper);
2918        var markersOptionsArray = JSON.parse(settings.markers);
2919        var map;
2920        var directionsService = new google.maps.DirectionsService();
2921        var directionsRenderer = new google.maps.DirectionsRenderer();
2922        var finalZoomLevel = settings.mapZoom;
2923        window.addEventListener("resize", function () {
2924          if (elementorFrontend.getCurrentDeviceMode() == "mobile") {
2925            finalZoomLevel = settings.mapZoomMobile;
2926          } else if (elementorFrontend.getCurrentDeviceMode() == "tablet") {
2927            finalZoomLevel = settings.mapZoomTablet;
2928          } else {
2929            finalZoomLevel = settings.mapZoom;
2930          }
2931        });
2932        map = new google.maps.Map(document.querySelector(".ha-adv-google-map__wrapper" + wrapper), {
2933          center: {
2934            lat: settings.latitude === "" ? -34.391 : settings.latitude,
2935            lng: settings.longitude === "" ? 150.644 : settings.longitude
2936          },
2937          zoom: finalZoomLevel,
2938          mapTypeId: settings.mapType,
2939          zoomControl: settings.zoomControl === "yes",
2940          mapTypeControl: settings.mapTypeControl === "yes",
2941          fullscreenControl: settings.fullscreenControl === "yes",
2942          streetViewControl: settings.streetViewControl === "yes",
2943          gestureHandling: settings.scrollWheelZoom === "yes" ? "greedy" : "cooperative",
2944          draggable: settings.mapDraggable !== "yes",
2945          styles: settings.mapStyle !== "custom" ? settings.defaultStyle[settings.mapStyle] : !this.isValidJsonString(settings.customMapStyles) ? "" : JSON.parse(settings.customMapStyles)
2946        });
2947        if (settings.mapDraggable === "yes") {
2948          map.setOptions({
2949            draggableCursor: "default"
2950          });
2951        }
2952
2953        // adding markers and info window on map
2954        markersOptionsArray.forEach(function (option) {
2955          var marker = new google.maps.Marker({
2956            icon: option.pin_icon.url === "" ? "" : {
2957              url: option.pin_icon.url,
2958              scaledSize: new google.maps.Size(option.rectangular_image === "yes" ? +option.rectangular_pin_size_width.size : +option.square_pin_size.size, option.rectangular_image === "yes" ? +option.rectangular_pin_size_height.size : +option.square_pin_size.size)
2959            },
2960            map: map,
2961            position: {
2962              lat: +option.pin_latitude,
2963              lng: +option.pin_longitude
2964            }
2965          });
2966          var infoWindow = new google.maps.InfoWindow({
2967            content: '<div class="ha-adv-google-map__marker-wrapper">' + '<div class="ha-adv-google-map__marker-title-wrapper">' + '<div class="ha-adv-google-map__marker-title" style="display: inline-block">' + option.pin_item_title + "</div>" + "</div>" + '<div class="ha-adv-google-map__marker-description-wrapper">' + '<div class="ha-adv-google-map__marker-description">' + option.pin_item_description + "</div>" + "</div>" + "</div>"
2968          });
2969          if (settings.infoOpen === "yes") {
2970            infoWindow.open(map, marker);
2971          }
2972          if (settings.infoOpenHover === "yes") {
2973            marker.addListener("mouseover", function (e) {
2974              infoWindow.open(map, marker);
2975            });
2976            marker.addListener("mouseout", function (e) {
2977              var timeOut = setTimeout(function () {
2978                infoWindow.close();
2979                clearTimeout(timeOut);
2980              }, 1000);
2981            });
2982          } else {
2983            marker.addListener("click", function () {
2984              infoWindow.open(map, marker);
2985            });
2986          }
2987        });
2988
2989        // adding map legend
2990        if (settings.showLegend === "yes") {
2991          var legend = document.querySelector(wrapper).nextElementSibling;
2992          map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(legend);
2993        }
2994        if (settings.googleMapType == "polyline") {
2995          var polylines_data = JSON.parse(settings.polylines);
2996          var polylines_arr = [];
2997          polylines_data.forEach(function (polyline) {
2998            polylines_arr.push({
2999              lat: parseFloat(polyline.ha_gmap_polyline_lat),
3000              lng: parseFloat(polyline.ha_gmap_polyline_lng)
3001            });
3002          });
3003          var polyLinePath = JSON.parse(JSON.stringify(polylines_arr));
3004          var polyPath = new google.maps.Polyline({
3005            path: polyLinePath,
3006            strokeColor: settings.strokeColor,
3007            strokeOpacity: settings.strokeOpacity,
3008            strokeWeight: settings.strokeWeight
3009          });
3010          polyPath.setMap(map);
3011        }
3012        if (settings.googleMapType == "polygon") {
3013          var polylines_data = JSON.parse(settings.polylines);
3014          var polylines_arr = [];
3015          polylines_data.forEach(function (polyline) {
3016            polylines_arr.push({
3017              lat: parseFloat(polyline.ha_gmap_polyline_lat),
3018              lng: parseFloat(polyline.ha_gmap_polyline_lng)
3019            });
3020          });
3021          var polyLinePath = JSON.parse(JSON.stringify(polylines_arr));
3022          var polygon = new google.maps.Polygon({
3023            path: polyLinePath,
3024            strokeColor: settings.strokeColor,
3025            strokeOpacity: settings.strokeOpacity,
3026            strokeWeight: settings.strokeWeight,
3027            fillColor: settings.strokeFill,
3028            fillOpacity: settings.strokeFillOpacity
3029          });
3030          polygon.setMap(map);
3031        }
3032        if (settings.googleMapType == "routes") {
3033          this.routeDraw(directionsService, directionsRenderer, settings);
3034          directionsRenderer.setMap(map);
3035        }
3036        google.maps.event.addDomListener(window, "resize", function () {
3037          var center = map.getCenter();
3038          google.maps.event.trigger(map, "resize");
3039          map.setCenter(center);
3040          map.setZoom(finalZoomLevel);
3041        });
3042      },
3043      routeDraw: function routeDraw(directionsService, directionsRenderer, settings) {
3044        var start = settings.originLat + "," + settings.originLng;
3045        var end = settings.destLat + "," + settings.destLng;
3046        directionsService.route({
3047          origin: {
3048            query: start
3049          },
3050          destination: {
3051            query: end
3052          },
3053          travelMode: settings.travelMode.toUpperCase()
3054        }, function (response, status) {
3055          if (status === "OK") {
3056            directionsRenderer.setDirections(response);
3057          } else {}
3058        });
3059      },
3060      runMap: function runMap() {
3061        var gmaper = document.querySelectorAll(".ha-adv-google-map__wrapper");
3062        for (var i = 0; i < gmaper.length; i++) {
3063          gmaper[i].classList.add("ha-adv-google-map__wrapper--item" + i);
3064          this.mapInit(".ha-adv-google-map__wrapper--item" + i);
3065        }
3066      }
3067    });
3068    elementorFrontend.hooks.addAction("frontend/element_ready/ha-google-map.default", function ($scope) {
3069      elementorFrontend.elementsHandler.addHandler(Maps, {
3070        $element: $scope,
3071        selectors: {
3072          container: ".ha-adv-google-map__wrapper"
3073        }
3074      });
3075    });
3076    elementorFrontend.hooks.addAction("frontend/element_ready/ha-unfold.default", function ($scope) {
3077      elementorFrontend.elementsHandler.addHandler(Unfold, {
3078        $element: $scope
3079      });
3080    });
3081    var EddCart = function EddCart($scope) {
3082      var optionEL = $scope.find('.ha-edd-table-wrap');
3083      var settings = optionEL.data('options');
3084      var removeEl = $scope.find('.edd-remove-from-cart');
3085      if (settings.cart_btn_type == 'icon') {
3086        removeEl.html("<i class=\"".concat(settings.icon.value, "\"></i>"));
3087      } else {
3088        removeEl.text(settings.btn_text);
3089      }
3090    };
3091    elementorFrontend.hooks.addAction('frontend/element_ready/ha-edd-cart.default', EddCart);
3092    var EddCheckout = function EddCheckout($scope) {
3093      var optionEL = $scope.find('.ha-edd-table-wrap');
3094      var settings = optionEL.data('options');
3095      var removeEl = $scope.find('.edd_cart_remove_item_btn');
3096      if (settings.cart_btn_type == 'icon') {
3097        removeEl.html("<i class=\"".concat(settings.icon.value, "\"></i>"));
3098      } else {
3099        removeEl.text(settings.btn_text);
3100      }
3101    };
3102    elementorFrontend.hooks.addAction('frontend/element_ready/ha-edd-checkout.default', EddCheckout);
3103    var EddAjaxBtn = function EddAjaxBtn($scope) {
3104      var btn = $scope.find(".ha_edd_ajax_btn");
3105      btn.on('click', function (event) {
3106        event.preventDefault();
3107        var $self = $(this),
3108          download_id = $self.data('download-id'),
3109          nonce = $self.data('nonce');
3110        $.ajax({
3111          url: HappyProLocalize.ajax_url,
3112          type: "POST",
3113          data: {
3114            action: "ha_edd_ajax_add_to_cart_link",
3115            security: HappyProLocalize.nonce,
3116            download_id: download_id
3117          },
3118          success: function success(response) {
3119            if (response.success == true) {
3120              $self.html("<i class=\"fas fa-cart-plus\"></i>");
3121            }
3122          }
3123        });
3124      });
3125    };
3126    elementorFrontend.hooks.addAction('frontend/element_ready/ha-edd-product-grid.default', EddAjaxBtn);
3127    elementorFrontend.hooks.addAction('frontend/element_ready/ha-edd-product-carou
3127sel.default', EddAjaxBtn);
3128    elementorFrontend.hooks.addAction('frontend/element_ready/ha-edd-single-product.default', EddAjaxBtn);
3129    var Image_Swap = function Image_Swap($scope) {
3130      var element = $scope.find('.ha-image-swap-wrapper');
3131      var trigger_type = element.data('trigger');
3132      var status;
3133      if (trigger_type === 'click') {
3134        element.on('click', element, function () {
3135          var self = $(this);
3136          var click = self.attr('data-click');
3137          if ('inactive' == click) {
3138            status = 'active';
3139          } else {
3140            status = 'inactive';
3141          }
3142          self.attr('data-click', status);
3143          var first_img = self.find('.img_swap_first');
3144          var second_img = self.find('.img_swap_second');
3145        });
3146      }
3147      var elm = $scope.find('.ha-image-swap-ctn');
3148      var elm_img = $scope.find('.ha-image-swap-item');
3149      var trigger = elm.data('trigger');
3150      if (elm.length > 0) {
3151        $('.ha-image-swap-ctn').on('click', '.ha-image-swap-item', function (e) {
3152          var elem = $(this);
3153          var parent = elem.parent('.ha-image-swap-insider');
3154          var firstChild = parent.children('.ha-image-swap-item:first-of-type');
3155          var secondChild = parent.children('.ha-image-swap-item:nth-of-type(2)');
3156          if (!elem.is(':first-child')) {
3157            parent.addClass('changed');
3158            setTimeout(function () {
3159              firstChild.remove();
3160              parent.append(firstChild);
3161              parent.removeClass('changed');
3162            }, 400);
3163          }
3164        });
3165      }
3166      // if( trigger == 'hover'){
3167      //     elm.hover(function (e){
3168      //         var target = e.target;
3169
3170      //         if(!$(target).hasClass('active')){
3171
3172      //             var $self = $(this);
3173      //             var parent = $self.find('.ha-image-swap-insider');
3174      //             var firstChild = parent.children('.ha-image-swap-item:first-of-type');
3175      //             var secondChild = parent.children('.ha-image-swap-item:nth-of-type(2)');
3176
3177      //             firstChild.toggleClass('active');
3178      //             secondChild.toggleClass('active');
3179      //         }
3180      //     });
3181      // }
3182    };
3183    var FlipBox = function FlipBox($scope) {
3184      var element = $scope.find('.ha-flip-box-inner');
3185      // touchstart
3186      element.on('mouseenter mouseleave touchstart', function (e) {
3187        if (('mouseenter' == e.type || 'touchstart' == e.type) && !$(this).hasClass('flip')) {
3188          $(this).addClass('flip');
3189        } else if (('mouseleave' == e.type || 'touchstart' == e.type) && $(this).hasClass('flip')) {
3190          $(this).removeClass('flip');
3191        } else if ('touchstart' == e.type && $(this).hasClass('flip')) {
3192          $(this).removeClass('flip');
3193        }
3194      });
3195    };
3196    elementorFrontend.hooks.addAction('frontend/element_ready/ha-image-swap.default', Image_Swap);
3197    var FreeShippingBar = function FreeShippingBar($scope) {
3198      var $fsbContainer = $scope.find('.ha-fsb-container');
3199      if ($fsbContainer) {
3200        var $settings = $fsbContainer.data('fsb_settings');
3201        if ($settings != undefined) {
3202          var $aimationSpeed = $settings.hasOwnProperty('ha_fsb_animation_speed') ? $settings.ha_fsb_animation_speed : 15;
3203          var $achivePercent = $settings.hasOwnProperty('achive_percent') ? $settings.achive_percent : 0;
3204          var $progressType = $settings.hasOwnProperty('progress_type') ? $settings.progress_type : 'percent';
3205          var $currencySymbol = $settings.hasOwnProperty('currencySymbol') && $progressType == 'percent' ? '%' : $settings.currencySymbol;
3206          var $cartTotal = $settings.hasOwnProperty('cart_total') ? $settings.cart_total : 0;
3207          var $totalPercent = parseFloat(Math.round($achivePercent)) >= 100 ? 100 : parseFloat(Math.round($achivePercent));
3208          var $progressText = $progressType == 'percent' ? $totalPercent : $cartTotal;
3209          var $elem = $fsbContainer.find('.ha-fsb-size');
3210          $elem.text($progressText + $currencySymbol);
3211          var defaultWidth = $(window).width() <= 768 ? 12 : 5;
3212          $totalPercent > 0 ? $elem.css({
3213            'width': $totalPercent + "%",
3214            'transition': 'width ' + $aimationSpeed + 'ms ease-in-out'
3215          }) : $elem.css('width', +defaultWidth + "%");
3216        }
3217      }
3218    };
3219    elementorFrontend.hooks.addAction('frontend/element_ready/ha-shipping-bar.default', FreeShippingBar);
3220    $('.fsb-close-icon').on('click', function () {
3221      document.cookie = "ha_close_fsb = yes;path=/";
3222      $('.ha-fsb-container').hide();
3223    });
3224    elementorFrontend.hooks.addAction('frontend/element_ready/ha-flip-box.default', FlipBox
3224);
3225    var HaRemoteCarousel = function HaRemoteCarousel($scope) {
3226      var $rcContainer = $scope.find('.ha-remote-carousel-container');
3227      if ($rcContainer) {
3228        var $rcBtn = $($rcContainer).find('.ha-custom-nav-remote-carousel');
3229        if ($rcBtn) {
3230          var $prevSliderIndex = 0;
3231          var $slides_to_show = 0;
3232          var $ha_show_thumbnail = $($rcBtn).parent().data('show_thumbnail');
3233          var $ha_rc_unique_id = $($rcBtn).parent().data('ha_rc_id');
3234          var $haRcSelector = $ha_rc_unique_id ? $('[data-ha_rcc_uid="' + $ha_rc_unique_id + '"]') : '';
3235          if ($ha_show_thumbnail && $ha_show_thumbnail == 'yes') {
3236            $haRcSelector.on('init', function (event, slick, currentSlide) {
3237              var $dataSettingsSelector = $haRcSelector.parent().parent();
3238              var $dataSettings = $dataSettingsSelector.data('settings');
3239              $slides_to_show = typeof $dataSettings === "undefined" ? $slides_to_show : $dataSettings.slides_to_show;
3240              $prevSliderIndex = (currentSlide ? currentSlide : 0) - 1;
3241              var $nextIndex = parseInt($slides_to_show) + parseInt($prevSliderIndex) + 1;
3242              var $nextItem = $haRcSelector.find('[data-slick-index="' + $nextIndex + '"]');
3243              var $nextImg = $nextItem.find('img').attr('src');
3244              var $prevItem = $haRcSelector.find('[data-slick-index="' + $prevSliderIndex + '"]');
3245              var $prevImg = $prevItem.find('img').attr('src');
3246              var $nextBtn = $rcContainer.find('.ha-remote-carousel-btn-next');
3247              var $prevBtn = $rcContainer.find('.ha-remote-carousel-btn-prev');
3248              $nextBtn.css({
3249                'background-image': 'url(' + $nextImg + ')',
3250                'background-position': 'center'
3251              });
3252              $prevBtn.css({
3253                'background-image': 'url(' + $prevImg + ')',
3254                'background-position': 'center'
3255              });
3256            });
3257            $haRcSelector.trigger('init');
3258            $($rcBtn).on("click", function (e) {
3259              e.preventDefault();
3260              $haRcSelector.on('afterChange', function (event, slick, currentSlideIndex) {
3261                var $dataSettingsSelector = $haRcSelector.parent().parent();
3262                var $dataSettings = $dataSettingsSelector.data('settings');
3263                var $slides_to_show = $dataSettings ? $dataSettings.slides_to_show : currentSlideIndex;
3264                $prevSliderIndex = parseInt(currentSlideIndex - 1);
3265                var $nextIndex = parseInt($slides_to_show) + parseInt($prevSliderIndex) + 1;
3266                var $nextItem = $haRcSelector.find('[data-slick-index="' + $nextIndex + '"]');
3267                var $nextImg = $nextItem.find('img').attr('src');
3268                var $prevItem = $haRcSelector.find('[data-slick-index="' + $prevSliderIndex + '"]');
3269                var $prevImg = $prevItem.find('img').attr('src');
3270                var $nextBtn = $rcContainer.find('.ha-remote-carousel-btn-next');
3271                var $prevBtn = $rcContainer.find('.ha-remote-carousel-btn-prev');
3272                if ($nextBtn) {
3273                  $nextBtn.css({
3274                    'background-image': 'url(' + $nextImg + ')',
3275                    'background-position': 'center'
3276                  });
3277                }
3278                if ($prevBtn) {
3279                  $prevBtn.css({
3280                    'background-image': 'url(' + $prevImg + ')',
3281                    'background-position': 'center'
3282                  });
3283                }
3284              });
3285              if ($(this).data("ha_rc_nav") == 'ha_rc_next_btn') {
3286                $haRcSelector.slick("slickNext");
3287              } else if ($(this).data("ha_rc_nav") == 'ha_rc_prev_btn') {
3288                $haRcSelector.slick("slickPrev");
3289              }
3290            });
3291          } else {
3292            $($rcBtn).on("click", function (e) {
3293              e.preventDefault();
3294              if ($(this).data("ha_rc_nav") == 'ha_rc_next_btn') {
3295                $haRcSelector.slick("slickNext");
3296              } else if ($(this).data("ha_rc_nav") == 'ha_rc_prev_btn') {
3297                $haRcSelector.slick("slickPrev");
3298              }
3299            });
3300          }
3301        }
3302      }
3303    };
3304    elementorFrontend.hooks.addAction('frontend/element_ready/ha-remote-carousel.default', HaRemoteCarousel);
3305    var HaTOC = elementorModules.frontend.handlers.Base.extend({
3306      getDefaultSettings: function getDefaultSettings() {
3307        var elementSettings = this.getElementSettings(),
3308          listWrapperTag = "numbers" === elementSettings.marker_view ? "ol" : "ul";
3309        return {
3310          selectors: {
3311            widgetContainer: ".ha-toc-wrapper",
3312            container: '.elementor:not([data-elementor-type="header"]):not([data-elementor-type="footer"])',
3313            expandButton: ".ha-toc__header",
3314            collapseButton: ".ha-toc__header",
3315            body: ".ha-toc__body",
3316            headerTitle: ".ha-toc__header-title",
3317            scrollTop: ".ha-toc__scroll-to-top--container"
3318          },
3319          classes: {
3320            anchor: "ha-toc-menu-anchor",
3321            listWrapper: "ha-toc__list-wrapper",
3322            listItem: "ha-toc__list-item",
3323            listTextWrapper: "ha-toc__list-item-text-wrapper",
3324            firstLevelListItem: "ha-toc__top-level",
3325            listItemText: "ha-toc__list-item-text",
3326            activeItem: "ha-toc-item-active",
3327            headingAnchor: "ha-toc__heading-anchor",
3328            collapsed: "ha-toc--collapsed"
3329          },
3330          listWrapperTag: listWrapperTag
3331        };
3332      },
3333      getDefaultElements: function getDefaultElements() {
3334        var settings = this.getSettings(),
3335          elementSettings = this.getElementSettings();
3336        return {
3337          $pageContainer: jQuery(elementSettings.container || settings.selectors.container),
3338          $widgetContainer: this.$element.find(settings.selectors.widgetContainer),
3339          $expandButton: this.$element.find(settings.selectors.expandButton),
3340          $collapseButton: this.$element.find(settings.selectors.collapseButton),
3341          $tocBody: this.$element.find(settings.selectors.body),
3342          $listItems: this.$element.find("." + settings.classes.listItem),
3343          $scrollTop: this.$element.find(settings.selectors.scrollTop)
3344        };
3345      },
3346      bindEvents: function bindEvents() {
3347        var $self = this;
3348        var elementSettings = this.getElementSettings();
3349        if (elementSettings.minimize_box) {
3350          this.elements.$expandButton.on("click", function () {
3351            if (!$($self.$element).hasClass($self.getSettings("classes.collapsed"))) {
3352              return $self.collapseBox();
3353            } else {
3354              return $self.expandBox();
3355            }
3356          });
3357        }
3358        if (elementSettings.collapse_subitems) {
3359          this.elements.$listItems.hover(function (event) {
3360            return jQuery(event.target).slideToggle();
3361          });
3362        }
3363        if (elementSettings.sticky_toc_toggle) {
3364          elementorFrontend.elements.$window.on("resize", this.handleStickyToc);
3365        }
3366        if (elementSettings.scroll_to_top_toggle) {
3367          this.elements.$scrollTop.on("click", function () {
3368            $self.scrollToTop();
3369          });
3370        }
3371      },
3372      getHeadings: function getHeadings() {
3373        // Get all headings from document by user-selected tags
3374        var elementSettings = this.getElementSettings(),
3375          tags = elementSettings.headings_by_tags.join(","),
3376          selectors = this.getSettings("selectors"),
3377          excludedSelectors = elementSettings.exclude_headings_by_selector;
3378        return this.elements.$pageContainer.find(tags).not(selectors.headerTitle).filter(function (index, heading) {
3379          return !jQuery(heading).closest(excludedSelectors).length; // Handle excluded selectors if there are any
3380        });
3381      },
3382      addAnchorsBeforeHeadings: function addAnchorsBeforeHeadings() {
3383        var $this = this;
3384        // Add an anchor element right before each TOC heading to create anchors for TOC links
3385        var classes = this.getSettings("classes");
3386        this.elements.$headings.before(function (index) {
3387          var anchorLink = $this.getHeadingAnchorLink(index, classes);
3388          return '<span id="' + anchorLink + '" class="' + classes.anchor + ' "></span>';
3389        });
3390      },
3391      activateItem: function activateItem($listItem) {
3392        var classes = this.getSettings("classes");
3393        this.deactivateActiveItem($listItem);
3394        $listItem.addClass(classe
3394s.activeItem);
3395        this.$activeItem = $listItem;
3396        if (!this.getElementSettings("sticky_toc_toggle")) {
3397          //Note:- The "Collapse" option will not work unless you make the Table of Contents sticky.
3398          return;
3399        }
3400        if (!this.getElementSettings("collapse_subitems")) {
3401          return;
3402        }
3403        var $activeList = void 0;
3404        if ($listItem.hasClass(classes.firstLevelListItem)) {
3405          $activeList = $listItem.parent().next();
3406        } else {
3407          $activeList = $listItem.parents("." + classes.listWrapper).eq(-2);
3408        }
3409        if (!$activeList.length) {
3410          delete this.$activeList;
3411          return;
3412        }
3413        this.$activeList = $activeList;
3414        this.$activeList.stop().slideDown();
3415      },
3416      deactivateActiveItem: function deactivateActiveItem($activeToBe) {
3417        if (!this.$activeItem || this.$activeItem.is($activeToBe)) {
3418          return;
3419        }
3420        var _getSettings = this.getSettings(),
3421          classes = _getSettings.classes;
3422        this.$activeItem.removeClass(classes.activeItem);
3423        if (this.$activeList && (!$activeToBe || !this.$activeList[0].contains($activeToBe[0]))) {
3424          this.$activeList.slideUp();
3425        }
3426      },
3427      followAnchor: function followAnchor($element, index) {
3428        var $self = this;
3429        var anchorSelector = $element[0].hash;
3430        var $anchor = void 0;
3431        try {
3432          // `decodeURIComponent` for UTF8 characters in the hash.
3433          $anchor = jQuery(decodeURIComponent(anchorSelector));
3434        } catch (e) {
3435          return;
3436        }
3437        if (0 === index) {
3438          haObserveTarget($anchor[0], function (direction) {
3439            if ($self.itemClicked) {
3440              return;
3441            }
3442            if ("down" === direction) {
3443              $self.activateItem($element);
3444            } else {
3445              $self.deactivateActiveItem();
3446            }
3447          });
3448        }
3449        haObserveTarget($anchor[0], function (direction) {
3450          if ($self.itemClicked) {
3451            return;
3452          }
3453          if ("down" === direction) {
3454            $self.activateItem($self.$listItemTexts.eq(index + 1));
3455          } else {
3456            $self.activateItem($element);
3457          }
3458        });
3459      },
3460      followAnchors: function followAnchors() {
3461        var $self = this;
3462        this.$listItemTexts.each(function (index, element) {
3463          return $self.followAnchor(jQuery(element), index);
3464        });
3465      },
3466      setOffset: function setOffset($listItem) {
3467        var $this = this;
3468        var settings = this.getSettings();
3469        var list = this.$element.find("." + settings.classes.listItem);
3470        var offset = this.getCurrentDeviceSetting("scroll_offset");
3471        list.each(function () {
3472          $('a', this).on('click', function (e) {
3473            e.preventDefault();
3474            var hash = this.hash;
3475            $('html, body').animate({
3476              scrollTop: $(hash).offset().top - parseInt(offset.size)
3477            }, 800);
3478          });
3479        });
3480      },
3481      populateTOC: function populateTOC() {
3482        var $self = this;
3483        this.listItemPointer = 0;
3484        var elementSettings = this.getElementSettings();
3485        if (elementSettings.custom_style == 'yes') {
3486          this.elements.$widgetContainer.html(this.createSideDot());
3487        } else {
3488          if (elementSettings.hierarchical_view) {
3489            this.createNestedList();
3490          } else {
3491            this.createFlatList();
3492          }
3493        }
3494        this.$listItemTexts = this.$element.find(".ha-toc__list-item-text");
3495        this.$listItemTexts.on("click", this.onListItemClick.bind(this));
3496        if (!elementorFrontend.isEditMode()) {
3497          this.followAnchors();
3498        }
3499        $(window).on('scroll', function () {
3500          if ("window_top" === elementSettings.scroll_to_top_option) {
3501            if ($(window).scrollTop() > 0) {
3502              $self.elements.$scrollTop.show();
3503            } else {
3504              $self.elements.$scrollTop.hide();
3505            }
3506          } else {
3507            var $id = $self.getID().parents('.elementor-element');
3508            if ($id.offset().top >= $(window).scrollTop()) {
3509              $self.elements.$scrollTop.hide();
3510            } else {
3511              $self.elements.$scrollTop.show();
3512            }
3513          }
3514        });
3515      },
3516      createNestedList: function createNestedList() {
3517        var $self = this;
3518        this.headingsData.forEach(function (heading, index) {
3519          heading.level = 0;
3520          for (var i = index - 1; i >= 0; i--) {
3521            var currentOrderedItem = $self.headingsData[i];
3522            if (currentOrderedItem.tag <= heading.tag) {
3523              heading.level = currentOrderedItem.level;
3524              if (currentOrderedItem.tag < heading.tag) {
3525                heading.level++;
3526              }
3527              break;
3528            }
3529          }
3530        });
3531        this.elements.$tocBody.html(this.getNestedLevel(0));
3532      },
3533      createFlatList: function createFlatList() {
3534        this.elements.$tocBody.html(this.getNestedLevel());
3535      },
3536      createSideDot: function createSideDot(level) {
3537        var settings = this.getSettings(),
3538          elementSettings = this.getElementSettings(),
3539          icon = this.getElementSettings("icon"),
3540          htmlul = '';
3541        if (elementSettings.custom_style == 'yes') {
3542          htmlul += "<div class=\"".concat(elementSettings.custom_style_list, "\">\n                    <div class=\"hm-toc \">\n                    <ul class=\"hm-toc-items\" style=\"list-style: none;\">\n                        <li>");
3543          if (elementSettings.custom_style_list == 'hm-toc-slide-style') {
3544            htmlul += "<".concat(elementSettings.html_tag, " class=\"hm-toc-title\"><span>").concat(elementSettings.widget_title, "<span></").concat(elementSettings.html_tag, ">");
3545          } else {
3546            htmlul += "<".concat(elementSettings.html_tag, " class=\"hm-toc-title\">").concat(elementSettings.widget_title, "</").concat(elementSettings.html_tag, ">");
3547          }
3548          htmlul += "<".concat(settings.listWrapperTag, " class=\"hm-toc-items-inner\">");
3549          for (var i = 0; i < this.headingsData.length; i++) {
3550            var list = '';
3551            var currentItemDot = this.headingsData[i];
3552            if (level > currentItemDot.level) {
3553              break;
3554            }
3555            var listItemTextClasses = settings.classes.listItemText;
3556            if (0 === currentItemDot.level) {
3557              // If the current list item is a top level item, give it the first level class
3558              listItemTextClasses += " " + settings.classes.firstLevelListItem;
3559            }
3560            if (level === currentItemDot.level) {
3561              list += "<li class=\"hm-toc-entry ".concat(settings.classes.listItem, "\">");
3562              if ('bullets' === elementSettings.marker_view && icon && elementSettings.custom_style_list == 'hm-toc-slide-style') {
3563                list += "<i class=\"".concat(icon.value, "\"></i>");
3564              }
3565              list += "<a href=\"#".concat(currentItemDot.anchorLink, "\" class=\"").concat(listItemTextClasses, "\"><span>").concat(currentItemDot.text, "</span></a>");
3566              list += "</li>";
3567            }
3568            htmlul += list;
3569          }
3570          htmlul += "</".concat(settings.listWrapperTag, ">");
3571          htmlul += "</li>\n                    </ul>";
3572        }
3573        return htmlul;
3574      },
3575      getNestedLevel: function getNestedLevel(level) {
3576        var settings = this.getSettings(),
3577          elementSettings = this.getElementSettings(),
3578          icon = this.getElementSettings("icon");
3579        var html = '';
3580
3581        // Open new list/nested list
3582        html += "<" + settings.listWrapperTag + ' class="' + settings.classes.listWrapper + '">';
3583
3584        // for each list item, build its markup.
3585        while (this.listItemPointer < this.headingsData.length) {
3586          var currentItem = this.headingsData[this.listItemPointer];
3587          var listItemTextClasses = settings.classes.listItemText;
3588          if (0 === currentItem.level) {
3589            // If the current list item is a top level item, give it the first level class
3590            listItemTextClasses += " " + settings.classes.firstLevelListItem;
3591          }
3592          if (level > currentItem.level) {
3593            break;
3594          }
3595          if (level === currentItem.level) {
3596            html += '<li class="' + settings.classes.listItem + " " + "level-" + level + '">';
3597            html += '<div class="' + settings.classes.listTextWrapper + '">';
3598            var liContent = '<a href="#' + currentItem.anchorLink + '" class="' + listItemTextClasses + '">' + currentItem.text + "</a>";
3599
3600            // If list type is bullets, add the bullet icon as an <i> tag
3601            if ("bullets" === elementSettings.marker_view && icon) {
3602              liContent = '<i class="' + icon.value + '"></i>' + liContent;
3603            }
3604            html += liContent;
3605            html += "</div>";
3606            this.listItemPointer++;
3607            var nextItem = this.headingsData[this.listItemPointer];
3608            if (nextItem && level < nextItem.level) {
3609              // If a new nested list has to be created under the current item,
3610              // this entire method is called recursively (outside the while loop, a list wrapper is created)
3611              html += this.getNestedLevel(nextItem.level);
3612            }
3613            html += "</li>";
3614          }
3615        }
3616        html += "</" + settings.listWrapperTag + ">";
3617        return html;
3618      },
3619      handleNoHeadingsFound: function handleNoHeadingsFound() {
3620        var _messages = 'No headings were found on this page.';
3621        if (elementorFrontend.isEditMode()) {
3622          return this.elements.$tocBody.html(_messages);
3623        }
3624      },
3625      collapseOnInit: function collapseOnInit() {
3626        var $self = this;
3627        var minimizedOn = this.getElementSettings("minimized_on"),
3628          currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
3629        if ("" !== minimizedOn && "array" !== typeof minimizedOn) {
3630          minimizedOn = [minimizedOn];
3631        }
3632        if (0 !== minimizedOn.length && "object" === _typeof(minimizedOn)) {
3633          minimizedOn.forEach(function (value) {
3634            if ("desktop" === value[0] && "desktop" == currentDeviceMode && $(window).width() < elementorFrontend.config.breakpoints.xxl || "tablet" === value[0] && "tablet" === currentDeviceMode && $(window).width() < elementorFrontend.config.breakpoints.lg || "mobile" === value[0] && "mobile" === currentDeviceMode && $(window).width() < elementorFrontend.config.breakpoints.md) {
3635              $self.collapseBox();
3636            }
3637          });
3638        }
3639      },
3640      getHeadingAnchorLink: function getHeadingAnchorLink(index, classes) {
3641        var headingID = this.elements.$headings[index].id,
3642          wrapperID = this.elements.$headings[index].closest('.elementor-widget').id;
3643        var anchorLink = '';
3644        if (headingID) {
3645          anchorLink = headingID;
3646        } else if (wrapperID) {
3647          // If the heading itself has an ID, we don't want to overwrite it
3648          anchorLink = wrapperID;
3649        } // If there is no existing ID, use the heading text to create a semantic ID
3650
3651        if (headingID || wrapperID) {
3652          jQuery(this.elements.$headings[index]).data('hasOwnID', true);
3653        } else {
3654          anchorLink = "".concat(classes.headingAnchor, "-").concat(index);
3655        }
3656        return anchorLink;
3657      },
3658      setHeadingsData: function setHeadingsData() {
3659        var $this = this;
3660        this.headingsData = [];
3661        var classes = this.getSettings("classes");
3662
3663        // Create an array for simplifying TOC list creation
3664        this.elements.$headings.each(function (index, element) {
3665          var anchorLink = $this.getHeadingAnchorLink(index, classes);
3666          $this.headingsData.push({
3667            tag: +element.nodeName.slice(1),
3668            text: element.textContent,
3669            anchorLink: anchorLink
3670          });
3671        });
3672      },
3673      run: function run() {
3674        var elementSettings = this.getElementSettings();
3675        this.elements.$headings = this.getHeadings();
3676        if (!this.elements.$headings.length) {
3677          return this.handleNoHeadingsFound();
3678        }
3679        this.setHeadingsData();
3680        if (!elementorFrontend.isEditMode()) {
3681          this.addAnchorsBeforeHeadings();
3682        }
3683        this.populateTOC();
3684        if (elementSettings.minimize_box) {
3685          this.collapseOnInit();
3686        }
3687        if (elementSettings.sticky_toc_toggle) {
3688          this.handleStickyToc();
3689        }
3690        if ("" !== elementSettings.scroll_offset.size) {
3691          this.setOffset();
3692        }
3693      },
3694      expandBox: function expandBox() {
3695        var boxHeight = this.getCurrentDeviceSetting("min_height");
3696        this.$element.removeClass(this.getSettings("classes.collapsed"));
3697        this.elements.$tocBody.slideDown();
3698
3699        // return container to the full height in case a min-height is defined by the user
3700        this.elements.$widgetContainer.css("min-height", boxHeight.size + boxHeight.unit);
3701      },
3702      collapseBox: function collapseBox() {
3703        this.$element.addClass(this.getSettings("classes.collapsed"));
3704        this.elements.$tocBody.slideUp();
3705
3706        // close container in case a min-height is defined by the user
3707        this.elements.$widgetContainer.css("min-height", "0px");
3708      },
3709      onInit: function onInit() {
3710        var $self = this;
3711        this.initElements();
3712        this.bindEvents();
3713        jQuery(document).ready(function () {
3714          $self.run();
3715        });
3716      },
3717      onListItemClick: function onListItemClick(event) {
3718        var $self = this;
3719        this.itemClicked = true;
3720        setTimeout(function () {
3721          return $self.itemClicked = false;
3722        }, 2000);
3723        var $clickedItem = jQuery(event.target),
3724          $list = $clickedItem.parent().next(),
3725          collapseNestedList = this.getElementSettings("collapse_subitems");
3726        if ("SPAN" == $clickedItem[0].tagName && 'yes' == this.getElementSettings("custom_style")) {
3727          $clickedItem = jQuery(event.currentTarget);
3728        }
3729        var listIsActive = void 0;
3730        if (collapseNestedList && $clickedItem.hasClass(this.getSettings("classes.firstLevelListItem"))) {
3731          if ($list.is(":visible")) {
3732            listIsActive = true;
3733          }
3734        }
3735        this.activateItem($clickedItem);
3736        if (collapseNestedList && listIsActive) {
3737          $list.slideUp();
3738        }
3739      },
3740      handleStickyToc: function handleStickyToc() {
3741        var elementSettings = this.getElementSettings();
3742        var currentDeviceMode = elementorFrontend.getCurrentDeviceMode();
3743        var $devices = elementSettings.sticky_toc_disable_on;
3744        var target = this.getID();
3745        var type = elementSettings.sticky_toc_type;
3746        if ("in-place" === type) {
3747          var parentWidth = target.parent().parent().outerWidth();
3748          target.css("width", parentWidth);
3749        } else if ("custom-position" === type) {
3750          var parentWidth = target.parent().parent().outerWidth();
3751          target.css("width", parentWidth);
3752        }
3753        if (-1 == $.inArray(currentDeviceMode, $devices)) {
3754          target.removeClass('floating-toc');
3755          $(window).off('scroll', this.stickyScroll);
3756          return;
3757        }
3758        $(window).on('scroll', $.proxy(this.stickyScroll, this));
3759      },
3760      stickyScroll: function stickyScroll() {
3761        var target = this.getID();
3762        var elementSettings = this.getElementSettings();
3763        var item = document.querySelector(".ha-table-of-contents");
3764        var bound, tocHeight;
3765        bound = item.getBoundingClientRect();
3766        tocHeight = target.outerHeight();
3767        if (target.hasClass("floating-toc")) {
3768          target.parent().parent().css("height", tocHeight);
3769        } else {
3770          target.parent().parent().css("height", '');
3771        }
3772        if (bound.y + bound.height / 2 < 0) {
3773          if (target.hasClass('floating-toc')) {
3774            return;
3775          }
3776          target.addClass("floating-toc");
3777        } else {
3778          if (!target.hasClass('floating-toc')) {
3779            return;
3780          }
3781          target.removeClass("floating-toc");
3782        }
3783      },
3784      scrollToTop: function scrollToTop() {
3785        var $self = this;
3786        var scrollTo = this.getElementSettings("scroll_to_top_option");
3787        if ("window_top" === scrollTo) {
3788          $("html, body").animate({
3789            scrollTop: 0
3790          }, 250);
3791        } else {
3792          var $id = this.getID().parents('.ha-table-of-contents');
3793          $("html, body").animate({
3794            scrollTop: $($id).offset().top - 60
3795          }, 1000);
3796        }
3797      },
3798      getID: function getID() {
3799        return $("#ha-toc-" + this.$element[0].attributes["data-id"].nodeValue);
3800      }
3801    });
3802    elementorFrontend.hooks.addAction("frontend/element_ready/ha-table-of-contents.default", function ($scope) {
3803      elementorFrontend.elementsHandler.addHandler(HaTOC, {
3804        $element: $scope
3805      });
3806    });
3807
3808    //creativeSlider
3809    var HaCreativeSlider = function HaCreativeSlider($scope) {
3810      var $rcContainer = $scope.find('.ha-creative-slider-container');
3811      if ($rcContainer) {
3812        // var $haCsWidth = window.innerWidth;
3813        var $haCsWidth = $(window).width();
3814        var $haCsNextSelector = parseInt($haCsWidth) <= 767 ? $rcContainer.find('.ha_cs_mobile_next') : $rcContainer.find('.ha_cc_next_wrapper');
3815        var $haCsPrevSelector = parseInt($haCsWidth) <= 767 ? $rcContainer.find('.ha_cs_mobile_prev') : $rcContainer.find('.ha_cc_prev_wrapper');
3816        var csTextItemDelay = parseInt($haCsWidth) <= 767 ? 40 : 30;
3817        var csImageItemDelay = 40;
3818        var csPrevItemsOwl = $rcContainer.find('.ha_cc_prev_items');
3819        var csTextItemsOwl = $rcContainer.find('.ha_cc_text_items');
3820        var csImageItemsOwl = $rcContainer.find('.ha_cc_inner_image_items');
3821        var csNextItemsOwl = $rcContainer.find('.ha_cc_next_items');
3822        var csPrevNavOptions = {
3823          loop: true,
3824          dots: false,
3825          nav: false,
3826          items: 1,
3827          autoplay: false,
3828          smartSpeed: 500,
3829          touchDrag: false,
3830          mouseDrag: false,
3831          rewind: true,
3832          startPosition: -1
3833        };
3834        var csNextNavOptions = {
3835          loop: true,
3836          dots: false,
3837          nav: false,
3838          items: 1,
3839          autoplay: false,
3840          smartSpeed: 500,
3841          touchDrag: false,
3842          mouseDrag: false,
3843          rewind: true,
3844          startPosition: 1
3845        };
3846        var csGeneralOptions = {
3847          loop: true,
3848          dots: false,
3849          nav: false,
3850          items: 1,
3851          autoplay: false,
3852          smartSpeed: 1000,
3853          touchDrag: false,
3854          mouseDrag: false,
3855          singleItem: true,
3856          animateOut: 'fadeOutRight',
3857          animateIn: 'fadeInLeft',
3858          rewind: true
3859        };
3860      }
3861      csPrevItemsOwl.owlCarousel(csPrevNavOptions);
3862      csNextItemsOwl.owlCarousel(csNextNavOptions);
3863      csTextItemsOwl.owlCarousel(csGeneralOptions);
3864      csImageItemsOwl.owlCarousel(csGeneralOptions);
3865      window.parent.addEventListener('message', function (e) {
3866        if ('ha_cs_reinit' == e.data) {
3867          csTextItemsOwl.owlCarousel('refresh');
3868          csImageItemsOwl.owlCarousel('refresh');
3869        }
3870      });
3871      $($haCsPrevSelector).click(function (e) {
3872        e.preventDefault();
3873        csPrevItemsOwl.trigger('prev.owl.carousel');
3874        csNextItemsOwl.trigger('prev.owl.carousel');
3875        setTimeout(function () {
3876          csTextItemsOwl.trigger('prev.owl.carousel');
3877        }, csTextItemDelay);
3878        setTimeout(function () {
3879          csImageItemsOwl.trigger('prev.owl.carousel');
3880        }, csTextItemDelay + csImageItemDelay);
3881      });
3882      $($haCsNextSelector).click(function (e) {
3883        e.preventDefault();
3884        csPrevItemsOwl.trigger('next.owl.carousel');
3885        csNextItemsOwl.trigger('next.owl.carousel');
3886        setTimeout(function () {
3887          csTextItemsOwl.trigger('next.owl.carousel');
3888        }, csTextItemDelay);
3889        setTimeout(function () {
3890          csImageItemsOwl.trigger('next.owl.carousel');
3891        }, csTextItemDelay + csImageItemDelay);
3892      });
3893    };
3894    elementorFrontend.hooks.addAction('frontend/element_ready/ha-creative-slider.default', HaCreativeSlider);
3895
3896    //Advanced Comparison Table
3897    var AdvancedComparisonTable = function AdvancedComparisonTable($scope) {
3898      var nav = $scope.find('ul.ha-adct-table-responsive-nav');
3899      var rows = $scope.find(".ha-adct-row, .ha-adct-child-row");
3900      var collapse = $scope.find(".ha-adct-collapse-icon-wrap");
3901
3902      // console.log(rows);
3903
3904      var pos = 2;
3905      nav.on("click", "li", function () {
3906        var pos = $(this).index() + 2;
3907        // console.log( pos );
3908
3909        rows.find(".ha-adct-column:not(:eq(0))").hide();
3910        $scope.find(".ha-adct-column:nth-child(" + pos + ")").css("display", "flex");
3911        nav.find("li").removeClass("active");
3912        $(this).addClass("active");
3913      });
3914      collapse.on("click", function () {
3915        var row_wrap = $(this).closest('.ha-adct-row-wrap');
3916        // console.log( row_wrap );
3917        $(this).toggleClass('open');
3918        row_wrap.find('.ha-adct-child-row-wrap').slideToggle("slow");
3919        // row_wrap.find('.ha-adct-child-row-wrap .ha-adct-column').slideToggle("slow");
3920        // $('.ha-adct-heading').slideToggle("slow");
3921      });
3922
3923      // Initialize the media query
3924      //var mediaQuery = window.matchMedia("(min-width: 767px)");
3925      // console.log(mediaQuery);
3926
3927      $(window).on('resize', function () {
3928        var mode = $('body').attr('data-elementor-device-mode');
3929        // console.log(mode);
3930
3931        if ('tablet' == mode || 'mobile_extra' == mode || 'mobile' == mode) {
3932          rows.find(".ha-adct-column:not(:eq(0))").hide();
3933          $scope.find(".ha-adct-column:nth-child(" + pos + ")").css("display", "flex");
3934        } else {
3935          rows.find(".ha-adct-column").removeAttr("style");
3936        }
3937      });
3938    };
3939    elementorFrontend.hooks.addAction('frontend/element_ready/ha-advanced-comparison-table.default', AdvancedComparisonTable);
3940
3941    //Title Tips
3942    var TitleTips = function TitleTips($scope) {
3943      var element = $scope.find('.ha-flip-box-inner');
3944      var items = $scope.find('.ha-title-tips-hover li > a');
3945      var rect = $scope.find('.ha-title-tips-hover')[0].getBoundingClientRect();
3946      if ($scope.find('.ha-title-tips-hover').hasClass('swap')) {
3947        var wrapper = $scope.find('.ha-title-tips-hover');
3948        var anchor_item = $scope.find('.ha-title-tips-hover-item.have-image');
3949        var figure = $scope.find('figure');
3950        var Work = {
3951          _register: {
3952            hover: {
3953              active: !1,
3954              currentX: 0,
3955              currentY: 0,
3956              targetX: 0,
3957              targetY: 0
3958            }
3959          },
3960          _init: function _init() {
3961            this._base(), this._events();
3962          },
3963          _base: function _base() {
3964            figure.find('img').each(function () {
3965              var item = $(this);
3966              // console.log( item.height() );
3967              item.attr("height_ratio", item.height());
3968            });
3969            requestAnimationFrame(function () {
3970              Work._interaction.hover.move_image();
3971            });
3972          },
3973          _events: function _events() {
3974            anchor_item.on("mouseenter", "a", function () {
3975              Work._interaction.hover.image($(this));
3976            });
3977            anchor_item.on("mouseleave", "a", function () {
3978              Work._interaction.hover.leave();
3979            });
3980            anchor_item.on("mousemove", "a", function (e) {
3981              Work._interaction.hover.move(e);
3982            });
3983          },
3984          _functions: {
3985            round: function round(e, t) {
3986              var t = void 0 === t ? 100 : Math.pow(10, t);
3987              return Math.round(e * t) / t;
3988            }
3989          },
3990          _interaction: {
3991            hover: {
3992              image: function image(e) {
3993                e.parents("li").addClass("active").removeClass("not-selected").siblings().removeClass("active").addClass("not-selected");
3994                if (!Work._register.hover.visible && (Work._register.hover.currentX || Work._register.hover.currentY)) {
3995                  Work._register.hover.visible = !0;
3996                  figure.addClass("visible");
3997                }
3998
3999                //   $img = $('#work-hover img[project="' + e.attr("href") + '"]');
4000                var $img = figure.find('img[data-filter-id="' + e.attr("data-filter-id") + '"]');
4001                $img.addClass("active").siblings(".active").removeClass("active").addClass("was-active");
4002                //   console.log($img);
4003                //   console.log($img.height());
4004                //   figure.get()[0].style.setProperty("--height_ratio", ( Math.floor(Math.random() * (500 - 150 + 1) ) + 150 ) + 'px' );
4005
4006                //   figure.get()[0].style.setProperty("--height_ratio", ( $img.height() ) + 'px' );
4007                figure.get()[0].style.setProperty("--height_ratio", $img.attr("height_ratio") + 'px');
4008                // .style.setProperty("--height_ratio", $img.attr("height_ratio")),
4009
4010                clearTimeout(figure.prop("leave"));
4011                clearTimeout(figure.prop("animate"));
4012                figure.addClass("animate").prop("animate", setTimeout(function () {
4013                  figure.removeClass("animate").find("img.was-active").removeClass("was-active");
4014                }, 400));
4015              },
4016              leave: function leave() {
4017                anchor_item.removeClass("active not-selected");
4018                clearTimeout(figure.prop("leave"));
4019                clearTimeout(figure.prop("active"));
4020                figure.prop("leave", setTimeout(function () {
4021                  //   Work._register.hover.visible = !1;
4022                  Work._register.hover.visible = false;
4023                  figure.removeClass("visible");
4024                }, 1));
4025                figure.prop("active", setTimeout(function () {
4026                  Work._register.hover.active = !1;
4027                }, 2e3));
4028              },
4029              move: function move(e) {
4030                var currentReact = e.currentTarget.getBoundingClientRect();
4031                var currentWrapperReact = wrapper.get()[0].getBoundingClientRect();
4032                var targetMiddle = currentReact.top + currentReact.height / 2;
4033                Work._register.hover.active || (Work._register.hover.active = !0, requestAnimationFrame(function () {
4034                  Work._interaction.hover.move_image();
4035                }), clearTimeout(figure.prop("active")), figure.prop("active", setTimeout(function () {
4036                  Work._register.hover.active = !1;
4037                }, 2e3)));
4038                //   var react = $("#work-projects").get()[0].getBoundingClientRect();
4039                var s = 0;
4040                var targetItem = anchor_item.find('a').offset().left - 40;
4041                if ($scope.hasClass('ha_title_tips_img_pos--left')) {
4042                  //   Work._register.hover.targetX = currentReact.left - figure.width(); // for left side
4043                  Work._register.hover.targetX = -(figure.width() + 10); // for left side
4044                } else {
4045                  Work._register.hover.targetX = currentReact.width + 10; // for right side
4046                }
4047                // Work._register.hover.targetY = targetMiddle;
4048                Work._register.hover.targetY = e.pageY - (currentWrapperReact.top + window.scrollY);
4049                if (!Work._register.hover.visible && (Work._register.hover.currentX || Work._register.hover.currentY)) {
4050                  Work._register.hover.visible = true;
4051                  figure.addClass("visible");
4052                }
4053              },
4054              move_image: function move_image() {
4055                if (figure.length) {
4056                  Work._register.hover.currentX += (Work._register.hover.targetX - Work._register.hover.currentX) * 0.09;
4057                  Work._register.hover.currentY += (Work._register.hover.targetY - Work._register.hover.currentY) * 0.09;
4058                  figure.get()[0].style.transform = " translate3d(\n\t\t\t\t\t\t\t\t\t\t".concat(Work._functions.round(Work._register.hover.currentX), "px,\n\t\t\t\t\t\t\t\t\t\t").concat(Work._functions.round(Work._register.hover.currentY), "px, 0px\n\t\t\t\t\t\t\t\t\t)");
4059                  if (Work._register.hover.active) {
4060                    requestAnimationFrame(function () {
4061                      Work._interaction.hover.move_image();
4062                    });
4063                  }
4064                }
4065              }
4066            }
4067          }
4068        };
4069        Work._init();
4070      }
4071    };
4072    elementorFrontend.hooks.addAction('frontend/element_ready/ha-title-tips.default', TitleTips);
4073  });
4074})(jQuery, Happy, window);

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.