<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Organizator Dostaw - System Zarządzania Flotą i Trasami | Orbit Master</title>
    <!-- Favicon and Icons -->
    <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><defs><linearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'><stop offset='0%25' style='stop-color:%23667eea'/><stop offset='100%25' style='stop-color:%23764ba2'/></linearGradient></defs><circle cx='16' cy='16' r='15' fill='url(%23g)' stroke='white'/><ellipse cx='16' cy='16' rx='12' ry='6' fill='none' stroke='white' stroke-width='1.5' opacity='0.6'/><ellipse cx='16' cy='16' rx='6' ry='12' fill='none' stroke='white' stroke-width='1.5' opacity='0.6'/><circle cx='16' cy='16' r='3' fill='white'/><circle cx='28' cy='16' r='2' fill='%23FFD700'/><circle cx='16' cy='4' r='2' fill='%23FFD700'/><circle cx='4' cy='16' r='2' fill='%23FFD700'/></svg>">
    <link rel="canonical" href="https://organizatordostaw.pl/">
    
    <!-- PWA Meta Tags - Compatible with all browsers -->
    <meta name="application-name" content="Organizator Dostaw">
    <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="Organizator Dostaw">
    
    <!-- Theme color for supported browsers -->
    <meta name="theme-color" content="#764ba2" media="(prefers-color-scheme: light)">
    <meta name="theme-color" content="#4a4a4a" media="(prefers-color-scheme: dark)">
    
    <!-- SEO Meta Tags -->
    <meta name="description" content="Profesjonalny system zarządzania flotą kurierską i optymalizacji tras dostawczych. Planowanie dostaw, tracking GPS, nawigacja dla kierowców, analiza efektywności. Organizator Dostaw - kompleksowe rozwiązanie logistyczne.">
    <meta name="keywords" content="organizator dostaw, zarządzanie flotą, planowanie tras, optymalizacja dostaw, system kurierski, tracking GPS, nawigacja dla kierowców, logistyka, transport, kurier, dostawa paczek, planowanie tras dostawczych, monitoring pojazdów, dispatch system, fleet management">
    <meta name="author" content="Orbit Master System">
    <meta name="robots" content="index, follow">
    <meta name="language" content="Polish">
    <meta name="revisit-after" content="7 days">
    <meta name="google-site-verification" content="SXjUeWJKs561H7Py5yYQnlcTBqzDaqzEdEEl5cXf5AA">
    
    <!-- Open Graph Meta Tags (Facebook, LinkedIn) -->
    <meta property="og:title" content="Organizator Dostaw - System Zarządzania Flotą | Orbit Master">
    <meta property="og:description" content="Profesjonalny system do zarządzania flotą kurierską, optymalizacji tras dostawczych i monitoringu GPS. Zwiększ efektywność dostaw o 40%.">
    <meta property="og:type" content="website">
    <meta property="og:url" content="https://organizatordostaw.pl/">
    <meta property="og:site_name" content="Organizator Dostaw">
    <meta property="og:locale" content="pl_PL">
    
    <!-- Twitter Card Meta Tags -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="Organizator Dostaw - System Zarządzania Flotą">
    <meta name="twitter:description" content="Profesjonalny system do zarządzania flotą kurierską i optymalizacji tras dostawczych.">
    
    <!-- Structured Data (JSON-LD) for Google -->
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "SoftwareApplication",
      "name": "Organizator Dostaw - Orbit Master",
      "applicationCategory": "BusinessApplication",
      "operatingSystem": "Web Browser",
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "PLN"
      },
      "description": "Profesjonalny system zarządzania flotą kurierską i optymalizacji tras dostawczych z GPS tracking i nawigacją dla kierowców.",
      "provider": {
        "@type": "Organization",
        "name": "Orbit Master System",
        "url": "https://organizatordostaw.pl"
      },
      "featureList": [
        "Optymalizacja tras dostawczych",
        "Tracking GPS w czasie rzeczywistym",
        "Nawigacja mobilna dla kierowców",
        "Zarządzanie flotą kurierską",
        "Analiza efektywności dostaw",
        "Planowanie tras z K-means clustering",
        "Proof of delivery z GPS i zdjęciami"
      ],
      "softwareVersion": "2.0",
      "inLanguage": "pl"
    }
    </script>
    <!-- Content Security Policy - Firebase Emulators Support + reCAPTCHA Enterprise -->
    <meta http-equiv="Content-Security-Policy" content="
        default-src 'self';
        script-src 'self' 'unsafe-inline' 'unsafe-eval'
            https://www.gstatic.com
            https://apis.google.com
            https://maps.googleapis.com
            https://www.google.com
            https://cdn.jsdelivr.net
            https://cdnjs.cloudflare.com
            https://*.firebaseio.com
            http://localhost:*
            http://127.0.0.1:*;
        style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdnjs.cloudflare.com https://organizatordostaw.pl http://localhost:* http://127.0.0.1:*;
        font-src 'self' https://fonts.gstatic.com https://cdnjs.cloudflare.com;
        img-src 'self' data: https: http: blob:;
        media-src 'self' data:;
        connect-src 'self'
            https://*.mapbox.com
            https://*.googleapis.com
            https://*.gstatic.com
            https://*.firebaseio.com
            https://*.firebase.com
            https://*.cloudfunctions.net
            https://*.run.app
            https://*.metered.live
            https://www.google.com
            https://api.sunrise-sunset.org
            https://api.tomtom.com
            https://recaptchaenterprise.googleapis.com
            https://overpass-api.de
            https://cdnjs.cloudflare.com
            https://cdn.jsdelivr.net
            wss://*.firebaseio.com
            http://localhost:*
            http://127.0.0.1:*
            ws://localhost:*
            ws://127.0.0.1:*;
        frame-src 'self' https://www.google.com https://recaptcha.net https://www.recaptcha.net https://*.firebaseio.com http://localhost:* http://127.0.0.1:*;
        worker-src 'self' blob:;
    ">
    <!-- Stylesheets -->
    <link rel="stylesheet" href="app-styles.css?v=20260129004">
    <link rel="stylesheet" href="css/firebase-status.css?v=20260129004">
    <link rel="stylesheet" href="css/auth.css?v=20260129004">
    <link rel="stylesheet" href="css/index-styles.css?v=20260129004">
    <link rel="stylesheet" href="css/map-fullscreen.css?v=20260129004">
    <link rel="stylesheet" href="css/orbit-statuses.css?v=20260129004">
    <link rel="stylesheet" href="css/orbits-tab.css?v=20260129004">
    <link rel="stylesheet" href="css/history-tab.css?v=20260129004"> <!-- ✅ Historia dostaw -->
    <link rel="stylesheet" href="css/centrum-orbits-modals.css?v=20260129004"> <!-- 🛰️ MODAL 1 & 2: Styling for orbits modals -->
    <link rel="stylesheet" href="css/recaptcha-badge.css?v=20260129004"> <!-- ✅ reCAPTCHA badge styles -->
    <!-- Font Awesome CDN for SVG Icons -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    
    <!-- Google reCAPTCHA v3 - TYMCZASOWO WYŁĄCZONY (nieprawidłowy klucz) -->
    <!-- <script src="https://www.google.com/recaptcha/api.js?render=6LftRBUsAAAAAF4dPT6tQ-CdhOVsicweMdyynetc"></script> -->
