//Common:

//Public: Returns Main Page
function GetMainPage()
{
    var win = this;
    while( win.parent && win.parent != win )//Find topmost page
    {
        win = win.parent;
    }
    return win;

	if (this.frames.length>1)//Not Supported by Netscape
	{
		//this = default.aspx
		return this;
	}
	else
	{
		//this = AppFrame, TreeFrame, HiddenMenuFrame, or TaskPaneFrame
		return this.parent;
	}
}

//Public: Returns Application space Frame
function GetAppFrame()
{
	//return GetMainPage().frames["AppFrame"];
	return GetMainPage().document.getElementById("AppFrame");
}

//Public: Returns Tree Frame
function GetTreeFrame()
{
  return GetMainPage().document.getElementById("TreeFrame");
}

//Public: Returns Navigation Tree
function GetNavigationTree()
{
  return GetTreeFrame().contentWindow.igtree_getTreeById("Tree");
}

function AddNewNode2NavTree(name, tag, select, parentTag, targetUrl, targetFrame)
{
    var tree = GetNavigationTree();
    var selNode = (parentTag) ? 
        getNodeByTag(parentTag, tree, true) : 
        tree.getSelectedNode();
    if (!selNode) return;
    var newNode = selNode.addChild(name);
    if (!newNode) return;
    newNode.setTag(tag);
    if (targetUrl) newNode.setTargetUrl(targetUrl);
    if (targetFrame) newNode.setTargetFrame(targetFrame);
    if (select) newNode.setSelected(true);
    return newNode;
}

function SelectNode4NavTree(tag)
{
    var tree = GetNavigationTree();
    var selNode = tree.getSelectedNode();
    if (!selNode) return;
    var node = getNodeByTag(tag, selNode, false);
    if (node) node.setSelected(true);
}

function UpdateNavTreeNode(name, tag, parentTag)
{
    var tree = GetNavigationTree();
    var selNode = tree.getSelectedNode();
    if (! selNode) return;
    if (! selNode.hasChildren()) return;
    var node = getNodeByTag(tag, selNode, false);
	if (!node) return;
	node.setText(name);
	if (parentTag != node.getParent().getTag())
	{
	    var parNode = getNodeByTag(parentTag, tree, true);
	    if (parNode) moveNode(parNode, node);
	}
}

function RemoveNodeFromNavTree(tag)
{
    var tree = GetNavigationTree();
    var selNode = tree.getSelectedNode();
    if (! selNode) return;
    var node = getNodeByTag(tag, selNode, false);
    if (node) node.remove();
}

function NavTreeRemoveChilds ( parentNode )
{
    if (!parentNode ||
        !parentNode.hasChildren()) return null;
    var nodes = (typeof(parentNode.getChildNodes) != "undefined") ? 
        parentNode.getChildNodes() : parentNode.getNodes();
	var node;
    for(var i = 0; i < nodes.length; i++)
	{
		node = nodes[i];
		if (node) node.remove();
	}
}

function NavTreeUpdateChildNode ( parentNode, text, targetFrame, targetUrl, tag )
{
    if ( !parentNode )
		return;
    var nodes = (typeof(parentNode.getChildNodes) != "undefined") ? 
        parentNode.getChildNodes() : parentNode.getNodes();
	var node;
	
    for(var i = 0; i < nodes.length; i++)
		if ( nodes[i].getTag() == tag )
		{
			node = nodes[i];
			break;
		}
	if ( !node ) 
		node = parentNode.addChild( text );
    node.setTag( tag );
    node.setTargetUrl( targetUrl );
    node.setTargetFrame( targetFrame );
}

function moveNode(parentNode, curNode)
{
    newNode = parentNode.addChild(curNode.getText());
    newNode.setTag(curNode.getTag());
    newNode.setTargetUrl(curNode.getTargetUrl());
    newNode.setTargetFrame(curNode.getTargetFrame());
    
    if (curNode.hasChildren())
    {
        var nodes = curNode.getChildNodes();
	    var node;
        for(var i = 0; i < nodes.length; i++)
	    {
		    node = nodes[i];
		    moveNode(newNode, node);
        }
    }
    curNode.remove();
}

