var treeTrashEmpty=ssLang['ShoppingСartIsEmpty'];
var treeTrashFull=ssLang['FollowingElementsWillBeDeletedDuringSaving'];
var treeLineEl 		= '<span class="tree_ico"><img src="'+ssPicPath+'line.gif" width="17" height="21" /></span>';
var treeEmptyEl 	= '<span class="tree_ico"><img src="'+ssPicPath+'x.gif" width="17" height="21" /></span>';
var treeMinusEl 	= '<span class="tree_ico"><img src="'+ssPicPath+'minus.gif" width="17" height="21" onclick="treeChangeState(this)" /></span>';
var treeMinusLastEl = '<span class="tree_ico"><img src="'+ssPicPath+'minus_last.gif" width="17" height="21" onclick="treeChangeState(this)" /></span>';
var treePlusEl 		= '<span class="tree_ico"><img src="'+ssPicPath+'plus.gif" width="17" height="21" onclick="treeChangeState(this)" /></span>';
var treePlusLastEl 	= '<span class="tree_ico"><img src="'+ssPicPath+'plus_last.gif" width="17" height="21" onclick="treeChangeState(this)" /></span>';
var treeJoinEl 		= '<span class="tree_ico"><img src="'+ssPicPath+'join.gif" width="17" height="21" /></span>';
var treeJoinLastEl 	= '<span class="tree_ico"><img src="'+ssPicPath+'join_last.gif" width="17" height="21" /></span>';
var treeTrashItem	= '<div class="tree_trash" onmouseup="treeDragTrash()"><img id="tree_trash" src="'+ssPicPath+'x.gif" width="36" height="41" alt="" title="'+treeTrashEmpty+'" /></div>';


var isIE=true;
var treeFilePath=false;
var treeFile=false;
var treeObj=false;
var treeLevel=false;
var treeLevels=false;
var treeStr=false;
var treeClassSelected = "selected";
var treeClassOver = "over";
var dragID=false;
var tree_DD=false;
var copiedNode=false;
var copiedDDNode=false;
var Last_New_Id=0;
var Last_Pointer_Id=0;
var treeInsert=false;
var treeInsertIn=false;
var oldSelectedLine=false;
var treeTrashString="";

var acceptContextMenu=true;
var contextMenuItems = new Array();
contextMenuItems[0]=ssLang['moveUp'];
contextMenuItems[1]=ssLang['moveDown'];
contextMenuItems[2]='<div class="hr">&nbsp;</div>';
contextMenuItems[3]=ssLang['addSubitem'];
contextMenuItems[4]=ssLang['copy'];
contextMenuItems[5]=ssLang['insert'];
contextMenuItems[6]=ssLang['delete'];
contextMenuItems[7]='<div class="hr">&nbsp;</div>';
contextMenuItems[8]=ssLang['examineOnSite'];
contextMenuItems[9]=ssLang['Properties'];


//Показывает ошибку
function treeShowError(error){
	var statusObj=document.getElementById("tree_status");
	if (statusObj) {
		if (this.statusTimeout) clearTimeout(this.statusTimeout);
		statusObj.style.display="block";
		statusObj.innerHTML='<span style="color: red">'+error+'</span>';
	}
}

//Показывает состояние
function treeShowStatus(string){
	var statusObj=document.getElementById("tree_status");
	if (statusObj) {
		if (this.statusTimeout) clearTimeout(this.statusTimeout);
		statusObj.innerHTML=string;
		statusObj.style.display="block";
		this.statusTimeout=setTimeout('document.getElementById("tree_status").style.display="none"', 2000);
	}
}

//Показывает состояние (не прячется)
function treeShowStatusNoHide(string){
	var statusObj=document.getElementById("tree_status");
	if (statusObj) {
		if (this.statusTimeout) clearTimeout(this.statusTimeout);
		statusObj.innerHTML=string;
		statusObj.style.display="block";
	}
}

//Показать свойства элемента дерева
function treeItemProperties(curID){
	if (curID.indexOf("New")==-1)
		openPopup('properties'+curID, http_path+adminarea_prefix+'/app/structure/docproperties?'+curID+'/', 'get', '');
		//openPopup('properties','popup_folders.html', 'get', '');
	return false;
}

//Добавить подраздел
function treeAddSubItem(curID){
	if (curID.indexOf("New")==-1)
		openPopup('properties'+curID, http_path+adminarea_prefix+'/app/structure/docproperties?0(parent_id('+curID+'))/', 'get', '');
	return false;
}

//Сохранение дерева
function treeSend(xmlfilepath){
	var str="xml="+encodeURI(treeObj.xml);
	//var str="xml=1111";
	treeShowStatusNoHide(ssLang['Error::DataSaving']);
	if (!document.getElementById('tree_place')){
	document.write('<div id="context_menu" class="context_menu">&nbsp;</div>');
	document.write('<div id="tree_DD" class="drag_obj">&nbsp;</div>');
	document.write('<div id="tree_place"></div>');
	}
	tree_DD=document.getElementById('tree_DD');
	if(isMozilla){
	isIE=false;
	treeFile=new XMLHttpRequest();
	} else {
	treeFile = new ActiveXObject("Microsoft.XMLHTTP");
	}
	treeFile.onreadystatechange = treeCheckState; 
	treeFile.open("POST", noCache(xmlfilepath) , true);
	treeFile.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	treeFile.setRequestHeader("Content-Length", str.length);
	try {
	treeFile.send(str);
	} catch (e){
	treeShowError(ssLang['Error::StructureFileIsNotFound']);
	}
}



