/**
 * @author Andrea Bruglia, Davide Stefanini
 */
function controllaCfisc(cf, no_provvisori){
	no_provvisori = no_provvisori || false;
	cf = cf.replace(/ /g, '');
    var validi, i, s, set1, set2, setpari, setdisp;
    if (cf == '')
        return 'Campo obbligatorio';
    cf = cf.toUpperCase();
    if (cf.length == 11) {
		if (no_provvisori) {
			return "Codice fiscale non valido";
		} else {
			var provvisori = '0123456789';
			if (provvisori.indexOf(cf.charAt(i)) == -1) {
				return "Il codice fiscale provvisorio contiene un carattere non valido. I caratteri validi per il codice fiscale provvisorio sono solamente le cifre."
			}
	        return true //codice fiscale provvisorio
        }
    }
    if (cf.length != 16)
        return "La lunghezza del codice fiscale non "+UNI_E+" corretta: il codice fiscale dovrebbe essere lungo esattamente 16 caratteri.";
    if (!Ext.form.VTypes.alphanum(cf)) 
        return "Il codice fiscale contiene un carattere non valido. I caratteri validi sono le lettere e le cifre.";
    set1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    set2 = "ABCDEFGHIJABCDEFGHIJKLMNOPQRSTUVWXYZ";
    setpari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    setdisp = "BAKPLCQDREVOSFTGUHMINJWZYX";
    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 "Il codice fiscale non "+UNI_E+" corretto: il codice di controllo non corrisponde.";
	return true;
}

function controllaPIVA(pi){
	if( pi == '' )  return 'Campo obbligatorio';
    if( pi.length != 11 )
		return "La lunghezza della partita IVA non "+UNI_E+"\n" +
				"corretta: la partita IVA dovrebbe essere lunga\n" +
				"esattamente 11 caratteri.\n";
     
	var validi = "0123456789";
	
	if (pi == '00000000000') return "La partita IVA non è valida";
	
    for( i = 0; i < 11; i++ ){
     	if( validi.indexOf( pi.charAt(i) ) == -1 )
			return "La partita IVA contiene un carattere non valido `" +
					pi.charAt(i) + "'.\nI caratteri validi sono le cifre.\n";
	}
	s = 0;
	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;
	}
	if( ( 10 - s%10 )%10 != pi.charCodeAt(10) - '0'.charCodeAt(0) )
		return "La partita IVA non è valida:\n" +
				"il codice di controllo non corrisponde.\n";
	return true;
}

function controllaCfiscPIVA(val){
	var is_piva = controllaPIVA(val);
	if (typeof(is_piva) == 'boolean') {
		return true;
	}
	var is_cfisc = controllaCfisc(val, true);
	if (typeof(is_cfisc) == 'boolean') {
		return true;
	}
	return "Il codice non risulta essere un codice fiscale o una partita IVA validi";
}

function controllaCfiscFamilia(cf){
	var message = controllaCfisc(cf);
	if ( message === true ){
		if (cf != dichiarazione.getCurrentCfisc()){
			return true
		}else{
			return "Il codice fiscale inserito "+UNI_E+" uguale a quello del dichiarante";
		}
	} else {
		return message;
	}
}

function validaCfisc(field){
    var cfisc = field.getValue().replace(/ /g, '').toUpperCase();
	field.setRawValue(cfisc);
    if (cfisc == '')
        return 'Campo obbligatorio';
	    var codici_mesi = {
	        'A': '01',
	        'B': '02',
	        'C': '03',
	        'D': '04',
	        'E': '05',
	        'H': '06',
	        'L': '07',
	        'M': '08',
	        'P': '09',
	        'R': '10',
	        'S': '11',
	        'T': '12'
	    }
	    var cognome = cfisc.substr(0, 3);
	    var nome = cfisc.substr(3, 3);
	    var anno = getAnnoFromCfisc(cfisc, true);
	    var mese = codici_mesi[cfisc.substr(8, 1)];
	    var giorno = getGiornoFromCfisc(cfisc);
	    var codice_comune = getComuneFromCfisc(cfisc);//cfisc.substr(11, 4);
	    
	    var sesso = 'M';
	    if (giorno > 40) {
	        sesso = 'F';
	        giorno -= 40;
	    }
	    var comune = cercaComune(codice_comune,0);
		if (!comune) comune = cercaComune(codice_comune,1);
		this.sesso.setValue(sesso);
		if (this.sesso.isVisible()) this.sesso.setRawValue(sesso);
		this.comune_nascita.setValue(comune[2]);
		this.prov_nascita.setValue(comune[6]);
	    this.data_nascita.setValue(((sesso == 'F' && giorno<10)?'0':'')+giorno + '/' + mese + '/' + anno);
	//}
}

/**
 * Ritorna la data di nascita passatogli un cfisc
 * @param {Object} cfisc
 */
