

var rsMenu;
var topLevelItems;
var headers;
var hasSubs;
var lis;
var anchors;
var mnemonics;
var menuComboBoxes;
var theAnchor 		= document.createElement(A);
var theOtherAnchor 	= document.createElement(A);
//	var rsMenuTimeout;

var menuFloatingLeft			= false;
var selectedTopLevelMenuItem 	= null;
var selectedMenuItem			= null;
var selectedParentItem			= null;
 
var EMPTY_STRING= "";
var SPACE 		= " ";
var STAR		= "*";

var OBJECT		= "object";
var ARRAY		= "array";
var STRING		= "string";
var NUMBER		= "number";
var BOOLEAN		= "boolean";

var MOUSE_DOWN	= "mousedown";
var MOUSE_UP	= "mouseup";
var CLICK		= "click";
var DBL_CLICK	= "dblclick";
var MOUSE_MOVE	= "mousemove";
var MOUSE_OVER	= "mouseover";
var MOUSE_ENTER = "mouseenter";
var MOUSE_OUT	= "mouseout";
var KEY_DOWN	= "keydown";
var KEY_UP		= "keyup";
var KEY_PRESS	= "keypress";
var UP			= "up";
var DOWN		= "down";
var LEFT		= "left";
var RIGHT		= "right";

var PX			= "px";

var HTML		= "html";
var BODY		= "body";
var DIV			= "div";
var SPAN		= "span";
var H1			= "h1";
var H2			= "h2";
var H3			= "h3";
var H4			= "h4";
var H5			= "h5";
var H6			= "h6";
var P			= "p";
var INPUT		= "input";
var SELECT		= "select";
var TEXTAREA	= "textarea";
var UL			= "ul";
var LI			= "li";
var A			= "a";
var TABLE		= "table";
var THEAD		= "thead";
var TBODY		= "tbody";
var TR			= "tr";
var TD			= "td";

var NONE		= "none";
var BLOCK		= "block";

var ACTIVE		= "active";
var HOVER		= "hover";
var FOCUSED		= "focused";
var UNFOCUSED	= "unfocused";


/**
 *	Array convenience method to check for membership.
 *
 *	@param object element
 *	@returns boolean
 */
Array.prototype.contains = function (element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			return true;
		}
	}
	return false;
};

/**
 *	Array convenience method to remove element.
 *
 *	@param object element
 *	@returns boolean
 */
Array.prototype.remove = function (element) {
	var result = false;
	var array = [];
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			result = true;
		} else {
			array.push(this[i]);
		}
	}
	this.clear();
	for (var i = 0; i < array.length; i++) {
		this.push(array[i]);
	}
	array = null;
	return result;
};

/**
 *	Array convenience method to clear membership.
 *
 *	@param object element
 *	@returns void
 */
Array.prototype.clear = function () {
	this.length = 0;
};

/**
 *	Array convenience method to add stack functionality to <code>Array</code>s
 *	in browsers that do not support ECMAScript v3.
 *
 *	@param object element
 *	@returns number
 */
Array.prototype.push = function (element) {
	this[this.length] = element;
	return this.length;
};

function getURL(url) {
	window.location = url;
}

function show(target) {
	target.style.display = BLOCK;
}

function hide(target) {
	target.style.display = NONE;
}

function toggle(target) {
	if (isShowing(target)) {
		hide(target);
	} else {
		show(target);
	}
}

function isShowing(target) {
	return !(NONE == target.style.display);
}

function setVisible(target,visible) {
	if (visible) {
		target.style.visibility = "visible";
	} else {
		target.style.visibility = "hidden";
	}
}

function position(target,x,y) {
	setLocation(target,x,y);
}

function setLocation(target,x,y) {
	target.style.left	= x + PX;
	target.style.top	= y + PX;
}

function getX(target) {
	return parseInt(target.style.left);
}

function setX(target,x) {
	target.style.left = x+PX;
}

function getY(target) {
	return parseInt(target.style.top);
}

