/*
* Funzione che identifica il browser
*/


	var FIELD_SEPARATOR = "|";
	var controls_delete_message = "Eliminare le informazioni selezionate ?";

    var NS6 = "";
    var NS4 = "";
    var IE  = "";
    var ua = window.navigator.userAgent;
    var msie = ua.substring(0,ua.indexOf(" "));
    //*********** INTERNET EXPLORER ***************
    if ( msie == "Mozilla/4.0" ){
        var stringaBrowser    = ua.substring(ua.indexOf(";")+2);
        var explorer        = stringaBrowser.substring(0,stringaBrowser.indexOf(";"));
        var versione        = CLEANCHARACTER(" ",explorer.substring(stringaBrowser.indexOf(" ")));
        if ( versione < 4) {
            // INTERNET EXPLORER 3 o minore
        } else {
            NS6 = "";
            NS4 = "";
            IE  = "true";
        }
    //*********** NETSCAPE ***************
    } else {
        if ( msie == "Mozilla/5.0" ){
            NS6 = "true";
            NS4 = "";
            IE  = "";
        } else {
            NS6 = "";
            NS4 = "true";
            IE  = "";
        }
    }
    

// ------------------------------------------ FUNZIONI UTILIZZATE IN JSP ------------------------------------------------

function validateForm(myForm) {
    //pulisco il messaggio
    clearMessageBody();
    err = false;
    //verifica dei campi
    err = allFieldsOk(myForm);
    //se non ci sono errori sottometto la form
    if(!err) {
    	return true;
    } else {
        //mostro il messaggio
        showMessageBody();
        return false;
    }
}


/* ** INIZIO ***********************************************************************************
   ************************************* FUNZIONI DI CONTROLLO *********************************
   ********************************************************************************************* */

/*
* Il campo deve essere una data
*/
function DATE(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    return verificaInputData(value);
}

/*
* Il campo deve essere una data MAGGIORE DI OGGI
*/
function DATE_MAX_TODAY(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    if(value != "") {
       ret = verificaInputData(value);
       if(ret != 0) return ret;
       if(confrontaDate(value, sysDate()) != 1) return 39;
    }
    return(0);
}

/*
* Il campo deve essere una data MAGGIORE O UGUALE AD OGGI
*/
function DATE_EQUALS_OR_MAX_TODAY(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    if(value != "") {
       ret = verificaInputData(value);
       if(ret != 0) return ret;
       if(confrontaDate(value, sysDate()) == 2) return 38;
    }
    return(0);
}

/*
* Il campo deve essere una data MINORE DI OGGI
*/
function DATE_MIN_TODAY(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    if(value != "") {
       ret = verificaInputData(value);
       if(ret != 0) return ret;
       if(confrontaDate(value, sysDate()) != 2) return 35;
    }
    return(0);
}

/*
* Il campo deve essere una data MINORE O UGUALE AD OGGI
*/
function DATE_EQUALS_OR_MIN_TODAY(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    if(value != "") {
       ret = verificaInputData(value);
       if(ret != 0) return ret;
       if(confrontaDate(value, sysDate()) == 1) return 34;
    }
    return(0);
}


function MAILADDR(obb, num, value) {
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    // ind è l'indice della @
    var ind = -1;
    // se il browser è Netscape allora devo cercare l'occorrenza di "%40" invece della @
    var ind1 = value.indexOf("%40");
    var ind2 = value.indexOf("@");
    if(ind1!=-1){
         ind = ind1;
    }else if (ind2!=-1){
         ind = ind2;
    }
    if(ind != -1 ) { //c'è la "@"
        var prima = value.substring(0,ind);
        var dopo = value.substring(ind+1);
        if(prima == "%20" || prima.length < 1) return 18;
        if(dopo == "%20" || dopo.length < 1) return 19;
        if(value.length > num) return 8;
    }
    else {
        if(value != "") return 17; //il carattere @ è obbligatorio
    }
    return 0;
}