function getDataNascita(cfisc){
	var codici_mesi = {
        'A': '01',
        'B': '02',
        'C': '03',
        'D': '04',
        'E': '05',
        'H': '06',
        'L': '07',
        'M': '08',
        'P': '09',
        'R': '10',
        'S': '11',
        'T': '12'
    }
    var anno = getAnnoFromCfisc(cfisc);
    var mese = codici_mesi[cfisc.substr(8, 1)];
    var giorno = parseInt(getGiornoFromCfisc(cfisc),10);
	if (giorno > 40){
		giorno = giorno - 40;
	}
	return integerDigit(giorno,2) + '/' + mese + '/' + anno;
}

/*function checkCfisc(callback) {
	var field = this.cfisc;
	if (session.isOnline){
		if (field.isValid()) {
			var value = field.getValue();
			var sql = getQuery(CHECK_CFISC, [value, value]);
			Ext.Ajax.request({
		        url: JSONDATAURL,
		        params: {
		            s: sql,
		            db: session.userDb
		        },
		        scriptTag: true, // Use script tag transport
		        success: function(response){
					var responseObj = Ext.util.JSON.decode(response.responseText)
					if (responseObj.totalRows > 0) {
						field.markInvalid('Dichiarazione gi'+UNI_A+' presente');
						//this.bottoneControlloCfisc.setIconClass('x-btn-checkcfisc-invalid');
					} else {
						if (this.coniuge) {
							dichiarazione.congiunta_cfisc = value;
							dichiarazione.lock(session.userLogged, callback, true)
						} else {
							dichiarazione.cfisc = value;
							dichiarazione.lock(session.userLogged, callback)
						}
						field.disable();
					}
		        },
		        failure: function(){
					Toast("Errore", "Errore nel controllo del codice fiscale");
		        },
				scope: this
			});
		}
	} else {
		if (field.isValid()) {
			value = field.getValue();
			var rec = conn.query(getQuery(SEL_LOCAL_ANAG,[value]))
			if (rec.totalRows > 0){
				field.markInvalid('Dichiarazione gi'+UNI_A+' presente');
			}else{
				if (this.coniuge) {
					dichiarazione.congiunta_cfisc = value;
				} else {
					dichiarazione.cfisc = value;
				}
				field.disable();
				callback();
			}
		}
		
	}
}*/

function validaCcfisc(field){
	var value = field.getValue();
	var st = parseInt(this.stato_civile.getValue());
	this.fields.fireEvent('congiunta', st);
	/*if (!Ext.isEmpty(value)) {
		
		switch(st) {
			case 2:
				this.fireEvent('coniuge');
				break;
			case 6:
			case 7:
				this.fireEvent('tutore');
				break;
		}
	} else {
		this.fireEvent('noncongiunto');
	}*/
}

function controllaNomeFn(cfiscField) {
	var fn = function(val){
	    val = val.toUpperCase();
	    if (!Ext.isEmpty(cfiscField) && cfiscField.isValid()) {
	        var nome = cfiscField.getValue().substr(3, 3);
	        var code = generaCfisc(val, true);
	        return (code == nome) ? true : 'Il nome non risulta essere conforme al codice fiscale inserito';
	    }
	    return true;
	}
	return fn;
}

function controllaCognomeFn(cfiscField) {
	var fn = function controllaCognome(val){
	    val = val.toUpperCase();
	    if (!Ext.isEmpty(cfiscField) && cfiscField.isValid()) {
	        var cognome = cfiscField.getValue().substr(0, 3);
	        var code = generaCfisc(val);
	        return (code == cognome) ? true : 'Il cognome non risulta essere conforme al codice fiscale inserito';
	    }
		return true;
	}
	return fn;
}

function controllaNome(val){
    val = val.toUpperCase();
    //var fields = this.findParentByType(Ext.ux.Namirial.form.Anagrafica);
    var cfisc = this.cfisc;
    if (!Ext.isEmpty(cfisc) && cfisc.isValid()) {
        var nome = cfisc.getValue().substr(3, 3);
        var code = generaCfisc(val, true);
        return (code == nome) ? true : 'Il nome non risulta essere conforme al codice fiscale inserito';
    }
    return true;
}

function controllaCognome(val){
    val = val.toUpperCase();
    //var fields = this.findParentByType(Ext.ux.Namirial.form.Anagrafica);
    var cfisc = this.cfisc;
    if (!Ext.isEmpty(cfisc) && cfisc.isValid()) {
        var cognome = cfisc.getValue().substr(0, 3);
        var code = generaCfisc(val);
        return (code == cognome) ? true : 'Il cognome non risulta essere conforme al codice fiscale inserito';
    }
	return true;
}

function controllaComuniDomicilio(val){
	var com1 = this.comune_dom1.getValue();
	var com2 = this.comune_2000.getValue();
	var com3 = this.comune_dom2.getValue();
	if (com1 == com2 && com2 == com3 && com1 == com3) {
		/*this.comune_dom1.markInvalid("Indicare un diverso comune in almeno uno dei tre domicili");
		this.comune_2000.markInvalid("Indicare un diverso comune in almeno uno dei tre domicili");
		this.comune_dom2.markInvalid("Indicare un diverso comune in almeno uno dei tre domicili");*/
		return "Indicare un diverso comune in almeno uno dei tre domicili";
	} else {
		/*this.comune_dom1.clearInvalid();
		this.comune_2000.clearInvalid();
		this.comune_dom2.clearInvalid();*/
		return true;
	}
}

