var m_lyrMgrTree = '_tLyrMgr';
var m_lytMgrContainer = 'divTree';
var m_lyrNodeStyle = "";
var m_activeNodeStyle = "ActiveLayer";
var m_greyedNodeStyle = "GreyedLayer";
var m_groupNodeStyle = "GroupedLayer";
var m_mapNodeStyle = "MapNode";
var m_mapSourceId = "";
function btnApplyLyrMgr()
{
	if(!sessionExpired)
	{
		if (PageMethods && PageMethods.ApplyLayerManager)
		{
			var tree = _FindTree(m_lyrMgrTree);
			if (tree != null)
			{
				var state = GetTreeState(tree);
				try{showLoading();}catch(e){}	
				PageMethods.ApplyLayerManager(escape(state),HandleApplyLyrMgr);				
			}
		}
	}
	else
		HandleSessionExpired();
}
function GetTreeState(tree)
{
	//NodeId, checkedstate,expanedstate:  ordered
	var sb = new Array();
	sb.push("<T v=\"" + (tree.GetNodesMovedStatus() ? "1" : "0") + "\">");
	var nodes = tree.GetNodes();
	for (var i=0;i<nodes.length;i++)	
		SetNodeState(nodes[i],sb);
	sb.push("</T>");
	tree.ResetNodesMovedStatus();
	return sb.join('');
}
function SetNodeState(node,stateArray)
{
	var close = true;
	if (node.NodeType != "LG")
	{
		stateArray.push("<" + node.NodeType + " v=\"");		
		stateArray.push(node.Id + "^" + (node.IsChecked() ? "1" : "0") + "^" + (node.IsExpanded() ? "1\" >" : "0\" >"));
	}
	else
		close = false;

	var children = node.Children;
	if (children != null)
	{
		for (var i=0;i<children.length;i++)
			SetNodeState(children[i],stateArray);
	}
	if (close)
		stateArray.push("</" + node.NodeType + ">");
}
function HandleApplyLyrMgr(imageUrls)
{   	
	try{hideLoading();}catch(e){};
	SetMapImages(imageUrls);
}
function RefreshLayerManager(xmlDoc)
{
	
	if (xmlDoc != null)
	{
		var nodeList = xmlDoc.getElementsByTagName("LyrMgr"); 
		if (nodeList != null && nodeList.length > 0)
		{     
			var tree = _FindTree(m_lyrMgrTree);
			var expNodes = null;			
			if (tree != null)
			{
				expNodes = tree.GetExpandedNodes();				
			}
	        
			if (m_ie5)
				_loadTree(nodeList[0].text,m_lyrMgrTree,m_lytMgrContainer);
			else
				_loadTree(nodeList[0].textContent,m_lyrMgrTree,m_lytMgrContainer);
	        
			tree = _FindTree(m_lyrMgrTree); //get new tree
			if (tree != null)
			{
				tree.RegisterDragDrop(HandleDragDrop);			
				if (expNodes != null)
				{
					for (var i=0;i<expNodes.length;i++)
						tree.ExpandNode(expNodes[i]);
				}
			}
		}
	}
}
function RedrawLayerManager(tree)
{   
	
	var expNodes = tree.GetExpandedNodes();	
	var container = document.getElementById(m_lytMgrContainer);
	if (container)
	{
		container.innerHTML = tree.GetHtml();
		tree.SetInitialExpand();	
		for (var i=0;i<expNodes.length;i++)
		{
			tree.ExpandNode(expNodes[i]);
		}
		//reset active node
		var ae=tree.GetActiveElement();
		if (ae != null)
			tree.SetActiveNode(ae.id,tree.GetStyles().Active);
	}
}
function ZoomToLayer()
{
	_InvokeMethod('PageMethods.ZoomToLayer(mapId,lyrId,styles.Regular,styles.Active,styles.Greyed,styles.Group,styles.RootLevel,HandleServerResponse);');
}
function ZoomToLyrScale()
{
	_InvokeMethod('PageMethods.ZoomToLayerScale(mapId,lyrId,styles.Regular,styles.Active,styles.Greyed,styles.Group,styles.RootLevel,HandleServerResponse);');	
}
function _InvokeMethod(method)
{
	if(!sessionExpired)
	{    
		if (PageMethods && PageMethods.ZoomToLayerScale)
		{	
			var tree = _FindTree(m_lyrMgrTree);
			if (tree != null && tree.GetLastCtxNode() != null)
			{        
				var lyrId = tree.GetLastCtxNode().Id;
				if (lyrId != null)
				{
					var styles = tree.GetStyles();
					var idx = lyrId.indexOf(":");
					var mapIdx = lyrId.substr(0,idx);
					var mapId = tree.GetNode(mapIdx).Id;
					lyrId = lyrId.substr(idx+1);
					eval(method);
				}
			}
		}
	}
	else    
		HandleSessionExpired();
}
function SetActiveLayer()
{
	if(!sessionExpired)
	{    
		if (PageMethods && PageMethods.SetActiveLayer)
		{
			try
			{
				var tree = _FindTree(m_lyrMgrTree);
				if (tree != null && tree.GetLastCtxNode() != null)
				{   
					var lyrId = tree.GetLastCtxNode().Id;
					lyrId = lyrId.substr(lyrId.indexOf(":")+1);
					PageMethods.SetActiveLayer(lyrId,HandleSetActiveLayer);
				}
			}            
			catch (e){alert('ExceptionHandler::SetActiveLayer' + e.message);}
		}
	}
	else    
		HandleSessionExpired();
}
function HandleSetActiveLayer(success)
{
	if (success)
	{
		var tree = _FindTree(m_lyrMgrTree);		
		if (tree != null && tree.GetLastCtxNode() != null)
			tree.SetActiveNode(tree.GetLastCtxNode().Id,tree.GetStyles().Active);
	}
}
function ExpandLegends()
{
	var tree = _FindTree(m_lyrMgrTree);
	if (tree != null && tree.GetLastCtxNode() != null)
		tree.GetLastCtxNode().ExpandAll();
}
function CollapseLegends()
{
	var tree = _FindTree(m_lyrMgrTree);
	if (tree != null && tree.GetLastCtxNode() != null)	
		_CollapseIfLegend(tree.GetLastCtxNode());	
}
function _CollapseIfLegend(node)
{
	var childCount = node.GetChildCount();
	if (childCount == 1 && node.GetChild(0).NodeType == "LG")	
		node.Collapse();
	else if(childCount > 0)
	{
		for (var i=0;i<childCount;i++)
			_CollapseIfLegend(node.GetChild(i));
	}
}
function CheckAllLayers(checked)
{
	var tree = _FindTree(m_lyrMgrTree);
	if (tree != null && tree.GetLastCtxNode() != null)
		tree.GetLastCtxNode().CheckNode(checked,true);
	btnApplyLyrMgr();
}
function _MoveCtxMenus()
{   
	var node = document.getElementById('cmLayer');
	if (node != null)
		document.body.appendChild(node);
	node = document.getElementById('cmMap');
	if (node != null)
		document.body.appendChild(node);    
}
function don(){return;}
function InitializeLyrMgr(mapSourceId)
{	
	
	//register drag-drop
	var tree = _FindTree(m_lyrMgrTree);
	tree.RegisterDragDrop(HandleDragDrop);
	var styles = tree.GetStyles();	
	m_lyrNodeStyle = styles.Regular;
	m_activeNodeStyle = styles.Active;
	m_greyedNodeStyle = styles.Greyed;
	m_groupNodeStyle = styles.Group;
	m_mapNodeStyle = styles.RootLevel;
	//Hide Apply if no layers in tree
	var count=0;
	for (var i=0;i<tree.GetNodeCount();i++)
	{
		count += tree.GetNode(i).GetChildCount();
	}	
	var applyBtn = document.getElementById(m_btnApply);
	if (applyBtn)
		applyBtn.style.display = (count > 0) ? "block" : "none";
	
	if (mapSourceId != null)
		m_mapSourceId = mapSourceId;
}

