/*
 * Created on 7-giu-2006
 *
 * Copyright (c) EldaSoft S.p.A.
 * Tutti i diritti sono riservati.
 *
 * Questo codice sorgente e' materiale confidenziale di proprieta' di EldaSoft S.p.A.
 * In quanto tale non puo' essere distribuito liberamente ne' utilizzato a meno di 
 * aver prima formalizzato un accordo specifico con EldaSoft.
 */

//////////////////////////////////////////
// Nome:        general.js
// Descrizione: file Javascript con funzioni e variabili di utilita' generale
// Dipendenze:  nessuna
//////////////////////////////////////////


// variabili generali booleane per il test del browser; il nome e' autoesplicativo del browser individuato
var ie4=document.all&&navigator.userAgent.indexOf("Opera")==-1;
var ns6=document.getElementById&&!document.all;
var ns4=document.layers;
var ie10 = false;
/*@cc_on
	if (/^10/.test(@_jscript_version)) {
		ie10 = true;
	}
@*/

  //////////////////////////////////////////
  // Nome:        modificaParametroRicercaIniziaPer
  // Descrizione: esegue la modifica del valore del campo di input passato 
  //              come argomento in modo da porre il carattere speciale "%"
  //              solo in coda, per poter eseguire filtri nelle ricerche
  //              che iniziano per il valore del campo di input stesso
  // Argomenti:
  //	aCodice - nome o id del campo di input del quale modificare il valore
  //
  // Ritorna:     <e' una procedura>
  //
  // Analisi:     documento 5349_2693_08_01_Analisi.doc, paragrafo 13.1
  //////////////////////////////////////////
  function modificaParametroRicercaIniziaPer(aCodice) {
    var linpOggetto = null;
    if (document.getElementById)
      linpOggetto = document.getElementById(aCodice);
    else if (document.all)
      linpOggetto = eval ("document.all."+aCodice);
    if (linpOggetto.value.length>0) {
      var valore = pulisciStringaDaCarattereSpeciale(linpOggetto.value,"%");
      linpOggetto.value = valore + "%";
    }
  }

  //////////////////////////////////////////
  // Nome:        modificaParametroRicercaTerminaPer
  // Descrizione: esegue la modifica del valore del campo di input passato 
  //              come argomento in modo da porre il carattere speciale "%"
  //              solo in testa, per poter eseguire filtri nelle ricerche
  //              che terminano per il valore del campo di input stesso
  // Argomenti:
  //	aCodice - nome o id del campo di input del quale modificare il valore
  //
  // Ritorna:     <e' una procedura>
  //
  // Analisi:     documento 5349_2693_08_01_Analisi.doc, paragrafo 13.2
  //////////////////////////////////////////
  function modificaParametroRicercaTerminaPer(aCodice) {
    var linpOggetto = null;
    if (document.getElementById)
      linpOggetto = document.getElementById(aCodice);
    else if (document.all)
      linpOggetto = eval ("document.all."+aCodice);
    if (linpOggetto.value.length>0) {
      var valore = pulisciStringaDaCarattereSpeciale(linpOggetto.value,"%");
      linpOggetto.value = "%" + valore;
    }
  }

  //////////////////////////////////////////
  // Nome:        modificaParametroRicercaContiene
  // Descrizione: esegue la modifica del valore del campo di input passato 
  //              come argomento in modo da porre il carattere speciale "%"
  //              in testa ed in coda, per poter eseguire filtri nelle ricerche
  //              che contengono il valore del campo di input stesso
  // Argomenti:
  //	aCodice - nome o id del campo di input del quale modificare il valore
  //
  // Ritorna:     <e' una procedura>
  //
  // Analisi:     documento 5349_2693_08_01_Analisi.doc, paragrafo 13.3
  //////////////////////////////////////////
  function modificaParametroRicercaContiene(aCodice) {
    var linpOggetto = null;
    if (document.getElementById)
      linpOggetto = document.getElementById(aCodice);
    else if (document.all)
      linpOggetto = eval ("document.all."+aCodice);
    if (linpOggetto.value.length>0) {
      var valore = pulisciStringaDaCarattereSpeciale(linpOggetto.value,"%");
      linpOggetto.value = "%" + valore + "%";
    }
  }

  //////////////////////////////////////////
  // Nome:        pulisciStringaDaCarattereSpeciale
  // Descrizione: pulisce la stringa in input di tutte le occorrenze del carattere
  //              passato come argomento
  // Argomenti:
  //	aStringa   - stringa da ripulire
  //	aCarattere - carattere da eliminare
  //
  // Ritorna:     aStringa ripulita di tutte le occorrenze di aCarattere
  //
  // Analisi:     documento 5349_2693_08_01_Analisi.doc, paragrafo 13.1
  //////////////////////////////////////////
  function pulisciStringaDaCarattereSpeciale(aStringa, aCarattere) {
    var liIndiceCarattere = aStringa.indexOf(aCarattere);
    while (liIndiceCarattere != -1) {
      aStringa = aStringa.substring(0, liIndiceCarattere) + aStringa.substring(liIndiceCarattere + 1, aStringa.length);
      liIndiceCarattere = aStringa.indexOf(aCarattere);
    }
    return aStringa;
  }

  //////////////////////////////////////////
  // Nome:        sostituisciPrimaOccorenza
  // Descrizione: sostituisce la prima occorenza del 'testoDaSostituire' con il
  //              nuovoTesto
  // Argomenti:
  //    str               - stringa su cui operare la sostituzione
  //    testoDaSostituire - stringa da sostituire;
  //    nuovoTesto        - nuova stringa da inserire in str;
  // Ritorna:     la stringa 'str' con il testo sostituito se 'testoDaSostituire' e'
  //              presente in 'str', altrimenti ritorna -1
  //////////////////////////////////////////
  function sostituisciPrimaOccorenza(str, testoDaSostituire, nuovoTesto){
    var txtDaSostituire = new String(testoDaSostituire);
    var nuovoTxt = new String(nuovoTesto);
    var tmp = new String(str);
    if(tmp.indexOf(txtDaSostituire) >= 0){
      tmp = tmp.substring(0,tmp.indexOf(txtDaSostituire)) + nuovoTxt + str.substring(tmp.indexOf(txtDaSostituire) + txtDaSostituire.length, tmp.length);
    }
    return tmp;
  }

  //////////////////////////////////////////
  // Nome:        getAbsoluteTop
  // Descrizione: ritorna la coordinata y nel browser per l'oggetto in input
  // Argomenti:
  //	aSender   - oggetto per il quale calcolare la coordinata y dall'alto
  //
  // Ritorna:     intero indicante la posizione in pixel dell'oggetto rispetto 
  //              il margine superiore
  //////////////////////////////////////////
  function getAbsoluteTop(aSender) {
    var ris = 0;
    if(!aSender.offsetParent) return 0;
    ris = aSender.offsetTop + getAbsoluteTop(aSender.offsetParent);
    return ris;
  }

  //////////////////////////////////////////
  // Nome:        getAbsoluteLeft
  // Descrizione: ritorna la coordinata x nel browser per l'oggetto in input
  // Argomenti:
  //	aSender   - oggetto per il quale calcolare la coordinata x da sinistra
  //
  // Ritorna:     intero indicante la posizione in pixel dell'oggetto rispetto 
  //              il margine sinistro
  //////////////////////////////////////////
  function getAbsoluteLeft(aSender) {
    var ris = 0;
    if(!aSender.offsetParent) return 0;
    ris = aSender.offsetLeft + getAbsoluteLeft(aSender.offsetParent);
    return ris;
  }


  //////////////////////////////////////////
  // Nome:        selezionaTutti
  // Descrizione: seleziona tutti i checkbox presenti nella pagina
  // Argomenti:
  //	achkArrayCheckBox - array di checkbox presenti in un form 
  //  o singolo checkbox, per il quale settare tutti i check
  //
  // Ritorna:     achkArrayCheckBox con tutti i check selezionati
  //////////////////////////////////////////
  function selezionaTutti(achkArrayCheckBox) {
    if (achkArrayCheckBox) {
		  var arrayLen = "" + achkArrayCheckBox.length;
		  if(arrayLen != 'undefined') {
		    for (i = 0; i < achkArrayCheckBox.length; i++) {
		    	if(! achkArrayCheckBox[i].disabled)
			      achkArrayCheckBox[i].checked = true;
		    }
		  } else {
		  	if(! achkArrayCheckBox.disabled)
		      achkArrayCheckBox.checked = true;
		  }
    }
  }

  //////////////////////////////////////////
  // Nome:        deselezionaTutti
  // Descrizione: deseleziona tutti i checkbox presenti nella pagina
  // Argomenti:
  //	achkArrayCheckBox - array di checkboxarray di checkbox presenti 
  //  in un form o singolo checkbox, per il quale deselezionare tutti 
  //  i check
  // Ritorna:     achkArrayCheckBox con tutti i check deselezionati
  //////////////////////////////////////////
  function deselezionaTutti(achkArrayCheckBox) {
    if (achkArrayCheckBox) {
      var arrayLen = "" + achkArrayCheckBox.length;
	  if(arrayLen != 'undefined') {
  	  for (i = 0; i < achkArrayCheckBox.length; i++) {
  	      achkArrayCheckBox[i].checked = false;
    	  }
      } else {
        if (achkArrayCheckBox)
          achkArrayCheckBox.checked = false;
      }	    
    }
  }
  
  //////////////////////////////////////////
  // Nome:        about
  // Descrizione: apre una popup con l'about dell'applicazione
  //////////////////////////////////////////
  function about(applicazione) {
    var w = 500;
    var h = 400;
    var l = Math.floor((screen.width-w)/2);
    var t = Math.floor((screen.height-h)/2); 
    var popup = window.open(applicazione + '/InformazioniSu.do','popup_about','width=' + w + ',height=' + h + ',top=' + t + ',left=' + l + ',status=no,resizable=yes,scrollbars=yes');
    popup.focus();
  }

  
  //////////////////////////////////////////
  // Nome:        accediAltroApplicativoLista
  // Descrizione: apre una popup con la lista degli applicativi
  ////////////////////////////////////////// 
  function accediAltroApplicativoLista(applicazione) {
	    var w = 500;
	    var h = 550;
	    var popup = window.open(applicazione + '/ListaApplicativi.do','accediAltroApplicativoLista','width=' + w + ',height=' + h + ',status=no,resizable=yes,scrollbars=yes');
	    popup.focus();
  }
  
  
  //////////////////////////////////////////
  // Nome:        contaCheckSelezionati
  // Descrizione: conta il numero di checkbox selezionate nell'oggetto in input
  //////////////////////////////////////////
  function contaCheckSelezionati(objArrayCheckBox) {
    var numeroSelezionati = 0;
    if (objArrayCheckBox) {
      var arrayLen = "" + objArrayCheckBox.length;
        if (arrayLen != 'undefined') {
          for (i = 0; i < objArrayCheckBox.length; i++) {
            if (objArrayCheckBox[i].checked)
              numeroSelezionati++;
          }
        } else {
          if (objArrayCheckBox.checked) numeroSelezionati++;
	    }	
    }
    return numeroSelezionati;
  }

  //////////////////////////////////////////
  // Nome:        aggiornaOpzioniSelect
  // Descrizione: Aggiorna il select passato 
  // Argomenti:
  //	nomeArray          - nome dell'array con cui aggiornare i 'value' della select passata come terzo argomento
  //    nomeArrayDescr     - nome dell'array con cui aggiornare i 'text' della select passata come terzo argomento
  //    selectDaAggiornare - nome della select da aggiornare
  //
  // 23/09/2014: modificata modalita' di aggiornamento mediante jQuery per prevenire problemi con IE dalla 8 in su 
  // per cui la select risultava bloccata e non selezionabile (dovuto al set del text a partire da un array)
  //////////////////////////////////////////
  function aggiornaOpzioniSelect(nomeArrayCodice, nomeArrayDescr, selectDaAggiornare) {
    var arrayCodici = eval(nomeArrayCodice);
    var arrayDescrizioni = eval(nomeArrayDescr);
    
	$(selectDaAggiornare).children().remove();
	for (c=0; c < arrayCodici.length; c++) {
		$(selectDaAggiornare).append($('<option>', {
			value: arrayCodici[c],
			text: arrayDescrizioni[c]
		}));
	}
  }

  //////////////////////////////////////////
  // Nome:        addOption
  // Descrizione: Aggiorna la select passata aggiungendo una opzione in coda con i dati in input
  // Argomenti:
  //	theSel   - oggetto di tipo select in cui inserire una nuova opzione
  //	theText  - descrizione della nuova opzione
  //	theValue - valore della nuova opzione
  //////////////////////////////////////////
  function addOption(theSel, theText, theValue) {
    var newOpt = new Option(theText, theValue);
    var selLength = theSel.length;
    theSel.options[selLength] = newOpt;
  }

  //////////////////////////////////////////
  // Nome:        deleteOption
  // Descrizione: Aggiorna la select passata eliminando l'opzione individuata dall'indice in input
  // Argomenti:
  //	theSel   - oggetto di tipo select in cui eliminare una opzione
  //	theIndex - indice della opzione da eliminare
  //////////////////////////////////////////
  function deleteOption(theSel, theIndex) {
    var selLength = theSel.length;
    if(selLength > 0 && theIndex < selLength) {
      theSel.options[theIndex] = null;
    }
  }

  //////////////////////////////////////////
  // Nome:        copyOptions
  // Descrizione: Aggiorna una select aggiungendo le opzioni selezionate in un'altra select
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui estrarre le opzioni selezionate
  //	theSelTo   - oggetto di tipo select in cui inserire in coda le opzioni
  //////////////////////////////////////////
  function copyOptions(theSelFrom, theSelTo) {
    var selLength = theSelFrom.length;
    var selectedText = new Array();
    var selectedValues = new Array();
    var selectedCount = 0;

    // Find the selected Options in reverse order
    for (var i = selLength - 1; i >= 0; i--) {
      if(theSelFrom.options[i].selected && theSelFrom.options[i].value != "") {
        selectedText[selectedCount] = theSelFrom.options[i].text;
        selectedValues[selectedCount] = theSelFrom.options[i].value;
        selectedCount++;
      }
    }
  
    // Add the selected text/values in reverse order.
    // This will add the Options to the 'to' Select
    // in the same order as they were in the 'from' Select.
    for(i = selectedCount - 1; i >= 0; i--) {
      addOption(theSelTo, selectedText[i], selectedValues[i]);
    }  
  }

  //////////////////////////////////////////
  // Nome:        copyAllOptions
  // Descrizione: Aggiorna una select aggiungendo tutte le opzioni di un'altra select
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui estrarre tutte le opzioni
  //	theSelTo   - oggetto di tipo select in cui inserire in coda le opzioni
  //////////////////////////////////////////
  function copyAllOptions(theSelFrom, theSelTo) {
    var selLength = theSelFrom.length;
    var selectedText = new Array();
    var selectedValues = new Array();
    var selectedCount = 0;

    // Find the selected Options in reverse order
    for(var i = selLength - 1; i >= 0; i--) {
      if (theSelFrom.options[i].value != "") {
        selectedText[selectedCount] = theSelFrom.options[i].text;
        selectedValues[selectedCount] = theSelFrom.options[i].value;
        selectedCount++;
      }
    }

    // Add all the text/values in reverse order.
    // This will add the Options to the 'to' Select
    // in the same order as they were in the 'from' Select.
    for(i = selectedCount - 1; i >= 0; i--) {
      addOption(theSelTo, selectedText[i], selectedValues[i]);
    }
  }

  //////////////////////////////////////////
  // Nome:        deleteOptions
  // Descrizione: Aggiorna una select eliminando le opzioni selezionate
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui eliminare le opzioni
  //////////////////////////////////////////
  function deleteOptions(theSelFrom) {
    var selLength = theSelFrom.length;

    // Find the selected Options in reverse order
    // and delete them from the 'from' Select.
    for(var i = selLength - 1; i >= 0; i--) {
      if(theSelFrom.options[i].selected) {
        deleteOption(theSelFrom, i);
      }
    }
  }

  //////////////////////////////////////////
  // Nome:        deleteAllOptions
  // Descrizione: Aggiorna una select eliminando tutte le opzioni
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui eliminare le opzioni
  //////////////////////////////////////////
  function deleteAllOptions(theSelFrom) {
    var selLength = theSelFrom.length;

    // Find the selected Options in reverse order
    // and delete them from the 'from' Select.
    for(var i = selLength - 1; i >= 0; i--) {
      deleteOption(theSelFrom, i);
    }
  }

  //////////////////////////////////////////
  // Nome:        moveUpOptions
  // Descrizione: Aggiorna una select spostando tutte le opzioni selezionate su di una posizione.
  // Nel caso in cui un'opzione sia gia' giunta alla prima riga, le opzioni selezionate tenderanno
  // a comprimersi nelle prime posizioni spostando mano a mano le opzioni non selezionate e comprese
  // tra le opzioni selezionate in posizioni successive a tutti gli elementi selezionati.
  // Argomenti:
  //	theSel - oggetto di tipo select in cui spostare i campi verso l'alto
  //////////////////////////////////////////
  function moveUpOptions(theSel) {
    var selLength = theSel.length;
    var newPosLastObjMoved = -1;
    var tmpValue = null;
    var tmpText = null;

    for (var i = 0; i < selLength; i++) {
      if (theSel.options[i].selected && theSel.options[i].value != "") {
        if (i > 0) {
          if (i != (newPosLastObjMoved+1)) {
            // sposto l'elemento se esiste uno spazio occupabile sopra
            // e se non e' il primo elemento
            tmpValue = theSel.options[i-1].value;
            tmpText = theSel.options[i-1].text;
            theSel.options[i-1].value = theSel.options[i].value;
            theSel.options[i-1].text = theSel.options[i].text;
            theSel.options[i].value = tmpValue;
            theSel.options[i].text = tmpText;
            theSel.options[i-1].selected = true;
            theSel.options[i].selected = false;
            newPosLastObjMoved = i-1;
          } else {
            newPosLastObjMoved = i;
          }
        } else {
          newPosLastObjMoved = i;
        }
      }
    }
  }

  //////////////////////////////////////////
  // Nome:        moveDownOptions
  // Descrizione: Aggiorna una select spostando tutte le opzioni selezionate gia' di una posizione.
  // Nel caso in cui un'opzione sia gia' giunta all'ultima riga, le opzioni selezionate tenderanno
  // a comprimersi nelle ultime posizioni spostando mano a mano le opzioni non selezionate e comprese
  // tra le opzioni selezionate in posizioni precedenti a tutti gli elementi selezionati.
  // Argomenti:
  //	theSel - oggetto di tipo select in cui spostare i campi verso il basso
  //////////////////////////////////////////
  function moveDownOptions(theSel) {
    var selLength = theSel.length;
    var newPosLastObjMoved = -1;
    var tmpValue = null;
    var tmpText = null;

    for (var i = selLength - 1; i  >= 0 ; i--) {
      if (theSel.options[i].selected && theSel.options[i].value != "") {
        if (i < (selLength - 1)) {
          if (i != (newPosLastObjMoved-1)) {
            // sposto l'elemento se esiste uno spazio occupabile sotto
            // e se non e' l'ultimo elemento
            tmpValue = theSel.options[i+1].value;
            tmpText = theSel.options[i+1].text;
            theSel.options[i+1].value = theSel.options[i].value;
            theSel.options[i+1].text = theSel.options[i].text;
            theSel.options[i].value = tmpValue;
            theSel.options[i].text = tmpText;
            theSel.options[i+1].selected = true;
            theSel.options[i].selected = false;
            newPosLastObjMoved = i+1;
          } else {
            newPosLastObjMoved = i;
          }
        } else {
          newPosLastObjMoved = i;
        }
      }
    }
  }
	
	//////////////////////////////////////////
  // Nome:        moveOptions
  // Descrizione: Aggiorna sia la select sorgente che la select di destinazione,
  //              rimuovendo le opzioni selezionati nella select sorgente ed 
  //						  inserendole nella select di destinazione
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui estrarre tutte le opzioni
  //	theSelTo   - oggetto di tipo select in cui inserire in coda le opzioni
  //////////////////////////////////////////
  function moveOptions(theSelFrom, theSelTo) {
  	copyOptions(theSelFrom, theSelTo);
	deleteOptions(theSelFrom);
  }
	
	//////////////////////////////////////////
  // Nome:        moveAllOptions
  // Descrizione: Aggiorna sia la select sorgente che la select di destinazione,
  //              rimuovendo tutte le opzioni della select sorgente ed 
  //						  inserendole nella select di destinazione
  // Argomenti:
  //	theSelFrom - oggetto di tipo select da cui estrarre tutte le opzioni
  //	theSelTo   - oggetto di tipo select in cui inserire in coda le opzioni
  //////////////////////////////////////////
  function moveAllOptions(theSelFrom, theSelTo) {
  	copyAllOptions(theSelFrom, theSelTo);
	deleteAllOptions(theSelFrom);
  }
	
	/**************************************************************
	 Funzione che esegue il lancio delle popUp con l'elenco dei modelli da generare
	 @param applicationPath path dell'applicazione
	 @param entita Nome dell'entita di partenza del testo
	 @param chiavi Elenco dei campi chiave divisi da ;. Es. "CODLAV;NAPPAL"
	 @param valori Oggetto contenente il valore o stringa con le chiavi (sempre divise da ;)
	 @return Visualizza una popUp con la lista dei modelli per la selezione di quello da eseguire
	 
	 @author Marco Franceschin
	 @changelog
	 	14.09.2006 M.F. Prima Versione
		18.09.2006 M.F. Se i valori non sono un'oggetto allora aggiungo ! all'inizio cosi la lista dei modelli da comporre non legge come oggetto
		12.12.2006 M.F.  Apertura della finestra di popUp con la funzione centralizzata
	***************************************************************/
	function compositoreModelli(applicationPath,entita,chiavi,valori){
		oggetto=null;
		try{
			oggetto=eval('document.'+valori);
		}catch(e){
		}
		if(oggetto==null){
			valori='!'+valori;
		}
		openPopUpAction(applicationPath+'/geneGenmod/FwLeggiValoriChiavi.do', 'entita='+entita+'&nomeChiavi='+chiavi+'&valori='+valori,"");
	}
	
	/**************************************************************
	Funzione che esegue la conversione di un valore per il compositore. 
	Aggiunge il carattere eliminatore \ e lo aggiunge prima dei caratteri speciali \ e ;
	 @param	Valore da convertire
	 @return Stringa divisa da ;
	 
	 @author Marco Franceschin
	 @changelog
	 	15.09.2006: M.F. Prima Versione
	***************************************************************/
	function convertiValorePerCompo(valore){
		valore=valore.replace('\\','\\\\');
		valore=valore.replace(';','\\;');	
		return valore;
	}
	