/**
 * Genera il codice di 3 caratteri relativo a nome o cognome per il codice fiscale
 * @param {String} val Stringa da codificare
 */
function generaCfisc(val, nome){
    nome = nome || false
    //debugger;
    var code = "";
    var cons = GetConsonanti(val);
    if (cons.length > 3) {
        if (nome) 
            code = cons.charAt(0) + cons.charAt(2) + cons.charAt(3);
        else 
            code = cons.substring(0, 3);
    }
    else 
        if (cons.length == 3)
            code = cons;
        else {
            code = cons + GetVocali(val).substring(0, 3 - cons.length);
            if (code.length < 3) 
                for (i = code.length; i < 3; i++) 
                    code += "X";
        }
    return code;
}

function GetConsonanti(stringa){
    var consonanti = 'BCDFGHJKLMNPQRSTVWXYZ';
    var cns = "";
    for (i = 0; i < stringa.length; i++) 
        if (consonanti.indexOf(stringa.charAt(i)) != -1) 
            cns += stringa.charAt(i);
    return cns.toUpperCase();
}

function GetVocali(stringa){
    var vocali = 'AEIOU';
    var voc = "";
    for (i = 0; i < stringa.length; i++) 
        if (vocali.indexOf(stringa.charAt(i)) != -1) 
            voc += stringa.charAt(i);
    return voc.toUpperCase();
}

function setCheckbox(val){
	try {
    	this.setValue((val == 'X'));
		return true;
	} catch(e) {
		return false;
	}
}

function convertCheckbox(o, val){
	(val) ? this.setValue('X') : this.setValue('');
}

function controllaSesso(val){
    val = val.toUpperCase();
    if (val == 'M' || val == 'F') 
        return true;
    return 'Valore non ammesso';
}

function controllaNumMesi(val){
	if (val <= 12) return true	
	else return 'Valore troppo elevato'
}

function controlloDisabile(val){
	if (val.toUpperCase() == 'D') return true
	else return 'Valore non ammesso<br>Indicare "D" se si tratta di un figlio portatore di handicap.'
}

function controlloPercentuale(val){
	if (parseFloat(val) <= 100) return true;
	else return 'Il valore inserito non pu&ograve; essere superiore a 100'	
}

function controlloValPercentuale(val){
	if ((parseFloat(val) == 0)||(parseFloat(val) == 50)||(parseFloat(val) == 100)) return true;
	else return 'Il valori ammessi sono 0-50-100'	
}

function controlloNumGiorni(val){
	if (val <= 365) return true;
	else return 'Il valore inserito non pu&ograve; essere superiore a 365';	
}

function controllaDate(data1,data2){
	if (data1 > data2) return 'La data di inizio non pu&ograve; essere posteriore a quella di fine';
	if (data1 = data2) return 'Le date non possono coincidere';
	if (data1 < data2) return true;
}

function controllaStatoCivile(field) {
	if (!Ext.isEmpty(this.coniuge_cfisc.getValue()))
		this.stato_civile.disable();
}


function controllaPrimiFigli(){
	
	var returnValue = true;
	var TOT_MESI_A_CARICO = 0;
  	var TOT_MESI_A_CARICO_3ANNI = 0;
	this.store_famiglie.each(function(record){
		
		var F3 = record.get('F3') == " " ? 0 : record.get('F3');
		var F3_3ANNI = record.get('F3_3ANNI') == " " ? 0 : record.get('F3_3ANNI');
		TOT_MESI_A_CARICO = TOT_MESI_A_CARICO + parseInt(F3);
		TOT_MESI_A_CARICO_3ANNI = TOT_MESI_A_CARICO_3ANNI + parseInt(F3_3ANNI); 
		
	}, this);
	
	if (TOT_MESI_A_CARICO > 12) {
		returnValue = false;
	}	
	if (TOT_MESI_A_CARICO_3ANNI > 12){
		returnValue = false;
	} 
	return returnValue;
}

function filtraCAF(current){
	return (current.get('CAF') == '');
}

function controlla5x1000Anomalia(value) {
	var modo = this.cinque_per_mille_modo.getValue();
	if (modo == 2 && (value != 0 && value != 3 && value != 4)) {
		return "Se la modalit"+UNI_A+" "+UNI_E+" uguale a 2, l'anomalia pu"+UNI_O+" assumere solo i valori 0, 3, 4";
	} else {
		return true;
	}
}

function controllaComune(value) {
	if (cercaComune(value, 2, this.filter)) return true;
	else return "Comune inesistente";
}

function controllaComuneAtti(value) {
	var ok = controllaComune.call(this.lookupComuniAtti, value);
	if (ok === true) {
		if (this.comune_residenza.getValue() != value) {
			return "Il comune per la notifica degli atti deve essere lo stesso indicato nella residenza"
		} else {
			return true;
		}
	} else {
		return ok;
	}
}

