/**
* @file
* Contains common functions used when showing a map.
*/
import { debug } from "./debug.js";
import { getCosmeticName, getCosmeticLocation, getBaseTopic, escapeHTML } from "./misc.js";
/**
* Loads a map solution. The solution is Google Maps if an API key is present,
* or a Leaflet map if no API key is present.
* When the map solution has been loaded, an `initialize` function is called
* from the local `map_google.js` or `map_leaflet.js` file, depending on which
* solution was loaded.
*
* @param {...any} initializerArguments - Optional arguments to pass to the `initialize` function.
*/
export async function loadMapSolution(...initializerArguments){
debug("Loading map solution");
if(apiKey){
debug("Found API key, using Google Maps");
debug("API key:", apiKey);
const initialize = await getLocalMapInitializer("google");
const script = document.createElement('script');
script.src = `https://maps.googleapis.com/maps/api/js?v=3&key=${ apiKey }`;
script.addEventListener("load", () => {initialize(...initializerArguments);});
document.querySelector("head").appendChild(script);
}else{
debug("Did not find API key, using Leaflet map");
const initialize = await getLocalMapInitializer("leaflet");
const style = document.createElement("link");
style.rel = "stylesheet";
style.href = "../static/leaflet/leaflet.css";
document.querySelector("head").appendChild(style);
const script = document.createElement('script');
script.src = "../static/leaflet/leaflet.js";
script.addEventListener("load", () => {initialize(...initializerArguments);});
document.querySelector("head").appendChild(script);
}
async function getLocalMapInitializer(solution){
const { initialize } = await import(new URL(`map_${solution}.js`, window.location));
return initialize;
}
}
/**
* Creates an HTML representation of the "loc" (location) element obtained from the recorder API
* Intended to be used in a map marker popup.
*
* @param {object} loc - A location element obtained from the recorder API.
* @returns {string} - An HTML string that can be used in a map marker popup.
*/
export function generatePopupHTML(
{
face,
topic,
name,
label,
tid,
addr,
lat,
lon,
ghash,
acc,
tst,
batt,
vel,
cog,
},
){
let html = "";
// Face
if(face !== undefined) html += escapeHTML `
`;
// Name
html += escapeHTML `${ getCosmeticName({topic, name, label, tid}) }
`;
// Location
html += escapeHTML `${ getCosmeticLocation({addr, lat, lon}) }
`;
// Ghash + base topic
const baseTopic = getBaseTopic(topic);
html += escapeHTML `${ ghash || "unknown" }, ${ baseTopic || "unknown" }`;
// Date
if(tst !== undefined){
const date = new Date(tst * 1000).toLocaleDateString(undefined, {
day: 'numeric',
month: 'short',
year: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
timeZoneName: 'short',
});
html += `, ${date}`;
}
html += "
";
// Latitude and longtitude
html += escapeHTML `(${lat},${lon}), `;
// Miscellaneous
html += "";
const misc = [];
misc.push(`acc: ${ acc === undefined ? "?" : `${acc} m` }`);
if(vel !== undefined) misc.push(escapeHTML `vel: ${vel} km/h`);
if(batt !== undefined) misc.push(escapeHTML `batt: ${batt}%`);
if(cog !== undefined) misc.push(escapeHTML `cog: ${cog}`);
html += misc.join(", ");
html += "";
return html;
}