//Инициализация загрузки дерева
function treeInit(xmlfilepath){
	treeFilePath=xmlfilepath;
	if (!document.getElementById('tree_place')){
		document.write('<div id="context_menu" class="context_menu">&nbsp;</div>');
		document.write('<div id="tree_DD" class="drag_obj">&nbsp;</div>');
		document.write('<div id="tree_place"></div>');
	}
	tree_DD=document.getElementById('tree_DD');
	if(isMozilla){
		isIE=false;
		treeFile=new XMLHttpRequest();
	} else {
		treeFile = new ActiveXObject("Microsoft.XMLHTTP");
	}
	treeFile.onreadystatechange = treeCheckState;	
	treeFile.open("GET", noCache(xmlfilepath) , true);
	try {
	treeFile.send(null);
	} catch (e){
		treeShowError(ssLang['Error::StructureFileIsNotFound']);
	}
	
}

//Обновить дерево
function treeReload(){
	treeInit(treeFilePath);
}

function treeCheckState(){
	if (treeFile.readyState == 4){
		if (treeFile.status==0 || treeFile.status==200){
			if (isMozilla) {
				tempTreeObj = document.implementation.createDocument("","doc", null);
				tempTreeObj=treeFile.responseXML;
			}
			else {
				tempTreeObj = new ActiveXObject("Msxml2.DOMDocument");
				tempTreeObj.loadXML(treeFile.responseText);
			}
			if (checkGlobalMessage(tempTreeObj)) {
				printTree();
			} else {
				if (!treeCheckError(tempTreeObj)) {
					treeObj=tempTreeObj;
					printTree();
				}
			}
		} else treeShowError(ssLang['StructureFileLoadingError']);
	} 
}

//Обработка ошибок объекта
function treeCheckError(xmlObj){
	var flag=false;
	var node = false;
	var error=xmlObj.getElementsByTagName("error");
	if (error.length>0){
		node=error[0];
		if (node.text) var str=node.text;
			else var str=ssLang['Error::DataLoadingError'];
		if (node.attributes.getNamedItem('action')){
			var action=node.attributes.getNamedItem('action').value;
			if (action=="noparse") flag=true;
		}
		treeShowError(str);
	} else {
		treeShowStatus(ssLang["DataFromServerAreLoadedSuccessfully"]);
	}
	return flag;	
}


//Инициализация массива treeLevels
function initTreeLevels(){
	treeLevels = new Array();
	for(i=0; i<100; i++) {treeLevels[i]=0;}
}

function printTree(){
	treeTrashString="";
	treeStr ="";
	initTreeLevels();
	treeLevel=0 ;
	for(i=0;i<treeObj.documentElement.childNodes.length;i++)
		if(treeObj.documentElement.childNodes.item(i).nodeName=='treeitem') {
			viewNode(treeObj.documentElement.childNodes.item(i));
		}
	treeStr+=treeTrashItem;
	document.getElementById("tree_place").innerHTML = treeStr;
}

//Потомок по номеру (с учетом текстовых нод в Mozilla)
function getChild(el,n){
	if (isMozilla) {
		var mn=-1;
		for (var i=0; i<el.length && mn<n; i++)
			if (el.item(i).nodeType != 3 && el.item(i).nodeType != 8) mn++;
		return el.item(i-1);
	}
	return el.item(n);
}

