function collapse_set(dt, dd, vis)
{
	var j = ' ' + dd.className + ' ';
	var ok = true;
	while (ok) {
		ok = false;
		var z = j.indexOf(' expanded ');
		if (z > -1) {
			j = j.substr(0, z) + ' '
			+ j.substr(z+11);
			ok = true;
		}
		z = j.indexOf(' collapsed ');
		if (z > -1) {
			j = j.substr(0, z) + ' '
			+ j.substr(z+12);
			ok = true;
		}
	}
	if (vis) {
		dd.className = j + ' expanded';
	} else {
		dd.className = j + ' collapsed';
	}

	j = ' ' + dt.className + ' ';
	ok = true;
	while (ok) {
		ok = false;
		var z = j.indexOf(' expanded ');
		if (z > -1) {
			j = j.substr(0, z) + ' '
			+ j.substr(z+11);
			ok = true;
		}
		z = j.indexOf(' collapsed ');
		if (z > -1) {
			j = j.substr(0, z) + ' '
			+ j.substr(z+12);
			ok = true;
		}
	}
	if (vis) {
		dt.className = j + ' expanded';
	} else {
		dt.className = j + ' collapsed';
	}

	dt._collapsed = vis;
}
function collapse_toggle(a)
{
	var dt = a;
	while (dt && (!dt.tagName || !dt.tagName.toLowerCase
			|| dt.tagName.toLowerCase() != 'dt')
	&& dt != document.body) {
		dt = dt.parentNode;
	}
	if (!dt) return;

	var dl = dt._dl;
	var dd = dt._dd;
	var elem = dl._elem;

	if (dl._mode.indexOf('multi') > -1) {
		collapse_set(dt, dd, !dt._collapsed);
	} else {
		var j;
		for (j = 0; j < elem.length; j += 2) {
			if (j == dt._ident) {
				/* expand */
				collapse_set(elem[j], elem[j+1], true);
			} else {
				/* collapse */
				collapse_set(elem[j], elem[j+1], false);
			}
		}
	}
	return false;
}
function collapse_install()
{
	var o = document.getElementsByTagName('DL');
	var i;
	for (i = 0; i < o.length; i++) {
		var z = o[i];
		if (!z.getAttribute) continue;
		var c = z.getAttribute('collapse');
		if (!c || c == '') continue;

		function _walk(cur, ee) {
			if (cur.tagName && cur.tagName.toLowerCase) {
				var tagname = cur.tagName.toLowerCase();
				if (tagname == 'dt' || tagname == 'dd') {
					/* found <dt> or <dd> */
					ee[ ee.length ] = cur;
					return;
				}
			}
			if (cur.childNodes) {
				var x;
				for (x = 0; x < cur.childNodes.length; x++) {
					_walk(cur.childNodes[x], ee);
				}
			}
		}
		/* pass 1: match all dt/dd pairs */
		var elem = [];
		_walk(z, elem);
		z._elem = elem;
		z._mode = c;

		/* pass 2: intertwine them */
		var j;
		for (j = 0; j < elem.length; j += 2) {
			var dt = elem[j];
			var dd = elem[j+1];
		
			/* reference with css using: dl dt a {} */
			dt.innerHTML = '<a href="" onClick="return collapse_toggle(this);">' + dt.innerHTML + '</a>';

			dt._ident = j;
			dt._dd = dd;
			dt._dl = z;

			if (c.indexOf('expanded') > -1) {
				collapse_set(dt, dd, true);
			} else {
				collapse_set(dt, dd, false);
			}
		}
	}
}
