PageSourceSearch

https://service.movimatica.com/resources/js/movimatica.js;jsessionid=F2E535E935106D9E427695BD97D707D7

js movimatica.com collected 2026-09-25 03:29:04 UTC 25,176 bytes, 457 lines download raw bytes

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.