/* Minification failed. Returning unminified contents.
(11,13-14): run-time error JS1010: Expected identifier: {
(11,30-31): run-time error JS1195: Expected expression: =
(13,7-8): run-time error JS1002: Syntax error: }
(22,11-12): run-time error JS1010: Expected identifier: {
(22,28-29): run-time error JS1195: Expected expression: =
(24,5-6): run-time error JS1002: Syntax error: }
(26,39-40): run-time error JS1004: Expected ';': {
(32,4-5): run-time error JS1195: Expected expression: ,
(37,9-10): run-time error JS1004: Expected ';': :
(38,14-15): run-time error JS1002: Syntax error: }
(38,15-16): run-time error JS1197: Too many errors. The file might not be a JavaScript file: ,
 */
var methodist = methodist || {};

methodist.components = methodist.components || {};
methodist.components.carousels = methodist.components.carousels || {
  carousels: {},
  extensions: [],
  initialize: function (identifier) {
    if (identifier) {
      var entry = document.querySelector(identifier);
      if (entry) {
        var { id, carousel } = methodist.components.carousels.carousel.setup(entry);
        this.carousels[id] = carousel;
      }

      return;
    }

    var entries = document.querySelectorAll(".carousel-slider");
    var collection = this;

    entries.forEach(function (entry) {
      var { id, carousel } = methodist.components.carousels.carousel.setup(entry)
      collection.carousels[id] = carousel;
    })
  },
  initializeExtensions: function (id) {
    methodist.components.carousels.extensions.forEach(function (extension) {
      if (typeof extension.initialize === "function") {
        extension.setup.call(this, id);
      }
    });
  },
};

