(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 );
}
} );
}
}
} );
;