{"version":3,"file":"flexslider.min.js","sources":["https:\/\/www.alsg.org\/home\/theme\/adaptable\/amd\/src\/flexslider.js"],"sourcesContent":["\/\/ This file is part of Moodle - http:\/\/moodle.org\/\n\/\/\n\/\/ Moodle is free software: you can redistribute it and\/or modify\n\/\/ it under the terms of the GNU General Public License as published by\n\/\/ the Free Software Foundation, either version 3 of the License, or\n\/\/ (at your option) any later version.\n\/\/\n\/\/ Moodle is distributed in the hope that it will be useful,\n\/\/ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\/\/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\/\/ GNU General Public License for more details.\n\/\/\n\/\/ You should have received a copy of the GNU General Public License\n\/\/ along with Moodle. If not, see .\n\n\/\/\n\/\/ ES6 wrapper for FlexSlider.\n\/\/\n\/\/ @module theme_adaptable\/flexslider\n\/\/ @copyright 2024 G J Barnard.\n\/\/ @author G J Barnard -\n\/\/ {@link https:\/\/moodle.org\/user\/profile.php?id=442195}\n\/\/ {@link https:\/\/gjbarnard.co.uk}\n\/\/ @license https:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later.\n\/\/\n\nimport $ from 'jquery';\n\n\/**\n * Initialise FlexSlider.\n *\/\nexport const flexslider = () => {\n \/*\n * jQuery FlexSlider v2.7.2\n * Copyright 2012 WooThemes\n * Contributing Author: Tyler Smith\n * @license https:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v2 or later.\n *\/\n\n var focused = true;\n\n \/\/FlexSlider: Object Instance\n $.flexslider = function (el, options) {\n var slider = $(el);\n\n \/\/ making variables public\n\n \/\/if rtl value was not passed and html is in rtl..enable it by default.\n if (typeof options.rtl == 'undefined' && $('html').attr('dir') == 'rtl') {\n options.rtl = true;\n }\n slider.vars = $.extend({}, $.flexslider.defaults, options);\n\n var namespace = slider.vars.namespace,\n msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,\n touch = ((\"ontouchstart\" in window) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,\n \/\/ deprecating this idea, as devices are being released with both of these events\n eventType = \"click touchend MSPointerUp keyup\",\n watchedEvent = \"\",\n watchedEventClearTimer,\n vertical = slider.vars.direction === \"vertical\",\n reverse = slider.vars.reverse,\n carousel = (slider.vars.itemWidth > 0),\n fade = slider.vars.animation === \"fade\",\n asNav = slider.vars.asNavFor !== \"\",\n methods = {};\n\n \/\/ Store a reference to the slider object\n $.data(el, \"flexslider\", slider);\n\n \/\/ Private slider methods\n methods = {\n init: function () {\n slider.animating = false;\n \/\/ Get current slide and make sure it is a number\n slider.currentSlide = parseInt((slider.vars.startAt ? slider.vars.startAt : 0), 10);\n if (isNaN(slider.currentSlide)) { slider.currentSlide = 0; }\n slider.animatingTo = slider.currentSlide;\n slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);\n slider.containerSelector = slider.vars.selector.substr(0, slider.vars.selector.search(' '));\n slider.slides = $(slider.vars.selector, slider);\n slider.container = $(slider.containerSelector, slider);\n slider.count = slider.slides.length;\n \/\/ SYNC:\n slider.syncExists = $(slider.vars.sync).length > 0;\n \/\/ SLIDE:\n if (slider.vars.animation === \"slide\") { slider.vars.animation = \"swing\"; }\n slider.prop = (vertical) ? \"top\" : (slider.vars.rtl ? \"marginRight\" : \"marginLeft\");\n slider.args = {};\n \/\/ SLIDESHOW:\n slider.manualPause = false;\n slider.stopped = false;\n \/\/PAUSE WHEN INVISIBLE\n slider.started = false;\n slider.startTimeout = null;\n \/\/ TOUCH\/USECSS:\n slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function () {\n var obj = document.createElement('div'),\n props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];\n for (var i in props) {\n if (obj.style[props[i]] !== undefined) {\n slider.pfx = props[i].replace('Perspective', '').toLowerCase();\n slider.prop = \"-\" + slider.pfx + \"-transform\";\n return true;\n }\n }\n return false;\n }());\n slider.isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n slider.ensureAnimationEnd = '';\n \/\/ CONTROLSCONTAINER:\n if (slider.vars.controlsContainer !== \"\") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);\n \/\/ MANUAL:\n if (slider.vars.manualControls !== \"\") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);\n\n \/\/ CUSTOM DIRECTION NAV:\n if (slider.vars.customDirectionNav !== \"\") slider.customDirectionNav = $(slider.vars.customDirectionNav).length === 2 && $(slider.vars.customDirectionNav);\n\n \/\/ RANDOMIZE:\n if (slider.vars.randomize) {\n slider.slides.sort(function () { return (Math.round(Math.random()) - 0.5); });\n slider.container.empty().append(slider.slides);\n }\n\n slider.doMath();\n\n \/\/ INIT\n slider.setup(\"init\");\n\n \/\/ CONTROLNAV:\n if (slider.vars.controlNav) { methods.controlNav.setup(); }\n\n \/\/ DIRECTIONNAV:\n if (slider.vars.directionNav) { methods.directionNav.setup(); }\n\n \/\/ KEYBOARD:\n if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {\n $(document).bind('keyup', function (event) {\n var keycode = event.keyCode;\n if (!slider.animating && (keycode === 39 || keycode === 37)) {\n var target = (slider.vars.rtl ?\n ((keycode === 37) ? slider.getTarget('next') :\n (keycode === 39) ? slider.getTarget('prev') : false)\n :\n ((keycode === 39) ? slider.getTarget('next') :\n (keycode === 37) ? slider.getTarget('prev') : false)\n )\n ;\n slider.flexAnimate(target, slider.vars.pauseOnAction);\n }\n });\n }\n \/\/ MOUSEWHEEL:\n if (slider.vars.mousewheel) {\n slider.bind('mousewheel', function (event, delta, deltaX, deltaY) {\n event.preventDefault();\n var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');\n slider.flexAnimate(target, slider.vars.pauseOnAction);\n });\n }\n\n \/\/ PAUSEPLAY\n if (slider.vars.pausePlay) { methods.pausePlay.setup(); }\n\n \/\/PAUSE WHEN INVISIBLE\n if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible.init(); }\n\n \/\/ SLIDSESHOW\n if (slider.vars.slideshow) {\n if (slider.vars.pauseOnHover) {\n slider.hover(function () {\n if (!slider.manualPlay && !slider.manualPause) { slider.pause(); }\n }, function () {\n if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); }\n });\n }\n \/\/ initialize animation\n \/\/If we're visible, or we don't use PageVisibility API\n if (!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {\n (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();\n }\n }\n\n \/\/ ASNAV:\n if (asNav) { methods.asNav.setup(); }\n\n \/\/ TOUCH\n if (touch && slider.vars.touch) { methods.touch(); }\n\n \/\/ FADE&&SMOOTHHEIGHT || SLIDE:\n if (!fade || (fade && slider.vars.smoothHeight)) { $(window).bind(\"resize orientationchange focus\", methods.resize); }\n\n slider.find(\"img\").attr(\"draggable\", \"false\");\n\n \/\/ API: start() Callback\n setTimeout(function () {\n slider.vars.start(slider);\n }, 200);\n },\n asNav: {\n setup: function () {\n slider.asNav = true;\n slider.animatingTo = Math.floor(slider.currentSlide \/ slider.move);\n slider.currentItem = slider.currentSlide;\n slider.slides.removeClass(namespace + \"active-slide\").eq(slider.currentItem).addClass(namespace + \"active-slide\");\n if (!msGesture) {\n slider.slides.on(eventType, function (e) {\n e.preventDefault();\n var $slide = $(this),\n target = $slide.index();\n var posFromX;\n if (slider.vars.rtl) {\n posFromX = -1 * ($slide.offset().right - $(slider).scrollLeft()); \/\/ Find position of slide relative to right of slider container\n }\n else {\n posFromX = $slide.offset().left - $(slider).scrollLeft(); \/\/ Find position of slide relative to left of slider container\n }\n if (posFromX <= 0 && $slide.hasClass(namespace + 'active-slide')) {\n slider.flexAnimate(slider.getTarget(\"prev\"), true);\n } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + \"active-slide\")) {\n slider.direction = (slider.currentItem < target) ? \"next\" : \"prev\";\n slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);\n }\n });\n } else {\n el._slider = slider;\n slider.slides.each(function () {\n var that = this;\n that._gesture = new MSGesture();\n that._gesture.target = that;\n that.addEventListener(\"MSPointerDown\", function (e) {\n e.preventDefault();\n if (e.currentTarget._gesture) {\n e.currentTarget._gesture.addPointer(e.pointerId);\n }\n }, false);\n that.addEventListener(\"MSGestureTap\", function (e) {\n e.preventDefault();\n var $slide = $(this),\n target = $slide.index();\n if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {\n slider.direction = (slider.currentItem < target) ? \"next\" : \"prev\";\n slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);\n }\n });\n });\n }\n }\n },\n controlNav: {\n setup: function () {\n if (!slider.manualControls) {\n methods.controlNav.setupPaging();\n } else { \/\/ MANUALCONTROLS:\n methods.controlNav.setupManual();\n }\n },\n setupPaging: function () {\n var type = (slider.vars.controlNav === \"thumbnails\") ? 'control-thumbs' : 'control-paging',\n j = 1,\n item,\n slide;\n\n slider.controlNavScaffold = $('
    <\/ol>');\n\n if (slider.pagingCount > 1) {\n for (var i = 0; i < slider.pagingCount; i++) {\n slide = slider.slides.eq(i);\n\n if (undefined === slide.attr('data-thumb-alt')) {\n slide.attr('data-thumb-alt', '');\n }\n\n item = $('<\/a>').attr('href', '#').text(j);\n if (slider.vars.controlNav === \"thumbnails\") {\n item = $('').attr('src', slide.attr('data-thumb'));\n }\n\n if ('' !== slide.attr('data-thumb-alt')) {\n item.attr('alt', slide.attr('data-thumb-alt'));\n }\n\n if ('thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions) {\n var captn = slide.attr('data-thumbcaption');\n if ('' !== captn && undefined !== captn) {\n var caption = $('<\/span>').addClass(namespace + 'caption').text(captn);\n item.append(caption);\n }\n }\n\n var liElement = $('
  1. ');\n item.appendTo(liElement);\n liElement.append('<\/li>');\n\n slider.controlNavScaffold.append(liElement);\n j++;\n\n }\n }\n\n \/\/ CONTROLSCONTAINER:\n (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);\n methods.controlNav.set();\n\n methods.controlNav.active();\n\n slider.controlNavScaffold.delegate('a, img', eventType, function (event) {\n event.preventDefault();\n\n if (watchedEvent === \"\" || watchedEvent === event.type) {\n var $this = $(this),\n target = slider.controlNav.index($this);\n\n if (!$this.hasClass(namespace + 'active')) {\n slider.direction = (target > slider.currentSlide) ? \"next\" : \"prev\";\n slider.flexAnimate(target, slider.vars.pauseOnAction);\n }\n }\n\n \/\/ setup flags to prevent event duplication\n if (watchedEvent === \"\") {\n watchedEvent = event.type;\n }\n methods.setToClearWatchedEvent();\n\n });\n },\n setupManual: function () {\n slider.controlNav = slider.manualControls;\n methods.controlNav.active();\n\n slider.controlNav.bind(eventType, function (event) {\n event.preventDefault();\n\n if (watchedEvent === \"\" || watchedEvent === event.type) {\n var $this = $(this),\n target = slider.controlNav.index($this);\n\n if (!$this.hasClass(namespace + 'active')) {\n (target > slider.currentSlide) ? slider.direction = \"next\" : slider.direction = \"prev\";\n slider.flexAnimate(target, slider.vars.pauseOnAction);\n }\n }\n\n \/\/ setup flags to prevent event duplication\n if (watchedEvent === \"\") {\n watchedEvent = event.type;\n }\n methods.setToClearWatchedEvent();\n });\n },\n set: function () {\n var selector = (slider.vars.controlNav === \"thumbnails\") ? 'img' : 'a';\n slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);\n },\n active: function () {\n slider.controlNav.removeClass(namespace + \"active\").eq(slider.animatingTo).addClass(namespace + \"active\");\n },\n update: function (action, pos) {\n if (slider.pagingCount > 1 && action === \"add\") {\n slider.controlNavScaffold.append($('
  2. ' + slider.count + '<\/a><\/li>'));\n } else if (slider.pagingCount === 1) {\n slider.controlNavScaffold.find('li').remove();\n } else {\n slider.controlNav.eq(pos).closest('li').remove();\n }\n methods.controlNav.set();\n (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();\n }\n },\n directionNav: {\n setup: function () {\n var directionNavScaffold = $('