1function replaceUrlParameter(url, paramName, newValue) { 2 // Esco se almeno uno dei parametri è null OR undefined (uso == per fare un solo IF) 3 if (url == null) return; 4 if (paramName == null) return; 5 if (newValue == null) return; 6 // Cerco il parametro con una regexp 7 // Prendo il primo carattere a sinistra (deve essere ? OR &) 8 // Poi rimpiazzo il valore precedente con quello nuovo 9 const re = new RegExp("[\\?&]" + paramName + "=([^&#]*)"); 10 const delimiter = re.exec(url)[0].charAt(0); 11 return url.replace(re, delimiter + paramName + "=" + newValue); 12} 13 14function isInt(value){ 15 return Number(value) === value && value % 1 === 0; 16} 17 18function isFloat(value){ 19 return Number(value) === value && value % 1 !== 0; 20} 21 22function isIntOrFloat(value){ 23 return isInt(value) || isFloat(value); 24} 25 26//converte un vettore in testo separato da virgole 27function arrayToString(arr) { 28 let str = ''; 29 arr.forEach(function (i, index) { 30 str += i; 31 if (index !== (arr.length - 1)) { 32 str += ','; 33 } 34 }); 35 return str; 36} 37 38function clearArray(array) { 39 array = []; 40} 41 42function loaderHide(){ $('#loading-overlay').fadeOut(); } 43function loaderShow(){ $('#loading-overlay').show(); } 44 45/*** 46 * =============================================================== 47 * Funzioni al momento utilizzate nelle nuove pagine MerloMobility 48 * =============================================================== 49 **/ 50 51/** 52 * Cambia l'attributo @src di un'immagine che rappresenta lo stato di un elemento di telemetria. 53 * Viene sostituita solo l'immagine dopo l'ultimo / che ha la sintassi elementCode_value_suffix.svg. 54 * Questo perchè per ogni elemento sono presenti N SVG che rappresentano ciascuno dei vari stati. 55 * @param id identificativo dell'immagine, attributo @id 56 * @param code il codice numerico che identifica l'elemento di telemetria, corrisponde ad ItemCode.code 57 * @param value il valore dell'elemento di telemetria, solitamente in formato testo 58 * @param suffix il testo da appendere al fondo dell'immagine, di solito la tipologia di modello (modulare, eworker) 59 **/ 60function changeTelemetryImageSource(id, code, value, suffix){ 61 const img = $('#' + id).find('img:first'); // ottengo l'oggetto con l'immagine da modificare 62 if (!img.length) return; 63 const oldSrc = img.attr("src"); // recupero il vecchio attributo @src 64 const lastIndexOfSlash = oldSrc.lastIndexOf("/"); // cerco l'ultimo /, dopo cui c'è il nome dell'immagine da cambiare 65 const imgLeft = oldSrc.substring(0, lastIndexOfSlash + 1); // la parte sinistra che rimane la stessa 66 const mySuffix = suffix || ''; 67 const newSrc = imgLeft + code + "_" + value + mySuffix + ".svg"; // compongo il nuovo @src 68 //console.log(newSrc); 69 // Cambio l'attributo @src solo se necessario 70 if (oldSrc !== newSrc) { img.attr('src', newSrc); } 71} 72// function changeTelemetryImageSource(imgId, elementCode, value){ 73// var img = $('#' + imgId).find('img:first'); // ottengo l'oggetto con l'immagine da modificare 74// if (!img.length) return; 75// var oldSrc = img.attr("src"); // recupero il vecchio attributo @src 76// var lastIndexOfSlash = oldSrc.lastIndexOf("/"); // cerco l'ultimo /, dopo cui c'è il nome dell'immagine da cambiare 77// var imgLeft = oldSrc.substring(0, lastIndexOfSlash + 1); // la parte sinistra che rimane la stessa 78// var newSrc = imgLeft + elementCode + "_" + value + ".svg"; // compongo il nuovo @src 79// // Cambio l'attributo @src solo se necessario 80// if (oldSrc !== newSrc) { img.attr('src', newSrc); } 81// } 82 83/** 84 * Sostituisce le immagini figlie di un elemento in modo che rappresentino un numero. In pratica viene creata una nuova immagine 85 * e poi cambiato l'attributo @src di tutte le immagini. I numeri sono quindi delle immagini da 0 a 9 e poi 'dot' per il punto decimale 86 * e 'none' per un numero che non deve essere rappresentato (un posto vuoto trasparente). 87 * @param elementId identificativo (attributo @id) dell'elemento che contiene le immagini che rappresentano il numero 88 * @param elementValue il valore da rappresentare, un numero in formato testuale 89 * @param integers il numero di cifre intere da rappresentare 90 * @param decimals il numero di cifre decimali da rappresentare 91 * @param sign true se si deve disegnare il segno a sinistra (per ora vuoto per + e minus per -) 92 */ 93function drawNumber(elementId, elementValue, integers, decimals, sign, leadingZerosToNone, removeNone){ 94 //console.log('drawNumber(' + elementId + ',' + elementValue + ',' + integers + ',' + decimals + ',' + sign + ')'); 95 // Ottengo tutti gli elementi @img figli diretti di @elementId 96 const allImages = $('#' + elementId).children('img'); 97 // Talliente 11/09/2026: Adesso per tutti i numeri persenti nel cruscottoto gestiamo i valori n.a come per i testi. Tramite "--" che viene usato per i testi, 98 // imposto un valore booleano per prendere gli svg delle immagini dalla cartella dei grigi -> caso n.a e cartella dei verdi -> caso misurazione esistente 99 let disable = false;
100 // Dal valore numerico ottengo l'elenco delle immagini che lo rappresentano [0..9 | none | dot] 101 let numberImages = []; 102 if (elementValue === '--') { 103 for (let i = 0; i < integers; i++) { numberImages.push('0'); } 104 if (decimals > 0) { 105 numberImages.push('dot'); 106 for (let i = 0; i < decimals; i++) { numberImages.push('0'); } 107 } 108 disable = true 109 } else { 110 numberImages = numberToImages(elementValue, integers, decimals, sign, leadingZerosToNone, removeNone); 111 } 112 // const numberImages = numberToImages(elementValue.toString(), integers, decimals, sign); 113 // Elaboro un'immagine per volta 114 allImages.each(function(i){ 115 // Recupero il vecchio attributo @src da sostituire 116 const oldSrc = $(this).attr("src"); 117 // Riporto tutte le immagini alla situazione in cui assumo che lamisurazione ci sia 118 // Cerco l'ultimo / che separa il percorso dal nome immagine 119 const lastIndexOfSlash = oldSrc.lastIndexOf("/"); 120 // Recupero la parte sinistra (il percorso) che non cambia 121 const imgLeft = oldSrc.substring(0, lastIndexOfSlash + 1); 122 // Costruisco il nuovo @src dato da @left + immagine generata dal valore + .svg 123 let newSrc = imgLeft + numberImages[i] + ".svg"; 124 newSrc = disable ? newSrc.replace("green", "gray") : newSrc.replace("gray", "green"); 125 $(this).attr('src', disable ? newSrc.replace("green", "gray") : newSrc); 126 }); 127} 128 129// TODO: al momento i valori devono corrispondere all'enum com.movimatica.service.telemetry.SvgFormat 130function drawPlay(json, suffix = ''){ 131 const mySuffix = suffix.length > 0 ? '_' + suffix : ''; 132 if (json.type === 'image' ) { changeTelemetryImageSource(json.id, json.code, json.value, mySuffix); } 133 if (json.type === 'int2' ) { drawNumber(json.id, json.value, 2, 0, false, true, true); } 134 if (json.type === 'int3' ) { drawNumber(json.id, json.value, 3, 0, false, true, true); } 135 if (json.type === 'int2sign') { drawNumber(json.id, json.value, 2, 0, true, true, true); } 136 if (json.type === 'int6' ) { drawNumber(json.id, json.value, 6, 0, false, false, false); } 137 if (json.type === 'dec21' ) { drawNumber(json.id, json.value, 2, 1, false, true, true); } 138 if (json.type === 'text' ) { $('#' + json.id).children('div:first').text(json.value); } 139} 140 141/** 142 * Trasforma un numero in un elenco di testi che rappresentano l'immagine di ciascuna cifra. 143 * Se ci sono meno cifre intere di quelle da rappresentare, al momento viene creato il testo @none, che deve coincidere 144 * con il nome dell'immagine. Se ci sono meno decimali di quelli richiesti, vengono appesi degli 0. 145 * @param value il valore numerico da rappresentare, in formato testo 146 * @param integers il numero di cifre intere da rappresentare 147 * @param decimals il numero di cifre decimali da rappresentare. Se positivo, viene appeso il testo @dot e le singole cifre 148 * @param sign true se si deve disegnare il segno a sinistra (per ora vuoto per + e minus per -) 149 * @param leadingZerosToNone true se gli ZERI a sinistra prima di altre cifre devono diventare NONE per non renderli visibili (es 00012 diventa ___12) 150 * @param removeNone true se si vogliono eliminare gli ZERI o NONE subito dopo il segno negativo, per compattare il testo (es. -00012 diventa -12) 151 */ 152function numberToImages(value, integers, decimals, sign, leadingZerosToNone, removeNone){ 153 //console.log('==== numberToImages(' + value + ',' + integers + ',' + decimals + ',' + sign + ',' + removeNone + ')'); 154 // recupero i valori in input, impostandoli al default se non specificati 155 const myIntegers = integers || 0; 156 const myDecimals = decimals || 0; 157 const mySign = sign || false; 158 const myLeadingZerosToNone = leadingZerosToNone || false; 159 const myRemoveNone = removeNone || false; 160 // Input sanity check, esco con valori sicuramente non calcolabili 161 if (!isIntOrFloat(value) || myIntegers < 1 || myDecimals < 0) return []; 162 const myValue = value.toString(); // trasformo il numero in testo 163 // console.log("value " + value + ', integers ' + myIntegers + ", decimals " + myDecimals + ', mySign ' + mySign + ', myLeadingZerosToNone ' + myLeadingZerosToNone + ', myRemoveNone ' + myRemoveNone); 164 // Calcolo la dimensione del testo finale, dato da segno + interi + punto + decimali (quando presenti) 165 let fullLength = myIntegers; // il numero di interi 166 if (myDecimals > 0) fullLength += (myDecimals + 1); // se decimale, punto + numero decimali 167 if (mySign) fullLength +=1; // se segno, aggiungo 1 168 // array con ogni numero in forma testuale (in pratica i nomi delle immagini da sostituire) 169 const result = new Array(fullLength); 170 let testina = 0; // servirà a scrivere nella posizione giusta di <result> 171 // Se bisogna usare il primo posto per il segno, scrivo NONE per il + (così non si vede), e MINUS per i negativi 172 if (mySign){ result[testina++] = value >= 0 ? 'none' : 'minus'; } 173 // cerco il punto che divide interi da decimali, se non esiste restituisce -1 174 const indexOfDot = myValue.indexOf('.'); 175 // Ottengo il testo che rappresenta la parte intera (escludo l'eventuale - dei valori negativi) 176 let parteIntera = (indexOfDot > -1) ? myValue.substring(0, indexOfDot) : myValue; 177 if (value < 0) parteIntera = parteIntera.substring(1); // se ho un valore negativo, escludo il MENO tutto a sinistra 178 // Se ho più cifre intere di quelle che devono essere visualizzate, tronco da sinistra (prendo quelle più vicine al punto decimale) 179 if (parteIntera.length > integers) { parteIntera = parteIntera.substring(parteIntera.length - integers); } 180 // Verifico se devo generare a sinistra degli ZERI o NONE, cioè se il valore ha meno cifre di quelle da generare 181 let noneToGenerate = integers - parteIntera.length; 182 while (noneToGenerate > 0) { result[testina++] = myLeadingZerosToNone ? 'none' : '0'; noneToGenerate--; } 183 // Ora appendo ogni cifra degli interi 184 for (let testinaInteri = 0; testinaInteri < parteIntera.length; testinaInteri++) { result[testina++] = (parteIntera.charAt(testinaInteri)); } 185 // Verifico se devo anche generare le cifre dei decimali 186 const arrayIndexOfDot = testina; // mi salvo la posizione dove ho messo il punto decimale, per dopo 187 if (decimals > 0){ 188 result[testina++] = ("dot"); 189 // Ottengo il testo che rappresenta la parte decimale 190 let parteDecimale = (indexOfDot > -1) ? myValue.substring(indexOfDot + 1) : ""; 191 // Se ho più decimali di quelli da visualizzare, prendo solo i primi @decimals 192 if (parteDecimale.length > decimals) { parteDecimale = parteDecimale.substring(0, parteDecimale.length - decimals); } 193 // Fino a quando ho meno decimali di quelli da visualizzare, appendo gli 0 al fondo (NON all'inizio neeeee) 194 while (parteDecimale.length < decimals) { parteDecimale += '0';} 195 // Ora appendo ogni cifra dei decimali 196 for (let x = 0; x < parteDecimale.length; x++) { result[testina++] = (parteDecimale.charAt(x)); } 197 } 198 // Se è richiesto di eliminare di ZERI o NONE a sinistra dopo il segno. Per numeri positivi non è necessario perchè il segno è nascosto 199 if (myRemoveNone && value < 0){ 200 // Calcolo fino a quale posizione devo verificare. Mi devo fermare un char prima della fine (-1) perchè l'ultima cifra deve sempre esserci, anche se ZERO 201 const finoA = (arrayIndexOfDot < 0 ? result.length : arrayIndexOfDot) - 1; 202 for (let testinaNone = 1; testinaNone < finoA;testinaNone++){ 203 // Se il testo è vuoto, cioè NONE o ZERO, sposto il segno dal carattere precedente (che viene oscurato) a questo 204 if (result[testinaNone] === 'none' || result[testinaNone] === '0'){ 205 result[testinaNone - 1] = 'none'; 206 result[testinaNone] = 'minus'; 207 } 208 } 209 } 210 // console.log(result.toString()); 211 return result; 212} 213 214/** 215 * Trasforma il numero di invii di un pacchetto in un tempo effettivo. Viene usato ad esempio nelle statistiche 216 * di tipo attivazioni | variazioni in cui, per ogni minuto, viene inv
216iato il numero di pacchetti ricevuti. 217 * Sapendo ogni quanti millisecondi viene inviato un pacchetto, si può calcolare il tempo totale. 218 * @param volte quanti pacchetti CAN sono stati inviati 219 * @param millis ogni quanti millisecondi viene inviato il pacchetto 220 * @returns {string} il tempo totale nel formato xh ym zs (N ore, N minuti, N secondi) 221 */ 222function canToHms(volte, millis) { 223 var myVolte = volte || 0; 224 var myMillis = millis || 0; 225 if (myVolte < 1 || myMillis < 1) return '0s'; 226 // trasformo le volte in secondi 227 var seconds = Math.floor(((myMillis * myVolte ) / 1000)); 228 // dai secondi totali calcolo ore | minuti | secondi effettivi 229 var ore = Math.floor(seconds / 3600); 230 var minuti = Math.floor((seconds - (ore * 3600)) / 60); 231 var secondi = seconds - (ore * 3600) - (minuti * 60); 232 // Se ho almeno 1 ora, restituisco Nore Nminuti Nsecondi (h m s) 233 if (ore > 0) { return ore + 'h ' + minuti + 'm ' + secondi + 's'; } 234 // Se ho 0 ore ma almeno 1 minuto, restituisco Nminuti Nsecondi (m s) 235 if (minuti > 0) { return minuti + 'm ' + secondi + 's'; } 236 // Se sono qui ho solo i secondi 237 return secondi + 's'; 238} 239 240function millisToHms(millis){ 241 const myMillis = millis || 0; 242 if (myMillis < 1) return '0s'; 243 // Ottengo i secondi arrotondando per difetto 244 const seconds = Math.floor(myMillis / 1000); 245 // dai secondi totali calcolo ore | minuti | secondi effettivi 246 const ore = Math.floor(seconds / 3600); 247 const minuti = Math.floor((seconds - (ore * 3600)) / 60); 248 const secondi = seconds - (ore * 3600) - (minuti * 60); 249 // Se ho almeno 1 ora, restituisco Nore Nminuti Nsecondi (h m s) 250 if (ore > 0) { return ore + 'h ' + minuti + 'm ' + secondi + 's'; } 251 // Se ho 0 ore ma almeno 1 minuto, restituisco Nminuti Nsecondi (m s) 252 if (minuti > 0) { return minuti + 'm ' + secondi + 's'; } 253 // Se sono qui ho solo i secondi 254 return secondi + 's'; 255} 256 257function secondsToHHMMSS(secondi){ 258 let totalSeconds = secondi || 0; 259 const hours = Math.floor(totalSeconds / 3600); 260 totalSeconds %= 3600; 261 const minutes = Math.floor(totalSeconds / 60); 262 const seconds = totalSeconds % 60; 263 let result = ''; 264 if (hours < 10) result += '0'; 265 result += hours; 266 result += ':'; 267 if (minutes < 10) result += '0'; 268 result += minutes; 269 result += ':'; 270 if (seconds < 10) result += '0'; 271 result += seconds; 272 return result; 273} 274 275function getDigital(position, booleans){ 276 //console.log('getDigital(' + position + ',' + booleans + ')'); 277 const myPosition = position || 0; 278 const myBooleans = booleans || ''; 279 //console.log('myPosition = ' + myPosition + ', myBooleans = ' + myBooleans); 280 const result = (myPosition < 0 || myPosition >= myBooleans.length) ? '0' : myBooleans.charAt(myPosition); 281 //console.log("Risultato: " + result); 282 //console.log('getDigital(' + position + ',' + booleans + ') = ' + result); 283 return result; 284} 285function getDigitalAsBoolean(position, booleans){ 286 const result = getDigital(position, booleans); 287 return result === '1'; 288} 289 290/** 291 * Formatta una label dell'asse Y in attivazioni|variazioni mettendo h/m 292 * @param label 293 * @param maxTimeInSeconds 294 * @returns {string|*} 295 */ 296function getActivationsStepLabel(label, maxTimeInSeconds){ 297 const times = 0 + label || 0; 298 const seconds = 0 + maxTimeInSeconds || 0; 299 if (times < 1) return label; 300 const totalHours = 1 + Math.floor(seconds / 3600); 301 const totalMinutes = Math.floor(times / 60000); 302 if (totalMinutes < 60) return totalMinutes + 'm'; 303 const showMinutes = totalHours < 10; 304 const hours = Math.floor(totalMinutes / 60); 305 const minutes = totalMinutes - (hours * 60); 306 let result = ''; 307 if (hours > 0) result += hours + 'h'; 308 if (showMinutes && minutes > 0) result += minutes + 'm'; 309 return result; 310} 311 312// function getActivationsStepLabel(label, millis, max){ 313// console.log('getStepLabel(' + label + ',' + millis + ','+max+ ')'); 314// var times = 0 + label || 0; 315// var myMillis = millis || 0; 316// var total = 0 + max || 0; 317// if (times < 1 || myMillis < 1) return label; 318// 319// var totalHours = 1 + Math.floor((total * myMillis) / 3600000); 320// //console.log('Da ' + total + ' ottengo ' + totalHours + 'h'); 321// 322// var totalMinutes = Math.floor((myMillis * times) / 60000); 323// //if (totalMinutes < 60) return totalMinutes + 'm';
324// 325// var showMinutes = totalHours < 10; 326// 327// var hours = Math.floor(totalMinutes / 60); 328// var minutes = totalMinutes - (hours * 60); 329// 330// var result = ''; 331// if (hours > 0) result += hours + 'h'; 332// if (showMinutes && minutes > 0) result += minutes + 'm'; 333// 334// console.log('getStepLabel(' + times +','+myMillis+') ,' + totalMinutes + ',' + showMinutes + ',' + hours + ',' + minutes + ',' + result); 335// 336// return result; 337// } 338 339function calculateStep(max, millis){ 340 //console.log('calculateStep(' + max + ',' + millis + ')'); 341 return 0; 342 //return Math.floor(max / 3); 343 344 // var myMax = max || 0; 345 // var myMillis = millis || 0; 346 // if (myMillis < 1 || myMax < 1) return 1; 347 // // calcolo quante ore massime ci sono 348 // var oneHourPackets = (1000 / millis) * 3600; 349 // var hours = max / oneHourPackets; 350 // console.log('Ore ' + hours); 351 // if (hours < 0.02) return oneHourPackets / 10; // 6 minuti 352 // if (hours < 1) return oneHourPackets / 2; // 30 minuti 353 // if (hours < 5) return oneHourPackets; // 1 ora 354 // if (hours < 10) return oneHourPackets * 2; // 2 ore 355 // if (hours < 40) return oneHourPackets * 10; // 10 ore 356 // if (hours < 100) return oneHourPackets * 25; // 25 ore 357 // return oneHourPackets * 100; // 100 ore 358} 359 360function scale(type, identifier, ratio) { 361 if (type === 'staticImage') scaleStaticImage(identifier, ratio); 362 if (type === 'text') scaleText(identifier, ratio); 363 if (type === 'link') scaleLink(identifier, ratio); 364} 365 366/** 367 * Riposiziona un elemento modificando la sua posizione assoluta @left e @top 368 * e ridimensiona le immagini figlie con un ratio indicato. 369 * @param identifier l'identificativo del link da scalare 370 * @param ratio il rapporto di scala da applicare alle width e height delle immagini figlie di identifier 371 */ 372function scaleLink(identifier, ratio) { 373 const wrapper = $('#' + identifier); // il link che contiene le immagini (da 1 a N) 374 // Prendo tutti i figli diretti di tipo IMG e ne elaboro uno alla volta 375 wrapper.children('img').each(function (index){ 376 // console.log('Scalo immagine ' + index + ' di ' + identifier + ' con ratio ' + ratio); 377 // Sono prolisso (uso tante variabili) per poter poi rileggere il codice facilmente 378 const oldImgWidth = Number.parseInt($(this).width().toFixed(0), 10); // la larghezza attuale dell'immagine 379 const oldImgHeight = Number.parseInt($(this).height().toFixed(0), 10); // l'altezza attuale dell'immagine 380 const newImgWidth = Number.parseInt((oldImgWidth * ratio).toFixed(0), 10); // la nuova larghezza dell'immagine 381 const newImgHeight = Number.parseInt((oldImgHeight * ratio).toFixed(0), 10); // la nuova altezza dell'immagine 382 $(this).width(newImgWidth); // ridimensiono la larghezza dell'immagine 383 $(this).height(newImgHeight); // ridimensiono l'altezza dell'immagine 384 // console.log('oldImgHW(' + oldImgWidth +','+oldImgHeight+') newImgHW('+newImgWidth+','+newImgHeight+')'); 385 }); 386 // Ora devo riposizionare il link definito da @left e @top assoluti 387 const oldLeft = Number.parseInt(wrapper.css('left'), 10); // il valore dell'attributo 'left' attuale (escludendo i px) 388 const oldTop = Number.parseInt(wrapper.css('top'), 10); // il valore dell'attributo 'top' attuale (escludendo i px) 389 const newLeft = Number.parseInt((oldLeft * ratio).toFixed(), 10); // il nuovo valore di 'left' 390 const newTop = Number.parseInt((oldTop * ratio).toFixed(), 10); // il nuovo valore di 'top' 391 wrapper.css('left', newLeft + 'px'); // imposto il nuovo valore di 'left' 392 wrapper.css('top', newTop + 'px'); // imposto il nuovo valore di 'top' 393 // console.log('oldLT(' + oldLeft+','+oldTop+'),newLT('+newLeft+','+newTop+')'); 394} 395 396function scaleStaticImage(identifier, ratio){ 397 // console.log('scaleStaticImage(' + identifier + ',' + ratio + ')'); 398 // Identificativo con l'immagine statica da scalare, esco se non trovato 399 const image = $('#' + identifier); 400 if (image.length === 0) return; 401 // Sono prolisso (uso tante variabili) per poter poi rileggere il codice facilmente 402 const oldImgWidth = Number.parseInt(image.width().toFixed(), 10); // la larghezza attuale dell'immagine 403 const oldImgHeight = Number.parseInt(image.height().toFixed(), 10); // l'altezza attuale dell'immagine 404 const newImgWidth =Number. parseInt((oldImgWidth * ratio).toFixed(), 10); // la nuova larghezza dell'immagine 405 const newImgHeight = Number.parseInt((oldImgHeight * ratio).toFixed(), 10); // la nuova altezza dell'immagine 406 image.width(newImgWidth); // ridimensiono la larghezza dell'immagine 407 image.height(newImgHeight); // ridimensiono l'altezza dell'immagine 408 // console.log('oldImgHW(' + oldImgWidth +','+oldImgHeight+') newImgHW('+newImgWidth+','+newImgHeight+')'); 409 // Ora devo riposizionare l'immagine definita da @left e @top assoluti 410 const oldLeft = Number.parseInt(image.css('left'), 10); // il valore dell'attributo 'left' attuale (escludendo i px) 411 const oldTop = Number.parseInt(image.css('top'), 10); // il valore dell'attributo 'top' attuale (escludendo i px) 412 const newLeft = Number.parseInt((oldLeft * ratio).toFixed(), 10); // il nuovo valore di 'left' 413 const newTop = Number.parseInt((oldTop * ratio).toFixed(), 10); // il nuovo valore di 'top' 414 image.css('left', newLeft + 'px'); // imposto il nuovo valore di 'left' 415 image.css('top', newTop + 'px'); // imposto il nuovo valore di 'top' 416 // console.log('oldLT(' + oldLeft+','+oldTop+'),newLT('+newLeft+','+newTop+')'); 417} 418 419function scaleText(identifier, ratio) { 420 const wrapper = $('#' + identifier); // il link che contiene il testo 421 const div_text = wrapper.children().first(); // il div che contiene il testo 422 //console.log('Ratio ' + ratio + ', ho trovato il testo #' + div_text.text() + '#'); 423 const oldLeft = Number.parseInt(wrapper.css('left'), 10); // il valore dell'attributo 'left' attuale (escludendo i px) 424 const oldTop = Number.parseInt(wrapper.css('top'), 10); // il valore dell'attributo 'top' attuale (escludendo i px) 425 const newLeft = Number.parseInt((oldLeft * ratio).toFixed(), 10); // il nuovo valore di 'left' 426 const newTop = Number.parseInt((oldTop * ratio).toFixed(), 10); // il nuovo valore di 'top' 427 wrapper.css('left', newLeft + 'px'); // imposto il nuovo valore di 'left' 428 wrapper.css('top', newTop + 'px'); // imposto il nuovo valore di 'top' 429 //console.log('Left ' + oldLeft + '>' + newLeft + ', Top ' + oldTop +'>'+ newTop); 430 const oldFontSize = Number.parseInt(div_text.css('font-size'), 10); 431 const newFontSize = Number.parseInt((oldFontSize * ratio).toFixed(), 10); 432 div_text.css('font-size', newFontSize); 433 //console.log('Font Size ' + oldFontSize +'>'+newFontSize); 434 const oldWidth = Number.parseInt(div_text.css('width'), 10); 435 const newWidth = Number.parseInt((oldWidth * ratio).toFixed(), 10); 436 div_text.css('width', newWidth); 437 //console.log('Text width ' + oldWidth +'>'+newWidth); 438} 439 440function updateVehicleData(name, chassis, sav, place, connection, status){ 441 if(typeof name !== 'undefined') { $("#vehicleName" ).html(name); } 442 if(typeof chassis !== 'undefined') { $("#vehicleChassis" ).html(chassis); } 443 if(typeof sav !== 'undefined') { $("#vehicleSav" ).html(sav); } 444 if(typeof place !== 'undefined') { $("#vehiclePlace" ).html(place); } 445 if(typeof connection !== 'undefined') { $("#vehicleLastConnect").html(connection); } 446 if(typeof status !== 'undefined') { 447 const image = $("#vehicleImage"); // cerco l'immagine del mezzo 448 let source = image.attr("src"); // recupero l'attributo src con il path completo 449 let last = source.lastIndexOf("/"); // cerco l'ultimo /, devo cambiare solo l'ultima parte 450 // Ricostruisco il src prendendo la parte prima del / statica, aggiungo il prefisso che è costante, aggiungo lo status in lowercase, aggiungo l'estensione immagine 451 // src diventa prendo la parte prima del / che è statica 452 source = source.substring(0, last) + "/status_" + status + ".svg"; 453 image.attr("src", source);
453 // cambio l'attributo src dell'immagine con il nuovo stato 454 } 455 456} 457
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.