
function setVerticalHeight()
{
	debugWrite("setVerticalHeight()");
	
	var heights = new Array();
	var contentHeight = getContentHeight();
	var heightMax;

	heights.push(getObjectHeight(getSiteMenu()));	
	heights.push(getObjectHeight(getCatalogMenu()));
	heights.push(getMinBodyHeight());
		
	debugWrite("contentHeight = " + contentHeight);
	
	if (contentHeight != null)
	{
		heights.push(contentHeight);
	}
	heights.sort(function(a, b) { return a - b; })
	heightMax = heights[heights.length - 1];
	
	debugWrite ("heightMax = " + heightMax);
	getSiteMenu().style.height = heightMax;
	getCatalogMenu().style.height = heightMax;
	
	// The padding is subtracted off here because it was added in when the height was
	// originally calculated.  The net effect is that when the height of the PageContentPos 
	// is the heightMax, the menus get the padding of the PageContentPos, when it is not
	// they don't.
	getRawObject("PageContentPos").style.height = heightMax -
		(parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingTop) 
		+ parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingBottom));
		
	var bodyHeight = parseFloat(heightMax);
		
	debugWrite("bodyHeight = " + bodyHeight);
	
	getRawObject("BodyPos").style.height = bodyHeight;
	getRawObject("BodyFull").style.height = bodyHeight;
}

function getMinBodyHeight()
{
	debugWrite("getMinBodyHeight()");
	
	var minTotalHeight = 420;
	var heightMasthead = getObjectHeight("MastheadPos");
	var heightTopSpacer = 0;
	var heightBottomSpacer = 0;
//	var heightFooter = getObjectHeight("FooterPos");
	var heightFooter = getObjectHeight("FooterFull");
	var heightToolbar = 0;
	
	if (document.getElementById("TopSpacer") != null)
	{
		heightTopSpacer = parseFloat(getObjectHeight("TopSpacer"));
	}
	
	if (document.getElementById("BottomSpacer") != null)
	{
		heightBottomSpacer = parseFloat(getObjectHeight("BottomSpacer"));
	}
	
	if (document.getElementById("Toolbar") != null)
	{
		heightToolbar = parseFloat(getObjectHeight("Toolbar"));
	}

	debugWrite(minTotalHeight - (heightMasthead + heightToolbar + heightTopSpacer + heightBottomSpacer + heightFooter));
	
	return minTotalHeight - (heightMasthead + heightToolbar + heightTopSpacer + heightBottomSpacer + heightFooter);
}

function getContentHeight()
{
	debugWrite("getContentHeight()");
	
	var pageContentHeight = getNodeHeight(document.getElementById("PageContentPos"));
	
	debugWrite("pageContentHeight = " + pageContentHeight);
	debugWrite("PageContentPos.paddingTop = " 
		+ parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingTop));
	debugWrite("PageContentPos.paddingBottom = " 
		+ parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingBottom));
		
//	return getNodeHeight(document.getElementById("PageContentPos")) 
	return pageContentHeight 
		+ parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingTop)
		+ parseFloat(getEffectiveStyle(getRawObject("PageContentPos")).paddingBottom);
}

function getNodeHeight(
	node)
{
	debugWrite("getNodeHeight(node)");

	var heights = new Array();
	
	for (var i = 0; i < node.childNodes.length; i++)
	{
		heights.concat(accumulateNodeHeights(node.childNodes[i], 0, heights));
	}
//	heights = accumulateNodeHeights(node, 0, heights);
//	heights = accumulateNodeHeights(node, 0, heights);
	debugWrite("back from accumulatedNodeHeights");
	// Add height of original node for the case where there are not absolutely positioned elements
	// that extend it larger
//	heights.push(node.offsetHeight);
	heights.push(getObjectHeight(node));
	heights.sort(function(a, b) { return a - b; })
	
	debugWrite("heights.length = " + heights.length);
	
	for (var i = 0; i < heights.length; i++)
	{
		debugWrite("heights[" + i + "] = " + heights[i]);
	}
	debugWrite("forover");
	
	if (heights.length == 0)
	{
		return null;
	}
	else
	{
		return heights[heights.length - 1];
	}
}