//выдает строку, содержащую дерево с элемента curNode
function viewNode(curNode, nodeText){
	if (isMozilla) curNode.normalize();
	var childs = curNode.childNodes;
	var childnodes = childs.length;
	var curID = (curNode.attributes.getNamedItem('id'))?curNode.attributes.getNamedItem('id').text:"";
	var lastNode = isLastElement(curID);
	var hasChildren = false;
	if(curNode.hasChildNodes()) for(i=0;i<curNode.childNodes.length;i++)
		if(curNode.childNodes.item(i).nodeName=='treeitem') hasChildren=true;
		
	// Если не задан visible
	if (!curNode.attributes.getNamedItem('state')) curNode.setAttribute('state','visible');
	var visible=curNode.attributes.getNamedItem('state').text=="visible";

	if (curNode.nodeName=="treeitem"){
		var userNode = (curNode.attributes.getNamedItem('user'))?curNode.attributes.getNamedItem('user').text:"";
		var modifiedNode = (curNode.attributes.getNamedItem('modified'))?curNode.attributes.getNamedItem('modified').text:"";
		var pathNode = getUrl(curNode);
		var titleNode = getChild(childs,0).text;
		var typeNode = (curNode.attributes.getNamedItem('type'))?curNode.attributes.getNamedItem('type').text:"";
		var noactions = (curNode.attributes.getNamedItem('noactions'))?curNode.attributes.getNamedItem('noactions').text:"";
		var templateNode = getChild(childs,1).text;
		var modifiedDate = new Date(modifiedNode*1000);
	
		var hasChildren = (curNode.attributes.getNamedItem('children') && curNode.attributes.getNamedItem('children').text>0)?curNode.attributes.getNamedItem('children').text:0;
		treeStr+='<div class="tree_item" id="tab_'+curID+'" oncontextmenu="return showmenu('+"'"+curID+"'"+', event)" '+(!isMozilla?'title="ID: '+curID.replace('id_','')+'\n'+ssLang['Path']+': '+pathNode+'\n'+ssLang['Template']+': '+templateNode+'\n'+ssLang['LastChange']+': '+modifiedDate.getHours()+':'+modifiedDate.getMinutes()+':'+modifiedDate.getSeconds()+' '+modifiedDate.getDate()+'.'+modifiedDate.getMonth()+'.'+modifiedDate.getYear()+' ('+userNode+')"':'')+'>';
		treeStr+='<table cellpadding="0" cellspacing="0"  onmouseover="nodeOver(this)" onmouseout="nodeOut(this)"><tr>';
		treeStr+='<td class="tree_icons">';
		for(i=0;i<treeLevel;i++) treeStr+=(treeLevels[i]==1)?treeLineEl:treeEmptyEl;
		
		if (hasChildren)
			if (visible)
				if (lastNode) treeStr+=treeMinusLastEl;
					else treeStr+=treeMinusEl;
			else 
				if (lastNode) treeStr+=treePlusLastEl;
					else treeStr+=treePlusEl;
		else
			if (lastNode) treeStr+=treeJoinLastEl;
				else treeStr+=treeJoinEl;
		
		treeStr+='<span class="tree_ico" ondrag="return false" onmouseup="treeDragEnd('+"'"+curID+"'"+', event)" onmousedown="treeDragStart('+"'"+curID+"'"+', event)" onmouseover="treeOverInsertIn(this, event)" onmouseout="treeOutInsertIn()">';
		
		if (hasChildren)
			if (visible) treeStr+='<img src="'+ssPicPath+'fo'+typeNode+'.gif" width="17" height="21" />';
			else treeStr+='<img src="'+ssPicPath+'f'+typeNode+'.gif" width="17" height="21" />';
		else treeStr+='<img src="'+ssPicPath+'p'+typeNode+'.gif" width="17" height="21" />';

		
		treeStr+='</span>';
		treeStr+='</td>';
		treeStr+='<td class="tree_names" onselectstart="return false" onmousedown="treeDragStart('+"'"+curID+"'"+', event)" onmouseup="treeDragEndInsert(this, event)" onmouseover="treeOverInsert(this, event)" onmousemove="treeMoveInsert(this, event)" onmouseout="treeOutInsert()">';
		treeStr+=''+titleNode+'';
		if (nodeText) treeStr+='<span class="ss_treeitem_status">&nbsp;('+nodeText+')</span>';
		treeStr+='</td><td class="tree_line" onmouseup="treeDragEndInsert(this, event)" onmouseover="treeOverInsert(this, event)" onmousemove="treeMoveInsert(this, event)" onmouseout="treeOutInsert()"><div>&nbsp;</div></td>';
		
		treeStr+='<td class="tree_actions">';
		if (!(noactions=="add" || noactions=="all"))
			treeStr+='<a href="#" class="tree_action" onclick="return treeAddSubItem('+"'"+curID+"'"+')">'+ssLang['addSubitem']+'</a>';
		else treeStr+=ssLang['addSubitem'];
	
		treeStr+='<span class="tree_action_hline">&nbsp;|&nbsp;</span>';
		
		if (!(noactions=="properties" || noactions=="all"))
			treeStr+='<a href="#" onclick="return treeItemProperties('+"'"+curID+"'"+')" class="tree_action">'+ssLang['Properties']+'</span>';
		else treeStr+=ssLang['Properties'];
		
		treeStr+='</td>';
		treeStr+='</tr></table>';
		if (visible){
			if (!lastNode) treeLevels[treeLevel]=1;
			treeLevel++;
			for(var i=0;i<childnodes;i++){
				if (childs.item(i).nodeName=="treeitem") viewNode(childs.item(i));
			}
			treeLevel--;
			treeLevels[treeLevel]=0;
		}
		treeStr+="</div>\n";
	}
}

//вычисленгие родителя с Id
function treeCalcItemId(el){
	tempEl=el;
	while (!tempEl.id) tempEl=tempEl.parentNode;
	return tempEl.id.replace("tab_","");
}

// раскрытие/скрытие узла дерева
function treeChangeState(el){
	nodeid = treeCalcItemId(el);
	var curNode = treeObj.nodeFromID(nodeid);
	//	var lastNode = isLastElement(nodeid);
	visible = curNode.attributes.getNamedItem('state').text=='visible';
	if(visible)	{
		curNode.attributes.getNamedItem('state').text='hidden';
		for (i=0; i<curNode.childNodes.length; i++) 
			if (curNode.childNodes.item(i).nodeName=='treeitem'){
				curNode.removeChild(curNode.childNodes.item(i));
				i--;
			}
		treeStr ="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(curNode);
		treeSaveStatus(nodeid,'hidden');
	} else {
		curNode.attributes.getNamedItem('state').text='visible';
		treeStr ="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(curNode, ssLang['Loading']);
		eval ('node_'+nodeid+'=new treeNode("node_'+nodeid+'","'+nodeid+'")');
		eval ('node_'+nodeid+'.init()');
	}
	if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr;
	else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
}