/* Variabile utilizzata per definire che suesta finestra fa parte delle finestre generali dell'applicativo  */
var finestraGeneraleEldasoft="EldaSoft";

function isWindowEldasoft(win){
	/***********************************************************
		Funzione che verifica che una finestra sia una finestra del tipo eldasoft
		@param win
			Finestra da verificare
		@changelog
			26/02/2007 M.F. Prima versione
	 ***********************************************************/

	try{
		if(win.finestraGeneraleEldasoft=="EldaSoft")
			return true;
	}catch(e){
	}
	return false;
}

function getNumeroPopUp(){
	/***********************************************************
		Funzione che ritrova che livello di popUp ? la finestra
		@changelog
			22/11/2006 M.F. Prima versione
			26/02/2007 M.F. Aggiunta del controllo delle variabile che identifica una finestra eldasoft
	 ***********************************************************/
	var numOpener=0;
	var wOpener;
	
	try{
		wOpener=window;
		while(wOpener!=null && isWindowEldasoft(wOpener)){
			wOpener=wOpener.opener;
			if(wOpener!=null && isWindowEldasoft(wOpener))
				numOpener++;
		}
	}catch(e){
	}
	return numOpener;
}
/***********************************************************
	Funzione che si incarica ad andare ad una determinata posizione sull'history
	@param numero
		Numero dell'history nel quale spostarsi
	@changelog
		27/10/2006 M.F. Prima versione
 ***********************************************************/
