harness/app-assets/templates/assets/js/modules/membership.js (63 lines of code) (raw):
define(function () {
'use strict';
var module = {
init: function() {
module.trackMembershipCreativeView = true;
window.injectInlineArticleMembershipCreative = module.injectInlineArticleMembershipCreative;
window.applyNativeFunctionCall('injectInlineArticleMembershipCreative');
GU.util.signalDevice('membership_creative_ready');
},
injectInlineArticleMembershipCreative: function(html, css, id) {
var style,
membershipCreativeContainer,
insertBeforeElem;
if (GU.util.isOnline() &&
!document.getElementsByClassName('membership-creative-container').length) {
insertBeforeElem = module.getInsertBeforeElem();
if (insertBeforeElem) {
//inject css
style = document.createElement('style');
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
document.head.appendChild(style);
// inject html
membershipCreativeContainer = document.createElement('a');
membershipCreativeContainer.href = 'x-gu://membership_creative_tap/' + id;
membershipCreativeContainer.classList.add('membership-creative-container');
membershipCreativeContainer.innerHTML = html;
insertBeforeElem.parentNode.insertBefore(membershipCreativeContainer, insertBeforeElem);
// on scroll check if creative is in viewport
window.addEventListener('scroll', GU.util.debounce(module.isMembershipCreativeInView.bind(null, membershipCreativeContainer, id), 100));
}
}
},
isMembershipCreativeInView: function(membershipCreative, id) {
var messageName = 'membership_creative_view/' + id;
if (module.trackMembershipCreativeView &&
GU.util.isElementPartiallyInViewport(membershipCreative)) {
GU.util.signalDevice(messageName);
module.trackMembershipCreativeView = false;
}
},
getInsertBeforeElem: function() {
var i,
paraCount = 0,
parentElem = document.querySelector('.article__body > div.prose');
for (i = 0; i < parentElem.children.length; i++) {
if (parentElem.children[i].tagName === 'P') {
if (paraCount === 0 ||
((parentElem.children[i - 1] && parentElem.children[i - 1].tagName === 'P') &&
(parentElem.children[i + 1] && (parentElem.children[i + 1].tagName === 'P' || parentElem.children[i + 1].tagName === 'H2')))) {
paraCount++;
if (paraCount > 4) {
// return fifth paragraph
// which is preceded by a paragraph
// and followed by a paragraph or header
return parentElem.children[i];
}
}
}
}
return false;
}
};
return module;
});