function VerifyLyrMgr(mapSourceId)
{
	if (m_mapSourceId != mapSourceId)
	{
		try
		{
			var styles = _FindTree(m_lyrMgrTree).GetStyles();
			PageMethods.GetLayerManagerTree(styles.Regular,styles.Active,styles.Greyed,styles.Group,styles.RootLevel,HandleLyrMgrUpdate);
			//Update new mapsourceId
			m_mapSourceId = mapSourceId;
		}
		catch(e){}
	}
}

function HandleLyrMgrUpdate(updateScript)
{
	try
	{
		eval(updateScript);
	}
	catch(e){}
}
function HandleDragDrop(tree, draggedNode, droppedNode)
{	
	//checks to see if node is movable
	//check 1: soure and target cannot be same.
	if (draggedNode != null && droppedNode != null &&
		draggedNode.Id != droppedNode.Id)
	{	
		var draggedId = draggedNode.Id;
		var droppedId = droppedNode.Id;
		
		//check 2: both nodes should be from same map. Hence, there ids should have same index
		var m1 = draggedId.substring(0, draggedId.indexOf(":"));
		var m2 = droppedId.substring(0, droppedId.indexOf(":"));
		if (m1 == m2)
		{			
			//check 3: a group layer may not become child of group.						
			if (draggedNode.NodeType == "G")
			{
				var parentNode = tree.GetParentNode(droppedNode.Id);
				if (parentNode != null && parentNode.NodeType == "G")
					return;//cannot drop group within another group.
			}
			tree.UpdateChecked();			
			if (tree.MoveNode(draggedId, droppedId))
			{
				RedrawLayerManager(tree);				
			}
		}
	}
}