function DynamicOptionList() {
	if (arguments.length < 2) {
		alert("Not enough arguments in DynamicOptionList()");
	}
	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 = DynamicOptionList_addOptions;
	this.populate = DynamicOptionList_populate;
	this.setDelimiter = DynamicOptionList_setDelimiter;
	this.setDefaultOption = DynamicOptionList_setDefaultOption;
	this.printOptions = DynamicOptionList_printOptions;
	this.init = DynamicOptionList_init;
	}
	
function DynamicOptionList_setDelimiter(val) {
	this.delimiter = val;
	}
	
function DynamicOptionList_setDefaultOption(condition, val) {
	if (typeof this.defaultValues[condition] == "undefined" || this.defaultValues[condition]==null) {
	this.defaultValues[condition] = new Object();
	}
	for (var i=1;i<arguments.length;i++) {
	this.defaultValues[condition][arguments[i]]=1;
	}
	}
	
function DynamicOptionList_init(theform) {
	this.form = theform;
	this.populate();
	}
	
function DynamicOptionList_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];
		}
	}
	
function DynamicOptionList_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);
	}
	}
	
function DynamicOptionList_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 (typeof this.defaultValues[i] != "undefined" && this.defaultValues[i]!=null) {
	for (def in this.defaultValues[i]) {
	if (def == 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;
	}
	}
	}
	