var SM_bounce = 10;
var SM_exitingMenu = false;
var SM_currentMenu = false;
var SM_requestedMenu = false;
var SM_requestedSubMenu = false;
var SM_interval = false;
var SM_menuObjects = new Array();
var SM_menuDIVObjects = new Array();
var SM_subMenus = new Array();
var SM_doResetThreshold = 25;
var SM_doReset = false;
var SM_doResetCounter = 0;
//var SM_menuWidth = 120;
var SM_menuOptionClass = "menu-option";
var SM_menuOptionSubClass = "menu-option-submenu";
var xPaddingOffset = 3;

/* post activation */
var postActivateTicks = 20;
var postActivateTicksCurrent = 0;
var activePost = false;
var activatingPost = false;
var arrowPostOffsetY = 15;
var arrowPostOffsetX = -5;
var activePostX = 0;
var activePostY = 0;
var activePostYOffset = 0;
var floatingPostThreshold = 40; // pixel value for when we switch from left to right

function SM_dispatcher() {
	if (SM_doReset) {
		SM_doResetCounter++;
	}
	
	SM_exitingMenu = false;
	if (SM_currentMenu || SM_requestedMenu) {
		for (i = 0; i < SM_menuDIVObjects.length; i++) {		
			// first, we make sure that all menus are offscreen before we call another one
			if ((SM_menuDIVObjects[i].itemID != SM_requestedMenu) && (SM_menuDIVObjects[i].itemID != SM_requestedSubMenu) && (SM_menuDIVObjects[i].style.visibility != "hidden")) {
				SM_hideSubMenus();
				SM_hideMenu(SM_menuDIVObjects[i].itemID);
				SM_exitingMenu = true;
			}
		}
	}
		
	for (i = 0; i < SM_menuDIVObjects.length; i++) {
		if (SM_menuDIVObjects[i].itemID == SM_requestedMenu && !SM_exitingMenu && SM_menuDIVObjects[i].action != "COMPLETE") {
			SM_hideSubMenus();
			SM_showMenu(SM_requestedMenu);
		}
	}
	
	if (activatingPost && postActivateTicksCurrent == postActivateTicks) {		
		activePost = activatingPost;
		_activatePost(activePost);
		activatingPost = false;
		postActivateTicksCurrent = 0;
	} else if (activatingPost) {
		postActivateTicksCurrent++;
	}
	
	
	if (SM_doResetCounter > SM_doResetThreshold) {
		SM_hideSubMenus();
		SM_hideMenu(SM_currentMenu);
	}
}

function showArrowAtBottom(x,y) {
	arr = document.getElementById("post-arrow-down");
	arr.style.top = y + "px";
	arr.style.left = x + "px";
	arr.style.visibility = "visible";
}

function showArrowAtTop(x,y) {
	arr = document.getElementById("post-arrow-up");
	arr.style.top = y + "px";
	arr.style.left = x + "px";
	arr.style.visibility = "visible";
}

function _activatePost(id) {
	//_x = ccmFindX(document.getElementById("hdr" + id));
	//dim = Element.getDimensions(window);
	
	if (window.innerWidth) {
		dim = {
			width: window.innerWidth, height: window.innerHeight
		}
	} else {
		dim = {
			width: document.body.clientWidth,
			height: document.body.clientHeight
		}
	}
	//_x = ccmFindX(document.getElementById
	_x = activePostX;
	//_y = ccmFindY(document.getElementById("hdr" + id));
	_y = activePostY
	
	
	tobj = document.getElementById(id);
	
	if ((floatingPostThreshold +  _x + parseInt(tobj.style.width.substring(0,tobj.style.width.length-2))) >= dim.width) {
		_x = _x - parseInt(tobj.style.width.substring(0,tobj.style.width.length-2));
		_x = _x - arrowPostOffsetX;
	} else {
		_x = _x + arrowPostOffsetX;
	}


	if ((floatingPostThreshold + _y + tobj.offsetHeight + activePostYOffset) >= dim.height) {
		_y = (_y + activePostYOffset) - tobj.offsetHeight;
		_y = _y - arrowPostOffsetY;
		showArrowAtBottom(activePostX, _y + tobj.offsetHeight - 1);

	} else {
		_y = (_y + activePostYOffset) + arrowPostOffsetY;
		showArrowAtTop(activePostX, _y + activePostYOffset - arrowPostOffsetY);

	}
	

	tobj.style.left = _x + "px";
	tobj.style.top = _y + "px";
	tobj.style.visibility = "visible";
}

