var g_defaultHeight = 16;
var g_lastHeight = 0;
var g_currentHeight = 0;
var g_checkHeight = 0;
var g_Enlarging = false;
var g_template = null;
var g_Interval = 0;
var g_divTemplateSizes = [0,0,0,0,0,0,0];
var g_divTemplateLengths = [0,0,0,0,0,0,0];

//
// note: g_divTemplateSizes[]:               ref as 'array'
// note: largest found element content:      ref as 'l_content'
// note: largest found element content size: ref as 'l_size'
// note:                  template element : ref as 't_elem'
//
// bit        set                                             clr
// ------ ----------------------------------------------  --------------------------------------------
// 0 (1): resize display element                          do not resize display element
// 1 (2): array totaled value [template]                  add to array totaled value
// 2 (4): t_elem exists                                   t_elem does not exist
// 3 (8): (4 set [&12==12]): store l_content to t_elem    (4 set [&12==4]) store t_elem size to array
// 3 (8): (4 clr [&12== 8]): store l_size to array        (4 clr [&12==0]) unused
//
var g_divClasses = ['issue','book','thumb','desc','price','desc1','bookform'];
var g_divOps     = [ 1+2,    1+2,   1+8,    1+4+8, 1+4+8,  1+4+8,  1+4+8    ];

var g_iterations = 0;

function getElementContent(element)
{
	if ( element.innerHTML ) { return element.innerHTML; }
	else { return ""; };
}

function copyElementContent(dstElement,srcElement)
{
	if ( srcElement.innerHTML )
	{
		dstElement.innerHTML = getElementContent(srcElement);
		return true;
	}
	return false;
}

function getElementContentLength(element)
{
	var content = getElementContent(element);
	return content.length;
}

function GetDocumentElementById( doc, elementId )
{
	if ( doc.getElementById ) { return doc.getElementById(elementId); }
	else if ( doc.layers ) { return doc.layers.document.getElementById(elementId); }
	else { return null; }
}

function GetElementById( elementId )
{
	if ( document.getElementById ) { return document.getElementById(elementId); }
	else if ( document.layers ) { return document.layers.document.getElementById(elementId); }
	else { return null; }
}

function getNode() { return GetElementById('theNode'); }

function getNodeHeight()
{
	var theNode = getNode();
	if ( null != theNode ) { return theNode.offsetHeight; } else { return g_defaultHeight; }
}

function GetTemplateElementByIndex( index )
{
	return GetElementById( "id_" + g_divClasses[index] + "_template" );
}

function GetTemplate()
{
	if ( null == g_template )
	{
		for ( var index = 0 ; index < g_divClasses.length ; index++ )
		{
			if ( g_divOps[index] & 2 )	// find the template
			{
				g_template = GetTemplateElementByIndex( index );
				if ( null != g_template ) return true;
			}
		}
	}
	return ( null != g_template ) ? true : false;
}

function LoadTemplateElementData()
{
	var divs = document.getElementsByTagName('div');
	if ( null != divs )
	{
		var divTallestElements = [-1,-1,-1,-1,-1,-1,-1];
		var divOffsetHeight = [0,0,0,0,0,0,0];
		var divLongestElements = [-1,-1,-1,-1,-1,-1,-1];
		var divOffsetLength = [0,0,0,0,0,0,0];
		var index = 0;
		var length = 0;
		var success = false;

		for ( var i = 0 ; i < divs.length ; i++ )
		{
			index = GetElementIndex( divs[i] );
			if ( index == -1 || (g_divOps[index] & 2) )	// skip unknown elements and array totaled values
				continue;
			if ( divs[i].offsetHeight > divOffsetHeight[index] )
			{
				divOffsetHeight[index] = divs[i].offsetHeight;
				divTallestElements[index] = i;
			}
			length = getElementContentLength(divs[i]);
			if ( length > divOffsetLength[index] )
			{
				divOffsetLength[index] = length;
				divLongestElements[index] = i;
			}
		}
		for ( index = 0 ; index < g_divClasses.length ; index++ )
		{
			var element = GetTemplateElementByIndex( index );
			//if ( null == element ) continue;
			switch ( g_divOps[index] & 12 )
			{
			case 12:	// template element exists, store largest content

				if ( null == element ) break;
				if ( g_Enlarging )
				{
					if ( divTallestElements[index] > -1 )
					{
						success = copyElementContent(element,divs[divTallestElements[index]]);
					}
					if ( false == success && divLongestElements[index] > -1 )
					{
						copyElementContent(element,divs[divLongestElements[index]]);
					}
				}
				else
				{
					if ( divLongestElements[index] > -1 )
					{
						success = copyElementContent(element,divs[divLongestElements[index]]);
					}
					if ( false == success && divTallestElements[index] > -1 )
					{
						copyElementContent(element,divs[divTallestElements[index]]);
					}
				}
				break;

			case 8:		// template element does not exist, use tallest found element content

				if ( divTallestElements[index] > -1 )
				{
					g_divTemplateSizes[index] = divOffsetHeight[index];
				}
				else if ( divLongestElements[index] > -1 )
				{
					g_divTemplateSizes[index] = divs[divLongestElements[index]].offsetHeight;
				}
				break;

			case 4:		// template element exists, use existing content
				if ( null != element ) g_divTemplateSizes[index] = element.offsetHeight;
				break;
			}
		}
	}
}

