Skip to content
Book Now
Call 682-276-5355
Home
Residential
Driveway Cleaning
House Washing
Patio Cleaning
Pool Deck Cleaning
Roof Cleaning
Window Cleaning
Commercial
Awning Cleaning
Commercial Pressure Washing
Commercial Roof Cleaning
Drive Thru Cleaning
Dumpster Pad Cleaning
Flat Work Cleaning
Oil Stain Removal
Restaurant Cleaning
Restoration Cleaning
Service Area
About
Blog
Giving Back
Careers
Pressure Washing Maintenance Plans
Specials
Contact Us
Home
Residential
Driveway Cleaning
House Washing
Patio Cleaning
Pool Deck Cleaning
Roof Cleaning
Window Cleaning
Commercial
Awning Cleaning
Commercial Pressure Washing
Commercial Roof Cleaning
Drive Thru Cleaning
Dumpster Pad Cleaning
Flat Work Cleaning
Oil Stain Removal
Restaurant Cleaning
Restoration Cleaning
Service Area
About
Blog
Giving Back
Careers
Pressure Washing Maintenance Plans
Specials
Contact Us
Book Now
Call 682-276-5355
Home
Residential
Driveway Cleaning
House Washing
Patio Cleaning
Pool Deck Cleaning
Roof Cleaning
Window Cleaning
Commercial
Awning Cleaning
Commercial Pressure Washing
Commercial Roof Cleaning
Drive Thru Cleaning
Dumpster Pad Cleaning
Flat Work Cleaning
Oil Stain Removal
Restaurant Cleaning
Restoration Cleaning
Service Area
About
Blog
Giving Back
Careers
Pressure Washing Maintenance Plans
Specials
Contact Us
Contact DSH Pressure Washing Fort Worth | Free Quote
State-of-the-Art Equipment
Guaranteed Satisfaction
Precision & Care
Convenient Scheduling
State-of-the-Art Equipment
Guaranteed Satisfaction
Precision & Care
Convenient Scheduling
Book Now
Call 682-276-5355
Contact Us
First Name
Last Name
Phone Number
Email Address
Message
By submitting this form and signing up for texts, you consent to receive text messages from
DSH Pressure Washing and Roof Cleaning
at the number provided, including messages sent by the auto dialer. Consent is not a condition of purchase. Msg & data rates may apply. Msg frequency varies. Unsubscribe at any time by replying STOP to
682-276-5355
or clicking the unsubscribe link (where available), and no further messages will be sent. Reply HELP for help. See
Privacy Policy
&
Terms
Send
Get in Touch
Address
11604 Twining Branch Circle, Haslet, TX 76052
Phone Number
682-276-5355
Business Hours
24/7 Emergency
Facebook
Linkedin
Pinterest
Yelp
Contact Us
First Name
Last Name
Phone Number
Email Address
Message
By submitting this form and signing up for texts, you consent to receive text messages from
DSH Pressure Washing & Roof Cleaning
at the number provided, including messages sent by the auto dialer. Consent is not a condition of purchase. Msg & data rates may apply. Msg frequency varies. Unsubscribe at any time by replying STOP to
682-276-5355
or clicking the unsubscribe link (where available), and no further messages will be sent. Reply HELP for help. See
Privacy Policy
&
Terms
Send
(function() { 'use strict'; console.log('🔍 Address Autocomplete Script Loading...'); const GOOGLE_API_KEY = 'AIzaSyD347GlhDTwEY2ehrK5iVzZJF0iBeBO8mw'; function loadGooglePlacesAPI() { console.log('📍 Loading Google Places API...'); if (window.google && window.google.maps) { console.log('✅ Google Maps already loaded'); initAutocomplete(); return; } const script = document.createElement('script'); script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_API_KEY}&libraries=places`; script.async = true; script.defer = true; script.onload = () => { console.log('✅ Google Places API loaded successfully'); initAutocomplete(); }; script.onerror = () => { console.error('❌ Failed to load Google Places API'); }; document.head.appendChild(script); console.log('📡 Google Places API script added to page'); } function initAutocomplete() { console.log('🔍 Looking for address input field...'); let attempts = 0; const checkForm = setInterval(() => { attempts++; console.log(`🔍 Attempt ${attempts}: Searching for address field...`); // Try multiple selectors const selectors = [ 'input[placeholder*="address" i]', 'input[name*="address" i]', 'input[placeholder*="Property Address"]', 'input[name*="Property Address"]', '.elementor-field-type-text input' ]; let addressInput = null; for (const selector of selectors) { addressInput = document.querySelector(selector); if (addressInput) { console.log(`✅ Found address field using selector: ${selector}`, addressInput); break; } } if (addressInput) { clearInterval(checkForm); console.log('✅ Address input found!', addressInput); setupAutocomplete(addressInput); } else if (attempts >= 20) { clearInterval(checkForm); console.error('❌ Could not find address input field after 20 attempts'); console.log('Available inputs:', document.querySelectorAll('input')); } }, 500); } function setupAutocomplete(input) { console.log('🎯 Setting up autocomplete on:', input); try { const options = { types: ['address'], componentRestrictions: { country: 'us' }, fields: ['address_components', 'formatted_address', 'geometry'] }; const autocomplete = new google.maps.places.Autocomplete(input, options); console.log('✅ Autocomplete instance created'); autocomplete.addListener('place_changed', () => { console.log('📍 Place changed event fired'); const place = autocomplete.getPlace(); console.log('Selected place:', place); if (!place.geometry) { console.log('⚠️ No geometry available for:', place.name); return; } const addressData = parseAddressComponents(place.address_components); console.log('Parsed address data:', addressData); input.value = `${addressData.streetNumber} ${addressData.street}, ${addressData.city} ${addressData.state}, ${addressData.zip}`; fillOtherFields(addressData); input.dispatchEvent(new Event('change', { bubbles: true })); console.log('✅ Address filled:', input.value); }); console.log('🎉 Google Places Autocomplete fully initialized!'); } catch (error) { console.error('❌ Error setting up autocomplete:', error); } } function parseAddressComponents(components) { const data = { streetNumber: '', street: '', city: '', state: '', zip: '' }; components.forEach(component => { const types = component.types; if (types.includes('street_number')) data.streetNumber = component.long_name; if (types.includes('route')) data.street = component.long_name; if (types.includes('locality')) data.city = component.long_name; if (types.includes('administrative_area_level_1')) data.state = component.short_name; if (types.includes('postal_code')) data.zip = component.long_name; }); return data; } function fillOtherFields(addressData) { const cityField = document.querySelector('select[name*="city" i], input[name*="city" i]'); if (cityField && addressData.city) { if (cityField.tagName === 'SELECT') { const cityFormatted = addressData.city.toLowerCase().replace(/\s+/g, '_'); const option = Array.from(cityField.options).find( opt => opt.value === cityFormatted || opt.text.toLowerCase() === addressData.city.toLowerCase() ); if (option) { cityField.value = option.value; cityField.dispatchEvent(new Event('change', { bubbles: true })); } } else { cityField.value = addressData.city; cityField.dispatchEvent(new Event('change', { bubbles: true })); } } } // Initialize immediately console.log('🚀 Starting initialization...'); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', loadGooglePlacesAPI); console.log('⏳ Waiting for DOM to load...'); } else { console.log('✅ DOM already loaded, initializing now'); loadGooglePlacesAPI(); } // Also initialize when popup opens document.addEventListener('elementor/popup/show', () => { console.log('🎯 Elementor popup opened, re-initializing...'); setTimeout(loadGooglePlacesAPI, 500); }); })()