function SubMenu()
{
	this.element = document.getElementById('sitenav');
	this.offset = 0;
	this.menuItems = [];
	this.activeMenu = -1;
	this.menuActive = false;
	this.menuTimeout = null;
	this.menuItemTimeout = null;
	this.init();
}

Object.extend(SubMenu.prototype,
{
	init: function()
	{
		if (this.element)
		{
			var menu = first_child(this.element, 'ul'), menuitem, menusubitem, i = 0;
			if (menu)
			{
				menuitem = first_child(menu, 'li');
				if (menuitem)
				{
					var lastitem = null;

					do
					{
						lastitem = menuitem;

						if ((menusubitem = first_child(menuitem, 'div')))
						{
							menuitem.className += 'subitems';
							addEvent(menuitem, 'click', this.onClick.bind(this, i));
							addEvent(menuitem, 'mouseover', this.onMouseover.bind(this, i));

							this.menuItems[i++] = menusubitem;
						}
						else
						{
							addEvent(menuitem, 'mouseover', this.handleMouseover.bind(this, -1));
						}
					}
					while ((menuitem = node_after(menuitem, 'li')));

					if (lastitem)
					{
						//-- here we try to 'center' the submenu belof the maintab
						this.offset -= Math.floor(lastitem.offsetLeft / 2);
						this.offset += 54; // half of the maintab width
						if (this.offset < 100) this.offset = 0;
						if (this.offset + lastitem.offsetLeft > 880) this.offset = 880 - lastitem.offsetLeft;
						this.element.style.left = this.offset + 'px';
					}
				}
			}

			addEvent(this.element, 'mouseover', this.cancelMouseout.bind(this));
			addEvent(this.element, 'mouseout', this.onMouseout.bind(this));

			menu = null, menuitem = null, menusubitem = null;
			addEvent(window, 'unload', this.cleanUp.bind(this));
		}
	},
	cleanUp: function()
	{
		this.menuActive = false;
		this.menuItems = null;
		this.element = null;
	},
	onClick: function(i)
	{
		clearTimeout(this.menuItemTimeout);
		this.menuActive = true;
		this.handleMouseover(i);
	},
	onMouseover: function(i)
	{
		clearTimeout(this.menuItemTimeout);
		if (this.menuActive)
			this.handleMouseover(i);
		else if (i != this.activeMenu)
			this.menuItemTimeout = setTimeout(this.onClick.bind(this, i), 50);
	},
	onMouseout: function(i)
	{
		clearTimeout(this.menuTimeout);
		clearTimeout(this.menuItemTimeout);
		this.menuTimeout = setTimeout(this.handleMouseout.bind(this), 1000);
	},
	cancelMouseout: function()
	{
		clearTimeout(this.menuTimeout);
	},
	handleMouseover: function(i)
	{
		if (this.menuItems && i != this.activeMenu)
		{
			var menu = this.menuItems[this.activeMenu]
			if (menu)
				menu.style.display = 'none';

			this.activeMenu = i;
			if ((menu = this.menuItems[this.activeMenu]))
			{
				menu.style.left = menu.parentNode.offsetLeft + 'px';
				menu.style.display = 'block';
			}
		}
	},
	handleMouseout: function()
	{
		this.handleMouseover(-1);
		this.menuActive = false;
	}
});

function Tab(id)
{
	this.element = document.getElementById(id);
	this.tabItems = [];
	this.tablistItems = [];
	this.activeTab = 1;
	this.init();
}

Object.extend(Tab.prototype,
{
	init: function()
	{
		if (this.element)
		{
			var ul = document.createElement('ul'), li, a;
			var tab = this.element.firstChild, i = 1;
			while (tab)
			{
				if (tab.nodeType == 1)
				{
					this.tabItems[i] = tab;

					li = document.createElement('li');
					a = document.createElement('a');
					a.setAttribute('href', window.location.href + '#' + tab.id);
					a.appendChild(document.createTextNode(i));
					addEvent(a, 'click', this.setActive.bind(this, i));
					li.appendChild(a);

					if (i != this.activeTab)
					{
						tab.style.display = 'none';
					}
					else
					{
						addClass(li, 'active');
					}

					this.tablistItems[i] = li;
					ul.appendChild(li);

					i++;
				}

				tab = tab.nextSibling;
			}

			this.element.insertBefore(ul, this.element.firstChild);

			ul = null, li = null, a = null;
			addEvent(window, 'unload', this.cleanUp.bind(this));
		}
	},
	cleanUp: function()
	{
		this.tablistItems = null;
		this.tabItems = null;
		this.element = null;
	},
	setActive: function(i, e)
	{
		if (i != this.activeTab)
		{
			this.tabItems[this.activeTab].style.display = 'none';
			removeClass(this.tablistItems[this.activeTab], 'active');

			this.activeTab = i;
			this.tabItems[this.activeTab].style.display = '';
			addClass(this.tablistItems[this.activeTab], 'active');
		}

		e.preventDefault();
	}
});