function accumulateNodeHeights(
	node,
	contextTop,
	heights)
{
	var newContextTop;
	var sum = 0;
//	var retArr = new Array();
	
	debugWrite(">>>");
	debugWrite("accumulateNodeHeights(node, contextTop, heights)");
	
//	debugWrite("node.nodeValue = " + node.nodeValue);
	debugWrite("node.nodeName = " + node.nodeName);
//	debugWrite("node.nodeType = " + node.nodeType);
//	debugWrite("node.childNodes.length = " + node.childNodes.length);
//	debugWrite("node.offsetParent.nodeName = " + node.offsetParent.nodeName); //error!!!
//	debugWrite("node.offsetParent = " + node.offsetParent); //useless!!!
	debugWrite("node.offsetTop = " + node.offsetTop);
//	debugWrite("node.offsetHeight = " + node.offsetHeight);
	debugWrite("node.height = " + node.height);
	debugWrite("contextTop = " + contextTop);
	
	if (node.style != null)
	{
//		debugWrite("node.style != null");
		
		newContextTop = getNewContextTop(node, contextTop);
		heights.push(getComputedHeight(node, newContextTop));	
	}
	
//	debugWrite("node.style.height = " + node.style.height);				
//	debugWrite("node.style.top = " + node.style.top);
//	debugWrite("node.childNodes.length = " + node.childNodes.length);
	
	// Recursion
	for (var i = 0; i < node.childNodes.length; i++)
	{
//		debugWrite("child# = " + i);

//		retArr.concat(accumulateNodeHeights(node.childNodes[i], newContextTop, heights));
		heights.concat(accumulateNodeHeights(node.childNodes[i], newContextTop, heights));
							
//		accumulateNodeHeights(node.childNodes[i], newContextTop, heights);
//		return accumulateNodeHeights(node.childNodes[i], contextTop + node.style.top, heights.concat(contextTop + node.style.height));
	}
//	debugWrite("retArr = " + retArr.toString());
	debugWrite("heights = " + heights.toString());
	debugWrite("<<<");
	return heights;
//	return retArr;
}

function getNewContextTop(
	node,
	contextTop)
{
	debugWrite("getNewContextTop(node, contextTop)");

	var newContextTop = contextTop;

	if (node.style.top == null)
	{
		debugWrite("node.style.top == null");
	}
	else
	{
//		debugWrite("node.style.top = " + node.style.top);
//		debugWrite("node.style.top != null");
		
		if (!isNaN(parseFloat(node.style.top)))
		{
			debugWrite("node.style.top = " + parseFloat(node.style.top));
			newContextTop = contextTop + parseFloat(node.style.top);
		}
		else if (node.style.position == "relative")
		{
			debugWrite("node.style.position == relative");
			newContextTop = contextTop + parseFloat(node.offsetTop);
		}
//		newContextTop = contextTop + parseFloat(getObjectTop(node));
		debugWrite("newContextTop = " + newContextTop);
	}
	return newContextTop;
}

function getComputedHeight(
	node,
	newContextTop)
{
	debugWrite("getComputedHeight(node, newContextTop)");
	
	var sum = newContextTop + getObjectHeight(node);
	debugWrite("sum = " + sum);
	return sum;					
}

function getCatalogMenu()
{
	return getRawObject("NoCatalogMenuPos") ? getRawObject("NoCatalogMenuPos") : getRawObject("CatalogMenuPos"); 
}

function getSiteMenu()
{
	return getRawObject("NoCatalogSiteMenuPos") ? getRawObject("NoCatalogSiteMenuPos") : getRawObject("SiteMenuPos"); 
}

function debugWrite(
	message)
{
//	document.getElementById("debugTrace").insertAdjacentHTML("BeforeEnd", message + "<br>");
}




