var xmlmenu;
var menuPath = "events.xml";
var menuData = null;
var sectionDefault = "topic";
var sectionActive = null;

var cookieNameCurrentView = "goetke_view";
var cookieNameSectionsVisited = "goetke_visited";

var visitedEvents = {};

var offsetEdge = 0;
var availWidth = 0;
var calendarWidth = 0;
var calendarMode = null;

var eventSize = 9;
var eventSpace = 2;
var animEngaged = false;
var moveEngaged = false;

function initializeMenu()
{
	xmlmenu = xml.createHttpRequest(null, true, xmlmenu_onload);
	xmlmenu.open("GET", menuPath, true);
	xmlmenu.send(null);
}

function xmlmenu_onload(xmlData)
{
	parseData(xmlData);
	drawmenu();
	initializeHovertitles();
}

function parseData(xmlData)
{
	parseVisited();

	menuData = { topics: {}, media: {}, events: { per_topic: {}, per_media: {} }, years: [] };

	var xmldoc = xmlData.responseXML;
	var xmlroot = xmldoc.documentElement;
	var topics = xmlroot.getElementsByTagName("topic");
	var media = xmlroot.getElementsByTagName("media");
	var events = xmlroot.getElementsByTagName("event");

	var eventObjects = {};
	var eventChrono = [];

	for (var i = 0; i < topics.length; i++)
	{
		var topicID = topics[i].getAttribute("id");
		var topicName = topics[i].getAttribute("name");

		menuData.topics[topicID] = topicName;
	}
	for (var i = 0; i < media.length; i++)
	{
		var mediaID = media[i].getAttribute("id");
		var mediaName = media[i].getAttribute("name");

		menuData.media[mediaID] = mediaName;
	}
	for (var i = 0; i < events.length; i++)
	{
		var year = events[i].getAttribute("year");
		var position = events[i].getAttribute("position");
		var topic = events[i].getAttribute("topic");
		var media = events[i].getAttribute("media");
		var name = events[i].getAttribute("name");
		var url = events[i].getAttribute("url");
		var left = parseInt(events[i].getAttribute("left")) || 0;

		if (!menuData.years.contains(year))
			menuData.years.push(year);
		if (menuData.events.per_topic[topic] == null)
			menuData.events.per_topic[topic] = new Object;
		if (menuData.events.per_media[media] == null)
			menuData.events.per_media[media] = new Object;
		if (menuData.events.per_topic[topic][year] == null)
			menuData.events.per_topic[topic][year] = new Array;
		if (menuData.events.per_media[media][year] == null)
			menuData.events.per_media[media][year] = new Array;

		var eventId = [year, position].join("_");
		var eventObj =
		{
			year: year,
			position: position,
			topic: topic,
			media: media,
			name: name,
			url: url,
			left: left
		};
		eventObjects[eventId] = eventObj;
		eventChrono.push(eventId);
	}
	menuData.years.sort().reverse();
	eventChrono.sort();

	var minYear = Number.POSITIVE_INFINITY;
	var maxYear = Number.NEGATIVE_INFINITY;

	for (var i = 0; i < eventChrono.length; i++)
	{
		var eventID = eventChrono[i];
		var eventObj = eventObjects[eventID];

		var year = eventObj.year;
		if (year < minYear)
			minYear = year;
		if (year > maxYear)
			maxYear = year;

		menuData.events.per_topic[eventObj.topic][eventObj.year].push(eventObj);
		menuData.events.per_media[eventObj.media][eventObj.year].push(eventObj);
	}
	menuData.minYear = minYear;
	menuData.maxYear = maxYear;

}

