function copen(tblid, childid, cont) {
	//var tbl = document.getElementById(tblid);
	//var img = tbl.rows[rowidx].cells[0].childNodes[0];
	var e = document.getElementById(tblid + "-" + childid);
	var img = e.parentNode.parentNode.firstChild.firstChild;
	var doopen = img.src.indexOf("plus") != -1;
	if (doopen) {
		img.src = "/9351000/g/treemin.gif";
		if (e.style.display == "none")
			e.style.display = "block";
		else
			getcsh(childid, function(v) { e.innerHTML = gentbl(v); if (cont) cont(e); });
	} else {
		img.src = "/9351000/g/treeplus.gif";
		e.style.display = "none";
	}
}

var idc = 0;
function getid() {
	return "xxid" + idc++;
}

function gentbl(cs) {
	var tblid = getid();
	var html = '<table id="' + tblid + '">';
	for (var i = 0; i < cs.length; i++) {
		html += '<tr id="' + cs[i][0] + '"><td valign="baseline"><img src="' + (cs[i][2] ? '/9351000/g/treeplus.gif' : '/9000000/g/aanleg.gif') + '" width="9" height="9"' + (cs[i][2] ? ' onmousedown="copen(\'' + tblid + '\',\'' + cs[i][0] + '\')"' : '') + '></td><td><div>' + cs[i][1] + '</div><div id="' + tblid + '-' + cs[i][0] + '"></div></td></tr>';
	}
	html += '</table>';
	return html;
}

function treeWrite(open) {
	var id = getid();
	document.write('<div id="' + id + '"></div>');
	var e = document.getElementById(id); 
	function cont(e) {
		if (!open || !open.length)
			return;
		var tblid = e.firstChild.id;
		var childid = open.shift();
		if (document.getElementById(tblid + "-" + childid))
			copen(tblid, childid, cont);
	}
	function treeinit(v) { e.innerHTML = gentbl(v); cont(e); }
	//function tryinit(v) { if (!document.readyState || document.readyState=="complete") treeinit(v); else setTimeout(function(){tryinit(v);}, 100); }
	function tryinit() { if (!document.readyState || document.readyState=="complete") getcsh(null, treeinit); else setTimeout(function(){tryinit();}, 100); }
	tryinit();
	return id;
}

function treeCurOpen(id) {
	var stack = [document.getElementById(id)];
	var open = [];
	while (stack.length) {
		var div = stack.pop();
		var tbl = div.childNodes[0];
		if (!tbl || tbl.tagName.toLowerCase() != "table")
			continue;
		var rs = tbl.rows;
		for (var i = 0; i < rs.length; i++)
			if (rs[i].cells[0].childNodes[0].src.indexOf("plus")) {
				var cell1cs = rs[i].cells[1].childNodes;
				var cdiv = cell1cs.length && cell1cs[cell1cs.length - 1];
				if (cdiv && cdiv.tagName.toLowerCase() == "div" && cdiv.childNodes.length) {
					stack[stack.length] = cdiv;
					open[open.length] = rs[i].id;
				}
			}
	}
	return open;
}

function treeAddCache(entries) {
	for (var i = 0; i < entries.length; i++)
		cshcache[entries[i][0]] = entries[i][1];
}

var cpIE = navigator.userAgent.indexOf("MSIE ") >= 0;
function clientPos3(p) {
	var x = 0, y = 0;
	while (p) {
		x += p.offsetLeft;
		y += p.offsetTop;
		if (cpIE && p.tagName == "TD") {
			if (p.style.borderLeftWidth)
				x += parseInt(p.style.borderLeftWidth)
			if (p.style.borderTopWidth)
				y += parseInt(p.style.borderTopWidth)
		}
		p = p.offsetParent;
	}
	return new Array(x, y);
}

function treeClassList(e) {
	var a = e.className.split(" ");
	var b = [];
	for (var i = 0; i < a.length; i++) { if (a[i]) b[b.length] = a[i]; }
	return b;
}
function treeClassDel(e, className) { var a = treeClassList(e); b = []; for (var i = 0; i < a.length; i++) if (a[i] != className) b[b.length] = a[i]; e.className = b.join(" "); }
function treeClassAdd(e, className) { var a = treeClassList(e); b = []; for (var i = 0; i < a.length; i++) if (a[i] != className) b[b.length] = a[i]; b[b.length] = className; e.className = b.join(" "); }

var treeLastCurrent;
function treeSetCurrent(e) {
	if (treeLastCurrent)
		treeClassDel(treeLastCurrent, "current");
	treeLastCurrent = e;
	if (treeLastCurrent)
		treeClassAdd(treeLastCurrent, "current");
}

function treeFocusCell(cell) {
	var cs0 = cell.firstChild;
	if (cs0) {
		var cp = clientPos3(cs0);
		var yr = cp[1] - document.body.scrollTop;
		var ypad = 150;
		if (yr < 0 || yr + cs0.offsetHeight > document.body.clientHeight - ypad) {
			document.body.scrollTop = Math.max(cp[1] - document.body.clientHeight + ypad, 0)
			//if (cs0.scrollIntoView)
				//cs0.scrollIntoView(false);
		}
		/*
		var cs00 = cs0.firstChild;
		if (cs00 && cs00.tagName.toLowerCase() == "a" && cs00.focus) {
			try { cs0.focus(); } catch (e) {}
		}
		*/
		treeSetCurrent(cs0);
	}
}

function divOpenPath(e, path) {
	if (!path.length) {
		treeFocusCell(e.parentNode);
		return;
	}
	var tblid = e.firstChild.id;
	var childid = path.shift();
	var tr = document.getElementById(childid)
	var doopen = tr.cells[0].firstChild.src.indexOf("plus")>=0;
	
	if (doopen && document.getElementById(tblid + "-" + childid))
		copen(tblid, childid, function(e) { divOpenPath(e, path); });
	else {
		if (tr)
			treeFocusCell(tr.cells[1]);
	}
	//} else
		//alert("huh? " + tblid + "-" + childid + " not found " + e.parentNode.outerHTML);
}

function treeOpenPath(id, path) {
	var parent = null;
	var i = 0;
	for (; i < path.length; i++) {
		var tr = document.getElementById(path[i]);
		if (!tr)
			break;
		parent = tr;
	}
	/*
	if (i == path.length) {
		var tr = path.length && document.getElementById(path[path.length - 1]);
		if (tr)
			treeFocusCell(tr.cells[1]);
		return;
	}
	*/
	if (!parent)
		throw new Error("unknown key in path " + path[i]);
	i--;
	var div = parent.parentNode.parentNode.parentNode;
	//var cs = parent.cells[1].childNodes;
	//var div = cs[cs.length - 1];
	divOpenPath(div, path.slice(i));
}

function treeNoPath() {
	treeSetCurrent(null);
}

