(function( _w, _d, _$ ) { var paramountIframe, postData, inView = true; _$(_w).on( "message.paramount_breakout", onSlotMessage ); //document.addEventListener('message', onSlotMessage, false); function onSlotMessage( e ) { // Check if we have the start of a JSON object if( e && typeof e.originalEvent.data === 'string' && e.originalEvent.data.charAt(0) === '{' ) { try { var data = JSON.parse( e.originalEvent.data ); if ( data.breakout && data.position ) { // We only expect to hear from them once to let us know what they are _$(_w).off("message.paramount_breakout"); // Breakout content will be encapsulated in an iframe which takes up the space of the ad var ifrcntr = _d.createElement( 'div' ); paramountIframe = _d.createElement( 'iframe' ); ifrcntr.append(paramountIframe); var $cntr = _$( 'div[id*="'+ data.position +'"]' ), $el = $cntr.parent(); // TODO, add in logic here to figure out the ad slot. The data object contains the `position` value that was passed to DFP $cntr.empty(); ifrcntr.setAttribute( 'id','video-container' ); ifrcntr.setAttribute( 'itemprop','video' ); $el.append( ifrcntr ); //,iframe.paramount-breakout'), // write the ad to the iframe var slotWin = paramountIframe.contentWindow; slotWin.document.open(); slotWin.document.write( data.html ); slotWin.document.close(); if ( '300x250_1m' == data.position ) { paramountIframe.setAttribute( 'width', '360' ); paramountIframe.setAttribute( 'height', '250' ); } else { paramountIframe.setAttribute( 'width', '1000' ); paramountIframe.setAttribute( 'height', '563' ); } paramountIframe.classList.add( 'paramount-breakout' ); // TODO: Have rule that sets this class to 100% height/width of ad slot _$(_w).on("scroll.paramount_breakout", onScroll); _$(_w).on("visibilitychange.paramount_breakout", onVisibilityChange); } } catch(err) { // console.log(err); } } } function onScroll( e ) { var scrollTop = _$( _w ).scrollTop(), scrollPercentage = (_$(paramountIframe).height() - scrollTop) / _$(paramountIframe).height(), level = (scrollPercentage > 1) ? 100 : Math.floor(scrollPercentage * 100); level = (level < 0) ? 0 : level; inView = ( level <= 0 ) ? false : true; postData = { gaMsg: true, visibility: level, visible: inView, }; paramountIframe.contentWindow.postMessage( JSON.stringify( postData ), '*' ); } function onVisibilityChange( e ) { if ( 'hidden' == document.visibilityState ) { postData = { gaMsg: true, visibility: 0, visible: false, }; paramountIframe.contentWindow.postMessage( JSON.stringify( postData ), '*' ); } else { _$(_w).trigger('scroll.paramount_breakout'); } } } )( window, document, jQuery );; googletag.cmd.push(function(){ var _w = window, _d = _w.document, intSlot = _w['lawrence_dfp_desktop_top'], gravityRendered = null, creativeWidth = 2560, creativeHeight = 1440, _$ = jQuery; googletag.pubads().addEventListener('slotRenderEnded', function(evt) { var s = evt.slot; if ( !intSlot ) { return; } if ( s.getSlotElementId() === intSlot.getSlotElementId() || 'bling-1' === s.getSlotElementId() ) { var adCnter = _$( '#'+ s.getSlotElementId()), adIframe = adCnter.find('iframe[data-google-container-id]'), adHidden = false; if ( null != evt.size && 2560 === evt.size[0] && 1440 === evt.size[1] ) { var cssModified = false, platform = _w.dfpTargetingObject.build, headerAdBelowNav = true; if ( _$('#header-ad').parent().attr('id') == 'wrapper' ) { headerAdBelowNav = false; } s.ignoreRefresh = true; if ( gravityRendered ) { _$( _w ).off( 'scroll.native_gravity' ); _$( _w ).off( 'resize.native_gravity' ); _$( '._sdp_ng_skip_btn_cntr' ).off( 'click.native_gravity' ); } else { _$('body').addClass('native-gravity-full'); var skipCnterHtml = '
'; var skipCss = ''; if ( platform == 'fishburne' ) { if ( dfpTargetingObject.cst_section.indexOf('homepage') != -1 ) { adIframe = cloneNativeGravity(adIframe); } } else { navMenuBgColor = _$('.nav__wrap').css('background-color'); navLogoBgColor = _$('#header-wrapper-sticky-wrapper .branding').css('background-color'); skipCss += '#header-wrapper-sticky-wrapper { position: fixed; left: 0; top: 0px; right: 0; } #main { background-color: #FFF; }'; } adIframe.addClass('sdp_ng_cnter'); _$( skipCnterHtml ).insertAfter( adCnter ); additionalStyles(skipCss); if ( platform !== 'fishburne' ) { window.Wasabi.navigation.sticky(); } } var skipCnter = _$( '._sdp_ng_skip_btn_cntr' ); _$( _w ).on( 'scroll.native_gravity', function(evt) { var scrollTop = _$( _w ).scrollTop(), scrollPercentage = (_$(adIframe).height() - scrollTop) / _$(adIframe).height(), level = (scrollPercentage > 1) ? 100 : Math.floor(scrollPercentage * 100), inView = true, postData = {}; _w._adCnter = adCnter; level = (level < 0) ? 0 : level; adIframe.css({ opacity : (level/100) }); skipCnter.css({ opacity : (level/100) }); scrollPercentage = (scrollPercentage < 1) ? 0 : scrollPercentage; if ( level <= 0 ) { inView = false; } postData = { gaMsg: true, visibility: level, visible: inView }; adIframe[0].contentWindow.postMessage( JSON.stringify( postData ), '*' ); if ( level > 0 ) { if ( adIframe.hasClass('hidden') ) { adIframe.removeClass('hidden'); skipCnter.removeClass('hidden'); } if ( level <= 95 ) { if ( platform == 'fishburne' ) { _$( '#container' ).css( 'z-index', 10002 ); _$( '.tippy-popper' ).css( 'z-index', 10002 ); } else { if ( headerAdBelowNav == false ) { _$( '#main' ).css( 'z-index', 10002 ); } else { _$( '#primary,#secondary' ).css( { 'z-index' : 10002, 'position' : 'relative', 'background-color' : '#FFF' }); } } } else { if ( platform == 'fishburne' ) { _$( '#container' ).css( 'z-index', 'inherit'); _$( '.tipper-popper').css( 'z-index', 9999); } else { if ( headerAdBelowNav == false ) { _$( '#main' ).css( 'z-index', 'inherit' ); } else { _$( '#primary,#secondary' ).css( { 'z-index' : 'inherit', 'position' : 'inherit', 'background-color' : 'inherit' }); } } } } else { if ( false === adIframe.hasClass('hidden') ) { adIframe.addClass('hidden'); skipCnter.addClass('hidden'); } } } ); _$( _w ).on( 'visibilitychange.native_gravity', function( evt ) { var postData = {}; if ( 'hidden' == _d.visibilityState ) { postData = { gaMsg: true, visibility: 0, visible: false, }; adIframe[0].contentWindow.postMessage( JSON.stringify( postData ), '*' ); } else { _$(_w).trigger('scroll.native_gravity'); } }); _$( _w ).on( 'resize.native_gravity', function(evt) { var headerHeight = 0; if ( platform == 'fishburne' ) { headerHeight = _$( '.header__wrapper' ).height(); gravityPos = headerHeight; skinPos = headerHeight; } else { headerHeight = _$( '#header-wrapper-sticky-wrapper' ).outerHeight(); gravityPos = headerHeight; skinPos = gravityPos; } var newCss = { 'width' : _w.innerWidth + 'px', 'height' : ( _w.innerHeight - headerHeight) + 'px', 'top' : gravityPos + 'px' }; adIframe.css(newCss); adIframe.parent().css( { 'height' : _w.innerHeight, 'width' : 'auto' } ); if ( _$( '.sdp-skin-creative-container').is( '*' ) ) { _$( '.sdp-skin-creative-container').css( { 'top' : skinPos + 'px' } ); } }); skipCnter.on('click.native_gravity', function(evt) { _$('html, body').animate({ scrollTop: _w.innerHeight }, 600); }); _$( _w ).trigger( 'scroll.native_gravity' ) .trigger( 'resize.native_gravity' ); gravityRendered = true; } } }); function additionalStyles(styles) { var css = _d.createElement('style'); css.type = 'text/css'; if ( css.styleSheet ) css.styleSheet.cssText = styles; else css.appendChild( _d.createTextNode( styles ) ); _d.getElementsByTagName('head')[0].appendChild( css ); } function cloneNativeGravity(adIframe) { var placeHolder = _d.createElement('div'), newIframe = adIframe.clone(); _$(placeHolder).addClass('native-gravity-placeholder'); _w.testtt = adIframe; _$(placeHolder).append(newIframe); _$(adIframe).parent().css({ 'width' : '0px', 'height' : '0px'}); _$(adIframe).remove(); _$(placeHolder).insertAfter(_$('.header__wrapper')); _$( '#primary,#secondary' ).css('background-color', '#FFF'); return newIframe; } }); ; if (window.voltax) { const vplayers = voltax.getAllPlayersOnPage(); const vplayer = vplayers[0]; window.currentVplayer = vplayer; trackVplayerData(); } else { window.addEventListener('voltaxPlayerLoaded', ({ detail }) => { const vplayers = voltax.getAllPlayersOnPage(); const vplayer = vplayers[0]; window.currentVplayer = vplayer; trackVplayerData(); }); } function trackVplayerData() { // Globals. window.smgVolaxPlayerVideoID = 0; window.smgVolaxPlayerVideoIsAutoplay = true; // TODO: Add logic in to detect click to play. Waiting in Minute Media. window.smgVolaxPlayerVideoIsContinuousPlay = false; window.smgVolaxPlayerMilestonesHit = []; window.smgVolaxPlayerVideoStartingPosition = 0; // Play. window.currentVplayer.on('play', () => { t3MMVideoEvent('video-autoplay'); }); // Pause. window.currentVplayer.on('pause', () => { t3MMVideoEvent('video-pause'); }); window.currentVplayer.on('complete', () => { t3MMVideoEvent('video-complete'); }); // TODO: Implement seek event. Issue right now is that seek fires whenever a new playlist is loading. // TODO: Implement videoSkeeking Event. Waiting on Minute Media team. window.currentVplayer.on('fullscreen', (params) => { t3MMVideoEvent('video-resize'); }); window.currentVplayer.on('adPlay', (params) => { t3MMVideoEvent('video-ad-start'); }); window.currentVplayer.on('adSkipped', (params) => { t3MMVideoEvent('video-ad-skip'); }); window.currentVplayer.on('time', (params) => { let duration = params.duration; let position = params.position; let currentLocation = position / duration; if (jwplayerMilestoneShouldFire(0.1, '10', currentLocation)) { window.smgVolaxPlayerMilestonesHit.push('10'); t3MMVideoEvent('video-milestone', '10% progress'); } if (jwplayerMilestoneShouldFire(0.25, '25', currentLocation)) { window.smgVolaxPlayerMilestonesHit.push('25'); t3MMVideoEvent('video-milestone', '25% progress'); } if (jwplayerMilestoneShouldFire(0.50, '50', currentLocation)) { window.smgVolaxPlayerMilestonesHit.push('50'); t3MMVideoEvent('video-milestone', '50% progress'); } if (jwplayerMilestoneShouldFire(0.75, '75', currentLocation)) { window.smgVolaxPlayerMilestonesHit.push('75'); t3MMVideoEvent('video-milestone', '75% progress'); } if (jwplayerMilestoneShouldFire(0.95, '95', currentLocation)) { window.smgVolaxPlayerMilestonesHit.push('95'); t3MMVideoEvent('video-milestone', '95% progress'); } }); function jwplayerMilestoneShouldFire( milesstonePosition = 0, milestonePositionString = '0', currentLocation = 0 ) { if ( false === window.smgVolaxPlayerMilestonesHit.includes(milestonePositionString) && milesstonePosition > window.smgVolaxPlayerVideoStartingPosition && milesstonePosition < currentLocation ) { return true; } return false; } } function t3MMVideoEvent( eventType, clientAction ) { if ( ! eventType ) { // required fields. return; } // Get video data. let volaxVideoData = window.currentVplayer.getCurrentVideoItem(); // If video play, determine if it's the first play. if ( 'video-play' === eventType ) { if ( 0 === window.smgVolaxPlayerVideoID ) { // First Video. window.smgVolaxPlayerVideoID = volaxVideoData.mediaId; } else if ( volaxVideoData.mediaId === window.smgVolaxPlayerVideoID ) { eventType = 'video-resume'; } else { // Second video or further. window.smgVolaxPlayerVideoID = volaxVideoData.mediaId; window.smgVolaxPlayerVideoIsContinuousPlay = true; } } // Data for video views and actions. // Keys not being set: content-video-ad-name, content-cst, content-video-3p-tracking-id, content-video-player-rail-state, content-video-size, content-date-published, content-time-published. let videoGciDataLayer = { 'event-type': eventType, 'content-type': 'video', 'content-id': volaxVideoData.mediaId ? volaxVideoData.mediaId : null, 'content-byline': volaxVideoData.creator ? volaxVideoData.creator : null, 'content-keywords': volaxVideoData.tags ? volaxVideoData.tags : null, 'content-ssts-section': gciDataLayer['content-ssts-section'] ? gciDataLayer['content-ssts-section'] : null, 'content-ssts-subsection': gciDataLayer['content-ssts-subsection'] ? gciDataLayer['content-ssts-subsection'] : null, 'content-ssts-topic': gciDataLayer['content-ssts-topic'] ? gciDataLayer['content-ssts-topic'] : null, 'content-ssts-subtopic': gciDataLayer['content-ssts-subtopic'] ? gciDataLayer['content-ssts-subtopic'] : null, 'content-video-duration': volaxVideoData.duration ? volaxVideoData.duration.toString() : null, 'content-video-market-name': gciDataLayer['content-market-name'] ? gciDataLayer['content-market-name'] : null, // Root URL. 'content-video-name': volaxVideoData.title ? volaxVideoData.title : null, 'content-video-play-status': window.smgVolaxPlayerVideoIsAutoplay ? 'autoplay' : 'click-to-play', // 'autoplay' or 'click-to-play'. 'content-video-player-type': 'minute media', 'page-domain': gciDataLayer['page-full-url'] ? gciDataLayer['page-full-url'] : null, // URL of the page the user is viewing the vidoe on. 'content-video-continuous-play': window.smgVolaxPlayerVideoIsContinuousPlay, // true or false 'content-video-provider': volaxVideoData.provider ? volaxVideoData.provider : null, 'content-video-type': 'smg article', } if ( clientAction ) { videoGciDataLayer['client-action'] = clientAction; } // TODO: Parse video.pubdate to complete the 2 todos below. // TODO: add in 'content-date-published': '2020-09-21'. // TODO: add in 'content-time-published': '8:32:46.633Z'. // Fire pageview with combined data. window.gciAnalytics.view(videoGciDataLayer); } ; /** * Runs Ad functionality only have the document is ready. * * @param {object} $ The reference to jQuery. */ jQuery( document ).ready( function( $ ) { // Dont refresh bottom ad on first post load. window.bottomAdExpired = false; var refreshBySlotIntervals = []; var refreshEnabledArray = getRefreshEnabledArray(); var ad_refresh = { refresh_type: _LAWRENCE_ADS_EXPORTS.ad_refresh.refresh_type || 'bottom', seconds: _LAWRENCE_ADS_EXPORTS.ad_refresh.seconds || 30, distance: _LAWRENCE_ADS_EXPORTS.ad_refresh.distance || 2000, active: parseInt( _LAWRENCE_ADS_EXPORTS.ad_refresh.active, 10 ) }; /** * Refreshing desktop ad [lawrence_dfp_desktop_bottom_300x250] based on amount * of scrolling. * * @ticket SXW-106 */ function lawrenceRefreshDesktopAd() { // If no DFP is added, ie: for local envs. if ( 'undefined' !== typeof googletag ) { googletag_cmd_push( function() { if ( 0 !== ad_refresh.active ) { var prevScrollTop = 0; var scrolled = 0; var afterFirstRefresh = false; setInterval( function() { if ( scrolled > ad_refresh.distance && afterFirstRefresh ) { scrolled = 0; googletag_cmd_push( function() { if ( 'undefined' !== typeof window.lawrence_dfp_desktop_bottom_300x250 ) { // Prebid is not activated. googletag.pubads().refresh( [ window.lawrence_dfp_desktop_bottom_300x250 ] ); } } ); } afterFirstRefresh = true; }, ad_refresh.seconds * 1000 ); $( window ).scroll( function() { var scrollTop = $( this ).scrollTop(); if ( scrollTop < 0 ) { scrollTop = 0; } // Update scroll if going down. if ( prevScrollTop < scrollTop ) { scrolled += Math.abs( prevScrollTop - scrollTop ); } prevScrollTop = scrollTop; } ); } } ); } } function refreshAllAds() { if ( 0 !== window.hasOwnProperty('bidManager') && 'undefined' !== typeof bidSlots && 0 < bidSlots.length ) { googletag_cmd_push( function() { bidManager.requestBids(); } ); } else { /** * The bidManager script only loads if the Amazon A9 Code is set. * This provides an alternate way to refresh only the Google ads when * the Amazon code is not set. */ googletag_cmd_push( function() { var adSlots = []; googletag.pubads().getSlots().forEach( function( slot ) { if ( false === slot.hasOwnProperty( 'ignoreRefresh' ) ) { adSlots.push( slot ); } } ); googletag.pubads().refresh( adSlots ); }); } }; /** * If a skin isn't present and the Momentum ad exists, add styles to make it stretch across the full width of the screen. */ function momentumAdStyling() { interval = setInterval(() => { const adInner = document.querySelector('.ad--inner') const adInnerGrandChild = document.querySelector('.ad--inner > :first-child > :first-child') const hasSkin = document.querySelector('body').classList.contains('sdp-skin-creative') if (!hasSkin && adInnerGrandChild && ( (adInnerGrandChild.style.width === '1000px' && adInnerGrandChild.style.height === '250px') || (adInnerGrandChild.style.width === '300px' && adInnerGrandChild.style.height === '390px') )) { clearInterval(interval) adInner.style.width = 'fit-content' adInner.style.margin = 'initial' adInner.style.minWidth = 'auto' adInnerGrandChild.firstChild.style.width = '100vw' adInnerGrandChild.addEventListener('DOMNodeRemoved', () => { adInner.hasAttribute('style') ? adInner.removeAttribute('style') : null momentumAdStyling() }) } setTimeout(() => { clearInterval(interval) }, 10000) }, 200) } /** * If custom slot refresh times have been set, return an array of the custom slot refresh timings. */ function getRefreshEnabledArray() { return Object.entries(window.usat_ad_tags).map(([tag, item]) => { if (item.refresh_timing !== 0 || item.refresh_timing_creative !== 0) { return { tag, firstRefresh: false, refresh_enabled: item.refresh_enabled, refresh_timing: item.refresh_timing, refresh_timing_creative: item.refresh_timing_creative, creative_present: document.querySelector('body').className.includes('creative') }; } else { return null; } }).filter(item => item !== null); } /** * Set refresh intervals for each slot with a custom refresh timing. */ function refreshBySlot(slots) { if (typeof googletag === 'undefined') { return; } googletag_cmd_push(() => { if (ad_refresh.active === 0 || !slots) { return; } slots.forEach((slot) => { const intervalTime = (document.querySelector('body').className.includes('creative') && slot.refresh_timing_creative ? slot.refresh_timing_creative : slot.refresh_timing) * 1000; if (slot.firstRefresh || !parseInt(slot.refresh_enabled)) { return; } refreshBySlotIntervals[slot.tag] = setInterval(() => { googletag_cmd_push(() => { if (typeof window[slot.tag] !== 'undefined') { googletag.pubads().refresh([window[slot.tag]]); } creativePresentNow = document.querySelector('body').className.includes('creative'); if (slot.creativePresent === creativePresentNow) { return; } slot.creativePresent = creativePresentNow; slot.firstRefresh = false; clearInterval(refreshBySlotIntervals[slot.tag]); refreshBySlot([slot]); }); slot.firstRefresh = true; }, intervalTime) }); }); } if ( 'bottom' === ad_refresh.refresh_type ) { lawrenceRefreshDesktopAd(); // Handle new items appended by infinite scroll. $( document ).on( 'post-load', function() { // Refresh the bottom ad if it is there and three seconds have passed since last refresh. if ( ! window.firstPostLoad ) { window.firstPostLoad = true; setTimeout( function() { window.bottomAdExpired = true }, 10000); } else if ( window.bottomAdExpired ) { window.bottomAdExpired = false; setTimeout( function() { window.bottomAdExpired = true; }, 10000); if ( 'undefined' !== typeof window.lawrence_dfp_tablet_bottom_300x250 ) { googletag_cmd_push( function() { googletag.pubads().refresh( [ window.lawrence_dfp_tablet_bottom_300x250 ] ); }); } } } ); } else { momentumAdStyling(); refreshBySlot(refreshEnabledArray); if ( 0 !== ad_refresh.active ) { var _refreshInterval = setInterval( refreshAllAds, ad_refresh.seconds * 1000 ); // Handle new items appended by infinite scroll. $( document ).on( 'post-load', function() { if ( 0 !== _refreshInterval ) { clearInterval( _refreshInterval ); _refreshInterval = setInterval( refreshAllAds, ad_refresh.seconds * 1000 ); } } ); } } } ); ;