function historyVaiA(numero){
	closePopUps();
	bloccaRichiesteServer();
	window.location=contextPath+'/History.do?metodo=vaia&numero='+numero+'&numeroPopUp='+getNumeroPopUp();
}

function historyVaiIndietroDi(numeroPassi){
	closePopUps();
	bloccaRichiesteServer();
	window.location=contextPath+'/History.do?metodo=vaiIndietroDi&numero='+numeroPassi+'&numeroPopUp='+getNumeroPopUp();
}

function historyBack(){
	closePopUps();
	bloccaRichiesteServer();
	window.location=contextPath+'/History.do?metodo=back&numeroPopUp='+getNumeroPopUp();
}
function historyReload(){
	closePopUps();
	bloccaRichiesteServer();
	window.location=contextPath+'/History.do?metodo=reload&numeroPopUp='+getNumeroPopUp();
}

function callObjFn(objName,functionName,param){
	/***********************************************************
		Funzione che chiama una funzione in un oggetto
		@changelog
			31/10/2006 M.F. Prima versione
	 ***********************************************************/
	 var obj;
	 
	 try{
		// A questo punto chiamo la vera e propria funzione
		return eval(objName+'.'+functionName+'(param);');
	 }catch(e){
		outMsg(objName+"."+functionName+"("+param+"):"+e.message,"ERR");
	 }
}

	//////////////////////////////////////////
  // Nome:        openPopUp
  // Descrizione: Funzione per l'apertura di una finestra di popup al centro
  //							dello schermo di dimensioni standard (700 x 500), ridimensionabile
  //							e scrollabile.
  //							Su tale finestra viene sempre invocata la action ApriPopup.do,
  //							con gli eventuali parametri specificati nell'argomento href.
  // Argomenti:
  //	href      - stringa dei parametri da passare alla popup in apertura
  //  name		  - nome della finestra
  // 
  // Osservazione:
  // href va a costituire l'URL, che verra' invocata dalla popup. Esempio:
  //
  // var par = "metodo=stampaBozza&key=" + chiave";
  // openPopUp(par, "popupDiEsempio");
  // 
  // La popup viene chiamata invocando la seguente URL:
  //
  // ${pageContext.request.contextPath}/ApriPopup.do?metodo=stampaBozza&key=" + chiave
  //
  //////////////////////////////////////////
