(function (w, d) {
w.tsUpdateMetaDescription = function () {
var existingTitle = document.querySelector('title').innerText;
document.querySelector('title').innerText = "***** Rating: 5.0 - 47 Reviews - " + existingTitle;
var existingDesc = document.querySelector('meta[name="description"]').getAttribute("content");
document.querySelector('meta[name="description"]').setAttribute("content", "***** Rating: 5.0 - 47 Reviews - " + existingDesc);
};
var timestamp = document.createElement("meta");
timestamp.setAttribute("name", "ts-timestamp");
timestamp.setAttribute("content", new Date().toLocaleString());
document.head.appendChild(timestamp);
var businessKey = "t1j94s50";
var locationKey = "ft60ji4y";
var tenantKey = "";
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var accessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbnRpdHlJZCI6ImZ0NjBqaTR5IiwiZXhwIjoxNzMxNTkwNzYxLCJpc3MiOiJUcnVzdGlzdCIsImF1ZCI6IldpZGdldHMifQ.-3jD0EayVh3-aUiLaR7NaXPdajpjo2kBN6HuMf_spVg";
function start(f) { /in/.test(document.readyState) ? setTimeout(start, 5, f) : f(); }
tsAddCssTag("https://wassets.trustist.com/assets/css/cleanslate.css");
tsAddCssTag("https://wassets.trustist.com/assets/css/header.css");
start(function () {
if (d.getElementById("ts-json") === null) {
var filter = Array.prototype.filter;
var els = d.querySelectorAll('h1,title,h2');
var productName = "Fortuna Wills & Estate Planning Wolverhampton";
var field = filter.call(els, function (node) {
return node.innerText != "";
})[0];
if (typeof field !== "undefined") {
productName = field.innerText;
}
var json = "[{\"@type\":\"Product\",\"@id\":\"{{url}}#trustist\",\"description\":null,\"logo\":\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\",\"image\":[\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\"],\"name\":\"{{productName}}\",\"alternateName\":null,\"hasMap\":null,\"geo\":null,\"telephone\":null,\"url\":\"{{url}}\",\"address\":null,\"branchOf\":null,\"openingHoursSpecification\":null,\"sameAs\":[\"https://www.trustist.com/local-reviews/Review-fortuna-wills-estate-planning-fortuna-wills-estate-planning-Reviews-28771.html\"],\"@context\":\"http://schema.org\",\"brand\":{\"@type\":\"Organization\",\"@id\":null,\"description\":null,\"logo\":\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\",\"image\":[\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\"],\"name\":\"Fortuna Wills \u0026 Estate Planning\",\"alternateName\":null,\"hasMap\":null,\"geo\":null,\"telephone\":null,\"url\":\"http://www.fortunawills.co.uk/\",\"address\":null,\"branchOf\":null,\"openingHoursSpecification\":null,\"sameAs\":null},\"aggregateRating\":{\"@type\":\"AggregateRating\",\"ratingValue\":5,\"bestRating\":5,\"worstRating\":1,\"reviewCount\":47},\"review\":{\"@type\":\"Review\",\"url\":\"https://www.trustist.com/local-reviews/Review-fortuna-wills-estate-planning-fortuna-wills-estate-planning-Reviews-28771.html\",\"author\":{\"@type\":\"Person\",\"name\":\"Emma-Jane Hamilton\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":null,\"addressLocality\":\"Wolverhampton\",\"addressRegion\":\"England\",\"postalCode\":null,\"addressCountry\":null}},\"datePublished\":\"2024-09-06T18:11:36.000Z\",\"headline\":\"\",\"isBasedOn\":null,\"reviewBody\":\"Amazing service with fantastic advice and guidance, thank you so much\",\"reviewRating\":{\"@type\":\"Rating\",\"ratingValue\":5,\"bestRating\":5,\"worstRating\":1},\"publisher\":{\"@type\":\"Organization\",\"name\":\"Trustist\",\"sameAs\":\"https://www.trustist.com\"},\"reply\":null,\"replyDate\":null,\"subject\":null},\"mpn\":\"{{url}}\",\"sku\":\"{{url}}\"},{\"@type\":\"LocalBusiness\",\"@id\":\"https://www.trustist.com/local-reviews/Review-fortuna-wills-estate-planning-fortuna-wills-estate-planning-Reviews-28771.html\",\"description\":null,\"logo\":\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\",\"image\":[\"https://content.trustist.com/brandlogos/865663c9-0c98-4869-9479-342b983c5e89.png\"],\"name\":\"Fortuna Wills \u0026 Estate Planning\",\"alternateName\":\"Fortuna Wills \u0026 Estate Planning Wolverhampton\",\"hasMap\":\"https://maps.google.com/?cid=734028290784580329\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":\"52.580940\",\"longitude\":\"-2.125879\"},\"telephone\":\"01902 240200\",\"url\":\"http://www.fortunawills.co.uk/\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"1a George St\",\"addressLocality\":\"Wolverhampton\",\"addressRegion\":\"England\",\"postalCode\":\"WV2 4DP\",\"addressCountry\":\"GB\"},\"branchOf\":{\"@type\":\"Organization\",\"name\":\"Fortuna Wills \u0026 Estate Planning\",\"sameAs\":\"http://www.fortunawills.co.uk/\"},\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"18:00:00\",\"dayOfWeek\":\"http://schema.org/Monday\",\"opens\":\"09:00:00\"},{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"18:00:00\",\"dayOfWeek\":\"http://schema.org/Tuesday\",\"opens\":\"08:30:00\"},{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"18:00:00\",\"dayOfWeek\":\"http://schema.org/Wednesday\",\"opens\":\"08:30:00\"},{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"18:00:00\",\"dayOfWeek\":\"http://schema.org/Thursday\",\"opens\":\"08:30:00\"},{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"18:00:00\",\"dayOfWeek\":\"http://schema.org/Friday\",\"opens\":\"08:30:00\"},{\"@type\":\"OpeningHoursSpecification\",\"closes\":\"13:00:00\",\"dayOfWeek\":\"http://schema.org/Saturday\",\"opens\":\"09:00:00\"}],\"sameAs\":[\"https://maps.google.com/?cid=734028290784580329\",\"https://www.facebook.com/107332914300305\"],\"@context\":\"http://schema.org\",\"aggregateRating\":null,\"review\":null,\"paymentAccepted\":null,\"makesOffer\":null}]";
var a = d;
var c = a.createElement("script");
c.type = 'application/ld+json';
c.id = 'ts-json';
c.innerText = json
.replace(new RegExp("{{url}}", 'g'), w.location.href)
.replace("{{productName}}", productName)
.replace("\"{{productDesc}}\"", JSON.stringify((d.body.innerText || d.body.textContent).replace(/[^ -~]+/g, "").substring(0, 200) + "..."));
a = a.getElementsByTagName("head")[0];
a.appendChild(c);
}
// iterate over all widgets on the page and render
var div = document.querySelector("[ts-headerWidget],div.ts-headerWidget");
if (div) {
tsDisplayWidget(div, businessKey, locationKey, tenantKey);
}
else {
}
});
function tsDisplayWidget(target) {
// get options before cleanslate
var options = tsReadAttributes(target);
// draw the main template
target.innerHTML = '
5.0 /5.0
Based on 47 Customer Reviews ';
// draw the dropdown
var dropdownDiv = d.createElement('div');
dropdownDiv.setAttribute("id", "ts-style");
dropdownDiv.setAttribute("class", "cleanslate");
dropdownDiv.innerHTML = ' ';
d.body.appendChild(dropdownDiv);
// draw the reviews
var xhr = new XMLHttpRequest();
var url = tsBuildUrl(options);
xhr.open("GET", url);
xhr.onload = function () {
if (xhr.status === 200 && xhr.responseText !== "") {
var reviews = JSON.parse(xhr.responseText);
tsDrawReviews(dropdownDiv, reviews, options);
tsWireUp(options);
} else {
}
};
xhr.send();
}
function tsBuildUrl(options) {
var url = "https://widget.trustist.com/reviewlistdata?v=1&accessToken=" + accessToken + "&pageNum=1&pageSize=" + options.pageSize;
if (typeof tenantKey !== "undefined" && tenantKey !== "") url += "&tenantKey=" + tenantKey;
if (typeof businessKey !== "undefined" && businessKey !== "") url += "&businessKey=" + businessKey;
if (typeof locationKey !== "undefined" && locationKey !== "") url += "&locationKey=" + locationKey;
if (options.ratingsAbove > 0) url += "&ratingFrom=" + options.ratingsAbove;
if (options.exclude > '') url += "&exclude=" + options.exclude;
return url;
}
function tsDrawReviews(target, reviews, options) {
var reviewContent = '';
var template = '
/5.0 ';
var textTemplate = ' ';
var replyTemplate = '';
reviews.forEach(function (review) {
var d = new Date(review.datePublished);
var reviewDate = d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
var thisReview = template
.replace('{{reviewSourceLogo}}', review.image)
.replace('', review.author.name)
.replace('', reviewDate)
.replace('', (review.reviewRating.ratingValue / 2).toFixed(1));
if (review.reviewBody > '') {
thisReview = thisReview.replace(
'',
textTemplate.replace('', review.reviewBody));
}
if (review.reply > '') {
var replyDate = new Date(review.replyDate);
var replyDateString = replyDate.getDate() + " " + months[replyDate.getMonth()] + " " + replyDate.getFullYear();
thisReview = thisReview.replace(
'',
replyTemplate
.replace('', review.reply)
.replace('', replyDateString));
}
reviewContent += thisReview;
});
target.innerHTML = target.innerHTML.replace('', reviewContent).replace('', reviews.length);
}
function tsReadAttributes(target) {
return {
pageSize: target.getAttribute("ts-page-size") || 20,
position: target.getAttribute("ts-position") || "absolute", // fixed or absolute
ratingsAbove: parseInt(target.getAttribute("ts-ratings-above")) || 0,
exclude: target.getAttribute("ts-exclude") || "",
};
}
function tsAddCssTag(url) {
var includedAlready = tsCheckIfIncluded(url);
var head = d.getElementsByTagName("head")[0];
if (!includedAlready) {
var tag = d.createElement("link");
tag.rel = "stylesheet";
tag.type = "text/css";
tag.href = url;
head.appendChild(tag);
}
}
function tsCheckIfIncluded(file) {
var links = d.getElementsByTagName("link");
for (var i = 0; i < links.length; i++) {
if (links[i].href?.substr(-file.length) === file)
return true;
}
var scripts = d.getElementsByTagName("script");
for (var j = 0; j < scripts.length; j++) {
if (scripts[j].src?.substr(-file.length) === file)
return true;
}
return false;
}
function tsSetStyle(element, value) {// Specific old IE
if (document.all) {
element.style.setAttribute('cssText', value);
} else {
element.setAttribute('style', value);
}
}
function tsAddEventToMany(controls, eventName, action) {
for (var i = 0; i < controls.length; i++) {
controls[i].addEventListener(eventName, action);
}
}
function tsSetArrowPosition(options) {
var TSDropArrow = d.getElementById('ts-top-arrow');
var TSDropArrowRect = TSDropArrow.getBoundingClientRect();
var TSHeaderRect = d.getElementById('ts-review-drop-trigger').getBoundingClientRect();
var TSStarsRect = d.getElementById('ts-stars').getBoundingClientRect();
var TSDropRect = d.getElementById('ts-review-dropdown').getBoundingClientRect();
var middle = TSStarsRect.left + (TSStarsRect.width / 2) - (TSDropArrowRect.width / 2);
if (options.position === 'fixed') {
tsSetStyle(TSDropArrow, 'left: ' + middle + 'px !important; top: ' + (TSHeaderRect.top + TSHeaderRect.height) + 'px !important;');
} else {
var arrowOffset = middle - TSDropRect.left;
tsSetStyle(TSDropArrow, 'left: ' + arrowOffset + 'px !important;');
}
}
var resizeTimer;
function tsSetDropDownDimensions(options) {
var screenWidth = w.innerWidth;
var TSDrop = d.getElementById('ts-review-dropdown');
var TSDropRect = TSDrop.getBoundingClientRect();
var TSHeaderRect = d.getElementById('ts-review-drop-trigger').getBoundingClientRect();
var TSDropArrowRect = d.getElementById('ts-top-arrow').getBoundingClientRect();
var TSStarsRect = d.getElementById('ts-stars').getBoundingClientRect();
var middle = TSStarsRect.left + (TSStarsRect.width / 2) - (TSDropArrowRect.width / 2);
var dropTop = 'top: ' + (TSHeaderRect.top + TSHeaderRect.height + TSDropArrowRect.height) + 'px !important;';
if (TSDropRect.width + 20 >= screenWidth) {
tsSetStyle(TSDrop, 'left: 0 !important; right: 0 !important; ' + dropTop);
} else if (middle <= (screenWidth / 3)) {
// console.log("init left side " + middle);
tsSetStyle(TSDrop, 'left: 20px !important; right: auto !important; ' + dropTop);
} else if (middle > (screenWidth / 3) && middle <= ((screenWidth / 3) * 2)) {
// console.log("init middle " + middle);
tsSetStyle(TSDrop, 'left: ' + ((screenWidth / 2) - (TSDropRect.width / 2)) + 'px !important; right: auto !important; ' + dropTop);
} else if (middle > ((screenWidth / 3) * 2)) {
// console.log("init right side " + middle);
tsSetStyle(TSDrop, 'left: auto !important; right: 20px !important; ' + dropTop);
}
clearTimeout(resizeTimer);
resizeTimer = setTimeout(tsSetArrowPosition, 250, options);
}
function tsWireUp(options) {
// var TSHeader = d.getElementById('ts-review-drop-trigger');
var TSDrop = d.getElementById('ts-review-dropdown');
var TSDropArrow = d.getElementById('ts-top-arrow');
// position the dynamic elements according to header type
var position = options.position === 'fixed' ? 'ts-fixed' : 'ts-absolute';
TSDrop.classList.add(position);
TSDropArrow.classList.add(position);
//// create a hidden element to allow the mouse to transition between the header and the dynamic areas
//var dummyDiv = d.createElement('div');
//dummyDiv.id = "ts-style";
//dummyDiv.classList.add("ts-review-drop");
//dummyDiv.classList.add("ts-fixed")
//dummyDiv.offsetLeft = TSHeader.offsetLeft;
//dummyDiv.offsetWidth = TSHeader.offsetWidth;
//dummyDiv.offsetTop = TSHeader.offsetTop + TSHeader.offsetHeight;
//dummyDiv.offsetHeight = TSDropArrow.offsetHeight;
//TSDrop.appendChild(dummyDiv);
// set initial dimensions left to right
tsSetDropDownDimensions(options);
// wire up events
var mouseAreas = d.querySelectorAll('.ts-review-drop');
tsAddEventToMany(mouseAreas, 'mouseover', function (e) {
TSDrop.classList.add('ts-drop-active');
setTimeout(function () {
TSDrop.classList.add('ts-can-close');
}, 600);
});
tsAddEventToMany(mouseAreas, 'mouseout', function (e) {
TSDrop.classList.remove('ts-drop-active');
TSDrop.classList.remove('ts-can-close');
});
d.getElementById('ts-mobile-close').addEventListener('click', function (e) {
TSDrop.classList.remove('ts-drop-active');
TSDrop.classList.remove('ts-can-close');
});
w.addEventListener('resize', function () { tsSetDropDownDimensions(options); });
}
})(window, document);