	var marche;
	var spec;
	//trasforma una lista di valori separata da virgole in una tabella con un solo campo tName
	function splitList(list,fName) {
		var a;
		var table=new Array();
		table[0]=new Array(fName);
		table[1]=new Array("String");
		
		if (list!="") {
			a=list.split(',');
			for(i=0;i<a.length;i++) {
				table[i+2]=new Array(a[i]);
			}
		}
		return table
	}
	//dato un codice famiglia, popola di conseguenza sottofam, specialità e marche
	function selFam(codFam,preselSF,preselSp,preselM){
		var preSF="";
		var preSp="";
		var preM="";
		
		if (preselSF) preSF = preselSF;
		if (preselSp) preSp = preselSp;
		if (preselM) preM = preselM;
		//se seleziono 'tutte' ripopola tutto
		if (codFam=="*") {
			FillOptions(sf, listSottoCat,  "CODFAMIGLIA", "DESCRIZIONE", false,"", "CODSOTTOFAM");
			FillOptions(p, listSpec, "CODPRESTAZIONE", "DESCRIZIONE", false);
			FillOptions(m, listMarche, "CODICEMARCA", "DESCRIZIONE", false);
			return true;
		}
		var res = Where(sf,"CODFAMIGLIA","=",codFam);
		
		FillOptions(OrderBy( res , "DESCRIZIONE", "ASC" ), listSottoCat, "CODFAMIGLIA", "DESCRIZIONE", true, preSF, "CODSOTTOFAM");
		var r1=Where(fsp,"CODFAMIGLIA","=",codFam);
		res = Select(r1,"LISTA_SPEC")
		spec = splitList(res[2]+"","CODSPEC");
		var res1 = Select(InnerJoin(p,spec,"CODPRESTAZIONE","CODSPEC"),"CODPRESTAZIONE","DESCRIZIONE");
		FillOptions(OrderBy( res1 , "DESCRIZIONE", "ASC" ), listSpec, "CODPRESTAZIONE", "DESCRIZIONE", true, preSp);
		
		//res = jsSQL("SELECT LISTA_MARCHE FROM fm WHERE CODFAMIGLIA='" + codFam + "'")
		res = Select(Where(fm,"CODFAMIGLIA","=",codFam),"LISTA_MARCHE")
		marche = splitList(res[2]+"","CODMARCA");
		//res1 = jsSQL("SELECT CODICEMARCA,DESCRIZIONE FROM m INNER JOIN marche ON m.CODICEMARCA=marche.CODMARCA");
		res1 = Select(InnerJoin(m,marche,"CODICEMARCA","CODMARCA"),"CODICEMARCA","DESCRIZIONE");
		FillOptions(OrderBy( res1 , "DESCRIZIONE", "ASC" ), listMarche, "CODICEMARCA", "DESCRIZIONE", true, preM);
		
	}
	
	function selSottoFam(codFamiglia,codSottoFamiglia,preselSp,preselM){
		var preSp="";
		var preM="";
		if (preselSp) preSp = preselSp;
		if (preselM) preM = preselM;
		var codFam=codSottoFamiglia.substring(0,codSottoFamiglia.indexOf('_'));
		var codSottoFam=codSottoFamiglia.substring(codSottoFamiglia.indexOf('_')+1);
		if(codFam=='*')
			if (codFamiglia=='*')
				codFam="0";
			else
				codFam=codFamiglia;
		if(codSottoFam=='*') {
			selFam(codFamiglia);
			return true;
		}
		var tName = "P" + codFam;

		try{
			var a = eval(""+tName+"==null");
		} catch (Exception) {
			return false;
		}
		//var res = jsSQL("SELECT LISTA_SPEC FROM " + tName + " WHERE CODSOTTOFAM='" + codSottoFam + "'");
		var res=Select(Where(eval(tName),"CODSOTTOFAM","=",codSottoFam),"LISTA_SPEC");
		spec = splitList(res[2]+"","CODSPEC");
		
		//var res1 = jsSQL("SELECT CODPRESTAZIONE,DESCRIZIONE FROM p INNER JOIN spec ON p.CODPRESTAZIONE=spec.CODSPEC");
		var res1 = Select(InnerJoin(p,spec,"CODPRESTAZIONE","CODSPEC"),"CODPRESTAZIONE","DESCRIZIONE");
		FillOptions(OrderBy( res1 , "DESCRIZIONE", "ASC" ), listSpec, "CODPRESTAZIONE", "DESCRIZIONE", true,preSp);
		
		tName = "M" + codFam;
		//res = jsSQL("SELECT LISTA_MARCHE FROM " + tName + " WHERE CODSOTTOFAM='" + codSottoFam + "'");
		res = Select(Where(eval(tName),"CODSOTTOFAM","=",codSottoFam),"LISTA_MARCHE")
		marche = splitList(res[2]+"","CODMARCA");
		res1 = Select(InnerJoin(m,marche,"CODICEMARCA","CODMARCA"),"CODICEMARCA","DESCRIZIONE");
		FillOptions(OrderBy( res1 , "DESCRIZIONE", "ASC" ), listMarche, "CODICEMARCA", "DESCRIZIONE", true,preM);
	}
	
	function selSpecialita(codFamiglia,codSottoFamiglia,codSpec,preselM){
		var res;
		var res1;
		var foundTab=true;
		var preM="";
		if (preselM) preM = preselM;
		var codFam=codSottoFamiglia.substring(0,codSottoFamiglia.indexOf('_'));
		var codSottoFam=codSottoFamiglia.substring(codSottoFamiglia.indexOf('_')+1);
		if(codFam=='*')
			if (codFamiglia=='*')
				codFam="0";
			else
				codFam=codFamiglia;
		if(codSottoFam=='*') codSottoFam="0";
		//se la specialità selezionata è vuota richiama la selezione della sottofamiglia
		if(codSpec=='*'){
			if (codSottoFam!='0') selSottoFam(codFam,codSottoFamiglia);
			return true;
		}
		var tName = "T" + codFam + "_" + codSottoFam;
		try{
			var a = eval(""+tName+"==null");
		} catch (Exception) {
			foundTab=false;
		}
		var lm="";
		if (codSottoFam=='0') {
			//var sql="SELECT CODSOTTOFAM,CODFAMIGLIA FROM sf";
			var cs="";
			var cf="";
			var tn=""
			var all_sf = Select(Where(sf,"CODFAMIGLIA","=",codFam),"CODSOTTOFAM","CODFAMIGLIA");
			for (i=2;i<all_sf.length;i++){
				cs=all_sf[i][0]+"";
				cf=all_sf[i][1]+"";
				tn = "T" + cf + "_" + cs;
				try{
					a = eval(""+tn+"==null");
					//rs = jsSQL("SELECT LISTA_MARCHE FROM " + tn + " WHERE CODPRESTAZIONE='" + codSpec + "'");
					rs = Select(Where(eval(tn),"CODPRESTAZIONE","=",codSpec),"LISTA_MARCHE");
					if (rs[2]) lm+=rs[2]+"";
				} catch (Exception) {
					//se da errore skippa
				}
				
			}
		}
		if (foundTab){
			//res = jsSQL("SELECT LISTA_MARCHE FROM " + tName + " WHERE CODPRESTAZIONE='" + codSpec + "'");
			res = Select(Where(eval(tName),"CODPRESTAZIONE","=",codSpec),"LISTA_MARCHE");
			lm += res[2]+""
		}
		marche = splitList(lm,"CODMARCA");	
		//res1 = jsSQL("SELECT DISTINCT CODICEMARCA,DESCRIZIONE FROM m INNER JOIN marche ON m.CODICEMARCA=marche.CODMARCA");
		res1= Distinct(["CODICEMARCA","DESCRIZIONE"],Select(InnerJoin(m,marche,"CODICEMARCA","CODMARCA"),"CODICEMARCA","DESCRIZIONE"))
		FillOptions(OrderBy( res1 , "DESCRIZIONE", "ASC" ), listMarche, "CODICEMARCA", "DESCRIZIONE", true, preM);
	}