//Copyright John M Mizzi (MizziSoft) 2007

function buildTree(input_result)
{
	var objCount = -1;
	var objArray = new Array();
	var treeObj = new DataObject("MAIN", "~ARRAY~");
	var tempArray = input_result.split("##\n");
	var levelArray = new Array(100);
	var level = 0;

	levelArray[level] = treeObj;

	for (var loop = 0; loop < tempArray.length; loop++)
	{
		//document.writeln("---[" + loop +  "]: " + tempArray[loop] + "<br>");

		if (tempArray[loop].indexOf("~[") == 0)
		{
			level++;
			var arrayName = tempArray[loop].substr(2);
			var parentObj = new DataObject(arrayName, "~ARRAY~");
			levelArray[level] = parentObj;
			levelArray[level - 1].addDOChild(parentObj);
			//document.writeln("Parent:" + levelArray[level - 1].key + ", Node:" + levelArray[level].key + ", Children:" + levelArray[level - 1].value.length + "<br>");

			//addArray(treeArray, levelArray, level, "~ARRAY~");
			//document.writeln("[" + loop +  "] level:" + level + ", Array Name:" + arrayName + ", Value:" + tempArray[loop] +  "<br>");
		}
		else if (tempArray[loop].indexOf("~]") == 0)
		{
			level--;
		}
		else if (tempArray[loop].indexOf("|") > 0)
		{
			var valueArray = tempArray[loop].split("|");
			var valueObj = new DataObject(valueArray[0], valueArray[1]);
			levelArray[level].addDOChild(valueObj);
			//addArray(treeArray, levelArray, (level + 1), valueArray[1]);
			//document.writeln("---[" + loop +  "] level:" + (level + 1) + ", Index :" + valueArray[0] + ", Value:" + valueArray[1] +  "<br>");
		}

		//document.writeln("---[" + loop +  "] Tree Count:" + treeArray.objDOType +  "<br>");
		
	}

	//alert("Count:" + tempArray.length);

	/*
	for (var loop = 0; loop < treeArray.length; loop++)
	{
		document.writeln("***[" + loop +  "]: " + treeArray[loop] + "<br>");
	}
	*/

	//alert("Tree Count:" + treeObj.isDOParent());

	//var treeObj2 = new DataObject("MAIN2", "~ARRAY~");
	//var returnObj = findKeyDO(treeObj, "185");
	//viewDO(returnObj, 0);

	//viewDO(treeObj2, 0);
	//copyDO(treeObj, treeObj2);
	//viewDO(treeObj2, 0);

	return(treeObj);
}


function DataObject(input_key, input_value)
{
	//Properties
	this.key = input_key;
	this.value = input_value;
	if (input_value == "~ARRAY~")
		this.value = new Array();

	this.parent = null;

	//Methods
	this.isDOParent = isDOParent;
	this.setDOParent = setDOParent;
	this.addDOChild = addDOChild;
	this.getDOType = getDOType;
	this.getDOSize = getDOSize;
}


function isDOParent()
{
	return(isArray(this.value));
}


function setDOParent(input_parentObj)
{
	this.parent = input_parentObj;
}



function addDOChild(input_object)
{
	if (this.isDOParent())
	{
		var childIndex = 0;
		if (this.value.length > 0)
			childIndex = this.value.length;
		input_object.setDOParent(this);
		this.value[childIndex] = input_object;
		//document.writeln("Added Key:" + input_object.key + ", Value:" + input_object.value + ", Len:" + this.value.length + ", Parent:" + input_object.parent.key + "<br>");
	}
	else document.writeln("NOT Added Key:" + input_object.key + ", Value:" + input_object.value + "<br>");
	return(this.value);
}


function getDOType()
{
	var dataType = this.value.constructor.toString().replace("\n", "");
	if (dataType.indexOf("{") > 0)
	   dataType = dataType.substr(0, dataType.indexOf("{") - 1);
	return(dataType);
}


function getDOSize()
{
	return(this.value.length);
}




function viewDO(input_object, input_level)
{
	for (var loop = 0; loop < input_level; loop++)
	{
		document.write("*");
	}


	if (input_object.isDOParent())
	{
		document.writeln(" Key:" + input_object.key + ", Children:" + input_object.value.length +  "<br>");
		for (var loop = 0; loop < input_object.value.length; loop++)
		{
			viewDO(input_object.value[loop], input_level + 1);
		}
	}
	else
	{
		document.writeln(" Key:" + input_object.key + ", Value:" + input_object.value + ", Type:" + input_object.getDOType() +  "<br>");
	}
}




function viewDO2(input_object, input_level)
{
	var viewStr = "";

	for (var loop = 0; loop < input_level; loop++)
	{
		viewStr = viewStr + "*";
	}


	if (input_object.isDOParent())
	{
		viewStr = viewStr + (" Key:" + input_object.key + ", Children:" + input_object.value.length +  "\n");
		for (var loop = 0; loop < input_object.value.length; loop++)
		{
			viewStr = viewStr + viewDO2(input_object.value[loop], input_level + 1);
		}
	}
	else
	{
		viewStr = viewStr + (" Key:" + input_object.key + ", Value:" + input_object.value + ", Type:" + input_object.getDOType() +  "\n");
	}
   return(viewStr);
}


function copyDO(input_from, input_to)
{
	if (input_from.isDOParent())
	{
		for (var loop = 0; loop < input_from.value.length; loop++)
		{
			var childObj = input_from.value[loop];
			if (childObj.isDOParent())
			{
				var parentObj = new DataObject(childObj.key, "~ARRAY~");
				input_to.addDOChild(parentObj);
				copyDO(childObj, parentObj);
			}
			else
			{
				var valueObj = new DataObject(childObj.key, childObj.value);
				input_to.addDOChild(valueObj);
			}
		}
	}
	else
	{
		var childObj = new DataObject(input_from.key, input_from.value);
		input_to.addDOChild(childObj);
	}
}




function findKeyDO(input_object, input_key)
{
	var returnObj = null;

	if (input_object == null)
	   return(null);

	if (input_object.key == input_key)
		return(input_object);

	if (input_object.isDOParent())
	{
		for (var loop = 0; loop < input_object.value.length; loop++)
		{
			var childObj = input_object.value[loop];
			if (childObj.isDOParent())
			{
				returnObj = findKeyDO(childObj, input_key);
				if (returnObj != null) break;
			}
			else
			{
				if (childObj.key == input_key)
				{
					returnObj = childObj;
					break;
				}
			}

		}
	}

	return(returnObj);
}



function findKeyLevel(input_object, input_key)
{
	var returnObj = null;

	//if (input_object.key == input_key)
	//	return(input_object);

	if (input_object.isDOParent())
	{
		for (var loop = 0; loop < input_object.value.length; loop++)
		{
			var childObj = input_object.value[loop];
			if (childObj.key == input_key)
			{
				returnObj = childObj;
				break;
			}
		}
	}

	return(returnObj);
}



function removeRecordDO(input_object, input_key)
{
   var returnObj = null;

   if (input_object.isDOParent())
   {
      var objectIndex = -1;
      for (var loop = 0; loop < input_object.value.length; loop++)
      {
         var childObj = input_object.value[loop];
         if (childObj.key == input_key)
         {
            returnObj = childObj;
            objectIndex = loop;
            break;
         }
      }
      if (objectIndex >= 0)
         input_object.value.splice(objectIndex, 1);
   }

   return(returnObj);
}