/*
* Il campo deve essere di un certo tipo
  Novembre 2002: se il campo non è obbligatorio ed è vuoto, sospendere i controlli
*/
function PWD(obb, minValue, maxValue, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
  //se non obbligatorio e vuoto tutto OK
    if(obb==false && value.length == 0) return 0;
    //non ci deve essere il "."
    if(value.indexOf(".") != -1) return 13;
    if(value.length < minValue || value.length > maxValue) return 9;
    if(isNaN(value)) { //c'e' almeno un carattere
        for(i=0; i<value.length; i++) {
            if(!isNaN(value.charAt(i))) return 0;
        }
    }
    //return 10;
    return 0;
}

/*
* controlla la partita IVA (11 numeri)
*/
function IVA(obb, value) {
    
    value = Trim(value);
    
    if(MANDATORY(obb, value) != 0) return 1;
    // sono ammessi solo valori numerici
    if(isNaN(value)) return 6;
    // la lunghezza deve essere esattamente 11
    if(value != "" && value.length != 11) return 14;
    return 0;
}


/*
* controlla che il campo sia testo
*/
function TEXT(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    // sono ammessi solo valori non numerici
    if(isNaN(value)) {
        //se trovo un numero
        trovato = 0;
        for(var i=0; i<value.length; i++) {
            if(!isNaN(value.charAt(i))) trovato = 1;
        }
    }
    if(trovato == 1) return 41;
    return 0;
}

/*
* Verifica se il campo è di lunghezza pari ad un valore specificato
*/
function TEXTVALUE(obb, num, value) {
  
     value = Trim(value);

    
    if(MANDATORY(obb, value) != 0) return 1;
    if(value.length != 0 && value.length != num) return 11;
    return 0;
}


/*
* Valore decimale nel formato ORACLE NUMBER(n,d)
* Modificato da DF il 12/Mar/04
*/
function DECIMAL(obb, n, d, value) {
    value = unescape(value);
    
    // trim che funziona
    re=/\s+$|^\s+/g;
    value = value.replace(re,"");
    
    value = Trim(value);
    
    if(MANDATORY(obb, value) != 0) return 1;

    // Toglie i separatori di migliaia
    value = value.replace(/\$|\./g,'');
    
    var ind = value.indexOf(",");
    
    if(ind != -1) { //c'e' il separatore decimale
        var ii = value.substring(0,ind);
        var dd = value.substring(ind+1);
        if(isNaN(ii)) return 6; //Il campo accetta solo Numeri
        if(isNaN(dd)) return 6; //Il campo accetta solo Numeri

        if(ii.length > n) {
            return 21; // massimo nr digit parte intera superata
        }
        if (dd.length > d) {
            return 22; //massimo nr digit parte decimale superata
        }
    }
    else { //non c'e' il separatore decimale
        if(isNaN(value))  return 6; //Il campo accetta solo Numeri
        if(value.length > n) return 21; // massimo nr digit parte intera superata
    }
    return 0;
}

function PERCENT(obb, value) {
    
    
    value = Trim(value);
        
    
    if(MANDATORY(obb, value) != 0) return 1;
    
    value = unescape(value);
    var ind = value.indexOf(",");

    if(ind != -1) { //c'è il ","
        var ii = value.substring(0,ind);
        var dd = value.substring(ind+1);
        if(isNaN(ii)) return 6; //Il campo accetta solo Numeri
        if(isNaN(dd)) return 6; //Il campo accetta solo Numeri
        if(ii.length > 2 && dd.length > 0 && parseInt(dd, 10) > 0) {
            return 21; // massimo nr digit parte intera superata
        }
        if (parseFloat(ii) > 100) {
            return 23; // massimo valore 100
        }
        if (dd.length > 2) {
            return 22; //massimo nr digit parte decimale superata
        }
    }
    else { //non c'è il ","
        if(isNaN(value))  return 6; //Il campo accetta solo Numeri
        if(value.length > 3) return 21; // massimo nr digit parte intera superata
        if(parseFloat(value) > 100) {
            return 23; // massimo valore 100
        }
    }
    return 0;
}

