
var gsIndent= "&nbsp;&nbsp;&nbsp;&nbsp;";

function DisplayTreeItem(aDesc,sValue)
{
	this.m_aDesc = aDesc;
	this.m_sText = aDesc[aDesc.length-1];
	this.m_sValue= sValue;
	this.m_nDecendents =0;
	this.m_nLevel =aDesc.length;

	this.m_bSelected=false;
	return this;
}

var gDisplayTreeIdCounter = 0;;
var gDisplayTreesById = new Array();

function DisplayTree(oRootSpan)
{
	this.m_oRootSpan = oRootSpan;
	this.m_aNodes = new Array();
	this.m_aNodesBySpec =new Array();
	

	this.m_TreeId = gDisplayTreeIdCounter++;
	
	gDisplayTreesById[this.m_TreeId] = this;
	return this;
}


DisplayTree.prototype.AddItem = DisplayTree_AddItem;
function DisplayTree_AddItem(sItemSpec,sDelim,sValue)
{
	var aSpecItems = sItemSpec.split(sDelim);
	
	for (var x = 0; x < aSpecItems.length-1; x++)
	{
		var parentDescArray =aSpecItems.slice(0,x+1) ;
		var parentSpec = parentDescArray.join(" ");
		if (this.m_aNodesBySpec[parentSpec] == null)
		{
		
			var parentItem = new DisplayTreeItem(parentDescArray,null);
			parentItem.m_nDecendents =1;
			this.m_aNodes[this.m_aNodes.length] =parentItem;
			this.m_aNodesBySpec[parentSpec]=parentItem;	

		}
		else
		{
			this.m_aNodesBySpec[parentSpec].m_nDecendents++;
		}
	}
	var newItem = new DisplayTreeItem(aSpecItems,sValue);
	this.m_aNodes[this.m_aNodes.length] = newItem;
	this.m_aNodesBySpec[aSpecItems.join(" ")]=newItem;	
	
}

function DisplayTree_CompareItems(a,b)
{
	var i=0;
	for ( ; (i < a.m_aDesc.length-1) && (i < b.m_aDesc.length-1); i++)
	{
		if (a.m_aDesc[i] <  b.m_aDesc[i] )
		{
			return -1;
		}
		else if (a.m_aDesc[i] >  b.m_aDesc[i] )
		{
			return 1;
		}
	}
	
	var AatCat = (a.m_nDecendents > 0) || (i < (a.m_aDesc.length-1));
	var BatCat = (b.m_nDecendents > 0) || (i < (b.m_aDesc.length-1));
	
	if (AatCat == BatCat)
	{
		if (a.m_aDesc[i] <  b.m_aDesc[i] )
		{
			return -1;
		}
		else if (a.m_aDesc[i] >  b.m_aDesc[i] )
		{
			return 1;
		}
		else
		{
			return 0;
		}
	}
	else
	{
		if (AatCat)
		{
			return -1;
		}
		else
		{
			return 1;
		}
	}

	
}



DisplayTree.prototype.SortItems = DisplayTree_SortItems;
function DisplayTree_SortItems()
{

	this.m_aNodes.sort(DisplayTree_CompareItems);
}	
	




DisplayTree.prototype.Render = DisplayTree_Render;
function DisplayTree_Render()
{
	var sRenderStr = '<select Id="DispTree' + this.m_TreeId+ 'Select" name="DispTree' + this.m_TreeId+ 'Select" multiple size="30" onChange="DisplayTree_OnSelChange(\''+this.m_TreeId+'\')">';
	for (var x = 0; x < this.m_aNodes.length; x++)
	{
		var sX = x;

		sRenderStr += "<option value='" + sX + "'>"; 
		for (var y = 0; y < this.m_aNodes[x].m_nLevel -1;y++)
		{
			sRenderStr += gsIndent;
		}
		sRenderStr += this.m_aNodes[x].m_sText + "</option>\n";
		
	}
	

	sRenderStr += '</select>';
	
	this.m_oRootSpan.innerHTML = sRenderStr;
	
}

function DisplayTree_OnSelChange(sTreeId)
{	
	var oTree = gDisplayTreesById[sTreeId];
	var sel = document.getElementById('DispTree' + sTreeId+ 'Select');
	var numOpts = sel.options.length;

	for (var nOptNum = 0; nOptNum < numOpts; )
	{
		
		var bIsSelected = sel.options[nOptNum].selected;

		if (bIsSelected )
		{
			var nDescLen = oTree.m_aNodes[nOptNum].m_aDesc.length;
			for (nOptNum++; nOptNum <numOpts; nOptNum++)
			{
				if (oTree.m_aNodes[nOptNum].m_aDesc.length <= nDescLen) 
				{
					break;
				}
				sel.options[nOptNum].selected = true;
				
			}
		}
		else
		{
			nOptNum++;
		}
	}
}


DisplayTree.prototype.SelectAll = DisplayTree_SelectAll;
function DisplayTree_SelectAll()
{
	var sel = document.getElementById('DispTree' + this.m_TreeId+ 'Select');
	var numOpts = sel.options.length;
	for (var nOptNum = 0; nOptNum < numOpts;nOptNum++)
	{
		sel.options[nOptNum].selected =true;
	}

}


DisplayTree.prototype.GetSelection = DisplayTree_GetSelection;
function DisplayTree_GetSelection(sDelim)
{
	var aRet = new Array();
	var sel = document.getElementById('DispTree' + this.m_TreeId+ 'Select');
	var numOpts = sel.options.length;
	for (var nOptNum = 0; nOptNum < numOpts;nOptNum++)
	
	{
		if (sel.options[nOptNum].selected && (this.m_aNodes[nOptNum].m_sValue !=null ))
			aRet[aRet.length] = this.m_aNodes[nOptNum].m_sValue;
	}
	return aRet.join(sDelim);
}