function openPopUp(href, name){
	return openPopUpActionCustom(null, href, name, 700, 500, "yes","yes");
}

  //////////////////////////////////////////
  // Nome:        openPopUpCustom
  // Descrizione: Funzione per l'apertura di una finestra di popup al centro
  //							dello schermo di dimensioni specificate in ingresso
  //							- width = larghezza (pixel)
  //							- heigth = altezza (pixel)
  //							- resizable = finestra ridimensionabile: booleano (true, false)
  //							- scrollable = attiva scrollbar: booleano (true, false).
  //							Su tale finestra viene sempre invocata la action ApriPopup.do,
  //							con gli eventuali parametri specificati nell'argomento href.
  // Argomenti:
  //	href      - stringa dei parametri da passare alla popup in apertura
  //  name		  - nome della finestra
  // 
  // Osservazione:
  // l'argomento va a costituire l'URL, che verra' invocata dalla popup. Esempio:
  //
  // var par = "metodo=stampaBozza&key=" + chiave";
  // openPopUpCustom(par, "popupDiEsempio", 500, 350, "no", "no");
  // 
  // La popup viene chiamata invocando la seguente URL:
  //
  // ${pageContext.request.contextPath}/ApriPopup.do?href=metodo=stampaBozza&key=" + chiave
  //
  //////////////////////////////////////////
