new-site/site/public/tools/fcc-compliance-check/index.html
justin acf72da341 Remove prices from compliance checker — show only on order page
Prices removed from CTA buttons and banner cards on the checker.
Users see "Get Started" instead of dollar amounts, reducing sticker
shock before they understand the value. Prices shown on the order
page where they can see itemized services.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-09 10:50:59 -05:00

563 lines
No EOL
78 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><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> </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">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-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/fcc-carrier-registration" 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">FCC Carrier Registration</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</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: voice? then broadband? (always both questions)
// Voice-only retail providers also need BDC Voice Subscription filing
// 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("BDC") < 0) return;
var detail = card.querySelectorAll("p")[1];
if (!detail) return;
var icon = card.querySelector("span");
var flexDiv = card.querySelector(".flex-1");
function askVoiceFirst() {
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 offer <u>retail</u> voice service (VoIP, CLEC, or wireline) 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, or wholesale only</button>';
flexDiv.appendChild(q1);
q1.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-vc]");
if (!b) return;
q1.remove();
askBroadband(b.dataset.vc === "yes");
});
}
function askBroadband(hasVoice) {
var q2 = document.createElement("div");
q2.className = "pw-bdc-toggle mt-3 flex items-center gap-2";
q2.innerHTML =
(hasVoice ? '<span class="text-xs text-green-700 font-medium mr-1">\u2713 Retail voice</span>' : '') +
'<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(q2);
q2.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-bb]");
if (!b) return;
q2.remove();
finalize(b.dataset.bb === "yes", 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>';
}
}
askVoiceFirst();
});
}
// 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">Get Started &rarr;</span>' +
'</a>' +
'<a href="/order/fcc-carrier-registration" 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">Get Started &rarr;</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)
});
});
}
// CALEA toggle — wholesale-only carriers are exempt ("interconnecting carriers")
if (!checks.querySelector(".pw-calea-toggle")) {
var caleaCards = checks.querySelectorAll(":scope > div");
caleaCards.forEach(function(card) {
if (card.textContent.indexOf("CALEA") < 0 && card.textContent.indexOf("SSI") < 0) return;
if (card.querySelector(".pw-calea-toggle")) return;
// Only show for red/amber cards (missing or needs attention)
if (!card.classList.contains("bg-red-50") && !card.classList.contains("bg-amber-50")) 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-calea-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">Do you serve end users directly (retail customers), or do you only sell to other carriers (wholesale)?</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-calea="retail">Retail or both</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-calea="wholesale">Wholesale only</button>';
flexDiv.appendChild(q);
q.addEventListener("click", function(ev) {
var b = ev.target.closest("[data-calea]");
if (!b) return;
q.remove();
if (b.dataset.calea === "wholesale") {
// Wholesale-only carriers are exempt — "interconnecting carrier" under CALEA
card.className = "bg-green-50 border-green-200 border rounded-xl p-4 flex items-start gap-3";
detail.innerHTML = 'Not required \u2014 wholesale-only carriers that serve other carriers (not end users) are generally exempt from CALEA as &ldquo;interconnecting carriers.&rdquo; CALEA applies to carriers providing service to the public.';
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.caleaExempt = "true";
}
// If retail/both, leave as-is (red, needs SSI plan)
});
});
}
// 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 hasCaleaQuestion = !!checks.querySelector(".pw-calea-toggle");
var hasPendingQuestion = hasBdcQuestion || hasRmdQuestion || has499aQuestion || hasCaleaQuestion;
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") && !checks.querySelector(".pw-calea-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";
link.style.cssText = "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>