let deviceAndroid = false;
// Variables de configuración
let modoFrontal = true;
let modoMirror = true;
let modoDiestro = true;
let modoSyncrono = true;
let modoReflejo = false;
let lVideoExp = true;

let memSrc = "";

let txClocalDown = "";
let txClocalUp = "";
let lInit = true;

let frameBuffer = []; // Buffer para almacenar fotogramas
const bufferSize = 10; // Número de fotogramas de retraso

let nAlpha = 126;

//let deviceOrientation = "";
let autoImageDisplay = false;
let tiempoBase = 3;

let arraymp4 = []

let totalUrl = [];
let nuevotitulo = "";
/////////////////////////////////////
let timeoutId;
let imageCst;
////////////////////////////////////////
let nSwitch = 0;
let nSwitchTmp = -1;
let timer = 0;
let timerMedio = 0;
let timerInit = 0;
let timerProc = 0;
let timerPass = 0;
let camStrTimer = 0;
//////////////////////////
let CopyRight = "© SEFiR"; //® //©
/////////////////////////////////////////////


function loadScriptapp(urlScr) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script');
    script.src = urlScr;
    script.async = true;
    script.onload = () => resolve();
    script.onerror = () => reject(new Error(`Failed to load script: ${urlScr}`));
    document.head.appendChild(script);
  });
}

function jspreload() {

  nBackground = localStorage.getItem("nBackground");
  if (nBackground == undefined) {
    localStorage.setItem('nBackground', 225);
    nBackground = 225;
  }

  nFontSize = localStorage.getItem("nFontSize");
  if (nFontSize == undefined) {
    localStorage.setItem('nFontSize', 18);
    nFontSize = 18;
  }

  tiempoBase = localStorage.getItem("tiempoBase");
  if (tiempoBase == undefined) {
    localStorage.setItem('tiempoBase', 3);
    tiempoBase = 3;
  }

  numManos = localStorage.getItem("numManos");
  if (numManos == undefined) {
    localStorage.setItem('numManos', 1);
    numManos = 1;
  }

  modoDiestro = JSON.parse(localStorage.getItem("modoDiestro"));
  if (modoDiestro == undefined) {
    localStorage.setItem('modoDiestro', true);
    modoDiestro = true;
  }

  modoMirror = JSON.parse(localStorage.getItem("modoMirror"));
  if (modoMirror == undefined) {
    localStorage.setItem('modoMirror', true);
    modoMirror = true;
  }

  facingUserCam = JSON.parse(localStorage.getItem("facingUserCam"));
  if (facingUserCam == undefined) {
    localStorage.setItem('facingUserCam', true);
    facingUserCam = true;
  }

  modoReflejo = JSON.parse(localStorage.getItem("modoReflejo"));
  if (modoReflejo == undefined) {
    localStorage.setItem('modoReflejo', false);
    modoReflejo = false;
  }

  modoSyncrono = JSON.parse(localStorage.getItem("modoSyncrono"));
  if (modoSyncrono == undefined) {
    localStorage.setItem('modoSyncrono', true);
    modoSyncrono = true;
  }

  modoGpu = JSON.parse(localStorage.getItem("modoGpu"));
  if (modoGpu == undefined) {
    localStorage.setItem('modoGpu', true);
    modoGpu = true;
  }

  if (modoGpu) cpuOrGpu = "GPU"
  else cpuOrGpu = "CPU";

  /*lVideoExp = JSON.parse(localStorage.getItem("lVideoExp"));
  if (lVideoExp == undefined) {
    localStorage.setItem('lVideoExp', true);
    lVideoExp = true;
  }*/

  autoImageDisplay = JSON.parse(localStorage.getItem("autoImageDisplay"));
  if (autoImageDisplay == undefined) {
    localStorage.setItem('autoImageDisplay', false);
    autoImageDisplay = false;
  }

  lTira = JSON.parse(localStorage.getItem("lTira"));
  if (lTira == undefined) {
    lTira = true;
    localStorage.setItem('lTira', lTira);
  }
  //////////////////////////////////////////////////

  nlStored = localStorage.getItem('nlStored');
  //console.info(nlStored)
  if (nlStored == 1) {
    jsloadParamJson();
    /*bloqueo = JSON.parse(localStorage.getItem("bloqueo"));
    if (bloqueo == undefined) {
      localStorage.setItem('bloqueo', true);
      bloqueo = true;
    }*/
  }
  else {
    jssaveParamJson();
  }
}
//////////////////////////////////////////////////////
function jsloadParamJson() {
  facingUserCam = JSON.parse(localStorage.getItem('facingUserCam'));
  nFontSize = JSON.parse(localStorage.getItem('nFontSize'));
  nBackground = JSON.parse(localStorage.getItem('nBackground'));
  modoFrontal = JSON.parse(localStorage.getItem('modoFrontal'));
  modoDiestro = JSON.parse(localStorage.getItem('modoDiestro'));
  modoMirror = JSON.parse(localStorage.getItem('modoMirror'));
  modoGpu = JSON.parse(localStorage.getItem('modoGpu'));
  autoImageDisplay = JSON.parse(localStorage.getItem('autoImageDisplay'));
  modoSyncrono = JSON.parse(localStorage.getItem('modoSyncrono'));
  modoReflejo = JSON.parse(localStorage.getItem('modoReflejo'));
  //lVideo = JSON.parse(localStorage.getItem('lVideo'));
  //lVideoExp = JSON.parse(localStorage.getItem('lVideoExp'));
  tiempoBase = localStorage.getItem('tiempoBase');
  numManos = localStorage.getItem('numManos');
  if (modoGpu) cpuOrGpu = "GPU"
  else cpuOrGpu = "CPU";

  //bloqueo = JSON.parse(localStorage.getItem('bloqueo'));
  //alphaColor = JSON.parse(localStorage.getItem('alphaColor'));
  nlStored = localStorage.getItem('nlStored');
  /*EVA = localStorage.getItem('EVA');
  nAlpha = localStorage.getItem('nAlpha');
  ColorPulgarI = localStorage.getItem('ColorPulgarI');
  ColorIndiceI = localStorage.getItem('ColorIndiceI');
  ColorMedioI = localStorage.getItem('ColorMedioI');
  ColorAnularI = localStorage.getItem('ColorAnularI');
  ColorMenorI = localStorage.getItem('ColorMenorI');
  ColorManoI = localStorage.getItem('ColorManoI');
  ColorBrazoI = localStorage.getItem('ColorBrazoI');
  ColorPulgarII = localStorage.getItem('ColorPulgarII');
  ColorIndiceII = localStorage.getItem('ColorIndiceII');
  ColorMedioII = localStorage.getItem('ColorMedioII');
  ColorAnularII = localStorage.getItem('ColorAnularII');
  ColorMenorII = localStorage.getItem('ColorMenorII');
  ColorManoII = localStorage.getItem('ColorManoII');
  ColorBrazoII = localStorage.getItem('ColorBrazoII');*/
}
///////////////////////////////
function jssaveParamJson() {
  nlStored = 1;
  localStorage.setItem('nlStored', nlStored);
  //localStorage.setItem('EVA', EVA);
  //localStorage.setItem('bloqueo', bloqueo);
  localStorage.setItem('nAlpha', nAlpha);
  //localStorage.setItem('alphaColor', alphaColor);
  //localStorage.setItem('nFontSize', nFontSize);
  localStorage.setItem('autoImageDisplay', autoImageDisplay);
  localStorage.setItem('modoGpu', modoGpu);
  localStorage.setItem('nBackground', nBackground);
  //localStorage.setItem('lVideo', lVideo);
  //localStorage.setItem('lVideoExp', lVideoExp);
  localStorage.setItem('facingUserCam', facingUserCam);
  localStorage.setItem('modoFrontal', modoFrontal);
  localStorage.setItem('modoDiestro', modoDiestro);
  localStorage.setItem('modoMirror', modoMirror);
  localStorage.setItem('modoSyncrono', modoSyncrono);
  localStorage.setItem('modoReflejo', modoReflejo);
  localStorage.setItem('tiempoBase', tiempoBase);
  localStorage.setItem('numManos', numManos);
  /*localStorage.setItem('ColorPulgarI', ColorPulgarI);
  localStorage.setItem('ColorIndiceI', ColorIndiceI);
  localStorage.setItem('ColorMedioI', ColorMedioI);
  localStorage.setItem('ColorAnularI', ColorAnularI);
  localStorage.setItem('ColorMenorI', ColorMenorI);
  localStorage.setItem('ColorManoI', ColorManoI);
  localStorage.setItem('ColorBrazoI', ColorBrazoI);
  localStorage.setItem('ColorPulgarII', ColorPulgarII);
  localStorage.setItem('ColorIndiceII', ColorIndiceII);
  localStorage.setItem('ColorMedioII', ColorMedioII);
  localStorage.setItem('ColorAnularII', ColorAnularII);
  localStorage.setItem('ColorMenorII', ColorMenorII);
  localStorage.setItem('ColorManoII', ColorManoII);
  localStorage.setItem('ColorBrazoII', ColorBrazoII);*/
}

