← back to Agent Ad Network

assets/embed.js

63 lines

/* DW Network display-ad embed — one line per site:
   <script src="https://ads.agentabrams.com/embed.js"
           data-slot="footer-strip|in-grid-card|sidebar-rail"
           data-site="silkwallpaper.com" data-context="silk,wallcovering"></script>
   Renders a "Sponsored" unit; every ad link is rel="nofollow sponsored" (never leaks
   equity / never reads as a link network — see dw-fleet-seo-independent-ranking). */
(function () {
  var s = document.currentScript;
  if (!s) return;
  var slot = (s.getAttribute('data-slot') || 'footer-strip').toLowerCase();
  var site = s.getAttribute('data-site') || location.hostname;
  var ctx = s.getAttribute('data-context') || '';
  var origin = new URL(s.src).origin;
  var url = origin + '/serve/display?format=json&slot=' + encodeURIComponent(slot) +
            '&site=' + encodeURIComponent(site) + '&context=' + encodeURIComponent(ctx);

  fetch(url, { credentials: 'omit' }).then(function (r) { return r.json(); }).then(function (d) {
    var ad = d && d.ad;
    if (!ad) return; // fail-open: no fill → render nothing
    var wrap = document.createElement('div');
    wrap.className = 'dwad dwad-' + slot;
    var link = '<a href="' + ad.clickUrl + '" target="_blank" rel="nofollow sponsored noopener">' +
               '<span class="dwad-h">' + esc(ad.headline) + '</span> ' +
               '<span class="dwad-b">' + esc(ad.body) + '</span></a>';
    wrap.innerHTML =
      '<span class="dwad-label">Sponsored</span>' + link +
      '<span class="dwad-by">' + esc(ad.sponsor || '') + '</span>' +
      (slot !== 'footer-strip' ? '<button class="dwad-x" aria-label="dismiss">×</button>' : '');

    injectStyles(origin);
    place(wrap, slot, s);
    var x = wrap.querySelector('.dwad-x');
    if (x) x.onclick = function () { wrap.remove(); };
  }).catch(function () {});

  function esc(t) { return String(t == null ? '' : t).replace(/[&<>"]/g, function (c) {
    return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }

  function place(wrap, slot, script) {
    if (slot === 'in-grid-card') {
      // drop where the script tag sits (author places it inside the grid)
      script.parentNode.insertBefore(wrap, script.nextSibling);
    } else {
      document.body.appendChild(wrap); // footer-strip / sidebar-rail = fixed via CSS
    }
  }

  function injectStyles(origin) {
    if (document.getElementById('dwad-css')) return;
    var css = document.createElement('style'); css.id = 'dwad-css';
    css.textContent =
      '.dwad{font:13px/1.4 system-ui,sans-serif;color:#222;background:#faf7f0;border:1px solid #e6ddc8;box-sizing:border-box}' +
      '.dwad a{color:#8b6914;text-decoration:none}.dwad a:hover{text-decoration:underline}' +
      '.dwad-label{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:#a99;margin-right:8px}' +
      '.dwad-h{font-weight:600}.dwad-by{font-size:11px;color:#a99;margin-left:8px}' +
      '.dwad-x{border:0;background:none;font-size:16px;color:#a99;cursor:pointer;float:right;line-height:1}' +
      '.dwad-footer-strip{position:fixed;left:0;right:0;bottom:0;z-index:9998;padding:8px 16px;text-align:center;box-shadow:0 -1px 6px rgba(0,0,0,.06)}' +
      '.dwad-sidebar-rail{position:fixed;right:16px;bottom:16px;z-index:9998;max-width:280px;padding:12px;border-radius:8px;box-shadow:0 4px 14px rgba(0,0,0,.12)}' +
      '.dwad-in-grid-card{padding:16px;border-radius:8px;min-height:120px;display:flex;flex-direction:column;justify-content:center}';
    document.head.appendChild(css);
  }
})();