{"version":3,"sources":["carousel.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","Loop","this","object","obj","callback","keys","Object","i","length","array","reverse","Carousel","el","self","loop","init","left","querySelector","right","container","link","querySelectorAll","getAttribute","thumbnails","thumbnail","dot","pagination","onclick","scrollLeft","bind","scrollRight","oldMouseX","mouseX","mouseDown","clicked","activate","snap","hasAttribute","id","controlClicked","controlByThumbnail","controlByDot","clientHeight","classList","remove","defineBreakpoints","checkBreakpoint","updateControls","watchScroll","watchForResize","checkIfThumbnailsExist","checkIfDotsExist","updatePagination","resizeThumbnails","setAttribute","e","preventDefault","scroll","updateThumbnails","updateDots","resetKeys","document","onkeydown","key","meta","ctrl","onkeyup","isValid","window","open","href","onmousedown","onmousemove","clientX","onmouseup","onfocus","scrollTo","updateActive","onblur","unsetActive","breakpoint","Soho","breakpoints","sizes","matchMedia","type","size","matches","animate","clientWidth","getContainerPadding","updated","scrollWidth","parentNode","offsetLeft","resetFocus","scrolled","disableFocus","getTarget","ignoreActive","item","removeAttribute","active","activeElement","setActive","timeout","onscroll","parseInt","isNaN","clearTimeout","setTimeout","focus","center","data","JSON","parse","padding","arithmetic","units","fn","px","value","replace","vw","innerWidth","vh","innerHeight","total","calculation","j","indexOf","push","unit","k","method","l","unsetThumbnail","unsetDot","innerHTML","oldId","oldItem","newItem","contains","videoElementId","videoElement","getElementById","player","$","pause","unload","add","tabletBreakpoint","dispatchEvent","CustomEvent","detail","windowResizing","undefined","addEventListener","breakpointChanged","style","height","currentBreakpoint","optionsOverride","options","extend","destination","duration","easing","easings","linear","t","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","start","startTime","Date","getTime","now","time","Math","min","timeFunction","ceil","requestAnimationFrame","Viewport","mediaQuery","customMediaQuery","customMatchMedia","customMatches","resize","n","define","amd","exports","dragscroll","c","r","m","d","s","f","u","md","mu","mm","slice","call","getElementsByClassName","a","elementFromPoint","pageX","pageY","clientY","scroller","scrollTop","body","documentElement","readyState","reset","polyfill","w","__forceSmoothScrollPolyfill__","userAgent","Element","HTMLElement","original","scrollBy","elementScroll","scrollElement","scrollIntoView","performance","ROUNDING_TOLERANCE","navigator","RegExp","join","test","arguments","shouldBailOut","smoothScroll","scrollX","pageXOffset","top","scrollY","pageYOffset","SyntaxError","behavior","scrollableParent","isScrollable","host","findScrollableParent","parentRects","getBoundingClientRect","clientRects","getComputedStyle","position","x","y","firstArg","TypeError","hasScrollableSpace","axis","scrollHeight","canOverflow","overflowValue","isScrollableY","isScrollableX","step","context","currentX","currentY","elapsed","cos","PI","startX","startY","scrollable","module","carousels","carousel","viewport","toggleEnlargement","enable","imgElement","width","existingEnlargePane","removeChild","enlargePane","createElement","enlarge","enlargeContain","src","appendChild","cloneNode","console","error","watchForUpdate","event","eventItem","shouldEnlarge","addListener"],"mappings":"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","file":"../../javascript/carousel.js","sourcesContent":["function Loop() {\n\n    this.object = function(obj, callback) {\n        var keys = Object.keys(obj);\n        for (var i = 0; i < keys.length; i++) {\n            (function(i) {\n                callback(keys, i);\n            })(i);\n        }\n    }\n\n    this.array = function(array, callback, reverse) {\n        if (reverse) {\n            for (var i = array.length - 1; i > -1; i--) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        } else {\n            for (var i = 0; i < array.length; i++) {\n                (function(i) {\n                    callback(array, i);\n                })(i);\n            }\n        }\n    }\n}\n\n!function(e,n){\"function\"==typeof define&&define.amd?define([\"exports\"],n):n(\"undefined\"!=typeof exports?exports:e.dragscroll={})}(this,function(e){var n,t,o=window,l=document,c=\"mousemove\",r=\"mouseup\",i=\"mousedown\",m=\"EventListener\",d=\"add\"+m,s=\"remove\"+m,f=[],u=function(e,m){for(e=0;e<f.length;)m=f[e++],m=m.container||m,m[s](i,m.md,0),o[s](r,m.mu,0),o[s](c,m.mm,0);for(f=[].slice.call(l.getElementsByClassName(\"dragscroll\")),e=0;e<f.length;)!function(e,m,s,f,u,a){(a=e.container||e)[d](i,a.md=function(n){e.hasAttribute(\"nochilddrag\")&&l.elementFromPoint(n.pageX,n.pageY)!=a||(f=1,m=n.clientX,s=n.clientY,n.preventDefault())},0),o[d](r,a.mu=function(){f=0},0),o[d](c,a.mm=function(o){f&&((u=e.scroller||e).scrollLeft-=n=-m+(m=o.clientX),u.scrollTop-=t=-s+(s=o.clientY),e==l.body&&((u=l.documentElement).scrollLeft-=n,u.scrollTop-=t))},0)}(f[e++])};\"complete\"==l.readyState?u():o[d](\"load\",u,0),e.reset=u});\n/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n(function () {\n  'use strict';\n\n  // polyfill\n  function polyfill() {\n    // aliases\n    var w = window;\n    var d = document;\n\n    // return if scroll behavior is supported and polyfill is not forced\n    if (\n      'scrollBehavior' in d.documentElement.style &&\n      w.__forceSmoothScrollPolyfill__ !== true\n    ) {\n      return;\n    }\n\n    // globals\n    var Element = w.HTMLElement || w.Element;\n    var SCROLL_TIME = 468;\n\n    // object gathering original scroll methods\n    var original = {\n      scroll: w.scroll || w.scrollTo,\n      scrollBy: w.scrollBy,\n      elementScroll: Element.prototype.scroll || scrollElement,\n      scrollIntoView: Element.prototype.scrollIntoView\n    };\n\n    // define timing method\n    var now =\n      w.performance && w.performance.now\n        ? w.performance.now.bind(w.performance)\n        : Date.now;\n\n    /**\n     * indicates if a the current browser is made by Microsoft\n     * @method isMicrosoftBrowser\n     * @param {String} userAgent\n     * @returns {Boolean}\n     */\n    function isMicrosoftBrowser(userAgent) {\n      var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n\n      return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n    }\n\n    /*\n     * IE has rounding bug rounding down clientHeight and clientWidth and\n     * rounding up scrollHeight and scrollWidth causing false positives\n     * on hasScrollableSpace\n     */\n    var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n    /**\n     * changes scroll position inside an element\n     * @method scrollElement\n     * @param {Number} x\n     * @param {Number} y\n     * @returns {undefined}\n     */\n    function scrollElement(x, y) {\n      this.scrollLeft = x;\n      this.scrollTop = y;\n    }\n\n    /**\n     * returns result of applying ease math function to a number\n     * @method ease\n     * @param {Number} k\n     * @returns {Number}\n     */\n    function ease(k) {\n      return 0.5 * (1 - Math.cos(Math.PI * k));\n    }\n\n    /**\n     * indicates if a smooth behavior should be applied\n     * @method shouldBailOut\n     * @param {Number|Object} firstArg\n     * @returns {Boolean}\n     */\n    function shouldBailOut(firstArg) {\n      if (\n        firstArg === null ||\n        typeof firstArg !== 'object' ||\n        firstArg.behavior === undefined ||\n        firstArg.behavior === 'auto' ||\n        firstArg.behavior === 'instant'\n      ) {\n        // first argument is not an object/null\n        // or behavior is auto, instant or undefined\n        return true;\n      }\n\n      if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n        // first argument is an object and behavior is smooth\n        return false;\n      }\n\n      // throw error when behavior is not supported\n      throw new TypeError(\n        'behavior member of ScrollOptions ' +\n          firstArg.behavior +\n          ' is not a valid value for enumeration ScrollBehavior.'\n      );\n    }\n\n    /**\n     * indicates if an element has scrollable space in the provided axis\n     * @method hasScrollableSpace\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function hasScrollableSpace(el, axis) {\n      if (axis === 'Y') {\n        return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n      }\n\n      if (axis === 'X') {\n        return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n      }\n    }\n\n    /**\n     * indicates if an element has a scrollable overflow property in the axis\n     * @method canOverflow\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function canOverflow(el, axis) {\n      var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n\n      return overflowValue === 'auto' || overflowValue === 'scroll';\n    }\n\n    /**\n     * indicates if an element can be scrolled in either axis\n     * @method isScrollable\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function isScrollable(el) {\n      var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n      var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n\n      return isScrollableY || isScrollableX;\n    }\n\n    /**\n     * finds scrollable parent of an element\n     * @method findScrollableParent\n     * @param {Node} el\n     * @returns {Node} el\n     */\n    function findScrollableParent(el) {\n      while (el !== d.body && isScrollable(el) === false) {\n        el = el.parentNode || el.host;\n      }\n\n      return el;\n    }\n\n    /**\n     * self invoked function that, given a context, steps through scrolling\n     * @method step\n     * @param {Object} context\n     * @returns {undefined}\n     */\n    function step(context) {\n      var time = now();\n      var value;\n      var currentX;\n      var currentY;\n      var elapsed = (time - context.startTime) / SCROLL_TIME;\n\n      // avoid elapsed times higher than one\n      elapsed = elapsed > 1 ? 1 : elapsed;\n\n      // apply easing to elapsed time\n      value = ease(elapsed);\n\n      currentX = context.startX + (context.x - context.startX) * value;\n      currentY = context.startY + (context.y - context.startY) * value;\n\n      context.method.call(context.scrollable, currentX, currentY);\n\n      // scroll more if we have not reached our destination\n      if (currentX !== context.x || currentY !== context.y) {\n        w.requestAnimationFrame(step.bind(w, context));\n      }\n    }\n\n    /**\n     * scrolls window or element with a smooth behavior\n     * @method smoothScroll\n     * @param {Object|Node} el\n     * @param {Number} x\n     * @param {Number} y\n     * @returns {undefined}\n     */\n    function smoothScroll(el, x, y) {\n      var scrollable;\n      var startX;\n      var startY;\n      var method;\n      var startTime = now();\n\n      // define scroll context\n      if (el === d.body) {\n        scrollable = w;\n        startX = w.scrollX || w.pageXOffset;\n        startY = w.scrollY || w.pageYOffset;\n        method = original.scroll;\n      } else {\n        scrollable = el;\n        startX = el.scrollLeft;\n        startY = el.scrollTop;\n        method = scrollElement;\n      }\n\n      // scroll looping over a frame\n      step({\n        scrollable: scrollable,\n        method: method,\n        startTime: startTime,\n        startX: startX,\n        startY: startY,\n        x: x,\n        y: y\n      });\n    }\n\n    // ORIGINAL METHODS OVERRIDES\n    // w.scroll and w.scrollTo\n    w.scroll = w.scrollTo = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.scroll.call(\n          w,\n          arguments[0].left !== undefined\n            ? arguments[0].left\n            : typeof arguments[0] !== 'object'\n              ? arguments[0]\n              : w.scrollX || w.pageXOffset,\n          // use top prop, second argument if present or fallback to scrollY\n          arguments[0].top !== undefined\n            ? arguments[0].top\n            : arguments[1] !== undefined\n              ? arguments[1]\n              : w.scrollY || w.pageYOffset\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        w,\n        d.body,\n        arguments[0].left !== undefined\n          ? ~~arguments[0].left\n          : w.scrollX || w.pageXOffset,\n        arguments[0].top !== undefined\n          ? ~~arguments[0].top\n          : w.scrollY || w.pageYOffset\n      );\n    };\n\n    // w.scrollBy\n    w.scrollBy = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0])) {\n        original.scrollBy.call(\n          w,\n          arguments[0].left !== undefined\n            ? arguments[0].left\n            : typeof arguments[0] !== 'object' ? arguments[0] : 0,\n          arguments[0].top !== undefined\n            ? arguments[0].top\n            : arguments[1] !== undefined ? arguments[1] : 0\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        w,\n        d.body,\n        ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n        ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n      );\n    };\n\n    // Element.prototype.scroll and Element.prototype.scrollTo\n    Element.prototype.scroll = Element.prototype.scrollTo = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        // if one number is passed, throw error to match Firefox implementation\n        if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n          throw new SyntaxError('Value could not be converted');\n        }\n\n        original.elementScroll.call(\n          this,\n          // use left prop, first number argument or fallback to scrollLeft\n          arguments[0].left !== undefined\n            ? ~~arguments[0].left\n            : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n          // use top prop, second argument or fallback to scrollTop\n          arguments[0].top !== undefined\n            ? ~~arguments[0].top\n            : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop\n        );\n\n        return;\n      }\n\n      var left = arguments[0].left;\n      var top = arguments[0].top;\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        this,\n        this,\n        typeof left === 'undefined' ? this.scrollLeft : ~~left,\n        typeof top === 'undefined' ? this.scrollTop : ~~top\n      );\n    };\n\n    // Element.prototype.scrollBy\n    Element.prototype.scrollBy = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.elementScroll.call(\n          this,\n          arguments[0].left !== undefined\n            ? ~~arguments[0].left + this.scrollLeft\n            : ~~arguments[0] + this.scrollLeft,\n          arguments[0].top !== undefined\n            ? ~~arguments[0].top + this.scrollTop\n            : ~~arguments[1] + this.scrollTop\n        );\n\n        return;\n      }\n\n      this.scroll({\n        left: ~~arguments[0].left + this.scrollLeft,\n        top: ~~arguments[0].top + this.scrollTop,\n        behavior: arguments[0].behavior\n      });\n    };\n\n    // Element.prototype.scrollIntoView\n    Element.prototype.scrollIntoView = function() {\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.scrollIntoView.call(\n          this,\n          arguments[0] === undefined ? true : arguments[0]\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      var scrollableParent = findScrollableParent(this);\n      var parentRects = scrollableParent.getBoundingClientRect();\n      var clientRects = this.getBoundingClientRect();\n\n      if (scrollableParent !== d.body) {\n        // reveal element inside parent\n        smoothScroll.call(\n          this,\n          scrollableParent,\n          scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n          scrollableParent.scrollTop + clientRects.top - parentRects.top\n        );\n\n        // reveal parent in viewport unless is fixed\n        if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n          w.scrollBy({\n            left: parentRects.left,\n            top: parentRects.top,\n            behavior: 'smooth'\n          });\n        }\n      } else {\n        // reveal element in viewport\n        w.scrollBy({\n          left: clientRects.left,\n          top: clientRects.top,\n          behavior: 'smooth'\n        });\n      }\n    };\n  }\n\n  if (typeof exports === 'object' && typeof module !== 'undefined') {\n    // commonjs\n    module.exports = { polyfill: polyfill };\n  } else {\n    // global\n    polyfill();\n  }\n\n}());\n\n\nfunction Carousel(el) {\n\n    var self = this;\n    var loop = new Loop();\n\n    this.el = el;\n\n    this.init = function() {\n        this.left = this.el.querySelector('button[data-direction=\"left\"].js-carousel__control');\n        this.right = this.el.querySelector('button[data-direction=\"right\"].js-carousel__control');\n        this.container = this.el.querySelector('.js-carousel__container');\n        this.link = this.container.querySelectorAll(this.el.getAttribute('data-carousel-items'));\n        this.thumbnails = this.el.querySelector('.js-carousel__thumbnails');\n        this.thumbnail = this.el.querySelectorAll('.js-carousel__thumbnail');\n        this.dot = this.el.querySelectorAll('.js-carousel__dot');\n        this.pagination = this.el.querySelector('.js-carousel__pagination');\n\n        if (this.left) {\n            this.left.onclick = this.scrollLeft.bind(this);\n        }\n        \n        if (this.right) {\n            this.right.onclick = this.scrollRight.bind(this);\n        }\n\n        this.oldMouseX = null;\n        this.mouseX = null;\n        this.mouseDown = false;\n        this.clicked = false;\n        this.activate = this.el.getAttribute('data-carousel-activate');\n        this.snap = this.el.hasAttribute('data-carousel-snap');\n\n        this.id = 0;\n\n        this.controlClicked = false;\n        this.controlByThumbnail = false;\n        this.controlByDot = false;\n\n        if (this.thumbnail[0]) {\n            if (this.thumbnail[0].clientHeight > 0) {\n                this.controlByThumbnail = true;\n            }\n        }\n\n        if (this.el.hasAttribute('data-carousel-enlarge')) {\n            this.container.classList.remove('dragscroll');\n        }\n\n        this.defineBreakpoints();\n        this.checkBreakpoint();\n\n        this.updateControls();\n        this.watchScroll();\n        this.watchForResize();\n        this.checkIfThumbnailsExist();\n        this.checkIfDotsExist();\n        this.updatePagination();\n        this.resizeThumbnails();\n\n        loop.array(this.thumbnail, function(array, i) {\n            // Assign an ID to the thumbnail\n            array[i].setAttribute('data-id', i);\n\n            // If the thumbnail is clicked, update the carousel\n            array[i].onclick = function(e) {\n                e.preventDefault();\n                self.id = this.getAttribute('data-id');\n                self.controlClicked = true;\n                self.scroll();\n            }\n\n            if (i == 0) {\n                self.updateThumbnails(array[i]);\n            }\n        });\n\n        loop.array(this.dot, function(array, i) {\n            // Assign an ID to the dot\n            array[i].setAttribute('data-id', i);\n\n            // If the dot is clicked, update the carousel\n            array[i].onclick = function(e) {\n                e.preventDefault();\n                self.id = this.getAttribute('data-id');\n                self.controlClicked = true;\n                self.scroll();\n            }\n\n            if (i == 0) {\n                self.updateDots(array[i]);\n            }\n        });\n\n        this.resetKeys();\n\n        document.onkeydown = function(e) {\n            if (e.key == 'Meta') {\n                self.keys.meta = true;\n            }\n            if (e.key == 'Control') {\n                self.keys.ctrl = true;\n            }\n        }\n\n        document.onkeyup = function(e) {\n            if (e.key == 'Meta') {\n                self.keys.meta = false;\n            }\n            if (e.key == 'Control') {\n                self.keys.ctrl = false;\n            }\n        }\n\n        loop.array(this.link, function(array, i) {\n            // Assign an ID to the link\n            array[i].setAttribute('data-id', i);\n\n            // If the link is clicked, but was actually a drag, then prevent it\n            array[i].onclick = function(e) {\n                if (self.isValid()) {\n                    if (!self.clicked) {\n                        e.preventDefault();\n                    } else {\n                        if (self.keys.meta || self.keys.ctrl) {\n                            e.preventDefault();\n                            window.open(this.href);\n                        }\n                    }\n\n                    self.clicked = false;\n                }\n            }\n\n            // When the mouse is clicked, activate the mouseDown variable\n            array[i].onmousedown = function(e) {\n                if (self.isValid()) {\n                    e.preventDefault();\n                    self.mouseDown = true;\n                }\n            }\n\n            // When the mouse is moved, updated the mouseX variable\n            array[i].onmousemove = function(e) {\n                if (self.isValid()) {\n                    e.preventDefault();\n                    if (self.mouseDown) {\n                        self.mouseX = e.clientX;\n                    }\n                }\n            }\n\n            // When the mouse is released, if the mouseX has not changed, then trigger the click on the link\n            array[i].onmouseup = function(e) {\n                if (self.isValid()) {\n                    e.preventDefault();\n                    self.mouseDown = false;\n\n                    if (self.oldMouseX == self.mouseX) {\n                        self.clicked = true;\n                    }\n\n                    self.oldMouseX = self.mouseX;\n                }\n            }\n\n            // Scroll to the link when it is focussed\n            array[i].onfocus = function() {\n                if (self.isValid()) {\n                    self.id = i;\n                    self.scrollTo(this);\n                    self.updateActive(true);\n                }\n            }\n\n            // Unset the active state of the link when it is blurred\n            array[i].onblur = function() {\n                if (self.isValid()) {\n                    self.unsetActive(this);\n                }\n            }\n        });\n    }\n\n    // Check if the carousel is valid to be shown/interacted with\n    this.isValid = function() {\n        if (this.activate) {\n            var breakpoint = Soho.breakpoints[Soho.sizes[this.activate]];\n\n            return window.matchMedia('(' + breakpoint.type + ': ' + breakpoint.size + 'px)').matches;\n        }\n        return true;\n    }\n\n    // Scroll left\n    this.scrollLeft = function() {\n        this.animate(this.container.scrollLeft - (this.container.clientWidth - this.getContainerPadding()), 200, 'linear', function() {\n            self.updateDots(self.dot[self.id]);\n            self.updateThumbnails(self.thumbnail[self.id]);\n            self.updatePagination();\n            self.updated();\n        });\n        this.controlClicked = true;\n    }\n\n    // Scroll right\n    this.scrollRight = function() {\n        this.animate(this.container.scrollLeft + (this.container.clientWidth - this.getContainerPadding()), 200, 'linear', function() {\n            self.updateDots(self.dot[self.id]);\n            self.updateThumbnails(self.thumbnail[self.id]);\n            self.updatePagination();\n            self.updated();\n        });\n        this.controlClicked = true;\n    }\n\n    // Scroll to the active item\n    this.scroll = function() {\n        this.scrollTo(this.link[this.id]);\n        this.updateDots(this.dot[this.id]);\n        this.updateThumbnails(this.thumbnail[this.id]);\n        this.updatePagination();\n        this.updated();\n    }\n\n    // Scroll to a given item\n    this.scrollTo = function(el) {\n        this.updateControls();\n\n        if (this.container.scrollLeft + this.container.clientWidth == this.container.scrollWidth && !this.controlByThumbnail && !this.controlByDot) {\n            if (!self.controlByThumbnail && !self.controlByDot) {\n                this.resetFocus();\n                if (self.controlClicked) {\n                    this.disableFocus(true);\n                    this.link[self.id].onfocus = function() {\n                        self.scrollTo(this);\n                        self.resetFocus();\n                        self.updateActive(true);\n                    }\n                }\n                self.controlClicked = false;\n            }\n        } else {\n            self.animate(el.parentNode.offsetLeft - el.parentNode.parentNode.offsetLeft - this.getContainerPadding(), 200, 'linear', function() {\n                self.updateDots(self.dot[self.id]);\n                self.updateThumbnails(self.thumbnail[self.id]);\n                self.updateActive();\n                self.resetFocus();\n                self.scrolled = true;\n            });\n        }\n    }\n\n    this.getTarget = function() {\n        if (this.controlByThumbnail) {\n            return this.thumbnail\n        } else if (this.controlByDot) {\n            return this.dot\n        } else {\n            return this.link;\n        }\n    }\n\n    // Disable focus on all (or all BUT the active item) items\n    this.disableFocus = function(ignoreActive) {\n        var item = this.getTarget();\n\n        loop.array(item, function(array, i) {\n            if (!ignoreActive || (ignoreActive && i != self.id)) {\n                array[i].setAttribute('tabIndex', -1);\n            }\n        });\n    }\n\n    this.resetFocus = function() {\n        var item = this.getTarget();\n\n        loop.array(item, function(array, i) {\n            array[i].removeAttribute('tabIndex');\n        });\n    }\n\n    // Unset the last active carousel item and set the new one\n    this.updateActive = function(onfocus) {\n        var item = this.getTarget();\n        var active = item[self.id];\n        if (onfocus) {\n            active = document.activeElement;\n        }\n        loop.array(item, function(array, i) {\n            self.unsetActive(array[i]);\n        });\n\n        this.setActive(active);\n    }\n\n    // Set the active carousel item\n    this.setActive = function(el) {\n        el.setAttribute('data-carousel-item-active', true);\n    }\n\n    // Unset the active carousel item\n    this.unsetActive = function(el) {\n        el.removeAttribute('data-carousel-item-active');\n    }\n\n    // Watch the carousel for scrolling\n    this.watchScroll = function() {\n        var timeout;\n\n        this.container.onscroll = function() {\n            if (self.scrolled) {\n                self.scrolled = false;\n                return;\n            }\n            var active = null;\n            loop.array(self.link, function(array, i) {\n                if (array[i].parentNode.offsetLeft - array[i].parentNode.clientWidth - self.getContainerPadding() <= self.container.scrollLeft) {\n                    active = array[i].getAttribute('data-id');\n                }\n            });\n\n            self.id = parseInt(active);\n\n            self.resetFocus();\n            self.disableFocus(true);\n            if (!isNaN(self.id)) {\n                var item = self.getTarget();\n\n                item[self.id].onfocus = function() {\n                    self.resetFocus();\n                    self.updateActive(true);\n                }\n            }\n\n            clearTimeout(timeout);\n            timeout = setTimeout(function() {\n                if (!self.controlClicked) {\n                    self.resetFocus();\n                    if (!isNaN(self.id)) {\n                        var item = self.getTarget();\n\n                        item[self.id].focus();\n                    }\n                } else {\n                    self.controlClicked = false;\n                }\n\n                self.updateControls();\n                self.updatePagination();\n                self.updated();\n\n                if (self.snap) {\n                    var center = self.container.offsetLeft + self.container.scrollLeft + (self.container.clientWidth / 2);\n\n                    loop.array(self.link, function(array, i) {\n                        if (center >= array[i].offsetLeft && center <= array[i].offsetLeft + array[i].clientWidth) {\n                            if (self.container.scrollLeft !== array[i].offsetLeft) {\n                                self.scrollTo(array[i]);\n                                array[i].focus();\n                                self.updateThumbnails(self.thumbnail[i]);\n                            }\n                        }\n                    });\n                }\n            }, 100);\n        }\n    }\n\n    // Update the state of the carousel controls\n    this.updateControls = function() {\n        if (this.left) {\n            if (this.container.scrollLeft == 0) {\n                this.left.setAttribute('disabled', true);\n            } else {\n                this.left.removeAttribute('disabled');\n            }\n        }\n        \n        if (this.right) {\n            if (this.container.scrollLeft + this.container.clientWidth == this.container.scrollWidth) {\n                this.right.setAttribute('disabled', true);\n            } else {\n                this.right.removeAttribute('disabled');\n            }\n        }\n    }\n\n    // Define the padding on the container\n    this.getContainerPadding = function() {\n        var data = JSON.parse(this.el.getAttribute('data-carousel-padding'));\n\n        if (!data) {\n            return;\n        }\n\n        var padding = false;\n        var arithmetic = ['+', '-', '/', '*'];\n        var units = ['px', 'vw', 'vh'];\n\n        var fn = {\n            px: function(value) {\n                return parseInt(value.replace('px', ''));\n            },\n            vw: function(value) {\n                return (window.innerWidth / 100) * parseInt(value.replace('vw', ''));\n            },\n            vh: function(value) {\n                return (window.innerHeight / 100) * parseInt(value.replace('vh', ''));\n            },\n            '+': function(total, value) {\n                return total + value;\n            },\n            '-': function(total, value) {\n                return total - value;\n            },\n            '/': function(total, value) {\n                return total / value;\n            },\n            '*': function(total, value) {\n                return total * value;\n            }\n        };\n\n        loop.object(data, function(object, i) {\n            var value = data[object[i]];\n            if (typeof data[object[i]] == 'object') {\n                var calculation = [];\n                loop.array(data[object[i]], function(array, j) {\n                    if (typeof array[j] == 'string') {\n                        if (arithmetic.indexOf(array[j]) > -1) {\n                            calculation.push(array[j]);\n                        } else {\n                            loop.array(units, function(unit, k) {\n                                if (array[j].indexOf(unit[k]) > -1) {\n                                    calculation.push(fn[unit[k]](array[j]));\n                                }\n                            });\n                        }\n                    } else {\n                        calculation.push(array[j]);\n                    }\n                });\n                var total = 0;\n                var method = null;\n                loop.array(calculation, function(array, l) {\n                    if (method == null) {\n                        if (typeof array[l] == 'string') {\n                            if (arithmetic.indexOf(array[l]) > -1) {\n                                method = array[l];\n                            }\n                        } else {\n                            total = array[l];\n                        }\n                    } else {\n                        total = fn[method](total, array[l]);\n                    }\n                });\n\n                value = total;\n            }\n            if (Soho.sizes[object[i]] !== false) {\n                var breakpoint = Soho.breakpoints[Soho.sizes[object[i]]];\n\n                if (window.matchMedia('(' + breakpoint.type + ': ' + breakpoint.size + 'px)').matches) {\n                    padding = value;\n                }\n            } else {\n                if (padding === false) {\n                    padding = value;\n                }\n            }\n        });\n\n        return padding;\n    }\n\n    // Unset the active thumbnail\n    this.unsetThumbnail = function() {\n        var active = this.el.querySelector('[data-gallery-thumbnail-active=\"true\"]');\n\n        if (active) {\n            active.removeAttribute('data-gallery-thumbnail-active');\n        }\n    }\n\n    // Make a thumbnail active\n    this.updateThumbnails = function(el) {\n        this.unsetThumbnail();\n        if (el) {\n            el.setAttribute('data-gallery-thumbnail-active', true);\n        }\n    }\n\n    // Check if carousel thumbnails exist\n    this.checkIfThumbnailsExist = function(timeout) {\n        timeout = timeout || 0;\n        if (this.thumbnail[0]) {\n            if (this.thumbnail[0].clientHeight > 0) {\n                setTimeout(function() {\n                    self.controlByThumbnail = true;\n                    self.disableFocus();\n                    self.controlClicked = true;\n                    self.scroll();\n                }, timeout);\n            } else {\n                this.controlByThumbnail = false;\n            }\n        }\n    }\n\n    // Unset the active dot\n    this.unsetDot = function() {\n        var active = this.el.querySelector('[data-gallery-dot-active=\"true\"]');\n\n        if (active) {\n            active.removeAttribute('data-gallery-dot-active');\n        }\n    }\n\n    // Make a dot active\n    this.updateDots = function(el) {\n        this.unsetDot();\n        if (el) {\n            el.setAttribute('data-gallery-dot-active', true);\n        }\n    }\n\n    // Check if carousel dots exist\n    this.checkIfDotsExist = function(timeout) {\n        timeout = timeout || 0;\n        if (this.dot[0]) {\n            if (this.dot[0].clientHeight > 0) {\n                setTimeout(function() {\n                    self.controlByDot = true;\n                    self.disableFocus();\n                    self.controlClicked = true;\n                    self.scroll();\n                }, timeout);\n            } else {\n                this.controlByDot = false;\n            }\n        }\n    }\n\n    this.updatePagination = function() {\n        if (this.pagination) {\n            this.pagination.innerHTML = (parseInt(this.id) + 1) + '/' + this.link.length\n        }\n    }\n\n    this.updated = function() {\n        var oldId = this.el.getAttribute('data-active');\n        var oldItem = this.link[oldId];\n        var newItem = this.link[this.id]\n\n        if (this.id != oldId) {\n            // If it has moved to another item pause and hide the video if playing\n            if (oldItem && oldItem.classList.contains('js-play-video')) {\n                var videoElementId = oldItem.getAttribute('data-video-element-id');\n                var videoElement = document.getElementById('video_' + videoElementId);\n\n                var player = $(oldItem).data('player');\n\n                if (player && videoElement) {\n                    player.pause();\n                    player.unload();\n                    videoElement.classList.add('d3r-hidden');\n                    oldItem.classList.remove(oldItem.getAttribute('data-playing-class'));\n                }\n            }\n\n            // Only autoplay on >= tablet\n            var tabletBreakpoint = Soho.breakpoints['tablet'];\n            if (\n                newItem\n                && newItem.classList.contains('js-play-video')\n                && !window.matchMedia('(' + tabletBreakpoint.type + ': ' + tabletBreakpoint.size + 'px)').matches\n            ) {\n                newItem.dispatchEvent(new CustomEvent('play'));\n            }\n        }\n\n        this.el.setAttribute('data-active', this.id);\n        this.el.dispatchEvent(new CustomEvent('carouselUpdated', {\n            detail: {\n                item: this.link[this.id]\n            }\n        }));\n    }\n\n    // Watch the window for being resized\n    this.watchForResize = function() {\n\n        if (this.breakpoints === undefined) {\n            return;\n        }\n\n        var windowResizing;\n\n        window.addEventListener('resize', function() {\n            clearTimeout(windowResizing);\n            windowResizing = setTimeout(function() {\n                self.checkBreakpoint({\n                    breakpointChanged: function() {\n                        self.checkIfThumbnailsExist(100);\n                        self.checkIfDotsExist(100);\n                    }\n                });\n                setTimeout(function() {\n                    self.resizeThumbnails();\n                }, 100);\n            }, 100);\n        });\n    }\n\n    this.resizeThumbnails = function() {\n        if (this.controlByThumbnail) {\n            this.thumbnails.style.height = this.container.clientHeight + 'px';\n        }\n    }\n\n    // Define the breakpoints to be taken into consideration for layout changes\n    this.defineBreakpoints = function() {\n        var data = JSON.parse(this.el.getAttribute('data-carousel-layout-check'));\n\n        if (!data || data.length == 0) {\n            return;\n        }\n\n        this.breakpoints = {};\n        this.currentBreakpoint;\n\n        loop.array(data, function(array, i) {\n            self.breakpoints[array[i]] = Soho.breakpoints[Soho.sizes[array[i]]];\n        });\n    }\n\n    // Check the current breakpoint\n    this.checkBreakpoint = function(optionsOverride) {\n        if (this.breakpoints === undefined) {\n            return;\n        }\n\n        var breakpoint;\n        var options = {\n            breakpointChanged: function() {}\n        };\n\n        $.extend(options, optionsOverride);\n\n        loop.object(self.breakpoints, function(object, i) {\n            if (self.breakpoints[object[i]] !== undefined) {\n                if (window.matchMedia('(' + self.breakpoints[object[i]].type + ': ' + self.breakpoints[object[i]].size + 'px)').matches) {\n                    breakpoint = object[i];\n                }\n            } else {\n                breakpoint = object[i];\n            }\n        });\n\n        if (this.currentBreakpoint != breakpoint) {\n            this.currentBreakpoint = breakpoint;\n\n            if (typeof options.breakpointChanged == 'function') {\n                options.breakpointChanged();\n            }\n        }\n    }\n\n    this.resetKeys = function() {\n        this.keys = {\n            meta: false,\n            ctrl: false\n        };\n    }\n\n    this.animate = function(destination, duration, easing, callback) {\n        var duration = duration || 200;\n        var easing = easing || 'linear';\n        var easings = {\n            linear: function(t) {\n                return t;\n            },\n            easeInQuad: function(t) {\n                return t * t;\n            },\n            easeOutQuad: function(t) {\n                return t * (2 - t);\n            },\n            easeInOutQuad: function(t) {\n                return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n            },\n            easeInCubic: function(t) {\n                return t * t * t;\n            },\n            easeOutCubic: function(t) {\n                return (--t) * t * t + 1;\n            },\n            easeInOutCubic: function(t) {\n                return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n            },\n            easeInQuart: function(t) {\n                return t * t * t * t;\n            },\n            easeOutQuart: function(t) {\n                return 1 - (--t) * t * t * t;\n            },\n            easeInOutQuart: function(t) {\n                return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t;\n            },\n            easeInQuint: function(t) {\n                return t * t * t * t * t;\n            },\n            easeOutQuint: function(t) {\n                return 1 + (--t) * t * t * t * t;\n            },\n            easeInOutQuint: function(t) {\n                return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t;\n            }\n        };\n\n        var start = self.container.scrollLeft;\n        var startTime = new Date().getTime();\n\n        if (destination < 0) {\n            destination = 0;\n        } else if (self.container.scrollWidth - this.container.clientWidth < destination) {\n            destination = self.container.scrollWidth - this.container.clientWidth;\n        }\n\n        function scroll() {\n            var now = new Date().getTime();\n            var time = Math.min(1, ((now - startTime) / duration));\n            var timeFunction = easings[easing](time);\n            self.container.scroll(Math.ceil((timeFunction * (destination - start)) + start), 0);\n\n            if (self.container.scrollLeft === destination) {\n                if (callback) {\n                    callback();\n                }\n                return;\n            }\n\n            requestAnimationFrame(scroll);\n        }\n\n        scroll();\n    }\n}\n\n//=require js-tools/loop.js\nfunction Viewport(breakpoints) {\n\n    // Get the breakpoint config\n    this.breakpoints = breakpoints;\n\n    // Constuct the breakpoint for the media query\n    this.mediaQuery = function(breakpoint) {\n        return '(' + this.breakpoints[breakpoint].type + ': ' + this.breakpoints[breakpoint].size + 'px)';\n    }\n\n    // Check if the media query matches\n    this.matchMedia = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint));\n    }\n\n    // Check if the media query matches\n    this.matches = function(breakpoint) {\n        return window.matchMedia(this.mediaQuery(breakpoint)).matches;\n    }\n\n    // Construct the custom media query\n    this.customMediaQuery = function(breakpoint) {\n        return breakpoint;\n    }\n\n    // Check if the custom media query matches\n    this.customMatchMedia = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint));\n    }\n\n    // Check if the custom media query matches\n    this.customMatches = function(breakpoint) {\n        return window.matchMedia(this.customMediaQuery(breakpoint)).matches;\n    }\n\n    // Watch for viewport resize\n    this.resize = function(callback) {\n        var windowResizing;\n\n        window.addEventListener('resize', function() {\n            clearTimeout(windowResizing);\n            windowResizing = setTimeout(function() {\n                if (typeof callback == 'function') {\n                    callback();\n                }\n            }, 100);\n        });\n    }\n}\n\n\nSoho.carousels = [];\n\nSoho.carousel = function() {\n    var self = this;\n    var loop = new Loop();\n    var viewport = new Viewport(Soho.breakpoints);\n\n    this.active = [];\n\n    this.toggleEnlargement = function(item, enable) {\n        const imgElement = item.querySelector('img');\n        imgElement.style.width = '100%';\n\n        if (!imgElement) {\n            console.error('No image found in item', item);\n            return;\n        }\n    \n        // Clear existing enlargement elements\n        const existingEnlargePane = item.querySelector('.enlarge_pane');\n        if (existingEnlargePane) {\n            existingEnlargePane.parentNode.removeChild(existingEnlargePane);\n        }\n    \n        if (enable) {\n            // Create and add enlargement elements\n            const enlargePane = document.createElement('div');\n            const enlarge = document.createElement('div');\n            const enlargeContain = document.createElement('div');\n            const link = document.createElement('a');\n    \n            enlargePane.classList.add('enlarge_pane');\n            enlarge.classList.add('enlarge');\n            enlargeContain.classList.add('enlarge_contain');\n            link.href = imgElement.src;\n    \n            link.appendChild(imgElement.cloneNode());\n            enlargeContain.appendChild(link);\n            enlarge.appendChild(enlargeContain);\n            enlargePane.appendChild(enlarge);\n    \n            item.appendChild(enlargePane);\n    \n            $(enlarge).enlarge();\n    \n            // Remove the original image\n            imgElement.parentNode.removeChild(imgElement);\n        }\n    }       \n\n    this.watchForUpdate = function(id, item) {\n        item.addEventListener('carouselUpdated', function(event) {\n            if (!viewport.matches('tablet')) {\n                var eventItem = event.detail.item;\n                if (eventItem && item.getAttribute('data-active') != self.active[id]) {\n                    self.active[id] = item.getAttribute('data-active');\n\n                    // Toggle enlargement based on data-enlarge attribute\n                    const shouldEnlarge = !eventItem.getAttribute('data-enlarge') || eventItem.getAttribute('data-enlarge') === 'true';\n                    self.toggleEnlargement(eventItem, shouldEnlarge);\n                }\n            }\n        });\n    }\n\n    this.watchForResize = function(id, item) {\n        viewport.matchMedia('tablet').addListener(function(e) {\n            var active = item.querySelector('.gallery__item[data-id=\"' + item.getAttribute('data-active') + '\"]');\n            const shouldEnlarge = !active.getAttribute('data-enlarge') || active.getAttribute('data-enlarge') === 'true';\n\n            if (e.matches) {\n                self.toggleEnlargement(active, false);\n            } else {\n                self.toggleEnlargement(active, shouldEnlarge);\n            }\n        });\n    }\n\n    loop.array(document.querySelectorAll('.js-carousel'), function(array, i) {\n        var carousel = new Carousel(array[i]);\n        carousel.init();\n\n        Soho.carousels.push(carousel);\n\n        if (array[i].hasAttribute('data-carousel-enlarge')) {\n            self.watchForUpdate(i, array[i]);\n            self.watchForResize(i, array[i]);\n        }\n    });\n}\n\nSoho.carousel();\n"],"sourceRoot":"../../../../resources/javascript"}