</head>
<body>
        <!-- Header container OUTSIDE of root - nie będzie nadpisywany -->
        <script>
            // Tło logowania: zawsze z Hosting (unika CORS/ORB przy ładowaniu z Storage).
            // auth.js może nadpisać po załadowaniu jeśli operator wgrał własne tło do Storage.
            (function() {
                document.body.style.background = 'url(assets/login-background.jpg) no-repeat center center fixed';
                document.body.style.backgroundSize = 'cover';
            })();
        </script>
    <div id="app-header" class="app-header"></div>
    <div id="debug-container" class="debug-container"></div>
    
    <!-- Main application container (app.js będzie tutaj renderować) -->
    <div id="root">
        <!-- reCAPTCHA container (wymagane dla Firebase App Check) -->
        <div id="recaptcha-container"></div>
        
        <div class="main-card">
            <h1 class="main-title">🛰️ Orbit Master System</h1>
            <p class="main-subtitle">Sprawdzanie systemu...</p>
            <div id="connection-status" class="status-text">Inicjalizacja...</div>
            
            <!-- Quick Access Links -->
            <div class="quick-access oms-content">
                <h3 class="quick-access-title">Szybki dostęp</h3>
                <div class="button-container">
                    <a href="/driver/driverAPP.html" class="driver-app-button">
                        🚗 Aplikacja Kierowcy
                    </a>
                    <a href="/clear_cache.html" class="clear-cache-button">
                        🗑️ Clear Cache
                    </a>
                </div>

                <!-- Direct URLs for easy access -->
                <div class="direct-links">
                    <h4 class="direct-links-title">📋 Bezpośrednie linki:</h4>
                    <div class="links-container">
                        <div><strong>Kierowcy:</strong> <span class="link-highlight">https://orbit-firebase-2029.web.app/driver/driverAPP.html</span></div>
                    </div>
                    
                    <!-- reCAPTCHA Info (wymagane jeśli ukrywasz badge) -->
                    <div class="recaptcha-info">
                        🔒 Ta strona jest chroniona przez reCAPTCHA.<br>
                        Obowiązują <a href="https://policies.google.com/privacy" target="_blank" rel="noopener" class="recaptcha-link">Polityka prywatności</a> 
                        i <a href="https://policies.google.com/terms" target="_blank" rel="noopener" class="recaptcha-link">Warunki korzystania z usługi Google</a>.
                    </div>
                </div>
            </div>
        </div>
    </div><!-- ========================================================================= -->