function getNodeByTag(tag, parentNode, deep)
{
    if (typeof(parentNode.hasChildren) != "undefined" &&
        !parentNode.hasChildren()) return null;
    var nodes = (typeof(parentNode.getChildNodes) != "undefined") ? 
        parentNode.getChildNodes() : parentNode.getNodes();
	var node;
    for(var i = 0; i < nodes.length; i++)
	{
		node = nodes[i];
		if (node.getTag() == tag) return node;
		if (deep)
		{
		    var resNode = getNodeByTag(tag, node, deep);
			if (resNode) return resNode;
		}
	}
	return null;
}

//Public: Refreshes tree node having DemandLoad handler
function RefreshTreeNode( NodeId )
{
    //Likely, this code specific for tree implementation.
    var treeContentWin = GetTreeFrame().contentWindow;
    var node = GetNavigationTreeNode( NodeId );
    var ts = treeContentWin.igtree_treeState[ node.getTreeId() ];
	treeContentWin.igtree_updateNodeToggle(ts, "M_"+node.element.id, true);	
	treeContentWin.__doPostBack(ts.UniqueId,node.element.id+":DemandLoad");
}

//Public: Returns Navigation Tree Node
function GetNavigationTreeNode(NodeId)
{
  return GetTreeFrame().contentWindow.igtree_getNodeById(NodeId);
}


//Public: Returns TaskPane Frame
function GetTaskPaneFrame()
{
	return GetMainPage().frames["TaskPaneFrame"];
}

function GetProgressFrame()
{
	return GetMainPage().frames["ProgressFrame"];
}

function CallForTreePostback(Assembly, TypeName, Args)
{
	var Arguments = Assembly+","+TypeName+","+Args;
	GetTreeFrame().contentWindow.__doPostBack("ShellTreeController",Arguments);
}

function PostBackAppPage(Control, Arg)
{
  GetAppFrame().contentWindow.__doPostBack(Control, "0,"+Arg);
}

function LoadTask(src)
{
    var TaskFrame = this.parent.document.getElementById("TaskPaneFrame");
    
    if (TaskFrame != null)
    {
      if (TaskFrame.src != src)
      {
        TaskFrame.contentWindow.location.replace('task.aspx');//location.replace does not add page to history
      }
    }
}

//Private (not to be called directly by user)
function Up(level)
{
    var TreeFrame = this.parent.document.getElementById("TreeFrame");
    var Tree = TreeFrame.contentWindow.igtree_getTreeById("Tree");
    var SelectedNode = Tree.getSelectedNode();
    if (SelectedNode)
    {
      var Parent = SelectedNode.getParent();
      if (Parent)
      {
		for(i=2;level>=i;i++)
		{
			Parent = Parent.getParent();
		}
      }
    }
    
    if (Parent) Parent.setSelected(true);
}

/*===============Tree delegation======================*/

function OnAfterNodeEdit(TreeId, NodeId)
{
	var Index = 0;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame()."+ClientHandlerName+"(TreeId,ItemId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"AfterNodeEdit");	
}

function OnAfterEndNodeEdit(TreeId, NodeId)
{
	var Index = 1;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"AfterEndNodeEdit");	
}

function OnAfterNodeSelectionChange(TreeId, NodeId)
{
	var Index = 2;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"AfterNodeSelectionChange");	

}

function OnAfterNodeUpdate(TreeId, NodeId)
{
	var Index = 3;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"AfterNodeUpdate");	

}

function OnBeforeBeginNodeEdit(TreeId, NodeId)
{
	var Index = 4;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnBeforeEndNodeEdit(TreeId, NodeId, newValue)
{
	var Index = 5;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId, newValue);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnBeforeNodeSelectionChange(TreeId, oldNodeId, newNodeId)
{
	var Index = 6;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,oldNodeId, newNodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,newNodeId,"BeforeNodeSelectionChange");	

}

function OnBeforeNodeUpdate(TreeId, NodeId, Text)
{
	var Index = 7;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId, Text);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnNodeChecked(TreeId, NodeId, bCheck)
{
	var Index = 8;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId, bCheck);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"NodeChecked");	

}

