function buildCascadingOptions(tableObj) {
	function getParentByTagName(node, tag) {
		do {
			node = node.parentNode;
		} while (node && (!node.tagName || node.tagName.toLowerCase() !== tag));
		return node;
	}
	function getMatchingNextSibling(node) {
		if (node && node.tagName) {
			var tag = node.tagName.toLowerCase();
			do {
				node = node.nextSibling;
			} while (node && (!node.tagName || node.tagName.toLowerCase() !== tag));
			return node;
		}
		return null;
	}
	function getMatchingPreviousSibling(node) {
		if (node && node.tagName) {
			var tag = node.tagName.toLowerCase();
			do {
				node = node.previousSibling;
			} while (node && (!node.tagName || node.tagName.toLowerCase() !== tag));
			return node;
		}
		return null;
	}
	function getTableRows(tableObj) {
		var r = [];
		var tbody = tableObj.getElementsByTagName('tbody');
		var nodes;
		if (tbody && tbody[0]) nodes = tbody[0].childNodes;
		  else nodes = [];
		for (var i = 0, j = nodes.length; i < j; i++) {
			if (nodes[i].tagName && nodes[i].tagName.toLowerCase() === 'tr') r[r.length] = nodes[i];
		}
		return r;
	}

	function prettifyTable(tableObj) {
		function hideWithout(obj, objs) {
			if (objs && objs[0]) {
				var test = false;
				for (var k = 0, l = objs.length; k < l; k++) {
					if (objs[k].style.display.toLowerCase() !== 'none') test = true;
				}
				obj.style.display = test ? '' : 'none';
			}
		}
		var trs = tableObj.getElementsByTagName('tr');
		if (trs && trs[0]) for (var i = 0, j = trs.length; i < j; i++) hideWithout(trs[i], trs[i].getElementsByTagName('table'));
		hideWithout(tableObj, getTableRows(tableObj.getElementsByTagName('table')[0]));
	}

	function resetOptions(obj) {
		var s = obj.getElementsByTagName('select');
		for (var i = 0, j = s.length; i < j; i++) {
			// s[i].selectedIndex = 0;
			s[i].disabled = true;
		}
		s = obj.getElementsByTagName('input');
		for (var i = 0, j = s.length; i < j; i++)
			if (s[i].getAttribute('type') === null || s[i].getAttribute('type').toLowerCase() === 'text') {
				// s[i].value = '';
				s[i].disabled = true;
			}
	}

	function buildRows(tableObj, first) {
		var trs = getTableRows(tableObj);
		for (var i = 0, j = trs.length; i < j; i++) {
			var tables = trs[i].getElementsByTagName('table');
			if (tables && tables[0]) {
				for (var k = 1, l = tables.length; k < l; k++)
					tables[k].style.display = 'none';
				resetOptions(tables[0]);
				buildRows(tables[0]);
				var sel = getParentByTagName(tables[0], 'tr');
				if (!first) sel = getParentByTagName(sel, 'tr');
				sel = getMatchingPreviousSibling(sel).getElementsByTagName('select')[0];
				if (sel) {
					sel.selectedIndex = 0;
					sel.onchange = function () {
						var node = getParentByTagName(this, 'tr');
						var nextTR = getMatchingNextSibling(node);
						var trs = nextTR.getElementsByTagName('table')[0];
						trs.style.display = '';
						trs = getTableRows(trs);
						var tables = [];
						for (var i = 0, j = trs.length; i < j; i++) {
							var a = trs[i].getElementsByTagName('table');
							if (a && a[0]) tables[tables.length] = a[0];
						}
						for (var i = 0, j = tables.length; i < j; i++) {
							if (i === this.selectedIndex) {
								tables[i].style.display = (tables[i].getElementsByTagName('tbody')[0] &&
								  tables[i].getElementsByTagName('tbody')[0].childNodes.length) ? '' : 'none';
								var t2 = getTableRows(tables[i]);
								for (var k = 0, l = t2.length; k < l; k++)
									if (!t2[k].getElementsByTagName('table')[0]) {
										var a = t2[k].getElementsByTagName('select');
										for (var m = 0, n = a.length; m < n; m++) a[m].disabled = false;
										a = t2[k].getElementsByTagName('input');
										for (var m = 0, n = a.length; m < n; m++) a[m].disabled = false;
									}
							} else {
								tables[i].style.display = 'none';
								resetOptions(tables[i]);
								var t2 = tables[i].getElementsByTagName('table');
								for (var k = 0, l = t2.length; k < l; k++) t2[k].style.display = 'none';
							}
						}
						prettifyTable(nextTR);
					}
					sel.onchange();
				}
			}
		}
	}
	buildRows(tableObj, true);
}

// example: buildCascadingOptions(document.getElementById('table'));