function drawmenu()
{
	var sections_topic = document.getElementById("sections_topic");
	var sections_media = document.getElementById("sections_media");
	var calendar_years = document.getElementById("calendar_years");
	var calendar_topics = document.getElementById("calendar_topics");
	var calendar_media = document.getElementById("calendar_media");
	var calendar_container = document.getElementById("calendar_container");
	var menu_calendar = document.getElementById("menu_calendar");
	var switchTopic = document.getElementById("switchTopic");
	var switchMedia = document.getElementById("switchMedia");

	var zeroPos = 22;
	var lineHeight = 19;

	availWidth = menu_calendar.offsetWidth;
	calendarWidth = 0;

	calendar_container.style.top = "0px";
	calendar_container.style.left = "50px";

	var tline_pos = zeroPos;
	var mline_pos = zeroPos;
	for (var topicID in menuData.topics)
	{
		var topic = sections_topic.appendChild(document.createElement("div"));
		topic.className = "section";
		topic.innerHTML = menuData.topics[topicID];
		topic.onclick = topic_onclick;
		topic.topicID = topicID;

		var line = calendar_topics.appendChild(document.createElement("div"));
		line.id = "topic" + topicID;
		line.className = "line";
		line.style.top = tline_pos + "px";
		tline_pos += lineHeight;
	}
	for (var mediaID in menuData.media)
	{
		var media = sections_media.appendChild(document.createElement("div"));
		media.className = "section";
		media.innerHTML = menuData.media[mediaID];
		media.onclick = media_onclick;
		media.mediaID = mediaID;

		var line = calendar_media.appendChild(document.createElement("div"));
		line.id = "media" + mediaID;
		line.className = "line";
		line.style.top = mline_pos + "px";
		mline_pos += lineHeight;

	}
	for (var year = menuData.maxYear, i = 0; year >= menuData.minYear; year--, i++)
	{
		var yearBox = calendar_years.appendChild(document.createElement("div"));
		yearBox.id = "year" + year;
		yearBox.className = "year";

		var left = i * yearBox.offsetWidth;
		yearBox.style.left = left + "px";
		yearBox.innerHTML = year;

		calendarWidth = left + yearBox.offsetWidth;
		calendar_container.style.width = calendarWidth + "px";

		var leftE = left + 3;
		var url = document.location.href;
		for (var mediaID in menuData.events.per_media)
		{
			if (menuData.events.per_media[mediaID][year] != null)
			{
				var targetLine = document.getElementById("media" + mediaID);
				for (var j = 0; j < menuData.events.per_media[mediaID][year].length; j++)
				{
					var eventObj = menuData.events.per_media[mediaID][year][j];
					var eventDiv = targetLine.appendChild(document.createElement("div"));
					var eventID = eventObj.year + "-" + eventObj.position;

					var className = "event";
					if (url.indexOf(eventObj.url) != -1)
						className = "event current";
					else if (visitedEvents[eventID] == eventID)
						className = "event visited";

					eventDiv.className = className;
					eventDiv.style.left = (leftE + (j * (eventSize + eventSpace)) + eventObj.left) + "px";
					eventDiv.setAttribute("hovertitle", eventObj.name);
					eventDiv.eventID = eventID;
					eventDiv.url = eventObj.url;
					eventDiv.onclick = event_onclick;
				}
			}
		}
		for (var topicID in menuData.events.per_topic)
		{
			if (menuData.events.per_topic[topicID][year] != null)
			{
				var targetLine = document.getElementById("topic" + topicID);
				for (var j = 0; j < menuData.events.per_topic[topicID][year].length; j++)
				{
					var eventObj = menuData.events.per_topic[topicID][year][j];
					var eventDiv = targetLine.appendChild(document.createElement("div"));
					var eventID = eventObj.year + "-" + eventObj.position;

					var className = "event";
					if (url.indexOf(eventObj.url) != -1)
						className = "event current";
					else if (visitedEvents[eventID] == eventID)
						className = "event visited";

					eventDiv.className = className;
					eventDiv.style.left = (leftE + (j * (eventSize + eventSpace)) + eventObj.left) + "px";
					eventDiv.setAttribute("hovertitle", eventObj.name);
					eventDiv.eventID = eventID;
					eventDiv.url = eventObj.url;
					eventDiv.onclick = event_onclick;
				}
			}
		}
	}

	calendarMove = new Move(calendar_container, 0, 0, 400, Math.easeOutQuint, stopanimation);

	assignEventHandler("onmousemove", calendar_container, calendar_mousemove);
	assignEventHandler("onmousemove", document, document_mousemove);

	sectionActive = window.getCookie(cookieNameCurrentView) || sectionDefault;
	setCurrentView(sectionActive);

	switchTopic.onclick = createCallback(window, "setCurrentView", ["topics"]);
	switchMedia.onclick = createCallback(window, "setCurrentView", ["media"]);
}

function setCurrentView(view)
{
	var sections_topic = document.getElementById("sections_topic");
	var sections_media = document.getElementById("sections_media");
	var calendar_topics = document.getElementById("calendar_topics");
	var calendar_media = document.getElementById("calendar_media");
	var switchTopic = document.getElementById("switchTopic");
	var switchMedia = document.getElementById("switchMedia");

	if (view == "media")
	{
		display(sections_media);
		display(calendar_media);
		undisplay(sections_topic);
		undisplay(calendar_topics);

		addClassName(switchMedia, "current");
		removeClassName(switchTopic, "current");
	}
	else
	{
		display(sections_topic);
		display(calendar_topics);
		undisplay(sections_media);
		undisplay(calendar_media);

		addClassName(switchTopic, "current");
		removeClassName(switchMedia, "current");
	}

	window.setCookie(cookieNameCurrentView, view);
}

