function Navigation() {
	this.menus = new Array();
}

Navigation.prototype.addMenu = function(menu) {
	this.menus[this.menus.length] = menu;
}

Navigation.prototype.initiate = function() {
	this.getCookies();
	for (var i in this.menus) {
		this.menus[i].initiate();
	}
}

Navigation.prototype.setCookies = function() {
	var _cookie = "";
	
	for (var i in this.menus) {
		if (this.menus[i].type == "onclick") {
			for (var j = 0; j < document.getElementById(this.menus[i].elementId).getElementsByTagName("A").length; j++) {
				if (document.getElementById(this.menus[i].elementId).getElementsByTagName("A")[j].className == "selected") {
					_cookie += j.toString() + ":";
				}
			}

			_cookie += "|";
			
			for (var j = 0; j < document.getElementById(this.menus[i].elementId).getElementsByTagName("UL").length; j++) {
				if (document.getElementById(this.menus[i].elementId).getElementsByTagName("UL")[j].style.display == "block") {
					_cookie += j.toString() + ":";
				}
			}
			
			document.cookie = this.menus[i].elementId + "=" + _cookie;
		}
	}
}

Navigation.prototype.getCookies = function() {
	if (document.cookie) {
		var _cookies = document.cookie.split(/; ?/);
		var _cookiesAssociative = new Object();
		
		for (var i in _cookies) {
			var _separator = _cookies[i].indexOf("=");
			_cookiesAssociative[_cookies[i].substring(0, _separator)] = _cookies[i].substring(_separator + 1);
		}
		
		for (var i in this.menus) {
			if (_cookiesAssociative[this.menus[i].elementId]) {
				var _payloads = _cookiesAssociative[this.menus[i].elementId].split("|");
				var _selectedItems = _payloads[0].split(":");
				var _subMenus = _payloads[1].split(":");
				for (var j = 0; j < _selectedItems.length; j++) {
					if (_selectedItems[j]) {
						document.getElementById(this.menus[i].elementId).getElementsByTagName("A")[parseInt(_selectedItems[j], 10)].className = "selected";
					}
				}
				for (var j = 0; j < _subMenus.length; j++) {
					if (_subMenus[j]) {
						document.getElementById(this.menus[i].elementId).getElementsByTagName("UL")[parseInt(_subMenus[j], 10)].style.display = "block";
						document.getElementById(this.menus[i].elementId).getElementsByTagName("UL")[parseInt(_subMenus[j], 10)].parentNode.className = "opened";
					}
				}
			}
		}
	}
}


// OnClickMenu class
function OnClickMenu(elementId) {
	this.elementId = elementId;
	this.type = "onclick";
	this.eventOnAnchor = false;
	this.collapseAllOnOpen = false;
	this.skipToFirstChild = false;
}

OnClickMenu.prototype.eventHandler = function(event) {
	var self = this; // Allows us to refer to the object from within inner functions

	// Crossbrowser event handling
	if (!event) {event = window.event;}
	if (!event.target) {event.target = event.srcElement;}

	// Whether we want the menu to do it's magic when an anchor is clicked...
	if (this.eventOnAnchor && event.target.tagName == "A") {
		for (var i = 0, anchors = document.getElementById(this.elementId).getElementsByTagName("A"); i < anchors.length; i++) {
			if (anchors[i].className == "selected") {anchors[i].className = ""};
		}
		
		
		if (this.skipToFirstChild && event.target.parentNode.getElementsByTagName("UL")[0]) {
			event.target.parentNode.getElementsByTagName("UL")[0].getElementsByTagName("A")[0].className = "selected";
		}
		else {
			event.target.className = "selected";
		}
		
		handleEvent();
	} 

	// ...or when any item within the UL is clicked
	else if (!this.eventOnAnchor) {
		handleEvent();
	}

	// Open/close the menu, set the classNames, etc.
	function handleEvent() {
		var _clickedItem = event.target;
		if (_clickedItem != document.getElementById(self.elementId)) {
			while (_clickedItem.tagName != "LI") {
				_clickedItem = _clickedItem.parentNode;
			}

			// Close all other menu's when a menu is opened
			if (self.collapseAllOnOpen) {
				for (var i = 0; i < _clickedItem.parentNode.getElementsByTagName("UL").length; i++) {
					_clickedItem.parentNode.getElementsByTagName("UL")[i].style.display = "none";
					_clickedItem.className = "";
				}
			}

			// If there's a submenu, open it
			if (_clickedItem.getElementsByTagName("UL").length > 0) {
				if (_clickedItem.getElementsByTagName("UL")[0].style.display == "block") {
					_clickedItem.getElementsByTagName("UL")[0].style.display = "none";
					_clickedItem.className = "";
				} else {
					_clickedItem.getElementsByTagName("UL")[0].style.display = "block";
					_clickedItem.className = "opened";
				}
			}
		}
	}
}

OnClickMenu.prototype.initiate = function() {
	var self = this;
	
	// If we want to skip the anchor of a menuitem with a submenu and instead open the first anchor of that submenu
	if (this.skipToFirstChild) {
		for (var i = (document.getElementById(this.elementId).getElementsByTagName("UL").length - 1); i >= 0; i--) {
			var _menu = document.getElementById(this.elementId).getElementsByTagName("UL")[i];
			_menu.parentNode.getElementsByTagName("A")[0].setAttribute("href", _menu.getElementsByTagName("A")[0].href);
		}
	}

	// Register the eventhandler with the menu
	document.getElementById(this.elementId).onclick = function(event) {
		self.eventHandler(event);
	}
}