var pageTree = {};
var idMap = new Array();
var pageStateToken = 0;
var currentPage = null;
var startupURI = "";

function Page()
{
	this.id = 0;
	this.name = "";
	this.small = false;
	this.URI = "";
	this.DOM = null;
	this.parent = null;
	this.children = new Array();	
}

function getPageTree(callback)
{
	new AsyncRequest().data({ajax:"mbu-get-page-tree", token:pageStateToken}).handler(getPageTreeCallback).send();
	
	function getPageTreeCallback(result)
	{
		if (result.status == 1)
		{
			if (result.refresh == true)
			{
				pageStateToken = result.token;	
				if (result.tree != null)
				{
					buildPageTreeRec(result.tree);	
					buildMenuDOM();
				}	
			}
			
			if (callback != null)
				callback();
		}
	}
}

function getPage(page, callback)
{
	new AsyncRequest().data({ajax:"mbu-get-page", id:page.id}).handler(getPageCallback).send();
	
	function getPageCallback(result)
	{
		if (result.status == 1)
		{					
			if (result.pdata != null)
			{
				$("#content-wrapper").children().remove();
				$("#content-wrapper").html(result.pdata);
			}
			
			if (callback != null)
				if (result.redirect != null)
					callback(handleRedirect(result.redirect));
				else
					callback(page);
		}
	}
}

function buildPageTreeRec(rawTree, parent)
{
	if (parent == null)
	{
		pageTree = new Page();
		pageTree.id = 0;
		pageTree.name = "root";
		pageTree.parent = null;
		parent = pageTree;
	}
	
	for (var i=0; i < rawTree.length; i++)
	{
		var nPage = new Page();
		nPage.id = rawTree[i].id;
		nPage.name = rawTree[i].name;
		nPage.level = rawTree[i].level;
		nPage.URI = rawTree[i].URI;
		
		if (rawTree[i].small != null)
			nPage.small = rawTree[i].small;
		
		nPage.parent = parent;
		
		if (rawTree[i].children.length > 0)
			buildPageTreeRec(rawTree[i].children, nPage);
			
		parent.children.push(nPage);
		
		if (currentPage == null && nPage.URI == startupURI) // this also fixes HTML4 hash-links
			currentPage = nPage;
			
		idMap[nPage.id] = nPage;
	}
}

function isAncestor(ancestor, page)
{
	if (ancestor == page)
		return true;
	
	var recPage = page;
	while (true)
	{
		if (recPage.parent == ancestor)
			return true;
			
		if (recPage.parent.id != 0)
			recPage = recPage.parent;
		else
			return false;
	}
}

function getAncestor(page, level)
{
	if (level == null || level < 0)
		level = 0;
		
	if (page.level == level || page.level < 0)
		return page;
		
	var recPage = page;
	while (true)
	{
		if (recPage.level == level)
			return recPage;
			
		if (recPage.parent.id != 0)
			recPage = recPage.parent;
		else
			return false; // meh, shouldn't happen anyway
	}	
}

function buildMenuDOM()
{	
	var pages = getAncestor(currentPage, 0).children;
	var mainMenu = $("<ul>");

	for (var i=0; i < pages.length; i++)
	{		
		var pLink = $("<a>" + pages[i].name + "</a>").attr("href", pages[i].URI).data({pageObject:pages[i]}).bind("click", navigate);
		var pListItem = $("<li>").append(pLink);
		
		pages[i].DOM = pListItem;
		
		if (isAncestor(pages[i], currentPage)) {
			pListItem.addClass("active");
		}
		
		if (pages[i].small == true)
			pListItem.addClass("small");
			
		pListItem.appendTo(mainMenu);
	}
	
	$("#menu").children().remove();
	$("#menu").append(mainMenu);
	buildSubmenuDOM();
}

function buildSubmenuDOM()
{
	var subMenu = $('<ul class="sub">');	

	var submenuParent = getAncestor(currentPage, 1); // level 0 = language

	if (submenuParent.children.length > 0)
	{
		var pages = submenuParent.children;
		
		for (var i=0; i < pages.length; i++)
		{		
			var pLink = $("<a>" + pages[i].name + "</a>").attr("href", pages[i].URI).data({pageObject:pages[i]}).bind("click", navigate);
			var pListItem = $("<li>").append(pLink);
			
			pages[i].DOM = pListItem;
			
			if (isAncestor(pages[i], currentPage)) {
				pListItem.addClass("active");
			}
				
			pListItem.appendTo(subMenu);
		}
	}
	
	$("#menu").children(".sub").remove();	
	$("#menu").append(subMenu);
}

$(document).ready(function(e) {	
	if (!enableAjax)
		return;	
	
	var hashPage = History.getState();
	startupURI = hashPage.url; // get page URI, this fixes HTML4 (hash) -> HTML5 (history state) conversion
	var getParams = startupURI.indexOf("?")
	if (getParams > -1) { // cut of GET-Params
		startupURI = startupURI.substring(0, getParams);
	}
	
	getPageTree(initPage);
	
	function initPage()
	{
		getPage(currentPage);	
	}
});


function navigate(evt)
{
	var sender = $(evt.target).data("pageObject");
	if (sender == null)
		return false;
	
	getPage(sender, navigateCallback);
	
	function navigateCallback(page)
	{
		if (page != sender) {
			// got redirected
			currentPage = page;
			buildMenuDOM();
		}
		
		currentPage = page;
		History.pushState(null,"",page.URI)	
		
		_gaq.push(['_trackPageview', page.URI]);
			
		$("#menu ul").children().removeClass("active");
		
		if (sender.level == 1) {
			sender.DOM.addClass("active");
			buildSubmenuDOM();
		}
		
		if (sender.level > 1) {
			getAncestor(sender, 1).DOM.addClass("active");
			getAncestor(sender, 2).DOM.addClass("active");
			sender.DOM.addClass("active");
		}
	}

	evt.preventDefault();
	return false;
}

function handleRedirect(pid)
{
	if (idMap[pid] != null)
		return idMap[pid];
	else
		return currentPage;
}