<!-- GOOGLE MAPS INITIALIZATION -->
<!-- ========================================================================= -->
<script>
// ✅ Wycisz błąd Google Maps "Could not load stats" (known issue)
window.addEventListener('error', function(e) {
    if (e.message && e.message.includes('Could not load "stats"')) {
        e.preventDefault();
        e.stopPropagation();
        return true;
    }
}, true);

// Callback wywoływany gdy Google Maps API jest gotowy
function initGoogleMaps() {
    console.log('🗺️ Google Maps API załadowany');
    console.log('🔍 Google object:', typeof window.google);
    console.log('🔍 Google Maps object:', typeof window.google?.maps);
    window.googleMapsReady = true;
    
    // === MAPS MANAGER ===
    if (window.mapService && window.mapService.initializeServices) {
        console.log('🔄 Inicjalizacja MapService...');
        window.mapService.initializeServices();
    }
    
    // === ROUTE EDITOR ===
    if (window.routeEditor && window.routeEditor.initializeServices) {
        console.log('🔄 Inicjalizacja RouteEditor...');
        window.routeEditor.initializeServices();
    }
    
    // === MULTI NAVIGATION ===
    if (window.multiNav && window.multiNav.initializeGoogleMaps) {
        console.log('🔄 Inicjalizacja MultiNavigation...');
        window.multiNav.initializeGoogleMaps();
    }
    
    // === GEOCODING ===
    if (window.geocodingService && window.geocodingService.initialize) {
        console.log('🔄 Inicjalizacja Geocoding...');
        window.geocodingService.initialize();
    }
   
    
    // === ORBITS ===
    if (window.orbitsManager && window.orbitsManager.initializeGoogleMaps) {
        console.log('🔄 Inicjalizacja Orbits...');
        window.orbitsManager.initializeGoogleMaps();
    }
    
    // === GŁÓWNA APLIKACJA ===
    if (window.app && window.app.onGoogleMapsReady) {
        console.log('🔄 Inicjalizacja głównej aplikacji...');
        window.app.onGoogleMapsReady();
    }
    
    // Emit global event dla pozostałych komponentów
    window.dispatchEvent(new CustomEvent('googleMapsReady', {
        detail: { 
            google: window.google,
            timestamp: Date.now()
        }
    }));
    
    console.log('✅ Wszystkie komponenty Google Maps zainicjalizowane');
}

// Globalna flaga dostępności
window.googleMapsReady = false;

// Funkcja sprawdzająca gotowość (dla komponentów ładowanych później)
window.checkGoogleMapsReady = function() {
    if (window.googleMapsReady && window.google && window.google.maps) {
        return true;
    }
    
    console.log('⏳ Google Maps nie jest jeszcze gotowy');
    return false;
};
</script>

<script>
// Google Maps API - async loading with callback and loading=async parameter
(function() {
    const fallbackKey = 'AIzaSyCxgoaDVHRNGlbEre9P_wZufgJ89vnsdaE';
    let configuredKey = window.CONFIG?.googleMapsApiKey;

    if (!configuredKey) {
        try {
            configuredKey = localStorage.getItem('googleMapsApiKey') || sessionStorage.getItem('googleMapsApiKey');
        } catch (_) {
            configuredKey = null;
        }
    }

    const key = String(configuredKey || fallbackKey).trim();

    const script = document.createElement('script');
    script.src = `https://maps.googleapis.com/maps/api/js?key=${encodeURIComponent(key)}&libraries=geometry,places,routes&callback=initGoogleMaps&loading=async`;
    // Nie używaj defer z async - callback inicjuje gdy skrypt się załaduje
    document.head.appendChild(script);
})();
</script>

    <!-- ========================================================================= -->
    <!-- BIBLIOTEKI  -->
    <!-- ========================================================================= -->
	<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.4.1/papaparse.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
    <!-- Firebase SDK v8.10.1 (ostatnia z pełnym Compat wsparciem + globalny 'firebase' object) -->
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-auth.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-firestore.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-database.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-functions.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-storage.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.1/firebase-app-check.js"></script>