//перемещение узла на позицию вверх в данном поддереве
function treeGettingUp(nodeid){
	if (!isFirstElement(nodeid)){
		prefID=(treeObj.nodeFromID(nodeid).previousSibling.nodeName=='treeitem'?treeObj.nodeFromID(nodeid).previousSibling.attributes.getNamedItem('id').text:treeObj.nodeFromID(nodeid).previousSibling.previousSibling.attributes.getNamedItem('id').text);
		treeObj.nodeFromID(nodeid).parentNode.insertBefore(treeObj.nodeFromID(nodeid),treeObj.nodeFromID(prefID));
		var curNode = treeObj.nodeFromID(nodeid).parentNode;
		nodeid = curNode.attributes.getNamedItem('id').text;
		treeStr ="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(curNode);
		if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr; else document.getElementById("tab_"+nodeid).outerHTML=treeStr;

	}
	return false;
}

//перемещение узла на позицию вниз в данном поддереве
function treeGettingDown(nodeid){
	if (!isLastElement(nodeid)){
		treeGettingUp((treeObj.nodeFromID(nodeid).nextSibling.nodeName=="#text"?treeObj.nodeFromID(nodeid).nextSibling.nextSibling.attributes.getNamedItem('id').text:treeObj.nodeFromID(nodeid).nextSibling.attributes.getNamedItem('id').text));
	}
	return false;
}

//Удаление перетаскиванием в корзину
function treeDragTrash(){
	tree_DD.style.display="none";
	tree_DD.innerHTML="";
	if (dragID && isDeletedNode(dragID)) treeDelete(dragID);
}


//удаляет узел
function treeDelete(nodeid){
	if(isMozilla) treeObj.normalize();
	curNode=treeObj.nodeFromID(nodeid);
	var curNodeIdSave=nodeid;
	parentNode=curNode.parentNode;
	var lastNode = isLastElement(nodeid);
	if (lastNode) {
		if(isMozilla){
			if(curNode.previousSibling && curNode.previousSibling.nodeName=="#text" && curNode.previousSibling.previousSibling && curNode.previousSibling.previousSibling.attributes.getNamedItem("id"))
			prefID=curNode.previousSibling.previousSibling.attributes.getNamedItem("id").textContent;
			else prefID = null;
		}else{
			if (treeObj.nodeFromID(nodeid).previousSibling.attributes.getNamedItem('id') != null)
			prefID=treeObj.nodeFromID(nodeid).previousSibling.attributes.getNamedItem('id').text;
			else prefID = null;
		}
	}
	treeObj.nodeFromID(nodeid).parentNode.removeChild(treeObj.nodeFromID(nodeid));
	if (lastNode) {
		nodeid = parentNode.attributes.getNamedItem('id').text;
		treeStr ="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(parentNode);
		if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr; else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
	} else {document.getElementById("tab_"+nodeid).parentNode.removeChild(document.getElementById("tab_"+nodeid))}
	if (!treeTrashString) {
		treeTrashString=treeTrashFull+" "+curNodeIdSave.replace("id_","");
		document.getElementById("tree_trash").className = "act";
	} else treeTrashString+=", "+curNodeIdSave.replace("id_","");
	document.getElementById("tree_trash").title=treeTrashString;
	
	return false;
}


// изменяет координаты объекта DRAG&DROP
function treeDragObj(ev){
	if(ev) event=ev;
	if(tree_DD.innerHTML != "" && (isMozilla || event.button==1)){
		leftDD = event.clientX-X/2 + document.body.scrollLeft;
		topDD = event.clientY-Y/2 + document.body.scrollTop;
		tree_DD.style.left = leftDD;
		tree_DD.style.top = topDD;
//		if (leftDD<25 || topDD<25 || leftDD>document.body.offsetWidth-150 || topDD>document.body.offsetHeight-30) treeClearDD();
	} else {
		treeClearDD();
	}
}

//отображает объект во время DRAG&DROP
function viewDragNode(curNode){
	var childnodes = curNode.childNodes.length;

	var curID = (curNode.attributes.getNamedItem('id'))?(isMozilla?curNode.attributes.getNamedItem('id').textContent:curNode.attributes.getNamedItem('id').text):"";
	var lastNode = isLastElement(curID);
	if (curNode.nodeName=="treeitem"){
		folder		= '<img src="'+ssPicPath+'f00000.gif" width="17" height="21" />';
		page		= '<img src="'+ssPicPath+'p00000.gif" width="17" height="21" />';

		Notifier="";
		if (copiedDDNode) Notifier=' <span style="color: blue">'+ssLang['copy']+'</span>';

		result_str+="<tr style=\"display:''\"><td width=100% nowrap id="+curID+">";
		result_str+=(curNode.lastChild.nodeName=='treeitem')?(folder):(page);
		result_str+="<span style=\"cursor:hand; color: Black;\">"+(isMozilla?curNode.childNodes.item(1).textContent:curNode.childNodes.item(0).text)+"</span>"+Notifier+"</td>";
		result_str+="</tr>";
	}
}

