codice:
document.writeln("<table class=bordoTabellaTest border=0 cellpadding=0 cellspacing=1 width=100%>");
document.writeln("	<tr>");
document.writeln("		<td class=body valign=top>");
document.writeln("			<input type=text name='campoA0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;' maxlength=30 size=30>");
document.writeln("			<input type=text name='campoB0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;' maxlength=30 size=30>");
document.writeln("			<input type=text name='campoC0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;' maxlength=30 size=30>");
document.writeln("			<select name='campoD0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;'><OPTION value=1>Uno<OPTION VALUE=2>Due</SELECT>");
document.writeln("			<input type=text name='campoE0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;molt0(this.form);' maxlength=30 size=5>");
document.writeln("			<input type=text name='campoF0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;molt0(this.form);' maxlength=30 size=5>");
document.writeln("			<input type=text name='campoG0' onFocus='mustMoveFocus=true;currPos=0;' onBlur='mustMoveFocus=false;' maxlength=30 size=5>");
document.writeln("			<input type=button onClick='deleteLine(0);' value='Cancella'>");
document.writeln("			<div id=divDescription1></div></td>");
document.writeln("		</td>");
document.writeln("	</tr>");
document.writeln("</table>");
document.writeln("Usando 'freccia su' o 'freccia giù' puoi muoverti fra le varie righe.
");

document.onkeyup = keyUp;

var html='';
var mustMoveFocus=false;
var currPos=0;
var numLine=0; //numero di linee presenti (0 vuol dire che esiste sono la linea iniziale)

function setFormName(testForm){
	formName=testForm;
}

function molt0(f) { 
c1=parseFloat("0"+f.campoE0.value); 
c2=parseFloat("0"+f.campoF0.value); 
f.campoG0.value=c1*c2; 
} 

function molt(f,g) { 
c1=parseFloat("0"+f.elements['campoE'+g].value); 
c2=parseFloat("0"+f.elements['campoF'+g].value); 
f.elements['campoG'+g].value=c1*c2; 
} 


function addInsertLine(s){ //aggiunge una linea in fondo (se la penultima cella è piena)
	num=numLine+1;
	
	if(!eval("document.getElementById('divDescription"+(num)+"').innerHTML!=''")){ //evito che vengano cancellate le celle già create se torno in una cella all'inizio e scateno un evento che richiama questa funzione: perderei i dati già inseriti
		if(eval("document."+formName+".campoA"+(num-1)+".value")!='' || eval("document."+formName+".campoB"+(num-1)+".value")!='' || eval("document."+formName+".campoC"+(num-1)+".value")!='' || eval("document."+formName+".campoE"+(num-1)+".value")!='' || eval("document."+formName+".campoF"+(num-1)+".value")!='' || eval("document."+formName+".campoG"+(num-1)+".value")!=''){ //se è stato inserito qualcosa mostro la nuova riga, altrimenti no
			html="	<input type=text name='campoA"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;' maxlength=30 size=30>";
			html+="	<input type=text name='campoB"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;' maxlength=30 size=30>";
			html+="	<input type=text name='campoC"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;' maxlength=30 size=30>";
			html+="	<SELECT name='campoD"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;'><OPTION value=1>Uno<OPTION VALUE=2>Due</SELECT>";
			html+="	<input type=text name='campoE"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;molt(this.form,\""+num+"\");' maxlength=30 size=5>";
			html+="	<input type=text name='campoF"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;molt(this.form,\""+num+"\");' maxlength=30 size=5>";
			html+="	<input type=text name='campoG"+num+"' onFocus='mustMoveFocus=true;currPos="+num+";' onBlur='mustMoveFocus=false;' maxlength=30 size=5>";
			html+="	<input type=button onClick='deleteLine("+num+");' value='Cancella'>";
			html+="	<div id=divDescription"+(num+1)+"></div>\n";
			eval("document.getElementById('divDescription"+num+"').innerHTML=html");
			//alert(num+"\n"+eval("document.getElementById('divDescription"+num+"').innerHTML"));
			numLine++;
		}
	}
}

function deleteInsertLine(){ //toglie una linea in fondo (se la penultima è vuota)
	for(i=numLine;i>0;i--){
		if((eval("document."+formName+".campoA"+(i)+".value")=='' && eval("document."+formName+".campoB"+(i)+".value")=='' && eval("document."+formName+".campoC"+(i)+".value")=='' && eval("document."+formName+".campoE"+(i)+".value")=='' && eval("document."+formName+".campoF"+(i)+".value")=='' && eval("document."+formName+".campoG"+(i)+".value")=='') && (eval("document."+formName+".campoA"+(i-1)+".value")=='' && eval("document."+formName+".campoB"+(i-1)+".value")=='' && eval("document."+formName+".campoC"+(i-1)+".value")=='' && eval("document."+formName+".campoE"+(i-1)+".value")=='' && eval("document."+formName+".campoF"+(i-1)+".value")=='' && eval("document."+formName+".campoG"+(i-1)+".value")=='')){
			eval("document.getElementById('divDescription"+(i)+"').innerHTML=''");
			//alert (eval("document.getElementById('divDescription"+(i)+"').innerHTML")+"\n"+eval("document."+formName+".campoA"+(i-2)+".value"));
			//alert(i+"\n"+eval("document.getElementById('divDescription"+(i)+"').innerHTML"));
			numLine--;
		}
		else break;
	}
}

function keyUp(UpEvents){ //gestione degli eventi da tastiera
	//aggiunta di nuove righe
	
	//spostamento fra le varie celle
	if (!document.all) key=UpEvents.which;
	else key=window.event.keyCode;
	if(mustMoveFocus){
		
		//spostamenti fra le varie celle
		if (key == 38){  //up
			if(currPos!=0) eval("document."+formName+".campoA"+(currPos-1)+".focus()");
		}
		else if (key == 40 ){  //down
			if(eval("document."+formName+".campoA"+(currPos+1))) eval("document."+formName+".campoA"+(currPos+1)+".focus()");
		}
		
		//eliminazione delle linee di troppo
		else if (key == 8 || key == 46){  //backspace o delete
			deleteInsertLine();
		}
		
		//controllo se devo aggiungere una linea o no
		else addInsertLine(currPos+1);
	}
}

function insertOption(optionTextA,optionTextB,optionTextC,optionTextE,optionTextF,optionTextG){
	n=0;
	optionCode='';
	while(eval("document."+formName+".campoA"+n)){
		if(eval("document."+formName+".campoA"+n+".value")=='' && eval("document."+formName+".campoB"+n+".value")=='' && eval("document."+formName+".campoC"+n+".value")==''){
			eval("document."+formName+".campoA"+n+".value=optionTextA");
			eval("document."+formName+".campoB"+n+".value=optionTextB");
			eval("document."+formName+".campoC"+n+".value=optionTextC");
			eval("document."+formName+".campoE"+n+".value=optionTextE");
			eval("document."+formName+".campoF"+n+".value=optionTextF");
			eval("document."+formName+".campoG"+n+".value=optionTextG");
			break;
		}
		n++;
	}
	addInsertLine(n+1);
}

function deleteLine(numLineToDelete){
	for(i=numLineToDelete;i<numLine-1;i++){
		eval("document."+formName+".campoA"+(i)+".value=document."+formName+".campoA"+(i+1)+".value");
		eval("document."+formName+".campoB"+(i)+".value=document."+formName+".campoB"+(i+1)+".value");
		eval("document."+formName+".campoC"+(i)+".value=document."+formName+".campoC"+(i+1)+".value");
		eval("document."+formName+".campoE"+(i)+".value=document."+formName+".campoE"+(i+1)+".value");
		eval("document."+formName+".campoF"+(i)+".value=document."+formName+".campoF"+(i+1)+".value");
		eval("document."+formName+".campoG"+(i)+".value=document."+formName+".campoG"+(i+1)+".value");

		
	}
	eval("document."+formName+".campoA"+(i)+".value=''");
	eval("document."+formName+".campoB"+(i)+".value=''");
	eval("document."+formName+".campoC"+(i)+".value=''");
	eval("document."+formName+".campoE"+(i)+".value=''");
	eval("document."+formName+".campoF"+(i)+".value=''");
	eval("document."+formName+".campoG"+(i)+".value=''");

	
	deleteInsertLine();
}