//
//
//              FILE FORM.JS 
//              VERSIONE 1.2.1  
//                      06/04/2005
//


function searchIn (selection,value) {
    for (var i = 0; i < selection.length; i++)
        if (selection.options[i].value == value) {
            selection.selectedIndex = i
            return true
        }
    return false;
}

function searchInMultiple (selection,value,state) {
	for (var i = 0; i < selection.length; i++)
		if (selection.options[i].value == value) {
			selection[i].selected = state;
			return true
		}
	return false;
}

// STORICAMENTE BUGGATA - FIXATA DA EZIO 2003
function isLiteral(s) {
    s = s.toLowerCase();
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (((c < "a") || (c > "z")) && (c != " ") && (c != ",") && (c != ".") && (c != s.charCodeAt("'")) && (c != "/") && (c != s.charCodeAt("(")) && (c != s.charCodeAt(")"))) return false;
    }
    return true
}

function isNumeric(s) { 
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((c < '0') || (c > '9')) {return false;}
    }
    return true
}

function isAlphaNum(s) {
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((!isLiteral(c)) && (!isNumeric(c))) return false;
    }
    return true
}

function isFloat(val) {
    for (var i = 0; i < val.length; i++) {
        var c = val.charAt(i);
        if ((!isNumeric(c)) && (c != ','))   return false
    } return true
}

function isMark(c) {
    if ((c != '\'') && (c != '\'') && (c != '?') && (c != '!') && (c != ';') && (c != ':') && (c != '-')) return false;
    return true; 
}

function isAccent(c) {
    if ((c != 'à') && (c != 'è') && (c != 'é') &&  (c != 'ì') && (c != 'ò') && (c != 'ù')) return false;
    return true;
}
function isText(s) {
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if ((!isAlphaNum(c)) && (!isMark(c)) && (!isAccent(c)) && (c.charCodeAt(0) != 13) && (c.charCodeAt(0) != 10)) return false;
    }
    return true
}
function isEmail(s) {
    if (s != '') {  
        var chiocciola,chiocciola2,punto;
        chiocciola = s.indexOf('@');
        chiocciola2 = s.lastIndexOf('@');
        punto = s.lastIndexOf('.'); 
        s = s.toLowerCase();
        if ((chiocciola < 2) || (chiocciola2 != chiocciola) || (punto < chiocciola+4) || (s.length-punto < 3)) 
            return false;
        for (var i = 0; i < s.length; i++) {
            var c = s.charAt(i);
            if ((!isAlphaNum(c)) && (c != '@') && (c != "_")) return false;
        }
        
    }
    return true;
}

function isCF(s) {
    if (s!= '') {   
        if (!sizeIs(s,16)) return false;        
        if (!isLiteral(s.substr(0,6))) return false;
        if (!isNumeric(s.substr(6,2))) return false;
        if (!isLiteral(s.charAt(8))) return false;
        if (!isNumeric(s.substr(9,2))) return false;
        if (!isLiteral(s.charAt(11))) return false;
        if (!isNumeric(s.substr(12,3))) return false;
        if (!isLiteral(s.charAt(15))) return false;     
    }
    return true;
}

// controlla la maggiore età ma è da approfondire - by ezio
function isMaggiorenne(s) {
    oggi = new Date();
    corrente = oggi.getFullYear();  
    anno = "19" + s.substr(6,2);
    if (corrente - anno >= 18) 
        return true;
    else
        return false;
}

function isPIVA(s) {
    if((!sizeIs(s,11)) || (!isNumeric(s))) return false;
    return true
}
    
function isTag(s) {
    var apriTag=0;
    if((apriTag = s.indexOf("<") > 0) && (s.lastIndexOf(">") > apriTag)) return false; return true
}

function sizeIs(s,n) {
    if (s.length == n) return true; return false
}

function sizeIsLessThan(s,n) {
    if (s.length < n) return true; return false
}

function isNull(s) {
    if (sizeIs(s,0)) return true; return false
}


function isGGMMAAAA(s) {
	if (minAge == null) var minAge = 0;
	if (!isNumeric(s) || (!sizeIs(s,8))) return false;
	var GG = s.substr(0,2);
	var MM = s.substr(2,2);
	var AAAA = s.substr(4,4);
	var lRitorno=false;

	if(MM=="00" || GG=="00" || AAAA=="0000") return false;

	if (MM=="11" || MM=="04" || MM=="06" || MM=="09") lRitorno=(GG<"31");
	else 
		if (MM=="02"){ 
		    lRitorno = (GG < "29")  ||  (GG=="29" && ((AAAA%4==0 && AAAA%100!=0) || (AAAA%400==0)) );
		}else{
			lRitorno = (MM<"13" && GG<"32");
		}
	return lRitorno;
}