///////////////////////////////////////////
function jsreinitProcedure() {
  lInit = false;
  lMediaImage = false;
}
///////////////////////////////////////////
function jsReinicio() {
  txClocalDown = "";
  txClocalUp = "";
  lInit = true;
}
//////////////////////////////////////////////

function ajustarLayout() {
  if (window.innerWidth <= 600) {
    // Ajustar elementos para dispositivos móviles
    document.body.style.fontSize = "14px";
  } else {
    // Ajustar elementos para dispositivos más grandes
    document.body.style.fontSize = "16px";
  }
}

////////////////////////////////////////////
function jsinitTimer(div) {
  timerPass = 0;
  timerInit = tiempoBase * 60;
  timerProc = timerInit;

  if (timeoutId) {
    clearTimeout(timeoutId);
  }
  jsautoVideoAll();
}

///////////////////////////////////////////////
function jstiempoParcial() {

  jsReinicio();
  lDelayLocal = false;
  ///////////////////////////////
  let videoMp4 = sessionStorage.getItem('videoMp4');
  ///////////////////////////////
  let lContinuar = JSON.parse(localStorage.getItem('lContinuar'));
  let nNumLengt = sessionStorage.getItem('numArrPdf');
  let numSlice = sessionStorage.getItem('numArraymp4');
  console.info(numSlice)
  console.info(lContinuar)
  console.info(nNumLengt)
  console.info(arraymp4[numSlice])
  if (lContinuar) {
    memSrc = arraymp4[numSlice]
    numSlice++;
    if (numSlice < nNumLengt) { //11
      sessionStorage.setItem('numArraymp4', numSlice);
      let srcNew = arraymp4[numSlice]
      sessionStorage.setItem('nameArr', srcNew);
      logEventMinutosRhb(memSrc);
      currentSlideAll(numSlice)
      console.info(11111)
    }
    else {
      localStorage.setItem('lContinuar', false);
      sessionStorage.setItem('numArraymp4', 0);
      sessionStorage.setItem('nameArr', arraymp4[0]);
      console.info(22222)
      jsgoBackRhb(memSrc);
    }
  }
  else {
    memSrc = arraymp4[numSlice]
    if (nNumLengt < 2) {
      console.info(33333)
      jsgoBackRhb(memSrc);
    }
    else {
      numSlice++;
      if (numSlice < nNumLengt) { //11
        sessionStorage.setItem('numArraymp4', numSlice);
        let srcNew = arraymp4[numSlice]
        sessionStorage.setItem('nameArr', srcNew);
        logEventMinutosRhb(memSrc);
        console.info(44444)
      }
      else {
        localStorage.setItem('lContinuar', false);
        sessionStorage.setItem('numArraymp4', 0);
        sessionStorage.setItem('nameArr', arraymp4[0]);
        console.info(55555)
        jsgoBackRhb(memSrc);
      }
    }
  }
}
/////////////////////////////////////////
async function logEventRhb(eventData) {
  console.info(eventData);
  //alert("espera");
  const response = await fetch(servidorURL + '/php/logs/php_log_rhb.php?t=' + new Date().getTime(), {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json; charset=utf-8'
    },
    body: JSON.stringify(eventData)
  });
  const result = await response.json();
  console.log(result);
}
/////////////////////////////////////////////
function getMadridTimestamp() {
  return new Date().toLocaleString('en-GB', { timeZone: 'Europe/Madrid', hour12: true });
}

