Common Reasons Claims Get Delayed (And How We Prevent Them)

You filed your claim weeks ago. Maybe even months ago. You keep calling, and they keep saying “we’re still looking at it” or “we need more time.” Your bills are piling up, and you’re wondering what’s taking so long.

I’ve seen this happen hundreds of times, and I know how hard it makes life. Let me explain what’s really happening and how we help people get past these delays.

Why Your Claim Is Taking So Long

What Claim Delays Really Mean for You

When your claim gets delayed, it’s not just annoying. It hits your wallet hard. You might have medical bills you can’t pay. You might have missed work and lost money. Your car might still be broken. Your home might still have damage. Every day that passes makes things worse.

Insurance companies know this. They know you’re under pressure. They know you need money now. And sometimes, they use that against you. Not always on purpose, but the result is the same – you wait while they take their time.

I talked to a woman last month who waited four months for her car accident claim. She couldn’t afford to fix her car, so she was taking the bus to work. She was spending two extra hours every day just traveling. When I asked the insurance adjuster what was taking so long, they said they were “still reviewing.” But there was nothing left to review. They were just slow.

The True Cost of Waiting

The longer you wait, the more money you might lose. Here’s what happens when claims get delayed:

Your medical treatment might stop because you can’t pay for it. This can make your injury worse. Doctors might not want to keep seeing you if the bills aren’t getting paid. You might have to use your own savings or credit cards. Some people go into debt waiting for their money.

Your evidence might disappear. Witnesses forget things. Photos get lost. Medical records pile up and get harder to organize. The longer you wait, the weaker your case can become.

According to a study published by the National Association of Insurance Commissioners, delayed settlements often result in claimants accepting 15-30% less than what their claims were actually worth, simply due to financial pressure and the emotional toll of waiting. Your stress gets worse. I’ve seen people get sick from the worry. They can’t sleep. They fight with their family. They feel helpless. This isn’t right, but it happens every day.

Incomplete or Missing Documentation

What Documents You Actually Need

This is the number one reason claims get delayed. The insurance company says they don’t have what they need. Sometimes they’re right. Sometimes they’re making excuses.

Here’s what you usually need for most claims: a police report if there was an accident, photos of the damage, medical records from your doctor, medical bills with the costs, proof of your lost wages from work, and witness statements if anyone saw what happened.

For medical claims, you also need treatment notes, prescriptions, referral letters, and sometimes test results like X-rays or MRI scans. For property damage, you need repair estimates, receipts for anything you fixed yourself, and proof of what things cost before they got damaged.

The insurance adjuster might ask for your old medical records, too. They want to see if you have any pre-existing problems. This feels like they’re snooping, but it’s normal. Just make sure they only get records that relate to your current injury.

I had a client who thought he sent everything. But when we looked, he sent photos of his car but forgot the estimate from the repair shop. That one missing paper held up his whole claim for six weeks. Once we sent it, they processed everything in three days.

How to Keep Your Paperwork Organized

Start a folder the day you file your claim. Put everything in it. Every paper, every email, every receipt. Write down every phone call you make. Write the date, who you talked to, and what they said.

Take photos of everything with your phone. Your injury, the damage, the accident scene. Even if it seems like too much, take it anyway. You can always delete photos later, but you can’t go back in time to take new ones.

Make copies of everything before you send it to the insurance company. Keep the copies in your folder. This way, when they say “we never got that,” you can prove you sent it.

I use a simple system with my clients. We make a checklist of every document they need. We check it off as we collect each one. Then we send everything in one big package with a letter listing what’s inside. This way, the insurance company can’t say they’re missing something when we can prove we sent it.

Insurance Company Delay Tactics

Requesting the Same Papers Over and Over

This drives people crazy. You send your medical bills, and two weeks later, they ask for them again. You send your photos, and a month later,r they say they need photos. You know you sent them. They know you sent them. But they ask anyway.

Sometimes this happens because different people in the insurance company don’t talk to each other. Your papers are in the system, but the person calling you doesn’t know how to find them. Sometimes it happens because they lost your papers. And sometimes, honestly, they’re just trying to make you give up.

