harness/app-assets/templates/assets/js/bootstraps/article.js (193 lines of code) (raw):

define([ 'modules/twitter', 'modules/witness', 'modules/outbrain', 'modules/quiz', 'modules/membership' ], function ( twitter, witness, outbrain, quiz, membership ) { 'use strict'; function init() { twitter.init(); witness.duplicate(); insertOutbrain(); loadQuizzes(); formatImmersive(); richLinkTracking(); loadMembershipCreative(); } function insertOutbrain() { window.articleOutbrainInserter = loadOutbrain; window.applyNativeFunctionCall('articleOutbrainInserter'); } function loadOutbrain() { outbrain.init(); } function loadQuizzes() { quiz.init(); } function formatImmersive() { var immersives = document.getElementsByClassName('immersive'); if (immersives.length) { // Override tone to feature for all immersive pages document.body.className = document.body.className.replace(/(tone--).+?\s/g, 'tone--feature1 '); adjustHeaderImageHeight(); // we actually need for the embed to be sent through with prefixed & unprefixed styles if (document.body.classList.contains('windows')) { formatImmersiveForWindows(); } // find all the section seperators & add classes addClassesToSectionSeparators(); // for each element--immersive add extra classes depending on siblings addClassesToElementImmersives(); // store all pullquotes top offset for later movePullQuotes(); // attach event handlers attachImmersiveEventHandlers(); } } function formatImmersiveForWindows() { var newSrc, iframe = document.querySelector('.article__header-bg .element > iframe'); if (iframe) { newSrc = iframe[0].srcdoc .replace('transform: translate(-50%, -50%);', '-webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%);') .replace(/-webkit-animation/g, 'animation') .replace(/animation/g, '-webkit-animation') .replace(/-webkit-keyframes/g, 'keyframes') .replace(/@keyframes/g, '@-webkit-keyframes'); iframe.srcdoc = newSrc; } } function addClassesToSectionSeparators() { var i, header, headers = document.querySelectorAll('.article h2'); for (i = 0; i < headers.length; i++) { header = headers[i]; if (header.innerHTML.trim() === '* * *') { header.innerHTML = ''; header.classList.add('section__rule'); if (header.nextElementSibling) { header.nextElementSibling.classList.add('has__dropcap'); } } } } function addClassesToElementImmersives() { var i, elementImmersive, elementImmersives = document.querySelectorAll('figure.element--immersive'); for (i = 0; i < elementImmersives.length; i++) { elementImmersive = elementImmersives[i]; if (elementImmersive.nextElementSibling && elementImmersive.nextElementSibling.classList.contains('element-pullquote')) { elementImmersive.nextElementSibling.classList.add('quote--image'); elementImmersive.classList.add('quote--overlay'); elementImmersive.dataset.thing = ''; } if (elementImmersive.nextElementSibling && elementImmersive.nextElementSibling.tagName === 'H2') { elementImmersive.nextElementSibling.classList.add('title--image'); elementImmersive.classList.add('title--overlay'); if (elementImmersive.nextElementSibling.nextElementSibling) { elementImmersive.nextElementSibling.nextElementSibling.classList.add('has__dropcap'); } } } } function movePullQuotes() { var i, pullQuote, pullQuotes = document.getElementsByClassName('element-pullquote'); for (i = 0; i < pullQuotes.length; i++) { pullQuote = pullQuotes[i]; pullQuote.dataset.offset = GU.util.getElementOffset(pullQuote).top; } } function attachImmersiveEventHandlers() { var i, quoteOverlay, quoteOverlays = document.getElementsByClassName('quote--overlay'); for (i = 0; i < quoteOverlays.length; i++) { quoteOverlay = quoteOverlays[i]; quoteOverlay.addEventListener('click', onQuoteOverlayClick.bind(null, quoteOverlay)); } window.addEventListener('scroll', GU.util.debounce(onImmersiveScroll, 10)); window.addEventListener('resize', GU.util.debounce(onResize, 100)); } function onQuoteOverlayClick(quoteOverlay, evt) { var figcaption; evt.preventDefault(); figcaption = quoteOverlay.getElementsByTagName('figcaption')[0]; if (figcaption) { if (figcaption.classList.contains('display')) { figcaption.classList.remove('display'); } else { figcaption.classList.add('display'); } } } function onImmersiveScroll() { var i, dataOffset, pullQuote, pullQuotes = document.getElementsByClassName('element-pullquote'), viewPortHeight = document.documentElement.clientHeight, pageOffset = viewPortHeight * 0.75; for (i = 0; i < pullQuotes.length; i++) { pullQuote = pullQuotes[i]; dataOffset = pullQuote.dataset.offset; if (window.scrollY >= (dataOffset - pageOffset)) { pullQuote.classList.add('animated'); pullQuote.classList.add('fadeInUp'); } } } function onResize() { adjustHeaderImageHeight(); } function adjustHeaderImageHeight() { var embed, viewPortHeight, bgHeight, headerContainer; viewPortHeight = document.documentElement.clientHeight; bgHeight = (viewPortHeight - document.body.style.marginTop.replace('px', '')) + 'px'; headerContainer = document.querySelector('.article__header-bg, .article__header-bg .element > iframe'); if (headerContainer) { embed = headerContainer.getElementsByClassName('element-embed')[0]; if (embed || headerContainer.dataset.fullScreen) { headerContainer.style.height = bgHeight; if (embed) { embed.classList.add('height-adjusted'); } } } } function richLinkTracking() { var i, j, href, link, links, richLink, richLinks = document.getElementsByClassName('element-rich-link'); for (i = 0; i < richLinks.length; i++) { richLink = richLinks[i]; links = richLink.getElementsByTagName('a'); for (j = 0; j < links.length; j++) { link = links[j]; href = link.getAttribute('href'); if (href !== '') { link.setAttribute('href', href + '?ArticleReferrer=RichLink'); } } } } function loadMembershipCreative() { membership.init(); } return { init: init }; });