function saveVisited(eventID)
{
	visitedEvents[eventID] = eventID;
	var visitedCookie = [];
	for (var event in visitedEvents)
		visitedCookie.push(event);

	window.setCookie(cookieNameSectionsVisited, visitedCookie.join(","));
}

function parseVisited()
{
	var visitedCookie = window.getCookie(cookieNameSectionsVisited);
	if (visitedCookie != null)
	{
		var visitedList = visitedCookie.split(",");
		visitedEvents = new Object;
		for (var i = 0; i < visitedList.length; i++)
		{
			visitedEvents[visitedList[i]] = visitedList[i];
		}
	}
}

function document_mousemove(e)
{
	var event = window.getEvent(e);
	var menu_calendar = document.getElementById("menu_calendar");
	var calendar_container = document.getElementById("calendar_container");

	var mouseX = event.clientX - window.getLeft(menu_calendar);
	var mouseY = event.clientY - window.getTop(menu_calendar) + document.body.scrollTop;
	var mEngaged =
		mouseX >= 0 && mouseX <= menu_calendar.offsetWidth &&
		mouseY >= 0 && mouseY <= menu_calendar.offsetHeight;

	var targetLeft = getTargetMenuLeft(mouseX, offsetEdge);
	var calendarX = parseInt(calendar_container.style.left) || 0;
	var distanceX = calendarX - targetLeft;

	var aEngaged = Math.abs(distanceX) > 10;
	if (mEngaged)
	{
		moveEngaged = true;
		calendarMove.setEndValue(targetLeft, 0);
		if (aEngaged && !animEngaged)
		{
			animEngaged = true;
			calendarMove.run();
		}
		if (moveEngaged && !animEngaged)
			calendar_container.style.pixelLeft = getTargetMenuLeft(event.clientX - getLeft(menu_calendar), offsetEdge);
	}
	else
	{
		moveEngaged = false;
	}
}

function calendar_mousemove(e)
{
	if (moveEngaged && !animEngaged)
	{
		var event = window.getEvent(e);
		var menu_calendar = document.getElementById("menu_calendar");
		var calendar_container = document.getElementById("calendar_container");
		calendar_container.style.pixelLeft = getTargetMenuLeft(event.clientX - getLeft(menu_calendar), offsetEdge);
	}
}

function stopanimation()
{
	animEngaged = false;
}

function getTargetMenuLeft(mouseX, offsetEdge)
{
	var trackX = calendarWidth - availWidth + (offsetEdge * 2);
	var ratio = trackX / availWidth;
	var point = -(mouseX * ratio) + offsetEdge;

	return Math.round(point);
}

function media_onclick()
{
	activateSection("media", this.mediaID, this);
}

function topic_onclick()
{
	activateSection("topic", this.topicID, this);
}

function activateSection(sectionType, sectionID, sectionElem)
{
	var elems = document.getElementsByTagName("div");
	for (var i = 0; i < elems.length; i++)
	{
		if (containsClassName(elems[i], "event"))
			removeClassName(elems[i], "highlight");
		else if (containsClassName(elems[i], "section"))
		{
			if (elems[i].current == true && elems[i] != sectionElem)
				 elems[i].current = false;
			removeClassName(elems[i], "current");
		}
	}
	var targetLine = document.getElementById(sectionType + sectionID);
	var elems = targetLine.getElementsByTagName("div");

	if (sectionElem.current != true)
	{
		for (var i = 0; i < elems.length; i++)
		{
			if (containsClassName(elems[i], "event"))
				addClassName(elems[i], "highlight");
		}
		addClassName(sectionElem, "current");
		sectionElem.current = true;
	}
	else
	{
		for (var i = 0; i < elems.length; i++)
		{
			if (containsClassName(elems[i], "event"))
				removeClassName(elems[i], "highlight");
		}
		removeClassName(sectionElem, "current");
		sectionElem.current = false;
	}
}

function event_onclick()
{
	saveVisited(this.eventID);
	document.location = this.url;
}

window.assignEventHandler("onload", window, initializeMenu);

