Source: launch.js

/* jshint esversion: 6 */

/**
 * Displays a SweetAlert2 modal for routing configuration.
 * Loads current values from routeParam and allows reset to defaults.
 */
function launchRouting() {
   const boatNames = competitors.map(c => c.name);

   const getNowISOString = (date = new Date()) => {
      return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16);
   };

   const defaultValues = {
      startTimeStr: getNowISOString(),
      isoStep: 1800,
      iBoat: boatNames.length <= 1 ? 1 : 0,
      forbid: true,
      isoc: false,
      withWaves: false,
      withCurrent: false,
      timeInterval: 0,
      nTry: 0
   };

   const current = {
      startTimeStr: routeParam.startTime
         ? getNowISOString(new Date(routeParam.startTime))  // (après correction de la fonction)
         : getNowISOString(), // <-- au premier lancement seulement
      isoStep: routeParam.isoStep ?? defaultValues.isoStep,
      iBoat: routeParam.iBoat ?? defaultValues.iBoat,
      forbid: routeParam.forbid ?? defaultValues.forbid,
      isoc: routeParam.isoc ?? defaultValues.isoc,
      withWaves: routeParam.withWaves ?? defaultValues.withWaves,
      withCurrent: routeParam.withCurrent ?? defaultValues.withCurrent,
      timeInterval: routeParam.timeInterval ?? defaultValues.timeInterval,
      nTry: routeParam.nTry ?? defaultValues.nTry
   };

   const boatOptions = (boatNames.length <= 1 ? "" : `<option value="0"${current.iBoat === 0 ? " selected" : ""}>All</option>`) +
      boatNames.map((name, i) => {
         const val = i + 1;
         const selected = (val === current.iBoat) ? "selected" : "";
         return `<option value="${val}" ${selected}>${name}</option>`;
      }).join("");

   const htmlContent = `
   <div class="swal-grid">
      <label for="swal-startTime">Date & Time:</label>
      <input type="datetime-local" id="swal-startTime" value="${current.startTimeStr}">

      <label for="swal-isoStep">Time Step:</label>
      <select id="swal-isoStep">
         <option value="900"${current.isoStep === 900 ? " selected" : ""}>15 minutes</option>
         <option value="1800"${current.isoStep === 1800 ? " selected" : ""}>30 minutes</option>
         <option value="3600"${current.isoStep === 3600 ? " selected" : ""}>1 hour</option>
         <option value="10800"${current.isoStep === 10800 ? " selected" : ""}>3 hours</option>
      </select>

      <label for="swal-boatSelect">Boat:</label>
      <select id="swal-boatSelect">${boatOptions}</select>

      <label for="swal-model">Model:</label>
      <select id="swal-model">
         <option value="GFS">GFS</option>
         <option value="ECMWF">ECMWF</option>
         <option value="ARPEGE">ARPEGE</option>
         <option value="UCMC">METEOCONSULT</option>
         <option value="SYN">SYN</option>
      </select>
      <label for="swal-forbidZones">Forbid Zones:</label>
      <div><input type="checkbox" id="swal-forbidZones" ${current.forbid ? "checked" : ""}></div>

      <label for="swal-isoc">Isochrones:</label>
      <div><input type="checkbox" id="swal-isoc" ${current.isoc ? "checked" : ""}></div>

      <label for="swal-withWaves">With Waves:</label>
      <div><input type="checkbox" id="swal-withWaves" ${current.withWaves ? "checked" : ""}></div>

      <label for="swal-withCurrent">With Current:</label>
      <div><input type="checkbox" id="swal-withCurrent" ${current.withCurrent ? "checked" : ""}></div>

      <label for="swal-clipBoard">Request in Clipboard:</label>
      <div><input type="checkbox" id="swal-clipBoard" ${clipBoard ? "checked" : ""}></div>

      <h3>Options</h3>

      <label for="swal-timeInterval">Time Interval:</label>
      <select id="swal-timeInterval">
         <option value="0"${current.timeInterval === 0 ? " selected" : ""}>None</option>
         <option value="900"${current.timeInterval === 900 ? " selected" : ""}>15 minutes</option>
         <option value="1800"${current.timeInterval === 1800 ? " selected" : ""}>30 minutes</option>
         <option value="3600"${current.timeInterval === 3600 ? " selected" : ""}>1 hour</option>
         <option value="10800"${current.timeInterval === 10800 ? " selected" : ""}>3 hours</option>
         <option value="21600"${current.timeInterval === 21600 ? " selected" : ""}>6 hours</option>
      </select>

      <label for="swal-nTry">N Try:</label>
      <input type="number" id="swal-nTry" min="0" max="384" value="${current.nTry}">
   </div>

   <div class="swal-footer">
      <button type="button" id="resetBtn" class="swal2-deny swal2-styled">Reset</button>
      <button type="button" class="swal2-confirm swal2-styled" data-swal2-confirm>Launch Route</button>
      <button type="button" class="swal2-cancel swal2-styled" data-swal2-cancel>Cancel</button>
   </div>`;

   Swal.fire({
      title: 'Route Parameters',
      html: htmlContent,
      customClass: {
         popup: 'swal-wide'
      },
      showConfirmButton: false,
      didOpen: () => {
         const updateNTryState = () => {
            const iBoat = parseInt(document.getElementById("swal-boatSelect").value, 10);
            const timeInterval = parseInt(document.getElementById("swal-timeInterval").value, 10);
            const nTry = document.getElementById("swal-nTry");
            nTry.disabled = (iBoat === 0 && timeInterval !== 0);
         };

         updateNTryState();
         document.getElementById("swal-boatSelect").addEventListener("change", updateNTryState);
         document.getElementById("swal-timeInterval").addEventListener("change", updateNTryState);

         document.getElementById("resetBtn").addEventListener("click", () => {
            document.getElementById("swal-startTime").value = getNowISOString();
            document.getElementById("swal-isoStep").value = "1800";
            document.getElementById("swal-model").value = "GFS";
            document.getElementById("swal-boatSelect").value = (boatNames.length <= 1) ? "1" : "0";
            document.getElementById("swal-forbidZones").checked = true;
            document.getElementById("swal-isoc").checked = false;
            document.getElementById("swal-withWaves").checked = false;
            document.getElementById("swal-withCurrent").checked = false;
            document.getElementById("swal-clipBoard").checked = false;
            document.getElementById("swal-timeInterval").value = "0";
            document.getElementById("swal-nTry").value = "0";
            updateNTryState();
         });

         Swal.getPopup().querySelector('[data-swal2-cancel]').addEventListener("click", () => {
            Swal.close();
         });

         Swal.getPopup().querySelector('[data-swal2-confirm]').addEventListener("click", () => {
            setTimeout(() => {
               const startTimeStr = document.getElementById("swal-startTime").value;
               const isoStep = parseInt(document.getElementById("swal-isoStep").value, 10);
               const iBoat = parseInt(document.getElementById("swal-boatSelect").value, 10);
               const model = document.getElementById("swal-model").value;
               const forbid = document.getElementById("swal-forbidZones").checked;
               const isoc = document.getElementById("swal-isoc").checked;
               const withWaves = document.getElementById("swal-withWaves").checked;
               const withCurrent = document.getElementById("swal-withCurrent").checked;
               clipBoard = document.getElementById("swal-clipBoard").checked; // global variable
               const timeInterval = parseInt(document.getElementById("swal-timeInterval").value, 10);
               const nTry = parseInt(document.getElementById("swal-nTry").value, 10) || 0;

               if ((nTry > 1) && (timeInterval !== 0) && (iBoat === 0)) {
                  Swal.showValidationMessage(
                     'All competitors selection is incompatible with best time option'
                  );
                  return;
               }

               routeParam.startTimeStr = startTimeStr;
               routeParam.startTime = new Date(startTimeStr);
               routeParam.isoStep = isoStep;
               routeParam.iBoat = iBoat;
               routeParam.forbid = forbid;
               routeParam.isoc = isoc;
               routeParam.withWaves = withWaves;
               routeParam.withCurrent = withCurrent;
               routeParam.timeInterval = timeInterval;
               routeParam.nTry = nTry;
               routeParam.model = model;

               updateStatusBar();
               console.log ("Updated Route Parameters:", routeParam);
               Swal.close();
               request();
            }, 0); // <<< important here
         });
      }
   });
}