activatePost = function(event, id) {
	if (activePost != id && activePost != false) {
		hidePost(activePost);
	}
	activatingPost = id;
	activePostX = Event.pointerX(event);
	activePostY = Event.pointerY(event);
	
}

deactivatePost = function(event, id) {
	if (activatingPost == id) {
		activatingPost = false;
		activePostX = 0;
		activePostY = 0;
	}
}

hidePost = function(id) {
	document.getElementById("post-arrow-down").style.visibility = "hidden";
	document.getElementById("post-arrow-up").style.visibility = "hidden";

	obj = document.getElementById(id);
	obj.style.visibility = "hidden";
}


function SM_hideSubMenus() {
	if (SM_requestedSubMenu) {
		obj = document.getElementById(SM_requestedSubMenu + "_sub");
		obj.style.visibility = "hidden";
		SM_requestedSubMenu = false;
	}
}

function SM_activate(itemID) {
	SM_clearResetCounter();
	// grab the total height of the object we're going to activate
	// then set that as our targetLocation property
	if (itemID != SM_requestedMenu && itemID != SM_currentMenu) {
		menu = document.getElementById(itemID + "_sub");
		if (menu) {
			menu.style.visibility = "visible";
			SM_requestedMenu = itemID;
		}
	}
}

function SM_deactivate(itemID) {
	SM_clearResetCounter();
	SM_doReset = true;
}

var SM_maxBounce = 10;

function SM_showMenu(itemID) {
	menuJSObj = eval(itemID + "Menu");
	showMenuObj = document.getElementById(itemID + "_sub");
	if (showMenuObj) {
		newTop = parseFloat(showMenuObj.style.top);
		if (showMenuObj.action == "COMPLETE") {
			//SM_currentMenu = itemID;
		} else if (showMenuObj.action == "BOUNCE") {
			dest = 160 - SM_bounce;	
			newTop = parseInt(showMenuObj.style.top);
			if ((newTop - dest) > 1 && showMenuObj.currentBounce < SM_maxBounce) {				
				newTop = parseFloat(newTop + ((dest - newTop) * .45));
				newTopInt = Math.round(newTop);
				showMenuObj.style.top = newTopInt + "px";
				showMenuObj.currentBounce++;
			} else {
				showMenuObj.action = "COMPLETE";
				SM_currentMenu = itemID;
			}
		} else {
			if (parseInt(showMenuObj.style.top) < 160) {
				newTop = Math.round(newTop + ((161 - newTop) * .45));
				showMenuObj.style.top = newTop + "px";
			} else {
				showMenuObj.currentBounce = 0;
				showMenuObj.action = "BOUNCE";
			}
		}
	}
}

function SM_hideMenu(itemID) {
	hideMenuObj = document.getElementById(itemID + "_sub");
	if (hideMenuObj) {
		newTop = parseInt(hideMenuObj.style.top);
		dest = 160 - hideMenuObj.offsetHeight;
		if ((newTop - dest) > 1) {
			newTop = parseFloat(newTop + ((dest - newTop) * .45));
			newTopInt = Math.round(newTop);
			hideMenuObj.style.top = newTopInt + "px";
		} else {
			hideMenuObj.style.visibility = "hidden";
			hideMenuObj.action = null;
			if (SM_currentMenu == itemID) {
				SM_currentMenu = null;
			}
			if (SM_requestedMenu == itemID) {
				SM_requestedMenu = null;
			}
			SM_clearResetCounter();
		}			
	}
}

function SM_findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	
	return curleft;
}

function SM_findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		curtop += obj.y;
	}
	
	return curtop;
}

function SM_selectMenuItem(itemID, showSub) {
	SM_hideSubMenus();
	SM_clearResetCounter();
	tobj = document.getElementById("opt_" + itemID);
	tobj.className = "active";
	if (showSub) {
		//SM_activate(itemID);
		SM_activateSub(itemID);
	}
}