//возникает при попытке перетащить объект
function treeDragStart(nodeID, ev){
	document.body.onmouseup=treeClearDD;
	if (isMozilla) {
		event=ev;
		window.addEventListener("mousemove", treeDragObj, false);
		X = -40;
		Y = -20;
		event.preventDefault();
	}else{
		window.document.onmousemove=treeDragObj;
		X = -40;
		Y = -20;
	}
	if (isMozilla || event.button==1){
		dragID=nodeID;

		if (window.event.ctrlKey && isAcceptCopy(nodeID)){
			copiedDDNode=treeObj.nodeFromID(nodeID).cloneNode(true);
		}
		
		tree_DD.zIndex="100";
		tree_DD.style.left = event.clientX-X/2 + document.body.scrollLeft;
		tree_DD.style.top = event.clientY-Y/2 + document.body.scrollTop;
		tree_DD.style.display="";
		event.returnValue = true;

		levels = new Array()
		result_str="<div class=table style=\"cursor: hand; color: #CCCCCC; \">";
		for(i=0; i<100; i++) levels[i]=0;
		level=0;
		viewDragNode(treeObj.nodeFromID(nodeID));
		result_str+="</div>";
		tree_DD.innerHTML = result_str;
	}
}

// происходит при событии Drop
function treeDragEnd(nodeID, ev){
	tree_DD.style.display="none";
	tree_DD.innerHTML="";
	if (dragID){
		if ((dragID!=nodeID && !isInTree(dragID,nodeID) || copiedDDNode)  && isOpenedNode(nodeID)) {
			var curNode=treeObj.nodeFromID(dragID);
			var parentNode=curNode.parentNode;
			var lastNode = isLastElement(dragID);
			
			if (copiedDDNode){
				treeChangeId(copiedDDNode);
				treeObj.nodeFromID(nodeID).insertBefore(copiedDDNode,null);
			} else {
				treeObj.nodeFromID(nodeID).insertBefore(treeObj.nodeFromID(dragID),null);
				parentNode.attributes.getNamedItem('children').text=Number(parentNode.attributes.getNamedItem('children').text)-1;
			}
						
			treeObj.nodeFromID(nodeID).attributes.getNamedItem('children').text=Number(treeObj.nodeFromID(nodeID).attributes.getNamedItem('children').text)+1;
			
			if(treeObj.nodeFromID(nodeID).attributes.getNamedItem('state').text!='visible') 
				treeObj.nodeFromID(nodeID).attributes.getNamedItem('state').text='visible';
			
			if (lastNode) {
				nodeid = parentNode.attributes.getNamedItem('id').text;
				treeStr ="";
				treeLevel=levelObj(nodeid)-2;
				cr_levels(nodeid);
				viewNode(parentNode);
				if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr; else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
			} else {if (!copiedDDNode) document.getElementById("tab_"+dragID).parentNode.removeChild(document.getElementById("tab_"+dragID));}
			
			treeStr ="";
			treeLevel=levelObj(nodeID)-2;
			cr_levels(nodeID);
			viewNode(treeObj.nodeFromID(nodeID));

			if(isMozilla) document.getElementById("tab_"+nodeID).innerHTML=treeStr;
				else document.getElementById("tab_"+nodeID).outerHTML=treeStr;
			copiedDDNode=false;
			dragID=false;
		}
	}
}

//Копирует узел
function treeCopy(nodeid){
	if (isAcceptCopy(nodeid)){
		copiedNode=treeObj.nodeFromID(nodeid).cloneNode(true);
		if (!isMozilla) clipboardData.setData("Text","SiteSapiens TreeNode\r\n"+copiedNode.xml);
	}
}

//Встaвляет узел после выбранного
function treePaste(nodeid){
	if (isCopiedNode()){
		if (!isMozilla) {
			var clipBoard=clipboardData.getData("Text");
			if (clipBoard && clipBoard.indexOf("SiteSapiens TreeNode\r\n")!=-1){
				clipBoard=clipBoard.replace("SiteSapiens TreeNode\r\n","");
				copiedNode = new ActiveXObject("Msxml2.DOMDocument");
				copiedNode.async = false;
				copiedNode.resolveExternals = false;
				if (copiedNode.loadXML(clipBoard)) copiedNode=copiedNode.firstChild;
			}
		}
		if (copiedNode) {
			treeChangeId(copiedNode);
			treeObj.nodeFromID(nodeid).parentNode.insertBefore(copiedNode.cloneNode(true),treeObj.nodeFromID(nodeid));
			treeGettingUp(nodeid);
		}
	}
}

//Можно ли скопировать узел
function isAcceptCopy(nodeid){
	return treeObj.nodeFromID(nodeid).parentNode.nodeName=="treeitem";
}

//Есть ли узел для вставки
function isCopiedNode(){
	flag=false;
	if (!isMozilla) {
		var clipBoard=clipboardData.getData("Text");
		if (clipBoard && clipBoard.indexOf("SiteSapiens TreeNode\r\n")!=-1)
			flag=true;
	}
	if (!flag && copiedNode) flag=true;
	return flag;
}

