﻿/*
--설명
XML 파일을 사용하기 쉽도록 .Net의 DataTable과 유사하게 변환하기 위함.
*/
var CDataTable = function ()
{
	this.ColumnCount = 0;
	this.RowCount = 0;
	this.Columns = new Array();
	this.Rows = new Array();
}

/*
--설명
DataTable의 각 Row를 처음부터 찾아서 해당하는 값을 가진 행이 있다면 그 행의 Index만 리턴함.
*/
CDataTable.prototype.GetRowIndex = function(ColumnName, ColumnValue)
{
	if (CFindRep.IsArray(ColumnName))
	{
		for (var rw = 0; rw < this.RowCount; rw++)
		{
			var IsFound = true;
			for (var i = 0; i < ColumnName.length; i++)
			{
				if (this.Rows[rw][ColumnName[i]] != ColumnValue[i])
				{
					IsFound = false;
					break;
				}
			}
			if (IsFound)
				return rw;
		}
	}
	else
	{
		for (var rw = 0; rw < this.RowCount; rw++)
		{
			if (this.Rows[rw][ColumnName] == ColumnValue)
			{
				return rw;
			}
		}
	}
	
	return -1;
}

CDataTable.prototype.GetRow = function(ColumnName, ColumnValue)
{
	var RowIndex = this.GetRowIndex(ColumnName, ColumnValue);
	if (RowIndex != -1)
		return this.Rows[RowIndex];
	else
		return null;
}

CDataTable.prototype.GetRows = function (ColumnName, ColumnValue)
{
	var aRow = new Array();

	var aRowIndex = this.GetRowIndices(ColumnName, ColumnValue);
	if (aRowIndex.length == 0)
		return aRow;

	for (var rw = 0; rw < aRowIndex.length; rw++)
	{
		aRow[rw] = this.Rows[aRowIndex[rw]];
	}

	return aRow;
}

/*
--설명
DataTable의 각 Row를 처음부터 찾아서 해당하는 값을 가진 행이 있다면 모든 행의 Index를 리턴함.
*/
CDataTable.prototype.GetRowIndices = function (ColumnName, ColumnValue)
{
	var aRowIndex = new Array();
	var n = -1;

	if (CFindRep.IsArray(ColumnName))
	{
		for (var rw = 0; rw < this.RowCount; rw++)
		{
			var IsFound = true;
			for (var i = 0; i < ColumnName.length; i++)
			{
				if (this.Rows[rw][ColumnName[i]] != ColumnValue[i])
				{
					IsFound = false;
					break;
				}
			}
			if (IsFound)
				aRowIndex[++n] = rw;
		}
	}
	else
	{
		for (var rw = 0, rw2 = this.RowCount; rw < rw2; rw++)
		{
			if (this.Rows[rw][ColumnName] == ColumnValue)
			{
				aRowIndex[++n] = rw;
			}
		}
	}

	return aRowIndex;
}

CDataTable.prototype.FilterRows = function (ColumnName, ColumnValue)
{
	var aRowIndex = this.GetRowIndices(ColumnName, ColumnValue);
	if (aRowIndex.length == 0)
		return null;

	var dt = new CDataTable();
	for (var cl = 0; cl < this.ColumnCount; cl++)
	{
		dt.Columns[cl] = this.Columns[cl];
	}
	dt.ColumnCount = dt.Columns.length;

	var aRow = new Array();
	for (var rw = 0; rw < aRowIndex.length; rw++)
	{
		aRow[rw] = this.Rows[aRowIndex[rw]];
	}
	dt.Rows = aRow;
	dt.RowCount = aRow.length;

	return dt;
}
CDataTable.prototype.FilterRow = function (ColumnName, ColumnValue)
{
	return this.FilterRows([ColumnName], [ColumnValue]);
}

CDataTable.GetDataTableByObject = function (Obj)
{
	var dt = new CDataTable();

	var cl = -1;
	dt.Columns[++cl] = "Name";

	var rw = -1;
	for (Prop in Obj)
	{
		if (!Obj.hasOwnProperty(Prop) || typeof Obj[Prop] == "function")
			continue;


		rw++;
		dt.Rows[rw] = new Object();
		dt.Rows[rw].Name = Prop;

		var ObjChild = Obj[Prop];
		for (var PropChild in ObjChild)
		{
			if (!ObjChild.hasOwnProperty(PropChild) || typeof ObjChild[PropChild] == "function")
				continue;

			dt.Rows[rw][PropChild] = ObjChild[PropChild];

			if (rw == 0)
			{
				dt.Columns[++cl] = PropChild;
			}
		}
	}

	if (rw == 0)
		return null;

	dt.RowCount = rw + 1;
	dt.ColumnCount = cl + 1;

	return dt;
}

CDataTable.prototype.ToString = function()
{
	var Cols = "";
	for (var cl = 0, cl2 = this.ColumnCount; cl < cl2; cl++)
	{
		Cols += "\t" + this.Columns[cl];
	}
	Cols = Cols.substr(1);

	var RowList = "";
	for (var rw = 0, rw2 = this.RowCount; rw < rw2; rw++)
	{
		var Row = "";
		for (var cl = 0, cl2 = this.ColumnCount; cl < cl2; cl++)
		{
			Row += "\t" + this.Rows[rw][this.Columns[cl]];
		}
		Row = Row.substr(1);

		RowList += "\n" + Row;
	}
	RowList = RowList.substr(1);

	return Cols + "\n" + RowList;
}