function openPopUpCustom(href, name, width, height, resizable, scrollable){
	return openPopUpActionCustom(null, href, name, width, height, resizable, scrollable);
}

  //////////////////////////////////////////
  // Nome:        openPopUpAction
  // Descrizione: Funzione per l'apertura di una finestra di popup al centro
  //							 dello schermo di dimensioni standard (700 x 500), ridimensionabile
  //							e scrollabile.
  //							Su tale finestra viene invocata la action specificata nell'argomento
  //							action, con gli eventuali parametri specificati nell'argomento
  //							href.
  //							
  // Argomenti:
  //	action		- azione da invocare all'apertura della popup (compreso il contextPath)
  //	href      - stringa dei parametri da passare alla popup in apertura
  //  name		  - nome della finestra
  // 
  // Osservazione:
  // i due argomenti action e href vanno a costruire l'URL, che verra' invocata
  // dalla popup. Esempio:
  //
  // var act = "${pageContext.request.contextPath}/cs/StampaDomanda.do";
  // var par = "metodo=stampaBozza&key=" + chiave";
  // openPopUpActionCustom(act, par, 'popupDiEsempio', 500, 350, "no", "no);
  // 
  // La popup viene chiamata invocando la seguente URL:
  //
  // ${pageContext.request.contextPath}/cs/StampaDomanda.do?metodo=stampaBozza&key=" + chiave
  //
  //////////////////////////////////////////
function openPopUpAction(action, href, name){
	return openPopUpActionCustom(action, href, name, 700, 500, "yes","yes");
}

	//////////////////////////////////////////
  // Nome:        openPopUpActionCustom
  // Descrizione: Funzione per l'apertura di una finestra di popup al centro
  //							 dello schermo di dimensioni specificate in ingresso:
  //							- width = larghezza (pixel)
  //							- heigth = altezza (pixel)
  //							- resizable = finestra ridimensionabile: booleano (true, false)
  //							- scrollable = attiva scrollbar: booleano (true, false).
  //							Su tale finestra viene invocata la action specificata nell'argomento
  //							action, con gli eventuali parametri specificati nell'argomento
  //							href.
  //							
  // Argomenti:
  //	action		- azione da invocare all'apertura della popup (compreso il contextPath)
  //	href      - stringa dei parametri da passare alla popup in apertura
  //  name		  - nome della finestra
  //  width     - larghezza della popup
  //  height    - altezza della popup
  //  resizable - finestra ridimensionabile: booleano (true, false)
  //  scrolable - attiva scrollbar booleano (true, false)
  // 
  // Osservazione:
  // i due argomenti action e href vanno a costruire l'URL, che verra' invocata
  // dalla popup. Esempio:
  //
  // var act = "${pageContext.request.contextPath}/cs/StampaDomanda.do";
  // var par = "metodo=stampaBozza&key=" + chiave";
  // openPopUpActionCustom(act, par, 'popupDiEsempio', 500, 350, "no", "no");
  // 
  // La popup viene chiamata invocando la seguente URL:
  //
  // ${pageContext.request.contextPath}/cs/StampaDomanda.do?metodo=stampaBozza&key=" + chiave
  //
  //////////////////////////////////////////
