
function checklists(field) {
  retvalue = false;
  for (var ck=0; ck<field.length; ck++) {
    if (eval("document."+field[ck])) { retvalue = true;
    } else {retvalue = false; alert("Missing the \""+field[ck]+"\" element from the dependence chain."); break;}
  }
  return retvalue;
}

function setFXList(list, lbs, vals, def) {
  var ix = 0;
  var elem = eval("document."+list);
  if (elem.length != undefined) { elem.length = 0;
    for (var i=0; i<vals.length; i++) {
      elem.options[i] = new Option(lbs[i],vals[i]);
      if (lbs[i].toLowerCase() == def.toLowerCase()) ix = i;
    }
    elem.selectedIndex = ix;
  } else {elem.text = lbs; elem.value = vals;}
}

function setFXDep(elem, data, lists, def) {
  if (!checklists(lists)) return;
  elems = elem.split(",");
  for (var x=0; x<elems.length; x++) {
    var myelem, count, found, col, sel = new Array();
    var vals = new Array(), lbs = new Array();
    for (var y=0; y<lists.length; y++) {
      if (elems[x] != lists[y]) {
        myelem = eval("document."+lists[y]);
        if (myelem.length != undefined) sel.push(myelem.options[myelem.selectedIndex].value);
      } else {col = y; break;}
    }
    if (data.length) {
      for (var i=0; i<data.length; i++) {
        count = 0;
        for (var s=0; s<sel.length; s++) {
          if (sel[s].toLowerCase() == data[i][s].toLowerCase()) count++;
        }
        if (count == sel.length) {
          found = false;
          for (var vl=0; vl<vals.length; vl++) {
            if (data[i][col].toLowerCase() == vals[vl].toString().toLowerCase()) {
              found = true; break;
            }
          }
          if (!found) {
            vals.push(data[i][col]);
            lbs.push((data[i][col+lists.length] != "") ? data[i][col+lists.length] : data[i][col]);
          }
        }
      }
      setFXList(elems[x], lbs, vals, def);
    } else setFXList(elems[x], new Array("*** No Options"), new Array(""), '');
    if (col < lists.length-1) {
      for (var l=0; l<lists.length-1; l++) {
        if (l >= col) setFXDep(lists[l+1], data, lists, '');
      }
    }
  }
}

