/*
Запись одного элемента
id - идентификатор
name - наименование
child_count - количество подкатегорий

Пример:

<content>
  <id>0</id><name>Name 0</name><child_count>1213</child_count>
</content>
*/


/**
 * класс содержит ветку дерева
*/
//class TreeNode
//begin 
function TreeNode(nodeId)
{
    this.id       = nodeId;
    this.parent   = -1;
    this.level    = 0;
    this.flagOpen = 0;
    this.name     = '';
    this.action   = '';
    this.child_count = 0;//для узлов = 'x'
    this.OnClickFunc = 'OnClickOpenClose';
    this.OnLoadFunc  = 'OnClickProduct';
    this.path     = -1;//путь к данному элементу по парентам
    this.lines    = '';//карта отступов
    this.nodeList = new Array();//список элементов в ветке
    
    this.addNode       = TreeNodeAdd;//добавить элемент
    this.delNode       = TreeNodeDel;//удалить элемент
	this.getById       = TreeNodeGetById;//выбрать элемент по Id
	this.getByPath     = TreeNodeGetByPath;//выбрать элемент на основании пути
	this.getHTML       = TreeNodeGetHTML;//вернуть HTML отображение ветки
	this.needLoad      = TreeNodeCheckNeedLoad;
						 //проверяет надо ли закачивать данные с сервера?
	this.ImportXML     = TreeNodeImportXML;//затащить потомков из XML
} 

/**
 *проверяет надо ли закачивать данные с сервера?
*/
function TreeNodeCheckNeedLoad()
{
	return( this.nodeList.length < this.child_count );
}
/**
 * Добавляет элемент
 * @param Node - добавляемый элемент
*/
function TreeNodeAdd(Node)
{
	Node.level  = this.level+1;
	Node.parent = this.id;
	Node.path   = this.path+', '+Node.id;
	Node.lines  = this.lines+'1';
	this.nodeList[this.nodeList.length] = Node;
}

/**
 * Удаляет элемент
 * @param Id - Id удаляемого элемента
*/
function TreeNodeDel(Id)
{
	var indexId = this.getById(Id);
	if(indexId>=0)
	{
	  this.nodeList.splice(indexId, 1);
	}
}

/**
 * выбрать элемент на основании пути
*/
function TreeNodeGetByPath(path)
{
	//alert('path.length = '+path.length+'\npath='+path);
	if(path.length==0){return this;}
	if(path.length==1)
	{
		if(path[0]==0)
		{
			return this;
		}
		else
		{
		  var index = this.getById(path[0]);
		  var node = this.nodeList[index];
		  //alert(index+'\n'+node);
		  return(node);
		}
	}
	if(path.length>1)
	{
		var index = this.getById(path[0]);
		var node = this.nodeList[index];
		//alert('this.id='+this.id+'\n'+path+'\n'+index+'\n'+node);
		var lpath = path.slice(1,path.length);
		var res=node.getByPath(lpath);
		return(res);
	}
}

/**
 * Возвращает индекс элемента в списке по Id
 * @param Id - Id элемента
 * @return - integer
*/
function TreeNodeGetById(Id)
{
	var i=0;
	while(i<this.nodeList.length && this.nodeList[i].id!=Id)
	{
		i++;
	}
	if(i==this.nodeList.length){i=-1;}
	return(i);
}