<!-- DIAGNOSTYKA GOOGLE MAPS (duplikat usunięty - ładujemy tylko raz w linii 128) -->
<script>
    // Sprawdź po 5 sekundach czy Google Maps się załadowało
    setTimeout(() => {
        if (!window.googleMapsReady) {
            console.warn('⚠️ Google Maps nie załadowało się w ciągu 5 sekund');
            console.log('🔍 Diagnostyka:');
            console.log('- window.google:', typeof window.google);
            console.log('- window.googleMapsReady:', window.googleMapsReady);
            
            // Spróbuj załadować mapę manualnie jeśli Google jest dostępne
            if (window.google && window.google.maps) {
                console.log('🔄 Próba manualnej inicjalizacji Google Maps...');
                initGoogleMaps();
            } else {
                console.log('🔄 Uruchamiam aplikację bez Google Maps...');
                // Uruchom aplikację bez map
                if (window.startOrbitMasterApp) {
                    window.startOrbitMasterApp();
                }
            }
        } else {
            console.log('✅ Google Maps załadowane poprawnie');
        }
    }, 5000);
</script>

<script>
// Firebase config is now handled in config.js
// This script section can be used for other initialization

// Inicjalizacja Firebase
// Firebase initialization is now handled in config.js
// Emulator configuration is also handled there
</script>

    <script src="js/libs/encryption.js"></script>
    <script src="js/libs/qrcode.min.js"></script> <!-- Potrzebny dla KeysPanel w SettingsTab -->
    
    <!-- ========================================================================= -->
    <!--  DEBUG TERMINAL (scalony z HeaderTab.js) -->
    <!-- ========================================================================= -->
    <!-- <script src="js/dashboard_debug.js"></script> - USUNIĘTY, scalony z HeaderTab.js -->
    
    <!-- ========================================================================= -->
    <!-- GLOBALNE FUNKCJE POMOCNICZE I ZABEZPIECZENIA -->
    <!-- ========================================================================= -->
    <!-- bcryptjs dla bezpiecznego hashowania haseł (LOCAL FIRST + multi-CDN fallback) -->
    <!-- Strategia: 1. Lokalna kopia (fastest) 2. cdnjs (primary CDN) 3. unpkg (backup CDN) -->
    <script src="js/libs/bcrypt.min.js" 
            onerror="console.warn('⚠️ Local bcrypt failed, trying CDN...'); this.onerror=function(){console.warn('⚠️ Primary CDN failed, trying backup...'); this.src='https://unpkg.com/bcryptjs@2.4.3/dist/bcrypt.min.js';}; this.src='https://cdnjs.cloudflare.com/ajax/libs/bcryptjs/2.4.3/bcrypt.min.js';"
            onload="console.log('✅ bcrypt loaded from:', this.src); if(window.dcodeIO && window.dcodeIO.bcrypt){window.bcrypt=window.dcodeIO.bcrypt; console.log('✅ bcrypt alias created (dcodeIO.bcrypt → window.bcrypt)');}">
    </script>
  

    <!-- ========================================================================= -->
    <!-- KONFIGURACJA I PODSTAWOWE UTILITY -->
    <!-- ========================================================================= -->
    <script src="js/helpsystem/help_system.js?v=3.0"></script>
    <script src="js/helpsystem/help_editor.js?v=5.0"></script>	
    <script src="js/config.js"></script>
    
    <!-- 🏢 NOWE: Multi-Organization Test Data Initialization -->
    <script src="js/init-multi-org-test-data.js?v=1.0"></script>
    
    <!-- appcheck-init.js przeniesiony na koniec body (wymaga DOM) -->
    <!-- <script src="js/observer.js"></script> --> <!-- AUDYT: nieużywany EventBus, komunikacja przez Firebase -->

    <!-- ========================================================================= -->
    <!-- MANAGERS SYSTEMU -->
    <!-- ========================================================================= -->
    <script src="js/firebase_checker.js"></script>
    <script src="js/firebase_init_service.js?v=20251119001"></script>
    <script async src="js/google-maps-api.js"></script>
    <script src="js/utils/MigrationAPI.js" defer></script>
    <script src="js/utils/MigrationDashboard.js" defer></script>
    <script src="js/managers/MapExportManager.SVG.js" defer></script>
    <script src="js/managers/SessionManager.js?v=6" defer></script>

    <!-- ========================================================================= -->
    <!--  KOMPONENTY -->
    <!-- ========================================================================= -->
    <!-- ✅ REMOVED: HeadOMSTab.js (file not found) -->
	<script src="js/tabs/HeadORSTab.js?v=20250124003" defer></script>
    <script src="js/SymbolLibraryManager.js" defer></script> <!-- ✅ NEW: Custom Symbol Management (Firebase Storage + Firestore) -->
    <script src="js/SymbolEditorModule.js" defer></script> <!-- ✅ NEW: Symbol Editor - create/edit custom markers -->
    <script src="js/tabs/SymbolsTab.js" defer></script> <!-- ✅ ENABLED: Symbol Editor tab (depends on SymbolLibraryManager) -->
    <script src="js/tabs/OrbitsTab.js?v=20251116003500" defer></script>
    <script src="js/tabs/RoutesTab.js?v=20260418006" defer></script>
    <script src="js/tabs/RouteEditTab.js?v=20251119002" defer></script> <!-- ✅ Edytor tras (tab 'edit') + getHTML() -->
    <script src="js/tabs/SettingsTab.js?v=20260224003" defer></script>
    <script src="js/tabs/GlobalTab.js?v=20260224002" defer></script>
    <script src="js/tabs/HistoryTab.js?v=20251122009" defer></script> <!-- ✅ Historia dostaw - v2.1 + Signature system (7 collections, NO photos) -->
    <script src="js/multi_navigation.js" defer></script>
    <script src="js/services/geocoding.js" defer></script>
    <script src="js/notifications.js" defer></script>
    <script src="js/AdvancedRouteOptimizer.js?v=20260418003"></script><!-- road distance cache: roundTripDistanceCache -->
    <script src="js/RouteOptimizerModal.js?v=20260418009"></script> <!-- izolacja pipeline + kolory legend/pasek stref -->
    <script src="js/CloudRoutesSync.js?v=20251214001" defer></script> <!-- ☁️ NOWE: Synchronizacja tras z chmury dla global_admin -->
    
    <!-- Debounce Utility - zapobiega nadmiernemu renderowaniu -->
    <script src="js/utils/debounce.js"></script>
    
    <!-- ✅ NOWE: Navigation Guidance Display - instrukcje turn-by-turn dla kierowcy -->
    <script src="js/NavigationGuidanceDisplay.js" defer></script>
    
    <script src="js/managers/StateDataManager.js" defer></script>
	<script src="js/managers/FirebaseDataManager.js" defer></script>
	<script src="js/managers/UnifiedDataManager.js" defer></script>
	<script src="js/managers/UnifiedOrbitManager.js?v=14"></script>
	<script src="js/managers/GPSOverlayLayer.js"></script>
	<script src="js/managers/SmartLabelLayer.js?v=20260418001"></script> <!-- ✅ Przeciągalne etykiety -->
	<script src="js/managers/TextFrameManager.js"></script> <!-- ✅ DEPLOY #10.21.27: Ramki tekstowe -->
	<script src="js/managers/MapExportManager.PDF.js"></script> <!-- ✅ PRODUCTION STABLE: PDF export manager -->
	<script src="js/managers/MapExportManager.PNG.js"></script> <!-- ✅ PRODUCTION STABLE: PNG export manager -->
	<script src="js/managers/SVGMapExporter.js"></script> <!-- ✅ Warstwowy eksport SVG (tło + trasy + etykiety) -->
	<script src="js/managers/SharedLabelsManager.js"></script> <!-- ✅ SHARED: Text labels for OMS + ROS (Phase 3 extraction) -->
	<script src="js/managers/OverpassMapLayerManager.js"></script> <!-- ✅ NEW: Live traffic lights + railway crossings (Overpass API) -->
	<script src="js/managers/RouteRenderManager.js?v=20260418005"></script> <!-- ✅ FIX: SYNCHRONOUS load (no defer) - required by CentrumTab.init() -->
	<script src="js/managers/RenderSettingsModal.js?v=20260418001" defer></script> <!-- ⚙️ Modal konfiguracji wizualnej tras (global_admin) -->
