When searching for a local tree service, Haltom City has many options. Who can you count on for affordable tree care when you need them most? Haltom City Tree Service provides the best in lawn care service and tree maintenance services. No matter which species you have growing in your yards, we keep them growing better.
From weekly upkeep to tree & shrub removal, we offer superior service contractors. You can find us improving properties throughout Haltom City, TX, every day. Have you recently felled a tree from your yard on your own? Hire us for convenient stump grinding and hauling services, also.
Whatever you ask of our service team, we guarantee the best results possible. Contact us at Haltom City Tree Service today at 817-809-3231.
Schedule your free estimate today!
Haltom City Tree Service
★★★★★Rated 5 out of 5
Haltom City Tree Service Haltom City, TX 817-809-3231
.elementor-form .elementor-message-danger,
.elementor-form .elementor-message-danger:before,
.elementor-form .elementor-message,
.elementor-form .elementor-error,
.elementor-form .elementor-field-error {
display: none !important;
}
(function () {
var VALIDATION_WORKER_URL =
window.FORM_VALIDATION_WORKER_URL ||
'https://form-validation-worker.michael-215.workers.dev/';
function removeElementorErrors(form) {
form.querySelectorAll(
'.elementor-message-danger,' +
'.elementor-message,' +
'.elementor-error,' +
'.elementor-field-error'
).forEach(function (el) {
el.remove();
});
}
function finishSubmission(form, submitBtn, originalText) {
removeElementorErrors(form);
// Static site: CallRail captures the lead
if (window.CallTrk && typeof CallTrk.captureForm === 'function') {
CallTrk.captureForm(form);
alert('Thank you! Your request has been submitted successfully.');
form.reset();
submitBtn.disabled = false;
submitBtn.textContent = originalText;
return;
}
// Live WordPress: pass through to Elementor AJAX after validation
form.dataset.validationPassed = 'true';
submitBtn.disabled = false;
submitBtn.textContent = originalText;
alert('Thank you! Your request has been submitted successfully.');
setTimeout(function () {
submitBtn.click();
}, 300);
}
function initFormValidation(form) {
if (form.dataset.validationInitialized === 'true') return;
var submitBtn = form.querySelector('button[type="submit"]');
var firstName = form.querySelector('[name="form_fields[ct_fName]"]');
var lastName = form.querySelector('[name="form_fields[ct_lName]"]');
var phoneField = form.querySelector('[name="form_fields[ct_pNumber]"]');
var emailField = form.querySelector('[name="form_fields[ct_email]"]');
var zipField = form.querySelector('[name="form_fields[ct_zCode]"]');
if (!submitBtn || !firstName || !lastName || !phoneField || !emailField || !zipField) {
return;
}
form.dataset.validationInitialized = 'true';
form.setAttribute('novalidate', 'novalidate');
phoneField.setAttribute('type', 'text');
emailField.setAttribute('type', 'text');
var observer = new MutationObserver(function () {
removeElementorErrors(form);
});
observer.observe(form, { childList: true, subtree: true });
submitBtn.addEventListener(
'click',
async function (e) {
if (form.dataset.validationPassed === 'true') {
form.dataset.validationPassed = '';
return;
}
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
removeElementorErrors(form);
var fName = firstName.value.trim();
var lName = lastName.value.trim();
var phone = phoneField.value.trim();
var email = emailField.value.trim();
var zip = zipField.value.trim();
var cleanPhone = phone.replace(/D/g, '');
var nameRegex = /^[A-Za-zs'-]{2,30}$/;
var emailRegex = /^S+@S+.S+$/;
var zipRegex = /^d{5}(-d{4})?$/;
if (!nameRegex.test(fName)) {
alert('Enter a valid first name.');
firstName.focus();
return;
}
if (!nameRegex.test(lName)) {
alert('Enter a valid last name.');
lastName.focus();
return;
}
if (cleanPhone.length !== 10) {
alert('Enter a valid 10-digit phone number.');
phoneField.focus();
return;
}
if (!emailRegex.test(email)) {
alert('Enter a valid email address.');
emailField.focus();
return;
}
if (!zipRegex.test(zip)) {
alert('Enter a valid ZIP code.');
zipField.focus();
return;
}
submitBtn.disabled = true;
var originalText = submitBtn.textContent;
submitBtn.textContent = 'Submitting...';
try {
var response = await fetch(VALIDATION_WORKER_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
firstName: fName,
lastName: lName,
phone: cleanPhone,
email: email,
zip: zip
})
});
var data = await response.json();
if (!data.success) {
alert(data.message || 'Submission blocked. Please check your details.');
submitBtn.disabled = false;
submitBtn.textContent = originalText;
return;
}
finishSubmission(form, submitBtn, originalText);
} catch (error) {
console.error('Worker validation failed:', error);
alert('Something went wrong. Please try again.');
submitBtn.disabled = false;
submitBtn.textContent = originalText;
}
},
true
);
removeElementorErrors(form);
console.log('Form validation ready:', form.getAttribute('name') || 'elementor-form');
}
function boot() {
document.querySelectorAll('.elementor-form').forEach(initFormValidation);
}
document.addEventListener('DOMContentLoaded', function () {
boot();
setTimeout(boot, 500);
setTimeout(boot, 2000);
if (typeof MutationObserver !== 'undefined') {
var mo = new MutationObserver(boot);
mo.observe(document.body, { childList: true, subtree: true });
}
});
})();