var ContactUsWidget = (function() {
var widgetWrapper = document.getElementById("contactUsWidgetContainer"); //reference to the wrapper element
var currentScript = document.getElementById("contactUsWidgetScript"); //reference to the embedding script
var needToRun = function() {
return (widgetWrapper != null && widgetWrapper.tagName == 'DIV' && currentScript != null);
};
if ( ! needToRun() ) {
return false;
}
var roleType;
var allowedRoleTypes = ["ads", "support"];
var sourceDomain; //the domain of the embedding site
var backendUrl; //%gotprofits host%/contact-us-form/send?...
var form; //reference to the form
var messageContainer; //reference to the message container
var recaptchaSiteKey;
var needTermsOfUse;
var siteName;
var widgetTemplate;
var init = function() {
backendUrl = currentScript.src.split('/')[0] + "//" + currentScript.src.split('/')[2] + "/contact-us-form/send?callback=ContactUsWidget.jsonpCallback"; //dev/prod gotprofits url
sourceDomain = window.location.hostname; //the domain of the embedding page
roleType = widgetWrapper.dataset.roleType;
recaptchaSiteKey = widgetWrapper.dataset.recaptchaKey;
needTermsOfUse = widgetWrapper.dataset.needTermsOfUse || false;
siteName = widgetWrapper.dataset.siteName;
widgetTemplate = buildTemplate();
if ( ! validateRoleType() || ! validateRecaptchaKey() ) {
return false;
}
return true;
};
var buildWidget = function() {
if ( ! needTermsOfUse ) {
termsOfUseTemplate = '';
}
widgetWrapper.innerHTML = widgetTemplate;
form = document.getElementById("contactUsFrom");
messageContainer = document.getElementById("contactUsMessage");
setFormRoleTypeField();
setFormSourceDomainField();
insertRecaptcaScript(); //insert a script tag into the recaptchaContainer to get recaptcha api.js
addRecaptcha();
form.onsubmit = onSubmit;
};
var buildTemplate = function() {
var termsOfUseTemplate = '';
if ( needTermsOfUse ) {
termsOfUseTemplate =
'
' +
'' +
'' +
'' +
'
';
}
var template =
'';
return template;
};
var addRecaptcha = function() {
recaptchaWrapper = document.getElementById("recaptchaContainer");
recaptchaWrapper.dataset.sitekey = recaptchaSiteKey;
};
var insertRecaptcaScript = function() {
var recaptchaScript = document.createElement('script');
recaptchaScript.setAttribute('src', "https://www.google.com/recaptcha/api.js");
document.getElementById("recaptchaContainer").parentNode.appendChild(recaptchaScript);
};
var onSubmit = function(e) {
e.preventDefault();
var isRecaptchaVerified = grecaptcha.getResponse().length;
if ( ! isRecaptchaVerified ) {
showMessage("Please confirm that you are not a robot!", false);
return false;
}
if ( ! validateEmailAddress(document.getElementById("contactUsEmailField").value)) {
showMessage("Invalid email address!", false);
return false;
}
if ( ! validateTermsOfUse(document.getElementById('termsOfUse')) ) {
showMessage("The terms and conditions must be accepted.", false);
return false;
}
document.getElementById("contactUsSubmitButton").disabled = true;
fetchJSONP();
};
var fetchJSONP = function() {
var script = document.createElement('script');
var formDataAsQueryString = serializeFormData();
script.setAttribute('src', backendUrl + "&" + formDataAsQueryString);
document.body.appendChild(script);
script.onload = function () {
this.parentNode.removeChild(this); //remove script tag after loaded
};
};
var setFormRoleTypeField = function() {
document.getElementById("contactUsRoleTypeField").value = roleType;
};
var setFormSourceDomainField = function() {
document.getElementById("contactUsSourceDomainField").value = sourceDomain;
};
var validateEmailAddress = function(email) {
var re = /\S+@\S+\.\S+/;
return re.test(email);
};
var validateRoleType = function() {
var isValid = true;
if ( ! roleType ) {
isValid = false;
console.warn("ContactUsWidget: role type parameter not found!");
} else if (allowedRoleTypes.indexOf(roleType) == -1) {
isValid = false;
console.warn("ContactUsWidget: invalid role type parameter: " + roleType);
}
return isValid;
};
var validateRecaptchaKey = function() {
return recaptchaSiteKey != null;
};
var validateTermsOfUse = function(termsOfUseValueElement) {
if ( ! needTermsOfUse ) {
return true;
}
return termsOfUseValueElement === null ? false : termsOfUseValueElement.checked;
};
var serializeFormData = function() {
var field, l, s = [];
if (typeof form == 'object' && form.nodeName == "FORM") {
var len = form.elements.length;
for (var i = 0; i < len; i++) {
field = form.elements[i];
if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
if (field.type == 'select-one') {
l = form.elements[i].options.length;
for (var j = 0; j < l; j++) {
if (field.options[j].selected)
s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].text);
}
} else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
}
}
}
}
return s.join('&').replace(/%20/g, '+');
};
var showMessage = function(msg, isSuccessMessage) {
var textNode = document.createTextNode(msg);
messageContainer.innerHTML = "";
messageContainer.appendChild(textNode);
if (isSuccessMessage) {
messageContainer.classList.remove("contact-us-message-container-error");
messageContainer.classList.add("contact-us-message-container-success");
messageContainer.classList.add("success-message");
} else {
messageContainer.classList.add("contact-us-message-container-error");
messageContainer.classList.remove("contact-us-message-container-success");
}
};
if (init()) {
buildWidget();
}
const resetForm = function () {
const inputs = document.querySelectorAll('#contactUsEmailField, #contactUsMessageField');
inputs.forEach(function (input) {
input.value = '';
});
}
return {
jsonpCallback: function(response) {
if (response.success) {
showMessage("Thank you! Your message has been sent successfully!", true);
resetForm()
grecaptcha.reset();
} else {
document.getElementById("contactUsSubmitButton").disabled = false;
showMessage(response.message, false);
grecaptcha.reset();
}
}
}
})();