function form2Obj(f) {
var elemArray = f.elements;
var formObj = {};
for (k = 0; k < elemArray.length; k++) {
var input = elemArray[k];
if (!input || !input.name || !input.value) continue;
if (input.type === 'radio' && input.checked === true) {
formObj[input.name] = input.value;
} else if (input.type !== 'radio') {
formObj[input.name] = input.value;
}
}
return formObj;
}
(function (w, d) {
var widgetUrl = "https://widget.trustist.com";
var assetUrl = "https://wassets.trustist.com/assets";
var businessKey = "kee1qzfn";
var locationKey = "2kcyv0ov";
var tenantKey = "";
var template = '
';
var questionTemplate = '';
var questions = [
"", // 0
"", // 1 - name and email address
"", // 2 - comments
"", // 3
"", // 4
"", // 5 - overall star rating
"", // 6
"", // 7
"", // 8 - first name, last name, email, postcode
"", // 9
"" // 10 - first name, last name, email, phone
];
var completeTemplate = '{{thankYouText}}
';
function start(f) { /in/.test(d.readyState) ? setTimeout(start, 5, f) : f(); }
// add tags
tsAddCssTag("https://fonts.googleapis.com/css?family=Roboto");
tsAddCssTag(assetUrl + "/css/cleanslate.css");
tsAddCssTag(assetUrl + "/css/survey.css");
start(function () {
// iterate over all widgets on the page and render
var divs = d.querySelectorAll("[ts-reviewWidget],div.ts-reviewWidget");
if (divs.length === 0) {
return;
}
for (var i = 0; i < divs.length; i++) {
tsDisplayWidget(divs[i], businessKey, locationKey);
}
});
function tsDisplayWidget(target, businessKey, locationKey) {
// get options before cleanslate
var options = tsReadAttributes(target);
target.className = "cleanslate";
// see if the widget requested a different location
var lkey = options.locationKey || locationKey;
var bkey = options.businessKey || businessKey;
// put the container on the page
target.innerHTML = template
.replace("{{font-family}}", options.fontFamily)
.replace("{{color}}", options.color)
.replace(new RegExp("{{businesskey}}", "g"), bkey)
.replace(new RegExp("{{locationkey}}", "g"), lkey);
// IE6 and below will not work
// draw reviews
var xhr = new XMLHttpRequest();
var url = widgetUrl + "/surveydata?businessKey=" + bkey;
if (typeof lkey !== "undefined" && lkey !== "") url += "&locationKey=" + lkey;
xhr.open("GET", url);
xhr.onload = function () {
if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
tsDrawSurvey(target, options, response);
}
};
xhr.send();
if (options.completeUrl != null) {
// load url and replace content of completeTemplate
var xhrComplete = new XMLHttpRequest();
xhrComplete.open("GET", options.completeUrl);
xhrComplete.onload = function () {
if (xhrComplete.status === 200) {
completeTemplate = xhrComplete.responseText;
}
};
xhrComplete.send();
}
}
function tsDrawSurvey(target, options, response) {
var allQuestionsTemplate = "";
if (!response.questions) return;
for (var i = 0; i < response.questions.length; i++) {
var question = response.questions[i];
var currentTemplate = questions[question.type];
if (typeof currentTemplate !== "undefined") {
allQuestionsTemplate += questionTemplate.replace("", currentTemplate).replace("", question.value);
}
}
target.innerHTML = target.innerHTML
.replace("", allQuestionsTemplate)
.replace("{{submitText}}", response.submitText ?? "ADD REVIEW")
.replace(new RegExp("{{firstName}}", "g"), options.firstName)
.replace(new RegExp("{{lastName}}", "g"), options.lastName)
.replace(new RegExp("{{email}}", "g"), options.email);
// wire up the submit event
var btnSubmit = d.getElementById("tsSubmit");
btnSubmit.addEventListener("click", function (e) {
e.preventDefault();
e.stopPropagation();
this.disabled = true;
var inputs = this.form.querySelectorAll("[required]");
var valid = true;
for (var i = 0; i < inputs.length; i++) {
var input = inputs[i];
var val = input.value;
if (val === "") {
input.style.setProperty("border-color", "red", "important");
valid = false;
this.disabled = false;
}
}
if (valid) {
var json = form2Obj(this.form);
var data = { data: json };
var request = new XMLHttpRequest();
var url = widgetUrl + "/surveypost";
var async = true;
var method = "POST";
request.onload = function () {
target.innerHTML = completeTemplate
.replace("{{thankYouText}}", response.thankYouText ?? "Thank you for your review");
};
request.open(method, url, async);
request.setRequestHeader("Content-Type", "application/json");
request.send(JSON.stringify(data));
}
}, false);
}
function tsReadAttributes(target) {
return {
locationKey: target.getAttribute("ts-location"),
businessKey: target.getAttribute("ts-business"),
fontFamily: target.getAttribute("ts-font-family") || "Lato, Helvetica, sans-serif",
color: target.getAttribute("ts-color") || "#5a6a74",
firstName: target.getAttribute("ts-firstname") || "",
lastName: target.getAttribute("ts-lastname") || "",
email: target.getAttribute("ts-email") || "",
completeUrl: target.getAttribute("ts-completeurl") || null,
};
}
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 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);
}
}
})(window, document);