//Замена Id у всех потомков нового узла
function treeChangeId(curNode){
	var childs = curNode.childNodes;
	var childnodes = childs.length;
	Last_New_Id++;
	curNode.setAttribute("id","id_New_"+Last_New_Id+"_"+curNode.attributes.getNamedItem("id").text);
	curNode.setAttribute("noactions","all");
	for(var i=0;i<childnodes;i++)
		if (childs.item(i).nodeName=="treeitem") treeChangeId(childs.item(i));
}

//Замена Id у всех потомков нового узла на указатели
function treeChangePointerId(curNode){
	var childs = curNode.childNodes;
	var childnodes = childs.length;
	Last_Pointer_Id++;
	curNode.setAttribute("id","id_Pointer_"+Last_Pointer_Id+"_"+curNode.attributes.getNamedItem("id").text);
	for(var i=0;i<childnodes;i++)
		if (childs.item(i).nodeName=="treeitem") treeChangePointerId(childs.item(i));
}

//проверка является ли источник элементом исходного узла
function isInTree(source,dest){
	obj=treeObj.nodeFromID(dest);
	sourceObj=treeObj.nodeFromID(source);
	flag=false;
	if (obj==sourceObj.parentNode) flag=true;
	while (obj.parentNode!=null && !flag) {
		if (sourceObj==obj) flag=true;
		obj=obj.parentNode;
	}
	return flag;
}

//определяет уровени для формивания levels
function cr_levels(nodeid){
	obj=treeObj.nodeFromID(nodeid);
	level_in=treeLevel;
	initTreeLevels();
	while (obj.parentNode) {
		obj=obj.parentNode;
		level_in--;
		if(isMozilla && obj.nextSibling && obj.nextSibling.nodeName=="treeitem") var lastNode=true; else
		var lastNode = (isMozilla?!!(obj.nextSibling && obj.nextSibling.nodeName=="#text" && obj.nextSibling.nextSibling):(obj.nextSibling != null));
		if (lastNode) treeLevels[level_in]=1;
		else treeLevels[level_in]=0;
	}
}

//уровень вложенности
function levelObj(nodeid){
	obj=treeObj.nodeFromID(nodeid);
	var level=0;
	while (obj.parentNode!=null) {
		obj=obj.parentNode;
		level++;
	}
	return level;
}

//Проверка первый ли элемент в узле
function isFirstElement(id){
	flag=true;
	if (treeObj.nodeFromID(id))
		if (treeObj.nodeFromID(id).previousSibling)
			if (treeObj.nodeFromID(id).previousSibling.nodeName=='treeitem' || (treeObj.nodeFromID(id).previousSibling.previousSibling && treeObj.nodeFromID(id).previousSibling.previousSibling.nodeName=="treeitem"))
				flag=false;
	return flag;
}

//Проверка последний ли элемент в узле
function isLastElement(id){
	flag=true;
	if (treeObj.nodeFromID(id))
		if (treeObj.nodeFromID(id).nextSibling)
			if (treeObj.nodeFromID(id).nextSibling.nodeName=='treeitem' || (treeObj.nodeFromID(id).nextSibling.nextSibling && treeObj.nodeFromID(id).nextSibling.nextSibling.nodeName=="treeitem"))
				flag=false;
	return flag;
}

// происходит при событии Drop при вставке до-после
function treeDragEndInsert(el, ev){
	tree_DD.style.display="none";
	tree_DD.innerHTML="";
	if (dragID){
		if (isMozilla) event=ev;
		mouseY=event.clientY + document.body.scrollTop;
		elY=calcTop(el);
		elH2=el.clientHeight/2;
		pel=el;
		while (pel.tagName!="DIV") pel=pel.parentNode;
		nodeID=pel.id.replace("tab_","");
		
		if (isAcceptPasteBeforeAfter(nodeID)) {
			var curNode=treeObj.nodeFromID(dragID);
			var parentNode=curNode.parentNode;
			var lastNode = isLastElement(dragID);

			if (copiedDDNode){
				treeChangeId(copiedDDNode);
				treeObj.nodeFromID(nodeID).parentNode.insertBefore(copiedDDNode,treeObj.nodeFromID(nodeID));
				copiedDDNode=false;
			} else {
				treeObj.nodeFromID(nodeID).parentNode.insertBefore(treeObj.nodeFromID(dragID),treeObj.nodeFromID(nodeID));
				parentNode.attributes.getNamedItem('children').text=Number(parentNode.attributes.getNamedItem('children').text)-1;				
			}
					
			treeObj.nodeFromID(nodeID).parentNode.attributes.getNamedItem('children').text=Number(treeObj.nodeFromID(nodeID).parentNode.attributes.getNamedItem('children').text)+1;
			
			
			if (lastNode) {
				nodeid = parentNode.attributes.getNamedItem('id').text;
				treeStr ="";
				treeLevel=levelObj(nodeid)-2;
				cr_levels(nodeid);
				viewNode(parentNode);
				if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr; else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
			} else document.getElementById("tab_"+dragID).parentNode.removeChild(document.getElementById("tab_"+dragID))

			if (mouseY>elY+elH2) treeGettingUp(nodeID);
						
			parentNodeID=treeObj.nodeFromID(nodeID).parentNode.attributes.getNamedItem('id').text;
			treeStr ="";
			treeLevel=levelObj(parentNodeID)-2;
			cr_levels(parentNodeID);
			viewNode(treeObj.nodeFromID(parentNodeID));
			if(isMozilla) document.getElementById("tab_"+parentNodeID).innerHTML=treeStr;
				else document.getElementById("tab_"+parentNodeID).outerHTML=treeStr;
					
			
			dragID=false;
		}
	}
}