function parseFecha(fechaStr) {
  // Extraer la fecha y la hora
  const [fecha, tiempo] = fechaStr.split(', ');
  const [dia, mes, año] = fecha.split('/');
  const [horaMinutoSegundo, ampm] = tiempo.split(' ');

  // Convertir a formato 24 horas si es necesario
  let [hora, minuto, segundo] = horaMinutoSegundo.split(':').map(Number);
  if (ampm === 'pm' && hora !== 12) {
    hora += 12;
  } else if (ampm === 'am' && hora === 12) {
    hora = 0;
  }
  // Formatear la fecha en formato ISO (yyyy-mm-ddThh:mm:ss)
  return new Date(`${año}-${mes}-${dia}T${hora.toString().padStart(2, '0')}:${minuto.toString().padStart(2, '0')}:${segundo.toString().padStart(2, '0')}`);
}

async function logEventMinutosRhb(memSrc) {
  console.log(memSrc)
  let timeFinal = Date.now();
  let timestampIni = Number(localStorage.getItem("timestamp"));
  const fechaInialRegistro = timestampIni; // timeInicial
  const fechaFinalRegistro = timeFinal;
  const difMilisegundos = fechaFinalRegistro - fechaInialRegistro;
  let difSegundosRegistro = Math.round(difMilisegundos / 1000);
  let diferenciaMinutos = Math.round(difSegundosRegistro / 60);

  //if (diferenciaMinutos > 5) diferenciaMinutos = 5;
  // Mostrar la diferencia en minutos
  console.log(`Diferencia en minutos: ${diferenciaMinutos}`);
  let eva = localStorage.getItem("eva");
  if (memSrc === "" || userProf === "") {
    return;
  }
  else {
    let timestampEvent = new Date().toLocaleString('en-GB', { timeZone: 'Europe/Madrid', hour12: true });
    const eventData = {
      uniqueNumber: Date.now(),
      timestamp: timestampEvent,
      diferenciaMinutos: diferenciaMinutos,
      //userAgent: navigator.userAgent,
      autor: userProf,
      pdf_nom: nomPdf,
      tec_nom: memSrc,
      eva: eva,
      baseTime: parseInt(tiempoBase),
      deteccion: numDeteccion,
    };
    console.info(eventData)

    if (navigator.onLine) {
      console.log("Tienes conexión a Internet.");
      let username = localStorage.getItem('username'); //*********************//if (username !== "jmab")
      await logEventRhb(eventData)
    } else {
      console.log("No tienes conexión a Internet.");
    }

    /*if (navigator.onLine) {
      console.log("Tienes conexión a Internet.");
      console.log(`Diferencia en minutos: ${diferenciaMinutos}`);
      //if (parseInt(diferenciaMinutos) >= 1) 
      logEventRhb(eventData)
    } else {
      console.log("No tienes conexión a Internet.");
    }*/
  }
}

