<!DOCTYPE html>
<html lang="en" class="dark-mode">

<head>
    <meta charset="UTF-8" />
    <title>MapViewport</title>

    <script src="../../3rdparty/highlight/highlight.pack.js"></script>

    <link rel="stylesheet" href="../../../fonts/material-icon-font/material-icons.css">
    <link rel='stylesheet' href='../../3rdparty/highlight/styles/vs2015.css'>
    <link rel='stylesheet' href='../../../css/doctest.css'>

    <script src="../../../dist/iwmlib.3rdparty.js"></script>
    <script src="../../../dist/iwmlib.js"></script>
    <script src="../../../dist/iwmlib.pixi.js"></script>


    <style>
        .controls {
            display: flex;
        }
    </style>
</head>

<body onload="Doctest.run()">
    <h1>MapViewport</h1>
    <p>
        The MapViewport works under the hood of a map layer to track the informations about the current focus point and
        zoom position.
        This is important to maintain the same view when maps are changed.
    </p>
    <canvas id="canvas"></canvas>
    <div id="mapControl"></div>
    <div id="cityControl" class="controls"></div>
    <p><strong>WHAT TO SEE:</strong> The map should focus Paris.</p>
    <script>
        let osmConfig = {
            "projection": "mercator",
            "type": "deepzoom",
            "tiles": {
                "tileSize": 256,
                "format": "png",
                "overlap": 0,
                "type": "map",
                "height": 1024,
                "width": 1024,
                "path": "../assets/maps/osm",
                "urlTileTemplate": "{path}/{level}/{row}/{column}.{format}"
            }
        }

        let testConfig = {
            "projection": "mercator",
            "type": "deepzoom",
            "tiles": {
                "tileSize": 128,
                "format": "jpg",
                "overlap": 0,
                "type": "map",
                "height": 4096,
                "width": 4096,
                "path": "../assets/maps/test",
                "urlTileTemplate": "{path}/{level}/{row}/{column}.{format}"
            }
        }

    </script>
    <script class="doctest">
        let capitals = {
            london: { x: 51.5, y: -0.083333 },
            rome: { x: 41.9, y: 12.483333 },
            madrid: { x: 40.4, y: -3.683333 },
            paris: { x: 48.833986, y: 2.346989 }
        }

        // You may define a focus point ...
        let focus = capitals.paris

        // ... and a zoom level.
        let zoom = 1

        // Name has to be app (like all other PIXIApps).
        const app = (window.app = new MapApp({
            focus,
            zoom,
            view: canvas,
            coordsLogging: true,
            width: 512,
            height: 512
        }))

        // As map an image of europe is used.
        let europe = '../assets/maps/pixabay/europe.jpg'

        //Preload all required sprites for the image map.
        app.loadSprites([europe], sprites => ready(sprites), {
            resolutionDependent: false
        })

        // The mapdata object contains informations,
        // how the displayed map has to be interpreted.
        // e.g. which projection is used or how the
        // image is clipped.
        let europeData = new MapData(new Projection.Mercator(), {
            clip: {
                min: { x: 32.863294, y: -18.58 },
                max: { x: 57.467973, y: 44.277158 }
            }
        })

        function ready(sprites) {

            const cover = true

            // When resources are loaded, the ImageMap can be instantiated.
            let imageMap = new ImageMap(sprites.get(europe), europeData, {
                coordsLogging: true,
                maxScale: 1,
                cover
            })

            let testMapData = new DeepZoomMapData(new Projection.Mercator(), testConfig.tiles, {
                app
            })
            let testMap = new DeepZoomMap(testMapData, Object.assign({}, testConfig.tiles, { app }), { cover })
            app.addMap("test", testMap)

            let osmMapData = new DeepZoomMapData(new Projection.Mercator(), osmConfig.tiles, {
                app
            })
            let deepZoomMap = new DeepZoomMap(osmMapData, Object.assign({}, osmConfig.tiles, { app }), { cover })
            app.addMap("osm", deepZoomMap)

            // Finally apply the map to the MapApp
            app.setMap('europe', imageMap)

            // The app requires a map before beeing able to run.
            // So start the app here.
            app.setup().run()

            for (let [key, val] of Object.entries(app.mapList.maps)) {
                let mapBtn = document.createElement("button")
                mapBtn.innerText = key
                mapBtn.addEventListener("click", () => {
                    app.mapLayer.changeMap(val)
                })
                mapControl.appendChild(mapBtn)
            }
        }

        for (let [key, val] of Object.entries(capitals)) {
            let cityBtn = document.createElement("button")
            cityBtn.innerText = key
            cityBtn.addEventListener("click", () => {
                app.mapLayer.map.moveTo(val)
            })
            cityControl.appendChild(cityBtn)
        }
    </script>
</body>

</html>