(async () => {
'use strict';
const uuid = '66e386ba-b1a5-443e-8645-901fb272e97a';
const trustmateEndpoint = 'https://trustmate.io';
const instantReview = 1;
const widgets = JSON.parse('["ferret2", "lemur"]') || [];
widgets.push('owl');
const language = document.documentElement.lang;
const ignoredContexts = [
'basket', 'basket_address', 'basket_done', 'basket_finish', 'basket_finished', 'basket_step2', 'basket_step3','login',
'login_passremind', 'login_register', 'newsletter_unsign', 'product_loyaltylist', 'product_mailfriend',
'panel', 'panel_address', 'panel_addresses', 'panel_comments', 'panel_edit', 'panel_favourites',
'panel_order', 'panel_orders', 'panel_password', 'panel_payment'
];
const listContexts = ['index', 'product_list', 'product_new'];
const script = document.getElementById('tm-script');
if (!script) {
return;
}
const context = script.dataset.context;
const product = script.dataset.product;
const createUrl = (widget, product) => {
let url = new URL(`${trustmateEndpoint}/platforms/widget/${widget}/script/${uuid}`);
if (language) {
url.searchParams.append('language', language);
}
if (product) {
url.searchParams.append('product', product);
}
return url.toString();
};
const loadScript = (src) => {
const script = document.createElement('script');
script.src = src;
script.async = true;
document.body.appendChild(script);
}
const insertAfter = (newNode, referenceNode) => {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
const createWidget = (widget, product = null) => {
if(widgets.indexOf(widget) === -1) {
return;
}
const widgetDiv = document.createElement('div');
widgetDiv.id = `tm-widget-${widget}`;
if (['chupacabra2', 'ferret2', 'productFerret2'].indexOf(widget) !== -1) {
widgetDiv.classList.add('innermain');
widgetDiv.classList.add('container');
}
if (['hornet'].indexOf(widget) !== -1) {
widgetDiv.dataset['scrollToWidget'] = 'off';
}
insertAfter(widgetDiv, script);
const url = createUrl(widget, product);
loadScript(url);
}
if ('infopage' === context) {
const userChupacabra = document.getElementById('user_tm-widget-chupacabra') ?? document.getElementById('user_tm-widget-chupacabra2') ?? document.getElementById('tm-widget-chupacabra');
if (userChupacabra) {
userChupacabra.id = 'tm-widget-chupacabra2';
}
const infoChupacabra = document.getElementById('tm-widget-chupacabra2');
if (infoChupacabra && (document.querySelector('#tm-widget-chupacabra2+script')?.getAttribute('src')?.indexOf('chupacabra2') ?? -1) < 0) {
loadScript(createUrl('chupacabra2'));
}
}
if ('product' === context) {
createWidget('badger2', product);
createWidget('hornet', product);
if (widgets.indexOf('productFerret2') !== -1 || widgets.indexOf('hydra') !== -1 || widgets.indexOf('hornet') !== -1) {
const widgetHideBoxStyle = document.createElement('style');
const widgetHideBoxCss = '#box_trustmate, .box_trustmate {display: none !important;}';
widgetHideBoxStyle.id = 'box-trustmate-style';
widgetHideBoxStyle.appendChild(document.createTextNode(widgetHideBoxCss));
document.head.appendChild(widgetHideBoxStyle);
const widgetBoxStyle = document.createElement('style');
const widgetBoxCss = '#tm-widget-hornet {cursor: pointer;} body > #tm-widget-hornet {display: none;} .tm-hide-widget {display: none;}';
widgetBoxStyle.appendChild(document.createTextNode(widgetBoxCss));
document.head.appendChild(widgetBoxStyle);
const observerConfig = {childList: true};
const observer = new MutationObserver((mutationList, observer) => {
observer.disconnect();
const tmStyle = document.getElementById('box-trustmate-style');
const reviewCountElement = document.getElementById('trustmate-product-review-count');
const widgetCountElement = document.querySelector('.product-trustmate .tm-score-platforms');
if (reviewCountElement && widgetCountElement) {
const reviewsCountValue = widgetCountElement?.dataset.reviews || null;
if (reviewsCountValue && reviewsCountValue.length > 0) {
reviewCountElement.innerText = '('+reviewsCountValue+')';
}
}
if (tmStyle) {
tmStyle.remove();
}
});
const hornetObserver = new MutationObserver((mutationList, observer) => {
observer.disconnect();
moveHornet();
});
const createBox = () => {
const tmBox = document.createElement('div');
tmBox.setAttribute('id', 'box_trustmate');
tmBox.className = 'box tab row';
const lang = document.documentElement.lang;
const label = 'pl' === lang ? 'Opinie' : 'Reviews';
tmBox.innerHTML = '
'
+ label + '
';
const boxes = document.querySelectorAll(".product-modules > .box");
const keyNames = ['box_productrelated', 'box_productcomments'];
for (let i = boxes.length - 1; i >= 0; --i) {
const box = boxes[i];
if (box.hasAttribute('id') && keyNames.indexOf(box.getAttribute('id')) !== -1) {
box.parentNode.insertBefore(tmBox, box);
return true;
}
}
const mainBox = document.querySelector('.product-modules');
if (mainBox) {
mainBox.appendChild(tmBox);
return true;
}
const tabContainer = document.querySelector('.tab-container nav ul');
const tabBox = document.querySelector('.tab-container .product-tabs');
if (tabContainer && tabBox) {
const tabElement = document.createElement('li');
tabElement.className = 'box_trustmate';
tabElement.innerHTML = ''
+ label + '
';
const liList = tabContainer.querySelectorAll('li');
let tabInserted = false;
for (let i = liList.length - 1; i >= 0; --i) {
const box = liList[i];
if (keyNames.indexOf(box.className) !== -1) {
box.parentNode.insertBefore(tabElement, box);
tabInserted = true;
break;
}
}
if (!tabInserted) {
tabContainer.appendChild(tabElement);
}
const tabBoxElement = document.createElement('div');
tabBoxElement.className = 'product-tab none';
tabBoxElement.innerHTML = '';
tabBoxElement.dataset.tab = 'box_trustmate';
tabBox.appendChild(tabBoxElement);
tabElement.addEventListener('click', function (event) {
tabContainer.querySelectorAll('.boxhead.active').forEach((element) => element.classList.remove('active'));
tabElement.querySelector('.boxhead').classList.add('active');
tabBox.querySelectorAll('.product-tab').forEach((element) => element.classList.add('none'));
tabBoxElement.classList.remove('none');
});
return true;
}
return false
};
const moveHornet = () => {
const oldRating = document.querySelector('.evaluation');
const hornet = document.getElementById('tm-widget-hornet');
if (hornet) {
if (oldRating) {
oldRating.style.display = 'none';
oldRating.parentElement.insertBefore(hornet, oldRating);
oldRating.remove();
} else {
const moreProductDetails = document.querySelector('.productdetails-more') ?? document.querySelector('.productdetails-more-details');
if (moreProductDetails) {
moreProductDetails.insertBefore(hornet, moreProductDetails.firstChild);
} else {
const product_name = document.querySelector('.product-main-box .boxhead h1.name');
product_name?.parentNode.insertBefore(hornet, product_name?.nextSibling);
}
}
hornet.addEventListener('click', () => {
const tmStyle = document.getElementById('box-trustmate-style');
if (!tmStyle) {
document.querySelector('.box_trustmate')?.click();
setTimeout(() => {
const widget = document.querySelector('.product-trustmate');
let widgetPosition = widget?.getBoundingClientRect();
if (widgetPosition) {
window.scrollTo({top: widgetPosition.top + window.scrollY - 250, behavior: 'smooth'});
}
}, 100);
}
});
}
};
const moveAndObserveWidget = (id) => {
const widget = document.getElementById(id);
const tmBox = document.querySelector('.product-trustmate');
if (widget && tmBox) {
tmBox.appendChild(widget);
observer.observe(widget, observerConfig);
} else if (widget) {
widget.remove();
}
};
if (createBox()) {
createWidget('hydra', product);
createWidget('productFerret2', product);
moveAndObserveWidget('tm-widget-hydra');
moveAndObserveWidget('tm-widget-productFerret2');
}
const hornetWidget = document.getElementById('tm-widget-hornet');
if (hornetWidget) {
hornetObserver.observe(hornetWidget, observerConfig);
}
const hideWidgets = () => {
document.querySelectorAll('.tm-widget-to-hide').forEach(widget => {
widget.classList.add('tm-hide-widget');
});
};
const showWidgets = () => {
document.querySelectorAll('.tm-widget-to-hide').forEach(widget => {
widget.classList.remove('tm-hide-widget');
});
};
const galleryObserver = new MutationObserver((mutations_list) => {
mutations_list.forEach((mutation) => {
mutation.addedNodes.forEach((node) => {
if (node.classList && (node.classList.contains('js__gallery_new') || node.classList.contains('shop-gallery'))) {
hideWidgets();
}
});
mutation.removedNodes.forEach(node => {
if (node.classList && (node.classList.contains('js__gallery_new') || node.classList.contains('shop-gallery'))) {
showWidgets();
}
});
});
});
galleryObserver.observe(document.querySelector('body'), { subtree: false, childList: true });
}
}
if (listContexts.indexOf(context) !== -1 && widgets.indexOf('hornet') !== -1) {
const listHornetRatingsUrl = `${trustmateEndpoint}/platforms/${uuid}/product/ratings`;
const listHornetConfigUrl = `${trustmateEndpoint}/platforms/${uuid}/widget/hornet`;
const lastGoodProductStorageKey = 'tm-last-good-product';
const productDivs = document.querySelectorAll('.product[data-product-id]');
const idRawArray = [];
productDivs.forEach((element) => (idRawArray.push(element.dataset.productId)));
const lastGoodProduct = getLastGoodProductFromStorage();
if (lastGoodProduct) {
idRawArray.push(lastGoodProduct);
}
const idArray = idRawArray.filter((value, index, self) => {
return self.indexOf(value) === index;
});
idArray.sort((a, b) => a - b);
function getLastGoodProductFromStorage() {
return typeof(Storage) !== "undefined"
? parseInt(window.localStorage.getItem(lastGoodProductStorageKey), 10)
: null;
}
function setLastGoodProductToStorage(productId) {
if (typeof(Storage) !== "undefined") {
window.localStorage.setItem(lastGoodProductStorageKey, productId);
}
}
function hasParentClass(element, classname) {
if (element.classList.contains(classname)) {
return true;
}
try {
return element.parentNode && hasParentClass(element.parentNode, classname);
} catch(TypeError){
return false;
}
}
async function getProductsData() {
const url = new URL(listHornetRatingsUrl);
Object.keys(idArray).forEach((key) => url.searchParams.append('p[]', idArray[key]));
try {
const response = await fetch(`${url}`);
if (response.status !== 200) return null;
return await response.json();
} catch (error) {
return null;
}
}
async function getWidgetHtml(localId) {
try {
const response = await fetch(createUrl('hornet', localId)+'&disable-extra=1');
if (response.status !== 200) return null;
setLastGoodProductToStorage(localId);
const widget = await response.text();
const splitWidget = widget.split("document.getElementById('tm-widget-hornet').innerHTML = `")[1];
return splitWidget.split("`")[0]+'';
} catch (error) {
return null;
}
}
function getStarSrc(oldSrc, averageGrade) {
const src = oldSrc.substr(0, oldSrc.lastIndexOf('/'));
if (averageGrade >= 4.75) {
return (`${src}/5.png`);
}
else if (averageGrade >= 4.25) {
return (`${src}/4-5.png`);
}
else if (averageGrade >= 3.75) {
return (`${src}/4.png`);
}
else if (averageGrade >= 3.25) {
return (`${src}/3-5.png`);
}
else if (averageGrade >= 2.75) {
return (`${src}/3.png`);
}
else if (averageGrade >= 2.25) {
return (`${src}/2-5.png`);
}
else if (averageGrade >= 1.75) {
return (`${src}/2.png`);
}
else if (averageGrade >= 1.25) {
return (`${src}/1-5.png`);
}
else if (averageGrade >= 1) {
return (`${src}/1.png`);
}
else {
return (`${src}/0.png`);
}
}
async function insertHornets() {
const productsData = await getProductsData();
if (productsData === null) return null;
const firstItemWithReviews = productsData.items.find(({ reviewsCount }) => reviewsCount > 0);
if (!firstItemWithReviews) return null;
const html = await getWidgetHtml(firstItemWithReviews?.localId);
if (html === null) return null;
function findConfigValue(element, elementToFind) {
let valueIndex = element.search(elementToFind);
if (valueIndex === -1) return null;
return element.slice(valueIndex + elementToFind.length +1, valueIndex + elementToFind.length + 2) === '1' ? true : false;
}
const showWithoutReviews = findConfigValue(html, 'tmShowWithoutReviews=');
const show0ReviewsNumber = findConfigValue(html, 'tmShowZeroReviewsNumber=');
const showOnMobile = findConfigValue(html, 'tmShowOnMobile=');
if (showWithoutReviews === null || show0ReviewsNumber === null || showOnMobile === null) return;
const style = document.createElement('style');
style.innerHTML = `.hornet-style { display: flex; justify-content: flex-start; } @media (max-width: 767px) { .hornet-style { justify-content: flex-end; } .hide-on-mobile { display: none !important; } }`;
document.getElementsByTagName('head')[0].appendChild(style);
let firstProduct = true;
productDivs.forEach((element) => {
const productData = productsData.items.find(({ localId }) => localId === element.dataset.productId);
const widgetDiv = document.createElement('div');
widgetDiv.innerHTML = html;
let averageGrade = productData?.averageGrade ?? 0;
let reviewsCount = productData?.reviewsCount ?? 0;
if (!showWithoutReviews && 0 === reviewsCount) {
widgetDiv.style.visibility = 'hidden';
}
let averageGradeText = reviewsCount ? averageGrade.toFixed(1) : '';
if ('script' === widgetDiv.children[0].tagName.toLowerCase()) {
widgetDiv.children[0].remove();
}
if (!firstProduct && 'link' === widgetDiv.children[0].tagName.toLowerCase()) {
widgetDiv.children[0].remove();
}
firstProduct = false;
const blockViewType = !hasParentClass(element, 'viewfull');
if (blockViewType) {
element.querySelector('.prodname, .productnamewrap')?.after(widgetDiv);
} else {
let widgetHook = element.querySelector('.basket');
if (widgetHook) {
widgetHook?.parentNode.insertBefore(widgetDiv, widgetHook);
} else {
widgetHook = element.querySelector('.deliv') ?? element.querySelector('.avail')
widgetHook.parentNode.insertBefore(widgetDiv, widgetHook.nextSibling);
}
}
if (blockViewType) {
widgetDiv.style.display = 'flex';
widgetDiv.style.justifyContent = 'center';
widgetDiv.style.paddingTop = '0.8em';
widgetDiv.style.height = '2em';
let styleHook = element.querySelector('.prodname');
if (styleHook) {
styleHook.style.marginBottom = '0';
}
styleHook = element.querySelector('.img-wrap');
if (styleHook) {
styleHook.style.minHeight = '200px';
}
} else {
widgetDiv.className = 'hornet-style';
widgetDiv.style.paddingTop = '0.8em';
widgetDiv.style.paddingBottom = '0.8em';
}
if (!showOnMobile) {
widgetDiv.classList.add('hide-on-mobile');
}
const { title } = widgetDiv.getElementsByClassName('tm-hornet-wrapper')[0];
const lastIndex = title.lastIndexOf(' ');
if (lastIndex > 0) {
widgetDiv.getElementsByClassName('tm-hornet-wrapper')[0].title = `${title.substr(0, lastIndex)} ${reviewsCount}`;
} else {
averageGradeText = `${averageGradeText}` + ((show0ReviewsNumber && 0 === reviewsCount) || reviewsCount ? `(${reviewsCount})` : '');
}
widgetDiv.getElementsByClassName('tm-grade-label__text')[0].innerHTML = averageGradeText;
const stars = widgetDiv.getElementsByClassName('tm-grade-label__stars')[0].children[0];
stars.src = getStarSrc(stars.src, averageGrade);
});
}
insertHornets();
}
if (ignoredContexts.indexOf(context) === -1) {
createWidget('muskrat2');
createWidget('alpaca');
createWidget('lemur');
createWidget('owl2');
if (['product', 'infopage'].indexOf(context) === -1) {
createWidget('chupacabra2');
createWidget('ferret2');
}
if ('product_list' === context) {
createWidget('productFerret2');
}
const owlStyle = document.createElement('style');
const owlCss = '.tm-owl-container [class*="grid"] {float: none;}';
owlStyle.appendChild(document.createTextNode(owlCss));
document.head.appendChild(owlStyle);
const footerBottom = document.querySelector('.bottom-footer.row');
const ferret = document.getElementById("tm-widget-ferret2");
const productFerret = document.getElementById("tm-widget-productFerret2");
if ('infopage' !== context) {
const chupacabra = document.getElementById("tm-widget-chupacabra2");
if (chupacabra) {
footerBottom.parentNode.insertBefore(chupacabra, footerBottom);
}
}
if (productFerret && 'product' !== context) {
footerBottom.parentNode.insertBefore(productFerret, footerBottom);
}
if (ferret) {
footerBottom.parentNode.insertBefore(ferret, footerBottom);
}
document.addEventListener("DOMContentLoaded", function(){
const footer = document.getElementById('shoper-foot');
const owl = document.getElementById("tm-widget-owl2");
if (owl && footer) {
const tmFooter = document.createElement('div');
tmFooter.setAttribute('id', 'trustmate-foot');
footer.parentNode.insertBefore(tmFooter, footer);
tmFooter.appendChild(owl);
}
});
}
if ('basket_done' === context && instantReview) {
const payment = window.TRUST_MATE_ORDER_PAYMENT || null;
if (payment && ['pobranie', 'gotówka', 'za pobraniem'].indexOf(payment.toLowerCase()) >= 0) {
loadScript(trustmateEndpoint + '/api/invitation/script');
} else {
const data = {
name: window.TRUST_MATE_USER_NAME || null,
email: window.TRUST_MATE_USER_EMAIL || null,
orderNumber: window.TRUST_MATE_ORDER_NUMBER || null,
uuid: window.TRUST_MATE_COMPANY_UUID || null,
};
if (data.name && data.email && data.orderNumber && data.uuid) {
sessionStorage.setItem(`tm_order_${data.orderNumber}`, JSON.stringify(data));
}
}
}
if ('basket_finished' === context && instantReview) {
const orderNumber = (window.location.pathname.match(/orderid\/([0-9]+)/) || [])[1] || null;
if (orderNumber) {
const rawData = sessionStorage.getItem(`tm_order_${orderNumber}`);
if (rawData) {
const data = JSON.parse(rawData);
window.TRUST_MATE_USER_NAME = data?.name;
window.TRUST_MATE_USER_EMAIL = data?.email;
window.TRUST_MATE_ORDER_NUMBER = data?.orderNumber;
window.TRUST_MATE_COMPANY_UUID = data?.uuid;
}
loadScript(trustmateEndpoint + '/api/invitation/script');
}
}
})();