{"version":3,"sources":["../src/js/bod-modal.js"],"names":["$","BodModal","modal","$window","window","$document","document","$modal","$image","find","$expand","slideCount","activeSlide","displayTitle","attr","timer","disableClick","slideInterval","undefined","parseInt","autoplay","swipeStarted","openModal","bind","closeModal","prevSlide","nextSlide","imageTitle","displaySlide","navLink","debounceresize","resize","triggerSlide","startSwipe","endSwipe","cancelSwipe","on","evt","preventDefault","stopPropagation","filename","target","hasClass","constructor","extractFile","src","html","buildModalHtml","append","setTimeout","cancelAutoPlay","event","swipeStartX","changedTouches","pageX","swipeStartY","pageY","checkYSwipe","clearTimeout","$curTitle","removeClass","css","that","each","imageAlt","imageHref","parent","curFilename","title","i","newSlide","$curImage","hPadBorder","outerHeight","height","wPadBorder","outerWidth","width","topOffset","position","top","leftOffset","left","addClass","off","remove","data","type","startY","endY","path","pathParts","split","length","bodModals","push","jQuery"],"mappings":"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","file":"bod-modal.js","sourcesContent":["// Immediately executing function passing in JQuery so not to conflict\r\n// with other libs that use $\r\n\r\n(function($) {\r\n \"use strict\";\r\n\r\n class BodModal {\r\n\r\n constructor(modal) {\r\n this.$window = $(window);\r\n this.$document = $(document);\r\n this.$modal = $(modal);\r\n this.$image = this.$modal.find('img');\r\n this.$expand = this.$modal.find('.bod-expand-icon');\r\n this.slideCount = 0;\r\n this.activeSlide = 0;\r\n this.displayTitle = this.$modal.attr('data-title');\r\n this.timer = '';\r\n this.disableClick = false;\r\n\r\n\r\n // data-interval contains slide auto play interval in seconds i.e. time between slides\r\n // 0 = no autoplay, undefined value defaults to 5 seconds \r\n this.slideInterval = $(modal).attr(\"data-interval\");\r\n this.slideInterval == undefined ? this.slideInterval = 5000 : this.slideInterval = parseInt(this.slideInterval) * 1000;\r\n this.autoplay = '';\r\n this.swipeStarted = false;\r\n\r\n this.openModal = this.openModal.bind(this);\r\n this.closeModal = this.closeModal.bind(this);\r\n this.prevSlide = this.prevSlide.bind(this);\r\n this.nextSlide = this.nextSlide.bind(this);\r\n this.imageTitle = this.imageTitle.bind(this);\r\n this.displaySlide = this.displaySlide.bind(this);\r\n this.navLink = this.navLink.bind(this);\r\n this.debounceresize = this.debounceresize.bind(this);\r\n this.resize = this.resize.bind(this);\r\n this.triggerSlide = this.triggerSlide.bind(this);\r\n this.startSwipe = this.startSwipe.bind(this);\r\n this.endSwipe = this.endSwipe.bind(this);\r\n this.cancelSwipe = this.cancelSwipe.bind(this);\r\n\r\n // click on one of the modal images \r\n this.$image.on('click touchstart', this.openModal);\r\n this.$expand.on('click touchstart', this.openModal);\r\n\r\n }\r\n\r\n\r\n // Inserts modal html in document and displays first slide\r\n openModal(evt) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n\r\n let filename = '';\r\n if ($(evt.target).hasClass('bod-expand-icon')) {\r\n filename = this.constructor.extractFile($(evt.target).find('img').attr('src'));\r\n } else {\r\n // get filename of img that user click on to trigger modal\r\n filename = this.constructor.extractFile(evt.target.src);\r\n }\r\n\r\n let html = this.buildModalHtml(filename);\r\n\r\n this.$document.find('body').append(html);\r\n\r\n // handle image title\r\n\r\n if (this.displayTitle) {\r\n // need to wait for html append to finish rendering\r\n setTimeout(() => {\r\n this.imageTitle(true);\r\n this.$window.on('resize', this.debounceresize);\r\n }, 500);\r\n }\r\n\r\n // event handler to close modal \r\n $('.bodCloseIcon').on('click touchstart', this.closeModal);\r\n\r\n // handle mobile swipe\r\n $('.bodOpenModal').on('touchstart', this.startSwipe);\r\n $('.bodOpenModal').on('touchend', this.endSwipe);\r\n $('.bodOpenModal').on('touchcancel', this.cancelSwipe);\r\n\r\n // next and previous slide events\r\n $('.bodNextSlide').on('click touchstart', { cancelAutoPlay: true }, this.nextSlide);\r\n $('.bodPrevSlide').on('click touchstart', { cancelAutoPlay: true }, this.prevSlide);\r\n\r\n // slide nav link events \r\n $('.bodNavLink').on('click touchstart', this.navLink);\r\n\r\n // initiate autoplay\r\n if (this.slideInterval > 0) {\r\n this.autoplay = setTimeout(this.triggerSlide, this.slideInterval);\r\n }\r\n }\r\n\r\n // handle swipe left and right on touchscreen devices\r\n\r\n // start tracking the swipe\r\n startSwipe(event) {\r\n this.swipeStartX = event.changedTouches[0].pageX;\r\n this.swipeStartY = event.changedTouches[0].pageY;\r\n this.swipeStarted = true;\r\n }\r\n\r\n endSwipe(event) {\r\n if (this.swipeStarted) {\r\n // check for left or right swipe. Must swipe by at least 30px \r\n // and cannot be more than 30px up or down\r\n\r\n // check for swipe left\r\n if ((this.swipeStartX > event.changedTouches[0].pageX) &&\r\n (this.swipeStartX - event.changedTouches[0].pageX > 30)) {\r\n\r\n if (!BodModal.checkYSwipe(this.swipeStartY, event.changedTouches[0].pageY)) {\r\n if (this.autoplay) clearTimeout(this.autoplay);\r\n this.nextSlide();\r\n }\r\n\r\n // check for swipe right \r\n } else if ((this.swipeStartX < event.changedTouches[0].pageX) &&\r\n (event.changedTouches[0].pageX - this.swipeStartX > 30)) {\r\n\r\n if (!BodModal.checkYSwipe(this.swipeStartY, event.changedTouches[0].pageY)) {\r\n if (this.autoplay) clearTimeout(this.autoplay);\r\n this.prevSlide();\r\n }\r\n\r\n }\r\n\r\n }\r\n this.swipeStarted = false;\r\n }\r\n\r\n // cancel tracking the swipe\r\n cancelSwipe() {\r\n this.swipeStarted = false;\r\n }\r\n\r\n // use recursive setTimeout so create loop of slides\r\n // better than setInterval because its more precise, does not\r\n // start timeout until adter nextSlide completes. \r\n\r\n triggerSlide() {\r\n this.nextSlide();\r\n this.autoplay = setTimeout(this.triggerSlide, this.slideInterval);\r\n }\r\n\r\n\r\n // Make sure we don't refresh title position until end of resize\r\n debounceresize() {\r\n\r\n // Make title invisible if timer not set. It looks cleaner that way\r\n // and then we stop resizing we will display it again. We also \r\n // move title to top left so that width is not impacted by resize \r\n if (this.$curTitle && !this.timer) {\r\n this.$curTitle.removeClass('bodShowTitle');\r\n this.$curTitle.css({ \"top\": `0`, \"left\": `0` });\r\n }\r\n\r\n // debounce : don't keep calling resize box method, only call if not resized for 0.25s\r\n clearTimeout(this.timer);\r\n this.timer = setTimeout(this.resize, 250);\r\n\r\n }\r\n\r\n\r\n // Called when screen stopped resizing and we can display the title\r\n // in its correct location\r\n resize() {\r\n this.timer = '';\r\n // on resize we have to recalc and display the image title position\r\n this.imageTitle(false);\r\n\r\n }\r\n\r\n // Construct the html that displays the modal slideshow\r\n // filename - string - the filename of the active slide\r\n // return - string - html to display modal\r\n buildModalHtml(filename) {\r\n this.slideCount = 0;\r\n this.activeSlide = 0;\r\n\r\n let html = \"\";\r\n html += \"
\";\r\n html += \"
X
\";\r\n html += \"
\";\r\n\r\n // output slides \r\n\r\n let that = this;\r\n this.$modal.find('img').each(function() {\r\n that.slideCount++;\r\n let imageAlt = $(this).attr(\"alt\");\r\n let imageHref = $(this).parent().attr('href');\r\n\r\n let curFilename = that.constructor.extractFile(imageHref);\r\n if (curFilename === filename) {\r\n html += \"
\";\r\n that.activeSlide = that.slideCount;\r\n } else {\r\n html += \"
\";\r\n }\r\n\r\n html += \"\" + imageAlt + \"\";\r\n // output title\r\n\r\n if (that.displayTitle) {\r\n let title = $(this).parent().attr('title');\r\n if (title) {\r\n html += `
${title}
`;\r\n }\r\n }\r\n html += \"
\";\r\n\r\n });\r\n\r\n // prev and next links\r\n\r\n html += \"
\";\r\n html += \"
\";\r\n\r\n html += \"
\";\r\n\r\n // output title\r\n\r\n if (that.displayTitle) {\r\n let title = $(this).parent().attr('title');\r\n if (title) {\r\n html += `
${title}
`;\r\n }\r\n }\r\n\r\n // Output the nav icons \r\n\r\n html += `
`;\r\n html += `
    `;\r\n\r\n for (let i = 1; i <= this.slideCount; i++) {\r\n if (i === this.activeSlide) {\r\n html += ``;\r\n } else {\r\n html += `
  • `;\r\n }\r\n }\r\n\r\n html += `
`;\r\n html += `
`;\r\n\r\n html += `
`;\r\n\r\n return html;\r\n }\r\n\r\n // Check if user swiped up or down more than 30px\r\n // startY - number - starting Y position for swipe\r\n // endY - number - ending Y position for swipe\r\n // return - bool - true = detected swipe up or down \r\n\r\n static checkYSwipe(startY, endY) {\r\n\r\n if ((startY > endY) && (startY - endY > 30)) {\r\n return true;\r\n }\r\n\r\n if ((startY < endY) && (endY - startY > 30)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n\r\n }\r\n\r\n // Extracts filename from full path\r\n // path - string - file path e.g. https://test.com/index.html\r\n // return - string - filename e.g. index.html\r\n static extractFile(path) {\r\n let pathParts = path.split(\"/\");\r\n return pathParts[pathParts.length - 1];\r\n }\r\n\r\n\r\n // output the image\r\n // newSlide - boolean - first time displaying a slide\r\n imageTitle(newSlide = false) {\r\n\r\n if (this.displayTitle) {\r\n\r\n if (newSlide) {\r\n this.$curImage = $('.bodActiveSlide img');\r\n this.$curTitle = $('.bodActiveSlide .bodTitle');\r\n $('.bodTitle').removeClass('bodShowTitle');\r\n }\r\n\r\n if (this.$curTitle) {\r\n\r\n const hPadBorder = this.$curImage.outerHeight() - this.$curImage.height();\r\n const wPadBorder = this.$curImage.outerWidth() - this.$curImage.width();\r\n\r\n if (this.displayTitle == 'left') {\r\n\r\n const topOffset = this.$curImage.position().top + (this.$curImage.height() - this.$curTitle.outerHeight());\r\n const leftOffset = this.$curImage.position().left + wPadBorder;\r\n this.$curTitle.css({ \"top\": `${topOffset}px`, \"left\": `${leftOffset}px` });\r\n\r\n } else if (this.displayTitle == 'right') {\r\n\r\n const topOffset = this.$curImage.position().top + (this.$curImage.height() - this.$curTitle.outerHeight());\r\n const leftOffset = this.$curImage.position().left + this.$curImage.width() - this.$curTitle.outerWidth();\r\n this.$curTitle.css({ \"top\": `${topOffset}px`, \"left\": `${leftOffset}px` });\r\n\r\n } else {\r\n\r\n this.$curTitle.css({ \"top\": \"50%\", \"left\": \"50%\", \"transform\": \"translate(-50%,-50%)\" });\r\n\r\n }\r\n this.$curTitle.addClass('bodShowTitle');\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n // called when modal closed by user \r\n closeModal() {\r\n\r\n // remove any events \r\n $('.bodOpenModal').off('touchstart');\r\n $('.bodOpenModal').off('touchend');\r\n $('.bodOpenModel').off('click');\r\n $('.bodOpenModal img, .bodNextSlide').off('click touchstart');\r\n $('.bodPrevSlide').off('click touchstart');\r\n $('.bodNavLink').off('click touchstart');\r\n this.$window.off('resize', this.debounceresize);\r\n\r\n // cancel autoplay\r\n if (this.autoplay) clearTimeout(this.autoplay);\r\n\r\n // finish cleanup by removing modal html code previously inserted\r\n this.$document.find('.bodOpenModal').remove();\r\n }\r\n\r\n\r\n prevSlide(evt) {\r\n if (evt) {\r\n if (typeof evt.data.cancelAutoPlay !== 'undefined') {\r\n if (this.autoplay && evt.data.cancelAutoPlay) clearTimeout(this.autoplay);\r\n }\r\n\r\n // Code to stop both touchstart and click events firing\r\n if (this.disableClick == true && evt.type == 'click') {\r\n this.disableClick = false;\r\n return false;\r\n } else if (evt.type == 'touchstart') {\r\n this.disableClick = true;\r\n }\r\n }\r\n\r\n --this.activeSlide < 1 ? this.activeSlide = this.slideCount : this.activeSlide;\r\n this.displaySlide(this.activeSlide);\r\n if (evt) evt.stopPropagation();\r\n }\r\n\r\n\r\n nextSlide(evt) {\r\n if (evt) {\r\n if (typeof evt.data.cancelAutoPlay !== 'undefined') {\r\n if (this.autoplay && evt.data.cancelAutoPlay) clearTimeout(this.autoplay);\r\n }\r\n\r\n // Code to stop both touchstart and click events firing\r\n if (this.disableClick == true && evt.type == 'click') {\r\n this.disableClick = false;\r\n return false;\r\n } else if (evt.type == 'touchstart') {\r\n this.disableClick = true;\r\n }\r\n }\r\n\r\n ++this.activeSlide > this.slideCount ? this.activeSlide = 1 : this.activeSlide;\r\n this.displaySlide(this.activeSlide);\r\n if (evt) evt.stopPropagation();\r\n }\r\n\r\n\r\n navLink(evt) {\r\n this.activeSlide = parseInt($(evt.target).attr(\"data-slide-no\"));\r\n this.displaySlide(this.activeSlide);\r\n evt.stopPropagation();\r\n }\r\n\r\n // Display the next slide. Triggered by navlink, next prev button\r\n // image click or autoplay.\r\n // activeslide - number - slide to display\r\n displaySlide(activeSlide) {\r\n\r\n // hide the slide title and move to top right\r\n if (this.$curTitle) {\r\n this.$curTitle.removeClass('bodShowTitle');\r\n this.$curTitle.css({ \"top\": `0`, \"left\": `0` });\r\n }\r\n\r\n // remove slide indicator from nav links\r\n $('.bodNavLink').removeClass('bodActiveSlide');\r\n\r\n // hide current slide\r\n $('.bodModal').removeClass('bodActiveSlide');\r\n\r\n // show new activeslide \r\n $(`.bodModal:nth-of-type(${activeSlide})`).addClass('bodActiveSlide');\r\n\r\n // highlight current slide on nav links\r\n $(`.bodNavLink:nth-of-type(${activeSlide})`).addClass('bodActiveSlide');\r\n\r\n // show title for new slide\r\n if (this.displayTitle) {\r\n this.imageTitle(true);\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n $(function() {\r\n // loop round all the models on the page creating an instance\r\n // for each one adding to an array\r\n\r\n window.bodModals = [];\r\n $('.bod-modal').each(function() {\r\n bodModals.push(new BodModal(this));\r\n });\r\n });\r\n\r\n})(jQuery);"]}