feat(directory): enhance cross streets callout, camera photos, and city search integration

This commit is contained in:
2026-09-12 09:47:29 -07:00
parent be8981d024
commit ef36bfb050
7 changed files with 197 additions and 58 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

+88 -2
View File
@@ -1379,9 +1379,94 @@ body {
justify-content: space-between;
}
/* Prominent Cross Streets Box */
.dir-cam-cross-box {
display: flex;
align-items: center;
gap: 10px;
background: linear-gradient(135deg, rgba(6, 182, 212, 0.12), rgba(15, 23, 42, 0.6));
border: 1px solid rgba(6, 182, 212, 0.35);
border-radius: 8px;
padding: 8px 12px;
margin-bottom: 12px;
}
.dir-cam-cross-icon {
font-size: 1.25rem;
flex-shrink: 0;
}
.dir-cam-cross-content {
display: flex;
flex-direction: column;
min-width: 0;
}
.dir-cam-cross-label {
font-size: 0.64rem;
font-weight: 800;
letter-spacing: 0.08em;
color: #38bdf8;
font-family: var(--font-mono);
}
.dir-cam-cross-value {
font-size: 0.95rem;
font-weight: 800;
color: #ffffff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.dir-cam-city-tag {
font-size: 0.75rem;
color: #94a3b8;
background: rgba(255, 255, 255, 0.05);
padding: 2px 8px;
border-radius: 4px;
}
.dir-cam-img-hover-hint {
position: absolute;
bottom: 8px;
right: 8px;
font-size: 0.68rem;
background: rgba(0, 0, 0, 0.75);
color: #38bdf8;
padding: 3px 8px;
border-radius: 4px;
backdrop-filter: blur(4px);
pointer-events: none;
opacity: 0;
transition: opacity 0.2s ease;
}
.dir-cam-card:hover .dir-cam-img-hover-hint {
opacity: 1;
}
.btn-dir-cam-upload-trigger {
margin-top: 6px;
background: rgba(6, 182, 212, 0.15);
border: 1px solid rgba(6, 182, 212, 0.4);
color: #38bdf8;
border-radius: 6px;
padding: 5px 12px;
font-size: 0.75rem;
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease;
}
.btn-dir-cam-upload-trigger:hover {
background: rgba(6, 182, 212, 0.3);
color: #ffffff;
}
.dir-cam-intersection {
font-family: var(--font-heading);
font-size: 1.05rem;
font-size: 1.02rem;
font-weight: 700;
color: #ffffff;
margin-bottom: 6px;
@@ -1394,7 +1479,8 @@ body {
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 6px;
gap: 8px;
flex-wrap: wrap;
}
.dir-cam-specs-row {
+5 -5
View File
@@ -28,7 +28,7 @@
<meta name="apple-mobile-web-app-title" content="FlockRadar">
<!-- Main Stylesheet -->
<link rel="stylesheet" href="css/styles.css?v=11">
<link rel="stylesheet" href="css/styles.css?v=12">
</head>
<body>
@@ -1055,10 +1055,10 @@
<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=11"></script>
<script src="js/auth.js?v=11"></script>
<script src="js/radar.js?v=11"></script>
<script src="js/app.js?v=11"></script>
<script src="data/portals.js?v=12"></script>
<script src="js/auth.js?v=12"></script>
<script src="js/radar.js?v=12"></script>
<script src="js/app.js?v=12"></script>
<!-- Service Worker Instant Cache Invalidation -->
<script>
+57 -11
View File
@@ -354,17 +354,47 @@
const agencyMatch = (c.agency || '').toLowerCase().includes(q);
const slugMatch = (c.slug || '').toLowerCase().includes(q);
const notesMatch = (c.notes || '').toLowerCase().includes(q);
return nameMatch || agencyMatch || slugMatch || notesMatch;
const cityMatch = (c.city || '').toLowerCase().includes(q);
const crossMatch = (c.crossStreets || '').toLowerCase().includes(q);
const stateMatch = (c.state || '').toLowerCase() === q;
return nameMatch || agencyMatch || slugMatch || notesMatch || cityMatch || crossMatch || stateMatch;
});
// Filter by state if state dropdown is not ALL
if (state.selectedState && state.selectedState !== 'ALL') {
matchingCams = matchingCams.filter(c => {
if (c.state) return c.state.toUpperCase() === state.selectedState.toUpperCase();
if (state.selectedState === 'CA') return c.id.includes('plm') || c.id.includes('lan') || c.id.includes('cal');
return true;
});
}
// Filter by agency type if not ALL
if (state.selectedType && state.selectedType !== 'ALL') {
matchingCams = matchingCams.filter(c => {
if (c.dept_type) return c.dept_type.toUpperCase() === state.selectedType.toUpperCase();
if (state.selectedType === 'SO') return (c.agency && (c.agency.toLowerCase().includes('sheriff') || c.agency.includes('LASD')));
if (state.selectedType === 'PD') return (c.agency && (c.agency.toLowerCase().includes('police') || c.agency.includes('PD')));
return true;
});
}
} else if (state.selectedState && state.selectedState !== 'ALL') {
matchingCams = allCams.filter(c => {
if (state.selectedState === 'CA') {
return c.id.includes('plm') || c.id.includes('lan') || c.id.includes('cal') || (c.agency && c.agency.includes('LASD'));
let stMatch = false;
if (c.state) stMatch = (c.state.toUpperCase() === state.selectedState.toUpperCase());
else if (state.selectedState === 'CA') stMatch = c.id.includes('plm') || c.id.includes('lan') || c.id.includes('cal');
else if (state.selectedState === 'KY') stMatch = c.id.includes('lex');
else if (state.selectedState === 'GA') stMatch = c.id.includes('atl');
else if (state.selectedState === 'TX') stMatch = c.id.includes('dfw');
if (!stMatch) return false;
if (state.selectedType && state.selectedType !== 'ALL') {
if (c.dept_type) return c.dept_type.toUpperCase() === state.selectedType.toUpperCase();
if (state.selectedType === 'SO') return (c.agency && (c.agency.toLowerCase().includes('sheriff') || c.agency.includes('LASD')));
if (state.selectedType === 'PD') return (c.agency && (c.agency.toLowerCase().includes('police') || c.agency.includes('PD')));
}
if (state.selectedState === 'KY') return c.id.includes('lex');
if (state.selectedState === 'GA') return c.id.includes('atl');
if (state.selectedState === 'TX') return c.id.includes('dfw');
return false;
return true;
});
}
@@ -395,20 +425,26 @@
const photoUrl = meta.photoUrl || cam.photoUrl || null;
const hasPhoto = !!photoUrl;
const crossStreets = cam.crossStreets || (cam.name ? cam.name.split('(')[0].replace(/^.*?-\s*/, '').trim() : 'Intersection Camera');
const badgeHtml = meta.isContested
? `<span class="dir-cam-badge unverified">🟠 CONTESTED</span>`
: (hasPhoto ? `<span class="dir-cam-badge verified">🟢 PHOTO VERIFIED</span>` : `<span class="dir-cam-badge unverified">⚠️ FLOCK RECORDED</span>`);
: (hasPhoto ? `<span class="dir-cam-badge verified">🟢 HARDWARE PHOTO VERIFIED</span>` : `<span class="dir-cam-badge unverified">⚠️ SIGHTING RECORDED</span>`);
const imageContainerHtml = hasPhoto
? `<div class="dir-cam-image-container">
<img src="${photoUrl}" class="dir-cam-img" alt="Camera at ${escapeHtml(cam.name)}" onclick="window.open('${photoUrl}', '_blank')" title="Click to view full photo proof">
<img src="${photoUrl}" class="dir-cam-img" alt="Camera at ${escapeHtml(crossStreets)}" onclick="window.open('${photoUrl}', '_blank')" title="Click to view full photo proof in high resolution">
${badgeHtml}
<div class="dir-cam-img-hover-hint">🔍 Tap to inspect photo proof</div>
</div>`
: `<div class="dir-cam-image-container">
: `<div class="dir-cam-image-container pending">
<div class="dir-cam-placeholder">
<span class="dir-cam-placeholder-icon">📸</span>
<strong style="font-size: 0.82rem; color: #cbd5e1;">Hardware Photo Pending</strong>
<strong style="font-size: 0.84rem; color: #cbd5e1;">Hardware Photo Pending</strong>
<span style="font-size: 0.72rem; color: #94a3b8;">Mounted on utility / signal pole</span>
<button type="button" class="btn-dir-cam-upload-trigger" onclick="window.openCameraHardwareProof('${escapeHtml(cam.id)}')">
<span>+ Upload Photo Proof</span>
</button>
</div>
${badgeHtml}
</div>`;
@@ -418,9 +454,19 @@
${imageContainerHtml}
<div class="dir-cam-body">
<div>
<!-- Cross Streets Prominent Box -->
<div class="dir-cam-cross-box">
<span class="dir-cam-cross-icon">📍</span>
<div class="dir-cam-cross-content">
<span class="dir-cam-cross-label">CROSS STREETS</span>
<strong class="dir-cam-cross-value">${escapeHtml(crossStreets)}</strong>
</div>
</div>
<h4 class="dir-cam-intersection">${escapeHtml(cam.name)}</h4>
<div class="dir-cam-agency-meta">
<span>🏛️ ${escapeHtml(cam.agency || 'Local Law Enforcement')}</span>
${cam.city ? `<span class="dir-cam-city-tag">🗺️ ${escapeHtml(cam.city)}, ${escapeHtml(cam.state || 'CA')}</span>` : ''}
</div>
<div class="dir-cam-specs-row">
+11 -5
View File
@@ -244,15 +244,21 @@
function getCameraMeta(camId) {
if (!cameraMetadata[camId]) {
// Default baseline
const isVerifiedPalmdale = (camId === 'cam-plm-1' || camId === 'cam-plm-9');
cameraMetadata[camId] = {
confirmations: 3, // Baseline community confirmations for directory portals
hasPhoto: false,
photoUrl: null,
photoDate: null,
photoAuthor: null,
confirmations: isVerifiedPalmdale ? 18 : 3, // Baseline community confirmations for directory portals
hasPhoto: isVerifiedPalmdale,
photoUrl: isVerifiedPalmdale ? 'assets/img/flock_pole_cam_palmdale.jpg' : null,
photoDate: isVerifiedPalmdale ? '2026-09-12' : null,
photoAuthor: isVerifiedPalmdale ? 'Driver Scout #814' : null,
isContested: false,
contests: []
};
} else if ((camId === 'cam-plm-1' || camId === 'cam-plm-9') && !cameraMetadata[camId].photoUrl) {
cameraMetadata[camId].hasPhoto = true;
cameraMetadata[camId].photoUrl = 'assets/img/flock_pole_cam_palmdale.jpg';
cameraMetadata[camId].photoDate = '2026-09-12';
cameraMetadata[camId].photoAuthor = 'Driver Scout #814';
}
return cameraMetadata[camId];
}
+29 -29
View File
@@ -11,45 +11,45 @@
// Key metropolitan corridors with realistic camera intersection networks
const DEFAULT_CAMERAS = [
// === PALMDALE & ANTELOPE VALLEY, CA (LOCAL SURVEILLANCE CORRIDORS) ===
{ id: 'cam-plm-1', name: 'Palmdale Blvd & 10th St W (SR-14 Commercial Corridor)', lat: 34.60194, lng: -118.14847, radius: 320, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 6, captures30d: '385,000' },
{ id: 'cam-plm-2', name: 'Palmdale Blvd & 20th St E (East Gateway)', lat: 34.60230, lng: -118.10305, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '295,000' },
{ id: 'cam-plm-3', name: 'Ave R & 47th St E (East Palmdale Hub)', lat: 34.58081, lng: -118.04497, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '240,000' },
{ id: 'cam-plm-4', name: '10th St E & Ave R (Palmdale Civic Center)', lat: 34.57985, lng: -118.11677, radius: 280, agency: 'Palmdale Sheriff Station', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '310,000' },
{ id: 'cam-plm-5', name: 'Ave S & 10th St W (Pelona Vista / Retail)', lat: 34.56829, lng: -118.14702, radius: 300, agency: 'Los Angeles County Sheriff', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '330,000' },
{ id: 'cam-plm-6', name: 'Ave S & 25th St E', lat: 34.55799, lng: -118.08278, radius: 280, agency: 'Flock Safety / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '215,000' },
{ id: 'cam-plm-7', name: 'Ave S & 40th St E', lat: 34.55821, lng: -118.04760, radius: 280, agency: 'Flock Safety / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '190,000' },
{ id: 'cam-plm-8', name: 'Rancho Vista Blvd & 15th St W (AV Mall & Amphitheater)', lat: 34.63179, lng: -118.12594, radius: 350, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 6, captures30d: '410,000' },
{ id: 'cam-plm-9', name: 'Palmdale Blvd & Highland High / 30th St W', lat: 34.60164, lng: -118.18153, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '260,000' },
{ id: 'cam-plm-10', name: 'Pearblossom Hwy & Sierra Hwy (South Gateway)', lat: 34.53625, lng: -118.08431, radius: 320, agency: 'Los Angeles County Sheriff', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '345,000' },
{ id: 'cam-plm-11', name: 'Technology Dr & 10th St W (Auto Center Hub)', lat: 34.59852, lng: -118.14467, radius: 280, agency: 'Commercial ALPR Network', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '280,000' },
{ id: 'cam-plm-12', name: 'Sierra Hwy & Palmdale Blvd (Transit Station)', lat: 34.58259, lng: -118.13690, radius: 280, agency: 'Palmdale Transit Hub', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '290,000' },
{ id: 'cam-plm-1', name: 'Palmdale Blvd & 10th St W (SR-14 Commercial Corridor)', crossStreets: 'Palmdale Blvd & 10th St W', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.60194, lng: -118.14847, radius: 320, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 6, captures30d: '385,000', photoUrl: 'assets/img/flock_pole_cam_palmdale.jpg' },
{ id: 'cam-plm-2', name: 'Palmdale Blvd & 20th St E (East Gateway)', crossStreets: 'Palmdale Blvd & 20th St E', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.60230, lng: -118.10305, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '295,000' },
{ id: 'cam-plm-3', name: 'Ave R & 47th St E (East Palmdale Hub)', crossStreets: 'Ave R & 47th St E', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.58081, lng: -118.04497, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '240,000' },
{ id: 'cam-plm-4', name: '10th St E & Ave R (Palmdale Civic Center)', crossStreets: '10th St E & Ave R', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.57985, lng: -118.11677, radius: 280, agency: 'Palmdale Sheriff Station', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '310,000' },
{ id: 'cam-plm-5', name: 'Ave S & 10th St W (Pelona Vista / Retail)', crossStreets: 'Ave S & 10th St W', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.56829, lng: -118.14702, radius: 300, agency: 'Los Angeles County Sheriff', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '330,000' },
{ id: 'cam-plm-6', name: 'Ave S & 25th St E', crossStreets: 'Ave S & 25th St E', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.55799, lng: -118.08278, radius: 280, agency: 'Flock Safety / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '215,000' },
{ id: 'cam-plm-7', name: 'Ave S & 40th St E', crossStreets: 'Ave S & 40th St E', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.55821, lng: -118.04760, radius: 280, agency: 'Flock Safety / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '190,000' },
{ id: 'cam-plm-8', name: 'Rancho Vista Blvd & 15th St W (AV Mall & Amphitheater)', crossStreets: 'Rancho Vista Blvd & 15th St W', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.63179, lng: -118.12594, radius: 350, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 6, captures30d: '410,000' },
{ id: 'cam-plm-9', name: 'Palmdale Blvd & Highland High / 30th St W', crossStreets: 'Palmdale Blvd & Highland High / 30th St W', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.60164, lng: -118.18153, radius: 300, agency: 'City of Palmdale / LASD', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '260,000', photoUrl: 'assets/img/flock_pole_cam_palmdale.jpg' },
{ id: 'cam-plm-10', name: 'Pearblossom Hwy & Sierra Hwy (South Gateway)', crossStreets: 'Pearblossom Hwy & Sierra Hwy', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.53625, lng: -118.08431, radius: 320, agency: 'Los Angeles County Sheriff', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '345,000' },
{ id: 'cam-plm-11', name: 'Technology Dr & 10th St W (Auto Center Hub)', crossStreets: 'Technology Dr & 10th St W', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.59852, lng: -118.14467, radius: 280, agency: 'Commercial ALPR Network', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '280,000' },
{ id: 'cam-plm-12', name: 'Sierra Hwy & Palmdale Blvd (Transit Station)', crossStreets: 'Sierra Hwy & Palmdale Blvd', city: 'Palmdale', state: 'CA', dept_type: 'SO', lat: 34.58259, lng: -118.13690, radius: 280, agency: 'Palmdale Transit Hub', slug: 'palmdale-ca-lasd', cameras: 4, captures30d: '290,000' },
// === LANCASTER, CA (ANTELOPE VALLEY NORTH) ===
{ id: 'cam-lan-1', name: 'Ave L & 10th St W (Lancaster Commercial)', lat: 34.69718, lng: -118.14770, radius: 320, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 6, captures30d: '390,000' },
{ id: 'cam-lan-2', name: 'Ave K & 30th St W (Lancaster West)', lat: 34.68925, lng: -118.18368, radius: 300, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 4, captures30d: '275,000' },
{ id: 'cam-lan-3', name: 'Ave J & 10th St W (Lancaster Central)', lat: 34.67398, lng: -118.14664, radius: 320, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 6, captures30d: '360,000' },
{ id: 'cam-lan-4', name: 'The BLVD & Sierra Hwy (Lancaster Downtown)', lat: 34.69838, lng: -118.13727, radius: 280, agency: 'Lancaster Downtown BLVD', slug: 'lancaster-ca-lasd', cameras: 4, captures30d: '310,000' },
{ id: 'cam-lan-1', name: 'Ave L & 10th St W (Lancaster Commercial)', crossStreets: 'Ave L & 10th St W', city: 'Lancaster', state: 'CA', dept_type: 'SO', lat: 34.69718, lng: -118.14770, radius: 320, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 6, captures30d: '390,000' },
{ id: 'cam-lan-2', name: 'Ave K & 30th St W (Lancaster West)', crossStreets: 'Ave K & 30th St W', city: 'Lancaster', state: 'CA', dept_type: 'SO', lat: 34.68925, lng: -118.18368, radius: 300, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 4, captures30d: '275,000' },
{ id: 'cam-lan-3', name: 'Ave J & 10th St W (Lancaster Central)', crossStreets: 'Ave J & 10th St W', city: 'Lancaster', state: 'CA', dept_type: 'SO', lat: 34.67398, lng: -118.14664, radius: 320, agency: 'City of Lancaster / LASD', slug: 'lancaster-ca-lasd', cameras: 6, captures30d: '360,000' },
{ id: 'cam-lan-4', name: 'The BLVD & Sierra Hwy (Lancaster Downtown)', crossStreets: 'The BLVD & Sierra Hwy', city: 'Lancaster', state: 'CA', dept_type: 'SO', lat: 34.69838, lng: -118.13727, radius: 280, agency: 'Lancaster Downtown BLVD', slug: 'lancaster-ca-lasd', cameras: 4, captures30d: '310,000' },
// === NATIONAL DEMO CORRIDORS (Lexington, KY) ===
{ id: 'cam-lex-1', name: 'Lexington PD - New Circle Rd & Nicholasville Rd', lat: 37.9942, lng: -84.5268, radius: 300, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 4, captures30d: '284,500' },
{ id: 'cam-lex-2', name: 'Lexington PD - Man o War Blvd & Harrodsburg Rd', lat: 37.9785, lng: -84.5582, radius: 320, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 6, captures30d: '312,000' },
{ id: 'cam-lex-3', name: 'Lexington PD - Richmond Rd & New Circle', lat: 38.0125, lng: -84.4715, radius: 280, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 4, captures30d: '265,100' },
{ id: 'cam-lex-4', name: 'Lexington PD - Downtown High St & S Broadway', lat: 38.0435, lng: -84.5020, radius: 250, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 2, captures30d: '198,400' },
{ id: 'cam-lex-5', name: 'Lexington PD - Russell Cave Rd & I-75', lat: 38.0815, lng: -84.4710, radius: 350, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 8, captures30d: '450,200' },
{ id: 'cam-lex-1', name: 'Lexington PD - New Circle Rd & Nicholasville Rd', crossStreets: 'New Circle Rd & Nicholasville Rd', city: 'Lexington', state: 'KY', dept_type: 'PD', lat: 37.9942, lng: -84.5268, radius: 300, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 4, captures30d: '284,500' },
{ id: 'cam-lex-2', name: 'Lexington PD - Man o War Blvd & Harrodsburg Rd', crossStreets: 'Man o War Blvd & Harrodsburg Rd', city: 'Lexington', state: 'KY', dept_type: 'PD', lat: 37.9785, lng: -84.5582, radius: 320, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 6, captures30d: '312,000' },
{ id: 'cam-lex-3', name: 'Lexington PD - Richmond Rd & New Circle', crossStreets: 'Richmond Rd & New Circle', city: 'Lexington', state: 'KY', dept_type: 'PD', lat: 38.0125, lng: -84.4715, radius: 280, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 4, captures30d: '265,100' },
{ id: 'cam-lex-4', name: 'Lexington PD - Downtown High St & S Broadway', crossStreets: 'High St & S Broadway', city: 'Lexington', state: 'KY', dept_type: 'PD', lat: 38.0435, lng: -84.5020, radius: 250, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 2, captures30d: '198,400' },
{ id: 'cam-lex-5', name: 'Lexington PD - Russell Cave Rd & I-75', crossStreets: 'Russell Cave Rd & I-75', city: 'Lexington', state: 'KY', dept_type: 'PD', lat: 38.0815, lng: -84.4710, radius: 350, agency: 'Lexington Police Department', slug: 'lexington-ky-pd', cameras: 8, captures30d: '450,200' },
// Atlanta / Cobb County / Marietta, GA
{ id: 'cam-atl-1', name: 'Cobb County SO - Cobb Pkwy & Windy Hill Rd', lat: 33.9052, lng: -84.4789, radius: 350, agency: 'Cobb County Sheriff', slug: 'cobb-county-ga', cameras: 6, captures30d: '420,000' },
{ id: 'cam-atl-2', name: 'Marietta PD - Roswell St & Fairground St', lat: 33.9482, lng: -84.5365, radius: 300, agency: 'Marietta Police Department', slug: 'marietta-ga-pd', cameras: 4, captures30d: '290,000' },
{ id: 'cam-atl-3', name: 'Sandy Springs PD - Roswell Rd & Abernathy Rd', lat: 33.9312, lng: -84.3789, radius: 320, agency: 'Sandy Springs Police', slug: 'sandy-springs-ga-pd', cameras: 4, captures30d: '340,000' },
{ id: 'cam-atl-1', name: 'Cobb County SO - Cobb Pkwy & Windy Hill Rd', crossStreets: 'Cobb Pkwy & Windy Hill Rd', city: 'Atlanta', state: 'GA', dept_type: 'SO', lat: 33.9052, lng: -84.4789, radius: 350, agency: 'Cobb County Sheriff', slug: 'cobb-county-ga', cameras: 6, captures30d: '420,000' },
{ id: 'cam-atl-2', name: 'Marietta PD - Roswell St & Fairground St', crossStreets: 'Roswell St & Fairground St', city: 'Marietta', state: 'GA', dept_type: 'PD', lat: 33.9482, lng: -84.5365, radius: 300, agency: 'Marietta Police Department', slug: 'marietta-ga-pd', cameras: 4, captures30d: '290,000' },
{ id: 'cam-atl-3', name: 'Sandy Springs PD - Roswell Rd & Abernathy Rd', crossStreets: 'Roswell Rd & Abernathy Rd', city: 'Sandy Springs', state: 'GA', dept_type: 'PD', lat: 33.9312, lng: -84.3789, radius: 320, agency: 'Sandy Springs Police', slug: 'sandy-springs-ga-pd', cameras: 4, captures30d: '340,000' },
// California - Bay Area & Los Angeles
{ id: 'cam-cal-1', name: 'Vallejo PD - Sonoma Blvd & Redwood St', lat: 38.1125, lng: -122.2541, radius: 320, agency: 'Vallejo Police Department', slug: 'vallejo-ca-pd', cameras: 4, captures30d: '310,000' },
{ id: 'cam-cal-2', name: 'San Mateo County SO - El Camino Real & 5th Ave', lat: 37.5612, lng: -122.3215, radius: 300, agency: 'San Mateo County SO', slug: 'san-mateo-ca-so', cameras: 4, captures30d: '280,000' },
{ id: 'cam-cal-3', name: 'Glendale PD - Brand Blvd & Colorado St', lat: 34.1445, lng: -118.2555, radius: 280, agency: 'Glendale Police Department', slug: 'glendale-az-pd', cameras: 4, captures30d: '260,000' },
{ id: 'cam-cal-1', name: 'Vallejo PD - Sonoma Blvd & Redwood St', crossStreets: 'Sonoma Blvd & Redwood St', city: 'Vallejo', state: 'CA', dept_type: 'PD', lat: 38.1125, lng: -122.2541, radius: 320, agency: 'Vallejo Police Department', slug: 'vallejo-ca-pd', cameras: 4, captures30d: '310,000' },
{ id: 'cam-cal-2', name: 'San Mateo County SO - El Camino Real & 5th Ave', crossStreets: 'El Camino Real & 5th Ave', city: 'San Mateo', state: 'CA', dept_type: 'SO', lat: 37.5612, lng: -122.3215, radius: 300, agency: 'San Mateo County SO', slug: 'san-mateo-ca-so', cameras: 4, captures30d: '280,000' },
{ id: 'cam-cal-3', name: 'Glendale PD - Brand Blvd & Colorado St', crossStreets: 'Brand Blvd & Colorado St', city: 'Glendale', state: 'CA', dept_type: 'PD', lat: 34.1445, lng: -118.2555, radius: 280, agency: 'Glendale Police Department', slug: 'glendale-az-pd', cameras: 4, captures30d: '260,000' },
// Texas - Fort Worth / Dallas Metro
{ id: 'cam-dfw-1', name: 'Fort Worth PD - W 7th St & University Dr', lat: 32.7512, lng: -97.3562, radius: 320, agency: 'Fort Worth Police Department', slug: 'fort-worth-tx-pd', cameras: 6, captures30d: '390,000' },
{ id: 'cam-dfw-2', name: 'Fort Worth PD - Camp Bowie Blvd & Montgomery', lat: 32.7485, lng: -97.3685, radius: 300, agency: 'Fort Worth Police Department', slug: 'fort-worth-tx-pd', cameras: 4, captures30d: '310,000' }
{ id: 'cam-dfw-1', name: 'Fort Worth PD - W 7th St & University Dr', crossStreets: 'W 7th St & University Dr', city: 'Fort Worth', state: 'TX', dept_type: 'PD', lat: 32.7512, lng: -97.3562, radius: 320, agency: 'Fort Worth Police Department', slug: 'fort-worth-tx-pd', cameras: 6, captures30d: '390,000' },
{ id: 'cam-dfw-2', name: 'Fort Worth PD - Camp Bowie Blvd & Montgomery', crossStreets: 'Camp Bowie Blvd & Montgomery', city: 'Fort Worth', state: 'TX', dept_type: 'PD', lat: 32.7485, lng: -97.3685, radius: 300, agency: 'Fort Worth Police Department', slug: 'fort-worth-tx-pd', cameras: 4, captures30d: '310,000' }
];
// Simulated Drive Route: Palmdale Boulevard Corridor (Heading East past 10th St W & Sierra Hwy)
+7 -6
View File
@@ -1,13 +1,14 @@
// Service Worker for FlockRadar Offline Driving & Live Updates
const CACHE_NAME = 'flockradar-v11';
const CACHE_NAME = 'flockradar-v12';
const ASSETS_TO_CACHE = [
'./',
'./index.html',
'./css/styles.css?v=11',
'./js/app.js?v=11',
'./js/auth.js?v=11',
'./js/radar.js?v=11',
'./data/portals.js?v=11',
'./css/styles.css?v=12',
'./js/app.js?v=12',
'./js/auth.js?v=12',
'./js/radar.js?v=12',
'./data/portals.js?v=12',
'./assets/img/flock_pole_cam_palmdale.jpg',
'./manifest.json'
];