//При наведении на элемент для вставки до-после
function treeOverInsert(el, ev){
	pel=el;
	while (pel.tagName!="DIV") pel=pel.parentNode;
	if(dragID && isAcceptPasteBeforeAfter(pel.id.replace("tab_",""))) {
		treeInsert=pel;
		treeMoveInsert(el,ev);
	}
}

//При движении для вставки до-после
function treeMoveInsert(el,ev){
	if(dragID && treeInsert) {
		if (isMozilla) event=ev;
		mouseY=event.clientY + document.body.scrollTop;
		elY=calcTop(el);
		elH2=el.clientHeight/2;
		el=treeInsert;
		if (mouseY>elY+elH2) {
			el.style.borderTop="none";
			el.style.borderBottom="solid 1px #666666";
		} else {
			el.style.borderTop="solid 1px #666666";
			el.style.borderBottom="none";
		}
	}
}

//При уходе с элемента при вставки до-после
function treeOutInsert(){
	if (treeInsert){
		treeInsert.style.borderBottom="none";
		treeInsert.style.borderTop="none";
		treeInsert=false;
	}
}

//Проверка на раскрытость узла
function isOpenedNode(nodeid){
	var curNode=treeObj.nodeFromID(nodeid);
	return (curNode.attributes.getNamedItem('state').text=="visible" || curNode.attributes.getNamedItem('children').text<1)
}


//При наведении на элемент для вставки в
function treeOverInsertIn(el, ev){
	pel=el;
	while (pel.tagName!="DIV") pel=pel.parentNode;
	nodeID=pel.id.replace("tab_","");
	if((dragID && ((dragID!=nodeID && !isInTree(dragID,nodeID)) || copiedDDNode)) && isOpenedNode(nodeID)){
		treeInsertIn=el;
		treeInsertIn.className="tree_ico_selected";
	}
}

//При уходе с элемента при вставки в
function treeOutInsertIn(){
	if (treeInsertIn){
		treeInsertIn.className="tree_ico";
		treeInsertIn=false;
	}
}

//Доступность для вставки до-после
function isAcceptPasteBeforeAfter(nodeid){
	flag=true;
	flag=flag && treeObj.nodeFromID(nodeid).parentNode.nodeName=="treeitem";
	flag=flag && (!isInTree(dragID,nodeid) || copiedDDNode);
	return flag;
}

//Доступность для удаления
function isDeletedNode(nodeid){
	flag=true;
	flag=flag && treeObj.nodeFromID(nodeid).parentNode.nodeName=="treeitem";
	return flag;
}

//Устанговить выделение строки
function nodeOver(el){
	if (!oldSelectedLine) el.className=treeClassOver;
}

//Снять выделение строки
function nodeOut(el){
	if (!oldSelectedLine) el.className="";
}

//Вычисление адреса страницы
function getUrl(node){
	var nodeVar=node.getAttribute('variable');
	var path="";
	if(node.parentNode.getAttribute('id'))
		path=getUrl(node.parentNode)+((nodeVar)?nodeVar+"/":"");
	else path=nodeVar;
	return path;
}


//если отпустить кнопку мыши (скрывает слой с перетаскиваемым объектом)
function treeClearDD(){

	document.body.onmouseup=null;
	tree_DD.style.display="none";
	tree_DD.innerHTML="";
	treeOutInsert();
	dragID=false;
}

//Спрятать контекстное меню
function hidemenu(){
	var context_menu=document.getElementById('context_menu');
	context_menu.style.visibility="hidden";
	document.body.onmousedown=null;
	oldSelectedLine.className=""
	oldSelectedLine=false;
}

//Разрешает Контекстное меню
function acceptRightClick(){
	acceptContextMenu=true;
}

