function newOpt(href, text, level) {
  level.options[level.length] = new Option(text, href, false, false);
}
function opt(val, text, parentVal) {
  this.val = val;
  this.text = text;
  if (parentVal)
    this.parentVal = parentVal;
}
var snap = false;
var opts = new Array();
var drilldowns = new Array();
var emptyMsg = new Array();
var selectMsg = new Array();
var numDrilldowns = 0;
function initDrilldowns() {
  var ddArray = new Array();
  for (var i = 0; i < initDrilldowns.arguments.length; ++i)
    ddArray[ddArray.length] = initDrilldowns.arguments[i];
  drilldowns[numDrilldowns] = new Array();
  emptyMsg[numDrilldowns] = new Array();
  selectMsg[numDrilldowns] = new Array();
  for (var i = 0; i < ddArray.length; ++i) {
    drilldowns[numDrilldowns][i] = ddArray[i];
	if (i > 0) {
		emptyMsg[numDrilldowns][i] = ddArray[i].options[0].text;
		selectMsg[numDrilldowns][i] = ddArray[i].options[1].text;
	    ddArray[i].options.length = 1;
	}
  }
  for (var i = 1; i < ddArray[0].options.length; ++i)
    opts[numDrilldowns][opts[numDrilldowns].length] = new opt(ddArray[0].options[i].value, ddArray[0].options[i].text);
  numDrilldowns++;
  if (ddArray[0].selectedIndex != 0)
    change(ddArray[0]);
}
function getOptByValue(selectBox, value) {
  var drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; i < opts[drilldownSet].length; ++i)
    if (opts[drilldownSet][i].val == value)
      return opts[drilldownSet][i];
  return -1;
}
function isRelated(selectBox, val1, val2) {
  if (val1 == val2)
    return true;
  var drilldownSet = getDrilldownSet(selectBox);
  var v1 = getOptByValue(selectBox, val1);
  var v2 = getOptByValue(selectBox, val2);
  while (v1.parentVal && v1.parentVal != val2)
    v1 = getOptByValue(selectBox, v1.parentVal);
  while (v2.parentVal && v2.parentVal != val1)
    v2 = getOptByValue(selectBox, v2.parentVal);
  if (v1.parentVal || v2.parentVal)
    return true;
  return false;
}
function getDrilldownSet(selectBox) {
  for (var i = 0; i < drilldowns.length; ++i)
    for (var j = 0; j < drilldowns[i].length; ++j)
      if (selectBox == drilldowns[i][j])
        return i;
  return -1;
}
function change(selectBox) {
  var drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; drilldowns[drilldownSet][i] != selectBox; ++i);
  if (drilldowns[drilldownSet].length == i + 1)
    return;
  drilldowns[drilldownSet][i + 1].options.length = 0;
  newOpt('0',selectMsg[drilldownSet][i + 1],drilldowns[drilldownSet][i + 1]);
  for (var j = 0; j < opts[drilldownSet].length; ++j)
    if (opts[drilldownSet][j].parentVal == selectBox.options[selectBox.selectedIndex].value)
	  newOpt(opts[drilldownSet][j].val, opts[drilldownSet][j].text, drilldowns[drilldownSet][i + 1]);
  if (drilldowns[drilldownSet][i + 1].options.length == 1) {
    drilldowns[drilldownSet][i + 1].options.length = 0;
	newOpt('',emptyMsg[drilldownSet][i + 1],drilldowns[drilldownSet][i + 1]);
  }
  drilldowns[drilldownSet][i + 1].options.selectedIndex = 0; //i hate ns4
  if (snap) {
	  if (drilldowns[drilldownSet][i + 1].length == 2) { //if there's only one option, select it by default
	    drilldowns[drilldownSet][i + 1].options.selectedIndex = 1;
		change(drilldowns[drilldownSet][i + 1]);
	  }
  }
  for (var k = i + 2; k < drilldowns[drilldownSet].length; ++k) {
    drilldowns[drilldownSet][k].options.length = 0;
	newOpt('',emptyMsg[drilldownSet][k],drilldowns[drilldownSet][k]);
  }
}
function add(val, text, parentVal) {
  opts[opts.length - 1][opts[opts.length - 1].length] = new opt(val, text, parentVal);
}
function newDrilldown() {
  opts[opts.length] = new Array();
}
function setValue(selectBox, val) {
  var pos = new Array();
  var newPos = new Array();
  drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; val != null; ++i) {
    for (var j = 0; opts[drilldownSet][j].val != val; ++j);
    pos[i] = opts[drilldownSet][j].val;
    val = opts[drilldownSet][j].parentVal;
  }
  for (var i = 0; i < pos.length; ++i) newPos[pos.length - 1 - i] = pos[i];
  for (var i = 0; i < newPos.length; ++i)
    for (var j = 0; j < drilldowns[drilldownSet][i].length; ++j)
      if (drilldowns[drilldownSet][i].options[j].value == newPos[i]) {
        drilldowns[drilldownSet][i].selectedIndex = j;
        if (i < drilldowns[drilldownSet].length - 1)
          change(drilldowns[drilldownSet][i]);
      }
}
function getValue(drilldownSet, showFullPath) {
	var str = "";
	for (var i = 0; i < drilldowns[drilldownSet].length; ++i) {
		if (drilldowns[drilldownSet][i].selectedIndex != 0) {
			if (showFullPath || i + 1 == drilldowns[drilldownSet].length || drilldowns[drilldownSet][i+1].selectedIndex == 0) {
				str += drilldowns[drilldownSet][i].options[drilldowns[drilldownSet][i].selectedIndex].text + '>';
			}
		} else
			break;
	}
	return new Option(str.substring(0, str.length - 1), drilldowns[drilldownSet][i-1].options[drilldowns[drilldownSet][i-1].selectedIndex].value, false, false);
}
