function treeview(_parent, url){

	this.id = _parent;
	this.idGen = 0;
	this.url = url;

	this.add = function(_text, _link, _target, _dadNode){

		this.idGen++;

		node = document.createElement("DIV");
		node.id = this.id + '_divNodes' + this.idGen;
		node.className = 'treeview_node';

		if (_dadNode == null){
			document.getElementById(this.id).appendChild(node);
		}else{
			dadNode = document.getElementById(_dadNode);
			dadNode.appendChild(node);

			if ((dadNode.className != "treeview_closedNode") && (dadNode.className != "treeview_openedNode")){
				dadNode.className = "treeview_closedNode";
			}

			var dadIdGen = dadNode.id.substring(this.id.length + 9);
			dadNodeLk = document.getElementById(this.id + '_divLinks' + dadIdGen);
			var linkNId = this.id + '_divLinkNodes' + dadIdGen;

			if (document.getElementById(linkNId) == undefined){
				linkN = document.createElement("A");
				linkN.id = linkNId;
				linkN.className = "treeview_lkOpenCloseNode";
				linkN.href = "javascript:treeview_openNode('" + dadNode.id + "');";
				dadNode.insertBefore(linkN, dadNodeLk);
			}
		}

		nodeText = document.createElement("A");
		var idLink = this.id + '_divLinks' + this.idGen
		nodeText.id = idLink;
		nodeText.innerHTML = _text;
		nodeText.href = _link;
		nodeText.target = _target;
		document.getElementById(node.id).appendChild(nodeText);

		treeview_addEvent(document.getElementById(nodeText.id), function() { treeview_activateClickedNode(idLink); }, 'click');

		return node.id;
	}

	this.addButton = function(_type, _text, _link, _target, _dadNode){

		dadNode = document.getElementById(_dadNode);

		var LinkBtnId = this.id + '_divLink'+_type+'Buttons' + dadNode.id.substring(this.id.length + 9);

		if (document.getElementById(LinkBtnId) == undefined){
			nodeBtn = document.createElement("A");
			nodeBtn.id = LinkBtnId;
			nodeBtn.innerHTML = _text;
			nodeBtn.href = _link;
			nodeBtn.target = _target;
			nodeBtn.style.marginLeft='5px';
			nodeBtn.className = "treeview_Button";
			document.getElementById(dadNode.id).appendChild(nodeBtn);
		}

		return;
	}

	this.addEndMark = function(_dadNode, first_level){

		dadNode = document.getElementById(_dadNode);

		dadNode.className = "treeview_EndMarkNode";

		dadNodeLk = document.getElementById(this.id + '_divLinks' + dadNode.id.substring(this.id.length + 9));

		var linkNId = this.id + '_divEndMark' + dadNode.id.substring(this.id.length + 9);

		linkN = document.createElement("A");
		linkN.id = linkNId;

		if(first_level == true)
			linkN.className = "treeview_EndMarkFirstLevel";
		else
			linkN.className = "treeview_EndMark";

		linkN.href = "javascript: void(0);";

		dadNode.insertBefore(linkN, dadNodeLk);

	}

	this.addLoader = function(_terms, _dadNode){

		node = document.createElement("DIV");
		node.id = _dadNode + 'Loader';
		node.className = 'treeview_node';

		dadNode = document.getElementById(_dadNode);
		dadNode.appendChild(node);
		dadNode.className = "treeview_closedNode";

		dadNodeLk = document.getElementById(this.id + '_divLinks' + dadNode.id.substring(this.id.length + 9));

		nodeText = document.createElement("SPAN");
		nodeText.innerHTML = "Wait, loading...";
		nodeText.className = "treeview_loadingWarning";
		nodeText.style.display = "block";
		document.getElementById(node.id).appendChild(nodeText);

		var linkNId = this.id + '_divLinkNodes' + dadNode.id.substring(this.id.length + 9);

		if (document.getElementById(linkNId) == undefined){
			linkN = document.createElement("A");
			linkN.id = linkNId;
			linkN.className = "treeview_lkOpenCloseNode";
			linkN.href = "javascript:treeview_loadNodes('" + dadNode.id + "','" + _terms + "','" + linkNId + "','" + this.url + "');";
			dadNodeLk.href = linkN.href;
			dadNode.insertBefore(linkN, dadNodeLk);
		}

		return node.id;
	}

	this.deleteLoader = function(_dadNode){
		lo = document.getElementById(_dadNode + "Loader");
		lo.parentNode.removeChild(lo);
	}
}

function treeview_openNode(_node){
	_node = document.getElementById(_node);
	if (_node.className == "treeview_openedNode"){
		_node.className = "treeview_closedNode";
	}else{
		_node.className = "treeview_openedNode";
	}
}

var treeview_activeNode = "";

function treeview_activateClickedNode(obj){
	if (treeview_activeNode != ""){
		document.getElementById(treeview_activeNode).className = "";
		treeview_activeNode = "";
	}

	elem = document.getElementById(obj);
	elem.className = "treeview_activeNode";
	treeview_activeNode = elem.id;
}

function treeview_addEvent(obj, func, evt){
	if (window.addEventListener){
		obj.addEventListener(evt, func, true);
	}else if (window.attachEvent){
		obj.attachEvent('on'+evt,func);
	}
}

var treeview_requestStream = new Array();
var treeview_idx = 0;
var treeview_xmlHttp;

if (window.XMLHttpRequest){
	try{
		treeview_xmlHttp = new XMLHttpRequest();
	}catch(e){
		treeview_xmlHttp = false;
	}
}else if(window.ActiveXObject){
	try{
		treeview_xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
	}catch(e){
		try{
			treeview_xmlHttp = ActiveXObject("Microsoft.XMLHTTP");
		}catch(E){
			treeview_xmlHttp = false;
		}
	}
}

if(!treeview_xmlHttp){
	alert('XMLHttpRequest creation failure!\n');
}

function treeview_ajaxLoadNodes(url, dadNode){
	if (!treeview_xmlHttp) {
		alert('Can not execute, XMLHttpRequest not created!\n');
		return false;
	}

	treeview_requestStream[treeview_requestStream.length] = new Array(url,dadNode);
	if (treeview_requestStream.length == (treeview_idx+1)) treeview_ajaxCharge();
}

function treeview_ajaxCharge(){
	url = treeview_requestStream[treeview_idx][0];

	treeview_xmlHttp.open("GET", url, true);
	treeview_xmlHttp.onreadystatechange = function(){
			if(treeview_xmlHttp.readyState == 4){
				trv.deleteLoader(treeview_requestStream[treeview_idx][1]);

				var reply = unescape(treeview_xmlHttp.responseText.replace(/\+/g," "));

				if (reply.substring(reply.length-2) != "ok"){
					alert("Reply failure!");
				}else{
					eval(reply.substring(0,reply.length-2));
				}

				treeview_idx++;
				if (treeview_requestStream.length > treeview_idx) setTimeout("treeview_ajaxCharge();",20);
			}
	}
	treeview_xmlHttp.send(null);
}

function treeview_loadNodes(_node, _parameters, _linkNid, url){
	ln = document.getElementById(_linkNid);
	ln.href = "javascript:treeview_openNode('" + _node + "');";
	dadNode = document.getElementById(_node);
	dadNode.childNodes[1].href = ln.href;

	treeview_openNode(_node);
	treeview_ajaxLoadNodes(url + '/includes/code/treeview_categories.php?' + _parameters + '&dad=' + _node, _node);
}

