/*
* Network monitor
* Javascript part
* Copyright Lars Op den Kamp 2009
* License LGPL
* 
* Beetje uitleg over deze tool:
* Dit is een projectje om een beetje te klooien met OO in javascript.
* Het origineel dat ik gemaakt had was wat minder fancy en geschreven in PHP.
*
* TODO: scaling van details klopt nog niet
*/

/* The array with nodes */
var lastDepth = 0;
var netFX = [];
var selectedNode = null;
var netMoving = 0;
var netDrawWaiting = 0;
var jsGraph;

function getGraph() {
	if ($('jsGraph') == null)
	{
		jsGraph = new jsGraphics('container-rechts');
		
		var _t = new Element('div');
		_t.setAttribute('id', 'jsGraph');
		_t.setStyle({visibility: 'hidden'});
		$('mc1').insert(_t);
	}
	return jsGraph;
}

function _netAddFX(fx) {
	for (var i = 0; i < fx.length; i++)
	{
		netFX[netFX.length] = fx[i];
	}
}

function netClearScreen(doItNow) {
	getGraph().clear();
	
	for (var i = 0; i < netNodes.length; i++)
	{
		netNodes[i].setVis(0);
		if (doItNow == undefined || doItNow == 1) netNodes[i].draw();
	}
}

function netDrawChanges() {
	for (var i = 0; i < netNodes.length; i++)
	{
		netNodes[i].draw(0);
	}
	
	new Effect.Parallel(netFX, { duration: 1.00 });
	netFX = [];
	
	setTimeout("_endMove()", 1000);
}

function _createAccordion()
{
	if ($('details_container') == null) return;
	
	var dAccordion = new accordion('details_container');
	
	dAccordion.activate($$('#details_container .accordion_toggle')[1]);
}

function _endMove()
{
	if (netDrawWaiting == 1)
	{
		getGraph().paint();
		netDrawWaiting = 0;
	}
	
	netMoving = 0;
}

function _netCreateDetailsPart(id, title)
{
	var _e = new Element('h2');
	_e.setAttribute('class', 'accordion_toggle');
	_e.update(title);
	
	var _f = new Element('div');
	_f.setAttribute('class', 'accordion_content');
	_f.setStyle({height: '0px'});
	
	var _h = new Element('table');
	_h.setAttribute('class', 'net_details_table');
	_h.setAttribute('id', 'tbl_'+id);
	
	_f.update(_h);
	
	$('details_container').insert(_e);
	$('details_container').insert(_f);
}

function _netClearDetails() {
	var _cont = new Element('div');
	_cont.setAttribute('id', 'details_container');
	$('details_container').replace(_cont);
	_netCreateDetailsPart('system', 'System');
	_netCreateDetailsPart('network', 'Network');
	
	if (selectedNode.getType() != 'internet') _netCreateDetailsPart('hdd', 'Harddisks');
	
	_createAccordion();
}

function _netAddDetail(part, item, value) {
	var _tr = new Element('tr');
	
	var _td1 = new Element('td');
	_td1.setAttribute('class', 'net_details_item');
	_td1.update(item);
	
	var _td2 = new Element('td');
	_td2.setAttribute('class', 'net_details_text');
	_td2.update(value);
	
	_tr.insert(_td1);
	_tr.insert(_td2);
	
	$('tbl_'+part).insert(_tr);
}

function _netDetailedResult(request)
{
	_netAddDetail('system', 'Node name', selectedNode.getName());
	
	request.responseText.evalScripts();
	
	if (selectedNode.getType() != 'internet')
	{
		_netAddDetail('network', 'Hops to internet', selectedNode.hopsToInternet());
		_netAddDetail('network', 'Node status', selectedNode.getStatus());
		_netAddDetail('network', 'Uplink status', selectedNode.getUplinkStatus());
	}
	_netAddDetail('network', 'Children', selectedNode.getAmountChildren());
	_netAddDetail('network', 'Children online', selectedNode.getAmountChildrenStatus('online'));
	
	selectedNode.drawConnections(lastDepth);
	
	if (netMoving == 0)
	{
		getGraph().paint();
	}else
	{
		netDrawWaiting = 1;
	}
}

function _queryDetails(node)
{
	new Ajax.Request
	(
		'ajax.php',
		{
			method: 'get',
			parameters: 'block=overige&detailed=' + node.getId(),
			onComplete: _netDetailedResult
		}
	);
}

function netDrawDetails(node) {
	_netClearDetails();
	$('selected_node_title').update('Selected node: '+node.getName());
	_queryDetails(node);
}

function netDrawTree(depth, startNode) {
	if (selectedNode != undefined) selectedNode.selectNode(false);
	
	if (startNode == undefined) selectedNode = rootNode;
	else selectedNode = startNode;
	
	selectedNode.selectNode(true);
	lastDepth = depth;
	
	netClearScreen(0);
	
	netMoving = 1;
	
	selectedNode.setLocation([375, 150, 0]);
	netDrawDetails(selectedNode);
	selectedNode.markTree(depth);
	netDrawChanges();
}

var rootNode = netGetNode(0, 'internet', 'internet', 50);