According to research from the Consumer Federation of America, repetitive documentation requests are among the top three complaints filed against insurance companies, with policyholders reporting an average of 3-5 requests for the same documents in delayed claims (source: https://consumerfed.org/).

I’ve seen insurance companies ask for the same medical record four or five times. Each time, my client has to call the doctor’s office, pay for another copy, and wait for them to send it. This wastes time and money. And the insurance company knows it.

The best defense is keeping good records. When they ask for something you already sent, you can sayy “I sent that on March 15th. Here’s a copy of my email showing I sent it. Do you need me to send it again?” Usually, they’ll find it after that.

Moving Your Claim Between Different People

You finally get comfortable talking to one adjuster. You explain your whole story. They understand your situation. Then suddenly, you get a call from someone new. A different adjuster. And you have to start over from the beginning.

This happens all the time. Insurance companies move claims around between adjusters for lots of reasons. Someone quits. Someone goes on vacation. They reorganize their teams. Each time, your claim goes to the back of someone else’s pile.

Every new adjuster needs time to read your file. They need time to understand what happened. Meanwhile, weeks go by, and nothing moves forward. I’ve seen claims get passed between three or four different people before anyone actually makes a decision.

This is one reason why having a lawyer helps. When I call, I don’t let them restart the whole process. I already know the case. I can remind them where we left off. I can push them to make a decision instead of just “reviewing” forever.

Waiting for Medical Treatment to Finish Why Doctors Want You at Maximum Medical Improvement

Waiting for Medical Treatment to Finish

Why Doctors Want You at Maximum Medical Improvement

If you’re still seeing doctors, the insurance company will wait to settle your claim. They want to see how much your treatment costs in total. They want to know if you’ll get better or if you’ll have problems forever.

Doctors call this maximum medical improvement or MMI. It means you’ve healed as much as you’re going to heal. Maybe you’re 100% better. Maybe you’re only 80% better and will always have some pain. But either way, the doctors know what your future looks like.

If you settle before you reach MMI, you might miss out on money. Let’s say you settle for $10,000, but then you need surgery that costs $15,000. Too bad. You already settled. You can’t go back and ask for more.

I remember a guy who hurt his back in a car accident. He felt better after two months, so he wanted to settle fast. But his doctor said, Let’ss wait and see.” Good thing we waited. Three months later, his back got worse. He needed physical therapy for six more months. If he had settled early, he would have been stuck paying for all that himself.

The Danger of Settling Too Early

Insurance companies love it when people settle too soon. They’ll offer you money before you finish treatment. They’ll say, Takee this now, and we can close this out.” It sounds tempting when you need money.

But if you say yes, you’re done. You can’t change your mind later. If your injury turns out to be worse than you thought, you’re on your own. If you need more medical treatment, you pay for it yourself.

According to the American Bar Association, individuals who settle personal injury claims without legal help before completing medical treatment receive 32% less compensation on average compared to those who wait until MMI.

Young people especially need to be careful. A back injury might seem small now, but it could bother you for the next 40 years. If you settle for $5,000 now, that won’t help much when you need treatment for decades.

The smart move is waiting until your doctor says you’re done. Yes, it takes longer. Yes, it’s frustrating. But it protects you from getting stuck with bills you can’t pay later.

Disagreements About Who Was at Fault

When Both Sides Blame Each Other

Sometimes claims get delayed because nobody agrees on who caused the accident. You say they hit you. They say you hit them. The insurance companies on both sides argue about it. Meanwhile, you’re stuck waiting.

This happens a lot at intersections. One person says the light was green. The other person says no, their light was green. Without a witness or a camera, it’s hard to prove who’s right.

Insurance companies use these disagreements as an excuse to delay. They say “we’re still investigating who was at fault.” They ask for more evidence. They talk to witnesses. They look at police reports. All of this takes time.

In some states, even if you were partly at fault, you can still get money. But the insurance company has to figure out what percentage was your fault. This makes things even more complicated. They might say “you were 40% at fault,” and that reduces how much they pay you.

I worked on a case where two cars hit each other in a parking lot. Both drivers were backing up at the same time. Neither one saw the other. The insurance companies argued for five months about who should pay. Finally, they agreed to split it 50/50. But my client lost five months of her life to that argument.

Gathering Evidence That Proves Your Case

The best way to avoid fault arguments isto haveg good evidence from the start. Photos help. Videos help even more. Witness names and phone numbers are gold.

If the police report, get the police report. It usually says who the officer thinks was at fault. Insurance companies pay attention to what the police say. If the police report is on your side, it’s much harder for them to blame you.

Dash cameras are becoming more popular. If you have video of the accident, that ends most arguments. The insurance company can’t say you’re lying when they can watch what happened.

Sometimes you need expert help. An accident reconstruction expert can look at the damage and figure out how the accident happened. They use physics and measurements to prove who was at fault. This costs money, but it might be worth it if the insurance company won’t listen otherwise.

The sooner you collect this evidence, the better. Memories fade. Witnesses move away. Security camera footage gets erased after a few weeks. Don’t wait. Get everything you can as fast as you can.

Problems with Insurance Systems and Staff

Not Enough Workers to Handle Claims

A lot of insurance companies are understaffed right now. They don’t have enough adjusters to handle all their claims. This means each adjuster has too many cases. They’re overwhelmed. They can’t keep up.

When an adjuster has 100 claims on their desk, yours isn’t getting much attention. They might look at it once a week. Or once a month. Meanwhile, you’re calling and emailing and getting nowhere.

According to a report from the Insurance Information Institute, the average claims adjuster workload increased by 47% between 2020 and 2024, while staffing levels remained largely unchanged, resulting in significant delays in claims processing across the industry.

This got worse after hurricanes and other big disasters. Suddenly, thousands of people all file claims at once. The insurance company can’t hire new adjusters fast enough. Even good adjusters who want to help you can’t because they’re drowning in work.

I’ve talked to adjusters who apologize for how slow things are. They know it’s not fair to you. But they’re just one person trying to do the job of three people. The insurance company should hire more help, but that costs money, so they don’t.

Old Computer Systems That Don’t Talk to Each Other

Many insurance companies use old technology. Their computers don’t work well together. One system holds your personal information. Another system holds your medical records. A third system processes payments. They don’t share information automatically.

This means the adjuster has to look in three different places to see your whole case. Sometimes information gets entered incorrectly. Sometimes it gets lost. Sometimes they just can’t find it, even though it’s in there somewhere.

I’ve seen claims get delayed because the adjuster couldn’t access the photos. The photos were uploaded to the system, but the adjuster‘s computer couldn’t open them. It took them two weeks to figure out the problem and fix it.

Newer insurance companies have better technology. Everything is in one place. The whole team can see everything. Updates happen automatically. But older, bigger insurance companies sometimes still use systems from 20 or 30 years ago.

When you’re dealing with system problems, patience helps. But also, stay on top of things. Call regularly. Ask if they can see your information. Sometimes just asking makes them work harder to find it.

How We Prevent These Delays Our System for Fast Document Collection

How We Prevent These Delays

Our System for Fast Document Collection

We’ve learned from years of handling claims. We know exactly what documentation the insurance company will ask for. We collect it all up front, before they even ask.

When you work with us, we give you a checklist on day one. It lists every paper, photo, and record we need. We help you get everything organized. We request medical records from your doctors. We get police reports. We gather witness statements.

Then we send it all to the insurance company in one complete package. We include a detailed letter explaining what happened and why you deserve compensation. We attach every piece of evidence. We make it easy for them to say yes.

This stops the back-and-forth of “we need this” and “we need that.” They already have everything. If they ask for more, we can point to our original package and show them we already sent it.

We also keep copies of everything in a secure system. If something gets lost, we can resend it immediately. We don’t have to wait for you to dig through your papers or call the doctor again.

We Deal with Insurance Companies, So You Don’t Have To

Once we take your case, you don’t have to talk to the insurance company anymore. We handle all the phone calls, emails, and letters. This takes a huge weight off your shoulders.

Insurance adjusters change their tone when they’re talking to a lawyer. They know we understand the rules. They know we won’t accept their excuses. They know if they delay too long, we’ll take action.

We call them regularly. We don’t let your claim sit on their desk getting dusty. We push for updates. We set deadlines. We make it clear we’re not going away.

If they try the usual delay tactics – asking for papers we already sent, moving your case between adjusters, dragging out their “investigation” – we call them out on it. We keep detailed records of every interaction. If they cross the line into bad faith, we’re ready to hold them accountable.

We’ve built relationships with many insurance companies over the years. Sometimes, just having us on the case makes things move faster. They know we’re serious. They know we’ll fight if we have to. Often, they’d rather just handle the claim fairly and move on.

Conclusion

Claims get delayed for many reasons. Sometimes it’s missing paperwork. Sometimes it’s insurance company games. Sometimes it’s just too many claims and not enough workers. Whatever the reason, these delays hurt real people who need help now.

You don’t have to face this alone. We know how the system works. We know what insurance companies will try. Most importantly, we know how to get results when you’re stuck waiting.

If your claim has been delayed for weeks or months, don’t give up. There are things we can do to push it forward. The sooner you get help, the sooner you can get the compensation you deserve and move on with your life.

Frequently Asked Questions

How long should a claim take?

Most simple claims should close in 30 to 60 days if you have all your documentation ready. More complicated claims with serious injuries or liability disputes might take 3 to 6 months or longer. If your claim is taking longer than this without a good reason, something is wrong.

Can I speed up my claim myself?

Yes, sometimes. Make sure you’ve sent all the documentation they asked for. Call every week to check on progress. Be polite but firm. Ask specific questions like Whatt are you waiting for?” and “When will you make a decision?” Keep records of every conversation. If this doesn’t work, you might need help from a lawyer.

What if the insurance company stops responding?

This is a red flag. Insurance companies have a legal duty to respond to you in a reasonable time. If they’re ignoring your calls and emails, they might be acting in bad faith. Start documenting every time you try to contact them. Send a certified letter demanding a response. If they still don’t respond, talk to a lawyer right away. You might have a bad-faith case.

Will hiring a lawyer make things take longer?

Usually no. Most of the time, having a lawyer actually speeds things up. Insurance companies know they can’t play games with lawyers the way they can with people who don’t know the rules. We put pressure on them to move faster. Yes, sometimes we need time to investigate and build a strong case, but this usually leads to a better result than settling fast for less money.

What can I do if I’ve been waiting for months?

First, find out exactly what’s causing the delay. Is it missing paperwork? Are they still investigating? Are they just slow? Once you know the problem, you can fix it. If you’ve done everything right and they’re still stalling, contact a lawyer for a free consultation. There might be legal action you can take to force them to act. Don’t just keep waiting and hoping – take action.

 

We Are Your Warranty Advocates.

Latests Posts

WE DON’T JUST WORK ON CARS, WE FIX THEM!

Auto Repair & Tire Service in Huntsville, AL

At Brian’s Tire & Service we work hard to earn your trust and loyalty. We know how important it is to find a Huntsville car service you can rely on, so your satisfaction is our top priority each and every day.

WE DON’T JUST WORK ON CARS,
WE FIX THEM!

Your Full-Service Automotive Repair Shop

At Brian’s Tire & Service we work hard to earn your trust and loyalty. We know how important it is to find a Huntsville car service you can rely on, so your satisfaction is our top priority each and every day.

Our Automotive Services

Get trusted auto repair and maintenance for your vehicle in Huntsville, AL. From routine care to complex repairs, our team is here to keep your vehicle safe and reliable.

Advanced Diagnostics 1

Advanced Diagnostics

Professional vehicle diagnostics to identify warning lights, performance issues and hard-to-find problems before they become costly repairs.

Maintenance & Repair

Auto Maintenance Services

Comprehensive routine maintenance and repair programs designed to keep your vehicle reliable, safe, efficient, and ready for the road every day.

Suspension Steering maintenance and repair

Suspension & Steering

Keep your vehicle safe and comfortable with professional suspension and steering care for a smoother, safer, and more controlled ride overall.

Engine Maintenance & Repair

Engine Diagnostics & Repair

Identify engine problems early and get reliable repairs to keep your vehicle running smoothly, safely, efficiently, and confidently on the road.

Complete Tire Services

Complete Tire Services

Keep your vehicle safe and road-ready with dependable tire services for improved traction, handling, performance, and long-lasting road safety.

See All Services

From engine repair to tire services, view our complete list of automotive services.

Our Commitment

A Better Automotive Service Experience

At Brian’s Tire & Service, we believe great automotive care goes beyond fixing vehicles, it’s about treating every customer with honesty, respect, and transparency throughout the entire process.

Our team takes the time to explain what your vehicle needs and why, so you can make informed decisions with confidence. No surprises, no pressure, just straightforward service from people who genuinely care.

 

A Better Automotive Service

Comprehensive Tire Services We Offer:

Brian’s Tire & Service is your neighborhood hub for all tire-related needs. Our range of services includes but is not limited to:
Routine Tire Maintenance at Brians Tire and Service

Routine Tire Maintenance

Regular maintenance is key to extending the life of your tires. Our expert team performs thorough inspections and tire rotations every 5,000 miles to promote even wear across all four tires, saving you money and enhancing fuel efficiency.

Prompt Tire Repairs at Brians Tire and Service

Prompt Tire Repairs

Encountered a flat tire or a slow leak? Bring your vehicle to us. With meticulous attention to detail, we’ll uncover the cause of the issue and carry out the necessary repairs, getting you back on the road swiftly and safely.

Precise Wheel Balancing at Brians Tire and Service

Precise Wheel Balancing

Over time, wheel imbalances can lead to unpleasant vibrations, especially at higher speeds. Utilizing state-of-the-art computerized wheel balancing equipment, we rectify these imbalances, ensuring a smooth and comfortable drive.

Rectangle 56 1

Tire Sales and Installation

When it's time for a new set of tires, our vast selection caters to every preference, whether you seek high-performance or budget-friendly options. Our professionals will guide you in choosing the perfect tires and ensure they are installed correctly.

ABOUT US

Brian's Tire & Service in Huntsville

For years Brian’s Tire & Service has been there for the people of Huntsville. We love what we do, and that basic fact fuels our business. We are dedicated to our customers, and that’s why they stick with us—the best auto repair Huntsville has to offer.

Our family of technicians and service staff see their work here as more than a job. It’s their vocation and livelihood. Each member of our team is invested in your satisfaction.

Brian’s Tire & Service was founded on the basic idea that everyone deserves respect. It is our mission to treat each person that comes through our door with dignity and sensitivity. We believe this attention to detail has paid off by providing us with our loyal, friendly family of customers. That’s what makes Brian’s Tire & Service the best car service in Huntsville!

Are you ready to experience the best Huntsville car service available? Please give us a call or book an appointment:

Group 174

Brian Lombardino
Owner

Contact Information

Customer satisfaction is our number one priority. We want to hear from you if you have questions or comments, we’d love to hear from you.

Our Client Reviews

{ "@context": "https://schema.org", "@type": "LocalBusiness", "name": "Brian's Tire & Service", "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.8", "reviewCount": 605, "bestRating": "5", "worstRating": "1" }, "address": "1024 Putman Dr NW, Huntsville, AL 35816" }