function setY(target,y) {
	target.style.top = y+PX;
}

function getWidth(target) {
	return parseInt(target.style.width);
}

function setWidth(target,w) {
	target.style.width = w + PX;
}

function getHeight(target) {
	return parseInt(target.style.height);
}

function setHeight(target,h) {
	target.style.height = h + PX;
}

function getBackgroundPositionX(n) {
	var bgPos = n.style.backgroundPosition;
	bgPos = bgPos.replace(/(\d+)/i,"$1");
	return parseInt(bgPos);
}

function getBackgroundPositionY(n) {
	var bgPos = n.style.backgroundPosition;
	bgPos = bgPos.replace(/\d+px\s+(\d+)/i,"$1");
	return parseInt(bgPos);
}

function setBackgroundPosition(n,x,y) {
	n.style.backgroundPosition = x + PX + SPACE + y + PX;
}

function remove(target) {
	target.parentNode.removeChild(target);
}

function add(target) {
	document.body.appendChild(target);
}

function trim(s) {
	s = s.replace(/^\s*/g,EMPTY_STRING).replace(/\s*$/g,EMPTY_STRING);
	return s;
}

function setOpacity(target,percent) {
	// e.g.: percent == 40	
	if (isType(target.style.opacity,STRING)) {
		target.style.opacity = EMPTY_STRING + (percent/100);
	} else if (isType(target.style.mozOpacity,STRING)) {
		target.style.mozOpacity = EMPTY_STRING + (percent/100);
	}
}

function getElementsWithClassName(root,className) {
	var tags = root.getElementsByTagName( STAR );
	var resultSet = [];
	for (var i = 0; i < tags.length; i++) {
		if (isClass(tags[i],TAB_CLASS_NAME)) {
			resultSet[resultSet.length] = tags[i];
		}
	}
	return resultSet;
}

function getFirstChildByTagName(target,tagName) {
	var cn = target.childNodes;
	tagName = tagName.toLowerCase();
	for (var i = 0; i < cn.length; i++) {
		if (cn[i].nodeName.toLowerCase() == tagName) {
			return cn[i];
		}
	}
	return null;
}

function getLastChildByTagName(target,tagName) {
	var cn = target.childNodes;
	tagName = tagName.toLowerCase();
	for (var i = cn.length-1; i >= 0; i--) {
		if (cn[i].nodeName.toLowerCase() == tagName) {
			return cn[i];
		}
	}
	return null;
}

function getDescendantsByTagAndClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.getElementsByTagName(tagName.toLowerCase());
	for (var i = 0; i < elems.length; i++) {
		if (isClass(elems[i],className)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByAttributeValue(root,name,value) {
	var resultSet = [];
	var elems = root.getElementsByTagName( STAR );
	for (var i = 0; i < elems.length; i++) {
		if (value == elems[i].getAttribute(name)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByTagNameAndAttributeValue(root,tagName,name,value) {
	var resultSet = [];
	var elems = root.getElementsByTagName( tagName );
	for (var i = 0; i < elems.length; i++) {
		if (value == elems[i].getAttribute(name)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByTagNameExceptClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.getElementsByTagName(tagName.toLowerCase());
	for (var i = 0; i < elems.length; i++) {
		if (isClass(elems[i],className)) {
			continue;
		} else {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getChildrenByTagAndClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.childNodes;
	for (var i = 0; i < elems.length; i++) {
		if (elems[i].nodeType != 1)
			continue;
		if (isClass(elems[i],className) && isNodeName(elems[i],tagName)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function isNodeName(target,tagName) {
	tagName = tagName.toLowerCase();
	return target.nodeName.toLowerCase() == tagName;
}

function isType(target,type) {
	return typeof target == type;
}

function isNodeType(target,nodeType) {
	return target.nodeType == nodeType;
}

function isId(target,id) {
	if (isType(id,STRING)) {
		return target.id == id;
	} else if (isType(id,OBJECT)) {
		for (var i = 0; i < id.length; i++) {
			if (target.id == id[i]) {
				return true;
			}
		}
	}
	return false;
}

function isClass(target,className) {
	if (!target.className)
		return false;
	if (isType(className,STRING)) {
		return target.className.indexOf(className) > -1;
	} else if (isType(className,OBJECT)) {
		for (var i = 0; i < className.length; i++) {
			if (target.className.indexOf(className[i]) > -1) {
				return true;
			}
		}
	}
	return false;
}

function setClassAsHover(target) {
	removeClass(target,ACTIVE);
	addClass(target,HOVER);
	
}

function setClassAsActive(target) {
	removeClass(target,HOVER);
	addClass(target,ACTIVE);
}

function setClassAsNormal(target) {
	removeClass(target,HOVER);
	removeClass(target,ACTIVE);
}

function setClassAsFocused(target) {
	removeClass(target,UNFOCUSED);
	addClass(target,FOCUSED);
}

function setClassAsUnFocused(target) {
	removeClass(target,FOCUSED);
	addClass(target,UNFOCUSED);
}


function addClass(target,k) {
	var cn = target.className;
	if (cn && cn.indexOf(k) > -1) {
		return;
	}
	if (cn && cn.length > 0) {
		k = SPACE + k;
		cn += k;
	} else {
		cn = k;
	}
	target.className = cn;
}

function removeAllClasses(target) {
	target.className = "";
}

function removeClass(target,k) {
	var cn = target.className;
	if (!cn) {
		return;
	}
	//cn = cn.replace(/^\s/g,EMPTY_STRING).replace(/\s$/g,EMPTY_STRING);
	cn = trim(cn);
	var index;
	if ((index = cn.indexOf(k)) > -1) {
		cn = cn.substring(0,index)+cn.substring(index+k.length);
	}
	target.className = cn;
}

function toggleClass(target,k) {
	if (isClass(target,k)) {
		removeClass(target,k);
	} else {
		addClass(target,k);
	}	
}

function findAncestorWithClassName(target,className) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isClass(parent,className)) {
			return parent;
		}
	}
	return null;
}

function findAncestorWithTagName(target,tagName) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfWithTagName(target,tagName) {
	if (isNodeName(target,tagName))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfByNodeType(target,nodeType) {
	if (isNodeType(target,nodeType))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeType(parent,nodeType)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfWithClassName(target,className) {
	if (isClass(target,className))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isClass(parent,className)) {
			return parent;
		}
	}
	return null;
}

function findPreviousSiblingByTagName(target,tagName) {
	var sibling = target;
	tagName = tagName.toLowerCase();
	while (sibling = sibling.previousSibling) {
		if (isNodeName(sibling,tagName)) {
			return sibling;
		}
	}
	return null;
}

function findNextSiblingByTagName(target,tagName) {
	var sibling = target;
	tagName = tagName.toLowerCase();
	while (sibling = sibling.nextSibling) {
		if (isNodeName(sibling,tagName)) {
			return sibling;
		}
	}
	return null;
}

function findAncestorWithId(target,id) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (parent.id.indexOf(id) > -1) {
			return parent;
		}
	}
	return null;
}

function findAncestorWithTagName(target,tagName) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function getActualX(n) {
	var docEl = document.documentElement;
	var body  = document.body;
	//alert(n.naturalHeight);
}

function getActualY(n) {
	var docEl = document.documentElement;
	var body  = document.body;

}

function getScrollX() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.scrollX)	  ? window.scrollX :
		   (docEl.scrollLeft) ? docEl.scrollLeft :
		   (body.scrollLeft)  ? document.body.scrollLeft : 0;
}
	
function getScrollY() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.scrollY)	 ? window.scrollY :
		   (docEl.scrollTop) ? docEl.scrollTop :
		   (body.scrollTop)	 ? body.scrollTop : 0;
}

function getViewportWidth() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.innerWidth) ? window.innerWidth : 
		   (docEl.clientWidth) ? docEl.clientWidth : 
		   (body.clientWidth)  ? body.clientWidth : 0;
}
	
function getViewportHeight() {	
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.innerHeight) ? window.innerHeight :
		   (docEl.clientHeight) ? docEl.clientHeight :
		   (body.clientHeight)	? body.clientHeight : 0;	
}