async function jsgoBackRhb(memSrc) {
  await logEventMinutosRhb(memSrc);
  window.open('../rhb/open.html', '_self')
}
/////////////////////////////////////////
function jsautoVideoAll() {
  ajustarLayout(); //////////////////////////////////////////////// LAYOUT

  let numSlice = sessionStorage.getItem('numArraymp4');
  let src = arraymp4[numSlice]
  let videoMp4 = src.substr(0, 7)
  ;
  let src2 = servidorURL + "/php/logs/php_log_video.php?video=" + encodeURIComponent(videoMp4 + ".mp4") + "&dist=" + encodeURIComponent("rhb");
  autoImageDisplay = JSON.parse(localStorage.getItem("autoImageDisplay"));
  deviceAndroid = JSON.parse(localStorage.getItem("deviceAndroid"));

  if (videoMp4 !== null) {
    let numeroExec = parseInt(videoMp4.substring(0, 3));

    let autoTira = document.getElementById("idTira");
    let autoVideotmp = document.getElementById("autoVideo");

    autoVideotmp.src = src2; //OJO AQUI ESTO NO ESTABA VOLVER ATRAS

    if (!deviceAndroid) {
      if (autoImageDisplay) autoVideotmp.className = "video_circle2";
      else autoVideotmp.className = "video_rect2";
    }
    else {
      if (autoImageDisplay) autoVideotmp.className = "video_circle4";
      else {
        if (deviceOrientation == "portrait") {
          autoVideotmp.className = "video_rect4Port";
        } else
          autoVideotmp.className = "video_rect4Land";
      }
    }

    autoVideotmp.style.display = "block";
    autoTira.style.display = "block"
    autoVideotmp.style.left = `${(window.innerWidth / 2) - (autoVideotmp.width / 2)}px`;

    if (timeoutId) {
      clearTimeout(timeoutId);
    }
    if (numeroExec > 900) {
      timeoutId = setTimeout(function () {
        autoTira.style.display = "none";
        autoVideotmp.style.display = "none"; // Ocultar el video después de 10 segundos
      }, 10000); // 10 segundos en milisegundos
    }
    else {
      timeoutId = setTimeout(function () {
        if (autoImageDisplay) autoTira.style.display = "none";
      }, 10000); // 10 segundos en milisegundos
    }
  }
}
////////////////////////////////////////
function jsinitDevice() {
  const deviceType = jsdetectAllDevice();
  console.log(`El dispositivo detectado es: ${deviceType}`);
  deviceAndroid = JSON.parse(localStorage.getItem("deviceAndroid"));
  hard = localStorage.getItem("hard");
  if (hard == undefined) {
    localStorage.setItem('hard', "WPD");
    hard = "WPD";
    jsgrabaDevice(deviceType);
  }
  else {
    console.info("FOUND HARD DEVICE")
    //console.info(hard)
    //console.info(deviceAndroid)
  }
}
function jsgrabaDevice(deviceType) {
  // Ejecutar una función basada en el tipo de dispositivo
  if (deviceType === 'mobile') {
    pC = false;
    localStorage.setItem("deviceAndroid", true);
    localStorage.setItem("hard", 'AMT');
    //console.info('Estás usando un móvil');
    /*screen.orientation.lock('portrait-primary').then(() => {
      console.log("Orientation set to any for mobile.");
    }).catch((error) => {
      console.log("Orientation lock failed:", error);
    });*/
  } else {
    if (deviceType === 'tablet') {
      pC = false;
      localStorage.setItem("deviceAndroid", true);
      localStorage.setItem("hard", 'UPT');
      //console.info('Estás usando un tablet');
    } else {
      pC = true;
      localStorage.setItem("deviceAndroid", false);
      //console.info('Estás usando un ordenador');
      localStorage.setItem("hard", 'WPD');
    }
  }
}
//////////////////////////////////////////////////////////
function jsdetectAllDevice() {
  const userAgent = navigator.userAgent;
  if (/Mobi|Android|iPhone/i.test(userAgent)) {
    return 'mobile';
  } else if (/Tablet|iPad/i.test(userAgent)) {
    return 'tablet';
  } else {
    return 'desktop';
  }
}