function isGGMMAAAAbDay(s,minAge) {
// this function correctly checks DDMMYYYY birthdates for people older than minAge
    if (s != ''){   
        if (minAge == null) var minAge = 0;
        var AAAA = s.substr(4,4);
        var Now = new Date();
        if ((!isGGMMAAAA(s)) || (AAAA > Now.getYear()-minAge)) return false;
    }
    return true;

}

function searchInRadio (selection,value) {
    if (selection.length) {
        for (var i = 0; i < selection.length; i++)
            if (selection[i].value == value) {
                selection[i].checked = true;
                return true
            }
    }
    else {
        selection.checked = true;
    }
    return false;
}

function showErr (fieldName) {
    alert("Il campo '"+fieldName+"' contiene caratteri non validi!");
}
function thereAreClones(el)
{
    var varianti = el.length;
    var values = new Array();
    for (var i=0;i<varianti;i++) {
        values[i] = el[i].value;
        for (var j=0;j<i;j++)
            if ((values[i] == values[j]) && (values[j])) return true 
    }
    return false
}
function controllaValoreDecimale(value){
//Controlla che valore sia nel formato ##,## altrimenti ritorna false
    if ( value != "" && value != "0"){
        var arData=value.split(",");
        if (arData.length > 2 ) {
            return false;
        }               
        if (arData.length == 1 ){
            if (!isNumeric(arData[0])){
                return false;
            }
        }else{
            if (!isNumeric(arData[0]) || arData[0] == ""){
                return false;
            }
            if (!isNumeric(arData[1]) || arData[1] == ""){
                return false;
            }
        }
    }
    return true;
}

function controllaData(value){
//Controlla che la data sia nel formato GG/MM/YYYY altrimenti ritorna false
    if (value != "" ){
        var arData = value.split("/");
        if (arData.length != 3) {
            return false;
        }
        if (! isGGMMAAAA(arData[0]+arData[1]+arData[2])){
            return false;
        }
    }
    return true;
}

function controllaOra(value,sep){
//Controlla che l'ora sia nel formato HH:MM altrimenti ritorna false
    if (value != "" ){
        var arData = value.split(sep);
        if (arData.length != 2) {
            return false;
        }
        if (isNumeric(arData[0])){
            if ( parseInt(arData[0]) >= 0 && parseInt(arData[0]) <= 23){
                if (isNumeric(arData[1])){
                    if ( parseInt(arData[1]) >= 0 && parseInt(arData[1]) <= 59){
                        return true;
                    }
                }
            }
        }
    }
    return false;
}


/*******************************************************************************
Ritorna true se oraMin <= value <= oraMax altrimenti false.
                (Es. 10.00 <= 10:30 <= 11:00)
Ritorna false anche se le ore in input non sono corrette.
sep è il carattere separatore delle ore
POWERED by Ezio & Pino 2003
*******************************************************************************/
function inIntervalloOra(value,oraMin,oraMax,sep){
    if (controllaOra(value,sep) && controllaOra(oraMin,sep) && controllaOra(oraMax,sep)){
        oDataValue = new Date(2003,0,1,value.split(sep)[0],value.split(sep)[1]);
        oDataMIN = new Date(2003,0,1,oraMin.split(sep)[0],oraMin.split(sep)[1]);
        oDataMAX = new Date(2003,0,1,oraMax.split(sep)[0],oraMax.split(sep)[1]);
        
        var mllValue = oDataValue.getTime();
        var mllMIN = oDataMIN.getTime();
        var mllMAX = oDataMAX.getTime();

        if ((mllMIN <= mllValue) && (mllValue <= mllMAX)){
            return true
        }
    }
    return false;
}