function getScreenX() {
	return window.screenX;
}

function getScreenY() {
	return window.screenY;
}

function getScreenWidth() {
	return screen.width;
}

function getScreenHeight() {
	return screen.height;
}

function getBrowserWidth() {
	return window.outerWidth;
}

function getBrowserHeight() {
	return window.outerHeight;
}

function getOffsetLeft(n) {
	var result = n.offsetLeft;
	for (var parent = n; parent = parent.offsetParent; parent != null) {
		result += parent.offsetLeft;
	}
	return result;
}

function getOffsetTop(n) {
	var result = n.offsetTop;
	for (var parent = n; parent = parent.offsetParent; parent != null) {
		result += parent.offsetTop;
	}
	return result;
}

function var_dump(n) {
	document.write("<style type=\"text/css\"> " +
		"body { font:10px/1.3 \"Lucida Grande\" } " +
		"</style>");
	for (var p in n) {
		document.write("<b>"+p+"</b>"+
			"<span style=\"color:red;\"> = </span>"+n[p]+"<br>");
	}
}

var MAC		= "Mac";
var WIN		= "Win";
var OPERA	= "Opera";
var CAMINO	= "Camino";
var WEB_KIT = "AppleWebKit";
var GECKO	= "Gecko";
var MSIE	= "MSIE";
var MSIE_50 = MSIE+" 5.0";
var MSIE_55 = MSIE+" 5.5";
var MSIE_6	= MSIE+" 6";

var isMac,isWin,isOpera,isCamino,isSafari,isGecko,isIE5Mac,isIEWin,isIE50Win,
		isIE55Win,isIE6Win;

function UADetect() {
	var UA = navigator.userAgent;
	//document.write(UA);
	if (UA.indexOf(MAC) != -1)
		isMac = true;
	else if (UA.indexOf(WIN) != -1)
		isWin = true;
	
	if (UA.indexOf(OPERA) != -1)
		isOpera = true;
	else if (UA.indexOf(CAMINO) != -1)
		isCamino = true;
	else if (UA.indexOf(WEB_KIT) != -1)
		isSafari = true;
	else if (UA.indexOf(GECKO) != -1)
		isGecko = true;
	else if (isMac && UA.indexOf(MSIE) != -1)
		isIE5Mac = true;
	else if (isWin && UA.indexOf(MSIE) != -1 && !isOpera) {
		isIEWin = true;
		if (UA.indexOf(MSIE_50) != -1)
			isIE50Win = true;
		else if (UA.indexOf(MSIE_55) != -1)
			isIE55Win = true;
		else  if (UA.indexOf(MSIE_6) != -1)
			isIE6Win = true;
	}
}

function UAWarning() {

	if (isIEWin || isGecko) {
			
		return;
	}
	
	var c = new Cookie("rackspace.ua.warning","true");
	
	if (Cookie.pageHasCookieWithNameAndValue(c)) {
			
		return;
	}
	
	Cookie.set(c);
}

UADetect();
UAWarning();

/**
 *	@param Event evt
 *	@param string msg
 *	@return void
 */
function confirmAction(evt,msg) {
	evt = new Evt(evt,true);
	if (!confirm(msg)) {
		evt.cancel();
	}
}

