{"version":3,"sources":["_util.js","modules/_modal.js","modules/_nav.js","modules/_scarousel.js"],"names":["isVisible","obj","offsetWidth","offsetHeight","isElementInViewport","el","rect","getBoundingClientRect","windowHeight","window","innerHeight","document","documentElement","clientHeight","top","bottom","insertAfter","referenceNode","newNode","parentNode","insertBefore","nextSibling","setCookie","name","value","days","date","Date","setTime","getTime","expires","toGMTString","cookie","getCookie","nameEQ","ca","split","i","length","c","charAt","substring","indexOf","deleteCookie","debounce","func","wait","immediate","timeout","context","this","args","arguments","callNow","clearTimeout","setTimeout","apply","loadScript","url","tag","scriptTag","createElement","firstScriptTag","getElementsByTagName","src","loadCSS","head","link","rel","type","href","appendChild","NodeList","prototype","forEach","Array","links","linksLength","hostname","location","getAttribute","match","target","bubbleLink","querySelectorAll","call","bubble","addEventListener","e","preventDefault","destination_link","querySelector","ctrlKey","classList","contains","simulateClick","elem","ctrl","evt","MouseEvent","bubbles","cancelable","view","dispatchEvent","showhide_links","closeShowHide","ev","docclose","remove","stopPropagation","dataset","showhide","console","log","add","child_links","cl","modalLinks","modal","modalContent","galleryNodes","galleryCurrent","openModal","element","modal_contents","getModalContents","new_content","new_class","innerHTML","className","showModal","bindCloseLink","includes","loadInstagramEmbedScript","startsWith","sourceElement","injectClose","isImageUrl","from","children","lightboxHTML","galleryNav","createGalleryNavigation","push","isVideoUrl","extension","pop","toLowerCase","parts","embed","buildInstagramEmbed","isVideoEmbedUrl","embed_url","convertToEmbedUrl","xhr","XMLHttpRequest","ajaxUrl","open","onload","status","responseText","send","modalcaption","close","source","replace","closest","filter","node","removeEventListener","handleLightboxNav","direction","dir","toShowIndex","modalElement","find","domain","URL","some","videoDomain","originalUrl","urlObject","embedUrl","videoId","searchParams","get","pathname","instagramEmbedScriptLoaded","script","async","body","instgrm","Embeds","process","id","breakpoint","mediaQuery","matchMedia","nav","getElementById","nav_button","nextElementSibling","hidePopover","setAttribute","matches","removeAttribute","handlePopoverToggle","initScarousel","sc_container","autoplay_interval","item_width","scroll_interval","settings_array","scarousel","map","setting","trim","settings","key","part","isNaN","parseFloat","first_child_style","getComputedStyle","firstElementChild","minWidth","clientWidth","parseInt","width","Number","isInteger","gap","navigation","nav_to_add","after","nav_links","nl","previousElementSibling","slideCarousel","cancelAutoPlay","buildPrevNextNavigation","navHtml","_","join","updateCurrentPaging","parentElement","buildPagingNavigation","next_slide","current_index","Math","floor","scrollLeft","current_index_left","next_index","to_scroll_amount","width_of_all_items","autoplayCarousel","video","duration","getVideoLength","base_interval","prevCurrent","clearPreviousCurrent","matching_nav_item","setCurrentNavItem","autoplay","callback","readyState","onloadedmetadata","hasVideoLoaded","initiateAutoplay"],"mappings":"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","file":"../onload.js","sourcesContent":["/*----------------------------------------------------\n\n\tutil.js\n\n----------------------------------------------------*/\n\n// Polyfill forEach for ES5\nif(window.NodeList && !NodeList.prototype.forEach) {\n NodeList.prototype.forEach = Array.prototype.forEach;\n}\n\n// is visible\nfunction isVisible(obj){\n return obj.offsetWidth > 0 || obj.offsetHeight > 0;\n}\n\nfunction isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n return (\n rect.top < windowHeight &&\n rect.bottom > 0\n );\n}\n\n// insert after\nfunction insertAfter(referenceNode, newNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n}\n\n// cookies\nfunction setCookie(name,value,days) {\n if (days) {\n var date = new Date();\n date.setTime(date.getTime()+(days*24*60*60*1000));\n var expires = \"; expires=\"+date.toGMTString();\n }\n else var expires = \"\";\n document.cookie = name+\"=\"+value+expires+\"; path=/\";\n}\nfunction getCookie(name) {\n var nameEQ = name + \"=\";\n var ca = document.cookie.split(';');\n for(var i=0;i < ca.length;i++) {\n var c = ca[i];\n while (c.charAt(0)==' ') c = c.substring(1,c.length);\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);\n }\n return null;\n}\nfunction deleteCookie(name) {\n setCookie(name,\"\",-1);\n}\n\n\n// Debounce function to limit the frequency of scroll events\nfunction debounce(func, wait, immediate){\n let timeout;\n return function() {\n const context = this, args = arguments;\n const later = function() {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n}\n\n\n\n\n/* dynamic loading\n----------------------------------------------------------------------------------------------------*/\n\nfunction loadScript(url){\n (function(document, tag) {\n var scriptTag = document.createElement(tag), // create a script tag\n firstScriptTag = document.getElementsByTagName(tag)[0]; // find the first script tag in the document\n scriptTag.src = url; // set the source of the script to your script\n firstScriptTag.parentNode.insertBefore(scriptTag, firstScriptTag); // append the script to the DOM\n }(document, 'script'));\n}\n\nfunction loadCSS(url){\n var head = document.getElementsByTagName('head')[0];\n var link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = url;\n head.appendChild(link);\n}\n\n// lightbox - baguetteBox\n/*if(document.querySelectorAll('.gallery').length > 0 || document.querySelectorAll('.lightbox').length > 0 || document.querySelectorAll('.lightbox--video').length > 0){\n loadScript('/inc/js/baguetteBox.js');\n loadCSS('/inc/css/plugins/baguetteBox.css');\n}*/\n\n\n/* external links in new tab\n----------------------------------------------------------------------------------------------------*/\n\nvar links = document.links;\n\nfor(var i = 0, linksLength = links.length; i < linksLength; i++) {\n if (links[i].hostname != window.location.hostname || links[i].getAttribute('href').match('.pdf$')) {\n links[i].target = '_blank';\n }\n}\n\n\n\n\n/* JS / bubble links\n----------------------------------------------------------------------------------------------------*/\n\n(function(){\n\n 'use strict';\n\n // Feature Test\n if('querySelector' in document && 'addEventListener' in window && Array.prototype.forEach){\n\n var bubbleLink = document.querySelectorAll('[data-clickable]');\n [].forEach.call(bubbleLink, function(bubble){\n\n bubble.addEventListener('click', function(e){\n\n e.preventDefault();\n\n var destination_link = bubble.querySelector('a:first-of-type');\n var destination = bubble.querySelector('a:first-of-type').getAttribute('href');\n if(destination){\n if(e.ctrlKey || bubble.getAttribute('target') == '_blank' || bubble.querySelector('a:first-of-type').classList.contains('externalLink')){\n simulateClick(destination_link,true);\n \t\t\t}else{\n simulateClick(destination_link);\n \t\t\t}\n }\n\n }, false);\n\n });\n\n }\n\n})();\n\nvar simulateClick = function(elem,ctrl=false){\n // Create our event (with options)\n var evt = new MouseEvent('click', {\n bubbles: false,\n cancelable: true,\n view: window,\n ctrlKey: ctrl\n });\n // If cancelled, don't dispatch our event\n var canceled = !elem.dispatchEvent(evt);\n};\n\n\n\n/* generic showhide\n----------------------------------------------------------------------------------------------------*/\n\nvar showhide_links = document.querySelectorAll('[data-showhide],[data-showhidemobile]');\n\n// For each\n[].forEach.call(showhide_links, function(link){\n\n link.addEventListener('click', function(ev){\n\n // Prevent the default link behavior\n ev.preventDefault();\n ev.stopPropagation();\n\n var target = (link.dataset.showhide) ? document.querySelector(link.dataset.showhide) : document.querySelector(link.getAttribute('href'));\n\n console.log(target);\n\n // if nav check if is in viewport, for others check if visible\n // if((target.id == 'nav' && isInViewport(target)) || (target.id != 'nav' && isVisible(target))){\n if(isVisible(target)){\n target.classList.remove('show');\n target.classList.add('hide');\n setTimeout(() => {\n target.classList.remove('hide');\n },500);\n }else{\n closeShowHide(ev);\n target.classList.add('show');\n\n var child_links = target.querySelectorAll('a');\n [].forEach.call(child_links, function(cl){\n cl.addEventListener('click', function(ev){\n closeShowHide(target);\n });\n });\n\n }\n\n });\n\n});\n\n\nfunction closeShowHide(ev){\n var docclose = document.querySelectorAll('[data-docclose]');\n\n [].forEach.call(docclose, function(link){\n if(isVisible(link) && ev.target !== link && !link.contains(ev.target)){\n link.classList.remove('show');\n }\n });\n}\n\ndocument.addEventListener('click', function(ev){\n closeShowHide(ev);\n});\n\n","/*----------------------------------------------------\n\n\tmodal.js\n\n----------------------------------------------------*/\n\n// lack mutation observer\n\n/* variables\n---------------------------------------------------------------------------------------------------- */\n\nconst modalLinks = document.querySelectorAll('[data-modal], [data-gallery] a:not(:empty), .wp-block-image > a');\nconst modal = document.querySelector('#modal-box');\nconst modalContent = document.querySelector('#modal-box__content');\n\nlet galleryNodes = [];\nlet galleryCurrent = '';\n\n\n/* open modal\n---------------------------------------------------------------------------------------------------- */\n\nfunction openModal(element = null, target = null){\n\n let modal_contents = getModalContents(element,target);\n let new_content = modal_contents.new_content;\n let new_class = modal_contents.new_class;\n\n modalContent.innerHTML = new_content;\n if(new_class){\n new_class.forEach(function(className){\n modalContent.classList.add(className);\n });\n };\n modal.showModal();\n \n bindCloseLink();\n\n target = (element !== null && target === null) ? (element.dataset.modal || element.getAttribute('href')) : target;\n\n if(target.includes('instagram')){\n loadInstagramEmbedScript();\n }\n\n}\n\nfunction getModalContents(element = null, target = null){\n\n let new_class = [];\n\n target = (element !== null && target === null) ? (element.dataset.modal || element.getAttribute('href')) : target;\n\n // if the target starts with '#', treat it as a CSS selector\n if(target.startsWith('#')){\n const sourceElement = document.querySelector(target);\n if(sourceElement){\n let new_content = injectClose(sourceElement.innerHTML);\n }\n\n\n // if image\n } else if(isImageUrl(target)){\n\n // get current elements index value\n galleryCurrent = Array.from(element.parentNode.children).indexOf(element); // requires to be direct child of [data-gallery]\n\n lightboxHTML = '';\n lightboxHTML += '';\n galleryNav = createGalleryNavigation(element);\n if(galleryNav){\n lightboxHTML += createGalleryNavigation(element);\n }\n\n new_content = lightboxHTML;\n new_class.push('modal--lightbox');\n\n\n // if html video\n }else if(isVideoUrl(target)){\n\n // get current elements index value\n galleryCurrent = Array.from(element.parentNode.children).indexOf(element); \n\n const extension = target.split('.').pop().toLowerCase();\n\n lightboxHTML = '';\n lightboxHTML += '';\n galleryNav = createGalleryNavigation(element);\n if(galleryNav){\n lightboxHTML += createGalleryNavigation(element);\n }\n\n new_content = lightboxHTML;\n new_class.push('modal--lightbox');\n\n\n // if instagram\n } else if(target.includes('instagram')){\n\n const url = target;\n const parts = url.split(\"/\");\n const lastPart = parts[parts.length - 2];\n const embed = buildInstagramEmbed(lastPart);\n\n new_content = embed;\n new_class = ['modal--lightbox', 'modal--instagram'];\n\n\n // if iframe\n }else if(isVideoEmbedUrl(target)){\n\n embed_url = convertToEmbedUrl(target);\n new_content = '';\n new_class.push('modal--lightbox');\n\n\n // another page/url\n } else {\n\n const xhr = new XMLHttpRequest();\n\n // Append the 'ajax=true' query string parameter to the URL\n const ajaxUrl = target + (target.indexOf('?') === -1 ? '?' : '&') + 'ajax=true';\n\n // Load the content of the link's href attribute using AJAX\n xhr.open('GET', ajaxUrl);\n xhr.onload = function() {\n if (xhr.status === 200) {\n let new_content = injectClose(xhr.responseText);\n }\n };\n xhr.send();\n\n }\n\n\n // get caption\n if(element.dataset.modalcaption){\n new_content += '
' + element.dataset.modalcaption + '
';\n }\n\n\n return {new_content,new_class};\n\n}\n\n\n/* open modal [click event]\n---------------------------------------------------------------------------------------------------- */\n\ndocument.addEventListener('click', function (e){\n // Check if the clicked element matches the modal link selector\n //const modalElement = e.target.matches('[data-modal]') ? e.target : e.target.closest('[data-modal]');\n const modalElement = Array.from(modalLinks).find(link => link.contains(e.target));\n if(modalElement){\n e.preventDefault();\n openModal(modalElement);\n }\n});\n\n\n/* Close the modal when clicked outside of it\n---------------------------------------------------------------------------------------------------- */\n\nif(modal){\n modal.addEventListener('click', function(e){\n if (e.target === modal) {\n modal.close();\n }\n });\n}\n\n\n/* Remove modal content when closed\n---------------------------------------------------------------------------------------------------- */\n\nmodal.addEventListener('close', function() {\n modalContent.innerHTML = '';\n modalContent.classList = [];\n});\n\n\n/* Close button\n---------------------------------------------------------------------------------------------------- */\n\nfunction bindCloseLink(){\n const closeModal = document.querySelector('#modal-box__close');\n closeModal.addEventListener('click', function() {\n modal.close();\n });\n}\n\n\n/* Inject close button into response code\n---------------------------------------------------------------------------------------------------- */\n\nfunction injectClose(source){\n if (source.includes('[close]')) {\n return source.replace('[close]', '');\n } else {\n return source;\n }\n}\n\n\n\n/* Build lightbox gallery\n---------------------------------------------------------------------------------------------------- */\n\nfunction createGalleryNavigation(element){\n\n if(element.closest('[data-gallery]')){\n\n galleryNodes = element.closest('[data-gallery]').querySelectorAll('a:not(:empty)');\n // Filter nodes based on child elements\n galleryNodes = Array.from(galleryNodes).filter(node => {\n return node.querySelector('img') || node.querySelector('picture');\n });\n\n if(galleryNodes.length > 1){\n modal.removeEventListener('click', handleLightboxNav);\n modal.addEventListener('click', handleLightboxNav);\n\n let prev_link = 'Previous';\n let next_link = 'Next';\n\n return prev_link + next_link;\n }\n\n return '';\n }\n\n}\n\nfunction handleLightboxNav(ev){\n if(ev.target.closest('.modal--lightbox__nav')){\n\n ev.stopPropagation();\n\n const navElement = ev.target.closest('.modal--lightbox__nav');\n const direction = navElement.dataset.dir\n\n let toShowIndex = galleryCurrent;\n toShowIndex += (direction === 'next') ? 1 : -1;\n toShowIndex = (toShowIndex + galleryNodes.length) % galleryNodes.length;\n\n const modalElement = Array.from(modalLinks).find(link => link.contains(galleryNodes[toShowIndex]));\n if(modalElement){\n openModal(modalElement);\n }else{\n modal.close();\n }\n\n }\n}\n\n\n\n/* Check if url is image\n---------------------------------------------------------------------------------------------------- */\n\nfunction isImageUrl(url){\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg'];\n const extension = url.split('.').pop().toLowerCase();\n return imageExtensions.includes(extension);\n}\n\n\n/* Check if url is video\n---------------------------------------------------------------------------------------------------- */\n\nfunction isVideoEmbedUrl(url) {\n const videoDomains = ['youtube.com', 'vimeo.com', 'dailymotion.com', /* Add more as needed */];\n const urlObject = new URL(url);\n const domain = urlObject.hostname;\n return videoDomains.some(videoDomain => domain.includes(videoDomain));\n}\n\nfunction isVideoUrl(url) {\n const supportedFormats = ['mp4', 'webm', 'ogg', 'mov']; // Add more formats if needed\n const extension = url.split('.').pop().toLowerCase();\n return supportedFormats.includes(extension);\n}\n\n\n/* Convert video url to something suitable to embed\n---------------------------------------------------------------------------------------------------- */\n\nfunction convertToEmbedUrl(originalUrl) {\n const urlObject = new URL(originalUrl);\n const hostname = urlObject.hostname;\n let embedUrl = '';\n\n if(hostname.includes('youtube.com')) {\n const videoId = urlObject.searchParams.get('v');\n embedUrl = videoId ? `https://www.youtube.com/embed/${videoId}?autoplay=1` : null;\n }else if(hostname.includes('vimeo.com')){\n const videoId = urlObject.pathname.split('/').pop();\n embedUrl = videoId ? `https://player.vimeo.com/video/${videoId}?autoplay=1` : null;\n }else if(hostname.includes('dailymotion.com')){\n const videoId = urlObject.pathname.split('/').pop();\n embedUrl = videoId ? `https://www.dailymotion.com/embed/video/${videoId}?autoplay=1` : null;\n }\n\n return embedUrl;\n}\n\n\n/* Load Instagram embed script\n---------------------------------------------------------------------------------------------------- */\n\nfunction loadInstagramEmbedScript(){\n if(!window.instagramEmbedScriptLoaded) {\n var script = document.createElement('script');\n script.async = true;\n script.src = '//www.instagram.com/embed.js';\n document.body.appendChild(script);\n window.instagramEmbedScriptLoaded = true; \n }\n window.instgrm.Embeds.process();\n}\n\n\nfunction buildInstagramEmbed(id){\n\n return false;\n \n}","/*----------------------------------------------------\r\n\r\n\tnav.js\r\n\r\n----------------------------------------------------*/\r\n\r\n// define the breakpoint\r\nconst breakpoint = 979;\r\nconst mediaQuery = window.matchMedia(`(max-width: ${breakpoint}px)`);\r\n\r\n// select the navigation element\r\nconst nav = document.getElementById('nav');\r\nconst nav_button = nav.nextElementSibling;\r\n\r\n\r\n// function to hide the popover\r\nconst hidePopover = () => {\r\n if(typeof nav.hidePopover === 'function'){\r\n\r\n nav.hidePopover();\r\n nav_button.setAttribute('aria-expanded','false');\r\n\r\n // only require inert on mobile view\r\n if(mediaQuery.matches){\r\n nav.setAttribute('inert','');\r\n }else{\r\n nav.removeAttribute('inert');\r\n }\r\n\r\n }\r\n};\r\n\r\n\r\n// popover state changes\r\nconst handlePopoverToggle = () => {\r\n if(nav.matches(':popover-open')){\r\n // popover is open\r\n nav.removeAttribute('inert');\r\n nav_button.setAttribute('aria-expanded', 'true');\r\n }else{\r\n // popover is closed\r\n hidePopover();\r\n }\r\n};\r\n\r\n\r\n// onload\r\nif(mediaQuery.matches){\r\n hidePopover();\r\n}\r\n\r\n\r\n// event listeners\r\nmediaQuery.addEventListener('change', hidePopover);\r\nnav.addEventListener('toggle', handlePopoverToggle);","/*----------------------------------------------------\r\n\r\n\tScarousel.js\r\n\t// scroll based carousel\r\n\r\n----------------------------------------------------*/\r\n\r\nfunction initScarousel(sc_container){\r\n\r\n\tlet autoplay_interval, item_width, nav;\r\n\tconst base_interval = 7000;\r\n\tconst scroll_interval = 750;\r\n\r\n\tconsole.log('init: scarousel');\r\n\r\n\t// get settings\r\n\tconst settings_attr = sc_container.dataset.scarousel;\r\n\tconst settings_array = settings_attr.split(';').map(setting => setting.trim());\r\n\tconst settings = {};\r\n\tsettings_array.forEach(setting => {\r\n\t\tif(setting !== \"\"){\r\n\t\t\tconst [key, value] = setting.split(':').map(part => part.trim());\r\n\t\t\tsettings[key] = value === 'true' ? true : value === 'false' ? false : isNaN(value) ? value : parseFloat(value) || value;\r\n\t\t}\r\n\t});\r\n\r\n\r\n\tlet first_child_style = getComputedStyle(sc_container.firstElementChild);\r\n\titem_width = first_child_style.minWidth === '100%' ? sc_container.firstElementChild.clientWidth : parseInt(first_child_style.width);\r\n \r\n // gap\r\n var gap = Number.isInteger(parseInt(getComputedStyle(sc_container).gap)) ? parseInt(getComputedStyle(sc_container).gap) : 0;\r\n\r\n\r\n\t// add navigation\r\n\tif(typeof settings.navigation !== 'undefined' && settings.navigation !== null){\r\n\t\tswitch(settings.navigation){\r\n\r\n\t\t\t// prev / next navigation\r\n\t\t\tcase 'prevnext':\r\n\t\t\t\tbuildPrevNextNavigation();\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// prev / next navigation\r\n\t\t\tcase 'paging':\r\n\t\t\t\tbuildPagingNavigation();\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\t// no nothing\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t// add autoplay\r\n\tconst initiateAutoplay = () => {\r\n\t\t// only autoplay after video has loaded, as requires duration of video\r\n\t\t// queryselector will get the first video in the list only\r\n\t\tconst video = sc_container.querySelector('video');\r\n\t\tif(video){\r\n\t\t\t\thasVideoLoaded(video, autoplayCarousel);\r\n\t\t}else{\r\n\t\t\t\tautoplayCarousel();\r\n\t\t}\r\n\r\n\t\t// cancel autoplay on touch\r\n\t\tsc_container.addEventListener(\"touchstart\", cancelAutoPlay);\r\n\r\n\t};\r\n\r\n\tif(settings.autoplay === true){\r\n\t\tinitiateAutoplay();\r\n\t}\r\n\r\n\r\n\t// scroll listener\r\n\tsc_container.addEventListener('scroll', () => {\r\n updateCurrentPaging(); // call your function on scroll\r\n\t});\r\n\r\n\r\n\r\n\r\n\r\n\t// animation\r\n\t// =========================================================================================================================\r\n\r\n\tfunction slideCarousel(next_slide = false){\r\n \r\n\t\t// redefine width and gap in case of resize\r\n\t\tlet first_child_style = getComputedStyle(sc_container.firstElementChild);\r\n\t\titem_width = first_child_style.minWidth === '100%' ? sc_container.firstElementChild.clientWidth : parseInt(first_child_style.width);\r\n\t\tvar gap = Number.isInteger(parseInt(getComputedStyle(sc_container).gap)) ? parseInt(getComputedStyle(sc_container).gap) : 0;\r\n\r\n\t\t// find out the current slide in view\r\n\t\tvar current_index = Math.floor(sc_container.scrollLeft / (item_width + gap));\r\n \r\n // adjust for items smaller than width of container\r\n var current_index_left = ((current_index * gap) + (current_index * item_width));\r\n\r\n if((sc_container.scrollLeft - 10) > current_index_left){ // use -10 to adjust for rounding\r\n current_index += 1;\r\n }\r\n\r\n // if sliding to specific number\r\n\t\tif(Number.isInteger(next_slide)){\r\n\t\t\tvar next_index = next_slide;\r\n\r\n // if next\r\n\t\t}else if(next_slide === true){\r\n\t\t\tvar next_index = current_index + 1;\r\n if(next_index >= sc_container.children.length){\r\n next_index = 0; // if no more items, go to first\r\n }\r\n\r\n // if previous\r\n\t\t}else{\r\n var next_index = current_index - 1;\r\n if(next_index < 0){\r\n next_index = sc_container.children.length - 1; // if no more items, go to last, adjusting for 0 index\r\n }\r\n\t\t}\r\n \r\n // calculate amount to scroll container to\r\n to_scroll_amount = (item_width * next_index);\r\n \r\n // need to get this programatically\r\n to_scroll_amount += gap * next_index; // add gap\r\n\r\n\r\n // if container at full scroll (adjusting for items smaller than container)\r\n if(next_slide === true){\r\n var width_of_all_items = (item_width * sc_container.children.length) + (gap * (sc_container.children.length - 1));\r\n // if scrolling again would match or exceed all items && item isn't 100% width\r\n //if((to_scroll_amount + item_width) >= width_of_all_items && item_width != sc_container.offsetWidth){\r\n\t\t\tif((sc_container.scrollLeft + sc_container.offsetWidth) >= width_of_all_items && item_width != sc_container.offsetWidth){\r\n to_scroll_amount = 0;\r\n }\r\n }\r\n\r\n // reduce by ten to avoid sub-pixels breaking the scroll\r\n to_scroll_amount -= 10;\r\n\r\n\t\t// update slider_container.scrollLeft\r\n\t\tsc_container.scrollLeft = to_scroll_amount;\r\n\r\n\t\t// update current\r\n\t\tupdateCurrentPaging();\r\n\r\n\t}\r\n\r\n\r\n\r\n\r\n\t// autoplay\r\n\t// =========================================================================================================================\r\n\r\n\t// play\r\n\tfunction autoplayCarousel(){\r\n\r\n\t\t// find current slide (after scroll)\r\n\t\tconst current_index = Math.floor(sc_container.scrollLeft / item_width);\r\n const current_slide = sc_container.children[current_index];\r\n const video = current_slide.querySelector('video');\r\n\r\n\r\n\t\t// get interval, minus scroll delay\r\n\t\tconst calculateInterval = () => {\r\n\t\t\treturn video ? getVideoLength(video) - scroll_interval : base_interval - scroll_interval;\r\n\t\t};\r\n\r\n\r\n\t\tconst restartAutoplay = () => {\r\n\t\t\t// move to next slide\r\n\t\t\tslideCarousel(true);\r\n\t\t\t// delay restarting autoplay so current scroll has time to complete\r\n\t\t\tsetTimeout(autoplayCarousel, scroll_interval);\r\n\t\t};\r\n\r\n\t\t// set autoplay\r\n\t\tautoplay_interval = setTimeout(restartAutoplay, calculateInterval());\r\n\r\n\t}\r\n\r\n\t// stop\r\n\tfunction cancelAutoPlay(){\r\n\t\tclearTimeout(autoplay_interval); \r\n\t}\r\n\r\n\r\n\r\n\r\n\t// video\r\n\t// =========================================================================================================================\r\n\r\n\t// duration\r\n\tfunction getVideoLength(video){\r\n\t\treturn video.duration * 1000; // convert to milliseconds\r\n\t}\r\n\r\n\t// has loaded\r\n\tfunction hasVideoLoaded(video, callback){\r\n\r\n\t\t// if video already loaded\r\n\t\tif(video.readyState == 4){\r\n\t\t\tif(typeof callback === 'function'){\r\n\t\t\t\tcallback();\r\n\t\t\t}\r\n\r\n\t\t// else listen to onloadedmetadata event\r\n\t\t}else{\r\n\t\t\tvideo.onloadedmetadata = function(){\r\n\t\t\t\tif(typeof callback === 'function'){\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\r\n\r\n\t// prev / next navigation\r\n\t// =========================================================================================================================\r\n\r\n\t// build\r\n\tfunction buildPrevNextNavigation(){\r\n\r\n\t\tconst existing_nav = sc_container.querySelector('.scarousel__nav');\r\n\r\n if(!existing_nav){\r\n const nav_to_add = document.createElement(\"nav\");\r\n nav_to_add.classList.add('scarousel__nav', 'scarousel__nav--prevnext');\r\n nav_to_add.innerHTML = '
PreviousNext';\r\n sc_container.after(nav_to_add);\r\n\r\n nav = sc_container.nextElementSibling;\r\n\r\n bindPrevNextNavigation();\r\n }\r\n\r\n\t}\r\n\r\n\r\n\t// bind click\r\n\tfunction bindPrevNextNavigation(){\r\n\r\n\t\t// get nav links\r\n\t\tvar nav_links = nav.querySelectorAll('a');\r\n\r\n\t\t// loop and attach click events\r\n\t\t[].forEach.call(nav_links, function(nl){\r\n\t\t\tnl.addEventListener('click', function(e){\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t// prev\r\n\t\t\t\tif(!nl.previousElementSibling){\r\n\t\t\t\t\tslideCarousel();\r\n\r\n\t\t\t\t// next\r\n\t\t\t\t}else if(!nl.nextElementSibling){\r\n\t\t\t\t\tslideCarousel(true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcancelAutoPlay();\r\n\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t}\r\n\r\n\r\n\r\n\r\n\t// prev / next navigation\r\n\t// =========================================================================================================================\r\n\r\n\t// build\r\n\tfunction buildPagingNavigation(){\r\n\r\n\t\tconst existing_nav = sc_container.querySelector('.scarousel__nav');\r\n\r\n if(!existing_nav){\r\n const nav_to_add = document.createElement(\"nav\");\r\n nav_to_add.classList.add('scarousel__nav', 'scarousel__nav--paging');\r\n\r\n\t\t\t\t// works instead of for loop, creates array and implodes\r\n const navHtml = Array.from({ length: sc_container.children.length }, (_, i) => '' + (i + 1) + '').join('');\r\n nav_to_add.innerHTML = navHtml;\r\n\r\n sc_container.after(nav_to_add);\r\n\r\n nav = sc_container.nextElementSibling;\r\n\r\n updateCurrentPaging();\r\n\r\n bindPagingNavigation();\r\n\r\n }\r\n\r\n\t}\r\n\r\n\r\n\t// bind click\r\n\tfunction bindPagingNavigation(){\r\n\r\n\t\t// get nav links\r\n\t\tvar nav_links = nav.querySelectorAll('a');\r\n\r\n\t\t// loop and attach click events\r\n\t\t[].forEach.call(nav_links, function(nl){\r\n\t\t\tnl.addEventListener('click', function(e){\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t// get index of current slide\r\n\t\t\t\tvar next_slide = Array.prototype.indexOf.call(nl.parentElement.children, nl);\r\n\r\n\t\t\t\tslideCarousel(next_slide);\r\n\r\n\t\t\t\tupdateCurrentPaging();\r\n\t\t\t\r\n\t\t\t\tcancelAutoPlay();\r\n\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t}\r\n\r\n\r\n\t// update current pos\r\n\tfunction updateCurrentPaging(){\r\n\r\n\t\t// arrow function notation | name = [function/variables] [arrow] [contents]\r\n\t\tconst clearPreviousCurrent = () => {\r\n\t\t\tconst prevCurrent = nav.querySelector('[data-current]');\r\n\t\t\tif(prevCurrent){\r\n\t\t\t\tprevCurrent.removeAttribute('data-current');\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst setCurrentNavItem = () => {\r\n\t\t\t\tconst current_index = Math.floor(sc_container.scrollLeft / item_width);\r\n\t\t\t\tconst matching_nav_item = nav.children[current_index];\r\n\t\t\t\tif(matching_nav_item){\r\n\t\t\t\t\t\tmatching_nav_item.setAttribute('data-current', true);\r\n\t\t\t\t}\r\n\t\t};\r\n\r\n\t\t// delay updating current until after scroll\r\n\t\tsetTimeout(() => {\r\n\t\t\t\tclearPreviousCurrent();\r\n\t\t\t\tsetCurrentNavItem();\r\n\t\t}, scroll_interval);\r\n\r\n\t}\r\n\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n// init all carousels\r\n// =========================================================================================================================\r\n\r\nwindow.addEventListener('load', function(){\r\n\r\n\tvar all_scarousels = document.querySelectorAll('[data-scarousel]');\r\n\tall_scarousels.forEach(function(sc_container){\r\n\r\n\t\t// run only if carousel has more than 1 child\r\n\t\tvar num_items = sc_container.children.length;\r\n\t\tif(num_items > 1){\r\n\t\t\tinitScarousel(sc_container);\r\n\t\t}\r\n\r\n\t});\r\n\r\n});"]}