function MAIL(obb, value) {
    value = Trim(value);
    
    if(MANDATORY(obb, value) != 0) return 1;
	var reEmail = /^.+\@.+\..+$/

     if(reEmail.test(value)) 
     	return 0;
     else 
     	return 40;
}
    
/*
* Il codice fiscale deve essere di 16 caratteri
*/
function CF(obb, value) {
    value = unescape(value);
    
    // trim che funziona
    re=/\s+$|^\s+/g;
    value = value.replace(re,"");
    
    value = Trim(value);
    
    if(MANDATORY(obb, value) != 0) return 1;

    // la lunghezza deve essere esattamente 16
    if(value != "") { 
        if (value.length != 16) return 9;
        if (!isCodiceFiscale(value))
            return 500;
        else
        	return 0;    
    }
    return 0;
}



function NOCONTROL(obb, value) {
    if(MANDATORY(obb, value) != 0) return 1;
    return 0;
}


/*
* Verifica l'obbligatorietà del campo
*/
function MANDATORY(obb, value) {
    if(obb) return NOTNULL(value);
    return 0;
}

/*
* Il campo deve essere obbligatorio
*/
function MAXLEN(obb, num, value) {
    
    
    value = Trim(value);
    
    
    if(MANDATORY(obb, value) != 0) return 1;

    // Assicura che i caratteri non siano stati sostituiti con le
    // relative rappresentazioni escaped
    // es. escape(" ") == "%20" ha una lunghezza di 3 caratteri anziche' 1
    unescapedValue = unescape(value);
    if(unescapedValue.length > num && num==4000)
        return 4000;
    if(unescapedValue.length > num) {
        return 8;
    }
    return 0;
}

/* ** FINE ***********************************************************************************
   ************************************* FUNZIONI DI CONTROLLO *********************************
   ********************************************************************************************* */


/* *************************************** FUNZIONI PRIVATE ****************************** */
// ------------------------------------------ GESTIONE MESSAGGI DI ERRORE ------------------------------------------------
var controls_message_body = "";
var SEPARATORE = "@_|"
var WIDTH_COMBO = 350;
var SIZE_COMBO = 5;

/*
* Ritorna la stringa del messaggio relativa ad un certo codice
*/
function getErrorMessage(errorCode){
    var numMaxMsg = 10000;
    var arrayMessages = new Array(numMaxMsg);

    arrayMessages[0] = "Tutto bene";
    arrayMessages[1] = "Campo obbligatorio";
    arrayMessages[2] = "Data non valida. Formato data: gg/mm/aaaa";
    arrayMessages[3] = "Caratteri della data non validi";
    arrayMessages[4] = "Giorno o mese della data non validi";
    arrayMessages[5] = "Anno non bisestile";
    arrayMessages[6] = "Valore non numerico";
    arrayMessages[7] = "I caratteri apice ' o doppio apice \" non sono ammessi";
    arrayMessages[8] = "Numero di caratteri superiore alla lunghezza consentita";
    arrayMessages[9] = "Lunghezza errata";
    arrayMessages[10] = "Inserire almeno una cifra";
    arrayMessages[11] = "Numero di cifre errato";
    arrayMessages[12] = "Numero troppo grande";
    arrayMessages[13] = "Il punto non è ammesso";
    arrayMessages[14] = "Inserire 11 cifre";
    arrayMessages[15] = "Non è possibile digitare il carattere % nei campi di ricerca";
    arrayMessages[16] = "Numero non positivo";
    arrayMessages[17] = "Il carattere @ è obbligatorio";
    arrayMessages[18] = "Inserire almeno un carattere prima di @";
    arrayMessages[19] = "Inserire almeno un carattere dopo di @";
    arrayMessages[20] = "Il primo carattere non puo' essere uno spazio";

    arrayMessages[21] = "Superato il numero massimo di cifre intere";
    arrayMessages[22] = "Superato il numero massimo di cifre decimali";
    arrayMessages[23] = "La percentuale non puo' avere un valore maggiore di 100";


    arrayMessages[24] = "Numero con tutti zeri non valido";
    arrayMessages[25] = "Valore non nell'intervallo";
    arrayMessages[26] = "Lunghezza errata, eventuali zeri iniziali vengono ignorati";
    
    arrayMessages[40] = "Formato email non valido";
    arrayMessages[41] = "Carattere non ammesso";
 
    arrayMessages[500] = "Codice Fiscale non valido";

    arrayMessages[4000]    = "Lunghezza massima consentita 4000 caratteri"; //Controllo della descrizione
    if ( isNaN(errorCode) )
        return("javascript:getErrorMessage: codice messaggio non numerico. ");
    if ( errorCode >= arrayMessages.length )
        return("javascript:getErrorMessage: messaggio non trovato. ");
    return arrayMessages[errorCode];
}