function openPopUpActionCustom(action, href, name, width, height, resizable, scrollable){
	// Come prima cosa chiudo tutte le popup
	// NOTA: attenzione, in caso di chiusura e riapertura della stessa popup, con IE
	// la chiusura non avviene qui ma erroneamente solo alla fine, per cui conviene modificare
	// il nome della prima popup aperta prima di scatenare l'apertura della seconda sulla prima
	closePopUps();

  var w = width;
  var h = height;
  var l = Math.floor((screen.width-w)/2);
	var t = Math.floor((screen.height-h)/2);
	var numOpener = getNumeroPopUp()+1;
	
	l = l - 30 + (numOpener * 30);
	t = t - 50 + (numOpener * 50);
	
	if(name == null || name == "")
		name = "popUp" + numOpener;
		
	var tmpHREF = "";
	
	if(action != null && action != ""){
		tmpHREF = action;
		
		if(href != null && href != "")
			tmpHREF += "?" + href + "&numeroPopUp=" + numOpener;
		else
			tmpHREF += "?numeroPopUp=" + numOpener;
	} else {
		tmpHREF = contextPath + "/ApriPopup.do";
		
		if(href != null && href != "")
			tmpHREF += "?" + href + "&numeroPopUp=" + numOpener;
		else
			tmpHREF = "";
	}

	var popup = window.open(tmpHREF,name, "toolbar=no,menubar=no,width=" + w + ",height=" + h + ",top=" + t + ",left=" + l + ",resizable=" + resizable + ",scrollbars="+scrollable);

	if (popup) {
		popup.focus();
		// Setto la popup corrente con quella appena aperta
		currentPopUp = popup;
	}
	return popup;
}

/*************************************************************************
	Funzione JS per apertura di un file su una popup con la barra dei menu. 
	Tale popup non ha vincoli di focus. 
 *************************************************************************/
  //////////////////////////////////////////
  // Nome:        apriDocumento
  // Descrizione: Apertura su una popup con la barra dei menu del file passato
  // 							in argomento. La popup non vincoli di focus
  // Argomenti:
  //	nomeFile - stringa con path e nome file da aprire
  //////////////////////////////////////////
function apriDocumento(nomeFile){
	var w = 800;
	var h = 600;
	var l = Math.floor((screen.width-w)/2);
	var t = Math.floor((screen.height-h)/2); 
	var href = "";
	if(nomeFile.indexOf(":") < 0)
		href = "\\" + nomeFile;
	else
		var href = nomeFile;

	window.open(href,"","toolbar=no,menubar=yes,width=" + w + ",height=" + h + ",top=" + t + ",left=" + l + ",resizable='true',scrollbars='true'");
}

/***********************************************************
	Funzioni JavaScript per gestire le finestre di tipo popUp
	@changelog
		03/11/2006 M.F. Prima versione
 ***********************************************************/
var currentPopUp=null;

function postFocusToPopUp(){
	if(currentPopUp!=null){
		try{
			currentPopUp.focus();
		}catch(e){
			currentPopUp==null
		}
	}
}
function fnFocus(){
	if(currentPopUp!=null){
		try{
			setTimeout("postFocusToPopUp();",10);
		}catch(e){
		}
	}else{
		var wOpener=window.opener;
		var popUpOpener;
		if(wOpener!=null && isWindowEldasoft(wOpener)){
			wOpener.currentPopUp=window;
		}
	}
}

function closePopUps(){
	// Funzione che chiude i popUp aperti
	try{
		if(currentPopUp!=null){
			currentPopUp.close();
			currentPopUp=null;
		}
	}catch(e){
	}
}


function setCurrentPopUpAtOpener(){
	var wOpener=window.opener;
	if(wOpener!=null && isWindowEldasoft(wOpener)){
		try{
			wOpener.currentPopUp=window;
		} catch(e){
		}
	}
}

function reloadPage(){
	history.go(0);
}

setCurrentPopUpAtOpener();

// Funzione che permette di tornare alla home dato il codice applicazione
function goHome(codApp) {
  window.location=contextPath+'/ApriPagina.do?href=home'+codApp+'.jsp';
}


var bloccoPagina = false;

//////////////////////////////////////////
// Nome:        bloccaRichiesteServer
// Descrizione: svuota il contenuto dei link e disabilita i bottoni in modo da
//              non permettere ulteriori inoltri di richieste al server. Il server
//              elaborera' solo la prima richiesta inviatagli
//
// Ritorna:     <e' una procedura>
//////////////////////////////////////////
function bloccaRichiesteServer() {
	bloccoPagina = true;
}

//////////////////////////////////////////
// Nome:        bloccaCaratteriDaTastiera
// Descrizione: procedura da associare ad un evento per bloccare l'utilizzo della tastiera
//              per scrivere qualsiasi carattere in un campo
// Ritorna:     <e' una procedura>
//////////////////////////////////////////
function bloccaCaratteriDaTastiera(e) {
	var key = window.event ? e.keyCode : e.which;
	e.cancelBubble = true;
	e.returnValue = false;
	return false;
}

function checkParIva(pi){
	/**************************************************************	 
		Funzione che verifica la correttezza di una partita iva
		@param piva Partita iva da controllare
		@return true se esatta; false se ci sono problemi
		@author Marco Franceschin
		@changelog
			05.11.2007: M.F. Prima Versione
	***************************************************************/
	if(pi == null || pi.length ==0)
		return true;
	if(pi.length!=11)
		return false;

	var validi = "0123456789";
	for( i = 0; i < 11; i++ ){
		if( validi.indexOf( pi.charAt(i) ) == -1 )
			return false;
	}
  var s = 0;
	var c;
	for( i = 0; i <= 9; i += 2 )
		s += pi.charCodeAt(i) - '0'.charCodeAt(0);
	for( i = 1; i <= 9; i += 2 ){
			c = 2*( pi.charCodeAt(i) - '0'.charCodeAt(0) );
			if( c > 9 )  c = c - 9;
			s += c;
	}
	// Se il carattere di controllo non corrisponde allora da l'errore
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
		return false;
  return true;
}

