var personalizationSnippet = function() {
var defaultUrl = 'https://img.tech.us/i/{{image_hash}}.png';
var serviceUrl = 'https://app.hyperise.io/snippets/hp/fetch-data';
var settingsUrl = 'https://app.hyperise.io/snippets/hp/fetch-settings';
var availableParams = JSON.parse('["business_name","business_phone","business_address","website","fb_id","category","title","first_name","last_name","gender","job_title","phone","home_phone","email","employees_range","revenue","custom_text_1","custom_text_2","custom_text_3","custom_text_4","custom_text_5","logo","profile_image","profile_url","custom_image_1","custom_image_2","custom_image_3","country","state","city","street","street2","zip","lat","long","appstore_link","qr_url","qr_text"]');
availableParams.push('utm_hyperef');
availableParams.push('utm_campaign');
availableParams.push('utm_source');
availableParams.push('utm_medium');
availableParams.push('utm_term');
availableParams.push('utm_content');
var availableSegmentParams = ["utm_campaign", "utm_source", "utm_medium", "utm_term", "utm_content"];
var settingsPrepared = false;
var settings = {};
var accountHash = '1CPoNNCMq';
var paramId = 0;
var originalId = 0;
var dynamicData = {};
var dynamicDataApplied = {};
var appliedChanges = [];
var imageIdUsed = false;
var self = null;
var novUpdated = false;
var formEventAttempt = 0;
callAjax = function(url, data, callback) {
var xmlhttp;
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback(xmlhttp.response);
}
}
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(data));
}
fbPixelBlock = function() {
var pixelId = settings.pixelId || false;
if (!pixelId) {
return;
}
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', pixelId);
fbq('track', 'PageView');
fbq('track', 'ViewContent', {
content_ids: [originalId],
content_type: 'product'
});
document.body.insertAdjacentHTML('beforeend', '');
}
function getParams (url) {
var params = {};
var parser = document.createElement('a');
parser.href = url;
var query = parser.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (pair[0] && pair[1] && (availableParams.indexOf(pair[0]) >= 0 || pair[1].substring(0, 8) == 'https://' || pair[1].substring(0, 7) == 'http://')) {
params[pair[0]] = url.searchParams.get(pair[0]);
}
}
return params;
};
function getSegmentParams (url) {
var params = {};
var parser = document.createElement('a');
parser.href = url;
var query = parser.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (pair[0] && pair[1] && availableSegmentParams.indexOf(pair[0]) >= 0) {
params[pair[0]] = url.searchParams.get(pair[0]);
}
}
params.referrer = document.referrer;
var nov = getCookie('whr_nov');
params.number_of_visits = nov;
return params;
};
function setCookie(name,value,days,path) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=" + (path ? path : '/') + "; SameSite=None; Secure";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
document.cookie = name+'=; Max-Age=-99999999;';
}
function revertContextItem(item) {
if (item.type == 'Image') {
if (item.old_content) {
jQuery(item.selector).html(item.old_content);
} else if (jQuery(item.selector).attr(getImageSourceAttrName(item.selector)) == item.new_src) {
jQuery(item.selector).attr(getImageSourceAttrName(item.selector), item.old_src);
}
if (item.attributes) {
for (let i = 0; i < item.attributes.length; i++) {
jQuery(item.selector).attr(item.attributes[i].name, item.attributes[i].old);
}
}
} else if (item.type == 'Text') {
if (jQuery(item.selector).html() == item.new_content) {
jQuery(item.selector).html(item.old_content);
}
} else if (item.type == 'Input') {
if (jQuery(item.selector).val() == item.new_content) {
jQuery(item.selector).val(item.old_content);
}
} else if (item.type == 'Video') {
if (item.new_selector) {
jQuery(item.new_selector).replaceWith(item.old_image_html);
} else {
jQuery(item.selector).html(item.old_content);
}
}
}
function getImageSourceAttrName(selector) {
var objects = jQuery(selector);
if (objects.length == 0) {
return 'src';
}
var nodeName = objects[0].nodeName.toLowerCase();
if (nodeName == 'source') {
return 'srcset';
}
if (objects.length) {
if (jQuery(selector).attr('srcset')) {
return 'srcset'
} else if (jQuery(selector).attr('src')) {
return 'src';
}
}
return 'src';
}
function applyContextItem(item, serviceData) {
if (item.type == 'Image') {
if (serviceData.image_urls[item.image_template_id]) {
if (jQuery(item.selector).length > 0) {
if (item.old_content) {
appliedChanges.push({
type: item.type,
selector: item.selector,
old_content: jQuery(item.selector).html(),
new_src: serviceData.image_urls[item.image_template_id],
});
var html = '';
jQuery(item.selector).html(html);
} else {
appliedChanges.push({
type: item.type,
selector: item.selector,
old_src: item.old_image_url,
new_src: serviceData.image_urls[item.image_template_id]
});
var changedAttributes = [];
var srcAttrName = getImageSourceAttrName(item.selector);
jQuery(item.selector).attr(srcAttrName, serviceData.image_urls[item.image_template_id]);
if (jQuery(item.selector).attr('data-' + srcAttrName)) {
jQuery(item.selector).removeAttr('data-' + srcAttrName);
}
if (srcAttrName == 'src') {
let imgAttributes = jQuery(item.selector)[0].attributes;
for (let attrKey in imgAttributes) {
let attrName = imgAttributes[attrKey].name;
let attrValue = imgAttributes[attrKey].value;
if (typeof attrName == 'string' && attrName.indexOf('srcset') >= 0 && attrValue.length > 0) {
let srcsetParts = attrValue.split(',');
if (srcsetParts.length > 0) {
let newSet = [];
for (let ix = 0; ix < srcsetParts.length; ix++) {
let part = srcsetParts[ix].split(' ');
if (part.length > 1) {
newSet.push(serviceData.image_urls[item.image_template_id] + ' ' + part[part.length - 1]);
}
}
changedAttributes.push({
'name': attrName,
'old': jQuery(item.selector).attr(attrName)
})
jQuery(item.selector).attr(attrName, newSet.join(', '));
}
} else if (typeof attrName == 'string' && attrName.indexOf('-src') >= 0 && attrValue.length > 0) {
changedAttributes.push({
'name': attrName,
'old': jQuery(item.selector).attr(attrName)
})
jQuery(item.selector).attr(attrName, serviceData.image_urls[item.image_template_id]);
}
}
}
if (changedAttributes.length) {
appliedChanges[appliedChanges.length - 1].attributes = changedAttributes;
}
setTimeout(function() {jQuery(item.selector).attr(getImageSourceAttrName(item.selector), serviceData.image_urls[item.image_template_id]);}, 1000);
}
} else {
item.attempt = item.attempt ? item.attempt + 1 : 1;
if (item.attempt <= 5) {
setTimeout(applyContextItem, 1000 * item.attempt, item, serviceData);
}
}
if (settings.hasOwnProperty('imageId')
&& settings.imageId
&& serviceData.image_hashes[item.image_template_id] == settings.imageTemplate) {
appliedChanges.push({
type: item.type,
selector: '#' + settings.imageId,
old_src: jQuery('#' + settings.imageId).attr(getImageSourceAttrName('#' + settings.imageId)),
new_src: serviceData.image_urls[item.image_template_id]
});
jQuery('#' + settings.imageId).attr(getImageSourceAttrName('#' + settings.imageId), serviceData.image_urls[item.image_template_id]);
}
}
} else if (item.type == 'Video' && item.old_image_url) {
if (serviceData.video_urls[item.video_template_id]) {
if (jQuery(item.selector).length > 0) {
appliedChanges.push({
type: item.type,
selector: item.selector,
old_src: item.old_image_url,
new_src: serviceData.video_urls[item.video_template_id],
new_selector: '#hr_video_' + item.video_template_id,
old_image_html: jQuery('
').append(jQuery(item.selector).clone()).html(),
});
var html = '
';
jQuery(item.selector).replaceWith(html);
} else {
item.attempt = item.attempt ? item.attempt + 1 : 1;
if (item.attempt <= 5) {
setTimeout(applyContextItem, 1000 * item.attempt, item, serviceData);
}
}
}
}
else if (item.type == 'Video') {
if (serviceData.video_urls[item.video_template_id]) {
if (jQuery(item.selector).length > 0) {
appliedChanges.push({
type: item.type,
selector: item.selector,
old_content: jQuery(item.selector).html(),
new_src: serviceData.video_urls[item.video_template_id],
});
var html = '
';
jQuery(item.selector).html(html);
}
} else {
item.attempt = item.attempt ? item.attempt + 1 : 1;
if (item.attempt <= 5) {
setTimeout(applyContextItem, 1000 * item.attempt, item, serviceData);
}
}
}
else if (item.type == 'Text') {
if (jQuery(item.selector).length > 0) {
let newContent = prepareNewContent(item.new_content, serviceData.dynamic_data, serviceData.dynamic_data_applied);
if (newContent != item.new_content || newContent.indexOf('{') == -1) {
jQuery(item.selector).html(newContent);
} else {
newContent = item.old_content;
}
appliedChanges.push({
type: item.type,
selector: item.selector,
old_content: item.old_content,
new_content: newContent
});
} else {
item.attempt = item.attempt ? item.attempt + 1 : 1;
if (item.attempt <= 5) {
setTimeout(applyContextItem, 1000 * item.attempt, item, serviceData);
}
}
} else if (item.type == 'Input') {
let newContent = prepareNewContent(item.new_content, serviceData.dynamic_data, serviceData.dynamic_data_applied);
appliedChanges.push({
type: item.type,
selector: item.selector,
old_content: item.old_content,
new_content: newContent
});
jQuery(item.selector).val(newContent);
}
}
function prepareNewContent(newContent, dynamicData, dynamicDataApplied) {
for (key in dynamicData) {
if (dynamicDataApplied.hasOwnProperty(key) && dynamicDataApplied[key] == true) {
var macroField = "\{\{" + key + "\}\}";
newContent = newContent.replace(new RegExp(macroField, 'g'), dynamicData[key]);
}
}
return newContent;
}
imageBlock = function(url) {
var imageId = settings.imageId ? settings.imageId : 'hyperiseImage1';
document.getElementById(imageId).src = url;
return true;
}
function replaceMacroNodes(parent) {
if (parent.nodeType == 1 && parent.outerHTML.indexOf("\{\{") != -1) {
var oldValue = parent.outerHTML;
for (key in dynamicData) {
var macroField = "\{\{" + key + "\}\}";
oldValue = oldValue.replace(new RegExp(macroField, 'g'), dynamicData[key]);
}
if (parent.outerHtml != oldValue) {
parent.outerHTML = oldValue;
}
}
if (parent.nodeType == 3 && parent.nodeValue.indexOf("\{\{") != -1) {
for (key in dynamicData) {
var macroField = "\{\{" + key + "\}\}";
parent.nodeValue = parent.nodeValue.replace(new RegExp(macroField, 'g'), dynamicData[key]);
}
}
if (parent.childNodes.length == 0) {
return;
}
for (var i = 0; i < parent.childNodes.length; i++) {
replaceMacroNodes(parent.childNodes[i]);
}
}
function isExtensionActivated() {
var bodyClass = jQuery('body:first').attr('class');
if (!bodyClass) return false;
var classList = bodyClass.split(/\s+/);
if (classList && classList.includes('extension-active')) {
return true;
}
return false;
}
function serialize(obj) {
var items = [];
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
items.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
return items.join("&");
}
function serializeExt(obj) {
var items = [];
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
items.push(p + "=" + obj[p]);
}
}
return items.join("&");
}
function checkParamsIsEmpty(href) {
if (href.split('?').length == 1 || !href.split('?')[1].length) {
return true;
}
var url = new URL(href);
var isNotEmpty = false;
url.searchParams.forEach(function(value, key) {
if (value && availableParams.indexOf(key) >= 0) {
isNotEmpty = true;
return;
}
});
return !isNotEmpty;
}
function needReset(oldParams, newParams) {
if (newParams.utm_hyperef && newParams.utm_hyperef != oldParams.utm_hyperef) {
return true;
}
if (newParams.email && newParams.email != oldParams.email) {
return true;
}
if (newParams.email && oldParams.utm_hyperef && oldParams.utm_hyperef.indexOf('@') >= 0 && newParams.email != oldParams.utm_hyperef) {
return true;
}
if (oldParams.email && newParams.utm_hyperef && newParams.utm_hyperef.indexOf('@') >= 0 && oldParams.email != newParams.utm_hyperef) {
return true;
}
return false;
}
function run() {
var href = HR_getLocationHref();
var fromCookies = getCookie('wsp_qs');
if (!fromCookies) {
fromCookies = '';
}
if (checkParamsIsEmpty(href)) {
if (fromCookies) {
href = href.split('?')[0].split('#')[0] + '?' + fromCookies;
}
} else {
var fromCookiesParams = {};
if (fromCookies) {
var parts = fromCookies.split('&');
for (var i = 0; i < parts.length; i++) {
var pair = parts[i].split('=');
if (pair[0] && pair[1] && availableParams.indexOf(pair[0]) >= 0) {
fromCookiesParams[pair[0]] = pair[1];
}
}
}
var url = new URL(href);
var newParams = {};
url.searchParams.forEach(function(value, key) {
if (value && availableParams.indexOf(key) >= 0) {
newParams[key] = encodeURIComponent(value);
}
});
if (needReset(fromCookiesParams, newParams)) {
setCookie('wsp_qs', serializeExt(newParams), 365);
} else {
for(var key in newParams) {
fromCookiesParams[key] = newParams[key];
if (key == 'utm_hyperef' && newParams[key].indexOf('@') >= 0) {
if (fromCookiesParams.hasOwnProperty('email')) {
delete fromCookiesParams.email;
}
}
}
var queryString = serializeExt(fromCookiesParams);
setCookie('wsp_qs', queryString, 365);
href = href.split('?')[0].split('#')[0] + '?' + queryString;
}
}
process(href);
}
function runManually(fields) {
var href = HR_getLocationHref();
var fromCookies = getCookie('wsp_qs');
if (!fromCookies) {
fromCookies = '';
}
var fromCookiesParams = {};
if (fromCookies) {
var parts = fromCookies.split('&');
for (var i = 0; i < parts.length; i++) {
var pair = parts[i].split('=');
if (pair[0] && pair[1] && availableParams.indexOf(pair[0]) >= 0) {
fromCookiesParams[pair[0]] = pair[1];
}
}
}
var newParams = {}
for(var key in fields) {
if (fields[key] && availableParams.indexOf(key) >= 0) {
newParams[key] = encodeURIComponent(fields[key]);
}
}
if (needReset(fromCookiesParams, newParams)) {
var queryString = serializeExt(newParams);
setCookie('wsp_qs', queryString, 365);
href = href.split('?')[0].split('#')[0] + '?' + queryString;
} else {
for(var key in newParams) {
fromCookiesParams[key] = newParams[key];
if (key == 'email') {
if (fromCookiesParams.hasOwnProperty('utm_hyperef') && fromCookiesParams['utm_hyperef'].indexOf('@') >= 0) {
delete fromCookiesParams.utm_hyperef;
}
}
}
var queryString = serializeExt(fromCookiesParams);
setCookie('wsp_qs', queryString, 365);
href = href.split('?')[0].split('#')[0] + '?' + queryString;
}
process(href);
}
function process(href) {
console.log('HREF', href);
imageIdUsed = false;
var ipLookup = settings.hasOwnProperty('ipLookup') ? settings.ipLookup : false;
if (!ipLookup && checkParamsIsEmpty(href)) {
return;
}
var url = new URL(href);
originalId = url.searchParams.get("utm_hyperef") || '';
if (!originalId) {
originalId = url.searchParams.get("email") || '';
}
if (!originalId) {
originalId = url.searchParams.get("website") || '';
}
var data = {
id: originalId,
domain: url.host,
page: url.pathname,
account_hash: accountHash,
image_hash: settings.imageTemplate || '',
ip_lookup: ipLookup,
href: HR_getLocationHref(),
params: getParams(url),
segment_params: getSegmentParams(url)
}
callAjax(serviceUrl, data, function(response) {
if (isExtensionActivated()) {
return;
}
var serviceData = JSON.parse(response);
if (serviceData.href && serviceData.href.length > 0) {
setCookie('wsp_qs', serviceData.href, 365);
}
self.personalized = serviceData.dynamic_data;
if (serviceData.version == 1) {
imageBlock(serviceData.url);
if (serviceData.dynamic_data) {
dynamicData = serviceData.dynamic_data;
for (var i = 0; i < document.body.childNodes.length; i++) {
replaceMacroNodes(document.body.childNodes[i]);
}
if (settings.onComplete) {
settings.onComplete(self.personalized);
}
}
} else {
if (serviceData.status == 'success') {
if (settings.onComplete) {
settings.onComplete(self.personalized);
}
for (var contextIndex = 0; contextIndex < serviceData.context.length; contextIndex++) {
applyContextItem(serviceData.context[contextIndex], serviceData);
}
if (settings.hasOwnProperty('imageId')
&& settings.imageId
&& settings.hasOwnProperty('imageTemplate') && settings.imageTemplate) {
for (var index in serviceData.image_hashes) {
if (serviceData.image_hashes.hasOwnProperty(index) && serviceData.image_hashes[index] == settings.imageTemplate) {
appliedChanges.push({
type: 'Image',
selector: '#' + settings.imageId,
old_src: jQuery('#' + settings.imageId).attr(getImageSourceAttrName('#' + settings.imageId)),
new_src: serviceData.image_urls[index]
});
jQuery('#' + settings.imageId).attr(getImageSourceAttrName('#' + settings.imageId), serviceData.image_urls[index]);
}
}
}
if (serviceData.dynamic_data) {
dynamicData = serviceData.dynamic_data;
for (var i = 0; i < document.body.childNodes.length; i++) {
replaceMacroNodes(document.body.childNodes[i]);
}
}
}
}
if (serviceData.default_image_url) {
if (jQuery('#hyper-campaign-tracking-img').length == 0) {
jQuery('body').append('
');
}
jQuery('#hyper-campaign-tracking-img').attr('src', serviceData.default_image_url);
}
if (originalId) {
fbPixelBlock();
}
if (self.formSelector) {
if (document.querySelector(self.formSelector)) {
document.querySelector(self.formSelector).removeEventListener("submit", hyperiseFormSubmitListener);
}
hyperiseAttachFormSubmitEvent(self.formSelector, 5);
}
});
}
function innerInit(params) {
for (var prop in params) {
settings[prop] = params[prop];
}
if (isExtensionActivated()) {
return;
}
if (jQuery.fn.on) {
jQuery(document).on('mouseover', '.hyperise-extension-top', function() {
if (appliedChanges.length == 0) {
return;
}
for (var index = 0; index < appliedChanges.length; index++) {
revertContextItem(appliedChanges[index]);
}
appliedChanges = [];
});
}
let autoStart = settings.hasOwnProperty('autoStart') ? settings.autoStart : true;
if (autoStart) {
run();
}
}
function initNumberOfVisits() {
if (novUpdated) {
return;
}
var nov = getCookie('whr_nov');
if (!nov) {
nov = 0;
}
nov++;
var url = new URL(HR_getLocationHref());
setCookie('whr_nov', nov, 365, url.pathname);
novUpdated = true;
}
this.init = function(params) {
self = this;
if(!params) {
params = {}
}
initNumberOfVisits();
if (typeof jQuery == 'undefined') {
var script = document.createElement("SCRIPT");
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js';
script.type = 'text/javascript';
script.onload = function() {
prepareSettings(function() {
innerInit(params);
});
};
document.getElementsByTagName("head")[0].appendChild(script);
} else {
prepareSettings(function() {
innerInit(params);
});
}
}
this.personalize = function(params) {
self = this;
initNumberOfVisits();
if (typeof jQuery == 'undefined') {
var script = document.createElement("SCRIPT");
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js';
script.type = 'text/javascript';
script.onload = function() {
prepareSettings(function() {
runManually(params);
});
};
document.getElementsByTagName("head")[0].appendChild(script);
} else {
prepareSettings(function() {
runManually(params);
});
}
}
this.revert = function() {
for (var index = 0; index < appliedChanges.length; index++) {
revertContextItem(appliedChanges[index]);
}
console.log('REVERTED');
}
this.personalized = {};
this.formSelector = '';
this.formElements = [];
prepareSettings = function(callback) {
if (settingsPrepared) {
callback();
}
var url = new URL(HR_getLocationHref());
var data = {
domain: url.host,
page: url.protocol + '//' + url.host + url.pathname,
account_hash: accountHash
}
callAjax(settingsUrl, data, function(response) {
settings = JSON.parse(response);
settingsPrepared = true;
if (settings.form_selector) {
self.formSelector = settings.form_selector;
self.formElements = settings.form_elements;
hyperiseAttachFormSubmitEvent(self.formSelector);
} else {
self.formSelector = '';
self.formElements = [];
}
callback();
});
}
}
function hyperiseAttachFormSubmitEvent(selector, attempt) {
if (attempt <= 0) {
return;
}
if (document.querySelector(selector)) {
document.querySelector(selector).addEventListener("submit", hyperiseFormSubmitListener);
} else {
setTimeout(function() {
hyperiseAttachFormSubmitEvent(selector, attempt - 1)
}, 1000);
}
}
var hyperise = new personalizationSnippet();
function hyperiseFormSubmitListener(e) {
var fields = {};
for (var index = 0; index < hyperise.formElements.length; index++) {
fields[hyperise.formElements[index].tag] = document.querySelector(hyperise.formElements[index].path).value;
}
hyperise.personalize(fields);
}
function HR_getLocationHref() {
return window.location.href.replaceAll('%20&%20', '%20%26%20');
}