/*
* Svuta la stringa del messaggio
*/
function clearMessageBody() {
    controls_message_body = "";
    return;
}

/*
* Svuta la stringa del messaggio
*/
function getMessageBody() {
    return controls_message_body;
}

/*
* Mostra il messaggio
*/
function showMessageBody() {
    if(controls_message_body != "")
        alert(controls_message_body);
    return;
}

/*
* Aggiunge un messaggio alla stringa di messaggio
*/
function pushMessageBody(messageLine){
    controls_message_body += messageLine;
    controls_message_body += "\r\n";
    //return true;
}



// ------------------------------------------ FUNZIONI DI DECODIFICA ------------------------------------------------
/**
* Esegue la decodifica del nome della funzione.
*/

function decodeFunction( myName ){
    ind1 = myName.indexOf(FIELD_SEPARATOR);
    if(ind1 != -1)
        return myName.substring(0, ind1);
    return "";
}

/**
* Esegue la decodifica della label del campo.
*/
function decodeFieldDescription( myName ){
    ind1 = myName.indexOf(FIELD_SEPARATOR);
    if(ind1 != -1)
        return myName.substring(ind1+1);
    return "";
}

// ------------------------------------------ FUNZIONI DI VERIFICA ------------------------------------------------
/**
* Esegue la funzione di verifica myFunctionName col valore myFieldValue.
*/
function execCheck( myFunctionName, field){
    if(myFunctionName == "") return 0;
    //elimino i " dal campo
    reDouble = /"+/;
    var strValue;

    //elimino il ' dal campo
    //reSingle = /'+/;
    //if(strValue != null) strValue = strValue.replace(reSingle, "''");
    if(field.type=="select-one" || field.type=="select-multiple"){
        ind=field.selectedIndex;
        if (ind==-1)
            strValue=null;
        else
            strValue=field.options[ind].value;
        if(strValue==null)strValue="";
    } else {
        strValue = field.value;
        if(strValue != null) strValue = strValue.replace(reDouble, "");
        field.value = strValue;
    }

    //assegno il nuovo valore al campo
    //if(strValue==null)strValue="";

    //codifico i caratteri speciali
    strValue=escape(strValue);

    var myStatement = "result = " + myFunctionName.substring(0, myFunctionName.indexOf(")"));
    myStatement = myStatement + ",\"" + strValue + "\");";
	var res=eval(myStatement);
    return res;
}