<script src="js/managers/VoiceCallManager.js" defer></script> <!-- 📞 Domofon głosowy centrum↔kierowca -->
	<!-- ✅ FIX (2026-01-19): CentrumTab modules AFTER RouteRenderManager/RRMCentrum to prevent race condition -->
	<script src="js/tabs/CentrumTabOrbitsModals.js" defer></script> <!-- 🛰️ MODAL 1 & 2: MUSI być PRZED CentrumTab.js -->
	<script src="js/tabs/CentrumTab.js" defer></script>
	<script src="js/tabs/CentrumTabLabelEditor.js" defer></script> <!-- ✅ NEW: Label editing module (extracted from CentrumTab) -->
	<script src="js/tabs/CentrumTabExporter.js" defer></script> <!-- ✅ NEW: Export functionality module - Phase 2 extraction -->
	<script src="js/managers/VehicleTrackingManager.js"></script> <!-- ✅ DEPLOY #10.21.27: Vehicle tracking -->
	<script src="js/managers/SystemUsersManager.js?v=20251119007"></script> <!-- ✅ Reset hasła + blokowanie/odblokowanie + canManageUser -->
	<script src="js/managers/GPXExporter.js" defer></script> <!-- ✅ Export tras do GPX (offline) -->
	<script src="js/managers/OfflineMapNavigator.js" defer></script> <!-- ✅ Nawigacja offline z Google Maps -->
	<script src="js/managers/AdministrativeBoundariesManager.js" defer></script> <!-- ✅ UI dla offline mode (Centrala) -->	
	<script src="js/managers/OfflineModuleUI.js" defer></script> <!-- ✅ UI dla offline mode (Centrala) -->
	<script src="js/tabs/RouteViewerTab.js" defer></script> <!-- ✅ NEW: Route Viewer - preview, edit labels/icons, export to SVG/PNG (AFTER managers!) -->

    <!-- ========================================================================= -->
    <!--  KONWERTERY I NARZĘDZIA -->
    <!-- ========================================================================= -->
    <script src="js/navigationInstructionsConverter.js" defer></script> <!-- 🔄 Konwersja starej struktury navigationInstructions -->

    <!-- ========================================================================= -->
    <!--  APLIKACJA -->
    <!-- ========================================================================= -->
    <script src="js/auth.js?v=20260224005" defer></script>
    <script src="js/app.js?v=40" defer></script> <!-- ✅ defer + cache v39 - fix refreshRouteButtons error -->

    <!-- ========================================================================= -->
    <!-- SYSTEM, LOGI I ADMINISTRACJA -->
    <!-- ========================================================================= -->
    <script src="js/cache_buster.js" defer></script>

    <!-- ========================================================================= -->
    <!-- BIBLIOTEKI ZEWNĘTRZNE -->
    <!-- ========================================================================= -->
    <!-- html2canvas - eksport mapy do obrazów -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js" 
            integrity="sha512-BNaRQnYJYiPSqHHDb58B0yaPfCu+Wgds8Gp/gU33kqBtgNS4tSPHuGibyoeqMV/TJlSKda6FXzoEyYGjTe+vXA==" 
            crossorigin="anonymous" 
            referrerpolicy="no-referrer"></script>
    
    <!-- jsPDF - eksport mapy do PDF -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" 
            integrity="sha512-qZvrmS2ekKPF2mSznTQsxqPgnpkI4DNTlrdUmTzrDgektczlKNRRhy5X5AAOnx5S09ydFYWWNSfcEqDTTHgtNA==" 
            crossorigin="anonymous" 
            referrerpolicy="no-referrer"></script>

    <!-- ========================================================================= -->
    <!-- AUTORYZACJA I URUCHOMIENIE  -->
    <!-- ========================================================================= -->
    <script src="js/start_orbit_master_app.js" defer></script> <!-- ✅ defer - wait for all modules to load -->
    
    <!-- ========================================================================= -->
    <!-- FIREBASE APP CHECK (WYŁĄCZONY - konflikt z root.innerHTML) -->
    <!-- ========================================================================= -->
    <!-- <script src="js/appcheck-init.js"></script> --> <!-- ❌ Disabled - recaptcha-container usuwany przez app.js -->

