1318 lines
80 KiB
HTML
1318 lines
80 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
|
||
<title>FlockRadar | Live ALPR Camera Awareness & National Transparency Directory</title>
|
||
<meta name="description" content="A Waze-style real-time ALPR radar navigation app alerting drivers to active Flock camera recorded zones with live proximity alerts, audio warnings, and a 1,439-portal public directory.">
|
||
<meta name="keywords" content="Flock Safety, ALPR, camera radar, waze for flock, live radar, license plate readers, police surveillance, camera alerts">
|
||
<meta name="author" content="Public ALPR Transparency Project">
|
||
<link rel="canonical" href="https://flockradar.org/">
|
||
|
||
<!-- Favicon Suite & App Icons -->
|
||
<link rel="icon" type="image/svg+xml" href="favicon.svg?v=15">
|
||
<link rel="alternate icon" href="favicon.ico?v=15">
|
||
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?v=15">
|
||
<link rel="icon" type="image/png" sizes="192x192" href="icon-192.png?v=15">
|
||
<link rel="icon" type="image/png" sizes="512x512" href="icon-512.png?v=15">
|
||
<meta name="theme-color" content="#07090e">
|
||
<meta name="msapplication-TileColor" content="#07090e">
|
||
|
||
<!-- Open Graph / iMessage / WhatsApp / Facebook Preview Card -->
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="https://flockradar.org/">
|
||
<meta property="og:site_name" content="FlockRadar">
|
||
<meta property="og:title" content="FlockRadar | Live ALPR Camera Awareness & National Directory">
|
||
<meta property="og:description" content="Drive with real-time awareness of Flock camera surveillance zones. Instant proximity HUD alerts, audio warnings, and 1,439 official municipal transparency portals mapped.">
|
||
<meta property="og:image" content="https://flockradar.org/og-image.png?v=15">
|
||
<meta property="og:image:secure_url" content="https://flockradar.org/og-image.png?v=15">
|
||
<meta property="og:image:type" content="image/png">
|
||
<meta property="og:image:width" content="1200">
|
||
<meta property="og:image:height" content="630">
|
||
<meta property="og:image:alt" content="FlockRadar - Live ALPR Driving Radar & National Transparency Directory">
|
||
|
||
<!-- Twitter / X Preview Card -->
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:url" content="https://flockradar.org/">
|
||
<meta name="twitter:title" content="FlockRadar | Live ALPR Camera Awareness & National Directory">
|
||
<meta name="twitter:description" content="Drive with real-time awareness of Flock camera surveillance zones. Instant proximity HUD alerts, audio warnings, and 1,439 official municipal portals mapped.">
|
||
<meta name="twitter:image" content="https://flockradar.org/og-image.png?v=15">
|
||
<meta name="twitter:image:alt" content="FlockRadar - Live ALPR Driving Radar & National Transparency Directory">
|
||
|
||
<!-- Google Fonts -->
|
||
<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@300;400;500;600;700&family=JetBrains+Mono:wght@400;600;700&family=Outfit:wght@500;600;700;800&display=swap" rel="stylesheet">
|
||
|
||
<!-- Leaflet Map CSS -->
|
||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
|
||
|
||
<!-- PWA & Mobile Web App Meta -->
|
||
<link rel="manifest" href="manifest.json">
|
||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||
<meta name="apple-mobile-web-app-title" content="FlockRadar">
|
||
|
||
<!-- Main Stylesheet -->
|
||
<link rel="stylesheet" href="css/styles.css?v=18">
|
||
</head>
|
||
<body>
|
||
|
||
<!-- ========================================================================
|
||
SITE NAVIGATION & APP BAR
|
||
======================================================================== -->
|
||
<nav class="site-nav" aria-label="Main Navigation">
|
||
<div class="container nav-content">
|
||
<div class="nav-left">
|
||
<a href="#" class="brand-wrapper" id="brand-link" title="FlockRadar Home">
|
||
<div class="brand-logo-emblem" aria-hidden="true">
|
||
<img src="favicon.svg?v=14" alt="FlockRadar Emblem" width="40" height="40" class="brand-logo-img">
|
||
<span class="brand-radar-ping"></span>
|
||
</div>
|
||
<div class="brand-text">
|
||
<span class="brand-title">FLOCKRADAR</span>
|
||
<span class="brand-tagline">ALPR Awareness Network</span>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- View Mode Switcher Pills -->
|
||
<div class="nav-mode-switcher" role="tablist">
|
||
<button id="nav-map-btn" class="nav-mode-btn active" role="tab" aria-selected="true">
|
||
<span class="mode-icon">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||
<circle cx="12" cy="12" r="9"/>
|
||
<circle cx="12" cy="12" r="5"/>
|
||
<path d="M12 3v9l5.5 3.5"/>
|
||
</svg>
|
||
</span>
|
||
<span class="nav-text-desktop">Live Radar Map</span>
|
||
<span class="nav-text-mobile">Radar</span>
|
||
</button>
|
||
<button id="nav-dir-btn" class="nav-mode-btn" role="tab" aria-selected="false">
|
||
<span class="mode-icon">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||
<rect x="4" y="2" width="16" height="20" rx="2" ry="2"/>
|
||
<line x1="9" y1="22" x2="9" y2="18"/>
|
||
<line x1="15" y1="22" x2="15" y2="18"/>
|
||
<line x1="9" y1="18" x2="15" y2="18"/>
|
||
<line x1="8" y1="6" x2="8.01" y2="6"/>
|
||
<line x1="16" y1="6" x2="16.01" y2="6"/>
|
||
<line x1="8" y1="10" x2="8.01" y2="10"/>
|
||
<line x1="16" y1="10" x2="16.01" y2="10"/>
|
||
</svg>
|
||
</span>
|
||
<span class="nav-text-desktop">National Directory (1,439)</span>
|
||
<span class="nav-text-mobile">Directory</span>
|
||
</button>
|
||
<button id="nav-support-btn" class="nav-mode-btn nav-support-btn" role="tab" aria-selected="false" title="Help support developer ($10/mo, $10, $20, $50)">
|
||
<span class="mode-icon support-heart-icon">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="currentColor" stroke="none">
|
||
<path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>
|
||
</svg>
|
||
</span>
|
||
<span class="nav-text-desktop">Help Support Developer</span>
|
||
<span class="nav-text-mobile">Support</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="nav-right">
|
||
<div class="badge-live-pulse" title="Database synced with official public transparency portals">
|
||
<span class="live-indicator-dot"></span>
|
||
<span>RADAR ACTIVE</span>
|
||
</div>
|
||
|
||
<!-- Driver Profile / Login Button -->
|
||
<button id="driver-profile-btn" class="user-profile-pill" title="Driver Profile & Settings">
|
||
<span id="user-profile-pill">
|
||
<span class="avatar-dot">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/>
|
||
<circle cx="12" cy="7" r="4"/>
|
||
</svg>
|
||
</span>
|
||
<span>Driver Login</span>
|
||
</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- ========================================================================
|
||
VIEW 1: LIVE RADAR MAP & NAVIGATION INTERFACE (WAZE-STYLE)
|
||
======================================================================== -->
|
||
<section id="radar-view" class="radar-view-container">
|
||
<!-- Leaflet Map Canvas -->
|
||
<div id="radar-map" class="radar-map-canvas" aria-label="Interactive Radar Map"></div>
|
||
|
||
<!-- Floating Driver HUD (Compact Capsule on Mobile, Full on Desktop) -->
|
||
<aside class="driver-hud" id="driver-hud" aria-live="polite">
|
||
<!-- Top Driver Capsule Header -->
|
||
<div class="hud-capsule-header">
|
||
<!-- Status Badge -->
|
||
<div id="hud-zone-badge" class="hud-badge badge-clear">
|
||
<span class="badge-dot dot-clear"></span>
|
||
<span>ALL CLEAR</span>
|
||
</div>
|
||
|
||
<!-- Metrics Row: Speed + Nearest Distance -->
|
||
<div class="hud-metrics-row">
|
||
<div class="hud-metric-box">
|
||
<div class="hud-val-group">
|
||
<span class="hud-metric-number" id="hud-speed-val">0</span>
|
||
<span class="hud-metric-unit">MPH</span>
|
||
</div>
|
||
<span class="hud-metric-label" id="hud-speed-label">
|
||
<span id="hud-compass-needle" class="hud-compass-icon" title="Vehicle Heading Needle">▲</span>
|
||
<span id="hud-heading-val">IDLE</span>
|
||
</span>
|
||
</div>
|
||
|
||
<div class="hud-metric-box">
|
||
<div class="hud-val-group">
|
||
<span class="hud-metric-number" id="hud-dist-val">—</span>
|
||
<span class="hud-metric-unit" id="hud-dist-sub">FT</span>
|
||
</div>
|
||
<span class="hud-metric-label">Nearest</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Header Quick Triggers (Audio Toggle, Tools, Search) -->
|
||
<div class="hud-capsule-actions">
|
||
<button type="button" id="btn-hud-sound-toggle" class="btn-capsule-trigger btn-sound-trigger" title="Toggle Audio Radar Alerts (Sound ON/OFF)">
|
||
<span id="hud-sound-icon">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"/></svg>
|
||
</span>
|
||
<span class="capsule-sound-label">Audio</span>
|
||
</button>
|
||
<button type="button" id="btn-toggle-tools" class="btn-capsule-trigger" title="Open Driving Controls Menu">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
|
||
<span class="capsule-btn-text">Tools</span>
|
||
</button>
|
||
<button type="button" id="btn-toggle-hud-details" class="btn-capsule-trigger btn-expand-details" title="Toggle Search & Locations">
|
||
<span id="hud-details-arrow">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||
</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Current Agency / Street Monitoring -->
|
||
<div class="hud-location-bar">
|
||
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="var(--accent-cyan)" stroke-width="2">
|
||
<circle cx="12" cy="12" r="10"></circle>
|
||
<line x1="12" y1="8" x2="12.01" y2="8"></line>
|
||
<polyline points="11 12 12 12 12 16 13 16"></polyline>
|
||
</svg>
|
||
<span id="hud-cam-agency">Monitoring Roadway Grid</span>
|
||
</div>
|
||
|
||
<!-- High-Priority Pulsing Warning Banner -->
|
||
<div id="hud-banner-alert" class="hud-banner-alert">
|
||
<span class="banner-pulse-icon">
|
||
<svg class="flock-svg flock-svg-lg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
|
||
</span>
|
||
<div>
|
||
<strong>FLOCK CAMERA ACTIVE ZONE</strong>
|
||
<p>Vehicle Profile & Plate Logging Active</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Collapsible Detailed Section (Collapsed on mobile to keep map 100% visible) -->
|
||
<div class="hud-collapsible-content" id="hud-collapsible-content">
|
||
<!-- Graduated Radar Detector Signal Gauge -->
|
||
<div class="hud-radar-gauge-container">
|
||
<div class="hud-radar-gauge-header">
|
||
<span class="hud-gauge-title">SURVEILLANCE RADAR SIGNAL</span>
|
||
<span id="hud-gauge-state" class="hud-gauge-status status-green">ALL CLEAR</span>
|
||
</div>
|
||
<div class="hud-signal-meter" id="hud-signal-meter">
|
||
<div class="signal-bar bar-1 active-green" title="Signal Level 1"></div>
|
||
<div class="signal-bar bar-2" title="Signal Level 2"></div>
|
||
<div class="signal-bar bar-3" title="Signal Level 3"></div>
|
||
<div class="signal-bar bar-4" title="Signal Level 4"></div>
|
||
<div class="signal-bar bar-5" title="Signal Level 5"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Alert Sensitivity Selector (City Mode vs Highway Mode) -->
|
||
<div class="hud-sensitivity-row">
|
||
<span class="sensitivity-label">RADAR RANGE:</span>
|
||
<div class="sensitivity-toggle-group">
|
||
<button id="btn-sens-city" class="sens-btn active" title="Alert within 1,000 ft (Optimal for city driving)">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="4" y="2" width="16" height="20" rx="2" ry="2"/><line x1="9" y1="22" x2="9" y2="18"/><line x1="15" y1="22" x2="15" y2="18"/><line x1="9" y1="18" x2="15" y2="18"/><line x1="8" y1="6" x2="8.01" y2="6"/><line x1="16" y1="6" x2="16.01" y2="6"/><line x1="8" y1="10" x2="8.01" y2="10"/><line x1="16" y1="10" x2="16.01" y2="10"/><line x1="8" y1="14" x2="8.01" y2="14"/><line x1="16" y1="14" x2="16.01" y2="14"/></svg>
|
||
<span>City (1k ft)</span>
|
||
</button>
|
||
<button id="btn-sens-hwy" class="sens-btn" title="Alert within 2,500 ft (Optimal for freeway/SR-14 speeds)">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="4" y1="21" x2="8" y2="3"/><line x1="20" y1="21" x2="16" y2="3"/><line x1="12" y1="5" x2="12" y2="8"/><line x1="12" y1="12" x2="12" y2="15"/><line x1="12" y1="19" x2="12" y2="21"/></svg>
|
||
<span>Highway (2.5k ft)</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Live Auto-Spotted Status Badge -->
|
||
<div id="hud-spotted-badge" class="hud-spotted-badge" title="Location auto-detected via network & GPS">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 10a7.33 7.33 0 0 0 10 10l1-3.5L8.5 10z"/><path d="M21 3l-8.5 8.5"/><path d="M15 6l2 2"/></svg>
|
||
<span id="hud-spotted-text">Spotting Antelope Valley Location...</span>
|
||
</div>
|
||
|
||
<!-- Quick Antelope Valley Selector Bar -->
|
||
<div class="hud-location-selector">
|
||
<div class="location-quick-chips">
|
||
<button id="btn-locate-me" class="loc-chip active" title="Re-detect your location via IP & GPS">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></svg>
|
||
<span>Auto-Detect (GPS)</span>
|
||
</button>
|
||
<button id="btn-loc-palmdale" class="loc-chip" title="Jump to Palmdale Blvd & 10th St W">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
||
<span>Palmdale</span>
|
||
</button>
|
||
<button id="btn-loc-lancaster" class="loc-chip" title="Jump to Lancaster ALPR Grid">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
||
<span>Lancaster</span>
|
||
</button>
|
||
<button id="btn-loc-palmdale-east" class="loc-chip" title="Jump to East Palmdale">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
||
<span>East AV</span>
|
||
</button>
|
||
<button id="btn-loc-palmdale-south" class="loc-chip" title="Jump to South Palmdale">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
||
<span>South AV</span>
|
||
</button>
|
||
<button id="btn-loc-rancho" class="loc-chip" title="Jump to West AV">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
|
||
<span>West AV</span>
|
||
</button>
|
||
</div>
|
||
<form id="map-search-form" class="map-search-box">
|
||
<input type="text" id="map-search-input" placeholder="Search Antelope Valley street or address..." autocomplete="off">
|
||
<button type="submit" id="btn-search-go">Jump</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
|
||
<!-- Floating Navigation & Driving Controls (Drawer on Mobile, Top-Right on Desktop) -->
|
||
<div class="map-top-controls" id="map-top-controls">
|
||
<div class="drawer-header" id="drawer-header">
|
||
<span class="drawer-title" style="display: flex; align-items: center; gap: 8px;">
|
||
<svg class="flock-svg flock-svg-md" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
|
||
Driving Controls & Settings
|
||
</span>
|
||
<button type="button" id="btn-close-tools" class="btn-close-drawer" aria-label="Close controls">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
|
||
<button id="btn-follow-car" class="btn-hud-action active" title="Automatically keep map centered on your vehicle">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></svg>
|
||
<span>Follow Car: ON</span>
|
||
</button>
|
||
|
||
<button id="btn-live-gps" class="btn-hud-action" title="Start continuous real-time GPS tracking on your device">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="2"/><path d="M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"/></svg>
|
||
<span>Live GPS Drive</span>
|
||
</button>
|
||
|
||
<button id="btn-map-layer" class="btn-hud-action" title="Toggle between Dark Canvas and Satellite View">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 2 7 12 12 22 7 12 2"/><polyline points="2 17 12 22 22 17"/><polyline points="2 12 12 17 22 12"/></svg>
|
||
<span>Satellite / Dark</span>
|
||
</button>
|
||
|
||
<button id="btn-fullscreen-mount" class="btn-hud-action" title="Toggle Fullscreen Dashboard Mount Mode">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/></svg>
|
||
<span>Dashboard Fullscreen</span>
|
||
</button>
|
||
|
||
<button id="btn-drawer-support" class="btn-hud-action btn-support-highlight" title="Help support developer ($10/mo, $10, $20, $50)">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
||
<span>Help Support Developer</span>
|
||
</button>
|
||
|
||
<button id="btn-test-camera" class="btn-hud-action" title="Drop a test camera 400ft ahead of your current location to test proximity alerts">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>
|
||
<span>Place Camera 400ft Ahead</span>
|
||
</button>
|
||
|
||
<button id="btn-admin-manage-pins" class="btn-hud-action" title="Admin: Manage and remove cameras you placed (the 1,439 official municipal portals are protected)">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg>
|
||
<span>Admin: Placed Pins</span>
|
||
</button>
|
||
|
||
<button id="btn-test-alert" class="btn-hud-action" title="Immediately test voice alert and radar siren">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14"/><path d="M15.54 8.46a5 5 0 0 1 0 7.07"/></svg>
|
||
<span>Test Alert Voice</span>
|
||
</button>
|
||
|
||
<button id="btn-sim-drive" class="btn-hud-action" title="Simulate driving through Palmdale camera corridors">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg>
|
||
<span>Simulate Palmdale Drive</span>
|
||
</button>
|
||
|
||
<button id="btn-reset-sim" class="btn-hud-action" title="Reset drive position">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/></svg>
|
||
<span>Reset Car</span>
|
||
</button>
|
||
|
||
<button id="btn-mute-sound" class="btn-hud-action" title="Toggle audio alert chime and voice">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14"/><path d="M15.54 8.46a5 5 0 0 1 0 7.07"/></svg>
|
||
<span>Sound: ON</span>
|
||
</button>
|
||
|
||
<button id="btn-mobile-connect" class="btn-hud-action" title="Show mobile network link to open on phone in car">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"/><line x1="12" y1="18" x2="12.01" y2="18"/></svg>
|
||
<span>Phone Link</span>
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Backdrop Overlay for Mobile Drawer -->
|
||
<div id="tools-overlay" class="tools-overlay hidden"></div>
|
||
|
||
<!-- Floating Map Legend (Bottom-Left) -->
|
||
<div class="map-legend">
|
||
<div class="legend-header">
|
||
<span class="legend-pulse-dot"></span>
|
||
<span>RADAR ZONE LEGEND</span>
|
||
</div>
|
||
<div class="legend-content">
|
||
<div class="legend-item">
|
||
<span class="legend-sample-zone"></span>
|
||
<span>Camera Detection Zone (280-450m)</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span class="legend-sample-pin"></span>
|
||
<span>ALPR Camera Node</span>
|
||
</div>
|
||
<div class="legend-item">
|
||
<span class="legend-sample-car"></span>
|
||
<span>Your Vehicle Heading</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Floating Recenter Pill (Appears when map is dragged away from car) -->
|
||
<button id="btn-recenter-car" class="btn-recenter-pill hidden" title="Re-center map on your vehicle">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="22" y1="12" x2="18" y2="12"/><line x1="6" y1="12" x2="2" y2="12"/><line x1="12" y1="6" x2="12" y2="2"/><line x1="12" y1="22" x2="12" y2="18"/></svg>
|
||
<span>Recenter on Vehicle</span>
|
||
</button>
|
||
|
||
<!-- Giant 1-Tap Floating Action Button: Snap & Log Flock Camera (Bottom-Right) -->
|
||
<div class="driver-fab-container">
|
||
<button id="btn-quick-log-cam" class="btn-driver-fab" title="Snap camera photo on pole & log at GPS location">
|
||
<div class="fab-icon-glow">
|
||
<svg class="flock-svg flock-svg-lg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
|
||
</div>
|
||
<div class="fab-text-group">
|
||
<span class="fab-main-title">+ SNAP & LOG CAMERA</span>
|
||
<span class="fab-sub-title">Opens Camera for Photo Proof</span>
|
||
</div>
|
||
</button>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ========================================================================
|
||
VIEW 2: NATIONAL DIRECTORY (ORIGINAL PORTAL DATABASE)
|
||
======================================================================== -->
|
||
<div id="directory-view" style="display: none;">
|
||
<!-- Hero & Aggregate KPI Metrics -->
|
||
<header class="hero-section">
|
||
<div class="container">
|
||
<div class="hero-pill">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
|
||
</svg>
|
||
<span>CIVIC SURVEILLANCE TRANSPARENCY</span>
|
||
</div>
|
||
|
||
<h1 class="hero-title">
|
||
The Public Directory of <span class="gradient-text">Flock Safety Transparency Portals</span>
|
||
</h1>
|
||
|
||
<p class="hero-subtitle">
|
||
Search 1,439+ official police transparency portals detailing camera counts, 30-day vehicle detection volumes, database queries, and inter-agency sharing networks.
|
||
</p>
|
||
|
||
<!-- Stats Grid -->
|
||
<div class="stats-grid" id="stats-grid">
|
||
<div class="stat-card">
|
||
<div class="stat-number" id="stat-portals">1,439</div>
|
||
<div class="stat-label">Public Portals</div>
|
||
<div class="stat-subtext">Across 45 U.S. States</div>
|
||
</div>
|
||
<div class="stat-card radar-card">
|
||
<div class="stat-number" id="stat-cameras">37,250+</div>
|
||
<div class="stat-label">Cameras Reported</div>
|
||
<div class="stat-subtext">Active Roadway ALPR Nodes</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-number" id="stat-vehicles">346.7M</div>
|
||
<div class="stat-label">Vehicles Tracked</div>
|
||
<div class="stat-subtext">Rolling 30-Day Detections</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-number" id="stat-searches">256,957</div>
|
||
<div class="stat-label">Police Searches</div>
|
||
<div class="stat-subtext">Database Queries Executed</div>
|
||
</div>
|
||
<div class="stat-card radar-card">
|
||
<div class="stat-number" id="stat-hits">10.2M+</div>
|
||
<div class="stat-label">Hotlist Hits</div>
|
||
<div class="stat-subtext">Alerts Pushed to Cruisers</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- Main Directory Content -->
|
||
<main class="container" id="directory-section">
|
||
<!-- State Quick Jump Bar -->
|
||
<div class="state-chips-wrapper">
|
||
<div class="state-chips-header">
|
||
<span class="chips-title">
|
||
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6"></polygon>
|
||
</svg>
|
||
Quick Filter by Top States
|
||
</span>
|
||
<button class="btn-secondary" id="btn-reset-all" style="padding: 4px 10px; font-size: 0.75rem;">Reset All Filters</button>
|
||
</div>
|
||
<div class="state-chips-scroll" id="state-chips-scroll"></div>
|
||
</div>
|
||
|
||
<!-- Search & Controls Panel -->
|
||
<div class="controls-panel">
|
||
<div class="search-input-wrapper">
|
||
<span class="search-icon" aria-hidden="true">
|
||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<circle cx="11" cy="11" r="8"></circle>
|
||
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
|
||
</svg>
|
||
</span>
|
||
<input
|
||
type="text"
|
||
id="search-input"
|
||
class="search-input"
|
||
placeholder="Search by city, county, agency name, or state (e.g. Lexington, Cobb County, Fort Worth)..."
|
||
autocomplete="off"
|
||
spellcheck="false"
|
||
>
|
||
<button id="clear-search-btn" class="clear-search-btn" title="Clear search">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
<span class="search-shortcut">/</span>
|
||
</div>
|
||
|
||
<div class="filter-controls-grid">
|
||
<div class="control-group">
|
||
<label for="state-filter" class="control-label">State</label>
|
||
<select id="state-filter" class="select-custom">
|
||
<option value="ALL">All States (45)</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="control-group">
|
||
<label for="type-filter" class="control-label">Agency Type</label>
|
||
<select id="type-filter" class="select-custom">
|
||
<option value="ALL">All Agency Types</option>
|
||
<option value="PD">Police Department (PD)</option>
|
||
<option value="SO">Sheriff's Office (SO)</option>
|
||
<option value="OTHER">Campus / Airport / Other</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="control-group">
|
||
<label for="sort-select" class="control-label">Sort Order</label>
|
||
<select id="sort-select" class="select-custom">
|
||
<option value="cameras-desc">Most Cameras Reported</option>
|
||
<option value="vehicles-desc">Most Vehicles Tracked</option>
|
||
<option value="searches-desc">Most Police Searches</option>
|
||
<option value="hits-desc">Most Hotlist Alerts</option>
|
||
<option value="alpha-asc">Agency Name (A to Z)</option>
|
||
<option value="alpha-desc">Agency Name (Z to A)</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="control-group">
|
||
<label class="checkbox-toggle-label">
|
||
<input type="checkbox" id="audit-toggle">
|
||
<span class="toggle-switch"></span>
|
||
<span>Public Audit Available Only</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="action-controls-row">
|
||
<div class="results-counter" id="results-counter">
|
||
Showing <strong id="showing-count">0</strong> of <strong id="total-count">1,439</strong> portals
|
||
</div>
|
||
|
||
<div class="view-actions-group">
|
||
<button class="btn-secondary" id="btn-export-csv" title="Download filtered dataset as CSV">
|
||
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
||
<polyline points="7 10 12 15 17 10"></polyline>
|
||
<line x1="12" y1="15" x2="12" y2="3"></line>
|
||
</svg>
|
||
Export CSV
|
||
</button>
|
||
|
||
<div class="view-toggle-btns" role="radiogroup" aria-label="View Switcher">
|
||
<button class="view-btn active" id="view-cards-btn" title="Card View" aria-checked="true" role="radio">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<rect x="3" y="3" width="7" height="7"></rect>
|
||
<rect x="14" y="3" width="7" height="7"></rect>
|
||
<rect x="14" y="14" width="7" height="7"></rect>
|
||
<rect x="3" y="14" width="7" height="7"></rect>
|
||
</svg>
|
||
</button>
|
||
<button class="view-btn" id="view-table-btn" title="Table View" aria-checked="false" role="radio">
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<line x1="8" y1="6" x2="21" y2="6"></line>
|
||
<line x1="8" y1="12" x2="21" y2="12"></line>
|
||
<line x1="8" y1="18" x2="21" y2="18"></line>
|
||
<line x1="3" y1="6" x2="3.01" y2="6"></line>
|
||
<line x1="3" y1="12" x2="3.01" y2="12"></line>
|
||
<line x1="3" y1="18" x2="3.01" y2="18"></line>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Specific Camera Nodes & Hardware Images for Searched City / Location -->
|
||
<section id="directory-cameras-section" class="directory-cameras-section" style="display: none; margin-bottom: 36px;">
|
||
<div class="dir-cam-header" style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; padding: 14px 18px; background: rgba(6, 182, 212, 0.08); border: 1px solid rgba(6, 182, 212, 0.25); border-radius: 14px;">
|
||
<div style="display: flex; align-items: center; gap: 10px;">
|
||
<span class="dir-cam-header-icon-box" style="display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 8px; background: rgba(6, 182, 212, 0.15); color: #38bdf8;">
|
||
<svg class="flock-svg flock-svg-md" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
|
||
</span>
|
||
<div>
|
||
<h3 style="margin: 0; font-size: 1.1rem; color: #38bdf8; font-family: var(--font-heading);">
|
||
Identified Camera Nodes in <span id="dir-cam-query-title">City</span>
|
||
</h3>
|
||
<span id="dir-cam-subtitle" style="font-size: 0.8rem; color: #94a3b8;">
|
||
Mapped intersections, cross streets, and physical hardware photos
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<span id="dir-cam-badge-count" style="background: #06b6d4; color: #07090e; font-weight: 800; font-size: 0.78rem; padding: 4px 12px; border-radius: 9999px;">
|
||
0 Cameras
|
||
</span>
|
||
</div>
|
||
|
||
<div id="directory-cameras-grid" class="directory-cameras-grid">
|
||
<!-- Dynamically populated camera cards with photos, cross streets, and jump-to-radar buttons -->
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Cards Grid View -->
|
||
<div class="portals-grid" id="portals-grid" aria-live="polite"></div>
|
||
|
||
<!-- Table View -->
|
||
<div class="table-container" id="table-container">
|
||
<table class="portals-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Agency / Department</th>
|
||
<th>State</th>
|
||
<th>Cameras</th>
|
||
<th>30d Vehicles</th>
|
||
<th>Searches</th>
|
||
<th>Hotlist Alerts</th>
|
||
<th>Sharing</th>
|
||
<th>Action</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="table-body"></tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<!-- Pagination -->
|
||
<div class="pagination-wrapper" id="pagination-controls"></div>
|
||
</main>
|
||
|
||
<!-- Educational & Civil Liberties Section -->
|
||
<section class="education-section" id="education-section">
|
||
<div class="container">
|
||
<div class="education-header">
|
||
<h2 class="education-title">What You Need to Know About Flock Surveillance</h2>
|
||
<p class="education-desc">
|
||
Automated License Plate Readers (ALPR) represent one of the fastest-growing mass surveillance networks in United States history. Understanding how the technology works is essential for civic transparency.
|
||
</p>
|
||
</div>
|
||
|
||
<div class="education-grid">
|
||
<article class="edu-card">
|
||
<div class="edu-card-icon" aria-hidden="true">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path>
|
||
<circle cx="12" cy="13" r="4"></circle>
|
||
</svg>
|
||
</div>
|
||
<h3 class="edu-card-title">Beyond Plates: "Vehicle Fingerprint"</h3>
|
||
<p class="edu-card-text">
|
||
Flock cameras do not merely log plate numbers. Their computer vision models extract a full visual profile on every passing car:
|
||
</p>
|
||
<ul class="edu-card-list">
|
||
<li>Make, model, color, and trim styling</li>
|
||
<li>Bumper stickers, window decals, and roof racks</li>
|
||
<li>Dents, damage, aftermarket wheels, and missing hubcaps</li>
|
||
<li>Temporary and dealer paper tags</li>
|
||
</ul>
|
||
</article>
|
||
|
||
<article class="edu-card">
|
||
<div class="edu-card-icon" aria-hidden="true" style="background: rgba(239, 68, 68, 0.12); border-color: rgba(239, 68, 68, 0.3); color: var(--accent-radar);">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
|
||
</svg>
|
||
</div>
|
||
<h3 class="edu-card-title">Fourth Amendment & Warrantless Tracking</h3>
|
||
<p class="edu-card-text">
|
||
Civil liberties advocates argue that interconnected ALPR grids violate constitutional protections against warrantless dragnet tracking:
|
||
</p>
|
||
<ul class="edu-card-list">
|
||
<li><strong>Carpenter v. United States (2018):</strong> Individuals maintain a reasonable expectation of privacy in the whole of their physical movements.</li>
|
||
<li><strong>United States v. Jones (2012):</strong> Prolonged automated surveillance exceeds traditional visual police monitoring.</li>
|
||
<li><strong>Cross-County Sharing:</strong> Inter-agency networks allow out-of-town agencies to track movements across jurisdictions without warrants.</li>
|
||
</ul>
|
||
</article>
|
||
|
||
<article class="edu-card">
|
||
<div class="edu-card-icon" aria-hidden="true" style="background: rgba(99, 102, 241, 0.12); border-color: rgba(99, 102, 241, 0.3); color: #a5b4fc;">
|
||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<circle cx="12" cy="12" r="10"></circle>
|
||
<line x1="12" y1="16" x2="12" y2="12"></line>
|
||
<line x1="12" y1="8" x2="12.01" y2="8"></line>
|
||
</svg>
|
||
</div>
|
||
<h3 class="edu-card-title">How Transparency Portals Work</h3>
|
||
<p class="edu-card-text">
|
||
Transparency Portals provide valuable aggregate metrics, but have critical limitations that the public should understand:
|
||
</p>
|
||
<ul class="edu-card-list">
|
||
<li><strong>Portals Are Voluntary:</strong> Police departments are not required to publish them. Many agencies keep deployments confidential.</li>
|
||
<li><strong>Aggregate Only:</strong> Portals show monthly sums, not individual license plate queries.</li>
|
||
<li><strong>Private HOA Feeds:</strong> Cameras purchased by private homeowners associations and linked to police are often unlisted.</li>
|
||
</ul>
|
||
</article>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Footer -->
|
||
<footer class="site-footer">
|
||
<div class="container footer-content">
|
||
<div class="footer-disclaimer">
|
||
<strong>About This Directory:</strong> Independent public interest directory aggregating publicly accessible Flock Safety transparency portals. Data is sourced from municipal portals and civic surveillance watchdogs.
|
||
</div>
|
||
<div class="footer-links">
|
||
<a href="https://transparency.flocksafety.com" target="_blank" rel="noopener noreferrer" class="footer-link">Flock Transparency</a>
|
||
<a href="https://eyesonflock.com" target="_blank" rel="noopener noreferrer" class="footer-link">Eyes On Flock</a>
|
||
<a href="https://haveibeenflocked.com" target="_blank" rel="noopener noreferrer" class="footer-link">Audit Search</a>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 1: DEEP AGENCY INSPECTION MODAL (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="agency-modal" class="agency-dialog" aria-labelledby="modal-agency-name">
|
||
<div class="modal-header">
|
||
<div class="modal-header-titles">
|
||
<h2 id="modal-agency-name" class="modal-agency-name">Agency Name</h2>
|
||
<div class="modal-agency-meta">
|
||
<span id="modal-agency-location">City, ST</span>
|
||
<span>•</span>
|
||
<span id="modal-agency-slug" style="font-family: var(--font-mono); color: var(--accent-cyan);">slug</span>
|
||
</div>
|
||
</div>
|
||
<button id="modal-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
|
||
<div class="modal-body">
|
||
<div class="modal-cta-box">
|
||
<div class="modal-cta-text">
|
||
<h4>Official Flock Transparency Portal</h4>
|
||
<p>Access the live, unedited municipal transparency dashboard directly on Flock’s servers.</p>
|
||
</div>
|
||
<a href="#" id="modal-portal-url" target="_blank" rel="noopener noreferrer" class="btn-open-flock">
|
||
<span>Open Official Portal</span>
|
||
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
||
<polyline points="15 3 21 3 21 9"></polyline>
|
||
<line x1="10" y1="14" x2="21" y2="3"></line>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="modal-stats-grid">
|
||
<div class="modal-stat-box">
|
||
<div class="modal-stat-num" id="modal-stat-cameras">0</div>
|
||
<div class="modal-stat-label">Cameras Reported</div>
|
||
</div>
|
||
<div class="modal-stat-box">
|
||
<div class="modal-stat-num" id="modal-stat-vehicles">0</div>
|
||
<div class="modal-stat-label">30-Day Captures</div>
|
||
</div>
|
||
<div class="modal-stat-box">
|
||
<div class="modal-stat-num" id="modal-stat-searches">0</div>
|
||
<div class="modal-stat-label">Searches Conducted</div>
|
||
</div>
|
||
<div class="modal-stat-box">
|
||
<div class="modal-stat-num" id="modal-stat-hits">0</div>
|
||
<div class="modal-stat-label">Hotlist Alerts</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="modal-section" id="modal-reasons-section">
|
||
<h3 class="modal-section-title">Reported Search Justifications</h3>
|
||
<div class="reasons-list" id="modal-reasons-list"></div>
|
||
</div>
|
||
|
||
<div class="modal-section">
|
||
<h3 class="modal-section-title">
|
||
Inter-Agency Sharing Network (<span id="modal-sharing-count">0</span> Departments)
|
||
</h3>
|
||
<p class="policy-text" style="margin-bottom: 12px; font-size: 0.8rem;">
|
||
Outside law enforcement agencies that can search vehicles logged by this agency's cameras.
|
||
</p>
|
||
<input type="text" id="modal-sharing-search" class="sharing-search-input" placeholder="Filter partner agencies...">
|
||
<div class="sharing-partners-box" id="modal-sharing-box"></div>
|
||
</div>
|
||
|
||
<div class="modal-section">
|
||
<h3 class="modal-section-title">Department Policy & Prohibited Uses</h3>
|
||
<p class="policy-text" id="modal-prohibited-text">Standard policy restrictions apply.</p>
|
||
</div>
|
||
|
||
<div class="modal-section">
|
||
<h3 class="modal-section-title">Public Records & Civic Research</h3>
|
||
<div class="research-tools-row">
|
||
<a href="#" id="modal-google-contract-link" target="_blank" rel="noopener noreferrer" class="btn-research">
|
||
Search City Council Contract & Minutes ↗
|
||
</a>
|
||
<button id="modal-copy-link-btn" class="btn-research">Copy Direct Portal Link</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 2: WAZE-STYLE DRIVER LOGIN & PROFILE MODAL (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="login-modal" class="agency-dialog" aria-labelledby="login-modal-title">
|
||
<div class="modal-header">
|
||
<div class="modal-header-titles">
|
||
<h2 id="login-modal-title" class="modal-agency-name">Driver Profile & Scout Login</h2>
|
||
<div class="modal-agency-meta">Join the community awareness grid to contribute camera sightings</div>
|
||
</div>
|
||
<button id="login-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<form id="login-form">
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="login-username" style="display:block; margin-bottom: 6px;">Driver Handle / Callsign</label>
|
||
<input type="text" id="login-username" class="search-input" style="padding: 12px;" placeholder="e.g. NightRider, HighwayScout" required>
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="login-vehicle" style="display:block; margin-bottom: 6px;">Vehicle Description (For Scout Profile)</label>
|
||
<input type="text" id="login-vehicle" class="search-input" style="padding: 12px;" placeholder="e.g. 2022 Honda Civic (Blue)" value="Sedan (Silver)">
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 24px;">
|
||
<label class="checkbox-toggle-label" style="margin-top: 0;">
|
||
<input type="checkbox" id="login-sound" checked>
|
||
<span class="toggle-switch"></span>
|
||
<span>Enable Audio Chimes on Zone Entry</span>
|
||
</label>
|
||
</div>
|
||
|
||
<div style="display: flex; gap: 12px; flex-wrap: wrap;">
|
||
<button type="submit" class="btn-open-flock" style="flex: 1; justify-content: center; cursor: pointer; border: none;">
|
||
Save Profile & Connect
|
||
</button>
|
||
<button type="button" id="login-guest-btn" class="btn-secondary" style="padding: 10px 18px;">
|
||
Continue as Guest Scout
|
||
</button>
|
||
</div>
|
||
|
||
<!-- Admin Camera Management Section -->
|
||
<div class="admin-profile-section" style="margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border-subtle);">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;">
|
||
<h4 style="font-size: 0.9rem; color: #f8fafc; display: flex; align-items: center; gap: 6px;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
|
||
<span>Admin: Manage Placed Cameras</span>
|
||
</h4>
|
||
<span id="admin-placed-count" style="font-size: 0.75rem; color: #38bdf8; background: rgba(56, 189, 248, 0.15); padding: 2px 8px; border-radius: 10px;">0 Placed</span>
|
||
</div>
|
||
<p style="font-size: 0.76rem; color: #94a3b8; margin-bottom: 12px;">
|
||
Manage and remove any cameras you placed or tested. The 1,439 official municipal transparency portals remain permanent and protected.
|
||
</p>
|
||
<div id="admin-placed-cams-list" style="max-height: 160px; overflow-y: auto; margin-bottom: 12px; display: flex; flex-direction: column; gap: 6px;">
|
||
<!-- Rendered via JS -->
|
||
</div>
|
||
<button type="button" id="btn-admin-clear-all-placed" class="btn-secondary" style="width: 100%; padding: 10px; color: #f87171; border-color: rgba(239, 68, 68, 0.4); justify-content: center; display: flex; align-items: center; gap: 8px;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg>
|
||
<span>Clear All Placed Pins (Keep Real Locations)</span>
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 3: CROWDSOURCED CAMERA REPORT MODAL (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="report-modal" class="agency-dialog" aria-labelledby="report-modal-title">
|
||
<div class="modal-header">
|
||
<div class="modal-header-titles">
|
||
<h2 id="report-modal-title" class="modal-agency-name">Report Flock Camera Sighting</h2>
|
||
<div class="modal-agency-meta">Help alert the driver network to new ALPR surveillance installations</div>
|
||
</div>
|
||
<button id="report-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<form id="report-form">
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="report-mount-type" style="display:block; margin-bottom: 6px;">Camera Installation Type</label>
|
||
<select id="report-mount-type" class="select-custom" style="width: 100%;">
|
||
<option value="Solar Pole Mount">Solar Pole Mount (Standard Falcon)</option>
|
||
<option value="Traffic Signal Mount">Traffic Signal / Utility Pole Mount</option>
|
||
<option value="Raven Audio Node">Raven Audio Sensor + Camera Combo</option>
|
||
<option value="Mobile Trailer ALPR">Mobile Surveillance Trailer</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="report-intersection" style="display:block; margin-bottom: 6px;">Intersection / Highway Marker</label>
|
||
<input type="text" id="report-intersection" class="search-input" style="padding: 12px;" placeholder="e.g. Main St & 4th Ave, Mile Marker 104" required>
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="report-notes" style="display:block; margin-bottom: 6px;">Observations / Direction Facing</label>
|
||
<input type="text" id="report-notes" class="search-input" style="padding: 12px;" placeholder="e.g. Northbound lanes, black solar panel on pole">
|
||
</div>
|
||
|
||
<!-- Optional Photo Proof in Report Modal -->
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" style="display:block; margin-bottom: 6px;">Physical Hardware Photo Proof (Recommended)</label>
|
||
<div class="photo-proof-upload-zone" id="report-photo-zone">
|
||
<button type="button" id="btn-report-add-photo" class="btn-secondary" style="width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 12px;">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
|
||
<span id="report-photo-btn-text">Snap Camera on Pole (+100 pts)</span>
|
||
</button>
|
||
<div id="report-photo-preview-box" class="photo-preview-box hidden" style="margin-top: 10px; position: relative;">
|
||
<img id="report-photo-preview-img" src="" alt="Camera preview" style="width: 100%; max-height: 180px; object-fit: cover; border-radius: var(--radius-md); border: 1px solid var(--accent-cyan);">
|
||
<button type="button" id="btn-report-remove-photo" style="position: absolute; top: 6px; right: 6px; background: rgba(0,0,0,0.7); color: #fff; border: none; border-radius: 50%; width: 26px; height: 26px; cursor: pointer; display: flex; align-items: center; justify-content: center;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 24px;">
|
||
<div>
|
||
<label class="control-label" for="report-lat" style="display:block; margin-bottom: 6px;">Latitude</label>
|
||
<input type="number" step="0.00001" id="report-lat" class="search-input" style="padding: 10px;" required>
|
||
</div>
|
||
<div>
|
||
<label class="control-label" for="report-lng" style="display:block; margin-bottom: 6px;">Longitude</label>
|
||
<input type="number" step="0.00001" id="report-lng" class="search-input" style="padding: 10px;" required>
|
||
</div>
|
||
</div>
|
||
|
||
<button type="submit" class="btn-open-flock" style="width: 100%; justify-content: center; cursor: pointer; border: none;">
|
||
Broadcast Camera Alert to Network (+50 pts)
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 4: SURVEILLANCE ZONE HARDWARE PROOF & COMMUNITY VOTING (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="camera-detail-modal" class="agency-dialog hardware-proof-dialog" aria-labelledby="cam-detail-title">
|
||
<div class="modal-header">
|
||
<div class="modal-header-titles">
|
||
<div class="cam-verification-badge" id="cam-detail-verify-badge">
|
||
<span class="badge-dot dot-clear"></span>
|
||
<span id="cam-detail-verify-text">CHECKING VERIFICATION...</span>
|
||
</div>
|
||
<h2 id="cam-detail-title" class="modal-agency-name" style="margin-top: 6px;">Flock Camera Location</h2>
|
||
<div class="modal-agency-meta" id="cam-detail-meta">Managing Agency & Hardware Registry</div>
|
||
</div>
|
||
<button id="cam-detail-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<!-- Hardware Photo Proof Area -->
|
||
<div class="proof-photo-container" id="cam-proof-container">
|
||
<!-- Populated dynamically via JS: either real driver photo or upload prompt -->
|
||
</div>
|
||
|
||
<!-- Hardware Specifications Grid -->
|
||
<div class="modal-section" style="margin-top: 20px;">
|
||
<h3 class="modal-section-title">Hardware Telemetry & Location</h3>
|
||
<div class="proof-specs-grid">
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">INSTALLATION TYPE</span>
|
||
<span class="spec-val" id="spec-mount-type">Solar Pole Mount</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">MANAGING ENTITY</span>
|
||
<span class="spec-val" id="spec-agency">Local Law Enforcement</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">EST. 30-DAY LOGS</span>
|
||
<span class="spec-val" id="spec-captures">300,000+ Reads</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">COORDINATES</span>
|
||
<span class="spec-val" id="spec-coords">34.6019, -118.1484</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Community Consensus & Anti-Sabotage Rule Banner -->
|
||
<div class="proof-consensus-banner">
|
||
<div class="consensus-icon">
|
||
<svg class="flock-svg flock-svg-md" style="color: #38bdf8;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
|
||
</div>
|
||
<div class="consensus-text">
|
||
<strong>Democratic Checks & Balances Active</strong>
|
||
<p>Flock cameras are permanent municipal installations. To prevent law enforcement or bad actors from deleting active surveillance zones, locations are protected by community consensus.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Voting & Action Bar -->
|
||
<div class="proof-actions-row">
|
||
<button id="btn-vote-confirm-cam" class="btn-proof-action btn-confirm-vote" title="Confirm camera is still bolted to pole">
|
||
<span class="btn-icon">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 10v12"/><path d="M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2h0a3.13 3.13 0 0 1 3 3.88Z"/></svg>
|
||
</span>
|
||
<span id="btn-vote-confirm-text">Confirm Active (1)</span>
|
||
</button>
|
||
|
||
<button id="btn-proof-add-photo" class="btn-proof-action btn-add-photo" title="Snap or upload a photo of the camera on the pole">
|
||
<span class="btn-icon">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
|
||
</span>
|
||
<span id="btn-proof-photo-text">Add Photo Proof</span>
|
||
</button>
|
||
|
||
<button id="btn-proof-contest" class="btn-proof-action btn-contest-vote" title="Report camera removed or inaccurate">
|
||
<span class="btn-icon">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
|
||
</span>
|
||
<span>Contest</span>
|
||
</button>
|
||
|
||
<a id="btn-proof-navigate" href="#" target="_blank" rel="noopener noreferrer" class="btn-proof-action btn-nav-maps" title="Open navigation in Apple/Google Maps">
|
||
<span class="btn-icon">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="3 11 22 2 13 21 11 13 3 11"/></svg>
|
||
</span>
|
||
<span>Maps ↗</span>
|
||
</a>
|
||
</div>
|
||
|
||
<!-- Specific Agency Directory Records & Surveillance Policy -->
|
||
<div class="modal-section proof-directory-records-section" id="proof-directory-records-section" style="margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--border-subtle);">
|
||
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;">
|
||
<h3 class="modal-section-title" style="margin: 0; font-size: 0.95rem; color: #38bdf8; display: flex; align-items: center; gap: 6px;">
|
||
<svg class="flock-svg flock-svg-md" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><rect x="8" y="2" width="8" height="4" rx="1" ry="1"/></svg>
|
||
<span>Agency Surveillance & Policy Records</span>
|
||
</h3>
|
||
<span id="proof-dir-source-badge" style="font-size: 0.72rem; padding: 2px 8px; border-radius: 10px; background: rgba(56, 189, 248, 0.15); color: #38bdf8; border: 1px solid rgba(56, 189, 248, 0.3);">
|
||
Official Transparency Data
|
||
</span>
|
||
</div>
|
||
|
||
<!-- 4-Box Key Stats (Cameras, Volume, Searches, Retention) -->
|
||
<div class="proof-specs-grid" style="margin-bottom: 14px;">
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">CAMERAS IN FLEET</span>
|
||
<span class="spec-val" id="proof-dir-cameras" style="color: #38bdf8;">--</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">30-DAY DETECTIONS</span>
|
||
<span class="spec-val" id="proof-dir-volume" style="color: #34d399;">--</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">POLICE SEARCHES</span>
|
||
<span class="spec-val" id="proof-dir-searches">--</span>
|
||
</div>
|
||
<div class="proof-spec-card">
|
||
<span class="spec-label">DATA RETENTION</span>
|
||
<span class="spec-val" id="proof-dir-retention" style="color: #fbbf24;">30 Days Auto-Purge</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Inter-Agency Data Sharing Network -->
|
||
<div class="proof-sharing-section" style="margin-bottom: 14px; background: rgba(15, 23, 42, 0.6); border: 1px solid rgba(148, 163, 184, 0.15); border-radius: 12px; padding: 12px 14px;">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
||
<strong style="font-size: 0.8rem; color: #e2e8f0; display: flex; align-items: center; gap: 6px;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>
|
||
<span>Inter-Agency Surveillance Sharing:</span>
|
||
</strong>
|
||
<span id="proof-dir-sharing-count" style="font-size: 0.75rem; color: #38bdf8; font-weight: 700;">Regional Law Enforcement</span>
|
||
</div>
|
||
<p style="font-size: 0.74rem; color: #94a3b8; margin: 0 0 8px; line-height: 1.4;">
|
||
Plate reads from this camera are broadcast to regional and federal law enforcement partners:
|
||
</p>
|
||
<div id="proof-dir-sharing-tags" style="display: flex; flex-wrap: wrap; gap: 5px; max-height: 90px; overflow-y: auto;">
|
||
<!-- Sharing tags rendered dynamically -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Top Search Justifications -->
|
||
<div id="proof-dir-reasons-box" style="margin-bottom: 14px; background: rgba(15, 23, 42, 0.6); border: 1px solid rgba(148, 163, 184, 0.15); border-radius: 12px; padding: 12px 14px;">
|
||
<strong style="font-size: 0.8rem; color: #e2e8f0; display: flex; align-items: center; gap: 6px; margin-bottom: 6px;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||
<span>Primary Search Audit Reasons:</span>
|
||
</strong>
|
||
<div id="proof-dir-reasons-list" style="display: flex; flex-direction: column; gap: 4px; font-size: 0.75rem; color: #cbd5e1;">
|
||
<!-- Rendered dynamically -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Official City Portal Link (Opens in New Tab - Never leaves the radar map) -->
|
||
<div id="proof-portal-link-box" style="margin-top: 12px;">
|
||
<a id="btn-proof-official-portal" href="#" target="_blank" rel="noopener noreferrer" class="btn-secondary" style="width: 100%; padding: 12px; display: flex; align-items: center; justify-content: center; gap: 8px; text-decoration: none; border-color: #06b6d4; color: #38bdf8; font-weight: 600;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
|
||
<span id="btn-proof-portal-text">Open Official Transparency Portal ↗</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Admin Removal Control (Only Active for Custom Placed Pins) -->
|
||
<div id="cam-admin-control-box" class="admin-control-box" style="margin-top: 16px; padding-top: 14px; border-top: 1px dashed rgba(239, 68, 68, 0.3); text-align: center; display: none;">
|
||
<button type="button" id="btn-admin-delete-cam" class="btn-admin-delete" style="width: 100%; padding: 11px; background: rgba(239, 68, 68, 0.15); border: 1px solid #ef4444; color: #f87171; border-radius: var(--radius-md); font-weight: 600; font-size: 0.82rem; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; transition: all 0.2s ease;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg>
|
||
<span>Admin: Delete This Placed Camera</span>
|
||
</button>
|
||
<span style="display: block; font-size: 0.7rem; color: #94a3b8; margin-top: 5px;">
|
||
(Only available for custom placed pins. The 1,439 official municipal portals are permanent & protected.)
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 5: CONTEST CAMERA / REPORT REMOVAL MODAL (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="contest-modal" class="agency-dialog" aria-labelledby="contest-modal-title">
|
||
<div class="modal-header">
|
||
<div class="modal-header-titles">
|
||
<h2 id="contest-modal-title" class="modal-agency-name">Contest Camera Location</h2>
|
||
<div class="modal-agency-meta">Community Checks & Balances to Prevent Misinformation</div>
|
||
</div>
|
||
<button id="contest-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<form id="contest-form">
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="contest-reason" style="display:block; margin-bottom: 6px;">Reason for Contesting</label>
|
||
<select id="contest-reason" class="select-custom" style="width: 100%;">
|
||
<option value="Camera / Solar Panel physically removed from pole">Camera / Solar Panel physically removed from pole</option>
|
||
<option value="Not a Flock ALPR (Standard CCTV / traffic light sensor)">Not a Flock ALPR (Standard CCTV / traffic sensor)</option>
|
||
<option value="Incorrect intersection or misplaced GPS pin">Incorrect intersection or misplaced GPS pin</option>
|
||
<option value="Spam or fraudulent pin">Spam or fraudulent pin</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 16px;">
|
||
<label class="control-label" for="contest-notes" style="display:block; margin-bottom: 6px;">Observations / Verification Notes</label>
|
||
<textarea id="contest-notes" class="search-input" style="padding: 12px; height: 80px; resize: vertical;" placeholder="Describe why this pin is inaccurate or what was found on the pole..." required></textarea>
|
||
</div>
|
||
|
||
<div class="form-group" style="margin-bottom: 20px;">
|
||
<label class="control-label" style="display:block; margin-bottom: 6px;">Photo Proof of Empty Pole (Optional)</label>
|
||
<button type="button" id="btn-contest-add-photo" class="btn-secondary" style="width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 12px;">
|
||
<svg class="flock-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
|
||
<span id="contest-photo-btn-text">Snap Empty Pole</span>
|
||
</button>
|
||
<div id="contest-photo-preview-box" class="photo-preview-box hidden" style="margin-top: 10px; position: relative;">
|
||
<img id="contest-photo-preview-img" src="" alt="Contest photo" style="width: 100%; max-height: 160px; object-fit: cover; border-radius: var(--radius-md); border: 1px solid var(--accent-amber);">
|
||
<button type="button" id="btn-contest-remove-photo" style="position: absolute; top: 6px; right: 6px; background: rgba(0,0,0,0.7); color: #fff; border: none; border-radius: 50%; width: 26px; height: 26px; cursor: pointer; display: flex; align-items: center; justify-content: center;">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="proof-consensus-banner" style="margin-bottom: 20px;">
|
||
<div class="consensus-icon">
|
||
<svg class="flock-svg flock-svg-md" style="color: #f59e0b;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z"/><path d="m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z"/><path d="M7 21h10"/><path d="M12 3v18"/><path d="M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2"/></svg>
|
||
</div>
|
||
<div class="consensus-text">
|
||
<strong>Consensus Safeguard:</strong>
|
||
<p>A single report does not delete a verified camera. Once 3 trusted scouts flag a location or photo proof of an empty pole is verified, the camera is archived.</p>
|
||
</div>
|
||
</div>
|
||
|
||
<button type="submit" class="btn-open-flock" style="width: 100%; justify-content: center; cursor: pointer; border: none; background: linear-gradient(135deg, #f59e0b, #d97706);">
|
||
Submit Contest Report
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- ========================================================================
|
||
MODAL 6: DEVELOPER SUPPORT & STRIPE INTEGRATION (<dialog>)
|
||
======================================================================== -->
|
||
<dialog id="support-modal" class="agency-dialog support-dialog" aria-labelledby="support-modal-title">
|
||
<div class="modal-header support-modal-header">
|
||
<div class="modal-header-titles">
|
||
<div class="support-dev-pill">
|
||
<span class="support-heart-icon">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
||
</span>
|
||
<span>Independent Developer Support</span>
|
||
</div>
|
||
<h2 id="support-modal-title" class="modal-agency-name">Help Support This Developer</h2>
|
||
<div class="modal-agency-meta">Fuel real-time camera tracking, nationwide scrapers, and independent ALPR transparency</div>
|
||
</div>
|
||
<button id="support-close-btn" class="close-modal-btn" aria-label="Close modal">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
|
||
</button>
|
||
</div>
|
||
|
||
<div class="modal-body support-modal-body">
|
||
<p class="support-intro-text">
|
||
FlockRadar is 100% independently coded, researched, and maintained. Your direct support pays for continuous municipal portal scraping, real-time audio radar servers, GPS algorithms, and hardware photo hosting.
|
||
</p>
|
||
|
||
<!-- Recurring Monthly Growth Sustainer Banner Card -->
|
||
<a href="https://buy.stripe.com/dRmeVdbYbcdoeFd9BbeME0t" target="_blank" rel="noopener noreferrer" class="monthly-sub-banner">
|
||
<div class="monthly-sub-left">
|
||
<div class="monthly-badge">
|
||
<span class="pulse-sub-dot"></span>
|
||
<span>Recurring Monthly Support</span>
|
||
</div>
|
||
<div class="monthly-title">Monthly Growth Sustainer</div>
|
||
<div class="monthly-desc">
|
||
Ongoing monthly support to power server infrastructure, continuous municipal portal scraping, and app development. Cancel anytime with 1 click.
|
||
</div>
|
||
</div>
|
||
<div class="monthly-sub-right">
|
||
<div class="monthly-price-wrap">
|
||
<span class="monthly-price">$10</span>
|
||
<span class="monthly-cadence">/ month</span>
|
||
</div>
|
||
<div class="btn-subscribe-monthly">
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="currentColor" stroke="none"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
||
<span>Subscribe $10/mo</span>
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
|
||
<div class="support-divider">
|
||
<span>OR CHOOSE A ONE-TIME CONTRIBUTION</span>
|
||
</div>
|
||
|
||
<div class="support-tiers-grid">
|
||
<!-- $10 Tier -->
|
||
<a href="https://buy.stripe.com/5kQ14ne6j0uG8gPeVveME0p" target="_blank" rel="noopener noreferrer" class="support-tier-card">
|
||
<div class="tier-badge-label">Radar Coffee</div>
|
||
<div class="tier-amount">$10</div>
|
||
<div class="tier-desc">Covers daily portal scrapers and keeps server infrastructure running smoothly.</div>
|
||
<div class="btn-support-tier">
|
||
<span>Support $10</span>
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- $20 Tier (Popular) -->
|
||
<a href="https://buy.stripe.com/bJeaEX2nB5P02Wv5kVeME0q" target="_blank" rel="noopener noreferrer" class="support-tier-card tier-featured">
|
||
<div class="tier-popular-ribbon">Most Popular</div>
|
||
<div class="tier-badge-label">Active Contributor</div>
|
||
<div class="tier-amount">$20</div>
|
||
<div class="tier-desc">Directly funds real-time audio radar alerts, walking/driving GPS tracking, and mobile updates.</div>
|
||
<div class="btn-support-tier btn-featured">
|
||
<span>Support $20</span>
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- $50 Tier -->
|
||
<a href="https://buy.stripe.com/aFabJ12nB1yK8gPeVveME0r" target="_blank" rel="noopener noreferrer" class="support-tier-card">
|
||
<div class="tier-badge-label">Champion Sponsor</div>
|
||
<div class="tier-amount">$50</div>
|
||
<div class="tier-desc">Sponsors nationwide ALPR expansion, verified camera hardware proof storage, and full-time coding.</div>
|
||
<div class="btn-support-tier">
|
||
<span>Support $50</span>
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
|
||
</div>
|
||
</a>
|
||
|
||
<!-- Custom Amount -->
|
||
<a href="https://buy.stripe.com/bJe9AT1jxfpA2Wv28JeME0s" target="_blank" rel="noopener noreferrer" class="support-tier-card tier-custom">
|
||
<div class="tier-badge-label">Custom Amount</div>
|
||
<div class="tier-amount">Any $</div>
|
||
<div class="tier-desc">Choose your own custom contribution amount to support development ($5 min).</div>
|
||
<div class="btn-support-tier btn-custom">
|
||
<span>Choose Amount</span>
|
||
<svg class="flock-svg flock-svg-xs" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="support-security-footer">
|
||
<div class="security-badges-row">
|
||
<div class="sec-item">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>
|
||
<span>Secured by <strong>Stripe</strong></span>
|
||
</div>
|
||
<div class="sec-item">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>
|
||
<span>Apple Pay & Google Pay Supported</span>
|
||
</div>
|
||
<div class="sec-item">
|
||
<svg class="flock-svg flock-svg-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 14 14"/></svg>
|
||
<span>Instant 1-Click Contribution</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</dialog>
|
||
|
||
<!-- Hidden Native Camera / File Input for Mobile Evidence Snapping -->
|
||
<input type="file" id="camera-photo-file-input" accept="image/*" capture="environment" style="display: none;">
|
||
|
||
<!-- Toast Container -->
|
||
<div id="toast-container" class="toast-container" aria-live="assertive"></div>
|
||
|
||
<!-- Leaflet Map JS -->
|
||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
|
||
|
||
<!-- Data & Application Logic with Cache Busting -->
|
||
<script src="data/portals.js?v=18"></script>
|
||
<script src="js/icons.js?v=18"></script>
|
||
<script src="js/auth.js?v=18"></script>
|
||
<script src="js/radar.js?v=18"></script>
|
||
<script src="js/app.js?v=18"></script>
|
||
|
||
<!-- Service Worker Instant Cache Invalidation -->
|
||
<script>
|
||
if ('serviceWorker' in navigator) {
|
||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||
registrations.forEach(r => r.update());
|
||
});
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|