function closePopupRefresh(URL) {
	window.close();
	window.opener.location.href = URL;
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function initRSMenu() {
	rsMenuWrap 		= document.getElementById("rs-menu-wrap");
	rsMenu 			= document.getElementById("rs-menu");
	topLevelItems 	= rsMenu.getElementsByTagName("top-level-item");
	headers			= rsMenu.getElementsByTagName(H3);
	hasSubs			= getDescendantsByTagAndClassName(
												rsMenu,
												"li",
												"has-subs");
	lis				= getDescendantsByTagNameExceptClassName(
												rsMenu,
										   		"li",
										   		"top-level-item");
	anchors			= rsMenu.getElementsByTagName(A);
	mnemonics		= getDescendantsByTagAndClassName(
												rsMenu,
												"span",
												"mnemonic");
	menuComboBoxes		= document.body.getElementsByTagName( "select" );
	
	
	//Evt.subscribe(document,"mouseover",bodyOverHandle);
	Evt.subscribe(document,"mouseover",bodyClickHandle);
	//Evt.subscribe(document,"keypress",keyPressHandle);
	if (isIEWin) {
		Evt.subscribe(document,"keyup",keyUpHandle);
	} else {
		Evt.subscribe(document,"keypress",keyUpHandle);
	}
	for (var i = 0; i < headers.length; i++) {
		//Evt.subscribe(headers[i],"mouseover",rsMenuHeaderOverHandle);
		Evt.subscribe(headers[i],"mouseover",rsMenuHeaderClickHandle);
		//Evt.subscribe(headers[i],"mouseout", rsMenuHeaderOutHandle );
	}
	for (var i = 0; i < lis.length; i++) {
		Evt.subscribe(lis[i],"mouseover",liOverAdapter);
		Evt.subscribe(lis[i],"mouseout", liOutHandle );
	}
	for (var i = 0; i < mnemonics.length; i++) {
		//Evt.subscribe(mnemonics[i],"mouseover",rsMenuHeaderOverHandle);
		Evt.subscribe(mnemonics[i],"mouseover",rsMenuHeaderClickHandle);
	}
}


function subscribeMouseOverHandlers() {
	for (var i = 0; i < headers.length; i++) {
		Evt.subscribe(headers[i],"mouseover",rsMenuHeaderOverHandle);
	}
	for (var i = 0; i < mnemonics.length; i++) {
		Evt.subscribe(mnemonics[i],"mouseover",rsMenuHeaderOverHandle);
	}
}
	
function unSubscribeMouseOverHandlers() {
	for (var i = 0; i < headers.length; i++) {
		Evt.unsubscribe(headers[i],"mouseover",rsMenuHeaderOverHandle);
	}
	for (var i = 0; i < mnemonics.length; i++) {
		Evt.unsubscribe(mnemonics[i],"mouseover",rsMenuHeaderOverHandle);
	}
}

function rsMenuHeaderClickHandle(evt) {
	if (isIEWin) {
		hideAllMenuComboBoxes();
	}
	subscribeMouseOverHandlers();
	rsMenuHeaderOverHandle(evt);
}

function rsMenuHeaderOverHandle(evt) {
	//clearRSMenuTimeout();
	evt = new Evt(evt,true);
	hideAllMenus();
	evt.target = findAncestorOrSelfWithTagName(evt.target,"h3");
	setClassAsHover(evt.target);
	showSubMenu(findAncestorWithTagName(evt.target,"li"));
	selectedTopLevelMenuItem = evt.target;
	evt.cancel();
}

function rsMenuHeaderOutHandle(evt) {
	evt = new Evt(evt,true);
	//selectedTopLevelMenuItem = null;
	evt.cancel();
}

/*	function clearRSMenuTimeout() {
	clearTimeout(rsMenuTimeout);
}*/

function liOverAdapter(evt) {
	evt = new Evt(evt,true);
	liOverHandle(evt);
}

function liOverHandle(evt) {
	try {
		//clearRSMenuTimeout();
		var ul = findAncestorWithTagName(evt.target,"ul");
		var li;
		setClassAsNormal(theAnchor);
		setClassAsNormal(theOtherAnchor);
		if (isClass(ul,"sub-menu")) {
			li = findAncestorWithTagName(ul,"li");
			selectedParentItem = li;
			theOtherAnchor = getFirstChildByTagName(li,"a");
			setClassAsActive(theOtherAnchor);
		} else {
			hideAllSubMenus();
		}
		li = findAncestorWithTagName(evt.target,"li");
		theAnchor = evt.target;
		setClassAsHover(theAnchor);
		showSubMenu(li);
		selectedMenuItem = li;
		evt.cancel();
	} catch (e) { }
}

function isMenuTooWide(n) {
	menuFloatingLeft = false;
	if (isClass(n,"top-level")) {
		return false;
	}
	
	var nLeft = getOffsetLeft(n);
	var vWidth = getViewportWidth();
	var menuWidth = 210;

	// Check for viewportwidth
	if (nLeft + (menuWidth*2) > vWidth) {
		menuFloatingLeft = true;
	}
	
	// Check for screen width
	if (nLeft + (menuWidth*2) + getScreenX() > getScreenWidth()) {
		menuFloatingLeft = true;
	}
	
	return menuFloatingLeft;
}

function liOutHandle(evt) {
	evt = new Evt(evt,true);
	setClassAsNormal(evt.target);
	selectedMenuItem = null;
	evt.cancel();
}

/*function bodyOverHandle(evt) {
	evt = new Evt(evt,true);
	if (isNodeName(evt.target,HTML) || isNodeName(evt.target,"body")) {
		rsMenuTimeout = setTimeout('hideAllMenus();',450);
	}
}*/

function bodyClickHandle(evt) {
	evt = new Evt(evt,true);
	if (findAncestorOrSelfWithClassName(evt.target,
									  "top-level-item")) {
		return;
	}
	hideAllMenus(evt);
	unSubscribeMouseOverHandlers();
	if (isIEWin) {
		showAllMenuComboBoxes();
	}
}

function showSubMenu(li) {
	var ul = getFirstChildByTagName(li,"ul");
	if (ul) {
		if (isMenuTooWide(li)) {
			setX(ul,-252);
		}
		show(ul);
	}
}

function hideSubMenu(li) {
	var ul = getFirstChildByTagName(li,"ul");
	if (ul) {
		setX(ul,0);
		hide(ul);
	}
}

function hideAllMenus() {
	var uls = rsMenu.getElementsByTagName("ul");
	for (var i = 0; i < uls.length; i++) {
		hide(uls[i]);
	}
	for (var i = 0; i < headers.length; i++) {
		setClassAsNormal(headers[i]);
	}
	if (selectedMenuItem) {
		setClassAsNormal(getFirstChildByTagName(selectedMenuItem,"a"));
	}
	if (theAnchor) {
		setClassAsNormal(theAnchor);
	}
	if (theOtherAnchor) {
		setClassAsNormal(theOtherAnchor);
	}
	selectedTopLevelMenuItem 	= null;
	selectedMenuItem 			= null;
	selectedParentItem 			= null;
}

function hideAllSubMenus() {
	var uls = getDescendantsByTagAndClassName(document,"ul","sub-menu");
	for (var i = 0; i < uls.length; i++) {
		setX(uls[i],170);			
		hide(uls[i]);
	}
}


/** 
 * Keyboard navigation functions
 */
 
 function showSpecificMenu(evt,itemName) {
	var h3 = document.getElementById(itemName+"-menu-item");
	if (!h3) {
		return;
	}
	evt.target = h3;
	rsMenuHeaderOverHandle(evt);
}
 
 function followMenuLink(evt) {
	var anchor = getFirstChildByTagName(selectedMenuItem,"a");
	window.location = anchor.href;
}


function menuUpOrDownKeyPressed(evt,dir) {
	var li,ul;
	if (!selectedMenuItem) {
		li = findAncestorWithTagName(selectedTopLevelMenuItem,"li");
		ul = getFirstChildByTagName(li,UL);
		if (DOWN == dir) {
			selectedMenuItem = getFirstChildByTagName(ul,"li");
		} else {
			selectedMenuItem = getLastChildByTagName(ul,"li");
		}
		theAnchor = getFirstChildByTagName(selectedMenuItem,"a");
	} else {
		ul = findAncestorWithTagName(selectedMenuItem,"ul");
		var items = getChildrenByTagAndClassName(ul,"li","");
		if (DOWN == dir) {
			if (selectedMenuItem == items[items.length-1]) {
				li = getFirstChildByTagName(ul,"li");
			} else {
				li = findNextSiblingByTagName(selectedMenuItem,"li");
			}
		} else {
			if (selectedMenuItem == items[0]) {
				li = getLastChildByTagName(ul,"li");
			} else {
				li = findPreviousSiblingByTagName(selectedMenuItem,"li");
			}
		}
		theAnchor = getFirstChildByTagName(li,"a");
		setClassAsNormal(getFirstChildByTagName(selectedMenuItem,"a"));
		selectedMenuItem = li;
	}
	evt.target = theAnchor;
	liOverHandle(evt);
}



function menuRightOrLeftKeyPressed(evt,dir) {
	if (selectedMenuItem) {
		setClassAsNormal(getFirstChildByTagName(selectedMenuItem,A));
	}
	if (selectedMenuItem && isClass(selectedMenuItem,"has-subs") 
			&& RIGHT == dir && !menuFloatingLeft) {
		navigateToSubMenu(evt);
	} else if (selectedMenuItem && isClass(selectedMenuItem,"has-subs") 
				&& LEFT == dir && menuFloatingLeft) {
		navigateToSubMenu(evt);
	} else if (selectedParentItem && LEFT == dir && !menuFloatingLeft) {
		navigateToParentMenu(evt);
	} else if (selectedParentItem && menuFloatingLeft && RIGHT == dir) {
		navigateToParentMenu(evt);
	} else {
		navigateToTopLevelMenu(evt,dir);
	}
}

function navigateToSubMenu(evt) {
	var ul,items,anchor;
	selectedParentItem = selectedMenuItem;
	ul = getFirstChildByTagName(selectedMenuItem,UL);
	items = ul.getElementsByTagName("li");
	selectedMenuItem = items[0];
	anchor = getFirstChildByTagName(selectedMenuItem,A);
	evt.target = anchor;
	liOverHandle(evt);
}

function navigateToParentMenu(evt) {
	var anchor;
	selectedMenuItem = selectedParentItem;
	selectedParentItem = null;
	anchor = getFirstChildByTagName(selectedMenuItem,A);
	evt.target = anchor;
	liOverHandle(evt);
}

function navigateToTopLevelMenu(evt,dir) {
	var li,ul,items,nextLI,index;
	if (selectedParentItem) {
		setClassAsNormal(getFirstChildByTagName(selectedParentItem,A));
		selectedParentItem = null;
	}
	li = findAncestorWithTagName(selectedTopLevelMenuItem,"li");
	ul = findAncestorWithTagName(li,UL);	
	items = new List(ul.getElementsByTagName(H3));
	index = items.indexOf(selectedTopLevelMenuItem);
	if (RIGHT == dir) {
		if (index == items.size()-1) {
			nextLI = findAncestorWithTagName(items.get(0),"li");
		} else {
			nextLI = findAncestorWithTagName(items.get(index+1),"li");
		}
	} else {
		if (index == 0) {
			nextLI = findAncestorWithTagName(items.get(items.size()-1),"li");
		} else {
			nextLI = findAncestorWithTagName(items.get(index-1),"li");
		}
	}
	selectedTopLevelMenuItem = getFirstChildByTagName(nextLI,H3);
	evt.target = selectedTopLevelMenuItem;
	selectedMenuItem = null;
	rsMenuHeaderOverHandle(evt);
}

/**
 *	@return void
 */
function hideAllMenuComboBoxes() {
	for (var i = 0; i < menuComboBoxes.length; i++) {
		setVisible(menuComboBoxes[i],false);
	}
}

/**
 *	@return void
 */
function showAllMenuComboBoxes() {
	for (var i = 0; i < menuComboBoxes.length; i++) {
		setVisible(menuComboBoxes[i],true);
	}
}
 