function OnEditKeyDown(TreeId, NodeId,keycode)
{
	var Index = 9;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId, keycode);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnEditKeyUp(TreeId, NodeId,keycode)
{
	var Index = 10;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId, keycode);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnInitializeTree(TreeId)
{
	var Index = 11;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"InitializeTree");	

}

function OnKeyDown(TreeId, keycode)
{
	var Index = 12;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,keycode);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnKeyUp(TreeId, keycode)
{
	var Index = 13;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId, keycode);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"");	

}

function OnNodeClick(TreeId, NodeId)
{
	var Index = 14;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"NodeClick");	

}

function OnNodeCollapse(TreeId, NodeId)
{
	var Index = 15;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"NodeCollapse");	

}

function OnNodeExpand(TreeId, NodeId)
{
	var Index = 16;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	HandleTreeEvent(Index, ClientHandlerResult,NodeId,"NodeExpand");	

}

function OnDemandLoad(TreeId, NodeId)
{
	var Index = 17;
	var ClientHandlerName = GetClientFunctionNameTree(Index);

	if (ClientHandlerName != "")
	{
		var ClientHandlerResult = eval("result = GetAppFrame().contentWindow."+ClientHandlerName+"(TreeId,NodeId);");
	}
	else
	{
		ClientHandlerResult = false;
	}
	
	//If Postback is not canceled:
	if (!ClientHandlerResult)
		HandleTreeEvent(Index, ClientHandlerResult,NodeId,"DemandLoad");	

}

function GetTreeProxyEventArray()
{
	// [0]  = AppAfterBeginNodeEdit
	// [1]  = AppAfterEndNodeEdit
	// [2]  = AppAfterNodeSelectionChange
	// [3]  = AppAfterNodeUpdate
	// [4]  = AppBeforeBeginNodeEdit
	// [5]  = AppBeforeEndNodeEdit
	// [6]  = AppBeforeNodeSelectionChange
	// [7]  = AppBeforeNodeUpdate
	// [8]  = AppNodeChecked
	// [9]  = AppEditKeyDown
	// [10] = AppEditKeyUp
	// [11] = AppInitializeTree
	// [12] = AppKeyDown
	// [13] = AppKeyUp
	// [14] = AppNodeClick
	// [15] = AppNodeCollapse
	// [16] = AppNodeExpand
	// [17] = AppDemandLoad
	
	return GetAppFrame().contentWindow.TreeProxyEvents;
}

function GetTreeProxyId()
{
	return GetAppFrame().TreeProxyId;
}
function GetClientFunctionNameTree(Index)
{
  var Events = GetTreeProxyEventArray();
	if (Events != null)
	{
	  var Event = Events[Index];
	  return Event[0];
	}
	else
	  return "";
}

function IsHandleOnServerTree(Index)
{
	var Events = GetTreeProxyEventArray();
	if (Events != null)
	{
	  var Event = Events[Index];
	  return Event[1];
	}
	else
	  return false;
}

function GetNodeEventArguments(NodeId, EventName)
{
	var oNode = GetTreeFrame().igtree_getNodeById(NodeId);
	
	var Text = oNode.getText();
	var Tag = oNode.getTag();
	
	var Enabled = oNode.getEnabled();
	var Expended = oNode.getExpanded();
	var Selected = oNode.getSelected();
	var hasChildren = oNode.hasChildren();
	var hasCheckbox = oNode.hasCheckbox();
	
	if(hasCheckbox)
		var Checked = oNode.getChecked();
	else
		Checked = false;
	
	result = "1,"+EventName+","+NodeId+","+Text+","+Tag+","+Checked+","+Enabled+","+Expended+","+Selected+","+hasChildren+","+hasCheckbox;
	return result;
}

function HandleTreeEvent(Index, ClientHandlerResult, NodeId, EventName)
{
	var HandleOnServer = IsHandleOnServerTree(Index);

	if ((!ClientHandlerResult)&(HandleOnServer))
	{
		//do postback to handle this event on server:
		var TreeProxyId = GetTreeProxyId();
		var Args = GetNodeEventArguments(NodeId, EventName);
		GetAppFrame().__doPostBack(TreeProxyId,Args);
	}
}