<script>
    // Inicjalizacja po załadowaniu aplikacji
    document.addEventListener('DOMContentLoaded', () => {
        if (window.app) {
            window.unifiedOrbitManager = new UnifiedOrbitManager(window.app);
        }
    });

// Aliasy kompatybilności - MUSI być przed uruchomieniem aplikacji
window.RoutesListManager = window.RoutesList;

// Sprawdź dostępność zunifikowanego orbit managera
if (window.unifiedOrbitManager && !window.orbitsManager) {
    window.orbitsManager = window.unifiedOrbitManager;
    console.log('🔗 Alias orbitsManager → unifiedOrbitManager');
}
</script>

<!-- ========================================================================= -->
<!-- MAINTENANCE: Naprawa brakujących danych użytkowników -->
<!-- ========================================================================= -->
<script>
// Skrypt dostępny przez console: fixMissingUserData()
async function fixMissingUserData() {
    console.log('🔧 [FIX] Rozpoczynam naprawę brakujących danych użytkowników...');
    
    try {
        // KROK 0: Sprawdź rolę bieżącego użytkownika
        const session = JSON.parse(localStorage.getItem('orbitMasterSession') || '{}');
        const isGlobalAdmin = session.userData?.role === 'global_admin';
        const currentOrgId = session.organizationId || 'global';
        
        console.log(`🔐 Bieżący użytkownik: ${session.userData?.role}, Org: ${currentOrgId}`);
        
        if (!isGlobalAdmin && !session.userData?.role) {
            alert('❌ Błąd: Nie można określić roli użytkownika. Zaloguj się ponownie.');
            return;
        }
        
        const globalUsers = [];
        const orgUsers = {};
        const allUsersList = [];
        
        if (isGlobalAdmin) {
            console.log('👑 [FIX] Global Admin - będę naprawiać użytkowników ze WSZYSTKICH organizacji');
            
            console.log('📥 Szukam użytkowników w /active_users...');
            const globalSnapshot = await firebase.firestore()
                .collection('active_users')
                .get();
            
            globalSnapshot.forEach(doc => {
                globalUsers.push({
                    docId: doc.id,
                    data: doc.data(),
                    location: 'global'
                });
            });
            
            console.log(`✅ Znaleziono ${globalUsers.length} użytkowników w /active_users`);
            
            console.log('📥 Szukam użytkowników w /organizations/*/active_users...');
            const orgsSnapshot = await firebase.firestore()
                .collection('organizations')
                .get();
            
            for (const orgDoc of orgsSnapshot.docs) {
                const orgId = orgDoc.id;
                
                const usersSnapshot = await firebase.firestore()
                    .collection(`organizations/${orgId}/active_users`)
                    .get();
                
                if (!orgUsers[orgId]) {
                    orgUsers[orgId] = [];
                }
                
                usersSnapshot.forEach(doc => {
                    orgUsers[orgId].push({
                        docId: doc.id,
                        data: doc.data(),
                        location: 'org',
                        organization: orgId
                    });
                });
                
                if (usersSnapshot.size > 0) {
                    console.log(`✅ Znaleziono ${usersSnapshot.size} użytkowników w /organizations/${orgId}/active_users`);
                }
            }
        } else {
            console.log(`🏢 [FIX] Org Admin - będę naprawiać użytkowników TYLKO z organizacji: ${currentOrgId}`);
            
            const usersSnapshot = await firebase.firestore()
                .collection(`organizations/${currentOrgId}/active_users`)
                .get();
            
            if (!orgUsers[currentOrgId]) {
                orgUsers[currentOrgId] = [];
            }
            
            usersSnapshot.forEach(doc => {
                orgUsers[currentOrgId].push({
                    docId: doc.id,
                    data: doc.data(),
                    location: 'org',
                    organization: currentOrgId
                });
            });
            
            console.log(`✅ Znaleziono ${usersSnapshot.size} użytkowników w /organizations/${currentOrgId}/active_users`);
        }
        
        console.log('\n🔍 ANALIZA:\n');
        let fixCount = 0;
        
        if (isGlobalAdmin && globalUsers.length > 0) {
            console.log('--- GLOBAL USERS (Firebase UIDs) ---');
            for (const user of globalUsers) {
                const hasMissingData = !user.data.username || !user.data.organizationId;
                const displayName = user.data.username || user.data.name || user.data.id || user.docId;
                
                if (hasMissingData) {
                    console.log(`⚠️  docId: ${user.docId}, Name: ${displayName}, Org: ${user.data.organizationId || 'BRAK'}`);
                    fixCount++;
                    allUsersList.push({ user, displayName, orgId: user.data.organizationId || 'global' });
                }
            }
        }
        
        if (Object.keys(orgUsers).length > 0) {
            console.log('\n--- ORG USERS (Username-based docId) ---');
            for (const orgId in orgUsers) {
                for (const user of orgUsers[orgId]) {
                    const hasMissingData = !user.data.username || !user.data.organizationId;
                    const displayName = user.data.username || user.data.name || user.docId;
                    
                    if (hasMissingData) {
                        console.log(`⚠️  docId: ${user.docId} (Org: ${orgId}), Name: ${displayName}`);
                        fixCount++;
                        allUsersList.push({ user, displayName, orgId });
                    }
                }
            }
        }
        
        console.log(`\n📊 Razem użytkowników do naprawy: ${fixCount}`);
        if (fixCount === 0) {
            alert('✅ Brak użytkowników z brakującymi danymi!');
            return;
        }
        
        const userListStr = allUsersList.map((u, i) => `${i+1}. ${u.displayName} (${u.user.location})`).join('\n');
        const roleInfo = isGlobalAdmin ? '👑 GLOBAL ADMIN' : `🏢 ORG ADMIN (${currentOrgId})`;
        const confirmed = confirm(
            `${roleInfo}\n\nNaprawić ${fixCount} użytkowników?\n\n${userListStr}\n\nTa operacja doda brakujące pola.`
        );
        if (!confirmed) {
            console.log('❌ Anulowano');
            return;
        }
        
        let repaired = 0;
        
        if (isGlobalAdmin) {
            for (const user of globalUsers) {
                const needsRepair = !user.data.username || !user.data.organizationId;
                
                if (needsRepair) {
                    const username = user.data.username || user.data.name || user.docId.substring(0, 8);
                    const organizationId = user.data.organizationId || 'global';
                    
                    await firebase.firestore()
                        .collection('active_users')
                        .doc(user.docId)
                        .update({
                            username: username,
                            organizationId: organizationId,
                            updatedAt: firebase.firestore.FieldValue.serverTimestamp(),
                            repairFlag: 'data_restored_' + new Date().toISOString()
                        });
                    
                    console.log(`✅ Naprawiono (global): ${username}`);
                    repaired++;
                }
            }
        }
        
        for (const orgId in orgUsers) {
            for (const user of orgUsers[orgId]) {
                const needsRepair = !user.data.username || !user.data.organizationId;
                
                if (needsRepair) {
                    const username = user.data.username || user.data.name || user.docId;
                    
                    await firebase.firestore()
                        .collection(`organizations/${orgId}/active_users`)
                        .doc(user.docId)
                        .update({
                            username: username,
                            organizationId: orgId,
                            updatedAt: firebase.firestore.FieldValue.serverTimestamp(),
                            repairFlag: 'data_restored_' + new Date().toISOString()
                        });
                    
                    console.log(`✅ Naprawiono (org): ${username}`);
                    repaired++;
                }
            }
        }
        
        console.log(`\n✅ Naprawiono ${repaired} użytkowników`);
        alert(`✅ Naprawiono ${repaired} użytkowników!\n\nOdśwież stronę (F5).`);
        
    } catch (error) {
        console.error('❌ Błąd:', error);
        alert(`❌ Błąd: ${error.message}`);
    }
}