/**
* Controlla tutti i campi di una form richiamando le opportune funzioni di verifica.
* Il nome di una funzione di verifica lo ricava dal nome del campo secondo la seguente sintassi:
* <nome campo>"_"<nome funzione controllo>"_"<label del campo>
*/
function allFieldsOk(myForm) {
    var i;    
    var errorMsg = false;
    var errorCode = 0;
    var errorMessage="";
    var functionName;
    var fieldName;
    var fieldDescription;
    
	var elements = document.getElementsByTagName('input');
	for (var i = 0; i < elements.length; i++) {
		if (elements.item(i).type != "hidden" && elements.item(i).getAttribute('validator')!=null) {
			var validator = elements.item(i).getAttribute('validator');
			fieldName = elements.item(i).getAttribute('name');		
			functionName = decodeFunction( validator );	
			fieldDescription = decodeFieldDescription( validator );
			
			/*alert('validator='+validator+
			      ', fieldName='+fieldName+
			      ', fieldDescription='+fieldDescription+
			      ', functionName='+functionName
					);*/
			errorCode = execCheck(functionName, elements.item(i))
            if (errorCode != 0 ) {
                //devo aggiungere il messaggio di errore
                pushMessageBody("'" + fieldDescription + "': " + getErrorMessage(errorCode));
                errorMsg = true;
            }
		}
	}
	elements = document.getElementsByTagName('select');
	for (var i = 0; i < elements.length; i++) {
		if (elements.item(i).type != "hidden" && elements.item(i).getAttribute('validator')!=null) {
			var validator = elements.item(i).getAttribute('validator');
			fieldName = elements.item(i).getAttribute('name');		
			functionName = decodeFunction( validator );	
			fieldDescription = decodeFieldDescription( validator );
			
			/*alert('validator='+validator+
			      ', fieldName='+fieldName+
			      ', fieldDescription='+fieldDescription+
			      ', functionName='+functionName
					);*/
			errorCode = execCheck(functionName, elements.item(i))
            if (errorCode != 0 ) {
                //devo aggiungere il messaggio di errore
                pushMessageBody("'" + fieldDescription + "': " + getErrorMessage(errorCode));
                errorMsg = true;
            }
		}
	}

	elements = document.getElementsByTagName('textarea');
	for (var i = 0; i < elements.length; i++) {
		if (elements.item(i).type != "hidden" && elements.item(i).getAttribute('validator')!=null) {
			var validator = elements.item(i).getAttribute('validator');
			fieldName = elements.item(i).getAttribute('name');		
			functionName = decodeFunction( validator );	
			fieldDescription = decodeFieldDescription( validator );
			
			/*alert('validator='+validator+
			      ', fieldName='+fieldName+
			      ', fieldDescription='+fieldDescription+
			      ', functionName='+functionName
					);*/
			errorCode = execCheck(functionName, elements.item(i))
            if (errorCode != 0 ) {
                //devo aggiungere il messaggio di errore
                pushMessageBody("'" + fieldDescription + "': " + getErrorMessage(errorCode));
                errorMsg = true;
            }
		}
	}

    return errorMsg;
}



// ------------------------------ ALTRE FUNZIONI INTERNE DI UTILITA' -----------------
function isCodiceFiscale(value)
{
	var nTempNum;
	var nAppoNum;
	var i;
	var szTempCodFisc;
	var szLastChar;
	var szValued;
	var szInValued;

	szCodFisc = value;
	
	if (szCodFisc.length<16) return false
	if (szCodFisc == "") return false;
	else {
		szCodFisc =szCodFisc.toUpperCase();
		szLastChar = szCodFisc.substr(szCodFisc.length - 1,1);
		szTempCodFisc =szCodFisc.substr(0,szCodFisc.length - 1);
		nTempNum = 0;
		i = 0;

		while (true) {
			szValued="B1A0KKPPLLC2QQD3RRE4VVOOSSF5TTG6UUH7MMI8NNJ9WWZZYYXX";
			// I DISPARI
			szInValued=szTempCodFisc.substr(i,1);
			nAppoNum = szValued.search(szInValued);
			nTempNum = nTempNum + (nAppoNum &  0x7FFE) / 2;
			i = i + 1;
			if (i>15)
				break;
			szValued="A0B1C2D3E4F5G6H7I8J9KKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ";
			// I PARI
			szInValued=szTempCodFisc.substr(i,1);
			nAppoNum = szValued.search(szInValued);
			nTempNum =  nTempNum + (nAppoNum &  0x7FFE) / 2;
			i = i + 1;
		}
		nTempNum = nTempNum % 26; //mod
		szValued="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		szValued= szValued.substr(nTempNum, 1);
		if (szValued==szLastChar) 
			return true;
		else 
			return false;
	}
}

function NOTNULL(value) {
    re = /^\s+/g;
    var app = value.replace(re, "");
    if (app == "") return 1;
    return 0;
}
    
    