///////////////////////////////////////////////////////
async function crearPDF(n) {

  let distribucion = 'pefir';

  let urlLocal = localStorage.getItem("urlpdf");
  let timestampIni = new Date().toLocaleString('en-GB', { timeZone: 'Europe/Madrid', hour12: true });
  let content = "";
  totalUrl = [];
  let imagenes = localStorage.getItem('pdfEjercicios');
  let videos = localStorage.getItem('nameEjercicios');

  console.info(imagenes)
  console.info(videos)
  console.info(urlLocal)

  let arrImagenes = imagenes.split(",");
  let arrVideos = videos.split(",");

  console.info(arrImagenes)
  ///////////////////

  let nomPdf = "";
  let nom1 = []
  nom1 = videos.split(",");
  let nom2 = [];
  nom2 = nom1[0].split("?");
  let nom3 = [];
  nom3 = nom2[1].split("#"); //imagenes.split("?");
  let username = ""
  console.log(nom3);
  console.log(nom3.length);
  if (nom3.length > 1) {
    username = nom3[0];
    nomPdf = nom3[1];
  }
  else {
    nomPdf = nom2[1];
    username = "";
  }
  ///////////////////
  let qrTextTitulo = "";
  if (nomPdf.includes(".pdf")) {
    qrTextTitulo = nomPdf.slice(0, nomPdf.length - 4)
  }
  else {
    qrTextTitulo = nomPdf;
  }
  console.info(qrTextTitulo);

  qrTextTitulo = qrTextTitulo.toLowerCase()

  let remplazaQr = / +/gi;
  qrTextTitulo = qrTextTitulo.replace(remplazaQr, "_");
  qrTextTitulo = qrTextTitulo.replace(/[^0-9a-z\s_]/gi, '')

  let nombrepdf = "";
  let nameSave = "";
  if (n === 1) {
    nombrepdf = qrTextTitulo;
    nameSave = nombrepdf + ".pdf";
    username = "rhb";
  }
  else {
    nombrepdf = qrTextTitulo;
    nameSave = qrTextTitulo + ".pdf";
  }
  nuevotitulo = qrTextTitulo; //+ "_" + qrTextRegistro;
  console.info(nuevotitulo)
  console.info(username)
  let totalMp4 = "";
  let totalMp4Lite = "";
  let docport;

  await loadScriptapp('../js/jspdf.umd.min.js')
    .then(() => {
      // Aquí puedes usar las funciones y clases de los scripts cargados
      console.log('Todos los scripts se han cargado correctamente.');
      docport = new window.jspdf.jsPDF({
        orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, compress: true
      });
    })
    .catch(error => console.error('Error al cargar los scripts:', error));

  if (docport === undefined) {
    alert("Presione de nuevo el botón");
    return;
  }

  docport.setLineWidth(0);
  docport.setFontSize(10)
  docport.setDrawColor(155);

  let celliniw = 20;
  let cellinih = 58;
  let cellmax = 43;

  let cellw = cellmax;
  let cellh = cellmax;

  for (let ii = 1; ii < arrImagenes.length; ii++) {
    let nameMp4ini = arrImagenes[ii]
    //console.info(nameMp4ini)
    totalMp4 = totalMp4 + ',' + nameMp4ini
    let nameMp4iniLite = arrVideos[ii]
    totalMp4Lite = totalMp4Lite + ',' + nameMp4iniLite
  }

  let logo = new Image()
  //logo.src = "../../iconos/cst_20242.png"
  logo.src = "../iconos/CST_HU4.png"

  let pieAttachd = new Image()
  pieAttachd.src = "../iconos/64_otros.png";
  let openQr = "Clicar o escanear el QR, abre su sesión de ejercicios con SEFiR. Clicar o escanejar el QR, obre la sessió d'exercicis amb SEFiR."
  ///////////////////////////////////////// INI
  docport.addImage(logo, 'PNG', celliniw + 2, 10, 36, 18, undefined, 'FAST')
  docport.link(celliniw - 10, 10, 75, 18, { url: '' })

  docport.setFontSize(14)

  let tituloCorto = qrTextTitulo.slice(0, qrTextTitulo.length - 9)
  tituloCorto = tituloCorto.toUpperCase();
  docport.text(celliniw + cellw + 5, 21, tituloCorto)

  //docport.rect(celliniw, 12, cellw * 4, 14); lala
  //docport.rect(celliniw, 12, cellw * 4, 29); lala
  //docport.rect(cellw * 4 - 8, 12, 28, 29);

  docport.setFontSize(10)
  let cat1 = "Fer els exercicis sense dolor i realitzar cadascun durant cinc minuts"
  let cast1 = "Hacer los ejercicios sin dolor y realizar cada uno durante cinco minutos"

  docport.text(celliniw + 3, 33, cat1)
  docport.text(celliniw + 3, 38, cast1)

  let clicar = "Cliqueu a les imatges per veure el contingut dels vídeos / Clique en las imagenes para ver el contenido de los videos"
  ////////////////////////////////////////////

  docport.setFontSize(8)
  let npc = 0;
  let npf = 0;
  let npk = 0;

  for (let i = 0; i < 16; i++) {
    let ncode = npf * 8
    if (npf == 0 && npc == 0) {  //+ 15 + 10
      docport.text(celliniw + cellh * npc + 3, cellinih + cellh * npf + ncode + 5 - 16, clicar)
      docport.rect(celliniw + cellh * npc, cellinih + cellh * npf + ncode - 16, cellw * 4, 8);
    }
    docport.setFillColor(235, 235, 235);
    docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode, cellw, cellh, 'F');
    docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode - 8, cellw, 8,);
    docport.setFillColor(255, 255, 255);

    docport.setDrawColor(155); //0

    docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode, cellw, cellh);
    //docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode - 8, cellw, 8);
    //npk++
    npc++
    if (npc > 3) {
      npf++;
      npc = 0;
    }
    if (npf > 3) {
      npf = 0;
    }
  }
  npc = 0;
  npf = 0;
  npk = 0;

  docport.setFontSize(7)
  let date = new Date().getFullYear();
  let lic1 = "Aquesta obra està subjecta a una llicència de Reconeixement-NoComercial-SenseObraDerivada https://creativecommons.org/licenses/by-nc-nd/4.0/"
  let lic2 = "Citar aquesta obra com: Exercicis de fisioteràpia. Barcelona: Consorci Sanitari de Terrassa, " + date + ". SERVEI DE REHABILITACIÓ / FISIOTERÀPIA."

  docport.text(celliniw + 4, 270, lic1)
  docport.text(celliniw + 4, 275, lic2)

  docport.setDrawColor(155);
  docport.setFillColor(255, 255, 255);
  docport.rect(celliniw, 263 - 8, celliniw + cellw * 3 + 23, 8, 'FD')

  let today = new Date();
  //let newdat = "" + today;
  let newdat = "" + today + " - PEFiR. All rights reserved.";
  docport.text(celliniw + 4, 280, newdat);

  docport.addImage(pieAttachd, "PNG", celliniw + cellw * 4 - 9, 263 - 7.5, 7, 7, undefined, 'FAST')
  docport.text(celliniw + 4, 260, openQr)

  let newQR = servidorURL + "/rhb/index.html?" + username + '#' + nombrepdf + totalMp4Lite;
  let dataUrl = document.querySelector('#qr_code');//.querySelector('img');//.src;
  //////////////////////////////////////////////////////////////////

  // Cargar los scripts dinámicamente
  //await loadScriptapp('https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js')
  await loadScriptapp('../js/qrious.min.js')
    .then(() => {
      // Aquí puedes usar las funciones y clases de los scripts cargados
      console.log('Todos los scripts se han cargado correctamente.');
      qrCode = new QRious({
        element: document.getElementById("qr_code"),
        background: '#ffffff',
        backgroundAlpha: 1,
        foreground: "#000000",
        foregroundAlpha: 1,
        level: 'H',
        padding: 0,
        size: 500,
        value: newQR,
      });
    })
    .catch(error => console.error('Error al cargar los scripts:', error));

  docport.addImage(dataUrl, "PNG", celliniw + cellw * 3.75 - 20, 10, 31, 31, undefined, 'FAST');
  docport.link(celliniw + cellw * 3.75 - 20, 10, 31, 31, { url: newQR })

  ///////////////////////////////////////////////
  let pageCurrent = docport.internal.getCurrentPageInfo().pageNumber
  docport.text('Page ' + String(pageCurrent), celliniw + cellw * 4 - 4, 280, null, null, "right");
  /////////////////////////////////// FIN

  for (let ii = 1; ii < arrImagenes.length; ii++) {
    let name = arrImagenes[ii]
    let videoTmp = arrVideos[ii];
  
    let videomp4 = "";
    if (parseInt(videoTmp[2]) == 9) //|| parseInt(videoTmp[2]) == 0)  
    {
      videomp4 = servidorURL + "/assets/cstvideo/" + videoTmp + ".txt";
    }
    else {
      videomp4 = servidorURL + "/php/logs/php_log_video.php?video=" + encodeURIComponent(videoTmp + ".mp4") + "&dist=" + encodeURIComponent(distribucion);
    }

    let nombre = name.slice(8, name.length - 4);
    let menu = name.slice(1, 3);

    if (npk === 16) {
      docport.addPage();
      ///////////////////////////////////////// INI
      docport.addImage(logo, 'PNG', celliniw + 2, 10, 36, 18, undefined, 'FAST')
      docport.link(celliniw - 10, 10, 75, 18, { url: '' })

      docport.addImage(dataUrl, "PNG", celliniw + cellw * 3.75 - 20, 10, 31, 31, undefined, 'FAST');
      docport.link(celliniw + cellw * 3.75 - 20, 10, 31, 31, { url: newQR })

      docport.setFontSize(14)

      //docport.text(celliniw + cellw + 5, 21, qrTextTitulo)
      let tituloCorto = qrTextTitulo.slice(0, qrTextTitulo.length - 9)
      docport.text(celliniw + cellw + 5, 21, tituloCorto)

      //docport.rect(celliniw, 12, 65, 14);
      //docport.rect(celliniw, 12, cellw * 4, 14);

      docport.setFontSize(10)
      let cat1 = "Fer els exercicis sense dolor i realitzar cadascun durant cinc minuts"
      let cast1 = "Hacer los ejercicios sin dolor y realizar cada uno durante cinco minutos"

      docport.text(celliniw + 3, 33, cat1)
      docport.text(celliniw + 3, 38, cast1)

      let clicar = "Cliqueu a les imatges per veure el contingut dels vídeos / Clique en las imagenes para ver el contenido de los videos"

      docport.setFontSize(8)
      npc = 0;
      npf = 0;
      //npk = 0;
      for (let i = 0; i < 16; i++) {
        let ncode = npf * 8
        if (npf == 0 && npc == 0) {  //+15 + 10
          docport.text(celliniw + cellh * npc + 3, cellinih + cellh * npf + ncode + 5 - 16, clicar)
          docport.rect(celliniw + cellh * npc, cellinih + cellh * npf + ncode - 16, cellw * 4, 8);
        }
        docport.setFillColor(235, 235, 235);
        docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode, cellw, cellh, 'F');
        docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode - 8, cellw, 8,);
        docport.setFillColor(255, 255, 255);

        docport.setDrawColor(155); //0

        docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode, cellw, cellh);
        //docport.rect(celliniw + cellw * npc, cellinih + cellh * npf + ncode - 8, cellw, 8);
        //npk++
        npc++
        if (npc > 3) {
          npf++;
          npc = 0;
        }
        if (npf > 3) {
          npf = 0;
        }
      }
      /////////////////////////////////
      docport.setFontSize(7)
      let date2 = new Date().getFullYear();
      lic1 = "Aquesta obra està subjecta a una llicència de Reconeixement-NoComercial-SenseObraDerivada https://creativecommons.org/licenses/by-nc-nd/4.0/"
      lic2 = "Citar aquesta obra com: Exercicis de fisioteràpia. Barcelona: Consorci Sanitari de Terrassa, " + date2 + ". SERVEI DE REHABILITACIÓ / FISIOTERÀPIA."

      docport.text(celliniw + 4, 270, lic1)
      docport.text(celliniw + 4, 275, lic2)

      docport.setDrawColor(155);
      docport.setFillColor(255, 255, 255);
      docport.rect(celliniw, 263 - 8, celliniw + cellw * 3 + 23, 8, 'FD')


      docport.addImage(pieAttachd, "PNG", celliniw + cellw * 4 - 9, 263 - 7.5, 7, 7, undefined, 'FAST')
      docport.text(celliniw + 4, 260, openQr)
      ///////////////////////////////////////
      let today = new Date();
      let newdat = "" + today;
      docport.text(celliniw + cellw + 4, 280, newdat);
      pageCurrent = docport.internal.getCurrentPageInfo().pageNumber
      docport.text('Page ' + String(pageCurrent), celliniw + cellw * 4 - 4, 280, null, null, "right");
      /////////////////////////////////// FIN
      npc = 0;
      npf = 0;
      npk = 0;
    }
    let base64Image
    console.info(name)
    base64Image = await fetchImageAsBase64(name);
    if (base64Image) {
      let ncode = npf * 8
      let rectXp = celliniw + cellw * npc;
      let rectYp = cellinih + cellh * npf + ncode;

      let imgHeight = 0;
      let imgWidth = 0;

      const imgProps = docport.getImageProperties(base64Image);
      if (imgProps !== undefined) {
        if (imgProps.width > imgProps.height) {
          imgWidth = cellmax;
          imgHeight = parseInt((imgProps.height * imgWidth) / imgProps.width);
          imgWidth = imgWidth - 2
          rectYp = parseInt(rectYp + (cellmax - imgHeight) / 2)
          rectXp = rectXp + 1
        }
        else {
          imgHeight = cellmax;
          imgWidth = parseInt((imgProps.width * imgHeight) / imgProps.height);
          imgHeight = imgHeight - 2
          rectXp = parseInt(rectXp + (cellmax - imgWidth) / 2)
          rectYp = rectYp + 1
        }

        docport.addImage(base64Image, 'JPEG', rectXp, rectYp, imgWidth, imgHeight, ii.toString(), undefined, 'FAST')
        // OJOOOOOOOOOOOOOOOOOOOOOOOOOOOO  docport.link(rectXp, rectYp, imgWidth, imgHeight, { url: servidorURL + '/rhb/index.html?' + qrTextTitulo + '_' + qrTextRegistro + ',' + name }); // 
        //////////////////////
        let tipofile = videomp4.slice(videomp4.length - 3, videomp4.length)
        let numfile = videomp4.slice(videomp4.length - 11, videomp4.length - 8);

        if (tipofile === "txt") {
          await leerYAbrirURL2(videomp4, docport, rectXp, rectYp, imgWidth, imgHeight, numfile);
        }
        else {
          docport.link(rectXp, rectYp, imgWidth, imgHeight, { url: videomp4 }); // 
          totalUrl.push(videomp4)
        }
        /////////////////////

        let agua = new Image()
        agua.src = "../iconos/cst.png"
        docport.addImage(agua, "PNG", rectXp + imgWidth - cellmax / 4 - 1, rectYp + imgHeight - 2, cellmax / 4, 1, undefined, 'FAST')

        let paragraph = name.toUpperCase()
        paragraph = paragraph.slice(8, paragraph.length - 4)

        if (paragraph.length > 25) {
          paragraph = paragraph.slice(0, 25) + "";
        }
        let remplaza = /_+/gi;
        paragraph = paragraph.replace(remplaza, " ");
        let foo = paragraph;

        let nseg = menu
        let sseg = nseg.toString()
        let numeroExec = parseInt(sseg.substr(0, 3))
        let nameMp44 = ""
        if (numeroExec > 900 && numeroExec < 1000) {
          docport.textWithLink(paragraph, celliniw + cellw * npc + 2, cellinih + cellh * npf + ncode - 3.5, { url: '' });
        }
        else {
          docport.textWithLink(paragraph, celliniw + cellw * npc + 2, cellinih + cellh * npf + ncode - 3.5, { url: '' });
        }
      }
      npk++
      npc++
      if (npc > 3) {
        npf++;
        npc = 0;
      }
      if (npf > 3) {
        npf = 0;
      }
    }
  }
  ////////////////////////////////////////// *****************************************
  /*docport.addPage();
  ///////////////////////////////////////// INI
  docport.addImage(logo, 'PNG', celliniw + 2, 10, 36, 18, undefined, 'FAST')
  docport.link(celliniw - 10, 10, 75, 18, { url: '' })

  docport.addImage(dataUrl, "PNG", celliniw + cellw * 3.75 - 20, 10, 31, 31, undefined, 'FAST');
  docport.link(celliniw + cellw * 3.75 - 20, 10, 31, 31, { url: newQR })

  docport.setFontSize(14)
  let titulo3 = qrTextTitulo  //;
  docport.text(celliniw + cellw + 5, 21, titulo3)

  //docport.rect(celliniw, 12, 65, 14);
  //docport.rect(celliniw, 12, cellw * 4, 14);

  let ns = 0;
  docport.setFontSize(12);

  docport.text(celliniw + 4, 40 - ns, "PRIMERA OPCIÓ / PRIMERA OPCIÓN.");
  docport.text(celliniw + 4, 50 - ns, "Per accedir als vídeos directament feu clic a la imatge desitjada");
  docport.text(celliniw + 4, 55 - ns, "Para acceder a los vídeos directamente pulse en la imagen deseada");

  ns = 10;

  docport.text(celliniw + 4, 110 - ns, "SEGONA OPCIÓ / SEGUNDA OPCIÓN.");
  docport.text(celliniw + 4, 120 - ns, "Per accedir als exercicis mitjançant l'aplicació SEFiR:");
  docport.text(celliniw + 4, 125 - ns, " - Cliqueu directament al QR si disposeu del document pdf al vostre mòbil o pc");
  docport.text(celliniw + 4, 130 - ns, " - Escanejar el QR inferior si només disposeu del document en paper");

  docport.text(celliniw + 4, 140 - ns, "Para acceder a los ejercicios mediante la aplicación SEFiR:");
  docport.text(celliniw + 4, 145 - ns, " - Pulse directamente en el QR si dispone del documento pdf en su móvil o pc");
  docport.text(celliniw + 4, 150 - ns, " - Escanear el QR inferior si sólo dispone del documento en papel");

  docport.setFontSize(7)
  let date4 = new Date().getFullYear();
  lic1 = "Aquesta obra està subjecta a una llicència de Reconeixement-NoComercial-SenseObraDerivada https://creativecommons.org/licenses/by-nc-nd/4.0/"
  lic2 = "Citar aquesta obra com: Exercicis de fisioteràpia. Barcelona: Consorci Sanitari de Terrassa, " + date4 + ". SERVEI DE REHABILITACIÓ / FISIOTERÀPIA."

  docport.text(celliniw + 4, 270, lic1)
  docport.text(celliniw + 4, 275, lic2)
  docport.setDrawColor(155);
  docport.setFillColor(255, 255, 255);
  //docport.rect(celliniw, 263 - 8, celliniw + cellw * 3 + 23, 8, 'FD')

  //////////////////////////////////
  today = new Date();
  newdat = "" + today + " - PEFiR. All rights reserved.";
  //docport.text(celliniw + cellw + 4, 280, newdat);
  docport.text(celliniw + 4, 280, newdat);
  pageCurrent = docport.internal.getCurrentPageInfo().pageNumber
  docport.text('Page ' + String(pageCurrent), celliniw + cellw * 4 - 4, 280, null, null, "right");
  /////////////////////////////////// FIN
  */
  ////////////////////////////////////////////

  docport.addImage(dataUrl, "PNG", celliniw + cellw * 3.75 - 20, 10, 31, 31, undefined, 'FAST');
  docport.link(celliniw + cellw * 3.75 - 20, 10, 31, 31, { url: newQR })

  ///////////////////////////////////////////
  console.info(totalUrl)
  let totalAnot = "";
  for (let i = 0; i < totalUrl.length; i++) {
    totalAnot = totalAnot + totalUrl[i] + ",";
  }

  totalAnot = totalAnot.slice(0, totalAnot.length - 1)
  console.info(totalAnot)

  docport.setProperties({
    title: nameSave, //titulo + "_" + registro,
    subject: 'tractament',
    author: 'CST. Servei de fisioteràpia: ' + username,
    keywords: totalAnot,
    creator: 'Software info. (abeciabuil@gmail.com)',
  });

  let timestampEvent = new Date().toLocaleString('en-GB', { timeZone: 'Europe/Madrid', hour12: true });
  //let timestampIni = new Date().toLocaleString('en-GB', { timeZone: 'Europe/Madrid', hour12: true });
  let newQR2 = servidorURL + "/rhb/index.html?" + username + '#' + nombrepdf + totalMp4Lite;
  console.info(username)
  const eventDataRhb = {
    uniqueNumber: Date.now(),
    timestamp: timestampEvent,
    autor: username,
    pdf_nom: nombrepdf,
    qr_nom: newQR2,
    image_nom: totalMp4,
  };

  if (navigator.onLine) {
    console.log("Tienes conexión a Internet.");
    let username = localStorage.getItem('username'); //*********************//if (username !== "jmab")
    logEventPdf(eventDataRhb)
  } else {
    console.log("No tienes conexión a Internet.");
  }

  /*if (n > 0) {
    let confirmar = alert("Su PDF es de I Generación, va a ser convertido y guardado como PDF de II Generación" +
      " para disponer de todas las funcionalidades. En adelante utilice este nuevo PDF.");
    docport.save(nameSave)
    window.open('./open.html', '_self');
  }
  else */
  if (n === 2) {
    // Generas el PDF como Blob
    const pdfBlob = docport.output("blob");
    // Creas una URL temporal
    const pdfUrl = URL.createObjectURL(pdfBlob);
    // Abres el PDF en una nueva pestaña
    //window.open(pdfUrl, '_self');

    const btn = document.getElementById("abrirPdfBtn");
    //btn.style.display = "block";
    btn.textContent = 'Abrir PDF';
    btn.onclick = () => window.open(pdfUrl, '_self');

    //docport.save(nameSave)

    const a = document.createElement('a');
    a.href = pdfUrl;
    a.download = nameSave;
    a.click();
  }
  else {
    docport.save(nameSave)
  }
}
//////////////////////////////////////////////////////////

