listen(window, 'load', prepTabSubMenus);
listen(window, 'resize', positionTabSubMenus);

var tabSubMenus = null;
var currentTabSubMenu = null;
var menuTab, menuFirstTab, tabPosition;
var tabMenuChilds, currentSubjectMenu;
var menuLockOpen = false;

var ie6 = window.navigator.appVersion.indexOf("MSIE 6") > -1;

function prepTabSubMenus() {
   tabMenuItems = elemsByClass('button_mid');
   if (!tabMenuItems) return 0;
   tabSubMenus = elemsByClass('tab_submenu_container');
   menuFirstTab = elemById('tabmenu_0');

   ///set events for main tabs
   for (var i=0; i < tabMenuItems.length; i++) {
   
		if (tabMenuItems[i].id =="tabmenu_0")
		{
			tabMenuItems[i].onclick = openTabSubClick;
			tabMenuItems[i].onmouseover = openTabSubHover;
		}
   }

   //prevent event spaghetti, causing premature closing of tabsubmenu.
   for (var i=0; i < tabSubMenus.length; i++) {
      tabSubMenus[i].onmouseover = killBubble;
   }

   //set events for all subject parents under the main tabs
   tabMenuChilds = elemsByClass('tabmenu_item_parent');
   for (var t=0; t < tabMenuChilds.length; t++) {
      tabMenuChilds[t].onmouseover = openSubjectMenu;
   }

   positionTabSubMenus();

   ///hide any open menu on bodyclick
   //document.body.onclick = hideTabSubMenu;
   listen(document.body, 'mouseover', hideTabSubMenuHover);
}

/* proc positionTabSubMenus
   does: sets the overlay position of the submenus.
         This is done by the first tab because they must all be in the same place on the page.
         This function is called onload and onresize.
*/
function positionTabSubMenus() {
	if (!menuFirstTab) return 0;
   tabPosition = getPosition(menuFirstTab);

   for (var i=0; i < tabSubMenus.length; i++) {
      tabSubMenus[i].style.top = tabPosition.top + 23 + 'px';
      tabSubMenus[i].style.left = tabPosition.left - 27 + 'px';
   }
}

///////////// Functions for grid menu (level 1 from a zero-based point of view) ////////////////

/* procs openTabSub[Hover|Click], displayTabSubMenu
   does: These functions deal with opening (and closing) of the submenus.
         openTabSub[x] does slightly different things, because a click
         will "lock" the menu open, until it is forcibly closed by a click anywhere else.
*/
function openTabSubHover(ev) {
   menuTab = this;

   if (!menuLockOpen) {
      displayTabSubMenu(ev);
   }
}
function openTabSubClick(ev) {
   menuTab = this;
   displayTabSubMenu(ev);
   menuLockOpen = true;
   return false;
}

function displayTabSubMenu(ev) {
   killBubble(ev);
   
	var objListSort = elemById('list_headersort')
	if(ie6 && objListSort)
	{
		objListSort.style.display = 'none';
	}
   //hide previously open menu
   if (currentTabSubMenu && !menuLockOpen) {
      currentTabSubMenu.style.visibility = 'hidden';
   }
   if (currentSubjectMenu) {
      currentSubjectMenu.parentNode.className = currentSubjectMenu.parentNode.className.replace(' tip_hover', '');
      currentSubjectMenu.style.visibility = 'hidden';
   }

   //put currently selected subtab into currentTab and visiblize it
   var tabSubMenuIndex = menuTab.id.substrAfter('_');
   currentTabSubMenu = elemById('tab_submenu_container_' + tabSubMenuIndex);

   //not all tabs have a submenu.
   if (currentTabSubMenu) {
      currentTabSubMenu.style.visibility = 'visible';
   }
}
function hideTabSubMenu(ev) {
   killBubble(ev);
   	var objListSort = elemById('list_headersort');
	if(ie6 && objListSort)
	{
		var objListSort = elemById('list_headersort');
		objListSort.style.display = 'block';
	}

	if (currentTabSubMenu) {
      currentTabSubMenu.style.visibility = 'hidden';
      menuLockOpen = false;
   }
   if (currentSubjectMenu) {
      currentSubjectMenu.parentNode.className = currentSubjectMenu.parentNode.className.replace(' tip_hover', '');
      currentSubjectMenu.style.visibility = 'hidden';
   }
}
function hideTabSubMenuHover(ev) {
   if (!menuLockOpen) {
      hideTabSubMenu(ev);
   }
}

///////////// Functions for subjectMenu (level 2 from a zero-based point of view) ////////////////

/* proc openSubjectMenu
   does: Opens subject menus on level 2.
         Also sets and un-sets the positioning for the parent, so
         that there's no overlap of parents on top of subject children.
*/
function openSubjectMenu() {
   if (currentSubjectMenu) 
   {
      currentSubjectMenu.parentNode.style.position = 'static';
      currentSubjectMenu.parentNode.className = currentSubjectMenu.parentNode.className.replace(' tip_hover', '');
      currentSubjectMenu.style.visibility = 'hidden';
   }

   this.style.position = 'relative';
   this.className += ' tip_hover';
   //currentSubjectMenu = elemsByClass('tabmenu_items', this)[0];
   currentSubjectMenu=null;
	subjects =elemsChilds(this)
	for (var i =0; i < subjects.length;i++)
	{
		//alert(subjects.innerHTML);
		if (subjects[i].className=="tabmenu_items")
		{	
			currentSubjectMenu=subjects[i]
			break;
		}
	}
   
	if(currentSubjectMenu)
	{
		var subChild = elemsChilds(currentSubjectMenu);
		//alert(subChild.length);	
		if(subChild.length!=0) currentSubjectMenu.style.visibility = 'visible';
		else currentSubjectMenu.style.visibility = 'hidden';
	}		
}

//////////////////////////////////////////////////////

/* array getCompactLayout
   in: (int)number of items
   out: array of length 3, with column lengths
   does: calculates the most compact distribution over
         3 columns for a given number of items.
*/
function getCompactLayout(n) {
   var e; //empty space count
   var y; //col length
   var l = []; //layout as array

   if (n > 1) {
      e = (3 - (n%3)) % 3;
      y = (n + e) / 3;

      l = [y, y, (y - e)];
   }
   else {
      l = [1, 0, 0];
   }

   return l;
}

function killBubble(ev) {
   if (!ev) ev = window.event;
   ev.cancelBubble = true;
}