new-site/site/public/tools/dot-compliance-check/index.html
justin bd9a70607f fix: maintain Services dropdown header from one canonical source
The site header / Services mega-dropdown was duplicated across two render
systems (Astro pages via Base.astro->nav.html, and ~80 pre-rendered static
public/**/index.html pages each embedding their own copy). They had drifted
into 5 different variants (missing 'New Carrier Setup', misplaced Healthcare
column, NEW vs FREE badges, em-dash encoding differences), so
dev.performancewest.net, the order pages, and the rest of the site disagreed.

- Make site/src/partials/nav.html the single source of truth (adopts the most
  complete variant).
- Add scripts/sync_nav.py to rewrite every static page's <nav> block from
  nav.html (idempotent; --check guards against drift in CI/deploy).
- Run the sync automatically in deploy.sh and scripts/deploy-dev.sh.
- Deprecate scripts/inject_healthcare_nav.py (now delegates to sync_nav.py).
- Neutralize the broken no-op SiteNav.astro component.

All 80 headers + the Astro-built order pages now render the identical dropdown.
2026-06-05 14:27:24 -05:00

681 lines
84 KiB
HTML

<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="Free DOT/FMCSA motor carrier compliance check. Verify MCS-150 status, insurance, operating authority, and safety rating instantly."><link rel="canonical" href="https://performancewest.net/tools/dot-compliance-check/"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:url" content="https://performancewest.net/tools/dot-compliance-check/"><meta property="og:title" content="DOT Compliance Check - Free Motor Carrier Filing Status | Performance West Inc."><meta property="og:description" content="Free DOT/FMCSA motor carrier compliance check. Verify MCS-150 status, insurance, operating authority, and safety rating instantly."><!-- Twitter --><meta name="twitter:card" content="summary"><meta name="twitter:title" content="DOT Compliance Check - Free Motor Carrier Filing Status | Performance West Inc."><meta name="twitter:description" content="Free DOT/FMCSA motor carrier compliance check. Verify MCS-150 status, insurance, operating authority, and safety rating instantly."><script>
window.__PW_API = (function() {
var h = window.location.hostname;
if (h === "localhost" || h === "127.0.0.1") return "http://" + h + ":3001";
if (h === "dev.performancewest.net") return "https://api.dev.performancewest.net";
return "https://api.performancewest.net";
})();
</script><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"><title>DOT Compliance Check - Free Motor Carrier Filing Status | Performance West Inc.</title><script defer src="https://analytics.performancewest.net/script.js" data-website-id="55250014-ee15-44ac-a1f6-81dabad3fe0f"></script><script defer src="/js/pw-analytics.js"></script><link rel="stylesheet" href="/_astro/about.DhmoKVOS.css"><script type="module" src="/_astro/hoisted.aBLqmOPy.js?v=8"></script></head> <body class="min-h-screen flex flex-col"> <!-- Navigation --> <nav class="border-b border-gray-200 bg-white sticky top-0 z-50"> <div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex justify-between h-24 items-center"> <a href="/" class="flex items-center"> <img src="/images/logo.png" alt="Performance West" class="h-20 w-auto" width="83" height="70"> </a> <div class="hidden md:flex items-center gap-8"> <!-- Services dropdown --> <div class="relative" id="services-dropdown"> <button type="button" class="text-sm text-gray-600 hover:text-gray-900 inline-flex items-center gap-1" id="services-btn"> Services <svg class="w-3.5 h-3.5 transition-transform" id="services-chevron" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path></svg> </button> <div id="services-menu" class="absolute left-1/2 -translate-x-1/2 top-full mt-2 rounded-xl border border-gray-200 bg-white shadow-xl hidden z-50" style="width: 720px;"> <div class="grid grid-cols-3 gap-0 p-4"> <!-- Column 1 --> <div class="pr-4 border-r border-gray-100"> <p class="text-[11px] font-semibold uppercase tracking-wider text-blue-500 mb-2">Telecom</p> <a href="/services/telecom/fcc-499a" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">FCC 499A Filing</a> <a href="/services/telecom/stir-shaken" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">STIR/SHAKEN</a> <a href="/services/telecom/ipes-isp" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">FCC Carrier / ISP Registration</a> <a href="/services/telecom/database-management" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Telecom Databases</a> <a href="/services/telecom/state-puc" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">State PUC/PSC Filings</a> <a href="/services/telecom/canada-crtc" class="block py-1.5 text-sm font-medium text-blue-600 hover:text-blue-800">Canada CRTC Package <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-red-500 text-white ml-1 animate-pulse">HOT</span></a> <a href="/tools/fcc-compliance-check" class="block py-1.5 text-sm font-medium text-green-600 hover:text-green-800">FCC Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-green-500 text-white ml-1">FREE</span></a> <p class="text-[11px] font-semibold uppercase tracking-wider text-orange-500 mb-2 mt-4">Trucking / DOT</p> <a href="/services/trucking" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">DOT Compliance Services</a> <a href="/order/dot-compliance" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">MCS-150 / BOC-3 / UCR</a> <a href="/order/trucking-new-carrier" class="block py-1.5 text-sm font-medium text-orange-600 hover:text-orange-800">New Carrier Setup</a> <a href="/tools/dot-compliance-check" class="block py-1.5 text-sm font-medium text-orange-600 hover:text-orange-800">DOT Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-orange-500 text-white ml-1">FREE</span></a> </div> <!-- Column 2 --> <div class="px-4 border-r border-gray-100"> <p class="text-[11px] font-semibold uppercase tracking-wider text-purple-500 mb-2">Data Privacy</p> <a href="/services/privacy/ccpa-audit" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">CCPA/CPRA Audit</a> <a href="/services/privacy/privacy-policy" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Privacy Policy Review</a> <a href="/services/privacy/data-mapping" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Data Mapping</a> <a href="/services/privacy/breach-response" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Breach Response Plan</a> <p class="text-[11px] font-semibold uppercase tracking-wider text-green-500 mb-2 mt-4">TCPA</p> <a href="/services/tcpa/consent-audit" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Consent Audit</a> <a href="/services/tcpa/dnc-compliance" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">DNC Compliance</a> <a href="/services/tcpa/campaign-review" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Campaign Review</a> </div> <!-- Column 3 --> <div class="pl-4"> <p class="text-[11px] font-semibold uppercase tracking-wider text-slate-500 mb-2">Corporate</p> <a href="/services/corporate/formation" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Business Formation</a> <a href="/services/corporate/state-registration" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">State Registration</a> <a href="/services/corporate/annual-reports" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Annual Reports</a> <a href="/services/corporate/registered-agent" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Registered Agent</a> <p class="text-[11px] font-semibold uppercase tracking-wider text-teal-500 mb-2 mt-4">Healthcare</p> <a href="/services/healthcare/npi-revalidation" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Medicare Revalidation</a> <a href="/services/healthcare/medicare-enrollment" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">Medicare Enrollment (PECOS)</a> <a href="/services/healthcare" class="block py-1.5 text-sm text-gray-700 hover:text-pw-700">NPI / NPPES Services</a> <a href="/tools/npi-compliance-check" class="block py-1.5 text-sm font-medium text-teal-600 hover:text-teal-800">NPI Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-teal-500 text-white ml-1">FREE</span></a> <a href="/order/formation" class="mt-3 block py-2 px-3 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg text-center transition-colors">Form a Business</a> </div> </div> </div> </div> <a href="/services" class="text-sm text-gray-600 hover:text-gray-900">All Services</a> <a href="/pricing" class="text-sm text-gray-600 hover:text-gray-900">Pricing</a> <a href="/tools/contractor-quiz" class="text-sm text-gray-600 hover:text-gray-900">Free Tools</a> <a href="/contact" class="text-sm text-gray-600 hover:text-gray-900">Contact</a> <a href="/order/formation" class="ml-2 px-4 py-2 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg transition-colors">Form a Business</a> <!-- Account button - links to ERPNext portal --> <a href="https://portal.performancewest.net" id="nav-login-btn" class="ml-1 flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-gray-600 hover:text-pw-700 hover:bg-pw-50 rounded-lg transition-colors border border-gray-200 hover:border-pw-300"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"></path></svg> Client Portal </a> <!-- Account button - logged in (hidden until session confirmed) --> <div id="nav-account-btn" class="hidden relative ml-1" id="nav-account-dropdown-root"> <button type="button" id="nav-account-trigger" class="flex items-center gap-2 px-3 py-2 text-sm font-medium text-pw-700 hover:bg-pw-50 rounded-lg transition-colors border border-pw-200"> <div class="w-6 h-6 rounded-full bg-pw-600 flex items-center justify-center shrink-0"> <svg class="w-3.5 h-3.5 text-white" fill="currentColor" viewBox="0 0 24 24"><path d="M12 12c2.7 0 4.8-2.1 4.8-4.8S14.7 2.4 12 2.4 7.2 4.5 7.2 7.2 9.3 12 12 12zm0 2.4c-3.2 0-9.6 1.6-9.6 4.8v2.4h19.2v-2.4c0-3.2-6.4-4.8-9.6-4.8z"></path></svg> </div> <span id="nav-greeting" class="max-w-[120px] truncate">My Account</span> <svg class="w-3.5 h-3.5 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"></path></svg> </button> <!-- Dropdown --> <div id="nav-account-menu" class="absolute right-0 top-full mt-1 w-48 bg-white rounded-xl border border-gray-200 shadow-lg hidden z-50 py-1"> <div class="px-4 py-2 border-b border-gray-100"> <p class="text-xs text-gray-500">Signed in as</p> <p id="nav-account-email" class="text-xs font-medium text-gray-800 truncate"></p> </div> <button type="button" id="nav-logout-btn" class="w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-50 transition-colors"> Sign out </button> </div> </div> </div> <!-- Mobile menu button --> <button type="button" class="md:hidden text-gray-600 hover:text-gray-900" id="mobile-menu-btn"> <svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"></path></svg> </button> </div> </div> <!-- Mobile menu --> <div id="mobile-menu" class="md:hidden hidden border-t border-gray-200 bg-white"> <div class="px-4 py-3 space-y-1"> <p class="text-xs font-semibold text-blue-500 uppercase tracking-wider px-2 pt-1">Telecom</p> <a href="/services/telecom/fcc-499a" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">FCC 499A Filing</a> <a href="/services/telecom/stir-shaken" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">STIR/SHAKEN</a> <a href="/services/telecom/ipes-isp" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">FCC Carrier / ISP Registration</a> <a href="/services/telecom/database-management" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Telecom Databases</a> <a href="/services/telecom/state-puc" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">State PUC/PSC</a> <a href="/services/telecom/canada-crtc" class="block px-2 py-2 text-sm font-medium text-blue-600 hover:bg-blue-50 rounded">Canada CRTC Package <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-red-500 text-white ml-1 animate-pulse">HOT</span></a> <p class="text-xs font-semibold text-orange-500 uppercase tracking-wider px-2 pt-3">Trucking / DOT</p> <a href="/services/trucking" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">DOT Compliance Services</a> <a href="/order/dot-compliance" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">MCS-150 / BOC-3 / UCR</a> <a href="/order/trucking-new-carrier" class="block px-2 py-2 text-sm font-medium text-orange-600 hover:bg-orange-50 rounded">New Carrier Setup</a> <a href="/tools/dot-compliance-check" class="block px-2 py-2 text-sm font-medium text-orange-600 hover:bg-orange-50 rounded">DOT Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-orange-500 text-white ml-1">FREE</span></a> <p class="text-xs font-semibold text-purple-500 uppercase tracking-wider px-2 pt-3">Data Privacy</p> <a href="/services/privacy/ccpa-audit" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">CCPA/CPRA Audit</a> <a href="/services/privacy/privacy-policy" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Privacy Policy Review</a> <a href="/services/privacy/data-mapping" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Data Mapping</a> <a href="/services/privacy/breach-response" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Breach Response Plan</a> <p class="text-xs font-semibold text-green-500 uppercase tracking-wider px-2 pt-3">TCPA</p> <a href="/services/tcpa/consent-audit" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Consent Audit</a> <a href="/services/tcpa/dnc-compliance" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">DNC Compliance</a> <a href="/services/tcpa/campaign-review" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Campaign Review</a> <p class="text-xs font-semibold text-teal-500 uppercase tracking-wider px-2 pt-3">Healthcare</p> <a href="/services/healthcare/npi-revalidation" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Medicare Revalidation</a> <a href="/services/healthcare/medicare-enrollment" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Medicare Enrollment (PECOS)</a> <a href="/services/healthcare" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">NPI / NPPES Services</a> <a href="/tools/npi-compliance-check" class="block px-2 py-2 text-sm font-medium text-teal-600 hover:bg-teal-50 rounded">NPI Compliance Check <span class="inline-flex items-center px-1.5 py-0.5 rounded-full text-[9px] font-bold bg-teal-500 text-white ml-1">FREE</span></a> <p class="text-xs font-semibold text-slate-500 uppercase tracking-wider px-2 pt-3">Corporate</p> <a href="/services/corporate/formation" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Business Formation</a> <a href="/services/corporate/state-registration" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">State Registration</a> <a href="/services/corporate/annual-reports" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Annual Reports</a> <a href="/services/corporate/registered-agent" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Registered Agent</a> <div class="border-t border-gray-100 my-2"></div> <a href="/services" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">All Services</a> <a href="/pricing" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Pricing</a> <a href="/tools/contractor-quiz" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Free Tools</a> <a href="/contact" class="block px-2 py-2 text-sm text-gray-700 hover:bg-gray-50 rounded">Contact</a> <a href="/order/formation" class="block mx-2 mt-2 px-4 py-2.5 text-sm font-medium text-white bg-pw-700 hover:bg-pw-800 rounded-lg text-center transition-colors">Form a Business</a> </div> </div> </nav> <main class="flex-1"> <section class="py-16"> <div class="max-w-3xl mx-auto px-4"> <!-- Breadcrumb --> <nav class="text-sm text-gray-500 mb-6"> <a href="/" class="hover:text-gray-700">Home</a> /
<a href="/tools" class="hover:text-gray-700">Free Tools</a> /
<span class="text-gray-900">DOT Compliance Check</span> </nav> <!-- Header --> <h1 class="text-3xl font-bold text-gray-900 mb-3">DOT / FMCSA Compliance Check</h1> <p class="text-lg text-gray-600 mb-4">Look up any motor carrier by USDOT number or name to instantly check MCS-150 status, insurance, operating authority, and safety rating.</p> <!-- Disclaimer --> <div class="bg-orange-50 border border-orange-200 rounded-lg p-4 mb-8"> <p class="text-xs text-gray-500"><strong>Disclaimer:</strong> This tool queries publicly available FMCSA data. While we strive for accuracy, always confirm critical compliance matters directly with FMCSA. This is not legal advice.</p> </div> <!-- Intent selector --> <div class="mb-6"> <p class="text-sm font-semibold text-gray-900 mb-2">What brings you here?</p> <div style="display:flex;gap:10px;flex-wrap:wrap">
<button type="button" class="intent-btn" data-intent="compliance" style="flex:1;min-width:210px;padding:12px 16px;border-radius:10px;border:2px solid #f97316;background:#fff7ed;color:#9a3412;font-weight:700;font-size:14px;cursor:pointer;text-align:left;line-height:1.4">&#9989; I'm staying in business<br><span style="font-weight:400;font-size:12px;color:#9a3412">Check my DOT compliance status</span></button>
<button type="button" class="intent-btn" data-intent="closing" style="flex:1;min-width:210px;padding:12px 16px;border-radius:10px;border:2px solid #e2e8f0;background:#fff;color:#64748b;font-weight:700;font-size:14px;cursor:pointer;text-align:left;line-height:1.4">&#128230; I'm closing my business<br><span style="font-weight:400;font-size:12px;color:#94a3b8">See what to wrap up + sell my trucks</span></button>
</div> </div> <!-- Search Box --> <div class="bg-white border border-gray-200 rounded-xl p-6 shadow-sm mb-8"> <!-- Tabs --> <div class="flex gap-0 mb-5 border-b-2 border-gray-200"> <button type="button" class="dot-tab px-4 py-2 text-sm font-semibold text-orange-600 border-b-2 border-orange-500 -mb-[2px] cursor-pointer" data-tab="dot">Search by DOT #</button> <button type="button" class="dot-tab px-4 py-2 text-sm font-semibold text-gray-500 border-b-2 border-transparent -mb-[2px] cursor-pointer hover:text-gray-700" data-tab="name">Search by Name</button> </div>
<!-- DOT number search --> <div id="tab-dot"> <label for="dot-input" class="block text-sm font-semibold text-gray-900 mb-2">USDOT Number</label> <div class="flex gap-3"> <input type="text" id="dot-input" placeholder="Enter USDOT number (e.g. 1234567)" maxlength="10" class="flex-1 border border-gray-300 rounded-lg px-4 py-3 text-lg font-mono text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-400 focus:border-orange-400"> <button type="button" id="dot-btn" style="padding:12px 24px;background:#f97316;color:#fff;font-weight:600;border-radius:8px;border:none;cursor:pointer;white-space:nowrap;font-size:15px">Check Compliance</button> </div> <p class="text-xs text-gray-500 mt-2">Your USDOT number is assigned by the Federal Motor Carrier Safety Administration. Don't know it? Use the name search tab.</p> </div>
<!-- Name search --> <div id="tab-name" class="hidden"> <label for="name-input" class="block text-sm font-semibold text-gray-900 mb-2">Carrier Name</label> <div class="flex gap-3"> <input type="text" id="name-input" placeholder="Enter carrier name (e.g. Werner Enterprises)" class="flex-1 border border-gray-300 rounded-lg px-4 py-2.5 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-orange-400 focus:border-orange-400"> <button type="button" id="name-btn" style="padding:10px 20px;background:#f3f4f6;color:#374151;font-weight:600;border-radius:8px;border:1px solid #d1d5db;cursor:pointer;white-space:nowrap;font-size:14px">Search</button> </div> <div id="name-results" class="hidden mt-4 max-h-60 overflow-y-auto space-y-2"></div> </div> </div>
<!-- Loading state with progress steps --> <div id="pw-results-anchor"></div><div id="loading" class="hidden py-8"> <div style="max-width:400px;margin:0 auto;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:24px">
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px"> <svg class="animate-spin" style="width:20px;height:20px;color:#f97316" viewBox="0 0 24 24"><circle style="opacity:0.25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" fill="none"></circle><path style="opacity:0.75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg> <span style="font-size:15px;font-weight:600;color:#1a2744" id="loading-title">Running Compliance Check...</span></div>
<div id="loading-steps" style="font-size:13px;color:#475569;line-height:2.2">
<div id="step-fmcsa" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Looking up FMCSA registration...</div>
<div id="step-safety" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Checking safety record...</div>
<div id="step-insurance" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Verifying insurance filings...</div>
<div id="step-authority" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Reviewing operating authority...</div>
<div id="step-state" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Checking state requirements...</div>
<div id="step-entity" style="display:flex;align-items:center;gap:8px"><span style="color:#94a3b8">&#9679;</span> Verifying business entity status...</div>
</div>
</div> </div> <!-- Error state --> <div id="error-box" class="hidden bg-red-50 border border-red-200 rounded-xl p-6 mb-8"> <p class="text-sm text-red-800" id="error-msg"></p> </div> <!-- Results --> <div id="results" class="hidden space-y-4"></div> </div> </section> </main> <section class="py-10 border-t border-gray-100"> <div class="max-w-2xl mx-auto px-4 text-center"> <h2 class="text-lg font-bold text-gray-900 mb-2">Stay ahead of compliance changes</h2> <p class="text-sm text-gray-600 mb-5">Regulatory updates, enforcement trends, and compliance tips. No spam.</p> <button type="button" id="subscribe-btn-footer" class="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-pw-700 text-white text-sm font-medium hover:bg-pw-800 transition-colors"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75"></path></svg>
Join Mailing List
</button> </div> </section> <!-- Subscribe modal --> <div id="subscribe-modal-global" class="fixed inset-0 z-[9999] hidden items-center justify-center bg-black/50 backdrop-blur-sm"> <div class="bg-white rounded-2xl shadow-2xl max-w-md w-full mx-4 p-6"> <div class="flex justify-between items-start mb-4"> <h3 class="text-lg font-semibold text-gray-900">Join our mailing list</h3> <button type="button" id="subscribe-close-global" class="text-gray-400 hover:text-gray-600"> <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path></svg> </button> </div> <form id="subscribe-form-global" class="space-y-4"> <div> <label for="sub-name-g" class="block text-sm font-medium text-gray-700 mb-1">Name <span class="text-gray-400">(optional)</span></label> <input type="text" id="sub-name-g" placeholder="Your name" maxlength="100" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div> <label for="sub-company-g" class="block text-sm font-medium text-gray-700 mb-1">Company <span class="text-gray-400">(optional)</span></label> <input type="text" id="sub-company-g" placeholder="Your company" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div> <label for="sub-email-g" class="block text-sm font-medium text-gray-700 mb-1">Email <span class="text-red-400">*</span></label> <input type="email" id="sub-email-g" required placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none"> </div> <div class="flex items-start gap-2"> <input type="checkbox" id="sub-consent-g" required class="mt-1 rounded border-gray-300 text-pw-600 focus:ring-pw-500"> <label for="sub-consent-g" class="text-xs text-gray-600 leading-relaxed">
I agree to receive compliance updates and service announcements from Performance West Inc. I can unsubscribe at any time. We never share your email.
</label> </div> <!-- Honeypot --> <div class="absolute opacity-0 h-0 overflow-hidden" aria-hidden="true" tabindex="-1"> <label for="sub-website-g">Website</label> <input type="text" id="sub-website-g" name="website" autocomplete="off" tabindex="-1"> </div> <input type="hidden" id="sub-ts-g" value=""> <button type="submit" id="sub-submit-g" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
Subscribe
</button> </form> <div id="subscribe-success-global" class="hidden text-center py-4"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-green-100 flex items-center justify-center"> <svg class="w-6 h-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg> </div> <p class="text-sm font-medium text-gray-900">You're on the list!</p> <p class="text-xs text-gray-500 mt-1">We'll send compliance updates and regulatory alerts.</p> </div> </div> </div> <footer class="border-t border-gray-200 bg-gray-50 mt-auto"> <div class="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> <div class="grid grid-cols-2 md:grid-cols-4 gap-8"> <div> <h4 class="text-sm font-semibold text-gray-900 mb-3">Services</h4> <ul class="space-y-2 text-sm text-gray-600"> <li><a href="/services/telecom" class="hover:text-gray-900">Telecom Compliance</a></li> <li><a href="/services/trucking" class="hover:text-gray-900">DOT / Trucking</a></li> <li><a href="/services/privacy" class="hover:text-gray-900">Data Privacy</a></li> <li><a href="/services/tcpa" class="hover:text-gray-900">TCPA Compliance</a></li> <li><a href="/services/corporate" class="hover:text-gray-900">Corporate Services</a></li> <li><a href="/order/formation" class="font-medium text-pw-700 hover:text-pw-800">Form a Business</a></li> </ul> </div> <div> <h4 class="text-sm font-semibold text-gray-900 mb-3">Free Tools</h4> <ul class="space-y-2 text-sm text-gray-600"> <li><a href="/tools/formation-guide" class="hover:text-gray-900">Formation Guide</a></li> <li><a href="/tools/contractor-quiz" class="hover:text-gray-900">Contractor Quiz</a></li> <li><a href="/tools/privacy-check" class="hover:text-gray-900">Privacy Check</a></li> <li><a href="/tools/tcpa-check" class="hover:text-gray-900">TCPA Check</a></li> <li><a href="/tools/dot-compliance-check" class="hover:text-gray-900">DOT Compliance Check</a></li> </ul> </div> <div> <h4 class="text-sm font-semibold text-gray-900 mb-3">Company</h4> <ul class="space-y-2 text-sm text-gray-600"> <li><a href="/about" class="hover:text-gray-900">About</a></li> <li><a href="/pricing" class="hover:text-gray-900">Pricing</a></li> <li><a href="/contact" class="hover:text-gray-900">Contact</a></li> <li><a href="https://portal.performancewest.net" class="hover:text-gray-900">Client Portal</a></li> <li><a href="/privacy" class="hover:text-gray-900">Privacy Policy</a></li> <li><a href="/terms" class="hover:text-gray-900">Terms of Service</a></li> </ul> </div> <div> <h4 class="text-sm font-semibold text-gray-900 mb-3">Contact</h4> <ul class="space-y-2 text-sm text-gray-600"> <li>Toll Free: 1-888-411-0383</li> <li><a href="mailto:info@performancewest.net" class="hover:text-gray-900">info@performancewest.net</a></li> <li class="text-xs leading-relaxed">525 Randall Ave Ste 100-1195<br>Cheyenne, WY 82001</li> <li><button type="button" id="footer-support-link" class="hover:text-gray-900">Open Support Ticket</button></li> </ul> </div> </div> <div class="mt-8 pt-8 border-t border-gray-200 flex flex-col items-center gap-3 text-sm text-gray-500"> <img src="/images/logo.png" alt="Performance West" class="h-12 w-auto" width="100" height="84" loading="lazy"> <p>&copy; 2026 Performance West Inc. - Professional compliance consulting.</p> <p class="text-xs text-gray-400">Performance West provides compliance consulting services. We do not provide legal advice or legal representation.</p> </div> </div> </footer> <!-- Floating help button --><button type="button" id="support-fab" aria-label="Open support" class="fixed bottom-6 left-6 z-[9999] w-14 h-14 rounded-full bg-pw-700 text-white shadow-lg hover:bg-pw-800 transition-all hover:scale-105 flex items-center justify-center"> <svg id="support-fab-icon-open" class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path> </svg> <svg id="support-fab-icon-close" class="w-6 h-6 hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <!-- Slide-out panel --> <div id="support-panel" class="fixed bottom-24 left-6 z-[9998] w-[380px] max-w-[calc(100vw-2rem)] bg-white rounded-xl shadow-2xl border border-gray-200 transform translate-y-4 opacity-0 pointer-events-none transition-all duration-200 ease-out"> <div class="px-5 py-4 border-b border-gray-100 bg-gray-50 rounded-t-xl"> <h3 class="text-base font-semibold text-gray-900">How can we help?</h3> <p class="text-xs text-gray-500 mt-0.5">Choose a category and tell us what you need.</p> </div> <!-- Category selector (step 1) --> <div id="support-step-categories" class="p-4 space-y-2"> <button type="button" data-category="question" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Ask a Question</span> <span class="block text-xs text-gray-500">About our compliance services or process</span> </div> </div> </button> <button type="button" data-category="support" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-green-100 text-green-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M18.364 5.636l-3.536 3.536m0 5.656l3.536 3.536M9.172 9.172L5.636 5.636m3.536 9.192l-3.536 3.536M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-5 0a4 4 0 11-8 0 4 4 0 018 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Get Support</span> <span class="block text-xs text-gray-500">Help with an ongoing engagement</span> </div> </div> </button> <button type="button" data-category="issue" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-red-100 text-red-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Report an Issue</span> <span class="block text-xs text-gray-500">Something isn't right with a deliverable</span> </div> </div> </button> <button type="button" data-category="service_request" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-purple-100 text-purple-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Request a Service</span> <span class="block text-xs text-gray-500">Start a new compliance engagement</span> </div> </div> </button> <button type="button" data-category="quote" class="support-cat-btn w-full text-left px-4 py-3 rounded-lg border border-gray-200 hover:border-pw-300 hover:bg-pw-50 transition-colors group"> <div class="flex items-center gap-3"> <span class="flex-shrink-0 w-8 h-8 rounded-full bg-amber-100 text-amber-600 flex items-center justify-center"> <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg> </span> <div> <span class="text-sm font-medium text-gray-900 group-hover:text-pw-700">Request a Quote</span> <span class="block text-xs text-gray-500">Get pricing for a complex engagement</span> </div> </div> </button> <!-- Sign-in link (hidden when logged in) --> <div id="support-signin-link" class="pt-2 border-t border-gray-100 mt-2"> <button type="button" id="support-signin-btn" class="w-full flex items-center justify-center gap-2 px-4 py-2 text-xs text-gray-500 hover:text-pw-700 transition-colors"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg>
Already a client? <span class="font-medium text-pw-600">Sign in</span> </button> </div> </div> <!-- Ticket form (step 2a) --> <form id="support-step-form" class="hidden p-4"> <button type="button" id="support-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-3"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
Back
</button> <div id="support-category-badge" class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-pw-100 text-pw-700 mb-3"></div> <div class="space-y-3"> <div> <label for="support-name" class="block text-xs font-medium text-gray-700 mb-1">Name <span class="text-gray-400">(optional)</span></label> <input type="text" id="support-name" name="name" placeholder="Your name" maxlength="100" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-email" class="block text-xs font-medium text-gray-700 mb-1">Email <span class="text-gray-400">(for follow-up)</span></label> <input type="email" id="support-email" name="email" placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-subject" class="block text-xs font-medium text-gray-700 mb-1">Subject <span class="text-red-400">*</span></label> <input type="text" id="support-subject" name="subject" required minlength="3" maxlength="200" placeholder="Brief summary" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="support-message" class="block text-xs font-medium text-gray-700 mb-1">Message <span class="text-red-400">*</span></label> <textarea id="support-message" name="message" required minlength="10" maxlength="5000" rows="4" placeholder="Describe your question, issue, or request..." class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow resize-y"></textarea> <p class="text-[10px] text-gray-400 mt-0.5 text-right"><span id="support-char-count">0</span> / 5000</p> </div> <button type="submit" id="support-submit-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
Submit
</button> </div> </form> <!-- Opportunity form (step 2b) --> <form id="support-step-opportunity" class="hidden p-4"> <button type="button" id="opportunity-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-3"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
Back
</button> <div id="opportunity-category-badge" class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-pw-100 text-pw-700 mb-3"></div> <div class="space-y-3"> <div> <label for="opp-name" class="block text-xs font-medium text-gray-700 mb-1">Name <span class="text-red-400">*</span></label> <input type="text" id="opp-name" name="name" required minlength="2" maxlength="100" placeholder="Your name" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-email" class="block text-xs font-medium text-gray-700 mb-1">Email <span class="text-red-400">*</span></label> <input type="email" id="opp-email" name="email" required placeholder="you@company.com" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-company" class="block text-xs font-medium text-gray-700 mb-1">Company <span class="text-gray-400">(optional)</span></label> <input type="text" id="opp-company" name="company" placeholder="Company name" maxlength="200" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-phone" class="block text-xs font-medium text-gray-700 mb-1">Phone <span class="text-gray-400">(optional)</span></label> <input type="tel" id="opp-phone" name="phone" placeholder="(555) 555-1234" maxlength="30" class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow"> </div> <div> <label for="opp-service" class="block text-xs font-medium text-gray-700 mb-1">Service interest <span class="text-red-400">*</span></label> <select id="opp-service" name="service_slug" required class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow bg-white"> <option value="" disabled selected>Select a service...</option> <option value="canada-crtc">Canada CRTC Carrier Package</option> <option value="llc-formation">LLC Formation</option> <option value="corporation-formation">Corporation Formation</option> <option value="registered-agent">Registered Agent</option> <option value="compliance-audit">Compliance Audit</option> <option value="other">Other / Not sure</option> </select> </div> <div> <label for="opp-details" class="block text-xs font-medium text-gray-700 mb-1">Details <span class="text-gray-400">(optional)</span></label> <textarea id="opp-details" name="details" maxlength="5000" rows="3" placeholder="Tell us about your project or what you need..." class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-pw-500 focus:border-pw-500 outline-none transition-shadow resize-y"></textarea> </div> <button type="submit" id="opp-submit-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors disabled:opacity-50 disabled:cursor-not-allowed">
Submit Request
</button> </div> </form> <!-- Sign-in prompt (step 2c) --> <div id="support-step-signin" class="hidden p-6"> <button type="button" id="signin-back-btn" class="inline-flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-4"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7"></path></svg>
Back
</button> <div class="text-center"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-blue-100 flex items-center justify-center"> <svg class="w-6 h-6 text-blue-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"></path></svg> </div> <h4 class="text-sm font-semibold text-gray-900 mb-1">Sign in for support</h4> <p class="text-xs text-gray-500 mb-5">Sign in to access your client portal where you can view your orders, submit support requests, and manage your services.</p> <button type="button" id="signin-auth-btn" class="w-full py-2.5 px-4 bg-pw-700 text-white text-sm font-medium rounded-lg hover:bg-pw-800 transition-colors mb-3">
Sign In
</button> <button type="button" id="signin-guest-btn" class="text-xs text-gray-500 hover:text-gray-700 transition-colors">
Continue as guest &rarr;
</button> </div> </div> <!-- Success state (step 3) --> <div id="support-step-success" class="hidden p-6 text-center"> <div class="w-12 h-12 mx-auto mb-3 rounded-full bg-green-100 flex items-center justify-center"> <svg class="w-6 h-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path></svg> </div> <h4 class="text-sm font-semibold text-gray-900 mb-1">Request received</h4> <p id="support-success-message" class="text-xs text-gray-500 mb-4">We'll get back to you within one business day.</p> <p id="support-ticket-id" class="text-xs text-gray-400 mb-4 hidden">Ref: <span></span></p> <button type="button" id="support-new-ticket-btn" class="text-xs text-pw-600 hover:text-pw-700 font-medium">Submit another request</button> </div> </div> <!-- Auth modal --> <div id="auth-modal-backdrop" class="fixed inset-0 z-[200] bg-black/50 backdrop-blur-sm hidden items-center justify-center p-4" role="dialog" aria-modal="true" aria-labelledby="auth-modal-title"> <div id="auth-modal" class="relative w-full max-w-sm bg-white rounded-2xl shadow-2xl overflow-hidden"> <button id="auth-modal-close" type="button" aria-label="Close" class="absolute top-4 right-4 text-gray-400 hover:text-gray-600 transition-colors z-10"> <svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> <div id="auth-tabs" class="flex border-b border-gray-100"> <button type="button" id="auth-tab-login" class="auth-tab flex-1 py-4 text-sm font-semibold text-pw-700 border-b-2 border-pw-600 transition-colors">
Sign In
</button> <button type="button" id="auth-tab-register" class="auth-tab flex-1 py-4 text-sm font-semibold text-gray-400 border-b-2 border-transparent hover:text-gray-600 transition-colors">
Create Account
</button> </div> <div class="px-6 py-6"> <form id="auth-login-form" class="space-y-4" novalidate> <div> <label for="auth-login-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-login-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <div> <div class="flex items-center justify-between mb-1"> <label for="auth-login-password" class="text-sm font-medium text-gray-700">Password</label> <button type="button" id="auth-forgot-link" class="text-xs text-pw-600 hover:text-pw-800 underline underline-offset-2">
Forgot password?
</button> </div> <input type="password" id="auth-login-password" autocomplete="current-password" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="••••••••"> </div> <p id="auth-login-err" class="hidden text-xs text-red-600 font-medium"></p> <button type="submit" id="auth-login-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
Sign In
</button> </form> <form id="auth-register-form" class="space-y-4 hidden" novalidate> <div> <label for="auth-reg-name" class="block text-sm font-medium text-gray-700 mb-1">Your Name</label> <input type="text" id="auth-reg-name" autocomplete="name" class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="Full name"> </div> <div> <label for="auth-reg-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-reg-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <div> <label for="auth-reg-password" class="block text-sm font-medium text-gray-700 mb-1">Password</label> <input type="password" id="auth-reg-password" autocomplete="new-password" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="At least 8 characters"> </div> <p id="auth-reg-err" class="hidden text-xs text-red-600 font-medium"></p> <button type="submit" id="auth-reg-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
Create Account
</button> </form> <div id="auth-forgot-form" class="hidden"> <button type="button" id="auth-back-to-login" class="flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 mb-4"> <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"></path></svg>
Back to sign in
</button> <h3 class="text-base font-semibold text-gray-900 mb-1">Reset your password</h3> <p class="text-sm text-gray-500 mb-4">Enter your email and we'll send you a reset link.</p> <form id="auth-forgot-email-form" class="space-y-4" novalidate> <div> <label for="auth-forgot-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label> <input type="email" id="auth-forgot-email" autocomplete="email" required class="w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-pw-500 focus:border-pw-500 transition-colors" placeholder="you@company.com"> </div> <p id="auth-forgot-err" class="hidden text-xs text-red-600 font-medium"></p> <p id="auth-forgot-ok" class="hidden text-xs text-green-700 font-medium"></p> <button type="submit" id="auth-forgot-btn" class="w-full py-2.5 rounded-lg bg-pw-700 text-white text-sm font-semibold hover:bg-pw-800 transition-colors disabled:opacity-50">
Send reset link
</button> </form> </div> </div> </div> </div> <!-- Tawk.to Live Chat --> <script>
var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
// Mobile UX: suppress proactive popup text overlays on small screens.
Tawk_API.onLoad = function() {
if (window.matchMedia('(max-width: 768px)').matches) {
Tawk_API.hideWidget();
}
};
(function(){
var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
s1.async=true;
s1.src='https://embed.tawk.to/69d5a9ca0d1c3f1c37998081/1jll9ufph';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
</script> <script>
// DOT Compliance Checker - inline enhancement script
(function(){
// Scroll to results anchor when loading state appears
var loadingEl = document.getElementById("loading");
if (loadingEl) {
new MutationObserver(function() {
if (!loadingEl.classList.contains("hidden")) {
document.getElementById("pw-results-anchor").scrollIntoView({ behavior: "smooth", block: "start" });
}
}).observe(loadingEl, { attributes: true, attributeFilter: ["class"] });
}
var API = window.__PW_API || "https://api.performancewest.net";
// --- Tab switching ---
document.querySelectorAll(".dot-tab").forEach(function(tab) {
tab.addEventListener("click", function() {
document.querySelectorAll(".dot-tab").forEach(function(t) {
t.classList.remove("text-orange-600", "border-orange-500");
t.classList.add("text-gray-500", "border-transparent");
});
tab.classList.remove("text-gray-500", "border-transparent");
tab.classList.add("text-orange-600", "border-orange-500");
document.getElementById("tab-dot").classList.toggle("hidden", tab.dataset.tab !== "dot");
document.getElementById("tab-name").classList.toggle("hidden", tab.dataset.tab !== "name");
});
});
// --- DOT lookup ---
var dotInput = document.getElementById("dot-input");
var dotBtn = document.getElementById("dot-btn");
var errorBox = document.getElementById("error-box");
var errorMsg = document.getElementById("error-msg");
var resultsEl = document.getElementById("results");
dotBtn.addEventListener("click", runDotCheck);
dotInput.addEventListener("keydown", function(e) { if (e.key === "Enter") runDotCheck(); });
// --- Intent selector (staying in business vs closing) ---
var pwIntent = "compliance";
var intentBtns = document.querySelectorAll(".intent-btn");
function setIntent(intent) {
pwIntent = intent;
intentBtns.forEach(function(b) {
var on = b.dataset.intent === intent;
var closing = b.dataset.intent === "closing";
b.style.borderColor = on ? (closing ? "#16a34a" : "#f97316") : "#e2e8f0";
b.style.background = on ? (closing ? "#f0fdf4" : "#fff7ed") : "#fff";
b.style.color = on ? (closing ? "#166534" : "#9a3412") : "#64748b";
var sub = b.querySelector("span");
if (sub) sub.style.color = on ? (closing ? "#166534" : "#9a3412") : "#94a3b8";
});
// Re-render if a result is already on screen so the mode swaps live
if (!resultsEl.classList.contains("hidden") && window.__pwLastData) renderResults(window.__pwLastData);
}
intentBtns.forEach(function(b) { b.addEventListener("click", function() { setIntent(b.dataset.intent); }); });
function markStep(stepId, status) {
var el = document.getElementById(stepId);
if (!el) return;
var dot = el.querySelector("span");
if (status === "done") {
dot.style.color = "#059669";
dot.innerHTML = "&#10004;";
el.style.color = "#059669";
} else if (status === "active") {
dot.style.color = "#f97316";
dot.innerHTML = "&#9679;";
el.style.color = "#1a2744";
el.style.fontWeight = "600";
} else if (status === "pending") {
dot.style.color = "#94a3b8";
dot.innerHTML = "&#9679;";
el.style.color = "#94a3b8";
el.style.fontWeight = "400";
}
}
function resetSteps() {
["step-fmcsa","step-safety","step-insurance","step-authority","step-state","step-entity"].forEach(function(id) { markStep(id, "pending"); });
}
async function animateSteps() {
var steps = [
{ id: "step-fmcsa", delay: 0 },
{ id: "step-safety", delay: 1200 },
{ id: "step-insurance", delay: 2400 },
{ id: "step-authority", delay: 3600 },
{ id: "step-state", delay: 5000 },
{ id: "step-entity", delay: 7000 },
];
for (var i = 0; i < steps.length; i++) {
await new Promise(function(r) { setTimeout(r, i === 0 ? 300 : steps[i].delay - steps[i-1].delay); });
if (i > 0) markStep(steps[i-1].id, "done");
markStep(steps[i].id, "active");
}
}
async function runDotCheck() {
var raw = dotInput.value.trim().replace(/\D/g, "");
if (!raw) { showError("Please enter a DOT number."); return; }
resetSteps();
loadingEl.classList.remove("hidden");
resultsEl.classList.add("hidden");
errorBox.classList.add("hidden");
// Animate steps while the API call runs
var animPromise = animateSteps();
try {
var res = await fetch(API + "/api/v1/dot/lookup?dot=" + raw);
var data = await res.json();
if (!res.ok) throw new Error(data.error || "Lookup failed");
// Mark all steps done
["step-fmcsa","step-safety","step-insurance","step-authority","step-state","step-entity"].forEach(function(id) { markStep(id, "done"); });
var title = document.getElementById("loading-title");
if (title) title.textContent = "Complete!";
await new Promise(function(r) { setTimeout(r, 500); });
renderResults(data);
} catch (e) {
showError(e.message || "Something went wrong. Try again.");
} finally {
loadingEl.classList.add("hidden");
}
}
// --- Name search ---
var nameInput = document.getElementById("name-input");
var nameBtn = document.getElementById("name-btn");
var nameResults = document.getElementById("name-results");
nameBtn.addEventListener("click", runNameSearch);
nameInput.addEventListener("keydown", function(e) { if (e.key === "Enter") runNameSearch(); });
async function runNameSearch() {
var name = nameInput.value.trim();
if (!name || name.length < 2) return;
nameResults.classList.remove("hidden");
nameResults.innerHTML = '<p class="text-xs text-gray-500">Searching...</p>';
try {
var res = await fetch(API + "/api/v1/dot/search?name=" + encodeURIComponent(name));
var data = await res.json();
if (data.error) {
nameResults.innerHTML = '<p class="text-sm text-red-600">' + data.error + '</p>';
return;
}
if (!data.results || !Array.isArray(data.results) || data.results.length === 0) {
nameResults.innerHTML = '<p class="text-sm text-gray-500">No carriers found matching "' + name + '"</p>';
return;
}
var html = "";
data.results.forEach(function(r) {
var overdue = r.mcs150_parsed && new Date(r.mcs150_parsed) < new Date(Date.now() - 2 * 365.25 * 86400000);
html += '<div class="name-result p-3 border border-gray-200 rounded-lg cursor-pointer hover:border-orange-400 hover:bg-orange-50 transition-colors" data-dot="' + r.dot_number + '">';
html += '<div class="text-sm font-semibold text-gray-900">' + r.legal_name + '</div>';
html += '<div class="text-xs text-gray-500 mt-1">';
html += 'DOT# ' + r.dot_number;
if (r.phy_city) html += ' &middot; ' + r.phy_city + ', ' + r.phy_state;
if (r.nbr_power_unit) html += ' &middot; ' + r.nbr_power_unit + ' trucks';
if (overdue) html += ' &middot; <span class="text-red-600 font-semibold">MCS-150 OVERDUE</span>';
html += '</div></div>';
});
nameResults.innerHTML = html;
nameResults.querySelectorAll(".name-result").forEach(function(el) {
el.addEventListener("click", function() {
dotInput.value = el.dataset.dot;
document.querySelector('.dot-tab[data-tab="dot"]').click();
runDotCheck();
});
});
} catch (e) {
nameResults.innerHTML = '<p class="text-sm text-red-600">Search failed. Try again.</p>';
}
}
function showError(msg) {
errorMsg.textContent = msg;
errorBox.classList.remove("hidden");
resultsEl.classList.add("hidden");
}
var statusIcons = {
green: '<svg class="w-6 h-6 flex-shrink-0" fill="none" stroke="#16a34a" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>',
yellow: '<svg class="w-6 h-6 flex-shrink-0" fill="none" stroke="#ca8a04" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>',
red: '<svg class="w-6 h-6 flex-shrink-0" fill="none" stroke="#dc2626" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"/></svg>',
unknown: '<svg class="w-6 h-6 flex-shrink-0" fill="none" stroke="#6b7280" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z"/></svg>'
};
var checkBg = { green: "bg-green-50 border border-green-200", yellow: "bg-yellow-50 border border-yellow-200", red: "bg-red-50 border border-red-200", unknown: "bg-gray-50 border border-gray-200" };
var labelColor = { green: "text-green-800", yellow: "text-yellow-800", red: "text-red-800", unknown: "text-gray-700" };
// ── Business close-out (winding down) ──────────────────────────────
var STATE_CLOSEOUT = {
CA: "Cancel your California Motor Carrier Permit (MCP) and CA# with the DMV / CHP.",
OR: "Close your Oregon Weight-Mile Tax account with ODOT and file a final mileage return.",
NY: "Cancel your New York HUT registration and destroy your HUT decals.",
KY: "Cancel your Kentucky KYU number so you stop accruing quarterly filings.",
NM: "Close your New Mexico Weight-Distance Tax account.",
CT: "Close your Connecticut Highway Use Fee account."
};
function buildCloseoutHtml(data) {
var state = data.phy_state || "";
var orderUrl = "/order/dot-compliance?dot=" + data.dot_number + "&services=carrier-closeout&intent=closing";
var h = '';
// Done-for-you trucking wrap-up service ($199)
h += '<div style="background:#f0fdf4;border:2px solid #16a34a;border-radius:12px;padding:24px;margin-top:8px">';
h += '<h3 style="font-size:19px;font-weight:800;color:#166534;margin:0 0 6px">Let us do all the shutdown paperwork</h3>';
h += '<p style="font-size:14px;color:#374151;margin:0 0 14px">Closing ' + data.legal_name + '? We file <strong>everything</strong> it takes to shut down properly: the final MCS-150, authority revocation, UCR, IFTA/IRP and your state account closures. No Login.gov, no portals, no forms for you to figure out. You sign once and we take it from there.</p>';
h += '<div style="background:#fff;border:1px solid #bbf7d0;border-radius:8px;padding:14px 16px;margin:0 0 18px">';
h += '<p style="font-size:13px;font-weight:700;color:#166534;margin:0 0 8px">The only things left for you:</p>';
h += '<ul style="margin:0;padding:0 0 0 18px;font-size:13px;color:#374151;line-height:1.7">';
h += '<li>Cancel your insurance once we give the go-ahead (after your authority is revoked, so FMCSA doesn&rsquo;t flag a lapse).</li>';
h += '<li>Turn in or destroy your plates and IFTA decals when your state asks.</li>';
h += '<li>Keep your DOT records on file for 3 years, just in case.</li>';
h += '</ul></div>';
h += '<div style="display:flex;align-items:center;gap:16px;flex-wrap:wrap">';
h += '<a href="' + orderUrl + '" style="display:inline-block;padding:14px 34px;background:#16a34a;color:#fff;font-weight:800;border-radius:8px;text-decoration:none;font-size:16px;box-shadow:0 4px 12px rgba(22,163,74,0.3)">Start My Wrap-Up - $199 &rarr;</a>';
h += '<span style="font-size:13px;color:#15803d;font-weight:600">Flat $199. We file everything for you.</span>';
h += '</div>';
// Entity dissolution add-on + liability caveat
h += '<div style="margin-top:16px;padding-top:14px;border-top:1px solid #dcfce7">';
h += '<p style="font-size:13px;color:#374151;margin:0;line-height:1.6"><strong>Also closing the business entity?</strong> Add <strong>LLC/Corp dissolution + final report for just $49</strong> at checkout (plus your state&rsquo;s filing fee). <span style="color:#b91c1c">Don&rsquo;t dissolve if you have any outstanding lawsuits, liens, or judgments - settle those first; dissolving with open liabilities can put your personal assets at risk.</span></p>';
h += '</div>';
h += '</div>';
// Sell-your-trucks box (green) - quick cash / marketplace / both, one shared form
var optStyle = "flex:1;min-width:180px;padding:14px;border-radius:10px;border:2px solid #86efac;background:#fff;color:#166534;font-weight:700;font-size:14px;cursor:pointer;text-align:left;line-height:1.4";
var subStyle = "font-weight:400;font-size:12px;color:#15803d";
var inStyle = "width:100%;padding:9px 12px;font-size:13px;border:1px solid #bbf7d0;border-radius:8px;outline:none;margin-bottom:8px;box-sizing:border-box";
h += '<div style="background:#f0fdf4;border:2px solid #86efac;border-radius:12px;padding:24px;margin-top:8px">';
h += '<h3 style="font-size:17px;font-weight:700;color:#166534;margin:0 0 4px">Looking to sell your trucks?</h3>';
h += '<p style="font-size:14px;color:#374151;margin:0 0 14px">Pick what fits your timeline - or do both and take the better deal:</p>';
h += '<div style="display:flex;gap:10px;flex-wrap:wrap;margin-bottom:4px">';
h += '<button type="button" class="sell-opt" data-opt="quickcash" style="' + optStyle + '">&#128176; Quick cash now<br><span style="' + subStyle + '">Instant offer, pickup in 48&ndash;72 hrs</span></button>';
h += '<button type="button" class="sell-opt" data-opt="marketplace" style="' + optStyle + '">&#127991;&#65039; List &amp; wait for top dollar<br><span style="' + subStyle + '">We&rsquo;ll send the best marketplaces</span></button>';
h += '<button type="button" class="sell-opt" data-opt="both" style="' + optStyle + '">&#129309; Try both<br><span style="' + subStyle + '">A cash offer AND the listing guide</span></button>';
h += '<button type="button" class="sell-opt" data-opt="notselling" style="' + optStyle + '">&#128683; Not selling<br><span style="' + subStyle + '">Keeping them or already sold</span></button>';
h += '</div>';
h += '<p id="sell-note" style="display:none;font-size:13px;color:#166534;margin:12px 0 0;font-weight:600">No problem - your wrap-up handles the DOT side. We&rsquo;re here if you change your mind.</p>';
h += '<div id="sell-form" style="display:none;margin-top:14px;padding-top:14px;border-top:1px solid #dcfce7">';
h += '<p id="sell-intro" style="font-size:13px;color:#374151;margin:0 0 10px"></p>';
h += '<input type="text" id="sell-company" placeholder="Company name" value="' + (data.legal_name || '') + '" style="' + inStyle + '">';
h += '<input type="text" id="sell-name" placeholder="Your first &amp; last name" style="' + inStyle + '">';
h += '<input type="tel" id="sell-phone" placeholder="Phone number" value="' + (data.telephone || '') + '" style="' + inStyle + '">';
h += '<input type="email" id="sell-email" placeholder="Email address" style="' + inStyle + '">';
h += '<textarea id="sell-truck" rows="2" placeholder="Year / make / model / mileage / condition" style="' + inStyle + ';resize:vertical;margin-bottom:10px"></textarea>';
h += '<button type="button" id="sell-submit" style="padding:11px 28px;background:#16a34a;color:#fff;font-weight:700;border-radius:8px;font-size:14px;border:none;cursor:pointer">Submit &rarr;</button>';
h += '<p id="sell-status" class="text-xs hidden" style="margin-top:8px"></p>';
h += '</div>';
h += '</div>';
return h;
}
// Shared lead submitter - mirrors the insurance lead flow
function pwSubmitLead(o) {
o.statusEl.classList.add("hidden");
if (o.requireEmail && !o.email) {
o.statusEl.textContent = "Please enter your email.";
o.statusEl.className = "text-xs text-red-600";
o.statusEl.classList.remove("hidden");
return;
}
o.btn.disabled = true;
var origText = o.btn.textContent;
o.btn.textContent = "Submitting...";
fetch(API + "/api/v1/tickets", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ category: o.category, subject: o.subject, message: o.message, email: o.email, name: o.name })
}).then(function(r) {
if (!r.ok) throw new Error("Failed");
o.statusEl.textContent = o.okMsg;
o.statusEl.className = "text-xs text-green-700";
o.statusEl.classList.remove("hidden");
o.btn.textContent = "Submitted";
if (o.onOk) o.onOk();
}).catch(function() {
o.statusEl.textContent = "Something went wrong. Email info@performancewest.net instead.";
o.statusEl.className = "text-xs text-red-600";
o.statusEl.classList.remove("hidden");
o.btn.disabled = false;
o.btn.textContent = origText;
});
}
function wireCloseout(data) {
var loc = (data.phy_city || "") + ", " + (data.phy_state || "");
var fleet = data.fleet ? (data.fleet.power_units + " trucks, " + data.fleet.drivers + " drivers") : "unknown";
var MODE = {
quickcash: {
intro: "We&rsquo;ll connect you with a vetted truck-buying partner for a no-obligation cash offer. Tell us what you&rsquo;re selling:",
truck: true, btn: "Get My Cash Offer &rarr;", category: "truck_sale_quickcash",
ok: "Got it - a truck buyer will reach out with a cash offer.", subj: "Truck Sale (Quick Cash)",
},
marketplace: {
intro: "Smart move - a private/marketplace sale usually nets more than a quick buyout. We&rsquo;ll email you our guide to the best truck marketplaces and how to list for top dollar.",
truck: false, btn: "Email Me the Marketplace Guide &rarr;", category: "truck_sale_marketplace",
ok: "Done! Watch your inbox for our truck-marketplace guide.", subj: "Truck Sale (Marketplace guide)",
},
both: {
intro: "Best of both - we&rsquo;ll line up a cash offer AND send you the marketplace guide so you can compare and take the better deal. Tell us what you&rsquo;re selling:",
truck: true, btn: "Get a Cash Offer + the Guide &rarr;", category: "truck_sale_both",
ok: "Done! We&rsquo;ll line up a cash offer and send the marketplace guide so you can compare.", subj: "Truck Sale (Both - cash offer + marketplace)",
},
};
var current = null;
var form = document.getElementById("sell-form");
var note = document.getElementById("sell-note");
document.querySelectorAll(".sell-opt").forEach(function(b) {
b.addEventListener("click", function() {
document.querySelectorAll(".sell-opt").forEach(function(x) {
x.style.background = x === b ? "#dcfce7" : "#fff";
});
if (b.dataset.opt === "notselling") {
current = null;
if (form) form.style.display = "none";
if (note) note.style.display = "block";
return;
}
if (note) note.style.display = "none";
current = b.dataset.opt;
var m = MODE[current];
if (form) form.style.display = "block";
document.getElementById("sell-intro").innerHTML = m.intro;
document.getElementById("sell-truck").style.display = m.truck ? "block" : "none";
document.getElementById("sell-submit").innerHTML = m.btn;
document.getElementById("sell-status").classList.add("hidden");
});
});
var sBtn = document.getElementById("sell-submit");
if (sBtn) sBtn.addEventListener("click", function() {
if (!current) return;
var m = MODE[current];
var company = document.getElementById("sell-company").value.trim();
var name = document.getElementById("sell-name").value.trim();
var phone = document.getElementById("sell-phone").value.trim();
var email = document.getElementById("sell-email").value.trim();
var truck = document.getElementById("sell-truck").value.trim();
var statusEl = document.getElementById("sell-status");
if (!name) {
statusEl.textContent = "Please enter your first & last name.";
statusEl.className = "text-xs text-red-600"; statusEl.classList.remove("hidden");
return;
}
pwSubmitLead({
category: m.category, requireEmail: true, email: email, name: name,
btn: sBtn, statusEl: statusEl, okMsg: m.ok,
subject: m.subj + " - " + data.legal_name + " (DOT " + data.dot_number + ")",
message: [m.subj + " lead from DOT Compliance Checker.", "",
"Carrier: " + (company || data.legal_name), "DOT#: " + data.dot_number, "Location: " + loc, "Fleet: " + fleet,
(m.truck ? "Vehicle(s): " + (truck || "not specified") : null), "",
"Contact: " + name, "Email: " + email, "Phone: " + (phone || data.telephone || "not provided")]
.filter(function(x) { return x !== null; }).join("\n"),
});
});
}
function renderResults(data) {
if (!data || !data.legal_name) {
showError("No data returned. The carrier may not exist or the lookup timed out.");
return;
}
window.__pwLastData = data;
var html = '';
// Entity header card
html += '<div class="bg-white border border-gray-200 rounded-xl p-6 shadow-sm">';
html += '<div class="flex items-start justify-between">';
html += '<div>';
html += '<p class="text-xs text-gray-500 uppercase tracking-wider mb-1">Carrier</p>';
html += '<h2 class="text-xl font-bold text-gray-900">' + data.legal_name + '</h2>';
if (data.dba_name) html += '<p class="text-sm text-gray-500 mt-1">d/b/a ' + data.dba_name + '</p>';
var metaParts = [];
if (data.phy_city) metaParts.push(data.phy_city + ', ' + data.phy_state);
if (data.fleet && data.fleet.power_units) metaParts.push(data.fleet.power_units + ' power units');
if (data.fleet && data.fleet.drivers) metaParts.push(data.fleet.drivers + ' drivers');
if (metaParts.length) html += '<p class="text-sm text-gray-500 mt-1">' + metaParts.join(' &middot; ') + '</p>';
html += '</div>';
html += '<div class="text-right">';
html += '<p class="text-xs text-gray-500 uppercase tracking-wider mb-1">USDOT</p>';
html += '<p class="text-lg font-mono font-bold text-orange-600">' + data.dot_number + '</p>';
html += '</div></div></div>';
// Summary bar
var s = data.summary || {};
html += '<div class="flex gap-4 p-4 bg-white border border-gray-200 rounded-xl shadow-sm justify-center">';
if (s.red) html += '<div class="text-sm font-semibold flex items-center gap-1.5 text-red-600">' + statusIcons.red + ' ' + s.red + ' issue' + (s.red > 1 ? 's' : '') + '</div>';
if (s.yellow) html += '<div class="text-sm font-semibold flex items-center gap-1.5 text-yellow-600">' + statusIcons.yellow + ' ' + s.yellow + ' warning' + (s.yellow > 1 ? 's' : '') + '</div>';
if (s.green) html += '<div class="text-sm font-semibold flex items-center gap-1.5 text-green-600">' + statusIcons.green + ' ' + s.green + ' passed</div>';
html += '</div>';
// Check cards
(data.checks || []).forEach(function(c) {
var st = c.status || 'unknown';
html += '<div class="rounded-xl p-4 flex gap-3 items-start ' + (checkBg[st] || checkBg.unknown) + '">';
html += (statusIcons[st] || statusIcons.unknown);
html += '<div>';
html += '<div class="font-semibold text-sm ' + (labelColor[st] || labelColor.unknown) + '">' + c.label + '</div>';
html += '<div class="text-sm text-gray-700 leading-relaxed mt-0.5">' + c.detail + '</div>';
// No external links - keep users on our site
html += '</div></div>';
});
if (pwIntent === "closing") {
html += buildCloseoutHtml(data);
} else {
// Insurance lead capture - auto-checked if insurance issue found
var hasInsuranceIssue = (data.checks || []).some(function(c) {
return (c.id === "insurance" || c.id === "insurance_bipd" || c.id === "insurance_cargo" || c.id === "insurance_bond") && c.status === "red";
});
if (hasInsuranceIssue) {
html += '<div style="background:#eff6ff;border:2px solid #93c5fd;border-radius:12px;padding:20px;margin-top:8px">';
html += '<label style="display:flex;align-items:flex-start;gap:12px;cursor:pointer">';
html += '<input type="checkbox" id="ins-lead-check" checked style="margin-top:4px;width:20px;height:20px;accent-color:#2563eb">';
html += '<div>';
html += '<span style="font-weight:700;color:#1e3a5f;font-size:14px">Get a free trucking insurance quote</span>';
html += '<p style="font-size:12px;color:#1d4ed8;margin-top:4px">Your FMCSA insurance filing shows a gap. We can connect you with a licensed trucking insurance agent to get you properly covered - no obligation.</p>';
html += '</div></label>';
html += '<div id="ins-lead-form" style="margin-top:12px;margin-left:32px">';
html += '<input type="text" id="ins-lead-name" placeholder="Your name" value="' + (data.legal_name || '') + '" style="width:100%;padding:8px 12px;font-size:13px;border:1px solid #bfdbfe;border-radius:8px;outline:none;margin-bottom:8px">';
html += '<input type="email" id="ins-lead-email" placeholder="Email address" style="width:100%;padding:8px 12px;font-size:13px;border:1px solid #bfdbfe;border-radius:8px;outline:none;margin-bottom:8px">';
html += '<input type="tel" id="ins-lead-phone" placeholder="Phone number" value="' + (data.telephone || '') + '" style="width:100%;padding:8px 12px;font-size:13px;border:1px solid #bfdbfe;border-radius:8px;outline:none;margin-bottom:8px">';
html += '<button type="button" id="ins-lead-submit" style="padding:8px 24px;background:#2563eb;color:#fff;font-weight:600;border-radius:8px;font-size:13px;border:none;cursor:pointer">Request Insurance Quote</button>';
html += '<p id="ins-lead-status" class="text-xs hidden"></p>';
html += '</div></div>';
}
// CTA
var redCount = (s.red || 0);
var recommendedServices = [];
// Map checks to recommended service slugs
(data.checks || []).forEach(function(c) {
if (c.status === "yellow" || c.status === "red") {
if (c.id === "irp") recommendedServices.push("irp-registration");
if (c.id === "ifta") recommendedServices.push("ifta-application");
if (c.id === "weight_distance_tax") {
if (data.phy_state === "OR") recommendedServices.push("or-weight-mile-tax");
else if (data.phy_state === "NY") recommendedServices.push("ny-hut-registration");
else if (data.phy_state === "KY") recommendedServices.push("ky-kyu-registration");
else if (data.phy_state === "NM") recommendedServices.push("nm-weight-distance");
else if (data.phy_state === "CT") recommendedServices.push("ct-highway-use-fee");
}
if (c.id === "operating_status" && c.detail && c.detail.indexOf("Out of Service") >= 0) {
recommendedServices.push("emergency-temporary-authority");
} else if (c.id === "operating_status") {
recommendedServices.push("usdot-reactivation");
}
if (c.id === "state_carrier_permit" && data.phy_state === "CA") recommendedServices.push("ca-mcp-carb");
if (c.id === "intrastate_authority") recommendedServices.push("intrastate-authority");
if (c.id === "corporate_compliance") recommendedServices.push("annual-report-filing");
}
if (c.status === "red") {
if (c.id === "mcs150") recommendedServices.push("mcs150-update");
if (c.id === "insurance_bipd" || c.id === "insurance_cargo") recommendedServices.push("dot-full-compliance");
if (c.id === "insurance_bond") recommendedServices.push("boc3-filing");
if (c.id === "authority") recommendedServices.push("mc-authority");
}
});
if (redCount > 0) {
var svcParam = recommendedServices.length > 0 ? "&services=" + recommendedServices.join(",") : "";
if (hasInsuranceIssue) svcParam += "&ins=1";
if (data.phy_state) svcParam += "&state=" + data.phy_state;
html += '<div style="background:linear-gradient(135deg,#fff7ed,#ffedd5);border:2px solid #f97316;border-radius:12px;padding:24px;text-align:center;margin-top:8px">';
html += '<h3 style="font-size:18px;font-weight:700;color:#111827;margin-bottom:8px">' + redCount + ' compliance issue' + (redCount > 1 ? 's' : '') + ' found</h3>';
html += '<p style="font-size:14px;color:#4b5563;margin-bottom:16px">Performance West can help you resolve these issues. We handle the paperwork so you can focus on driving.</p>';
html += '<a href="/order/dot-compliance?dot=' + data.dot_number + svcParam + '" style="display:inline-block;padding:12px 32px;background:#f97316;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:15px;box-shadow:0 4px 12px rgba(249,115,22,0.3)">Fix My DOT Filings &rarr;</a>';
html += '<p class="text-xs text-gray-400 mt-3">Or call (888) 411-0383</p>';
html += '</div>';
} else if (s.yellow > 0) {
// No red issues but yellow warnings - list what needs attention
var yellowSvcParam = recommendedServices.length > 0 ? "&services=" + recommendedServices.join(",") : "";
if (data.phy_state) yellowSvcParam += "&state=" + data.phy_state;
var yellowItems = [];
(data.checks || []).forEach(function(c) {
if (c.status === "yellow") yellowItems.push(c.label);
});
html += '<div style="background:#fffbeb;border:2px solid #fbbf24;border-radius:12px;padding:24px;margin-top:8px">';
html += '<h3 style="font-size:18px;font-weight:700;color:#92400e;margin-bottom:4px;text-align:center">Federal filings look good - but ' + yellowItems.length + ' item' + (yellowItems.length > 1 ? 's' : '') + ' to review</h3>';
html += '<p style="font-size:14px;color:#78350f;margin-bottom:12px;text-align:center">Your FMCSA filings are current. The following may need attention:</p>';
html += '<ul style="list-style:none;padding:0;margin:0 0 16px">';
yellowItems.forEach(function(item) {
html += '<li style="display:flex;align-items:center;gap:8px;padding:6px 0;font-size:14px;color:#374151;border-bottom:1px solid #fef3c7">';
html += '<span style="color:#f59e0b;font-size:16px">&#9888;</span> ' + item + '</li>';
});
html += '</ul>';
html += '<div style="text-align:center"><a href="/order/dot-compliance?dot=' + data.dot_number + yellowSvcParam + '" style="display:inline-block;padding:10px 28px;background:#ea580c;color:#fff;font-weight:700;border-radius:8px;text-decoration:none;font-size:14px">Get These Handled &rarr;</a>';
html += '<p style="font-size:12px;color:#92400e;margin-top:8px">Or call (888) 411-0383</p></div>';
html += '</div>';
} else {
html += '<div style="background:#f0fdf4;border:2px solid #86efac;border-radius:12px;padding:24px;text-align:center;margin-top:8px">';
html += '<h3 style="font-size:18px;font-weight:700;color:#166534;margin-bottom:4px">Looking good!</h3>';
html += '<p style="font-size:14px;color:#374151">Your DOT filings appear current. No action needed at this time.</p>';
html += '</div>';
}
} // end compliance-mode block
// Recent update notice + disclaimer
html += '<div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;margin-top:12px">';
html += '<p style="font-size:14px;color:#475569;margin:0 0 8px"><strong>Think something is wrong?</strong> If you recently filed an update, it may take 5-10 business days for FMCSA to reflect changes in their system. If you believe this report is in error, contact FMCSA directly at <a href="tel:8008325660" style="color:#2563eb;font-weight:600">(800) 832-5660</a>.</p>';
html += '<p style="font-size:12px;color:#94a3b8;margin:0"><strong>Disclaimer:</strong> This tool queries publicly available FMCSA data. While we strive for accuracy, always confirm critical compliance matters directly with FMCSA. This is not legal advice.</p>';
html += '</div>';
resultsEl.innerHTML = html;
resultsEl.classList.remove("hidden");
if (pwIntent === "closing") { wireCloseout(data); return; }
// Insurance lead checkbox toggle
var insCheck = document.getElementById("ins-lead-check");
var insForm = document.getElementById("ins-lead-form");
if (insCheck && insForm) {
insCheck.addEventListener("change", function() {
insForm.style.display = insCheck.checked ? "block" : "none";
});
}
// Insurance lead submit
var insBtn = document.getElementById("ins-lead-submit");
if (insBtn) {
insBtn.addEventListener("click", function() {
var name = document.getElementById("ins-lead-name").value.trim();
var email = document.getElementById("ins-lead-email").value.trim();
var phone = document.getElementById("ins-lead-phone").value.trim();
var statusEl = document.getElementById("ins-lead-status");
if (!email) { statusEl.textContent = "Please enter your email."; statusEl.className = "text-xs text-red-600"; statusEl.classList.remove("hidden"); return; }
insBtn.disabled = true;
insBtn.textContent = "Submitting...";
fetch(API + "/api/v1/tickets", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
category: "insurance_lead",
subject: "Insurance Lead - " + data.legal_name + " (DOT " + data.dot_number + ")",
message: [
"Insurance lead from DOT Compliance Checker.",
"",
"Carrier: " + data.legal_name,
"DOT#: " + data.dot_number,
"Location: " + (data.phy_city || "") + ", " + (data.phy_state || ""),
"Fleet: " + (data.fleet ? data.fleet.power_units + " trucks, " + data.fleet.drivers + " drivers" : "unknown"),
"Phone: " + (phone || data.telephone || "not provided"),
"",
"Insurance deficiency: " + ((data.checks || []).filter(function(c) { return c.id && c.id.indexOf("insurance") === 0 && c.status === "red"; }).map(function(c) { return c.label + " - " + c.detail; }).join("; ") || "See compliance check results"),
"",
"Contact: " + name,
"Email: " + email,
"Phone: " + phone,
].join("\n"),
email: email,
name: name,
})
}).then(function(r) {
if (r.ok) {
statusEl.textContent = "Submitted! We'll be in touch within 1 business day.";
statusEl.className = "text-xs text-green-700";
statusEl.classList.remove("hidden");
insBtn.textContent = "Submitted";
} else {
throw new Error("Failed");
}
}).catch(function() {
statusEl.textContent = "Something went wrong. Email info@performancewest.net instead.";
statusEl.className = "text-xs text-red-600";
statusEl.classList.remove("hidden");
insBtn.disabled = false;
insBtn.textContent = "Request Insurance Quote";
});
});
}
}
// Auto-fill from URL
(function() {
var params = new URLSearchParams(window.location.search);
if (params.get("intent") === "closing" || params.get("closing") === "1") {
setIntent("closing");
}
var dot = params.get("dot");
if (dot) {
dotInput.value = dot;
runDotCheck();
}
})();
})();
</script></body></html>