async function logEventPdf(eventData) {
  const response = await fetch(servidorURL + '/php/logs/php_log_pdf.php?t=' + new Date().getTime(), {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json; charset=utf-8'
    },
    body: JSON.stringify(eventData)
  });
  const result = await response.json();
  console.log(result);
}
///////////////////////////////////////////////////////////
async function fetchImageAsBase64(name) {
  let base64Image;
  console.info(name)
  console.info(servidorURL + `/php/pdf/php_get_image.php?image_name=${encodeURIComponent(name)}`)
  try {
    const url = servidorURL + `/php/pdf/php_get_image.php?image_name=${encodeURIComponent(name)}`;
    //const url = servidorURL + "/php/pdf/php_get_image.php?image_name=${encodeURIComponent(name)}";

    // Obtener la imagen como un Blob
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error('Error al obtener la imagen.');
    }
    const blob = await response.blob();
    // Leer el blob como una data URL (base64)
    base64Image = await readBlobAsDataURL(blob);
  } catch (error) {
    console.error('Error:', error);
  }
  return base64Image;
}

function readBlobAsDataURL(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onloadend = function () {
      resolve(reader.result);
    };
    reader.onerror = function (error) {
      reject(error);
    };
    reader.readAsDataURL(blob);
  });
}

////////////////////////////////////////////
//async function leerYAbrirURL2(txtUrl, doc, rectXp, rectYp, imgWidth, imgHeight) {
async function leerYAbrirURL2(txtUrl, doc, rectXp, rectYp, imgWidth, imgHeight, numfile) {
  // servidorURL + '/assets/cstvideo/839_a01.txt'
  // URL del archivo .txt en el servidor
  const archivoURL = txtUrl;  // Cambia esto por la URL de tu archivo
  console.info(txtUrl)
  // Usamos fetch() para obtener el contenido del archivo .txt
  await fetch(archivoURL)
    .then(response => {
      if (!response.ok) {
        throw new Error('No se pudo obtener el archivo');
      }
      return response.text();  // Leemos el archivo como texto
    })
    .then(contenido => {
      const urlTxt = contenido.trim(); // Extraemos la URL y quitamos espacios innecesarios

      if (isValidUrl(urlTxt)) {
        console.log('URL extraída:', urlTxt);
        let newnew = urlTxt;
        let urlOrin = newnew.slice(0, 21);

        //if (urlOrin == servidorURL + "") {
        if (parseInt(numfile[0]) == 8 && parseInt(numfile[1]) == 9 && parseInt(numfile[2]) == 9) {
          newnew = urlTxt + '?' + nuevotitulo;
        }
        console.info(newnew);
        //urlTxt = newnew;
        doc.link(rectXp, rectYp, imgWidth, imgHeight, { url: newnew }); //
        totalUrl.push(newnew)
        //return urlTxt;
        //window.open(url, '_blank');  // Abrimos la URL en una nueva ventana
      }

      /*// Verificamos si el contenido es una URL válida
      if (isValidUrl(urlTxt)) {
        console.log('URL extraída:', urlTxt);
        doc.link(rectXp, rectYp, imgWidth, imgHeight, { url: urlTxt }); //
        totalUrl.push(urlTxt)
        //return urlTxt;
        //window.open(url, '_blank');  // Abrimos la URL en una nueva ventana
      } */
      else {
        //urlTxt = "";
        alert('El archivo no contiene una URL válida');
        //return txtUrl;
      }
      //return urlTxt;
    })
    .catch(error => {
      console.error('Error al leer el archivo:', error);
      alert('Hubo un error al leer el archivo');
    });

}

// Función para verificar si la URL es válida (básica)
function isValidUrl(url) {
  const regex = /^(http|https):\/\/[^\s/$.?#].[^\s]*$/i;
  return regex.test(url);
}
///////////////////////////////////