function GetTemplateSizes()
{
	var i = 0;
	var total = 0;

	for ( i = 0 ; i < g_divTemplateSizes.length ; i++ )
	{
		if ( (g_divOps[i] & 4) ) g_divTemplateSizes[i] = 0; // zero array item, template element exists
	}
	for ( i = 0 ; i < g_divClasses.length ; i++ )
	{
		if ( g_divOps[i] & 2 ) continue; // ignore array totaled values
		if ( (g_divOps[i] & 4) )	// template element exists
		{
			var element = GetTemplateElementByIndex( i );
			if ( null != element ) { g_divTemplateSizes[i] = element.offsetHeight; }
		}
		total += g_divTemplateSizes[i];
	}
	for ( i = 0 ; i < g_divClasses.length ; i++ )
	{
		if ( g_divOps[i] & 2 ) { g_divTemplateSizes[i] = total; } // array totaled value
	}
}

function SetElementSizes()
{
	if ( !document.getElementsByTagName('div') ) return;
	var divs = document.getElementsByTagName('div');
	
	for ( var i = 0 ; i < divs.length ; i++ )
	{
		var element = divs[i];
		var index = GetElementIndex( divs[i] );
		if ( index > -1 && g_divOps[index] & 1 )
		{
			element.style.height = g_divTemplateSizes[index].toString() + "px";
			if (element.className.indexOf("thumb") > -1 && element.hasChildNodes())
			{
				if (element.childNodes[0].tagName.toLowerCase().indexOf("a") > -1 && element.childNodes[0].hasChildNodes())
				{
					var e = element.childNodes[0].childNodes[0];
					if (e.tagName.toLowerCase().indexOf("img") > -1)
					{
						var p = element.parentElement;
						if (e.offsetWidth > p.offsetWidth)
						{
							p.style.width = (e.offsetWidth + 3).toString() + "px";
							element.style.width = e.offsetWidth.toString() + "px";
						}
					}
				}
			}
		}
	}
}

function SetElementColor( elementId, color )
{
	var element = GetElementById(elementId);
	if ( null != element ) { element.style.color = color; }
}

function GetElementIndex( element )
{
	var elementClass = element.className;
	if ( elementClass.length > 0 )
	{
		for ( var i = 0 ; i < g_divClasses.length ; i++ )
		{
			if ( 0 == g_divClasses[i].indexOf( elementClass ) ) { return i; }
		}
	}
	return -1;
}
		
function SetBodyFunctions( over, out )
{
	document.body.onmouseover = ( false != over ) ? DoOnMouseOver : null;
	document.body.onmouseout = ( false != out ) ? DoOnMouseOut : null;
}

function DoOnMouseOver()
{
	SetBodyFunctions( false, false );
	if ( SizeChanged() )
	{
		LoadTemplateElementData();
		g_iterations++;
		g_lastHeight = g_currentHeight;
		g_currentHeight = g_checkHeight;
		g_Interval = self.setInterval( ReSize_Start, 200 );
	}
	else { SetBodyFunctions( false, true ); }
	return true;
}

function DoOnMouseOut() { SetBodyFunctions( true, false ); return true; }

function SizeChanged()
{
	g_checkHeight = getNodeHeight();
	
	if ( g_currentHeight != g_checkHeight )
	{
		g_Enlarging = ( g_currentHeight < g_checkHeight ) ? true : false;
		return true;
	}
	return false;
}

function ReSize_Start()
{
	self.clearInterval(g_Interval);
	GetTemplateSizes();
	SetElementSizes();
	SetBodyFunctions( false, true );
	return true;
}