function checkCodFis(cf){
	/**************************************************************	 
		Funzione che verifica la correttezza di un codice fiscale
		@param codice Codice fiscale da verificare
		@return true OK; false codice sbagliato
		@author Marco Franceschin
		@changelog
			05.11.2007: M.F. Prima Versione
	***************************************************************/
	var validi, i, s, set1, set2, setpari, setdisp;
	
	if(cf == null || cf.length ==0)
		return true;
	// Se il primo carattere ? un numero si tratta di una partita iva
	if("1234567890".indexOf(cf.charAt(0))>=0)
		return checkParIva(cf);
	if(cf.length!=16)
		return false;	
	cf = cf.toUpperCase();
	
	validi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	for( i = 0; i < 16; i++ ){
		// Se non ? tra i caratteri validi da errore
		if( validi.indexOf( cf.charAt(i) ) == -1 )
				return false;
	}
	var set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
	var s = 0;
	for( i = 1; i <= 13; i += 2 )
			s += setpari.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	for( i = 0; i <= 14; i += 2 )
			s += setdisp.indexOf( set2.charAt( set1.indexOf( cf.charAt(i) )));
	if( s%26 != cf.charCodeAt(15)-'A'.charCodeAt(0) )
			return false;
	return true;
}

/***************************************************************************
 * Funzione per intercettera e bloccare l'evento di pressione del pulsante
 * INVIO (o ENTER). Funziona sia con IE che con FireFox
 * @param evento scatenato sull'oggetto della pagina HTML
 * @return ritorna false se viene premuto il tasto INVIO (o ENTER)
 * Esempio d'uso:
 * <input type="text" value=...  onkeypress="javascript:return bloccoPulsanteInvio;" />
 *****************************************************************************/
