you know, my xml-based solution can be used in any level correlation
<script language="javascript">
var aListValue = new Array(2);
aListValue["a"] = new Array("1","2");
aListValue["b"] = new Array("3");
var nCurIndex = null;
function setupList()
{
if (nCurIndex != document.frmtest.name1.selectedIndex)
{
nCurIndex = document.frmtest.name1.selectedIndex;
var sValue = document.frmtest.name1.options[nCurIndex].value;
var i;
//remove existing list
for (i=document.frmtest.name2.options.length-1; i >=0 ; i--)
document.frmtest.name2.options.remove(i);
for (i=0; i < aListValue[sValue].length;i++)
{
var opt = new Option(aListValue[sValue][i],aListValue[sValue][i]);
document.frmtest.name2.options.add(opt);
}
<script language="javascript">
var xmlID = "xmlcmbtree";
var cmbPrefix = "xmlcmb";
var nMaxLevel = 3;
var tblName = "tbl";
function CreateList(nLevel)
{
var doc = document.all(xmlID).documentElement;
var nodes, nIndex, node;
nodes = doc.childNodes;
for (var i=1; i < nLevel;i++)
{
nIndex = document.all(cmbPrefix + i).selectedIndex;
node = nodes[nIndex];
nodes = node.childNodes;
}
var cmb = document.all(cmbPrefix + nLevel);
if (!cmb)
{
cmb = document.createElement("SELECT");
cmb.id = cmbPrefix + nLevel;
cmb.onchange = new Function("ChangeSelection(" + nLevel + ")");
//document.body.appendChild(cmb);
var cell = document.all(tblName).rows[1].insertCell();
cell.appendChild(cmb);