var targetFrame = "_self";
// Имена классов для дерева
var cssFolderName = "folderTitle";
var cssFolderNameSelected = "selFolderTitle";
var cssTreeElement = "treeElement";
// Адреса иконок для дерева
var folder_icon = "img/tree/folder.gif";
var open_icon = "img/tree/minus.gif";
var close_icon = "img/tree/plus.gif";
var none_icon = "img/tree/none.gif";

var maxLength = 80;
// Класс - Узел дерева
function cTree(id,pid,title,opened,selected) {
	this.branches = [];
	this.id = id;
	this.pid = pid;
	this.title = title;
	this.opened = opened;
	this.selected = selected;
}
// Выбранный элемент
selectedItem = null;
// Возвращает ветвь дерева
cTree.prototype.getBranch = function(id) {
	if (this.id == id) return this;
	for (var c=0; c<this.branches.length; c++) {
		var res = (this.branches[c].getBranch(id));
		if (typeof(res) == "object") return res;
	}
	return 0;
}
// Добавляет элемент к дереву
cTree.prototype.add = function(id,pid,title,link,opened,selected) {
	var pr = this.getBranch(pid);
	if (!pr) return false;
	selectedItem = pr.branches[pr.branches.length] = new cTree(id,pid,title,link,opened,selected);
}
// Разворачивает ветвь дерева
function openFolder(tree) {
	if (tree.branches.length)
	for (var c=0; c<tree.branches.length; c++) {
		var el = document.getElementById("br_"+tree.branches[c].id);
		el.style.display = "block";
		if (tree.branches[c].opened)
			openFolder(tree.branches[c]);
	}
}
// Сворачивает ветвь дерева
function closeFolder(tree) {
	if (tree.branches.length)
	for (var c=0; c<tree.branches.length; c++) {
		var el = document.getElementById("br_"+tree.branches[c].id);
		el.style.display = "none";
		closeFolder(tree.branches[c]);
	}	
}
// Обработчик ONCLICK маркера сворачивания/разворачивания
function openClose() {
	var branch = tree.getBranch(this.parentNode.id.replace("br_",""));
	if (branch.opened) {
		branch.opened = false;
		if (branch.branches.length) this.parentNode.firstChild.src = close_icon;
		closeFolder(branch);
	} else {
		branch.opened = true;
		if (branch.branches.length) {
			this.parentNode.firstChild.src = open_icon;
		}
		openFolder(branch);
	}
}
//  Обработчик ONCLICK названия ветви
function getArticles() {
	if (selectedItem) document.getElementById("br_"+selectedItem.id).lastChild.className = cssFolderName;
	this.className = cssFolderNameSelected;
	selectedItem = tree.getBranch(this.parentNode.id.replace("br_",""));
	if (selectedItem.branches.length) {
		selectedItem.opened = true;
		this.parentNode.firstChild.src = open_icon;
		openFolder(selectedItem);
	}
}
function truncate(str) {
	if (str.length > maxLength)
		str = str.substr(0,maxLength)+"...";
	return str;
}
// Строит дерево
function appendTree(tree,obj,level,visible) {
	var node = document.createElement("DIV");
	node.className = cssTreeElement;
	node.style.display = level ? (visible ? "block" : "none") : "none";
	node.style.marginLeft = (level-1)*20+"px";
	node.id = "br_"+tree.id;
	var openclose = document.createElement("IMG");
	openclose.style.align = "left";
	openclose.style.verticalAlign = "middle";
	openclose.style.width = "15px";
	openclose.style.height = "17px";
	openclose.src = tree.branches.length ? (tree.opened ? open_icon : close_icon) : none_icon;
	openclose.onclick = openClose;
	node.appendChild(openclose);
	var f = document.createElement("IMG");
	f.style.align = "left";
	f.style.width = "24px";
	f.style.height = "17px";
	f.style.verticalAlign = "middle";
	f.src = folder_icon;
	f.onclick = function() { document.location = linkTemplate.replace(/\{ID\}/,tree.id) };
	node.appendChild(f);
	var haveBranches = tree.branches.length ? true : false;
	var fname = document.createElement("A");
//	if (!haveBranches) {
		fname.href = linkTemplate.replace(/\{ID\}/,tree.id);
		fname.target = targetFrame;
//	}
	fname.title = tree.title;
	fname.innerHTML = truncate(tree.title);
	fname.style.verticalAlign = "middle";
	fname.className = tree.selected ? cssFolderNameSelected : cssFolderName;
	if (tree.selected) selectedItem = tree;
	fname.onclick = getArticles;
	node.appendChild(fname);
	obj.appendChild(node);

	for (var c=0; c<tree.branches.length; c++) {
		appendTree(tree.branches[c],obj,level+1,!level ? true : tree.opened)
	}
}