function bloccoPulsanteInvio(evento){
	return !((window.event && window.event.keyCode == 13) || (evento && evento.which == 13));
}


  
  //////////////////////////////////////////
  // Nome:        round
  // Descrizione: arrotonda il numero in base al numero di decimali indicati come parametro
  // Argomenti:
  //	numero   - numero da arrotondare
  //	decimali - numero di decimali, se negativo si arrotonda alla decina, centinaia, ....
  //
  // Ritorna:     numero arrotondato
  //////////////////////////////////////////
  function round(numero, decimali) {
    var potenza10 = Math.pow(10, decimali);
    return Math.round(numero * potenza10) / potenza10;
  }

  ////////////////////////////////////////////
  // Nome:			toVal
  // Descrizione:	trasforma il dato passato in valore numerico
  // Argomenti:
  //	valore - valore da trasformare
  //
  // Ritorna:		valore numerico
  ///////////////////////////////////////////
  function toVal(valore){
	if(valore=="" || valore==null )
		valore=0;
	else
		valore=eval(valore);
	return valore;
  }
  
  //////////////////////////////////////////
  // Nome:        fillCharLeft
  // Descrizione: inserisce "carattere" alla sinistra di "stringa" fino al riempimento di "len" caratteri
  // Argomenti:
  //	stringa   - stringa da fillare
  //	len       - lunghezza massima della stringa ritornata
  //	carattere - filler
  //
  // Ritorna:     stringa riempita a sinistra con il carattere in input
  //////////////////////////////////////////
	function fillCharLeft(stringa, len, carattere){
		var ret = "";
		var lunghezzaStringa = (stringa != null ? stringa.length : 0); 
		for(var i = 0; i < len - lunghezzaStringa; i++)
			ret += carattere;
		if (lunghezzaStringa > 0)
			ret += stringa;
		return ret.substring(0, len);
	}

  //////////////////////////////////////////
  // Nome:        fillCharRight
  // Descrizione: inserisce "carattere" alla destra di "stringa" fino al riempimento di "len" caratteri
  // Argomenti:
  //	stringa   - stringa da fillare
  //	len       - lunghezza massima della stringa ritornata
  //	carattere - filler
  //
  // Ritorna:     stringa riempita a destra con il carattere in input
  //////////////////////////////////////////
	function fillCharRight(stringa, len, carattere){
		var ret = "";
		var lunghezzaStringa = (stringa != null ? stringa.length : 0); 
		for(var i = 0; i < len - lunghezzaStringa; i++)
			ret += carattere;
		if (lunghezzaStringa > 0)
			ret = stringa + ret;
		return ret.substring(0, len);
	}
  
  //////////////////////////////////////////
  // Nome:        getValueCheckedRadio
  // Descrizione: estrae il valore del radio selezionato
  // Argomenti:
  //	radioName   - name del radiobutton
  //
  // Ritorna:     stringa vuota se il radio non esiste o non ha alcun 
  // valore selezionato, il valore del radio selezionato altrimenti
  //////////////////////////////////////////
	function getValueCheckedRadio(radioName) {
		if(!radioName)
			return "";
		var radioLength = radioName.length;
		if(radioLength == undefined)
			if(radioName.checked)
				return radioName.value;
			else
				return "";
		for(var i = 0; i < radioLength; i++) {
			if(radioName[i].checked) {
				return radioName[i].value;
			}
		}
		return "";
	}
  
  //////////////////////////////////////////
  // Nome:        openPopupGrafico
  // Descrizione: apre la popup ed esegue il submit del form predefinito 
  // (da inserire cmq nella pagina) per la generazione di un grafico
  // Argomenti:
  //	form   - nome del form usato per contenere i dati da inviare per la 
  //           creazione del grafico
  //  width  - larghezza della popup
  //  height - altezza della popup
  //////////////////////////////////////////
	function openPopupGrafico(form, width, height) {
 		var popUpLocal = openPopUpCustom("", "grafico", width, height, "yes", "yes");
		form.target = popUpLocal.name;
		form.submit();
	}
	
	
	
	//////////////////////////////////////////
	// Nome:        trovaVisualizzazioneAvanzata
	// Descrizione: utilizzata dalla checkbox, presente nella form di trova,
	// per abilitare/disabilitare la visualizzazione avanzata degli operatori
	// di trova
	// 
	//////////////////////////////////////////
	function trovaVisualizzazioneAvanzata() {
		var checkboxavanzate = document.getElementById("visualizzazioneAvanzata");
		var test = checkboxavanzate.checked;
		if (test == true) {
			trovaVisualizzazioneOperatori('visualizza');
		} else {
			trovaNuova();
		}
	}
	
	
	//////////////////////////////////////////
	// Nome:        trovaVisualizzazioneOperatori
	// Descrizione: gestisce la visualizzazione degli operatori
	// avanzati nella maschera di trova
	// Argomenti:
	//	vis - stringa ("visualizza" per visualizzare la colonna
	//                  degli operatori)
	//////////////////////////////////////////
	function trovaVisualizzazioneOperatori(vis) {
	
		var tablesricerca = [];
		
		var tables = document.getElementsByTagName('table');
		var ricercaclass = 'ricerca';
		var regularexp = new RegExp('\\b' + ricercaclass + '\\b');
		for (var i=0; i < tables.length; i++) {
			if (regularexp.test(tables[i].className)) {
				tablesricerca.push(tables[i]);
			}
		}
		
		if (tablesricerca.length > 0) {
			var rows = tablesricerca[0].getElementsByTagName('tr');			
		
			for (var row=0; row<rows.length; row++) {
				var cels = rows[row].getElementsByTagName('td');
				if (cels.length >=3) {
					if (vis == "visualizza") {
						cels[1].style.display='';
						cels[2].style.width=478;						
					} else {
						cels[1].style.display='none';
						cels[2].style.width=580;
					}
				}
			}
		}
	}
	
	// GESTIONE DELL'EVIDENZIAZIONE DI UNA RIGA IN UNA LISTA
	
	var arrayOfRolloverClasses = new Array();
	var activeRow = false;
	
	function addTableRolloverEffect(tableId,whichClass)	{
		arrayOfRolloverClasses[tableId] = whichClass;
		
		var tableObj = document.getElementById(tableId);
		var tBody = tableObj.getElementsByTagName('TBODY');
		var rows;
		if(tBody){
			rows = tBody[0].getElementsByTagName('TR');
		}else{
			rows = tableObj.getElementsByTagName('TR');
		}
		for(var no=0;no<rows.length;no++){
			rows[no].onmouseover = highlightTableRow;
			rows[no].onmouseout = resetRowStyle;
		}
	}

	function highlightTableRow() {
		var tableObj = this.parentNode;
		if(tableObj.tagName!='TABLE')tableObj = tableObj.parentNode;

		if(this!=activeRow){
			this.setAttribute('origCl',this.className);
			this.origCl = this.className;
		}
		if (this.className.indexOf('_Hilight2') > 0)
			this.className = arrayOfRolloverClasses[tableObj.id] + '_Hilight2';
		else if (this.className.indexOf('livello') >= 0)
			this.className = arrayOfRolloverClasses[tableObj.id] + '_livello';
		else
			this.className = arrayOfRolloverClasses[tableObj.id];
		
		activeRow = this;
	}
	
	function resetRowStyle() {
		var tableObj = this.parentNode;
		if(tableObj.tagName!='TABLE')tableObj = tableObj.parentNode;
		var origCl = this.getAttribute('origCl');
		if(!origCl) origCl = this.origCl;
		if(origCl) this.className=origCl;
	}

	function findTableDatiLista() {
		var tables = document.getElementsByTagName('table');
		var ricercaclass = 'datilista';
		var regularexp = new RegExp('\\b' + ricercaclass + '\\b');
		for (var i=0; i < tables.length; i++) {
			if (regularexp.test(tables[i].className)) {
				addTableRolloverEffect(tables[i].id,'tableRollOverEffect1');
			}
		}
	}
	
	//////////////////////////////////////////
	// Nome:        scadenzario
	// Descrizione: esegue la chiamata alla pagina per l'apertura della lista attivita' scadenzario
	// Argomenti:
	//	entita - nome entita su cui generare il calendario
	//  chiave - chiave del record da cui aprire lo scadenzario
	//	entitaPrincipaleModificabile - true se si parte da un'entita' modificabile, false altrimenti
	//  discriminante - discriminante sull'entita' per differenziare attivita'/eventi/modelli da proporre
	//////////////////////////////////////////
	function scadenzario(entita, chiave, entitaPrincipaleModificabile, discriminante){
		var href = contextPath + "/ApriPagina.do?href=gene/g_scadenz/g_scadenz-lista.jsp&entitaPartenza=" + entita + "&discriminante=" + discriminante + "&chiave=" + chiave;
		href+="&ScadenzarioModificabile=" + entitaPrincipaleModificabile;
		bloccaRichiesteServer();
		document.location.href = href;
	}

	//////////////////////////////////////////
	// Nome:        calendarioScadenzario
	// Descrizione: esegue la chiamata alla pagina del calendario scadenzario
	// Argomenti:
	//	entita - nome entita su cui generare il calendario; se piu' di una 
	//             separare le entita' con ";"
	//////////////////////////////////////////
	function calendarioScadenzario(entita) {
		bloccaRichiesteServer();
		document.location.href = contextPath + "/CalScadenzario.do?entita=" + entita;
	}

	function checkBrowser() {
		// default message
		var isBrowserSupportato = true;
		// get the user agent
		var user_agent = navigator.userAgent;

		// browser is internet explorer
		if (user_agent && user_agent.indexOf('MSIE') != -1) {

		// get the internet explorer version
		var regular_expression  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
		var internet_explorer_version = false;
		var rounded_internet_explorer_version = false;
		if (regular_expression.exec(user_agent) != null) {
		  internet_explorer_version = parseFloat( RegExp.$1 );
		  rounded_internet_explorer_version = parseInt(internet_explorer_version);
		} // if

		if (internet_explorer_version) {
		  // using IE10 in compatibility mode || using IE9 in compatibility mode || using IE8 in compatibility mode
		  if (
			((user_agent.indexOf('Trident/6.0') != -1) && (rounded_internet_explorer_version != 10)) ||
			((user_agent.indexOf('Trident/5.0') != -1) && (rounded_internet_explorer_version != 9))
		  ) {
			isBrowserSupportato = false;

		  // runing obsoletete internet explorer version
		  } else if (internet_explorer_version < 9.0) {
			isBrowserSupportato = false;
		  } // if
		} // if

		} else if (/Firefox[\/\s](\d+\.\d+)/.test(user_agent)) { //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
			var ffversion = new Number(RegExp.$1) // capture x.x portion and store as a number
			if (ffversion < 5) {
				isBrowserSupportato = false;
			}
		}

		// if we are using unsupported browser
		if (! isBrowserSupportato) {
			document.getElementById("browserSupportati").style.display = "";
		}
	}