// looks for app block otherwise adds above checkout button. script runs once (function () { window.rterms = window.rterms || {}; rterms.metafield = rterms.metafield || {}; rterms.settings = rterms.settings || {}; if (rterms.ran || (rterms.settings.only_cart_page && !window.location.pathname.match(/\/cart/))) return; rterms.checkouts = []; rterms.checkoutEvents = []; rterms.addedEvents = false; var statsUrl = 'https://terms-relentless.herokuapp.com/statistics-event'; var checkoutSelectors = rterms.checkoutEl || '[name="checkout"]:not([type="hidden"], .checkout-link__button, .tpo-btn-checkout, .cart-title-button), .cart--totals .cart--nav, a[href^="/checkout"], a[href="/account/login"].cart__submit, button[type="submit"].btn-order, a.btn.cart__checkout, a.cart__submit, input.action_button[value="Checkout"], .wc-proceed-to-checkout button, #cart_form .buttons .btn-primary, a.cart_adev_o, [data-limoniapps-discountninja-checkoutlink], form > button.checkout-button, button.btn_checkout, button.checkout-btn, button[data-href="/checkout"], .cart__footer > .table_medium_up:nth-child(2), #cart-summary .cart-summary__section .btn--empty-cart, button.qsc2-checkout-button, button[name="button-route-2"], .cd-checkout-section-container .cd-checkout-section-button, .cart__checkout-button'; var dynamicCheckoutSelectors = '.dynamic-checkout__content'; var precheck = !rterms._3lj2l && rterms.metafield.precheck && rterms.metafield.precheck === 'on'; var blockDynamic = !rterms._3lj2l && rterms.metafield.dynamic && rterms.metafield.dynamic === 'on'; var optional = !rterms._3lj2l && rterms.metafield.optional && rterms.metafield.optional === 'on'; var css = '.rterms-disable-dynamic { content: ""; display: block !important; position: absolute; top: 0; left: 0; right: 0; bottom: 0; }'; if (!window.location.pathname.match(/\/cart$/)) { css += '.terms-relentless { justify-content: flex-start !important; text-align: left !important; padding-left: 4px; }'; } if (rterms.metafield.alignment === 'left') { css += '.terms-relentless { justify-content: flex-start !important; text-align: left !important; }'; } else if (rterms.metafield.alignment === 'center') { css += '.terms-relentless { justify-content: center !important; text-align: center !important; }'; } else if (rterms.metafield.alignment === 'right') { css += '.terms-relentless { justify-content: flex-end !important; text-align: right !important; }'; } var style = document.createElement('style'); style.innerHTML = css; if (rterms.ajaxCartStyle) style.innerHTML += rterms.ajaxCartStyle; document.head.appendChild(style); if (!optional) { var dynamics = document.querySelectorAll(dynamicCheckoutSelectors); if (dynamics.length && blockDynamic) { dynamics.forEach(function (dynamic) { cover(dynamic); }); } } function cover(el) { el.style.position = 'relative'; var div = document.createElement('div'); div.classList.add('rterms-disable-dynamic'); el.appendChild(div); } var text = rterms.metafield.text; if (!text) text = 'I accept the <a target="_blank" href="/policies/terms-of-service">terms of service</a>.'; var noLinks = !text.match(/href="/); if (noLinks) { text = text.replace(/(terms and conditions|terms of service)/, '<a target="_blank" href="/policies/terms-of-service">$1</a>'); text = text.replace(/(privacy-policy)/, '<a target="_blank" href="/policies/privacy-policy">$1</a>'); } rterms.checkout = checkout; rterms.ran = true; // initial add var checkouts = [].slice.call(document.querySelectorAll(checkoutSelectors)); checkouts.forEach(addCheckbox); // keep looking for checkout buttons if (window.MutationObserver) { const observer = new MutationObserver((mutationList, observer) => { for (let mutationRecord of mutationList) { if (mutationRecord.addedNodes.length) { for (let checkout of mutationRecord.addedNodes) { if (!checkout.matches) continue; // text nodes are objects but don't have matches if (checkout.matches(checkoutSelectors)) { addCheckbox(checkout); } var descendants = checkout.querySelectorAll(checkoutSelectors); if (descendants) { descendants.forEach(function (descendant) { addCheckbox(descendant); }); } } } } }); observer.observe(document.body, { childList: true, subtree: true }); } // checkbox view if (Math.floor(Math.random() * 9) === 8) { request(statsUrl, {type: 'POST', body: {shop: Shopify.shop, event: 'terms_views'}}, function (e) { console.log(e); }); } // checkbox click document.body.addEventListener('click', function (e) { if (e.target.matches('.rterms-checkbox')) { if (e.target.checked) { // put jQuery click events back if (!rterms.addedEvents) { rterms.addedEvents = true; rterms.checkouts.forEach(function (checkout) { try { $._data(checkout).events.click = rterms.checkoutEvents.shift(); } catch (err) { // console.log(err); } }); } // stop blocking dynamic checkouts var dynamics = document.querySelectorAll('.rterms-disable-dynamic'); if (dynamics) dynamics.forEach(function (el) { el.style.pointerEvents = 'none'; }); // add date/time to attributes if (!rterms._3lj2l && rterms.metafield.date && rterms.metafield.date === 'on') { request(window.Shopify.routes.root + 'cart/update.js', { type: 'POST', body: { attributes: {'Terms Accepted At': Date()} }, headers: {'Content-Type': 'application/json'} }); } // record click event if (Math.floor(Math.random() * 9) === 8) { request(statsUrl, {type: 'POST', body: {shop: Shopify.shop, event: 'terms_clicks'}}, function (e) { console.log(e); }); } // remove bndlr class rterms.checkouts.forEach(function (checkout) { checkout.classList.remove('bndlr-button-disabled'); }); // remove Zapiet override if (e.target && e.target.checked) { window.customCheckoutValidation = null; } } else { var allUnchecked = true; var checkouts = document.querySelectorAll('.rterms-checkbox'); if (checkouts) for (var i = 0; i < checkouts.length; i++) { if (checkouts[i].checked) { allUnchecked = false; break; } } if (allUnchecked && !optional) { if (rterms.addedEvents) { rterms.addedEvents = false; rterms.checkouts.forEach(function (checkout) { var jQueryEvents = []; try { jQueryEvents = $._data(checkout).events.click; $._data(checkout).events.click = []; } catch (err) { // console.log(err); } rterms.checkoutEvents.push(jQueryEvents); }); } var dynamics = document.querySelectorAll('.rterms-disable-dynamic'); if (dynamics) dynamics.forEach(function (el) { el.style.pointerEvents = 'auto'; }); if (window.bndlr) { rterms.checkouts.forEach(function (checkout) { checkout.classList.add('bndlr-button-disabled'); }); } if (window.ZapietWidgetConfig) { window.customCheckoutValidation = rterms.checkout; } } } } else if (e.target.matches('.rterms-disable-dynamic')) { alert(rterms.metafield.alert_message || 'Please select the terms of service'); } }); if (precheck) { document.querySelectorAll('.rterms-checkbox').forEach(function (checkbox) { if (checkbox.checked) return; checkbox.click(); }); } function addCheckbox(checkout) { if (checkout.closest('cart-notification') && window.location.pathname.match(/\/cart/)) return; rterms.checkouts.push(checkout); if (!optional) { var jQueryEvents = []; try { jQueryEvents = $._data(checkout).events.click; $._data(checkout).events.click = []; } catch (err) { // console.log(err); } rterms.checkoutEvents.push(jQueryEvents); setTimeout(function () { // bndlr script is slow if (window.bndlr && !optional) { checkout.classList.add('bndlr-button-disabled'); } }, 1000); // add checkout event // check if bcpo event if (window.ZapietWidgetConfig) { window.customCheckoutValidation = rterms.checkout; setTimeout(function () { // to compete with other scripts window.customCheckoutValidation = rterms.checkout; }, 5000); } else { checkout.addEventListener('click', rterms.checkout); } } // check visibility - this caused problems // if (checkout.offsetWidth <= 0 && checkout.offsetHeight <= 0) return; // continue if (checkout.parentElement.closest('.cart--totals .cart--nav')) return; if (checkout.parentElement.querySelector('.terms-relentless')) return; // prevent duplicates if (rterms.settings.hide_in_drawer && checkout.closest('#cart-notification-form, sidebar-drawer')) return; var div = document.createElement('div'); div.className = 'terms-relentless'; div.innerHTML = '<input type="checkbox" id="rterms-' + (rterms.checkouts.length - 1) + '" class="rterms-checkbox" style="' + (!rterms._3lj2l && rterms.metafield.checkbox_color ? 'accent-color: ' + rterms.metafield.checkbox_color + ';' : '') + '"><label for="rterms-' + (rterms.checkouts.length - 1) + '">' + text + '</label>'; if (rterms.metafield.spacing_top) div.style.marginTop = rterms.metafield.spacing_top + 'px'; if (rterms.metafield.spacing_right) div.style.marginRight = rterms.metafield.spacing_right + 'px'; if (rterms.metafield.spacing_bottom) div.style.marginBottom = rterms.metafield.spacing_bottom + 'px'; if (rterms.metafield.spacing_left) div.style.marginLeft = rterms.metafield.spacing_left + 'px'; var anchor = checkout; if (checkout.previousElementSibling && checkout.previousElementSibling.previousElementSibling && checkout.previousElementSibling.previousElementSibling.previousElementSibling) { if (checkout.previousElementSibling.previousElementSibling.previousElementSibling.className === 'cart__shipping') { anchor = checkout.previousElementSibling.previousElementSibling; } } if (checkout.previousElementSibling && ((checkout.previousElementSibling.href && checkout.previousElementSibling.href.match(/\/cart$/)) || (checkout.previousElementSibling.name && checkout.previousElementSibling.name === 'update'))) { anchor = checkout.previousElementSibling; } if (checkout.parentElement.querySelector('input[value="Update Cart"]')) { anchor = checkout.parentElement.querySelector('input[value="Update Cart"]'); } if (!rterms.settings.ignore_cart_button && checkout.parentElement.parentElement.querySelector('[href="/cart"]')) { var link = checkout.parentElement.parentElement.querySelector('[href="/cart"]'); if (link.innerHTML) { anchor = link; } } var ancestor; if (ancestor = checkout.closest('[data-cart-drawer] .push-btn, .buy-buttons.buy-buttons--compact')) { anchor = ancestor; } if (anchor.parentElement.querySelector('.terms-relentless')) return; // prevent duplicates anchor.before(div); if ((!window.Shopify || !Shopify.theme || !Shopify.theme.name || Shopify.theme.name !== 'Blockshop') && !rterms.settings.disableLayoutFix) div.parentNode.style.display = 'block'; } function checkout(e) { // check for any checked checkbox var checked = false; document.querySelectorAll('.rterms-checkbox').forEach(function (checkbox) { if (checkbox.checked) { checked = true; } }); if (!checked) { // to do: make nicer alert. with custom message alert(rterms.metafield.alert_message || 'Please select the terms of service'); if (e && e.preventDefault) { e.preventDefault(); e.stopPropagation(); setTimeout(function() { if (!e.target) return; e.target.className = e.target.className.replace('btn--loading', ''); e.target.disabled = false; }, 100); } } }; function request(url, obj, res, rej) { if (!window.XMLHttpRequest) return rej('no xhr'); var request = new XMLHttpRequest(); // request.responseType = 'json'; request.onreadystatechange = function () { if (this.readyState == 4) { if (this.status == 200) { try { res(JSON.parse(this.response)); } catch (err) { if (rej) rej(err); } } else { if (rej) rej(this.status); } } }; request.open(obj.type, url, true); var contentType = (obj.headers && obj.headers['Content-Type']) || 'application/x-www-form-urlencoded'; request.setRequestHeader('Content-Type', contentType); var dataString = ''; if (contentType === 'application/x-www-form-urlencoded') { for (var prop in obj.body) { dataString += encodeURIComponent(prop) + '=' + encodeURIComponent(obj.body[prop]) + '&'; } dataString = dataString.slice(0, -1); } else { dataString = JSON.stringify(obj.body); } request.send(dataString); } // // pay-as-you-go plan // document.addEventListener('visibilitychange', function () { // if (document.visibilityState === 'hidden') { // navigator.sendBeacon('https://terms-relentless.herokuapp.com/used-check', {checked: true}); // } // }); }());