methodist.components.carousels.carousel = methodist.components.carousels.carousel || {
  initialized: false,
  slides: [],
  controls: {},
  configuration: {},
  autoPlay: {
    handler: null
  },
  current: 0,
  position: null,
  inTransition: false,
  setCurrent: function (context) {
    var { id, slideNo, infinite = false } = context;
    var current = slideNo;
    if (current >= this.slides.length) {
      if (infinite) {
        current = 0;
      }
    } else if (current < 0) {
      if (infinite) {
        current = this.slides.length - 1;
      } else {
        current = 0;
      }
    }

    this.current = current;

    window.dispatchEvent(new CustomEvent(`slideChange_${id}`, {
      detail: {
        ...context,
        slideNo: current
      }
    }))
  },
  setup: function (node) {
    if (this.initialized) return;
    this.initialized = true;

    var carousel = this;
    carousel.configuration["element"] = node;

    var data = node.dataset;
    var {
      name = "",
      id = "",
      source = "",
      rendering = "",
      autoPlay = "true",
      usePagination = "false",
      useNavigation = "true",
      transitionStyle = "slide",
      infiniteLoop = "true",
      pauseOnHover = "false",
      speed = .15,
      interval = 3000,
      swipeSensitivity = .2
    } = data;

    var props = {
      name: name,
      id: id,
      source: source,
      rendering: rendering,
      autoPlay: autoPlay === "true",
      usePagination: usePagination === "true",
      useNavigation: useNavigation === "true",
      transitionStyle: transitionStyle,
      infiniteLoop: infiniteLoop === "true",
      pauseOnHover: pauseOnHover === "true",
      speed: speed,
      interval: interval,
      swipeSensitivity: swipeSensitivity
    };

    carousel.configuration = { ...carousel.configuration, ...props };
    carousel.slides = node.querySelectorAll(".carousel-slider-item");

    var navControls = props.useNavigation && (carousel.slides && carousel.slides.length > 1)
      ? Array.from(node.querySelectorAll(".carousel-slide-navigator"))
      : [];

    var navControlNextClickHandler = function () {
      this.setCurrent({
        id: props.id,
        infinite: props.infiniteLoop,
        slideNo: this.current + 1,
        source: "banner right arrow"
      });      
    }

    var navControlPreviousClickHandler = function () {
      this.setCurrent({
        id: props.id,
        infinite: props.infiniteLoop,
        slideNo: this.current - 1,
        source: "banner left arrow"
      });      
    }

    navControls.reduce(function (controls, navControl) {
      controls.navigation = controls.navigation || {}
      var direction = navControl.getAttribute("data-direction");

      if (direction === "next") {
        navControl.addEventListener("click", navControlNextClickHandler.bind(carousel));
        controls.navigation[direction] = navControl;
        if (navControls.length === 1) {
          navControl.style.display = "none";
        }
      }

      if (direction === "previous") {
        navControl.addEventListener("click", navControlPreviousClickHandler.bind(carousel));
        controls.navigation[direction] = navControl;
        if (!props.infiniteLoop) {
          navControl.style.display = "none";
        }
      }

      return controls;
    }, carousel.controls);

    var paginationContainer = document.createElement("div");
    paginationContainer.classList.add("carousel-slider-pagination");

    var paginationClickHandler = function (carousel, index) {
      this.classList.add("active");
      carousel.setCurrent({
        id: props.id,
        infinite: props.infiniteLoop,
        slideNo: index,
        source: "banner button circle"
      });      
    };

    var paginationCreator = props.usePagination
      ? function (_, index) {
        var pageDot = document.createElement("button");
        pageDot.setAttribute("type", "button");
        pageDot.classList.add("carousel-slider-pagination-button");
        pageDot.addEventListener("click", paginationClickHandler.bind(pageDot, carousel, index));

        carousel.controls.pagination = carousel.controls.pagination || {};
        carousel.controls.pagination[index] = pageDot;
        paginationContainer.appendChild(pageDot);
      }
      : null;

    var swipeStart = function (event) {
      var carousel = this;
      event.preventDefault();

      if (carousel.autoPlay.stop) {
        carousel.autoPlay.stop();
      }

      carousel.position = event.touches && event.touches.length > 0
        ? event.touches[0].clientX
        : event.clientX;

      carousel.inTransition = true;
    }

    var swipeMove = function (event) {
      var carousel = this;

      if (carousel.inTransition) {
        var position = event.touches && event.touches.length > 0
          ? event.touches[0].clientX
          : event.clientX;

        var pixelsMoved = carousel.position
          ? carousel.position - position
          : 0;

        var percentage = 100 * (pixelsMoved / window.innerWidth);

        if (carousel.current === 0 && pixelsMoved < 0) {
          percentage = percentage < -10 ? -10 : percentage;
        }

        if (carousel.current === (carousel.slides.length - 1) && pixelsMoved > 0) {
          percentage = percentage > 10 ? 10 : percentage;
        }

        for (var i = 0; i < carousel.slides.length; ++i) {
          var slide = carousel.slides[i];

          if (carousel.configuration.transitionStyle === "slide") {
            var translateXPercentage = 100 * (i - carousel.current);

            slide.style.transform = `translateX(${-(percentage) + translateXPercentage}%)`;
          }

          if (carousel.configuration.transitionStyle === "fade") {
            if (i === carousel.current) {
              slide.style.opacity = percentage > 0
                ? (100 + (-percentage)) / 100
                : (100 + percentage) / 100
            } else if (i === (carousel.current + 1)) {
              slide.style.opacity = Math.abs(percentage) / 100;
            } else if (i === (carousel.current - 1)) {
              slide.style.opacity = Math.abs(percentage) / 100;
            }
          }
        }        
      }
    }

    var swipeEnd = function (event) {
      var carousel = this;

      var position = event.touches && event.touches.length > 0
        ? event.touches[0].clientX
        : event.clientX;

      var pixelsMoved = carousel.position
        ? carousel.position - position
        : 0;

      if (Math.abs(pixelsMoved) >= (window.innerWidth * carousel.configuration.swipeSensitivity)) {
        var target = pixelsMoved > 0
          ? carousel.current + 1
          : carousel.current - 1;

        if (target >= 0 && target < carousel.slides.length) {
          carousel.setCurrent({
            id: carousel.configuration.id,
            infinite: carousel.configuration.infiniteLoop,
            slideNo: target,
            source: "banner swipe"
          });
        } else {
          carousel.translateSlides();
        }        
      } else {
        carousel.translateSlides();
      }

      if (carousel.autoPlay.reset) {
        carousel.autoPlay.reset();
      }

      carousel.inTransition = false;
      carousel.position = null;      
    }

    if (carousel.slides.length > 1) {
      carousel.slides.forEach(function (slide) {
        if (window.PointerEvent) {
          slide.addEventListener("pointerdown", swipeStart.bind(carousel));
          slide.addEventListener("pointermove", swipeMove.bind(carousel));
          slide.addEventListener("pointerup", swipeEnd.bind(carousel));
        } else {
          slide.addEventListener("touchstart", swipeStart.bind(carousel));
          slide.addEventListener("touchmove", swipeMove.bind(carousel));
          slide.addEventListener("touchend", swipeEnd.bind(carousel));
        }
      });
    }

    carousel.translateSlides({
      perEntryCallback: carousel.slides && carousel.slides.length > 1
        ? paginationCreator
        : null
    });

    if (props.usePagination) {
      node.appendChild(paginationContainer);
      var firstPaginationControl = carousel.controls.pagination && Object.keys(carousel.controls.pagination).length > 0
        ? carousel.controls.pagination[0]
        : null;

      if (firstPaginationControl) {
        firstPaginationControl.classList.add("active");
      }
    }

    carousel.setupAutoPlay({
      id: props.id,
      autoPlay: props.autoPlay,
      infinite: props.infiniteLoop,
      interval: props.interval
    });

    if (props.autoPlay && carousel.autoPlay.start) {
      carousel.autoPlay.start();
    }

    window.addEventListener(`slideChange_${props.id}`, function (event) {
      var { slideNo, source, infinite } = event?.detail;

      var title = carousel.slides[slideNo].querySelector(".banner-item-title");

      if (source !== "timer") {
        methodist.analytics.pushEvent(
          "interface_interactions",
          {
            component: {
              interaction_item: source,
              sc_item_id: props.source,
              sc_rendering_id: props.rendering,
              sc_component_name: props.name,
              sc_component_title: title != null ? title.innerText : "",
              sc_component_position: (carousel.current || 0) + 1
            }
          }
        );
      }

      carousel.translateSlides({
        callback: carousel.autoPlay.reset
      });
      
      if (carousel.configuration.usePagination === true) {
        Object.keys(carousel.controls.pagination).forEach(function (key) {
          var control = carousel.controls.pagination[key];
          control.classList.remove("active");
        });
      }

      if (slideNo <= 0) {
        if (carousel.controls.pagination) {
          carousel.controls.pagination[0].classList.add("active");
        }

        if (infinite) return;

        if (carousel.controls.navigation) {
          carousel.controls.navigation.previous.style.display = "none";
          carousel.controls.navigation.next.style.display = "block";
        }

      } else if (slideNo >= carousel.slides?.length - 1) {
        if (carousel.controls.pagination) {
          carousel.controls.pagination[carousel.slides?.length - 1].classList.add("active");
        }

        if (infinite) return;

        if (carousel.controls.navigation) {
          carousel.controls.navigation.next.style.display = "none";
          carousel.controls.navigation.previous.style.display = "block";
        }

        if (carousel.autoPlay.stop) {
          carousel.autoPlay.stop();
        }
      } else {
        if (carousel.controls.pagination) {
          carousel.controls.pagination[slideNo].classList.add("active");
        }

        if (infinite) return;

        if (carousel.controls.navigation) {
          carousel.controls.navigation.next.style.display = "block";
          carousel.controls.navigation.previous.style.display = "block";
        }
      }
    });

    node.addEventListener("click", function (ev) {
      if (ev.target == null) return;

      var target = methodist.utils.dom.findParent(ev.target, ["banner-item-cta", "carousel-banner-item-link"]);
      if (target == null) return;

      var title = carousel.slides[carousel.current || 0].querySelector(".banner-item-title");

      methodist.analytics.pushEvent(
        "component_cta_clicked",
        {
          component: {
            sc_item_id: props.source,            
            sc_rendering_id: props.rendering,
            sc_component_name: props.name,
            sc_component_title: title != null ? title.innerText : "",
            sc_component_cta_label: target.innerText,
            sc_component_position: (carousel.current || 0) + 1
          }
        }
      );

      return true;
    });

    carousel.configuration.element.classList.remove("uninitialized");
    return {
      id: props.id,
      carousel
    }
  },
  setupAutoPlay: function (config) {
    var carousel = this;
    var { id, autoPlay = false, infinite = false, interval } = config;

    var startAutoPlayHandler = autoPlay && (carousel.slides && carousel.slides.length > 1)
      ? function () {
        carousel.autoPlay.handler = setInterval(carousel.setCurrent.bind(carousel), interval, {
          id,
          infinite,
          slideNo: carousel.current + 1,
          source: "timer"
        })
      }
      : null;

    var stopAutoPlay = autoPlay
      ? function () {
        clearInterval(carousel.autoPlay.handler);
      }
      : null;

    var resetAutoPlay = autoPlay
      ? function () {
        stopAutoPlay();
        startAutoPlayHandler();
      }
      : null;

    carousel.autoPlay = {
      ...carousel.autoPlay,
      start: startAutoPlayHandler,
      stop: stopAutoPlay,
      reset: resetAutoPlay
    }
  },
  translateSlides: function (config) {
    var carousel = this;
    var { callback, perEntryCallback } = config || {};

    carousel.slides.forEach(function (slide, index) {
      slide.style.transitionDuration = `${carousel.configuration.speed}s`;

      if (carousel.configuration.transitionStyle === "slide") {
        slide.style.transform = `translateX(${100 * (index - carousel.current)}%)`;
      }

      if (carousel.configuration.transitionStyle === "fade") {
        var activeValue = index === carousel.current ? 1 : 0
        slide.style.opacity = activeValue;
        slide.style.zIndex = activeValue;
      }

      if (index === carousel.current) {
        var theme = slide.dataset.theme || "";
        if (theme && carousel.controls.navigation) {
          if (carousel.configuration.theme && theme !== carousel.configuration.theme) {
            carousel.controls.navigation.previous.classList.remove(carousel.configuration.theme);
            carousel.controls.navigation.next.classList.remove(carousel.configuration.theme);            
          }

          carousel.controls.navigation.previous.classList.add(theme);
          carousel.controls.navigation.next.classList.add(theme);
          
          carousel.configuration.theme = theme;
        } else if (carousel.configuration.theme && carousel.controls.navigation) {
          carousel.controls.navigation.previous.classList.remove(carousel.configuration.theme);
          carousel.controls.navigation.next.classList.remove(carousel.configuration.theme);
        }
      }

      setTimeout(function () {
        slide.style.removeProperty("transition-duration");
      }, carousel.configuration.speed * 1000);

      if (perEntryCallback) {
        perEntryCallback(slide, index);
      }
    });

    if (callback) {
      callback();
    }
  }
};

;
