import re def update_file(filepath): with open(filepath, 'r', encoding='utf-8') as f: content = f.read() # Match from // Sovereign In-App Routing Engine down to document.getElementById('stopNavBtn').addEventListener pattern = r'// Sovereign In-App Routing Engine.*?(?=document\.getElementById\(\'stopNavBtn\'\)\.addEventListener)' new_code = '''// Sovereign In-App Routing Engine (Strict 100% In-House, Zero Google Maps) const SOVEREIGN_MAP_API_KEY = new URLSearchParams(window.location.search).get('key') || localStorage.getItem('map_admin_key') || localStorage.getItem('intaleq_api_key') || ''; function isPointInCountry(lat, lng, country) { if (country === 'العراق') return lat >= 29.0 && lat <= 37.5 && lng >= 38.5 && lng <= 49.0; if (country === 'الأردن') return lat >= 29.1 && lat <= 33.4 && lng >= 34.8 && lng <= 39.3; if (country === 'سوريا') return lat >= 32.3 && lat <= 37.4 && lng >= 35.6 && lng <= 42.4; if (country === 'مصر') return lat >= 21.9 && lat <= 31.7 && lng >= 24.7 && lng <= 36.9; return false; } function startSovereignNavigation(lm) { document.getElementById('landmarkDrawer').style.display = 'none'; const [gateLng, gateLat] = lm.gate; // Authoritative national routing origins [lng, lat] const defaultHubs = { 'العراق': [44.3661, 33.3152], // بغداد - ساحة النسور 'الأردن': [35.9106, 31.9539], // عمان - الدوار الرابع 'سوريا': [36.2765, 33.5138], // دمشق - ساحة الأمويين 'مصر': [31.2357, 30.0444] // القاهرة - ميدان التحرير }; const fallbackHub = defaultHubs[lm.country] || defaultHubs['العراق']; function computeAndDraw(startLng, startLat) { // If start point is outside the landmark's sovereign road graph, snap start to national hub if (!isPointInCountry(startLat, startLng, lm.country)) { startLng = fallbackHub[0]; startLat = fallbackHub[1]; } const queryParams = `fromLat=${startLat}&fromLng=${startLng}&toLat=${gateLat}&toLng=${gateLng}&profile=car&steps=true&locale=ar&key=${SOVEREIGN_MAP_API_KEY}`; // Target local API or direct sovereign production endpoint const isServerEnv = window.location.hostname.includes('intaleqapp.com') || window.location.port === '3201' || window.location.port === '3204'; const primaryUrl = isServerEnv ? `/api/maps/route?${queryParams}` : `http://188.68.36.205:3200/api/maps/route?${queryParams}`; const fallbackUrl = `http://188.68.36.205:3200/api/maps/route?${queryParams}`; function requestRoute(urlToFetch, isFallback) { return fetch(urlToFetch, { headers: { 'x-api-key': SOVEREIGN_MAP_API_KEY } }) .then(r => { if (!r.ok) throw new Error('HTTP ' + r.status); return r.json(); }) .catch(err => { if (!isFallback && urlToFetch !== fallbackUrl) { console.warn('Retrying routing via sovereign fallback endpoint...', err); return requestRoute(fallbackUrl, true); } throw err; }); } requestRoute(primaryUrl, false) .then(data => { if (!data || !data.points) throw new Error('No road geometry returned'); const coords = typeof data.points === 'string' ? decodePolyline(data.points) : data.points; if (!coords || coords.length < 2) throw new Error('Empty polyline nodes'); const distKm = (data.distance / 1000).toFixed(1); const etaMins = Math.round(data.duration ? data.duration / 60 : (data.time ? data.time / 60000 : (parseFloat(distKm) / 75) * 60)); const routeName = data.routeName || 'شبكة الطرق الوطنية السريعة'; const instruction = (data.instructions && data.instructions.length > 1) ? `${routeName} • ${data.instructions[1].text}` : `🛣️ ${routeName} مباشرة إلى بوابة الموقع ومواقف الحافلات`; drawRouteOnMap(coords, distKm, etaMins, lm, instruction, routeName); }) .catch(err => { console.error('Sovereign routing engine error:', err); alert('تم استدعاء مسار الطرق، يرجى التحقق من اتصال محرك التوجيه السيادي.'); }); } // 1. Calculate immediately from national hub for zero-latency response computeAndDraw(fallbackHub[0], fallbackHub[1]); // 2. If live GPS is granted and inside the same country, refine route seamlessly if ('geolocation' in navigator) { navigator.geolocation.getCurrentPosition( pos => { if (isPointInCountry(pos.coords.latitude, pos.coords.longitude, lm.country)) { computeAndDraw(pos.coords.longitude, pos.coords.latitude); } }, err => console.log('Geolocation note:', err.message), { timeout: 2500 } ); } } function drawRouteOnMap(coords, distKm, etaMins, lm, instruction, routeName) { const geojson = { type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: coords } }; if (map.getSource('sovereign-route')) { map.getSource('sovereign-route').setData(geojson); } else { map.addSource('sovereign-route', { type: 'geojson', data: geojson }); map.addLayer({ id: 'sovereign-route-casing', type: 'line', source: 'sovereign-route', layout: { 'line-join': 'round', 'line-cap': 'round' }, paint: { 'line-color': '#0369a1', 'line-width': 8, 'line-opacity': 0.85 } }); map.addLayer({ id: 'sovereign-route-core', type: 'line', source: 'sovereign-route', layout: { 'line-join': 'round', 'line-cap': 'round' }, paint: { 'line-color': '#38bdf8', 'line-width': 4.5 } }); } const bounds = coords.reduce((b, coord) => b.extend(coord), new maplibregl.LngLatBounds(coords[0], coords[0])); map.fitBounds(bounds, { padding: 90, pitch: 40, bearing: 5, duration: 1800 }); document.getElementById('navDestName').innerText = `بوابة ${lm.name_ar} (نقطة العبور ومواقف الحافلات)`; document.getElementById('navDistance').innerText = distKm; document.getElementById('navEta').innerText = etaMins; document.getElementById('navInstruction').innerText = instruction || 'اسلك المسار المضاء نحو نقطة الوصول'; document.getElementById('sovereignNavHud').style.display = 'block'; } ''' new_content = re.sub(pattern, new_code, content, flags=re.DOTALL) with open(filepath, 'w', encoding='utf-8') as f: f.write(new_content) print(f'Updated {filepath}') files = [ 'apps/dashboard/tourism.html', 'apps/dashboard/tourism/index.html', 'apps/web/public/tourism.html', 'apps/web/public/tourism/index.html' ] for fp in files: update_file(fp)