// XOptionList 

function XOptionList()
  {
  if (arguments.length < 2)
    alert("Not enough arguments in XOptionList()");
  this.target = arguments[0];
  this.dependencies = new Array();
  for (var i = 1; i < arguments.length; i++)
    this.dependencies[this.dependencies.length] = arguments[i];
  this.form = null;
  this.dependentValues = new Object();
  this.defaultValues = new Object();
  this.options = new Object();
  this.delimiter = "|";
  this.longestString = "";
  this.numberOfOptions = 0;
  this.addOptions = XOptionList_addOptions;
  this.populate = XOptionList_populate;
  this.setDelimiter = XOptionList_setDelimiter;
  this.setDefaultOption = XOptionList_setDefaultOption;
  this.printOptions = XOptionList_printOptions;
  this.init = XOptionList_init;
  }

// Set the delimiter
function XOptionList_setDelimiter(val)
  {
  this.delimiter = val;
  }

// Set the default option
function XOptionList_setDefaultOption(condition, val)
  {
  this.defaultValues[condition] = val;
  }

// Map the form to the object
function XOptionList_init(theform)
  {
  this.form = theform;
  this.populate();
  }

// Add options to the list.
function XOptionList_addOptions(dependentValue)
  {
  if (typeof this.options[dependentValue] != "object")
    this.options[dependentValue] = new Array();
  for (var i = 1; i < arguments.length; i += 2)
    {
	if (arguments[i].length > this.longestString.length)
	  this.longestString = arguments[i];
	this.numberOfOptions++;
	this.options[dependentValue][this.options[dependentValue].length] = arguments[i];
	this.options[dependentValue][this.options[dependentValue].length] = arguments[i + 1];
	}
  }

// Print dummy options for NS
function XOptionList_printOptions()
  {
  if ((navigator.appName == 'Netscape') && (parseInt(navigator.appVersion) <= 4))
    {
	var ret = "";
	for (var i = 0; i < this.numberOfOptions; i++) 
	  ret += "<OPTION>";
	ret += "<OPTION>"
	for (var i = 0; i < this.longestString.length; i++)
	  {
	  ret += "_";
	  }
	document.writeln(ret);
	}
  }

// Populate the list
function XOptionList_populate()
  {
  var theform = this.form;
  var i, j, obj, obj2;
  this.dependentValues = new Object;
  var dependentValuesInitialized = false;
  for (i = 0; i < this.dependencies.length; i++)
    {
	var sel = theform[this.dependencies[i]];
	var selName = sel.name;
	if (!dependentValuesInitialized)
	  {
	  dependentValuesInitialized = true;
	  for (j = 0; j < sel.options.length; j++)
	    {
		if (sel.options[j].selected)
		  this.dependentValues[sel.options[j].value] = true;
		}
	  }
	else
	  {
	  var tmpList = new Object();
	  var newList = new Object();
	  for (j = 0; j < sel.options.length; j++)
	    {
		if (sel.options[j].selected)
		  tmpList[sel.options[j].value] = true;
		}
	  for (obj in this.dependentValues)
	    {
		for (obj2 in tmpList)
		  newList[obj + this.delimiter + obj2] = true;
		}
	  this.dependentValues = newList;
	  }
	}

  var targetSel = theform[this.target];
  var targetSelected = new Object();
  for (i = 0; i < targetSel.options.length; i++)
    {
	if (targetSel.options[i].selected)
	  targetSelected[targetSel.options[i].value] = true;
	}

  targetSel.options.length = 0;
		
  for (i in this.dependentValues)
    {
	if (typeof this.options[i] == "object")
	  {
	  var o = this.options[i];
	  for (j = 0; j < o.length; j += 2)
	    {
		var text = o[j];
		var val = o[j + 1];
		targetSel.options[targetSel.options.length] = new Option(text, val, false, false);
		if (this.defaultValues[i] == val)
		  targetSelected[val] = true;
		}
	  }
	}
  targetSel.selectedIndex = -1;
  for (i = 0; i < targetSel.options.length; i++)
    {
	if (targetSelected[targetSel.options[i].value] != null && targetSelected[targetSel.options[i].value] == true)
	  targetSel.options[i].selected = true;
	}
  }