/*******************************************************************************
dateDiff:
Restituisce un intero come numero di giorni, di mesi o di anni tra due date.
Chiamare la funzione con dataFine > dataInizio e impostare flag a 'g', 'm', o 'y'
a seconda del risultato richiesto. by Ezio & Pino 2003
********************************************************************************/
function dateDiff(dataFine,dataInizio,flag) {
    if ( (controllaData(dataFine)) && (controllaData(dataInizio)) ) {
        var arrDFine = dataFine.split("/");
        var arrDInizio = dataInizio.split("/");
        
        var oDataFine = new Date(arrDFine[2],arrDFine[1]-1,arrDFine[0]);
        var oDataInizio = new Date(arrDInizio[2],arrDInizio[1]-1,arrDInizio[0]);
                
        var minMilli = 1000 * 60;
        var oreMilli = minMilli * 60;
        var gioMilli = oreMilli * 24;   
        
        var tFine = oDataFine.getTime();
        var tInizio = oDataInizio.getTime();
        
        switch(flag) {
            case "g":               
                var result = (tFine-tInizio) / gioMilli;
                return (result);    
            case "m":
                mFine = oDataFine.getMonth()-1;
                mInizio = oDataInizio.getMonth()-1;
                aFine = oDataFine.getFullYear();
                aInizio = oDataInizio.getFullYear();                
                var cip = ((aFine-aInizio)-1)*12;
                var zap = 12 - mInizio;             
                var s = (zap + cip +    mFine);
                return (s);     
            case "y":
                var res = (oDataFine.getFullYear() - oDataInizio.getFullYear());
                return (res);
        }
    }
}
/*******************************************************************************
dateAdd:
Aggiunge un numero di giorni, mesi o anni ad una data e restituisce la data in 
formato stringa GG/MM/AAAA dopo l'operazione. by Ezio 06/05/2003 & Pino 2003
********************************************************************************/
function dateAdd(data,num,flag) {
    if (controllaData(data)) {
        var arrD = data.split("/");
        oData = new Date(arrD[2],arrD[1]-1,arrD[0]);
        var milli = oData.getTime();
                
        var minMilli = 1000 * 60;
        var oreMilli = minMilli * 60;
        var gioMilli = oreMilli * 24;       
        
        switch(flag) {
            case "g":
                var cip = gioMilli * (num);
                var zap = new Date(oData.setTime(cip+milli));
                nGG = zap.getDate();
                nMM = zap.getMonth()+1;
                if (nGG.toString().length < 2) {
                    nGG = "0" + nGG;
                }               
                if (nMM.toString().length < 2) {
                    nMM = "0" + nMM;
                }
                nYY = zap.getFullYear();
                var s = nGG + "/" + nMM + "/" + nYY;
                return (s);             
            case "m":
                var zap = new Date(oData.setMonth((oData.getMonth())+num));
                nGG = zap.getDate();
                nMM = zap.getMonth()+1;
                if (nGG.toString().length < 2) {
                    nGG = "0" + nGG;
                }               
                if (nMM.toString().length < 2) {
                    nMM = "0" + nMM;
                }
                nYY = zap.getFullYear();
                var p = nGG + "/" + nMM + "/" + nYY;
                return (p);             
            case "y":
                var zap = new Date(oData.setFullYear((oData.getFullYear())+num));
                nGG = zap.getDate();
                nMM = zap.getMonth()+1;
                if (nGG.toString().length < 2) {
                    nGG = "0" + nGG;
                }               
                if (nMM.toString().length < 2) {
                    nMM = "0" + nMM;
                }
                nYY = zap.getFullYear();
                var c = nGG + "/" + nMM + "/" + nYY;
                return (c);             
        }
        
    }
}

function controllaOraMinSec(value,sep){
//Controlla che l'ora sia nel formato HH:MM:SS altrimenti ritorna false
    if (value != "" ){
        var arData = value.split(sep);
        if (arData.length != 3) {
            return false;
        }
        if (isNumeric(arData[0])){
            if ( parseInt(arData[0]) >= 0 && parseInt(arData[0]) <= 23){
            if (isNumeric(arData[1])){
                    if ( parseInt(arData[1]) >= 0 && parseInt(arData[1]) <= 59){
                        if (isNumeric(arData[2])){
                            if ( parseInt(arData[2]) >= 0 && parseInt(arData[2]) <= 59){
                                return true;
                            }
                        }   
                    }
                }
            }
        }
    }
    return false;
}

function apici(testo,parola,sost) { 
    var nuovo = eval("testo.replace(/"+parola+"/,sost)");
    return (nuovo);
}

/*la funzione limita la lunghezza delle parole in un testo 
per evitare delle aniomalie grafiche provocate da parole troppo lunghe
(in italiano la lunghezza max di una parola è circa 27 lettere)
*/
function troncatesto(testo,lunghezza){
	var arrParole=testo.split(" ")
	var conta
	for (conta=0; conta < arrParole.length; conta++){
		if (arrParole[conta].length > lunghezza){
			alert("La parola " + arrParole[conta] + " è troppo lunga;\nla massima lunghezza accettabile è:" + lunghezza)  
			return false;
		}
	}
	return true;
}