{"version":3,"sources":["features.min.js"],"names":["request","XMLHttpRequest","open","onload","status","features","JSON","parse","responseText","now","Date","randomFeatures","array","randomIndex","currentIndex","length","Math","floor","random","_ref","shuffle","filter","feature","input","dateSplit","dateParts","timeParts","end_date","split","getTime","items","indicators","forEach","i","preloadEl","document","createElement","rel","as","href","banner","path","head","appendChild","card","className","link","setAttribute","heading","bannerLink","cloneNode","src","alt","cardBody","cardTitle","titleLink","textContent","cardText","innerHTML","copy","push","indicator","concat","indicatorInner","featuredItemsEl","getElementById","featureIndicatorsEl","item","style","display","console","log","onerror","send","defer","method","window","jQuery","$","on","next","find","addClass","setTimeout"],"mappings":"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","file":"features.min.js","sourcesContent":["(function () {\n const request = new XMLHttpRequest();\n\n request.open('GET', '/assets/data/features.json', true);\n\n request.onload = function () {\n // parse a date in yyyy-mm-dd hh:mm:ss format\n function parseDate(input) {\n const dateSplit = input.split(' ');\n const dateParts = dateSplit[0].split('-');\n const timeParts = dateSplit[1].split(':');\n return new Date(dateParts[0], dateParts[1] - 1, dateParts[2],\n timeParts[0], timeParts[1], timeParts[2]); // Note: months are 0-based\n }\n // randomize array.\n function shuffle(array) {\n var currentIndex = array.length, randomIndex;\n while (0 !== currentIndex) {\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [array[currentIndex], array[randomIndex]] = [\n array[randomIndex], array[currentIndex]];\n }\n return array;\n }\n\n if (request.status >= 200 && request.status < 400) {\n const features = JSON.parse(request.responseText);\n\n // Current time\n const now = new Date();\n\n // Filter future date features only\n const activeFeatures = features.filter((feature) => {\n const endDate = parseDate(feature.end_date);\n return endDate.getTime() > now.getTime();\n });\n\n const randomFeatures = shuffle(activeFeatures);\n \n const items = [];\n const indicators = [];\n\n randomFeatures.forEach((feature, i) => {\n // Add a preload element to the head for the first active feature\n if (i === 0) {\n const preloadEl = document.createElement('link');\n preloadEl.rel = 'preload';\n preloadEl.as = 'image';\n preloadEl.href = feature.banner.path;\n document.head.appendChild(preloadEl);\n }\n\n // Create nodes\n const card = document.createElement('div');\n if (i === 0) {\n card.className = 'carousel-item card active';\n } else {\n card.className = 'carousel-item card';\n }\n\n const link = document.createElement('a');\n link.href = feature.link;\n link.setAttribute('data-ga-event-category', 'link - home');\n link.setAttribute('data-ga-event-action', 'featured');\n link.setAttribute('data-ga-event-label', feature.heading);\n\n const bannerLink = link.cloneNode(true);\n card.appendChild(bannerLink);\n\n const banner = document.createElement('img');\n banner.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n banner.setAttribute('data-src', feature.banner.path);\n banner.alt = feature.banner.alt;\n if (i === 1) { // 2nd image gets class to lazy preload\n banner.className = 'card-img-top lazyload lazypreload';\n } else {\n banner.className = 'card-img-top lazyload';\n }\n bannerLink.appendChild(banner);\n\n const cardBody = document.createElement('div');\n cardBody.setAttribute('class', 'card-body');\n card.appendChild(cardBody);\n\n const cardTitle = document.createElement('h3');\n cardTitle.className = 'card-title h5 no-toc';\n cardBody.appendChild(cardTitle);\n\n const titleLink = link.cloneNode(true);\n titleLink.textContent = feature.heading;\n cardTitle.appendChild(titleLink);\n\n const cardText = document.createElement('div');\n cardText.className = 'card-text small';\n cardText.innerHTML = feature.copy;\n cardBody.appendChild(cardText);\n\n //const learnMore = document.createElement('p');\n //learnMore.style.position = 'relative';\n //learnMore.style.zIndex = '1000';\n //cardText.appendChild(learnMore);\n\n //const textLink = link.cloneNode(true);\n //textLink.textContent = 'learn more';\n //learnMore.appendChild(textLink);\n\n items.push(card);\n\n // Create indicators and append to DOM\n const indicator = document.createElement('li');\n indicator.setAttribute('data-target', '#feature-wrapper');\n indicator.setAttribute('data-slide-to', `${i}`);\n if (i === 0) {\n indicator.className = 'active';\n }\n const indicatorInner = document.createElement('span');\n indicatorInner.className = 'sr-only';\n indicatorInner.textContent = `Go to slide ${i + 1} of ${randomFeatures.length}`;\n indicator.appendChild(indicatorInner);\n\n indicators.push(indicator);\n });\n\n const featuredItemsEl = document.getElementById('featured-items');\n const featureIndicatorsEl = document.getElementById('feature-indicators');\n\n items.forEach((item) => {\n featuredItemsEl.appendChild(item);\n });\n\n indicators.forEach((indicator) => {\n featureIndicatorsEl.appendChild(indicator);\n });\n\n if (randomFeatures.length <= 1) {\n document.getElementById('featured-previous').style.display = 'none';\n document.getElementById('featured-next').style.display = 'none';\n document.getElementById('feature-indicators').style.display = 'none';\n }\n if (randomFeatures.length === 0) {\n document.getElementById('featured-items').textContent = 'No current features.';\n console.log('Feature request returned no features.');\n }\n } else {\n document.getElementById('featured-items').textContent = 'No current features.';\n console.log('Feature request status is bad.');\n }\n };\n\n request.onerror = function () {\n document.getElementById('featured-items').textContent = 'No current features.';\n console.log('Feature request resulted in error');\n };\n\n request.send();\n}());\n\n// Event binding to lazy preload images after carousel moves\n(function defer(method) {\n if (window.jQuery) {\n $('#feature-wrapper').on('slid.bs.carousel', () => {\n $('.carousel-item.active').next().find('.lazyload').addClass('lazypreload');\n });\n } else {\n setTimeout(() => { defer(method); }, 50);\n }\n}());\n"]}