//Recurity-Labs Menu System
// Recurity-Labs 2007
var debug = false;
var menu, geom;
function quitit() {return true;}
function init() {
	geom = eval(layout['geometry']);
	if(!initRenderer()) return false;
	window.onresize = resize;
	var rootParentNode = new Object
	rootNode = document.getElementById('menuRootNode');
	rootNode.childNum = 1;
	rootNode.siblingNodeCount = 1;
	run(rootNode,rootParentNode);
	}
	
function resize() {
	//Need to have an intermediate instance -> Firefox fix
	menu.resize();
}
function initRenderer() {
	
//detect valid rendering method and make it the default one
	var mySvgMenu = new svgMenu('svgMenu');
	var myHtmlMenu = new htmlMenu('htmlMenu');
	debugMsg(mySvgMenu.supported);
	if (mySvgMenu.supported) {
		menu = mySvgMenu;
		myHtmlMenu.hide();
		return true;
	} else {
		//Opera delay fix
		if (window.opera) {
			window.setTimeout('init()',10); 
			return false;
		} else {
			menu = myHtmlMenu;
			mySvgMenu.hide();
			return true;
		}
	}
}
	
function debugMsg(msg) {
	if (debug) document.getElementById('debugMsg').innerHTML += (msg + '<br/>');
}

function run(currentDataNode, parentDataNode) {
	debugMsg('_______________________________________');
	var coordinates = geom(currentDataNode, parentDataNode);
	var x = coordinates[0];
	var y = coordinates[1];
	currentDataNode.param = coordinates[2];
	var text = currentDataNode.firstChild.firstChild.data;
	var href = currentDataNode.getElementsByTagName('a')[0].href;
	var title = (currentDataNode.getElementsByTagName('a')[0].attributes.title) ? currentDataNode.getElementsByTagName('a')[0].attributes.title.value : '';
	var childDataNodes = getChildNodesByTagName(currentDataNode, 'li');
	var childDataNodeCount = childDataNodes.length;
	debugMsg('currentNode:' + text + ' childDataNodes: ' + childDataNodeCount + ' parentLinkNode: ' + parentDataNode.linkNode + ' title: ' + title);
	currentDataNode.linkNode = menu.addNode(currentDataNode, parentDataNode.linkNode, x, y, text, href, title);
	debugMsg('LinkNode: ' + currentDataNode.linkNode)
	if(childDataNodeCount > 0) {
		for (var i = 0; i < childDataNodeCount; i++) {
			childDataNodes[i].childNum = i;
			childDataNodes[i].siblingNodeCount = childDataNodeCount;
			run(childDataNodes[i], currentDataNode);
		}
	}
}

function getChildNodesByTagName(element, tagname) {
	var elements = new Array();
	if (element) {
		var childNodes = element.getElementsByTagName(tagname);
		for (var i = 0; i < childNodes.length; i++) {
			if(childNodes[i].parentNode.parentNode == element) {
				elements[elements.length] = childNodes[i];
			}
		}
	}
	return elements;
}

snowflake = function (currentDataNode, parentDataNode) {
	parentAngle = parentDataNode.param;
	parentNodeCount = parentDataNode.siblingNodeCount;
	siblingNodeCount = currentDataNode.siblingNodeCount;
	currentChildNum = currentDataNode.childNum
	debugMsg('Snowflake - currentDataNode: ' + currentDataNode + ' parentAngle: ' + parentAngle + ' siblingNodeCount: ' + siblingNodeCount + ' currentChildNum: ' + currentChildNum);
	if (menu.root) {
		debugMsg('Root Node');
		var x = layout['renderWidth'] / 2;
		var y = layout['renderHeight'] / 2;
		var angle = 0;
		currentDataNode.arrowLength = layout['arrowLength']/ layout['arrowLengthChange'];
	}else{
		debugMsg('Normal node');
		var spread = (2 * Math.PI) / Math.sqrt(parentNodeCount);
		if(siblingNodeCount > 0) {
			var angleStep = spread / siblingNodeCount;
			var angle = currentChildNum * angleStep + parentAngle - (spread / 2) + (.5* angleStep);
			currentDataNode.arrowLength = parentDataNode.arrowLength * layout['arrowLengthChange'];
			var x = Math.cos(angle) * currentDataNode.arrowLength;
			var y = Math.sin(angle) * currentDataNode.arrowLength;

		}
	}
	return [x,y,angle];
}
tree = function (currentDataNode, parentDataNode) {
	parentWidth = parentDataNode.param;
	parentNodeCount = parentDataNode.siblingNodeCount;
	siblingNodeCount = currentDataNode.siblingNodeCount;
	currentChildNum = currentDataNode.childNum
	if (menu.root) {
		var x = layout['renderWidth'] / 2;
		var y = layout['logoHeight'] / 2;
		var currentWidth = layout['renderWidth'] - layout['maxTextWidth'];
		currentDataNode.arrowLength = layout['arrowLength'];
	} else {
		parentDataNode.parentDataNode
		var currentWidth = parentWidth / siblingNodeCount;
		if(siblingNodeCount > 0) {
			var x = (currentWidth * currentChildNum) - (parentWidth / 2) +  (currentWidth / 2);
			currentDataNode.arrowLength = parentDataNode.arrowLength * layout['arrowLengthChange'];			
			var y = currentDataNode.arrowLength;
		}
	}
	return [x,y,currentWidth];
}