Brian's Buddy Membership

**12 month minimum required per member**

Only $299.95 annually

We offer up to 12 months interest free financing for qualified customers

Wheel

Affiliates & Certification

Car Quest
Technet
OReilly v2
AC Delco red and blue
Be Car Care Aware2
ASA
ASE Certified Logo
BBB
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/brians-warranty-child/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
(function() { // Global page view and session tracking for UAEL Modal Popup feature try { // Session tracking: increment if this is a new session // Check if any popup on this page uses current page tracking var hasCurrentPageTracking = false; var currentPagePopups = []; // Check all modal popups on this page for current page tracking if (typeof jQuery !== 'undefined') { jQuery('.uael-modal-parent-wrapper').each(function() { var scope = jQuery(this).data('page-views-scope'); var enabled = jQuery(this).data('page-views-enabled'); var popupId = jQuery(this).attr('id').replace('-overlay', ''); if (enabled === 'yes' && scope === 'current') { hasCurrentPageTracking = true; currentPagePopups.push(popupId); } }); } // Global tracking: ALWAYS increment if ANY popup on the site uses global tracking // Current page tracking: increment per-page counters if (hasCurrentPageTracking && currentPagePopups.length > 0) { var currentUrl = window.location.href; var urlKey = 'uael_page_views_' + btoa(currentUrl).replace(/[^a-zA-Z0-9]/g, '').substring(0, 50); var currentPageViews = parseInt(localStorage.getItem(urlKey) || '0'); currentPageViews++; localStorage.setItem(urlKey, currentPageViews.toString()); // Store URL mapping for each popup for (var i = 0; i < currentPagePopups.length; i++) { var popupUrlKey = 'uael_popup_' + currentPagePopups[i] + '_url_key'; localStorage.setItem(popupUrlKey, urlKey); } } } catch (e) { // Silently fail if localStorage is not available } })();
( () => { const lazyloadRunObserver = () => { const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { entries.forEach( ( entry ) => { if ( entry.isIntersecting ) { let lazyloadBackground = entry.target; if( lazyloadBackground ) { lazyloadBackground.classList.add( 'e-lazyloaded' ); } lazyloadBackgroundObserver.unobserve( entry.target ); } }); }, { rootMargin: '200px 0px 200px 0px' } ); lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { lazyloadBackgroundObserver.observe( lazyloadBackground ); } ); }; const events = [ 'DOMContentLoaded', 'elementor/lazyload/observe', ]; events.forEach( ( event ) => { document.addEventListener( event, lazyloadRunObserver ); } ); } )(); jQuery.uiBackCompat = true; //# sourceURL=jquery-ui-core-js-before var uael_particles_script = {"uael_particles_url":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/min-js/uael-particles.min.js","particles_url":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/lib/particles/particles.min.js","snowflakes_image":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/snowflake.svg","gift":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/gift.png","tree":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/tree.png","skull":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/skull.png","ghost":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/ghost.png","moon":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/moon.png","bat":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/bat.png","pumpkin":"https://brianstireandservice.com/wp-content/plugins/ultimate-elementor/assets/img/pumpkin.png"}; //# sourceURL=elementor-frontend-js-extra var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnX":"Share on X","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":false},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":false},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":false},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":false}},"hasCustomBreakpoints":false},"version":"4.3.6","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"container":true,"theme_builder_v2":true,"hello-theme-header-footer":true,"nested-elements":true,"import-export-customization":true,"e_pro_atomic_form":true,"mega-menu":true,"e_pro_variables":true,"e_pro_interactions":true},"urls":{"assets":"https:\/\/brianstireandservice.com\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/brianstireandservice.com\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/brianstireandservice.com\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"cce75da8da","atomicFormsSendForm":"d3ea069d70"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_tablet"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","hello_header_logo_type":"logo","hello_header_menu_layout":"horizontal","hello_footer_logo_type":"logo"},"post":{"id":24,"title":"Auto%20Repair%20%26%20Tires%20In%20Huntsville%2C%20AL%20%7C%20Brian%27s%20Tire%20%26%20Auto","excerpt":"","featuredImage":"https:\/\/brianstireandservice.com\/wp-content\/uploads\/2023\/11\/brians-Tire-Service-Home-1024x536.jpg"}}; //# sourceURL=elementor-frontend-js-before window.scope_array = []; window.backend = 0; jQuery.cachedScript = function( url, options ) { // Allow user to set any option except for dataType, cache, and url. options = jQuery.extend( options || {}, { dataType: "script", cache: true, url: url }); // Return the jqXHR object so we can chain callbacks. return jQuery.ajax( options ); }; jQuery( window ).on( "elementor/frontend/init", function() { elementorFrontend.hooks.addAction( "frontend/element_ready/global", function( $scope, $ ){ if ( "undefined" == typeof $scope ) { return; } if ( $scope.hasClass( "uael-particle-yes" ) ) { window.scope_array.push( $scope ); $scope.find(".uael-particle-wrapper").addClass("js-is-enabled"); }else{ return; } if(elementorFrontend.isEditMode() && $scope.find(".uael-particle-wrapper").hasClass("js-is-enabled") && window.backend == 0 ){ var uael_url = uael_particles_script.uael_particles_url; jQuery.cachedScript( uael_url ); window.backend = 1; }else if(elementorFrontend.isEditMode()){ var uael_url = uael_particles_script.uael_particles_url; jQuery.cachedScript( uael_url ).done(function(){ var flag = true; }); } }); }); // Added both `document` and `window` event listeners to address issues where some users faced problems with the `document` event not triggering as expected. // Define cachedScript globally to avoid redefining it. jQuery.cachedScript = function(url, options) { options = jQuery.extend(options || {}, { dataType: "script", cache: true, url: url }); return jQuery.ajax(options); // Return the jqXHR object so we can chain callbacks }; let uael_particle_loaded = false; //flag to prevent multiple script loads. jQuery( document ).on( "ready elementor/popup/show", () => { loadParticleScript(); }); jQuery( window ).one( "elementor/frontend/init", () => { if (!uael_particle_loaded) { loadParticleScript(); } }); function loadParticleScript(){ // Use jQuery to check for the presence of the element if (jQuery(".uael-particle-yes").length < 1) { return; } uael_particle_loaded = true; var uael_url = uael_particles_script.uael_particles_url; // Call the cachedScript function jQuery.cachedScript(uael_url); } //# sourceURL=elementor-frontend-js-after var mdpReadablerOptions = {"ajaxurl":"https://brianstireandservice.com/wp-admin/admin-ajax.php","nonce":"cebc04f094","pluginURL":"https://brianstireandservice.com/wp-content/plugins/readabler/","postID":"24","postType":"page","translation":{"voiceGuide":"","voiceRecognitionStart":"Say a command...","voiceRecognitionEnd":"Voice recognition has stopped","voiceRecognitionWait":"Wait...","voiceRecognitionLegend":"Voice recognition","voiceRecognitionCommands":"Voice commands","voiceRecognitionHistory":"History","voiceRecognitionClose":"Close and stop voice navigation","voiceRecognitionErrorNoVoice":"Voice recognition has stopped, no voice detected. Click the button to restart recognition.","voiceRecognitionErrorNoNetwork":"Network error. Check is you online and try again.","voiceRecognitionErrorNoMic":"No microphone. Check is your microphone connected and try again.","voiceRecognitionErrorNoPermission":"Permission denied. Check is your microphone connected and try again.","voiceRecognitionErrorNotAllowed":"Microphone access denied. Check is your microphone connected and try again.","voiceRecognitionErrorUnknown":"Voice recognition error. Try again.","voiceRecognitionNumbers":["zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty one","twenty two","twenty three","twenty four","twenty five","twenty six","twenty seven","twenty eight","twenty nine","thirty","thirty one","thirty two","thirty three","thirty four","thirty five","thirty six","thirty seven","thirty eight","thirty nine","forty","forty one","forty two","forty three","forty four","forty five","forty six","forty seven","forty eight","forty nine","fifty","fifty one","fifty two","fifty three","fifty four","fifty five","fifty six","fifty seven","fifty eight","fifty nine","sixty","sixty one","sixty two","sixty three","sixty four","sixty five","sixty six","sixty seven","sixty eight","sixty nine","seventy","seventy one","seventy two","seventy three","seventy four","seventy five","seventy six","seventy seven","seventy eight","seventy nine","eighty","eighty one","eighty two","eighty three","eighty four","eighty five","eighty six","eighty seven","eighty eight","eighty nine","ninety","ninety one","ninety two","ninety three","ninety four","ninety five","ninety six","ninety seven","ninety eight","ninety nine","one hundred","one hundred one","one hundred two","one hundred three","one hundred four","one hundred five","one hundred six","one hundred seven","one hundred eight","one hundred nine","one hundred ten","one hundred eleven","one hundred twelve","one hundred thirteen","one hundred fourteen","one hundred fifteen","one hundred sixteen","one hundred seventeen","one hundred eighteen","one hundred nineteen","one hundred twenty","one hundred twenty one","one hundred twenty two","one hundred twenty three","one hundred twenty four","one hundred twenty five","one hundred twenty six","one hundred twenty seven","one hundred twenty eight","one hundred twenty nine","one hundred thirty","one hundred thirty one","one hundred thirty two","one hundred thirty three","one hundred thirty four","one hundred thirty five","one hundred thirty six","one hundred thirty seven","one hundred thirty eight","one hundred thirty nine","one hundred forty","one hundred forty one","one hundred forty two","one hundred forty three","one hundred forty four","one hundred forty five","one hundred forty six","one hundred forty seven","one hundred forty eight","one hundred forty nine","one hundred fifty","one hundred fifty one","one hundred fifty two","one hundred fifty three","one hundred fifty four","one hundred fifty five","one hundred fifty six","one hundred fifty seven","one hundred fifty eight","one hundred fifty nine","one hundred sixty","one hundred sixty one","one hundred sixty two","one hundred sixty three","one hundred sixty four","one hundred sixty five","one hundred sixty six","one hundred sixty seven","one hundred sixty eight","one hundred sixty nine","one hundred seventy","one hundred seventy one","one hundred seventy two","one hundred seventy three","one hundred seventy four","one hundred seventy five","one hundred seventy six","one hundred seventy seven","one hundred seventy eight","one hundred seventy nine","one hundred eighty","one hundred eighty one","one hundred eighty two","one hundred eighty three","one hundred eighty four","one hundred eighty five","one hundred eighty six","one hundred eighty seven","one hundred eighty eight","one hundred eighty nine","one hundred ninety","one hundred ninety one","one hundred ninety two","one hundred ninety three","one hundred ninety four","one hundred ninety five","one hundred ninety six","one hundred ninety seven","one hundred ninety eight","one hundred ninety nine","two hundred"]},"popupPosition":"center","popupOverlay":"","buttons":{"resetButton":true,"hideButton":true},"headers":{"accessibilityProfiles":true,"onlineDictionary":true,"readableExperience":true,"visuallyPleasing":true,"visualAssistance":true,"easyOrientation":true},"onlineDictionary":"1","language":"auto","profileEpilepsy":"1","profileVisuallyImpaired":"1","profileCognitiveDisability":"1","profileAdhdFriendly":"","profileBlindUsers":"1","contentScaling":"1","readableFont":"1","dyslexiaFont":"1","highlightTitles":"1","highlightLinks":"1","textMagnifier":"1","fontSizing":"1","lineHeight":"1","letterSpacing":"1","alignCenter":"1","alignLeft":"1","alignRight":"1","darkContrast":"1","lightContrast":"1","monochrome":"1","highSaturation":"1","highContrast":"1","lowSaturation":"1","textColors":"1","titleColors":"1","backgroundColors":"1","muteSounds":"1","hideImages":"1","hideEmoji":"1","virtualKeyboard":"1","readingGuide":"1","cognitiveReading":"1","cognitiveReadingFocus":"","cognitiveReadingFixation":"normal","usefulLinks":"1","stopAnimations":"1","readingMask":"1","highlightHover":"1","highlightFocus":"1","bigBlackCursor":"1","bigWhiteCursor":"1","textToSpeech":"","voiceNavigation":{"help":["help","help_me","show_commands"],"hide_help":["hide_help","hide_commands","hide_commands_list"],"scroll_down":["scroll_down","down","page_down"],"scroll_up":["scroll_up","up","page_up"],"go_to_top":["go_to_top","top","page_top"],"go_to_bottom":["go_to_bottom","bottom","page_bottom"],"tab":["tab","next","next_tab"],"tab_back":["tab_back","previous","previous_tab"],"show_numbers":["show_numbers","display_numbers","enable_numbers"],"number":["click","press","open"],"hide_numbers":["hide_numbers","disable_numbers","remove_numbers"],"clear_input":["clear_input","clear","remove"],"enter":["enter","submit","ok"],"reload":["reload","refresh","update"],"stop":["stop","cancel","stop_listening"],"exit":["exit","quit","close"]},"keyboardNavigation":"1","startConfig":"","startContentScaling":"0","startFontSizing":"0","startLineHeight":"0","startLetterSpacing":"0","ignoreSavedConfig":"off","showOpenButton":"1","buttonPosition":"right-center","buttonCaption":"","buttonIcon":"_readabler/readabler.svg","buttonIconPosition":"before","buttonSize":"24","buttonMargin":"10","buttonPadding":"20","buttonBorderRadius":"50","buttonColor":"rgba(255, 255, 255, 1)","buttonColorHover":"rgba(33, 111, 243, 1)","buttonBgcolor":"rgba(33, 111, 243, 1)","buttonBgcolorHover":"rgba(255, 255, 255, 1)","buttonEntranceTimeout":"0","buttonEntranceAnimation":"fade","buttonHoverAnimation":"none","buttonShowAfterScrolling":{"desktop":"0","mobile":"0"},"popupOverlayColor":"rgba(2, 83, 238, 1)","popupBackgroundColor":"rgba(255, 255, 255, 1)","popupKeyColor":"rgba(33, 111, 243, 1)","popupBorderRadius":"20","popupAnimation":"fade","popupScroll":"","closeAnywhere":"","popupDraggable":"1","highlightP":"","readAlt":"","hotKeyOpenInterface":"Alt+9","saveConfig":"on","analytics":"off","analyticsSendInterval":"2","analyticsGDPR":"off","statementType":"inline","LEARN_MORE_IN_WIKIPEDIA":"Learn more in Wikipedia","DEFAULT":"Default","HOME":"Home","HIDE_ACCESSIBILITY_INTERFACE":"If you choose to hide the accessibility interface, you won't be able to see it anymore, unless you clear clear cookies for this site. Are you sure that you wish to hide the interface?","readingMaskHeight":"100","virtualKeyboardLayout":["english"],"virtualKeyboardLayouts":{"en":"{\"default\":[\"` 1 2 3 4 5 6 7 8 9 0 - = {bksp}\",\"{tab} q w e r t y u i o p [ ] \\\\\",\"{lock} a s d f g h j k l ; ' {enter}\",\"{shift} z x c v b n m , . \\/ {shift}\",\".com @ {space}\"],\"shift\":[\"~ ! @ # $ % ^ & * ( ) _ + {bksp}\",\"{tab} Q W E R T Y U I O P { } |\",\"{lock} A S D F G H J K L : \\\" {enter}\",\"{shift} Z X C V B N M \u003C \u003E ? {shift}\",\".com @ {space}\"],\"lang\":{\"en\":\"English\"}}"},"hotKeyMenu":"","hotKeyHeadings":"","hotKeyForms":"","hotKeyButtons":"","hotKeyGraphics":"","highlightFocusColor":"#639af9","voiceNavigationAliases":{"help":"Help","help_me":"Help me","show_commands":"Show commands","what_can_i_say":"What can I say","what_can_i_do":"What can I do","what_can_you_do":"What can you do","available_commands":"Available commands","commands_list":"Commands list","hide_help":"Hide help","hide_commands":"Hide commands","hide_commands_list":"Hide commands list","hide_available_commands":"Hide available commands","collapse_commands":"Collapse commands","scroll_down":"Scroll down","down":"Down","page_down":"Page Down","go_down":"Go down","scroll_up":"Scroll up","up":"Up","page_up":"Page Up","go_up":"Go up","go_to_top":"Go to top","top":"Top","page_top":"Page Top","go_to_start":"Go to start","scroll_to_top":"Scroll to top","go_to_bottom":"Go to bottom","bottom":"Bottom","page_bottom":"Page Bottom","go_to_end":"Go to end","scroll_to_bottom":"Scroll to bottom","tab":"Tab","next":"Next","next_tab":"Next Tab","go_to_next":"Go to next","go_to_next_tab":"Go to next tab","tab_back":"Tab back","previous":"Previous","previous_tab":"Previous Tab","go_to_previous":"Go to previous","go_to_previous_tab":"Go to previous tab","show_numbers":"Show numbers","display_numbers":"Display numbers","enable_numbers":"Enable numbers","navigation_numbers":"Navigation numbers","mark_links":"Mark links","number_links":"Number links","click":"Click","press":"Press","open":"Open","go_to":"Go to","go":"Go","select":"Select","hide_numbers":"Hide numbers","disable_numbers":"Disable numbers","remove_numbers":"Remove numbers","hide_mark_links":"Mark links","hide_number_links":"Number links","clear_input":"Clear input","clear":"Clear","remove":"Remove","delete":"Delete","clear_text":"Clear text","clear_search":"Clear search","enter":"Enter","submit":"Submit","ok":"Ok","confirm":"Confirm","accept":"Accept","return":"Return","yes":"Yes","reload":"Reload","refresh":"Refresh","update":"Update","refresh_page":"Refresh page","reload_page":"Reload page","reload_website":"Reload website","refresh_website":"Refresh website","stop":"Stop","cancel":"Cancel","stop_listening":"Stop listening","cancel_listening":"Cancel listening","stop_recording":"Stop recording","stop_voice_navigation":"Stop voice navigation","abort":"Abort","exit":"Exit","quit":"Quit","close":"Close","close_window":"Close window","close_navigation":"Close navigation","close_panel":"Close panel","number":"Number ... "},"voiceNavigationDescription":{"help":"Display a list of available voice commands","hide_help":"Hide a list of available voice commands","scroll_down":"Scroll page down 200 px","scroll_up":"Scroll page down 200 px","go_to_top":"Scroll page to top","go_to_bottom":"Scroll page to bottom","tab":"Move to next interactive element","tab_back":"Move to previous interactive element","show_numbers":"Show numbers for interactive elements","number":"Click on element number...","hide_numbers":"Hide numbers for interactive elements","clear_input":"Clear selected text field","enter":"Click on the selected element","reload":"Reload page","stop":"Stop speech recognition","exit":"Disable voice navigation mode"},"voiceNavigationRerun":"off","scrollDownValue":"200","scrollUpValue":"-200","scrollLeftValue":"-200","scrollRightValue":"200","voiceNavigationVoiceGraph":"on","voiceNavigationInterimResults":"on","voiceNavigationFeedback":"on","voiceNavigationFeedbackOk":["OK","Yes","Done"],"voiceNavigationFeedbackStart":["Start listening","Begin listening","Listening"],"voiceNavigationFeedbackEnd":["End listening","Stop listening","Finish listening"]}; //# sourceURL=mdp-readabler-js-extra For full functionality of this site it is necessary to enable JavaScript. window._googlesitekit = window._googlesitekit || {}; window._googlesitekit.contentEvents = {"postID":24,"isReadableSinglePost":false,"hasVimeoEmbed":false,"wordCount":0,"estimatedReadTimeSeconds":0,"isLastPageOfMultiPagePost":false,"readTimeThresholdPercent":85,"minimumReadTimeSeconds":5}; //# sourceURL=googlesitekit-events-provider-content-events-js-before window.gtranslateSettings = /* document.write */ window.gtranslateSettings || {};window.gtranslateSettings['81955390'] = {"default_language":"en","languages":["en","es"],"url_structure":"none","native_language_names":1,"detect_browser_language":1,"flag_style":"2d","wrapper_selector":"#gt-wrapper-81955390","alt_flags":{"en":"usa"},"float_switcher_open_direction":"top","switcher_horizontal_position":"left","switcher_vertical_position":"bottom","flags_location":"\/wp-content\/plugins\/gtranslate\/flags\/"}; //# sourceURL=gt_widget_script_81955390-js-before wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); //# sourceURL=wp-i18n-js-after var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/brianstireandservice.com\/wp-admin\/admin-ajax.php","nonce":"ef95be8132","urls":{"assets":"https:\/\/brianstireandservice.com\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/brianstireandservice.com\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":true},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/brianstireandservice.com\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; //# sourceURL=elementor-pro-frontend-js-before {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://brianstireandservice.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1.4"}} /*! This file is auto-generated */ var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf(){i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); //# sourceURL=https://brianstireandservice.com/wp-includes/js/wp-emoji-loader.min.js /** * Leadflow Collector — client-side tracking engine. * * Auto-detects every on the page. No manual configuration of * individual forms is required. * * For each form it: * 1. Starts a timer on the first field interaction. * 2. On submit, compiles a JSON payload covering the four pillars: * - usage_data (page url, title, referrer, viewport) * - behavior_metrics (seconds spent filling the form) * - lead_payload (form id/class + every field name -> value) * - lead_email (best-guess email, promoted to top level) * 3. Sends the payload via fetch() WITHOUT blocking or preventing the * native submit — the host site's form behaves exactly as before. * * https://inceptial.team/SEO-Dashboard/wp-json/hub-leads/v1/capture, 5U50fReBFK3oJEP1pCgWeODjtthGfeALafZYt3V2, https://brianstireandservice.com/wp-admin/admin-ajax.php, and a623cc6a42 are replaced * server-side (PHP) before this file is ever printed to the page. */ ( function () { 'use strict'; var HUB_ENDPOINT = 'https://inceptial.team/SEO-Dashboard/wp-json/hub-leads/v1/capture'; var HUB_API_KEY = '5U50fReBFK3oJEP1pCgWeODjtthGfeALafZYt3V2'; var HUB_LOG_URL = 'https://brianstireandservice.com/wp-admin/admin-ajax.php'; var HUB_LOG_NONCE = 'a623cc6a42'; // URL of the Collector's store-sync-key REST endpoint. Empty string once // the sync_key has been persisted server-side (PHP outputs '' at that point). var HUB_STORE_SYNC_KEY_URL = ''; // Click Trackers — phone/email/location/anything else defined on the // Collector's settings page. Substituted server-side as a raw JSON // array literal (valid JSON is valid JS), NOT a quoted string — a // tracker label containing an apostrophe (e.g. "Book It's Time") // would otherwise break out of a quoted string. See attachClickTrackers(). var CLICK_TRACKERS = [{"id":"call","label":"Call","href_prefixes":["tel:"],"href_contains":[],"keywords":["call 256-704-8473"],"selector":"","text_pattern":"phone"},{"id":"email-click","label":"Email Click","href_prefixes":["mailto:"],"href_contains":[],"keywords":["info@brians.tires"],"selector":"","text_pattern":"email"},{"id":"location-click","label":"Location Click","href_prefixes":[],"href_contains":[],"keywords":["1024 putman dr nw","huntsville","al 35816","united states"],"selector":"","text_pattern":""},{"id":"book-an-appointment","label":"book an appointment","href_prefixes":[],"href_contains":[],"keywords":["book an appointment"],"selector":"","text_pattern":""},{"id":"call-2","label":"Call","href_prefixes":["tel:"],"href_contains":[],"keywords":["call: 256-704-8473"],"selector":"","text_pattern":"phone"}]; if ( ! Array.isArray( CLICK_TRACKERS ) ) { CLICK_TRACKERS = []; } // Page Trackers — fire a page_view event when the current URL matches // one of the configured tracked pages. Substituted server-side as a // raw JSON array literal. var PAGE_TRACKERS = [{"id":"car-engine","label":"car engine","page_url":"https:\/\/brianstireandservice.com\/auto-engine-repair\/","match_type":"contains","href_prefixes":[],"href_contains":[],"keywords":["learn more"],"selector":"","text_pattern":""}]; if ( ! Array.isArray( PAGE_TRACKERS ) ) { PAGE_TRACKERS = []; } // Belt-and-suspenders: the PHP injector already guards this, but never // run a half-configured tracker. if ( ! HUB_ENDPOINT || ! HUB_API_KEY ) { return; } /** * Cookie-based visitor ID — persists across sessions so returning * visitors can be identified even after closing and reopening the browser. * A new random ID is assigned on first visit (or after cookie clearance). * Expires after 2 years. Never contains personal data — just a random hex string. */ function getVisitorId() { var COOKIE_NAME = 'hub_vid'; var COOKIE_DAYS = 730; // 2 years // Try to read existing cookie. var existing = ''; var cookies = document.cookie ? document.cookie.split( ';' ) : []; for ( var i = 0; i < cookies.length; i++ ) { var parts = cookies[ i ].trim().split( '=' ); if ( parts[ 0 ] === COOKIE_NAME ) { existing = decodeURIComponent( parts[ 1 ] || '' ); break; } } if ( existing ) { return existing; } // Generate a new random ID: 16 hex chars. var id = ''; var chars = '0123456789abcdef'; for ( var j = 0; j < 16; j++ ) { id += chars[ Math.floor( Math.random() * 16 ) ]; } // Persist in cookie. var expires = new Date(); expires.setTime( expires.getTime() + COOKIE_DAYS * 24 * 60 * 60 * 1000 ); document.cookie = COOKIE_NAME + '=' + encodeURIComponent( id ) + '; expires=' + expires.toUTCString() + '; path=/' + '; SameSite=Lax'; return id; } // Resolve visitor ID once at page load and reuse across all payloads. var HUB_VISITOR_ID = getVisitorId(); /** * Lightweight User-Agent parse — device type, OS, browser. Good enough * for lead-gen reporting; not meant to rival a full UA-parsing library. * Order matters (e.g. iPad must be checked before "Mac" substring * traps, Edge before Chrome, etc.). */ function getDeviceInfo() { var ua = navigator.userAgent || ''; var deviceType = 'Desktop'; if ( /iPad/i.test( ua ) || ( /Macintosh/i.test( ua ) && 'ontouchend' in document ) ) { deviceType = 'Tablet'; } else if ( /Android/i.test( ua ) && ! /Mobile/i.test( ua ) ) { deviceType = 'Tablet'; } else if ( /Mobi|iPhone|Android/i.test( ua ) ) { deviceType = 'Mobile'; } var os = 'Unknown'; if ( /iPhone|iPad|iPod/i.test( ua ) ) { os = 'iOS'; } else if ( /Android/i.test( ua ) ) { os = 'Android'; } else if ( /Windows/i.test( ua ) ) { os = 'Windows'; } else if ( /Macintosh|Mac OS X/i.test( ua ) ) { os = 'macOS'; } else if ( /CrOS/i.test( ua ) ) { os = 'ChromeOS'; } else if ( /Linux/i.test( ua ) ) { os = 'Linux'; } var browser = 'Unknown'; if ( /Edg\// .test( ua ) ) { browser = 'Edge'; } else if ( /OPR\/|Opera/.test( ua ) ) { browser = 'Opera'; } else if ( /Firefox\//.test( ua ) ) { browser = 'Firefox'; } else if ( /CriOS\//.test( ua ) ) { browser = 'Chrome'; } else if ( /Chrome\//.test( ua ) && ! /Chromium\//.test( ua ) ) { browser = 'Chrome'; } else if ( /Safari\//.test( ua ) && /Version\//.test( ua ) ) { browser = 'Safari'; } return { type: deviceType, os: os, browser: browser, user_agent: ua.slice( 0, 300 ) }; } // Shared de-dupe registry between the native-submit-event path and the // network-level path (see patchFetch/patchXhr below), so a builder // that fires BOTH signals for the same real submission — e.g. no // CAPTCHA involved, so the native submit event works AND we also see // the underlying AJAX call — doesn't create two leads for one // submission. Keyed by form_type rather than a specific form // instance/id, since the network path only knows the builder, not // which exact on the page fired it. var recentlySent = {}; var DEDUPE_WINDOW_MS = 4000; function shouldSendForKey( key ) { var now = Date.now(); var last = recentlySent[ key ] || 0; if ( now - last < DEDUPE_WINDOW_MS ) { return false; } recentlySent[ key ] = now; return true; } /** * Fire-and-forget report to this site's OWN Activity Log (not the Hub). * Records metadata only — never field values or the email itself — so * the person managing this client site can see, locally, whether * submissions are making it out. Failures here are swallowed; a logging * hiccup must never affect the real lead delivery above. */ function logEvent( fields ) { if ( ! HUB_LOG_URL || ! HUB_LOG_NONCE ) { return; } try { var params = new URLSearchParams(); params.set( 'action', 'hub_collector_log_event' ); params.set( 'nonce', HUB_LOG_NONCE ); Object.keys( fields ).forEach( function ( key ) { var value = fields[ key ]; params.set( key, null === value || undefined === value ? '' : String( value ) ); } ); fetch( HUB_LOG_URL, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params.toString() } ).catch( function () {} ); } catch ( e ) { // no-op } } // Per-form interaction state (when the visitor first touched a field). var formState = new WeakMap(); /** * Form-builder signature registry — Layer 1 of the detection system. * Every signature below was verified against each plugin's actual * rendered markup (official docs / source / GitHub), not guessed. * Checked top-to-bottom, first match wins. Unmatched forms fall through * to 'other' — they're still tracked normally, just unlabeled. * * Each `test` receives the element itself. `form.closest()` also * checks the form itself, so signatures work whether the matching class * lives on the tag or on a wrapping container around it. */ var FORM_BUILDER_SIGNATURES = [ { key: 'contact_form_7', test: function ( form ) { return form.classList.contains( 'wpcf7-form' ); } }, { key: 'wpforms', test: function ( form ) { return form.classList.contains( 'wpforms-form' ) || /^wpforms-form-/.test( form.id || '' ); } }, { key: 'gravity_forms', test: function ( form ) { return /^gform_\d+$/.test( form.id || '' ) || !! form.closest( '.gform_wrapper' ); } }, { key: 'ninja_forms', test: function ( form ) { return form.classList.contains( 'nf-form-layout' ) || !! form.closest( '.nf-form-cont' ); } }, { key: 'formidable', test: function ( form ) { return form.classList.contains( 'frm-show-form' ) || !! form.closest( '.frm_forms' ); } }, { key: 'fluent_forms', test: function ( form ) { return form.classList.contains( 'frm-fluent-form' ); } }, { key: 'elementor', // Elementor Pro submits via AJAX — the network watcher (fetch/XHR // patch) already captures the real submission. Skipping the DOM // submit event here prevents a duplicate lead. networkOnly: true, test: function ( form ) { return form.classList.contains( 'elementor-form' ); } }, { key: 'forminator', test: function ( form ) { return form.classList.contains( 'forminator-custom-form' ) || /^forminator-module-/.test( form.id || '' ); } }, { key: 'caldera_forms', test: function ( form ) { return form.classList.contains( 'caldera-forms-form' ) || /^caldera_forms_form/.test( form.id || '' ); } }, { key: 'divi', test: function ( form ) { return form.classList.contains( 'et_pb_contact_form' ); } }, { key: 'woocommerce_checkout', test: function ( form ) { return form.classList.contains( 'woocommerce-checkout' ); } }, { key: 'jetpack', test: function ( form ) { return !! form.closest( '.contact-form-container' ) || !! form.closest( '.wp-block-jetpack-contact-form' ); } }, { key: 'hubspot', test: function ( form ) { return form.classList.contains( 'hs-form' ); } }, { key: 'mailchimp', test: function ( form ) { return 'mc-embedded-subscribe-form' === form.id; } } ]; /** * Returns a signature key ('wpforms', 'elementor', etc.) or 'other' if * nothing matched. A single broken test must never crash detection for * the rest of the registry or for the form's own submission. */ function detectFormBuilder( form ) { for ( var i = 0; i < FORM_BUILDER_SIGNATURES.length; i++ ) { try { if ( FORM_BUILDER_SIGNATURES[ i ].test( form ) ) { return FORM_BUILDER_SIGNATURES[ i ].key; } } catch ( e ) { // Skip this signature, keep checking the rest. } } return 'other'; } /** * Returns true for builders that submit via AJAX and are already captured * by the network watcher. The DOM submit listener skips these to prevent * sending a duplicate lead. */ function isNetworkOnlyBuilder( form ) { for ( var i = 0; i < FORM_BUILDER_SIGNATURES.length; i++ ) { try { if ( FORM_BUILDER_SIGNATURES[ i ].networkOnly && FORM_BUILDER_SIGNATURES[ i ].test( form ) ) { return true; } } catch ( e ) {} } return false; } /** * Forms that are never leads: WordPress's own login form, the default * comment form, and search forms. Excluded by default so they never * pollute lead data — these never get a listener attached at all. */ function isExcludedForm( form ) { if ( 'loginform' === form.id || 'commentform' === form.id ) { return true; } if ( 'search' === ( form.getAttribute( 'role' ) || '' ).toLowerCase() ) { return true; } if ( form.classList.contains( 'search-form' ) ) { return true; } return false; } function cssEscape( value ) { if ( window.CSS && typeof window.CSS.escape === 'function' ) { return window.CSS.escape( value ); } return String( value ).replace( /([^\w-])/g, '\\$1' ); } /** * Best-effort human-readable label for a field: