Ho già avuto questo problema. Infatti la soluzione è semplice. Ad ogni richiamo della funzione bisogna fare come se fosse il primo richiamo. Quindi anche la variabile i deve essere var.

codice:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Untitled</title>
<script language="JavaScript" type="text/javascript">
<!--
function test(Obj) {
 var i = 0;
 for(i=0;i<document.getElementById(Obj).children.length;i++) {
  var theObj = document.getElementById(Obj).children(i);
  alert('Ctrl ' + i + ' = ' + theObj.id + ' - ' + theObj.tagName + ' - ' + theObj.type);
  if(theObj.children.length>0) {
   test(theObj.id);
  }
 }
}

//-->
</script>

</head>
<body>
<Form name="MainForm" id="MainForm" Action=# Type=POST>

			<div id=d1>
				<Input Type=text id=a>
			</div>

			<div id=d2>
				<Input Type=text id=b>
			</div>

			<div id=d3>
				<Input Type=text id=c>
			</div>

			<div id=d4>
				<Input Type=button Id=Submit Value=Send onClick="javascript:test('MainForm');">
			</div>
	</Form>

</body>
</html>