function dynamicSelect(id1, id2, id3) {
	// Browser and feature tests to see if there is enough W3C DOM support
	var agt = navigator.userAgent.toLowerCase();
	var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	var is_mac = (agt.indexOf("mac") != -1);
	if (!(is_ie && is_mac) && document.getElementById && document.getElementsByTagName) {
		// Obtain references to both select boxes
		var sel1 = document.getElementById(id1);
		var sel2 = document.getElementById(id2);
		var sel3 = document.getElementById(id3);
		var div_sel2  = sel2.parentNode;
		var div_sel3  = sel3.parentNode;
		div_sel2.style.display = div_sel3.style.display = 'none';
		// Clone the dynamic select box
		var clone = sel2.cloneNode(true);
		var clone3 = sel3.cloneNode(true);
		// Obtain references to all cloned options 
		var clonedOptions = clone.getElementsByTagName("option");
		var clonedOptions3 = clone3.getElementsByTagName("option");
		// Onload init: call a generic function to display the related options in the dynamic select box
		refreshDynamicSelectOptions(sel1, sel2, sel3,clonedOptions, clonedOptions3 );
		// Onchange of the main select box: call a generic function to display the related options in the dynamic select box
		sel1.onchange = function() {
			refreshDynamicSelectOptions(sel1, sel2, sel3, clonedOptions);
			div_sel2.style.display = 'block';
		};
		sel2.onchange = function() {
			refreshDynamicSelectOptions2(sel1, sel2, sel3,  clonedOptions3 );
			div_sel3.style.display = 'block';
		};
	}
}
function refreshDynamicSelectOptions(sel1, sel2, sel3, clonedOptions ) {
	// Delete all options of the dynamic select box
	//alert(clonedOptions3.length);
	while (sel2.options.length) 
	{
		sel2.remove(0);
	}
	while (sel3.options.length) 
	{
		sel3.remove(0);
	}
	

	// Create regular expression objects for "select" and the value of the selected option of the main select box as class names
	var pattern1 = /( |^)(select)( |$)/;
	var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");
	// Iterate through all cloned options
	for (var i = 0; i < clonedOptions.length; i++) 
	{
		// If the classname of a cloned option either equals "select" or equals the value of the selected option of the main select box
		if (clonedOptions[i].className.match(pattern1) || clonedOptions[i].className.match(pattern2)) 
		{
			// Clone the option from the hidden option pool and append it to the dynamic select box
			sel2.appendChild(clonedOptions[i].cloneNode(true));
		}
	}
}
		
function refreshDynamicSelectOptions2(sel1, sel2, sel3, clonedOptions3 ) {
	// Delete all options of the dynamic select box
	//alert(clonedOptions3.length);
	while (sel3.options.length) 
	{
		sel3.remove(0);
	}
	

	// Create regular expression objects for "select" and the value of the selected option of the main select box as class names
	var pattern1 = /( |^)(select)( |$)/;
	var pattern2 = new RegExp("( |^)(" + sel2.options[sel2.selectedIndex].value + ")( |$)");
	// Iterate through all cloned options
	for (var i = 0; i < clonedOptions3.length; i++) 
	{
		// If the classname of a cloned option either equals "select" or equals the value of the selected option of the main select box
		if (clonedOptions3[i].className.match(pattern1) || clonedOptions3[i].className.match(pattern2)) 
		{
			// Clone the option from the hidden option pool and append it to the dynamic select box
			sel3.appendChild(clonedOptions3[i].cloneNode(true));
		}
	}
}