function SM_activateSub(itemID) {
	curr = document.getElementById("opt_" + itemID);
	obj = document.getElementById(itemID + "_sub");
	posx = SM_findPosX(curr);
	posy = SM_findPosY(curr);
	obj.style.visibility="visible";
	
	//_posx = posx + SM_menuWidth;
	_posx= posx + obj.offsetWidth - xPaddingOffset;
	_posx = _posx + "px";
	_posy = posy + "px";
	
	obj.style.left = _posx;
	obj.style.top = _posy;
	SM_requestedSubMenu = itemID;
}

function SM_deselectMenuItem(itemID) {
	SM_doReset = true;
	tobj = document.getElementById("opt_" + itemID);
	tobj.className = "";
}

function SM_selectSubMenuItem(itemID, showSub) {
	SM_clearResetCounter();
	tobj = document.getElementById("opt_" + itemID);
	tobj.className = "active";
}

function SM_deselectSubMenuItem(itemID) {
	SM_doReset = true;
	tobj = document.getElementById("opt_" + itemID);
	tobj.className = "";
}

function SM_clearResetCounter() {
	SM_doReset = false;
	SM_doResetCounter = 0;
}

function SM_resetSizes() {
}

// Submenu class
/*
function SuperMenuTop(id, link, displayName) {
	mn = document.getElementById("menu");
	
	if (!SM_menuStarted) {
		dul = document.createElement("UL");
		dul.id = "menuList";
		mn.appendChild(dul);
	}
	
	
	dm = document.createElement("A");
	dm.id = "tm" + id;
	dm.className = "top-menu";
	dm.onmouseover = function() {
		SM_activate(id);
	}
	dm.onmouseout = function() {
		SM_deactivate(id);
	}
	dm.innerHTML = displayName;
	dm.href = "#";
	if (link != "") {
		dm.href = link;
	}
	document.getElementById("menu").appendChild(dm);
}
*/

function SuperMenu(menuName, xOffset, submenu) {
	if (!xOffset) {
		xOffset = 0;
	}
	this.menuName = menuName;
	this.div = document.createElement("DIV");
	this.div.id = menuName + "_sub";
	this.div.itemID = menuName;
	this.div.className = (submenu) ? SM_menuOptionSubClass : SM_menuOptionClass;
	if (submenu) {
		SM_subMenus.push(menuName);
	}
	this.div.style.visibility = "hidden";
	this.submenu = submenu;
	this.div.style.position = "absolute";
	this.xOffset = xOffset;
	
	this.addOption = addOption;
	this.output = output;
		
	function addOption(optionID, optionLink, optionName, subMenu) {
		var menuName = this.menuName;
		
		if (this.submenu) {
			newOpt = '<div id="opt_' + optionID + '" onclick="location.href=\'' + optionLink + '\'" onmouseover="SM_selectSubMenuItem(\'' + optionID + '\')" onmouseout="SM_deselectSubMenuItem(\'' + optionID + '\')">';			
			newOpt += optionName;
		} else {
			showSub = 0;
			if (subMenu) {
				showSub = 1;
			}
			newOpt = '<div id="opt_' + optionID + '" onclick="location.href=\'' + optionLink + '\'" onmouseover="SM_selectMenuItem(\'' + optionID + '\',' + showSub + ')" onmouseout="SM_deselectMenuItem(\'' + optionID + '\',' + showSub + ')">';				
			newOpt += optionName;
			if (subMenu) {
				newOpt += '<span class="sub">&gt;</span>';
			}
		}
		newOpt += '</div>';
		
		this.div.innerHTML += newOpt;
	}
	
	function output() {
		if (!this.submenu) {
			SM_menuDIVObjects[SM_menuDIVObjects.length] = this.div;		
		}
		document.body.appendChild(this.div);
		obj = document.getElementById(this.div.itemID);
		if (obj) {
			leftPos = SM_findPosX(obj);
			leftPos = leftPos + xOffset;
			this.div.style.left = leftPos + "px";
		}
		
		newTop = 160 - this.div.offsetHeight; // fixed height
		this.div.style.top = newTop + "px";
	}
}

window.onresize = SM_resetSizes;