console.log('💡 Skrypt naprawy dostępny: fixMissingUserData()');
</script>

<!-- MIGRACJA UŻYTKOWNIKÓW MIĘDZY ORGANIZACJAMI -->
<script>
async function migrateUsersToOrgPoznan() {
    console.log('🚀 Rozpoczynam migrację użytkowników do org_poznan...');
    
    try {
        const session = JSON.parse(localStorage.getItem('orbitMasterSession') || '{}');
        if (session.userData?.role !== 'global_admin') {
            alert('❌ Tylko global_admin może migrować użytkowników');
            return;
        }
        
        const globalSnapshot = await firebase.firestore()
            .collection('active_users')
            .get();
        
        const usersToMigrate = [];
        
        globalSnapshot.forEach(doc => {
            const data = doc.data();
            // Pomiń robercik (global_admin)
            if (data.username !== 'robercik' && data.role !== 'global_admin') {
                usersToMigrate.push({
                    docId: doc.id,
                    data: data,
                    username: data.username || data.name || doc.id
                });
            }
        });
        
        console.log(`📋 Do migracji: ${usersToMigrate.length} użytkowników`);
        
        if (usersToMigrate.length === 0) {
            alert('✅ Brak użytkowników do migracji');
            return;
        }
        
        const listStr = usersToMigrate.map((u, i) => `${i+1}. ${u.username}`).join('\n');
        const confirmed = confirm(
            `👑 GLOBAL ADMIN\n\nPrzenieść ${usersToMigrate.length} użytkowników do org_poznan?\n\n${listStr}\n\nRobercik zostanie w org_default.`
        );
        
        if (!confirmed) return;
        
        let migrated = 0;
        
        for (const user of usersToMigrate) {
            try {
                // 1. Skopiuj do org_poznan (zmień docId na username)
                await firebase.firestore()
                    .collection('organizations/org_poznan/active_users')
                    .doc(user.username)
                    .set({
                        ...user.data,
                        organizationId: 'org_poznan',
                        migratedFrom: 'active_users',
                        migratedAt: firebase.firestore.FieldValue.serverTimestamp()
                    });
                
                console.log(`✅ Skopiowano do org_poznan: ${user.username}`);
                
                // 2. Usuń z active_users
                await firebase.firestore()
                    .collection('active_users')
                    .doc(user.docId)
                    .delete();
                
                console.log(`🗑️ Usunięto z active_users: ${user.username}`);
                migrated++;
                
            } catch (err) {
                console.error(`❌ Błąd migracji ${user.username}:`, err);
            }
        }
        
        alert(`✅ Migrowano ${migrated} użytkowników do org_poznan!\n\nOdśwież stronę (F5).`);
        
    } catch (error) {
        console.error('❌ Błąd:', error);
        alert(`❌ Błąd: ${error.message}`);
    }
}

console.log('💡 Skrypt migracji dostępny: migrateUsersToOrgPoznan()');
</script>
<!-- 📞 Audio element for voice call remote stream (centrum side hears driver) -->
<audio id="voiceCallRemoteAudio" autoplay playsinline></audio>
</body>
</html>