//Показать контекстное меню
function showmenu(id, evt){
	if (acceptContextMenu){
		oldSelectedLine=document.getElementById("tab_"+id).firstChild;
		oldSelectedLine.className=treeClassSelected;
		acceptContextMenu=false;	
		document.body.onmousedown=hidemenu;
		if(isMozilla) event=evt;
		var context_menu=document.getElementById('context_menu');
		var tempContextMenuHTML="";
		var noactions = (treeObj.nodeFromID(id).attributes.getNamedItem('noactions'))?treeObj.nodeFromID(id).attributes.getNamedItem('noactions').text:"";
		for (i=0; i<contextMenuItems.length; i++){
			switch (i){
				case 0: 
						if (!isFirstElement(id)) tempContextMenuHTML+='<a href="#" onmousedown="return treeGettingUp('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 1: 
						if (!isLastElement(id)) tempContextMenuHTML+='<a href="#" onmousedown="return treeGettingDown('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 3: 
						if (!(noactions=="add" || noactions=="all")) tempContextMenuHTML+='<a href="#" onmousedown="return treeAddSubItem('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 4: 
						if (isAcceptCopy(id)) tempContextMenuHTML+='<a href="#" onmousedown="return treeCopy('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 5: 
						if (isCopiedNode()) tempContextMenuHTML+='<a href="#" onmousedown="return treePaste('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 6: 
						if (isDeletedNode(id)) tempContextMenuHTML+='<a href="#" onmousedown="return treeDelete('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 8: 
//						if (!(noactions=="all")) tempContextMenuHTML+='<a href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
//						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				case 9: 
						if (!(noactions=="properties" || noactions=="all"))	tempContextMenuHTML+='<a href="#" onmousedown="return treeItemProperties('+"'"+id+"'"+')">'+contextMenuItems[i]+'</a>';
						else tempContextMenuHTML+='<a class="disable" href="#" onmousedown="return false">'+contextMenuItems[i]+'</a>';
				break;
				default :
					tempContextMenuHTML+=contextMenuItems[i];			
				break
			}
		}
		context_menu.innerHTML=tempContextMenuHTML;
		
		var rightedge = document.body.clientWidth-event.clientX;
		var bottomedge = document.body.clientHeight-event.clientY;
		
		if (rightedge < context_menu.offsetWidth)
		context_menu.style.left = document.body.scrollLeft + event.clientX - context_menu.offsetWidth;
		else
		context_menu.style.left = document.body.scrollLeft + event.clientX;
		if (bottomedge < context_menu.offsetHeight)
		context_menu.style.top = document.body.scrollTop + event.clientY - context_menu.offsetHeight;
		else
		context_menu.style.top = document.body.scrollTop + event.clientY;
		context_menu.style.visibility = "visible";
		
		setTimeout("acceptRightClick()",100);
	}
	return false;
}



function treeNode(name,id){
	//Свойства
	this.file=false;
	this.nodeId=id;
	this.object=false;
	this.name=name;
	
	//Методы
	this.init=treeNodeInit;
	this.print=treeNodePrint;
	this.showError=treeNodeShowError;
}

//Инициализация загрузки узла дерева
function treeNodeInit(id){
	if(isMozilla){
		isIE=false;
		this.file=new XMLHttpRequest();
	} else {
		this.file = new ActiveXObject("Microsoft.XMLHTTP");
	}

	var treeCheckStateStr='\
	if (el.file.readyState == 4){\
		if (el.file.status==0 || el.file.status==200){\
			if (isMozilla) {\
				el.object = document.implementation.createDocument("","doc", null);\
				el.object = el.file.responseXML;\
			}\
			else {\
				el.object = new ActiveXObject("Msxml2.DOMDocument");\
				el.object.loadXML(el.file.responseText);\
			}\
			checkGlobalMessage(el.object);\
			el.print();\
		} else {\
			el.showError(ssLang["Error::DataLoadingError"]);\
		}\
	}\
	';
	
	eval('this.file.onreadystatechange =  function (){var el='+this.name+'; '+treeCheckStateStr+'}');

//	var treeFilePath = 'tree_node.xml';
	this.file.open("GET", noCache(treeFilePath+"?id="+this.nodeId) , true);
	try {
		this.file.send(null);
	} catch (e){
		this.showError(ssLang["Error::DataFileNotFound"]);
	}

}


//вывод ошибки связанной с загрузкой узла
function treeNodeShowError(text){
	var nodeid=this.nodeId;
	var curNode = treeObj.nodeFromID(nodeid);
	curNode.attributes.getNamedItem('state').text='hidden';
	for (i=0; i<curNode.childNodes.length; i++) 
		if (curNode.childNodes.item(i).nodeName=='treeitem'){
			curNode.removeChild(curNode.childNodes.item(i));
			i--;
	}
	treeStr ="";
	treeLevel=levelObj(nodeid)-2;
	cr_levels(nodeid);
	viewNode(curNode, '<span class="ss_error">'+text+'</span>');
	if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr;
	else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
	eval (this.name+'=null');
}

//вывод загруженного узла
function treeNodePrint(){
	var nodeid=this.nodeId;
	var curNode = treeObj.nodeFromID(nodeid);
	visible = curNode.attributes.getNamedItem('state').text=='visible';
	if(!visible)	{
		curNode.attributes.getNamedItem('state').text='hidden';
		for (i=0; i<curNode.childNodes.length; i++) 
			if (curNode.childNodes.item(i).nodeName=='treeitem'){
				curNode.removeChild(curNode.childNodes.item(i));
				i--;
			}
		treeStr ="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(curNode);
	} else {
		curNode.attributes.getNamedItem('state').text='visible';
		curNode.parentNode.replaceChild(this.object.documentElement,curNode);
		curNode = treeObj.nodeFromID(nodeid);
		treeStr="";
		treeLevel=levelObj(nodeid)-2;
		cr_levels(nodeid);
		viewNode(curNode);
	}
	if(isMozilla) document.getElementById("tab_"+nodeid).innerHTML=treeStr;
	else document.getElementById("tab_"+nodeid).outerHTML=treeStr;
	eval (this.name+'=null');
}
	
//Посылка данных без ожидания ответа
function treeSaveStatus(id, status){
	if(isMozilla){
		isIE=false;
		var file=new XMLHttpRequest();
	} else {
		var file = new ActiveXObject("Microsoft.XMLHTTP");
	}

	file.open("GET", noCache(treeFilePath+"?id="+id+"&status="+status) , true);
	try {
		file.send(null);
	} catch (e){

	}
}