/**
 * Возвращает HTML отображение ветки
 * @return - string
*/
function TreeNodeGetHTML(icon, lines)
{
	var s='';
	var i;
	var j;
	var licon;
	//отобразить себя
	//alert(this.child_count);
	var llines = new Array();
	if(this.id==0){s=s+'<table width=100% border=0><tr><td valign="top">';}
	for(i=0;i<lines.length;i++){llines[i]=lines[i];}
	llines[llines.length]=icon;
	//alert(llines);
	s=s+'<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>';
	//s=s+'<div style="height:18">';
	for(i=0;i<this.level;i++)
	{
	  //alert('level='+this.level+'\nllines.length='+llines.length);
	  if(llines[i]=='l')
      {
	    s=s+'<td width=12><img border="0" src="../images/jscripts/tree/images_tree/space.gif" align="absbottom" ></td>';
	  }
	  else
	  {
		s=s+'<td width=12><img border="0" src="../images/jscripts/tree/images_tree/space.gif" align="absbottom" ></td>';
	  }
	}
	if(this.child_count>0)
	{
		s=s+'<td width=12><a href="javascript: '+this.OnClickFunc+'(\''+this.path+'\')">';
		if(this.flagOpen==1)
		{s=s+'<img border="0" src="../images/jscripts/tree/images_tree/minus.gif">';}
		else
		{s=s+'<img border="0" src="../images/jscripts/tree/images_tree/plus.gif">';}
		s=s+'</a></td>';
		s=s+'<td>&nbsp;<a href="javascript: '+this.OnClickFunc+'(\''+this.path+'\')"" class="with_category">'+this.name+'</a></td>';
	}
	else
	{
		if(icon=='t')
		{s=s+'<td width=12><img border="0" src="../images/jscripts/tree/images_tree/space.gif" ></td>';}
		else
		{s=s+'<td width=12><img border="0" src="../images/jscripts/tree/images_tree/space.gif" ></td>';}
		s=s+'<td>&nbsp;<a href="javascript:'+this.OnLoadFunc+'('+this.id+',\''+this.name+'\')'+'" class="with_products">'+this.name+'</a></td>';
	}
	s=s+'</tr></table>';
	//s=s+'</div>';
	if(this.flagOpen==1)
	{
    	for(i=0;i<this.nodeList.length;i++)
	    {
	    	if(this.nodeList.length==i+1)
	    	{licon='u';}
	    	else
	    	{licon='t';}
	    	for(j=0;j<llines.length;j++)
            {
              if(llines[j]=='u'){llines[j]='l';}
            }
            if(this.id==0 && i==Math.round(this.nodeList.length/2))
            {s=s+'</td><td valign="top">';}
		    s=s+this.nodeList[i].getHTML(licon, llines);
    	}
	}
	if(this.id==0){s=s+'</td></tr></table>';}
	return(s);
}

function TreeNodeImportXML(XML)
{
	var i=0;
    var subXml;
    while(i<XML.childNodes.length && XML.childNodes[i].nodeName!='content'){i++;}
    subXml = XML.childNodes[i];//gettingXML.childNodes.length-1];
    
    var oneRec;
    var locL = new Array();
    var id;
    var name;
    var child_count;
    var j;
    //alert(subXml.childNodes.length);
    for(i=0;i<subXml.childNodes.length;i++)
    {
	   if(subXml.childNodes[i].nodeName=='category')
	    {
	    	//alert(i);
		    oneRec = subXml.childNodes[i];
	    	id=-1;
            child_count=0;
            name='Сервер вернул пустую строку';
		    for(j=0;j<oneRec.childNodes.length;j++)
		    {
		    	if(oneRec.childNodes[j].firstChild!=null)
		    	{
		    	  if(oneRec.childNodes[j].nodeName=='id')
		    	  {id=oneRec.childNodes[j].firstChild.nodeValue;}
		    	  if(oneRec.childNodes[j].nodeName=='name')
		    	  {name=unescape(oneRec.childNodes[j].firstChild.nodeValue);}
		    	  if(oneRec.childNodes[j].nodeName=='child_count')
		    	  {child_count=oneRec.childNodes[j].firstChild.nodeValue;}
		        }	    
		    	//Lestnica[Lestnica.length] = Array(id, pid, mark, name, tip);
		    }
		    //alert(id+', '+name+', '+child_count);
	    	var node    = new TreeNode(id);
	    	node.name   = name;
	    	node.child_count   = child_count;
	    	this.addNode(node);
	    }
    }
    this.child_count=this.nodeList.length;
}
//end
//class TreeNode