
	var width;
	var categoryBar;
	
	width = 160;

	function Initialize()
	{
		c = document.getElementById('NAVIGATION_CONTAINER');

		c.style.verticalAlign = 'top';
		
		categoryBar = new CategoryBar();
		categoryBar.SetProperty('Top', 14);
		categoryBar.SetProperty('Left', 0);
		categoryBar.SetProperty('Width', width);
		categoryBar.Parent = c;
		categoryBar.Subscribe('CategoryClicked', CategoryClicked, null, true);
		categoryBar.Initialize();

		ReadCategories();
		
		NavigateToCurrentLocation();
	}
	
	function NavigateToCurrentLocation()
	{
		var i;
		var j;
		var k;
		var f;
		var t;
		var n;

		for (i = 0; i < siteStructure.length; i ++)
		{
			// Check if current location corresponds to the category
			
			n = CalculateLocation();
			
			if (n == siteStructure[i][1])
			{
				categoryBar.Category(i).SetProperty('Selected', true);
				
				SelectCategory(categoryBar.Category(i));

				return;
			}
			else
			{
				// Check if current location corresponds to some item inside the category
				f = false;
				
				if (siteStructure[i][3] && (siteStructure[i][3].length > 0))
				{
					for (j = 0; j < siteStructure[i][3].length; j ++)
					{
						if (IsLocationContained(siteStructure[i][3][j], n))
						{
							categoryBar.Category(i).SetProperty('Selected', true);
							
							SelectCategory(categoryBar.Category(i));
							
							t = categoryBar.Category(i).GetProperty('Contents');

							for (k = 0; k < t.GetProperty('NodeCount'); k ++)
							{
								FindAndExpand(t.Nodes(k), n);
							}
							
							return;
						}
					}
				}
			}
		}
	}
	
	function FindAndExpand(node, tag)
	{
		var i;
		var n;
		
		if (node.Tag == tag)
		{
			node.GetProperty('TreeView').SelectNode(node);

			return;
		}

		n = FindNode(node, tag);
		
		if (n)
		{
			node.SetIsExpanded(true);
			
			for (i = 0; i < node.NodeCount(); i ++)
			{
				FindAndExpand(node.Nodes(i), tag);
			}
		}
	}
	
	function FindNode(node, tag)
	{
		var i;
		var n;

		if (node.Tag == tag)
		{
			return node;
		}
		else
		{
			for (i = 0; i < node.NodeCount(); i ++)
			{
				n = FindNode(node.Nodes(i), tag);
				
				if (n)
				{
					return n;
				}
			}

			return null;
		}
	}

	var IsLocationContained = function(item, target)
	{
		var i;

		if (item[1] == target)
		{
			return true;
		}
		else if (item[3] && (item[3].length > 0))
		{
			for (i = 0; i < item[3].length; i ++)
			{
				if (IsLocationContained(item[3][i], target))
				{
					return true;
				}
			}
			
			return false;
		}
		else
		{
			return false;
		}
	}

	function ReadCategories()
	{
		var i;

		for (i = 0; i < siteStructure.length; i ++)
	    {
			categoryBar.AddCategory(siteStructure[i][0], siteStructure[i][1], siteStructure[i][4]);
		}
	}

	var SelectCategory = function(object)
	{
		var i;
		var j;
		var k;
		var n;
		var c;
		var t;
		var s;
		var t0;
		
		n = categoryBar.GetProperty('CategoryCount');

		for (k = 0; k < n; k ++)
		{
			t = object.GetProperty('Text');

			if (categoryBar.Category(k).GetProperty('Selected'))
			{
				if (categoryBar.Category(k).GetProperty('ItemContainer'))
				{
				}
				else
				{
					for (i = 0; i < siteStructure.length; i ++)
					{
						if ((siteStructure[i][0] == t) && (siteStructure[i][3] && (siteStructure[i][3].length > 0)))
						{
							categoryBar.Category(k).ShowItemContainer();
		
							c = categoryBar.Category(k).GetProperty('ItemContainer');

							t0 = new TreeView();
							t0.SetProperty('AutoSizeHeight', true);
							t0.SetProperty('BorderColor', categoryBar.GridLineColor);
							t0.SetProperty('Position', 'relative');
							t0.SetProperty('Left', 0);
							t0.SetProperty('Top', 0);
							t0.SetProperty('Width', width - 6);
							t0.SetProperty('Parent', c);
							
							// Read Images
							for (j = 0; j < treeViewImages.length; j ++)
						    {
								t0.AddImage(treeViewImages[j]);
							}
							
							t0.Initialize();
					
							t0.Subscribe('NodeSelected', NodeSelected, t0, true);
							
							categoryBar.Category(k).SetProperty('Contents', t0);
		
							for (j = 0; j < siteStructure[i][3].length; j ++)
							{
								ReadSiteNode(siteStructure[i][3][j], t0);
							}
						}				
					}
				}
			}
			else
			{
				if (categoryBar.Category(k).GetProperty('ItemContainer'))
				{
					categoryBar.Category(k).HideItemContainer();
				}
				else
				{
				}
			}
		}
	}

	var CategoryClicked = function(type, arguments, object)
	{
		var i;
		var j;
		var k;
		var m;
		var n;
		var c;
		var t;
		var s;
		var t0;

		n = categoryBar.GetProperty('CategoryCount');

		for (k = 0; k < n; k ++)
		{
			t = object.GetProperty('Text');

			if (categoryBar.Category(k).GetProperty('Selected'))
			{
				if (categoryBar.Category(k).GetProperty('ItemContainer'))
				{
				}
				else
				{
					for (i = 0; i < siteStructure.length; i ++)
					{
						if ((siteStructure[i][0] == t) && (siteStructure[i][3] && (siteStructure[i][3].length > 0)))
						{
							categoryBar.Category(k).ShowItemContainer();
		
							c = categoryBar.Category(k).GetProperty('ItemContainer');

							t0 = new TreeView();
							t0.SetProperty('AutoSizeHeight', true);
							t0.SetProperty('BorderColor', categoryBar.GridLineColor);
							t0.SetProperty('Position', 'relative');
							t0.SetProperty('Left', 0);
							t0.SetProperty('Top', 0);
							t0.SetProperty('Width', width - 6);
							t0.SetProperty('Parent', c);
							
							// Read Images
							for (j = 0; j < treeViewImages.length; j ++)
						    {
								t0.AddImage(treeViewImages[j]);
							}
							
							t0.Initialize();
					
							t0.Subscribe('NodeSelected', NodeSelected, t0, true);
							
							categoryBar.Category(k).SetProperty('Contents', t0);
		
							for (j = 0; j < siteStructure[i][3].length; j ++)
							{
								ReadSiteNode(siteStructure[i][3][j], t0);
							}
						}				
					}
				}
			}
			else
			{
				if (categoryBar.Category(k).GetProperty('ItemContainer'))
				{
					categoryBar.Category(k).HideItemContainer();
				}
				else
				{
				}
			}
		}
		
		m = CalculateLocation();

		n = object.GetProperty('Tag');
		
		if (n && (m != n))
		{
			location = n;
		}
	}

	var NodeSelected = function(type, arguments, object)
	{
		var n;
		var m;
		
		m = CalculateLocation();

		n = object.GetProperty('SelectedNode');

		if (n)
		{
			n.SetIsExpanded(true);
		}
		
		if (n && n.Tag && (m != n.Tag))
		{
			location = n.Tag;
		}
	}
	
	var CalculateLocation = function()
	{
		var i;
		var n;
		
		n = location.toString();

		i = n.lastIndexOf('#');
		
		while (i >= 0)
		{
			n = n.slice(0, i);

			i = n.lastIndexOf('#');
		}
		
		return n;
	}

	function ReadCategoryStructure(categoryName, control)
	{
		var i;
		var j;

		for (i = 0; i < siteStructure.length; i ++)
	    {
			if ((siteStructure[i][0] == categoryName) && (siteStructure[i][3] && (siteStructure[i][3].length > 0)))
			{
				for (j = 0; j < siteStructure[i][3].length; j ++)
				{
					ReadSiteNode(siteStructure[i][3][j], control);
				}
			}
		}
	}
	
	var ReadSiteNode = function(siteNode, treeNode)
	{
		var i;
		var n;
		var m;

		n = new TreeNode();

		n.SetText(siteNode[0]);
		
		n.Tag = siteNode[1];

		n.SetImageIndex(siteNode[2]);

		treeNode.AddNode(n);

		if (siteNode[3] && (siteNode[3].length > 0))
		{
			for (i = 0; i < siteNode[3].length; i ++)
		    {
				ReadSiteNode(siteNode[3][i], n);
			}
		}
	}
