//------------------------------------------------------------------------------
#include "xmltools.h"
#include "wxTools.h"
#include "tcDebug.h"

//------------------------------------------------------------------------------
wxXmlNode* findNode(wxXmlNode* node,wxString nodename)
{
	if(node==NULL) return NULL;
	wxXmlNode* iNode;
	iNode=node->GetChildren();
	while (iNode != NULL)
	{
		wxString name=iNode->GetName();
		if(name==nodename) return iNode;
		iNode=iNode->GetNext();
	}
	return NULL;
}
//------------------------------------------------------------------------------
wxXmlNode* findNodeOnAttribute(wxXmlNode* node,wxString nodename,wxString Attribute,wxString val)
{
	/*wxXmlNode* iNode;
	iNode=node->GetChildren();
	while (iNode != NULL)
	{
		if((iNode->GetName()==nodename)&&(iNode->GetPropVal(Attribute,_T(""))==val)) return iNode;
		iNode=iNode->GetNext();
	}*/
	return NULL;
}
//------------------------------------------------------------------------------
wxXmlNode* findFirstNode(wxXmlNode* node,wxString nodename)
{
	wxXmlNode* mas[10]; //макс уровень вложенности
	int pos=0;
	mas[pos] = node->GetChildren();
	while (mas[pos] != NULL)
	{
		if(mas[pos]->GetName()==nodename) return mas[pos];
		if(mas[pos]->GetChildren()!=NULL)
		{
			pos++;
			mas[pos]=mas[pos-1]->GetChildren();
		} else
		{
			//если не идёт дальше пытаемся подняться в верх по дереву
			while (true)
			{
				mas[pos] = mas[pos]->GetNext();
				if(mas[pos]==NULL)
				{
					if(pos>0) pos--; else break;
				} else
				{
					break;
				}
			}
		}
	}
	return NULL;
}
//------------------------------------------------------------------------------
//Найти первый узел с заданным атрибутом без рекурсии
wxXmlNode* findFirstNodeOnAttribute(wxXmlNode* node,wxString nodename,wxString Attribute,wxString val)
{
/*
	wxXmlNode* mas[10]; //макс уровень вложенности
	int pos=0;
	mas[pos] = node->GetChildren();
	while (mas[pos] != NULL)
	{
		if((mas[pos]->GetName()==nodename)&&(mas[pos]->GetPropVal(Attribute,_T(""))==val)) return mas[pos];
		if(mas[pos]->GetChildren()!=NULL)
		{
			pos++;
			mas[pos]=mas[pos-1]->GetChildren();
		} else
		{
			//если не идёт дальше пытаемся подняться в верх по дереву
			while (true)
			{
				mas[pos] = mas[pos]->GetNext();
				if(mas[pos]==NULL)
				{
					if(pos>0) pos--; else break;
				} else
				{
					break;
				}
			}
		}
	}
*/
	return NULL;
}

//------------------------------------------------------------------------------
//поиск узла по пути "type->objects->list->filter->column"
wxXmlNode* findNodeOnPath(wxXmlNode* node,wxString path)
{
	if(node==NULL) return NULL;
	path=path+_T("->");
	while(true)
	{
		wxString name=getBeforeFirst(path,_T("->"));
		node=findNode(node,name);
		if(node==NULL) return NULL;
		path=getAfterFirst(path,_T("->"));
		if(path==_T("")) break;
	}
	return node;
}
//------------------------------------------------------------------------------
//Ищет первый CDATA и возврещяет его содержимое
wxString getCdataValue(wxXmlNode* node)
{
	if(node==NULL) return _T("");
	wxXmlNode* cdata=findNode(node,_T("cdata"));
	if(cdata==NULL) return _T("");
	return cdata->GetContent();
}
//------------------------------------------------------------------------------
//Присвоить значение первому CDATA узлу если его нет то создать
void setCdataValue(wxXmlNode* node,wxString val)
{
	if(node==NULL) return;
	wxXmlNode* cdata=findNode(node,_T("cdata"));	
	if(cdata==NULL) cdata=new wxXmlNode(node,wxXML_CDATA_SECTION_NODE, wxS("cdata"), wxS(""));
	cdata->SetContent(val);
}
//------------------------------------------------------------------------------
