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) {
	this.defaultValues[condition] = val;
};


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;

					}

				}

			}

		// Otherwise, add new options for every existing option

		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];

		

	// Store the currently-selected values of the target list to maintain them (in case of multiple select lists)

	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; // Clear all target options

		

	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;

			}

		}

	}




var listB = new DynamicOptionList("B","A");
listB.addOptions("Metric","M2","M2","M2.5","M2.5","M3","M3","M4","M4","M5","M5","M6","M6","M8","M8","M10","M10","M12","M12");
listB.addOptions("Imperial","2-56","2-56","4-40","4-40","6-32","6-32","8-32","8-32","10-24","10-24","10-32","10-32","1/4-20","1/4-20","5/16-18","5/16-18","5/16-24","5/16-24","3/8-16","3/8-16");
listB.setDefaultOption("Metric","M2");
listB.setDefaultOption("Imperial","2-56");

var listC = new DynamicOptionList("C","A");
listC.addOptions("Metric","4mm","4mm","5mm","5mm","6mm","6mm","8mm","8mm","12mm","12mm","16mm","16mm","20mm","20mm","25mm","25mm","30mm","30mm","35mm","35mm","40mm","40mm","45mm","45mm","50mm","50mm","60mm","60mm");
listC.addOptions("Imperial","1/8","1/8","3/16","3/16","1/4","1/4","5/16","5/16","3/8","3/8","7/16","7/16","1/2","1/2","5/8","5/8","3/4","3/4","7/8","7/8","1","1","1 1/4","1 1/4","1 1/2","1 1/2","1 3/4","1 3/4","2","2","3","3");
listC.setDefaultOption("Metric","4mm");
listC.setDefaultOption("Imperial","1/8");

function init() {
	var theform = document.forms[0];
	listB.init(theform);
	listC.init(theform);
	}
