new-site/site/public/tools/fcc-compliance-check/index.html
justin c0adeec663 Revert CTA always-rebuild, keep combined text detection for RMD quality
The always-rebuild approach caused the CTA to disappear when the observer
fired a second time. Reverted to only rebuild on FRN change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-28 03:31:12 -05:00

522 lines
No EOL
76 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="Enter your FCC Registration Number (FRN) to check your RMD, CPNI, 499-A, and STIR/SHAKEN compliance status instantly. Free tool from Performance West."><link rel="canonical" href="https://performancewest.net/tools/fcc-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/fcc-compliance-check/"><meta property="og:title" content="FCC Compliance Check — Free Telecom Filing Status | Performance West Inc."><meta property="og:description" content="Enter your FCC Registration Number (FRN) to check your RMD, CPNI, 499-A, and STIR/SHAKEN compliance status instantly. Free tool from Performance West."><!-- Twitter --><meta name="twitter:card" content="summary"><meta name="twitter:title" content="FCC Compliance Check — Free Telecom Filing Status | Performance West Inc."><meta name="twitter:description" content="Enter your FCC Registration Number (FRN) to check your RMD, CPNI, 499-A, and STIR/SHAKEN compliance status instantly. Free tool from Performance West."><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>FCC Compliance Check — Free Telecom Filing Status | Performance West Inc.</title><script defer src="https://analytics.performancewest.net/script.js" data-website-id="55250014-ee15-44ac-a1f6-81dabad3fe0f"></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">IPES & 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> </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> <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">IPES & 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-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-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">FCC Compliance Check</span> </nav> <!-- Header --> <h1 class="text-3xl font-bold text-gray-900 mb-3">FCC Compliance Check</h1> <p class="text-lg text-gray-600 mb-4">Enter your FCC Registration Number (FRN) to instantly check your telecom compliance status across all major FCC filing obligations.</p> <!-- Disclaimer --> <div class="bg-gray-50 border border-gray-200 rounded-lg p-4 mb-8"> <p class="text-xs text-gray-500"><strong>Disclaimer:</strong> This tool queries publicly available FCC data and is for informational purposes only. Some filing statuses (CPNI, 499-A/Q) cannot be verified programmatically. Always confirm directly with FCC CORES and USAC. This is not legal or compliance advice.</p> </div> <!-- Search + FRN Input --> <div class="bg-white border border-gray-200 rounded-xl p-6 shadow-sm mb-8"> <!-- Search by name or filer ID --> <div class="mb-5"> <label for="search-input" class="block text-sm font-semibold text-gray-900 mb-2">Search by company name or 499 Filer ID</label> <div class="flex gap-3"> <input type="text" id="search-input" placeholder="e.g. Falcon Broadband or 812345" 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-pw-500 focus:border-pw-500"> <button type="button" id="btn-search" class="px-5 py-2.5 bg-gray-100 text-gray-700 font-semibold rounded-lg hover:bg-gray-200 border border-gray-300 transition-colors whitespace-nowrap text-sm">
Search
</button> </div> </div> <!-- Search results (shown after search) --> <div id="search-results" class="hidden mb-5 max-h-60 overflow-y-auto"> <p class="text-xs text-gray-500 mb-2" id="search-count"></p> <div id="search-list" class="space-y-1"></div> </div> <!-- FRN lookup (direct compliance check) --> <div class="border-t border-gray-200 pt-5"> <label for="frn-input" class="block text-sm font-semibold text-gray-900 mb-2">Run compliance check by FRN</label> <div class="flex gap-3"> <input type="text" id="frn-input" maxlength="10" pattern="[0-9]{10}" placeholder="0012345678" 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-pw-500 focus:border-pw-500"> <button type="button" id="btn-check" class="px-6 py-3 bg-pw-600 text-white font-semibold rounded-lg hover:bg-pw-700 transition-colors whitespace-nowrap">
Check Compliance
</button> </div> <p class="text-xs text-gray-500 mt-2">Your FRN is a 10-digit number assigned by the FCC. Don't know it? Use the search above to find your company.</p> </div> </div> <!-- Loading state --> <div id="pw-results-anchor"></div><div id="loading" class="hidden text-center py-12"> <div class="inline-flex items-center gap-3 text-gray-600"> <svg class="animate-spin h-5 w-5" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" fill="none"></circle><path class="opacity-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>
Checking FCC databases...
</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"> <!-- Entity header --> <div id="entity-header" class="bg-white border border-gray-200 rounded-xl p-6 shadow-sm"> <div class="flex items-start justify-between"> <div> <p class="text-xs text-gray-500 uppercase tracking-wider mb-1">Entity</p> <h2 class="text-xl font-bold text-gray-900" id="entity-name">--</h2> <p class="text-sm text-gray-500 mt-1" id="entity-address">--</p> </div> <div class="text-right"> <p class="text-xs text-gray-500 uppercase tracking-wider mb-1">FRN</p> <p class="text-lg font-mono font-bold text-pw-700" id="entity-frn">--</p> </div> </div> </div> <!-- Compliance checks --> <div id="checks-container" class="space-y-3"></div> <!-- Prior-year catch-up --> <div id="catchup-section" class="hidden bg-amber-50 border border-amber-200 rounded-xl p-6"> <h3 class="text-lg font-bold text-amber-900 mb-3">Prior-Year Remediation Required</h3> <div id="catchup-items" class="space-y-2"></div> </div> <!-- CTA --> <div class="bg-gradient-to-br from-gray-50 to-pw-50 border border-pw-200 rounded-xl p-6 mt-6">
<h3 class="text-lg font-bold text-gray-900 mb-2 text-center">Starting a new telecom carrier?</h3>
<p class="text-sm text-gray-500 text-center mb-5">We handle every step — from incorporation and FCC registration to full regulatory compliance.</p>
<div class="grid sm:grid-cols-2 gap-4">
<a href="/order/new-carrier-bundle" class="block bg-white border border-gray-200 rounded-xl p-5 text-center hover:border-blue-400 hover:shadow-md transition-all group">
<img src="/images/flags/usa.png" alt="USA" class="w-12 h-auto mx-auto mb-3 rounded shadow-sm" />
<h4 class="text-sm font-bold text-gray-900 mb-1 group-hover:text-blue-700">US FCC Carrier</h4>
<p class="text-xs text-gray-500 mb-3">CORES/FRN, Form 499, RMD, CPNI, CALEA, D.C. Agent — all included.</p>
<span class="inline-block px-4 py-2 bg-pw-700 text-white font-semibold rounded-lg text-sm group-hover:bg-pw-800 transition-colors">New Carrier Bundle — $1,799</span>
</a>
<a href="/order/canada-crtc" class="block bg-white border border-gray-200 rounded-xl p-5 text-center hover:border-red-400 hover:shadow-md transition-all group">
<img src="/images/flags/canada.png" alt="Canada" class="w-12 h-auto mx-auto mb-3 rounded shadow-sm" />
<h4 class="text-sm font-bold text-gray-900 mb-1 group-hover:text-red-700">Canadian CRTC Carrier</h4>
<p class="text-xs text-gray-500 mb-3">Incorporation, CRTC registration, BITS, CCTS, domain, phone number — turnkey.</p>
<span class="inline-block px-4 py-2 bg-pw-700 text-white font-semibold rounded-lg text-sm group-hover:bg-pw-800 transition-colors">CRTC Package — $3,899</span>
</a>
</div>
</div> <!-- Checked at timestamp --> <p class="text-xs text-gray-400 text-center mt-4" id="checked-at"></p> </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/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> </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. &mdash; 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 — Report an Issue + guest fallback (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 — Request a Service / Request a Quote (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 — Ask a Question / Get Support when not logged in (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> <!-- Modal backdrop --><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"> <!-- Close --> <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> <!-- Tab bar --> <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"> <!-- ── Login form ──────────────────────────────────────────────────── --> <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> <!-- ── Register 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> <!-- ── Forgot password 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();
(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>
// PW Dev Patches — runs after the original module JS
(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";
// --- 1. Nav: add FCC Compliance Check link ---
try {
var cols = document.querySelectorAll("#services-menu .grid > div");
if (cols.length >= 1 && !cols[0].querySelector('a[href*="fcc-compliance-check"]')) {
var nl = document.createElement("a");
nl.href = "/tools/fcc-compliance-check";
nl.className = "block py-1.5 text-sm font-medium text-green-600 hover:text-green-800";
nl.innerHTML = '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>';
cols[0].appendChild(nl);
}
var mm = document.getElementById("mobile-menu");
if (mm && !mm.querySelector('a[href*="fcc-compliance-check"]')) {
var cl = mm.querySelector('a[href*="canada-crtc"]');
if (cl) {
var ml = document.createElement("a");
ml.href = "/tools/fcc-compliance-check";
ml.className = "block px-2 py-2 text-sm font-medium text-green-600 hover:bg-green-50 rounded";
ml.innerHTML = '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>';
cl.after(ml);
}
}
} catch(e) {}
// --- 2. Enhance search results with city/state ---
// Instead of replacing the click handler, we observe the search-list
// for new children and re-fetch results with our enhanced display.
var searchList = document.getElementById("search-list");
var searchInput = document.getElementById("search-input");
if (searchList && searchInput) {
var lastQuery = "";
var enhancedResults = null;
// Watch for the original JS populating search results
var searchObserver = new MutationObserver(function() {
if (searchList.children.length === 0) return;
var q = searchInput.value.trim();
if (q === lastQuery && enhancedResults) return;
lastQuery = q;
// Re-fetch with our API (which returns city/state)
var isDigits = /^\d+$/.test(q);
var params = new URLSearchParams();
if (isDigits && q.length <= 8) params.set("filer_id", q);
else params.set("q", q);
fetch(API + "/api/v1/fcc/search?" + params)
.then(function(r) { return r.json(); })
.then(function(data) {
if (!data.results) return;
enhancedResults = data.results;
// Replace the content of existing buttons with city/state
var buttons = searchList.querySelectorAll("button");
data.results.forEach(function(s, i) {
if (i >= buttons.length) return;
var removed = s.removed_from_rmd ? ' <span class="text-red-600 font-bold text-xs">REMOVED</span>' : "";
var src = s.source === "rmd" ? "RMD" : "499 Filer";
var loc = (s.city || s.state) ? '<span class="text-xs text-gray-400 ml-2">' + [s.city, s.state].filter(Boolean).join(", ") + '</span>' : '';
buttons[i].innerHTML =
'<span class="font-medium text-gray-900">' + (s.business_name || "Unknown") + removed + '</span>' +
(s.frn ? '<span class="text-xs text-gray-500 ml-2">FRN: ' + s.frn + '</span>' : '') +
(s.filer_id ? '<span class="text-xs text-gray-500 ml-2">Filer ID: ' + s.filer_id + '</span>' : '') +
loc +
'<span class="text-xs text-gray-400 ml-2">(' + src + ')</span>' +
'<span style="float:right;color:#1e3a5f;font-weight:bold;font-size:1.1rem">\u203A</span>';
});
})
.catch(function() {});
});
searchObserver.observe(searchList, { childList: true });
}
// --- 3. Observe results for BDC toggle + remediation CTA ---
var resultsDiv = document.getElementById("results");
if (resultsDiv) {
var resObserver = new MutationObserver(function() {
if (resultsDiv.classList.contains("hidden")) return;
var checks = document.getElementById("checks-container");
if (!checks) return;
// BDC toggle — two-step: broadband? then voice? (always both questions)
// Stores result on card as data-bdc-slug for the CTA to pick up
if (!checks.querySelector(".pw-bdc-toggle")) {
var cards = checks.querySelectorAll(":scope > div");
cards.forEach(function(card) {
if (card.textContent.indexOf("Broadband Data Collection") < 0) return;
var detail = card.querySelectorAll("p")[1];
if (!detail) return;
var icon = card.querySelector("span");
var flexDiv = card.querySelector(".flex-1");
function askBroadband() {
var q1 = document.createElement("div");
q1.className = "pw-bdc-toggle mt-3 flex items-center gap-2";
q1.innerHTML =
'<span class="text-sm font-bold text-gray-900">During ' + (new Date().getFullYear() - 1) + ', did you provide broadband internet access in the United States through resale or facilities-based service (not as an outside sales agent)?</span>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-red-300 bg-red-50 text-red-700 hover:bg-red-100 hover:border-red-400 transition-colors" data-bb="yes">Yes</button>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-green-300 bg-green-50 text-green-700 hover:bg-green-100 hover:border-green-400 transition-colors" data-bb="no">No</button>';
flexDiv.appendChild(q1);
q1.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-bb]");
if (!b) return;
q1.remove();
askVoice(b.dataset.bb === "yes");
});
}
function askVoice(hasBroadband) {
var q2 = document.createElement("div");
q2.className = "pw-bdc-toggle mt-3 flex items-center gap-2";
q2.innerHTML =
(hasBroadband ? '<span class="text-xs text-green-700 font-medium mr-1">\u2713 Broadband</span>' : '') +
'<span class="text-sm font-bold text-gray-900">During the filing period of ' + (new Date().getFullYear() - 1) + ', did you offer <u>retail</u> voice service to end users in the United States?</span>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-red-300 bg-red-50 text-red-700 hover:bg-red-100 hover:border-red-400 transition-colors" data-vc="yes">Yes</button>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-green-300 bg-green-50 text-green-700 hover:bg-green-100 hover:border-green-400 transition-colors" data-vc="no">No</button>';
flexDiv.appendChild(q2);
q2.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-vc]");
if (!b) return;
q2.remove();
var hasVoice = b.dataset.vc === "yes";
finalize(hasBroadband, hasVoice);
});
}
function finalize(bb, vc) {
if (bb && vc) {
card.dataset.bdcSlug = "bdc";
card.className = "bg-red-50 border-red-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "Broadband + voice service: both BDC Broadband and BDC Voice filings required. Filed semi-annually June 1 and December 1.";
detail.className = "text-xs text-red-800 mt-1";
icon.className = "text-red-600 shrink-0 mt-0.5";
icon.innerHTML = '<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"/></svg>';
} else if (bb) {
card.dataset.bdcSlug = "bdc-broadband";
card.className = "bg-red-50 border-red-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "Broadband service offered: BDC Broadband Deployment filing required. Filed semi-annually June 1 and December 1.";
detail.className = "text-xs text-red-800 mt-1";
icon.className = "text-red-600 shrink-0 mt-0.5";
icon.innerHTML = '<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"/></svg>';
} else if (vc) {
card.dataset.bdcSlug = "bdc-voice";
card.className = "bg-amber-50 border-amber-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "Retail voice service requires BDC Voice Subscription filing (formerly Form 477 Voice). Filed semi-annually June 1 and December 1.";
detail.className = "text-xs text-amber-800 mt-1";
icon.className = "text-amber-600 shrink-0 mt-0.5";
icon.innerHTML = '<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="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>';
} else {
card.dataset.bdcSlug = "";
card.className = "bg-green-50 border-green-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "No broadband or retail voice service \u2014 BDC filing is not required.";
detail.className = "text-xs text-green-800 mt-1";
icon.className = "text-green-600 shrink-0 mt-0.5";
icon.innerHTML = '<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg>';
}
}
askBroadband();
});
}
// 499-A toggle — ask if they provide telecom services
// Broadband-only ISPs may not need 499-A; carriers who shouldn't be filing need discontinuance
if (!checks.querySelector(".pw-499a-toggle")) {
var f499Cards = checks.querySelectorAll(":scope > div");
f499Cards.forEach(function(card) {
if (card.textContent.indexOf("Form 499-A") < 0) return;
if (card.querySelector(".pw-499a-toggle")) return;
var detail = card.querySelectorAll("p")[1];
var icon = card.querySelector("span");
var flexDiv = card.querySelector(".flex-1");
if (!flexDiv || !detail) return;
// Only show for carriers without filer ID OR with past-due filing
var hasFilerId = card.textContent.indexOf("Filer ID:") >= 0;
var isPastDue = card.textContent.indexOf("PAST DUE") >= 0;
var noFilerId = card.textContent.indexOf("No 499 Filer ID") >= 0;
if (!noFilerId && !isPastDue) return;
var q = document.createElement("div");
q.className = "pw-499a-toggle mt-3 flex items-center gap-2 flex-wrap";
q.innerHTML =
'<span class="text-sm font-bold text-gray-900 w-full mb-1">During the year, did you bill customers for any telecommunications services (voice, VoIP, toll, or own/leased network facilities)?</span>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-red-300 bg-red-50 text-red-700 hover:bg-red-100 hover:border-red-400 transition-colors" data-telco="yes">Yes</button>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-green-300 bg-green-50 text-green-700 hover:bg-green-100 hover:border-green-400 transition-colors" data-telco="no">No, or broadband resale only</button>';
flexDiv.appendChild(q);
q.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-telco]");
if (!b) return;
q.remove();
if (b.dataset.telco === "no") {
if (hasFilerId) {
// They have a filer ID but shouldn't be filing — offer discontinuance
card.className = "bg-amber-50 border-amber-200 border rounded-xl p-4 flex items-start gap-3";
detail.innerHTML = '<strong>You may be filing unnecessarily.</strong> Pure broadband resale ISPs without voice, VoIP, or facilities-based services are generally not required to file Form 499-A. ' +
'If you have been filing in error, we can help you file a <strong>Form 499-A Discontinuance</strong> with USAC to close out your filer obligations. ' +
'<a href="/contact?subject=499A+Discontinuance" class="text-blue-600 underline font-medium">Contact us for a free assessment</a>.';
detail.className = "text-xs text-amber-800 mt-1";
icon.className = "text-amber-600 shrink-0 mt-0.5";
icon.innerHTML = '<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="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>';
} else {
// No filer ID, broadband only — not required
card.className = "bg-green-50 border-green-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "Likely not required \u2014 pure broadband resale ISPs without voice, VoIP, or facilities-based services are generally not required to file Form 499-A. If you are unsure, contact us for a free assessment.";
detail.className = "text-xs text-green-800 mt-1";
icon.className = "text-green-600 shrink-0 mt-0.5";
icon.innerHTML = '<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg>';
}
card.dataset.f499aExempt = "true";
// Also update CPNI and 499-Q
var allCards = checks.querySelectorAll(":scope > div");
allCards.forEach(function(c2) {
var lbl2 = c2.querySelector("p") ? c2.querySelector("p").textContent : "";
if (lbl2.indexOf("CPNI") >= 0 || lbl2.indexOf("499-Q") >= 0) {
var noFiler2 = c2.textContent.indexOf("No 499 Filer ID") >= 0;
if (hasFilerId && !noFiler2) {
// Has filer ID — offer discontinuance for CPNI too
c2.className = "bg-amber-50 border-amber-200 border rounded-xl p-4 flex items-start gap-3";
var d2 = c2.querySelectorAll("p")[1];
if (d2) { d2.textContent = "May not be required if you discontinue your 499-A filing."; d2.className = "text-xs text-amber-800 mt-1"; }
} else {
c2.className = "bg-green-50 border-green-200 border rounded-xl p-4 flex items-start gap-3";
var d2 = c2.querySelectorAll("p")[1];
if (d2) { d2.textContent = "Likely not required \u2014 broadband-only providers without voice services are generally exempt."; d2.className = "text-xs text-green-800 mt-1"; }
}
var i2 = c2.querySelector("span");
if (i2) {
i2.className = (hasFilerId && !noFiler2) ? "text-amber-600 shrink-0 mt-0.5" : "text-green-600 shrink-0 mt-0.5";
i2.innerHTML = (hasFilerId && !noFiler2) ?
'<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="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>' :
'<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg>';
}
}
});
}
});
});
}
// Foreign carrier recommendation — add CTA buttons
if (!checks.querySelector(".pw-foreign-cta")) {
var foreignCards = checks.querySelectorAll(":scope > div");
foreignCards.forEach(function(card) {
if (card.textContent.indexOf("Expand Into North America") < 0) return;
if (card.querySelector(".pw-foreign-cta")) return;
var flexDiv = card.querySelector(".flex-1");
if (!flexDiv) return;
var cta = document.createElement("div");
cta.className = "pw-foreign-cta mt-4 grid grid-cols-2 gap-3";
cta.innerHTML =
'<a href="/order/canada-crtc" class="block bg-white border-2 border-red-200 rounded-xl p-4 text-center hover:border-red-400 hover:shadow-md transition-all group">' +
'<img src="/images/flags/canada.png" alt="Canada" class="w-10 h-auto mx-auto mb-2 rounded shadow-sm" />' +
'<p class="text-sm font-bold text-gray-900 group-hover:text-red-700">Canada CRTC Carrier</p>' +
'<p class="text-xs text-gray-500 mt-1">BC incorporation + full CRTC telecom registration + .ca domain</p>' +
'<span class="inline-block mt-2 px-3 py-1.5 bg-red-600 text-white font-semibold rounded-lg text-xs group-hover:bg-red-700">Start — $3,899</span>' +
'</a>' +
'<a href="/order/new-carrier-bundle" class="block bg-white border-2 border-blue-200 rounded-xl p-4 text-center hover:border-blue-400 hover:shadow-md transition-all group">' +
'<img src="/images/flags/usa.png" alt="USA" class="w-10 h-auto mx-auto mb-2 rounded shadow-sm" />' +
'<p class="text-sm font-bold text-gray-900 group-hover:text-blue-700">US FCC Carrier</p>' +
'<p class="text-xs text-gray-500 mt-1">State formation + CORES/FRN + RMD + 499-A + CPNI + CALEA</p>' +
'<span class="inline-block mt-2 px-3 py-1.5 bg-pw-700 text-white font-semibold rounded-lg text-xs group-hover:bg-pw-800">Start — $1,799</span>' +
'</a>';
flexDiv.appendChild(cta);
// Restyle the card to be more promotional
card.className = "bg-gradient-to-br from-blue-50 to-indigo-50 border-2 border-blue-200 rounded-xl p-4 flex items-start gap-3";
var icon = card.querySelector("span");
if (icon) {
icon.className = "text-blue-600 shrink-0 mt-0.5";
icon.innerHTML = '<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="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"/></svg>';
}
});
}
// RMD voice toggle — if RMD shows red "Not found", ask if they provide voice
if (!checks.querySelector(".pw-rmd-toggle")) {
var rmdCards = checks.querySelectorAll(":scope > div");
rmdCards.forEach(function(card) {
if (card.textContent.indexOf("Robocall Mitigation Database") < 0) return;
if (card.textContent.indexOf("Not found") < 0) return;
if (card.querySelector(".pw-rmd-toggle")) return;
var detail = card.querySelectorAll("p")[1];
var icon = card.querySelector("span");
var flexDiv = card.querySelector(".flex-1");
if (!flexDiv || !detail) return;
var q = document.createElement("div");
q.className = "pw-rmd-toggle mt-3 flex items-center gap-2";
q.innerHTML =
'<span class="text-sm font-bold text-gray-900">Does your company bill for <u>any</u> voice service (VoIP, CLEC, IXC, CMRS)?</span>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-red-300 bg-red-50 text-red-700 hover:bg-red-100 hover:border-red-400 transition-colors" data-voice="yes">Yes</button>' +
'<button type="button" class="px-4 py-1.5 text-xs font-bold rounded-lg border-2 border-green-300 bg-green-50 text-green-700 hover:bg-green-100 hover:border-green-400 transition-colors" data-voice="no">No</button>';
flexDiv.appendChild(q);
q.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-voice]");
if (!b) return;
q.remove();
if (b.dataset.voice === "no") {
// Data-only — RMD not required
card.className = "bg-green-50 border-green-200 border rounded-xl p-4 flex items-start gap-3";
detail.textContent = "Not required \u2014 RMD registration applies only to voice service providers. Data-only carriers are exempt.";
detail.className = "text-xs text-green-800 mt-1";
icon.className = "text-green-600 shrink-0 mt-0.5";
icon.innerHTML = '<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"/></svg>';
card.dataset.rmdExempt = "true";
}
// If yes, leave as-is (red, not found)
});
});
}
// Remediation CTA — rebuild if FRN changed (user searched new company)
var currentFrn = (document.getElementById("entity-frn").textContent || "").replace(/\D/g, "");
var existingCta = document.getElementById("pw-remediation-cta");
if (existingCta && existingCta.dataset.frn && existingCta.dataset.frn !== currentFrn) {
existingCta.remove();
existingCta = null;
}
if (!existingCta) {
var actionCards = checks.querySelectorAll(":scope > .bg-red-50, :scope > .bg-amber-50");
if (actionCards.length > 0) {
var services = [];
actionCards.forEach(function(rc) {
var t = rc.textContent || "";
var lbl = rc.querySelector("p") ? rc.querySelector("p").textContent : "";
// Check both label and full text to catch quality sub-checks
var combined = lbl + " " + t;
if (combined.indexOf("CPNI") >= 0) services.push("cpni");
else if (combined.indexOf("499-Q") >= 0) services.push("499q");
else if (combined.indexOf("499-A") >= 0 && services.indexOf("499a") < 0) services.push("499a");
else if (combined.indexOf("RMD") >= 0 && services.indexOf("rmd") < 0) services.push("rmd");
else if (combined.indexOf("STIR") >= 0) services.push("stir");
else if ((combined.indexOf("Broadband") >= 0 || combined.indexOf("BDC") >= 0) && services.indexOf("bdc") < 0) services.push("bdc");
});
if (services.length > 0) {
var hasBdcQuestion = !!checks.querySelector(".pw-bdc-toggle");
var hasRmdQuestion = !!checks.querySelector(".pw-rmd-toggle");
var has499aQuestion = !!checks.querySelector(".pw-499a-toggle");
var hasPendingQuestion = hasBdcQuestion || hasRmdQuestion || has499aQuestion;
var frn = currentFrn;
var url = "/order/fcc-compliance?services=" + services.join(",") + (frn ? "&frn=" + frn : "");
var cta = document.createElement("div");
cta.id = "pw-remediation-cta";
cta.dataset.frn = frn;
cta.className = "mt-4 p-4 rounded-xl text-center";
cta.style.cssText = "background:#fff7ed;border:2px solid #f97316;margin-top:1rem;padding:1rem;border-radius:12px;text-align:center";
var count = services.length;
var ctaMsg = '<p class="text-sm text-gray-700 mb-3"><strong>' + count + ' compliance item' + (count > 1 ? 's' : '') + ' need attention.</strong>' +
(count >= 2 ? ' Order together and save <span class="font-bold text-green-700">15%</span>.' : '') + '</p>';
if (hasPendingQuestion) {
// Unanswered questions — show greyed-out button with message
cta.innerHTML = ctaMsg +
'<p id="pw-bdc-warning" class="text-xs text-amber-700 mb-2">Please answer the questions above before proceeding.</p>' +
'<button type="button" id="pw-cta-btn" disabled class="inline-block px-6 py-2.5 bg-gray-400 text-white font-semibold rounded-lg cursor-not-allowed text-sm">Get Started \u2014 Fix ' + count + ' Item' + (count > 1 ? 's' : '') + '</button>';
// Watch for toggle removal (= answered)
var bdcWatcher = new MutationObserver(function() {
if (!checks.querySelector(".pw-bdc-toggle") && !checks.querySelector(".pw-rmd-toggle") && !checks.querySelector(".pw-499a-toggle")) {
bdcWatcher.disconnect();
// Re-count actionable items (red + amber)
var newServices = [];
var allCards = checks.querySelectorAll(":scope > div");
allCards.forEach(function(rc) {
var isRed = rc.classList.contains("bg-red-50");
var isAmber = rc.classList.contains("bg-amber-50");
if (!isRed && !isAmber) return;
var t = rc.textContent;
if (t.indexOf("CPNI") >= 0) newServices.push("cpni");
else if (t.indexOf("499-A") >= 0) newServices.push("499a");
else if (t.indexOf("499-Q") >= 0) newServices.push("499q");
else if (t.indexOf("RMD") >= 0) newServices.push("rmd");
else if (t.indexOf("STIR") >= 0) newServices.push("stir");
else if (t.indexOf("Broadband") >= 0 || t.indexOf("BDC") >= 0) {
// Use the specific slug stored on the card
var slug = rc.dataset.bdcSlug || "bdc";
if (slug) newServices.push(slug);
}
});
var newUrl = "/order/fcc-compliance?services=" + newServices.join(",") + (frn ? "&frn=" + frn : "");
var newCount = newServices.length;
var warn = document.getElementById("pw-bdc-warning");
if (warn) warn.remove();
// Update the count message to match the final service count
var ctaEl = document.getElementById("pw-remediation-cta");
if (ctaEl) {
var msgP = ctaEl.querySelector("p.text-sm");
if (msgP && newCount > 0) {
msgP.innerHTML = '<strong>' + newCount + ' compliance item' + (newCount > 1 ? 's' : '') + ' need attention.</strong>' +
(newCount >= 2 ? ' Order together and save <span class="font-bold text-green-700">15%</span>.' : '');
}
}
var btn = document.getElementById("pw-cta-btn");
if (btn && newCount > 0) {
var link = document.createElement("a");
link.href = newUrl;
link.className = "inline-block px-6 py-2.5 font-semibold rounded-lg transition-colors text-sm shadow-lg" style="background:#f97316;color:#fff;padding:10px 24px";
link.textContent = "Get Started \u2014 Fix " + newCount + " Item" + (newCount > 1 ? "s" : "");
btn.replaceWith(link);
} else if (btn) {
btn.closest("#pw-remediation-cta").remove();
}
}
});
bdcWatcher.observe(checks, { childList: true, subtree: true });
} else {
// No BDC question — show active button immediately
cta.innerHTML = ctaMsg +
'<a href="' + url + '" class="inline-block px-6 py-2.5 font-semibold rounded-lg transition-colors text-sm shadow-lg" style="background:#f97316;color:#fff;padding:10px 24px">Get Started \u2014 Fix ' + count + ' Item' + (count > 1 ? 's' : '') + '</a>';
}
// Insert CTA after the catchup section (not inside it — it may be hidden)
var catchupSection = document.getElementById("catchup-section");
if (catchupSection) {
catchupSection.after(cta);
} else {
checks.after(cta);
}
}
}
}
});
resObserver.observe(resultsDiv, { attributes: true, attributeFilter: ["class"] });
}
})();
</script>
</body> </html>