How to Use Brush On Block®
Skip to content
Brush On Block® Mineral Powder Brushes
Using your Brush On Block Mineral Powder Brush is easy! Read our tips on how to get the best coverage, and learn how to keep the powder flowing with our easy-to-use, environmentally-friendly refills.
BOB KIDS™ Brush
Applying sunscreen to your wiggly kiddo has never been easier. We’ve got guidance on how to maximize coverage, how to know when the brush is working, and how often to reapply.
const version = "3.5";
const makeTableMap = require('makeTableMap');
const createArgumentsQueue = require('createArgumentsQueue');
const injectScript = require('injectScript');
const log = require('logToConsole');
const copyFromWindow = require('copyFromWindow');
const makeString = require('makeString');
const makeInteger = require('makeInteger');
const getUrl = require('getUrl');
const eventSourceUrl = getUrl();
if (eventSourceUrl.indexOf('gtm-msr.appspot.com') !== -1) {
log("Ignoring events sent by gtm msr: " + eventSourceUrl);
return data.gtmOnSuccess();
}
// Helper methods
const mergeObj = (obj, obj2) => {
for (let key in obj2) {
if (obj2.hasOwnProperty(key)) {
obj[key] = obj2[key];
}
}
return obj;
};
const fail = msg => {
log(msg);
data.gtmOnFailure();
};
// Field processing
const tagIds = data.tagIds.map(item => item.TagIds).filter( item => item );
if (tagIds.length === 0) {
return fail("No Amazon Ad Tag IDs configured");
}
let eventName = data.standardEventName;
if (data.eventName === "custom") {
eventName = data.customEventName;
}
if (!eventName) {
return fail("Event Name is not defined");
}
const region = data.tagRegion;
let attributes = {};
if (eventName === "Off-AmazonPurchases") {
attributes = data.offAmazonPurchaseAttributes ? makeTableMap(data.offAmazonPurchaseAttributes, 'Attribute', 'value') : {};
} else {
attributes = data.defaultAttributes ? makeTableMap(data.defaultAttributes, 'Attribute', 'value') : {};
}
const customAttributes = data.customAttributes ? makeTableMap(data.customAttributes, 'Attribute', 'value') : {};
const finalAttributes = mergeObj(attributes, customAttributes);
finalAttributes.gtmVersion = version;
for (const key in finalAttributes) {
if (!key) {
return fail("Attribute is not defined - " + key);
}
}
const gdprAatTokenAttributes = {};
const gdprEventAttributes = {};
let ttl = null;
if (data.includeTcf) {
const possibleGDPRvalues = [0, 1, 2];
if (possibleGDPRvalues.indexOf(data.gdpr) >= 0) {
gdprAatTokenAttributes.gdpr = data.gdpr;
gdprEventAttributes.gdpr = data.gdpr;
}
const possibleGDPRPDvalues = [-1, 0, 1];
if (possibleGDPRPDvalues.indexOf(data.gdprPd) >= 0) {
gdprEventAttributes.gdpr_pd = data.gdprPd;
}
if (data.gdprConsent) {
gdprAatTokenAttributes.gdprConsent = data.gdprConsent;
gdprEventAttributes.gdpr_consent = data.gdprConsent;
}
}
const tokenConfig = {
email: '',
phonenumber: '',
gdpr: { enabled: false, consent: '',},
ttl: 9600,
};
if (data.advancedMatchingList) {
let ttl = null;
if (data.ttl !== undefined && makeInteger(data.ttl) >= 0) ttl = makeInteger(data.ttl);
data.advancedMatchingList.forEach((e) => {
if (!e.paramName || !e.paramValue) {
return;
}
const paramVal = makeString(e.paramValue);
if (e.paramName === "email" && paramVal.length > 0) {
// if token config email is already set, we don't want to
tokenConfig.email = paramVal;
}
if (e.paramName === "phone" && paramVal.length > 0) {
tokenConfig.phonenumber = paramVal;
}
});
if (gdprAatTokenAttributes.gdpr) {
tokenConfig.gdpr.enabled = !!gdprAatTokenAttributes.gdpr;
}
if (gdprAatTokenAttributes.gdprConsent) {
tokenConfig.gdpr.consent = gdprAatTokenAttributes.gdprConsent;
}
if (tokenConfig.gdpr.enabled && !tokenConfig.gdpr.consent) {
return fail("GDPR consent string must be set if GDPR enabled");
}
if (ttl) {
tokenConfig.ttl = ttl;
}
log("token config =", tokenConfig);
}
// Define amzn fn in window
const getAmzn = () => {
const amzn = copyFromWindow('amzn');
if (amzn && !amzn.q) return amzn;
// Until the full library is loaded we allow calling amzn by queuing all
// calls to it. This queue is then processed when the library is loaded.
const amznq = createArgumentsQueue('amzn', 'amzn.q');
const overrideAmznFn = (a, b, c, d) => amznq([a, b, c, d]);
return overrideAmznFn;
};
// track events once amznjs script is loaded
const trackEvents = () => {
const amzn = getAmzn();
if (!amzn) {
return fail("Amazon Ad Tag not defined in browser window");
}
if (data.advancedMatchingList && ((tokenConfig.email !== '') || (tokenConfig.phonenumber !== ''))) {
amzn('setUserData', tokenConfig);
}
amzn('setRegion', region);
tagIds.forEach(item => amzn("addTag", item));
amzn('addtcfv2', gdprEventAttributes);
amzn('trackEvent', eventName, finalAttributes);
};
trackEvents();
injectScript('https://c.amazon-adsystem.com/aat/amzn.js', data.gtmOnSuccess, data.gtmOnFailure, 'amznScript');