var layerTree = new LayerTree();

function LayerTree()
{
	var layers = new Array();

	this.Initialize = function(inPanel)
	{
		tree.Initialize(inPanel);

		tree.addEventListener(this);

		tree.redraw();
	}

	this.addLayerNode = function(layer, parentNode)
	{
		var node;
		var subLabel;
/*		
		if (layer.getMaxScale() != 0 && layer.getMinScale() != 0)
		{
			subLabel = "（1/" + layer.getMinScale() + "～1/" + layer.getMaxScale() + "）";
		}
		else if (layer.getMaxScale() != 0)
		{
			subLabel = "（ ～1/" + layer.getMaxScale() + "）";
		}
		else if (layer.getMinScale() != 0)
		{
			subLabel = "（1/" + layer.getMinScale() + "～ ）";
		}
*/		
		node = tree.addNode(layer.getName(), subLabel, parentNode, layer.getLayerIcon(), layer.getLegendPath(), layer);

		node.setCheck(layer.isVisibility());
		if (layer.isVisibility())
		{
			node.expand();
		}
		else
		{
			node.collapse();
		}
		var i = 0;
		for (i = 0; i < layer.getChildren().length; i++)
		{
			this.addLayerNode(layer.getChildren()[i], node);
		}

		layers.push(layer);
	}

	this.onCheckChanged = function(sender)
	{
		var i = 0;
		var allNodes = tree.getAllNodes();
		var changedLayers = new Array();
		var changed = "";
		
		for (i = 0; i < allNodes.length; i++)
		{
			var layer = allNodes[i].getUserData();
			
			if (allNodes[i].isChecked() != layer.isVisibility())
			{
				if (layer.getLayerId() != "")
				{
					changedLayers.push(layer.getLayerId());
				}
				layer.setVisible(allNodes[i].isChecked());
			}
		}

		if (sender.isChecked())
		{
			if (changedLayers.length > 0)
			{
				// まとめて表示 
				geoAccess.SetLayersVisible(changedLayers, true);
			}
		}
		else
		{
			if (changedLayers.length > 0)
			{
				// まとめて非表示 
				geoAccess.SetLayersVisible(changedLayers, false);
			}
		}
	}

	this.addLayer = function (id, name, parent, visible, maxScale, minScale, layerIcon)
	{
		var layer = new Layer(id, name, parent, visible, maxScale, minScale, layerIcon);

		if (parent != null)
		{
			parent.addChild(layer);
		}

		return layer;
	}
	
	this.allHide = function()
	{
		var i = 0;
		var allNodes = tree.getAllNodes();
		
		for (i = 0; i < allNodes.length; i++)
		{
			if (allNodes[i].isChecked())
			{
				return false;
			}
		}
		return true;
	}
	
	this.setLayerVisible = function(layerId, visible)
	{
		var i = 0;
		var allNodes = tree.getAllNodes();
		
		for (i = 0; i < allNodes.length; i++)
		{
			var layer = allNodes[i].getUserData();
			
			if (layer.getLayerId() == layerId)
			{
//				tree.onCheckClick(i, visible);
				tree.checkAndRedraw(i, visible);
				layer.setVisible(visible);
				break;
			}
		}
	}

	this.getLayerVisible = function(layerId)
	{
		var i = 0;
		var allNodes = tree.getAllNodes();
		var visible = false;
		
		for (i = 0; i < allNodes.length; i++)
		{
			var layer = allNodes[i].getUserData();
			
			if (layer.getLayerId() == layerId)
			{
				visible = layer.isVisibility();
				break;
			}
		}
		return visible;
	}
	
	this.getLayer = function(layerId)
	{
		var layer = null;
		var allNodes = tree.getAllNodes();
		
		for (var i = 0; i < allNodes.length; i++)
		{
			var layer = allNodes[i].getUserData();
			
			if (layer.getLayerId() == layerId)
			{
				return layer;
			}
		}
		return null;
	}
	
}

function Layer(inLayerId, inName, inParent, inVisible, inMaxScale, inMinScale, inLayerIcon)
{
	var name = inName;
	var parent = inParent;
	var layerId = inLayerId;
	var children = new Array();
	var visible = (inVisible != 0);
	var maxScale = inMaxScale;
	var minScale = inMinScale;
	var layerIcon = inLayerIcon;

	this.getName = function()
	{
		return name;
	}

	this.getParent = function()
	{
		return parent;
	}

	this.addChild = function(child)
	{
		children.push(child);
	}

	this.getChildren = function()
	{
		return children;
	}

	this.getLayerId = function()
	{
		return layerId;
	}

	this.isVisibility = function()
	{
		return visible;
	}

	this.setVisible = function(newValue)
	{
		visible = newValue;
	}
	
	this.getMaxScale = function()
	{
		return maxScale;
	}
	
	this.getMinScale = function()
	{
		return minScale;
	}
	
	this.getLayerIcon = function()
	{
		return layerIcon;
	}
	
	this.getLegendPath = function()
	{
		return "layericon/" + layerId + "/layer" + layerId + ".jpg";
	}
}

