var	helpModeHelp	= "helpModeHelp";
var	helpSearch		= "helpSearch";
var	helpIndex		= "helpIndex";
var	helpChat		= "helpChat";
var helpDynamicImgSuffix = "DynamicImgCopy";
var DELTA_Y = 15;
var DELTA_T = 30;
var DELTA_T_PAGING = 120;
var HELP_FRAME_HEIGHT = 0;
var HELP_MAIN_DIV;
var FLOATING_IMAGE_BORDER_WIDTH = 1;
var	FLOAT_TIME_INTERVAL = 6;	//	Time (milliseconds) between growing steps
var	FLOAT_STEPS = 30;	//	The number of steps to take to get to grow destination
var	FLOAT_EXPONENT = .5;	//	The exponent curve. (1=constant speed, >1= start slow & accelerate, <1 slart fast & decelerate)
var eventList = new Array();

var helpModeInPage = helpModeHelp;
//alert("document.implementation.hasFeature('Events', '2.0') = ["+document.implementation.hasFeature('Events', '2.0')+"]");

function collectEventData(event)
{
	//	Get correct Event object.
	event = getEvent(event);
	var eventObj = new Object();
	eventObj.type = event.type;
	eventObj.target = getEventTarget(event);
	eventObj.relatedTarget = getEventRelatedTarget(event);
	eventObj.time = new Date();
	eventObj.clientX = event.clientX;
	eventObj.clientY = event.clientY;
	eventList[eventList.length] = eventObj;
}

function displayEventData(event)
{
	var msg = "eventList contains ["+eventList.length+"] elements";
	
	for (var i = 0; i < eventList.length; i++)
	{
		msg += "\neventList["+i+"] (time="+eventList[i].time.getMinutes()+":"+eventList[i].time.getSeconds()+"."+eventList[i].time.getMilliseconds()+", type="+eventList[i].type+", target.id="+eventList[i].target.id+", (clientX, clientY)=("+(eventList[i].clientX +", "+ eventList[i].clientY)+"))";
	}
	alert(msg);
	eventList = new Array();
}

function getTabIdForModeInPage(mode)
{
	var retVal = "helpTabHelp";
	switch(mode)
	{
		case helpSearch:
		{
			retVal = "helpTabSearch";
			break;
		}
		case helpIndex:
		{
			retVal = "helpTabIndex";
			break;
		}
		case helpChat:
		{
			retVal = "helpTabChat";
			break;
		}
	}
	return retVal;	
}
 
function getPageIdForModeInPage(mode)
{
	var retVal = "helpPageHelp";
	switch(mode)
	{
		case helpSearch:
		{
			retVal = "helpSearch";
			break;
		}
		case helpIndex:
		{
			retVal = "helpIndex";
			break;
		}
		case helpChat:
		{
			retVal = "helpChat";
			break;
		}
	}
	return retVal;	
}
 
function getCurrHelpTabIdInPage()
{
	return getTabIdForModeInPage(helpModeInPage);
}

function getCurrHelpPageIdInPage()
{
	return getPageIdForModeInPage(helpModeInPage);
}

function setHelpTabCurrInPage(mode)
{
	var currTabId = getCurrHelpTabIdInPage();
	var newTabId = getTabIdForModeInPage(mode);

	//alert("setHelpTabCurrInPage("+mode+")\n newTabId=["+newTabId+"]\n currTabId["+currTabId+"]");

	if (newTabId != currTabId)
	{
		setHelpTabForeground(newTabId);
		setHelpTabBackground(currTabId);		
	}
}

function isThreeTabs(tabObj)
{
	var retVal = false;
	var currentStyle = "";

	try
	{
		currentStyle = tabObj.className;
	}
	catch (e)
	{
		try {currentStyle = tabObj.getAttribute("className");}
		catch (e) { alert(e);}
	}
	
	if (currentStyle == "helptab3" || currentStyle == "helptabcurr3")
	{
		retVal = true;
	}

	return retVal;
}

function setHelpTabForeground(tabId)
{
	//	Get Objects to modify
	var obj = document.getElementById(tabId);
	var containerObj = document.getElementById("helptabs");

	//	Check for three tabs
	var currTabStyle = isThreeTabs(obj) ? "helptabcurr3" : "helptabcurr";

	//	Set the background to match
	if (tabId == "helpTabSearch")
	{
		changeStyle(containerObj, "helptabscurr");
	}
	else
	{
		changeStyle(containerObj, "helptabs");
	}
	
	//	Set the tab
	changeStyle(obj, currTabStyle);
}

function setHelpTabBackground(tabId)
{
	var obj = document.getElementById(tabId);
	var tabStyle = isThreeTabs(obj) ? "helptab3" : "helptab";
	changeStyle(obj, tabStyle);	
}

function setHelpPageCurrInPage(mode)
{
	var helpIFrameWin = window.helpIFrame;
	var currPageId = getCurrHelpPageIdInPage();
	var newPageId = getPageIdForModeInPage(mode);
	
	if (newPageId != currPageId)
	{
		var mainHelpPageObj = helpIFrameWin.document.getElementById("mainHelpPage");
		mainHelpPageObj.x = mainHelpPageObj.y = 0;
		mainHelpPageObj.setPos();
		
		newPageObj = helpIFrameWin.document.getElementById(newPageId);
		currPageObj = helpIFrameWin.document.getElementById(currPageId);

		newPageObj.style.display = "block";
		currPageObj.style.display = "none";
	}
}

function setHelpModeInPage(mode)
{
	//alert("setHelpModeInPage([" + mode + "])\n window.helpIFrame=["+window.helpIFrame+"]\n window.helpIFrame.isHelpLoaded=["+window.helpIFrame.isHelpLoaded+"]");
	if (	window.helpIFrame
		&&	window.helpIFrame.isHelpLoaded	)
	{
		setHelpTabCurrInPage(mode);
		setHelpPageCurrInPage(mode);
		helpModeInPage = mode;	
	}
	//else { alert("Help Frame Not Ready."); }
}

function loadHelpCopyObj(id)
{
	helpIFrameObj = window.frames['helpIFrame'];
	var origImgObj = helpIFrameObj.document.getElementById(id);
	
	// get the floating Div
	var copyObj = document.createElement("div");

	//	Set state
	copyObj.calculatingPosition = false;
	
	// functions
	copyObj.position = positionAndGrow;
	copyObj.id = id + helpDynamicImgSuffix;
	copyObj.name = id + helpDynamicImgSuffix;
	copyObj.className = "helpCopyObj";
	copyObj.style.backgroundImage = "url(" + origImgObj.src + ")";

	//	Get iFrame reference
	helpIFrameDocObj = document.getElementById('helpIFrame');
	helpIFramePos = findPos(helpIFrameDocObj);

	//		set size
	copyObj.style.border = FLOATING_IMAGE_BORDER_WIDTH + "px solid black";
	
	//	Point Objects at eachother
	copyObj.originalImg = origImgObj;
	copyObj.iFrameWinObj = helpIFrameObj;
	copyObj.iFrameDocObj = helpIFrameDocObj;
	origImgObj.copyObj = copyObj;
	origImgObj.iFrameWinObj = helpIFrameObj;
	origImgObj.iFrameDocObj = helpIFrameDocObj;
	
	// add to document and lay out (top of body)
	window.document.body.insertBefore(copyObj, window.document.body.firstChild);

	//	Register events
	addEvent(origImgObj, "mouseover", parent.overlayCopyObj, false);
	//addEvent(origImgObj, "mouseover", parent.collectEventData, false);
	addEvent(origImgObj, "mouseout", parent.mouseOutOrigImg, false);
	//addEvent(origImgObj, "mouseout", parent.collectEventData, false);
	addEvent(copyObj, "mouseout", parent.clearCopyObj, false);
	//addEvent(copyObj, "mouseout", parent.collectEventData, false);
	addEvent(copyObj, "mouseover", parent.reMoveGrow, false);
	//addEvent(copyObj, "mouseover", parent.collectEventData, false);

	return copyObj;
}

function overlayCopyObj(event)
{
	//alert("onMouseOver Orig Img");
	event = getIFrameEvent(event);
	targetObj = getIFrameEventTarget(event);
	if (	targetObj.copyObj.style.display != "block"
		&&	isImgHeightInView(event, targetObj)
		&&	!isImgWidthInView(event, targetObj)			)
	{
		setAndGrowVisibleOverlay(targetObj, targetObj.copyObj, targetObj.copyObj.iFrameWinObj);
	}
}

function clearCopyObj(event)
{
	if (window.eventMouseOutCount) window.eventMouseOutCount++;
	else window.eventMouseOutCount = 1;

	//	Get correct Event object.
	event = getEvent(event);

	var thisObj = getEventTarget(event);
	reMoveShrinkAndHideCopyObj(thisObj);
}

function mouseOutOrigImg(event)
{
	//	Get correct Event object.
	event = getEvent(event);
	var origImg = getEventTarget(event);

	if (	origImg.copyObj.style.display == "block"
		&&	!isIFrameMouseOverCopy(event, origImg)		)
	{
		reMoveShrinkAndHideCopyObj(origImg.copyObj);
	}
}

function getEvent(event)
{
	if (!event)
	{
		event = window.event; 
	}
	return event;
}

function getIFrameEvent(event)
{
	if (!event)
	{
		event = window.frames['helpIFrame'].event; 
	}
	return event;
}

function getEventTarget(event)
{
	event = getEvent(event);
	var targetObj = event.target;
	if (typeof(targetObj) == "undefined")
	{
		targetObj = event.srcElement;
	}
	return targetObj; 
}

function getIFrameEventTarget(event)
{
	event = getIFrameEvent(event);
	var targetObj = event.target;
	if (typeof(targetObj) == "undefined")
	{
		targetObj = event.srcElement;
	}
	return targetObj; 
}

function getEventRelatedTarget(event)
{
	event = getEvent(event);
	var nextObj = event.relatedTarget;
	if (typeof(nextObj) == "undefined")
	{
		nextObj = event.toElement;
	}
	return nextObj;
}

function getIFrameEventRelatedTarget(event)
{
	event = getIFrameEvent(event);
	var nextObj = event.relatedTarget;
	if (typeof(nextObj) == "undefined")
	{
		nextObj = event.toElement;
	}
	return nextObj;
}

function isImgWidthInView(event, origImg)
{
	var retVal = false;
	event = getIFrameEvent(event);
	var imgPos = findPos(origImg);
	var winWidth = getPassedWindowWidth(origImg.iFrameWinObj);
	if ((imgPos[0] + origImg.width) <= winWidth)
	{
		retVal = true;
	}
	//alert("isImgWidthInView xpos["+imgPos[0]+"]\n img width=["+origImg.width+"]\n window width=["+winWidth+"]\n retVal=["+retVal+"]");	
	return retVal;	
}

/*
	Now that images can have borders, it's possible to get a mouseover event
	on an image that is not visible, because the border may still be visible.
*/
function isImgHeightInView(event, origImg)
{
	var retVal = false;
	event = getIFrameEvent(event);
	var imgPos = findPos(origImg);
	var adjust = adjustForImageBorder(origImg.iFrameWinObj.document, origImg);
	var winHeight = origImg.iFrameDocObj.offsetHeight;
	var imgYBegin = imgPos[1] + adjust.objBorderTopWidth;
	var imgYEnd = imgYBegin + origImg.height;

	var yBeginVis = imgYBegin >= 0	&&	imgYBegin < winHeight;
	var yEndVis = imgYEnd >= 0	&&	imgYEnd < winHeight;
	var yImgSpansWindow = imgYBegin < 0 && imgYEnd > winHeight;	

	if (yBeginVis || yEndVis || yImgSpansWindow)
	{
		retVal = true;
	}
	//alert("isImgWidthInView xpos["+imgPos[0]+"]\n img width=["+origImg.width+"]\n window width=["+winWidth+"]\n retVal=["+retVal+"]");	
	return retVal;	
}

function isIFrameMouseOverCopy(event, origImg)
{
	var retVal = false;
	event = getIFrameEvent(event);
	var copyPos = findPos(origImg.copyObj);
	var framePos = findPos(origImg.copyObj.iFrameDocObj);
	var docMousePos = [(event.clientX + framePos[0]), (event.clientY + framePos[1])];
	var inXRange = (docMousePos[0] > copyPos[0] && docMousePos[0] < (copyPos[0] + origImg.copyObj.offsetWidth));
	var inYRange = (docMousePos[1] > copyPos[1] && docMousePos[1] < (copyPos[1] + origImg.copyObj.offsetHeight));
	if (inXRange && inYRange)
	{
		retVal = true;
	}
	//alert("copyPos="+copyPos+"\n framePos="+framePos+"\n mousePos=["+event.clientX+", "+event.clientY+"]\n docMousePos="+docMousePos+"\n origImg.copyObj.style.pixelWidth=["+origImg.copyObj.style.pixelWidth+"]\n origImg.copyObj.style.pixelHeight=["+origImg.copyObj.style.pixelHeight+"]");
	return retVal;
}

function reMoveShrinkAndHideCopyObj(obj, ms)
{
	var targetObj = obj.originalImg
	//alert("findPos(obj.iFrameDocObj)=["+findPos(obj.iFrameDocObj)+"]");
	growMoveView(obj, obj.x, obj.returnX, FLOAT_STEPS, FLOAT_TIME_INTERVAL, FLOAT_EXPONENT);
	if (obj.returnDelayInt)
	{
		window.clearInterval(obj.returnDelayInt);
	}

	obj.returnDelayInt = window.setInterval(
			function()
			{
				if (!obj.isMoving)
				{
					obj.style.display = "none";
					window.clearInterval(obj.returnDelayInt);
				}
			}
			, 2);
}

function getPassedWindowWidth(windowObj)
{
	var windowWidth = 0;
	if (typeof(windowObj.innerWidth) == 'number')
	{
		windowWidth=windowObj.innerWidth;
	}
	else
	{
		if (windowObj.document.documentElement && windowObj.document.documentElement.clientWidth)
		{
			windowWidth = windowObj.document.documentElement.clientWidth;
		}
		else
		{
			if (windowObj.document.body && windowObj.document.body.clientWidth)
			{
				windowWidth = windowObj.document.body.clientWidth;
			}
		}
	}
	return windowWidth;
}

function position()
{
	this.style.left = this.x + "px";
	this.style.top = this.y + "px";
}

function positionAndGrow()
{
	this.style.left = this.x + "px";
	this.style.top = this.y + "px";
	/*	
		Set Width following setting position to prevent growing outside of doc
		boundaries and therefore causing scroll bars to appear
	*/ 
	this.style.width = this.xWidth + "px";
}

function positionDefaultZero()
{
	//alert("positionDefaultZero this.id=["+this.id+"]");
	if (!this.x) this.x = 0;
	this.style.left = this.x + "px";
	if (!this.y) this.y = 0;
	this.style.top = this.y + "px";
}

function adjustForImageBorder(docObj, masterObj)
{
	var adjust = new Object();
	adjust.objBorderTopWidth = 0;
	adjust.objBorderBottomWidth = 0;
	adjust.objBorderLeftWidth = 0;
	adjust.objBorderRightWidth = 0;
	
	var sSheet = getStyleSheetFromDoc(docObj, "helpdefaultstyle.css");
	var cssRule = getCSSRuleFromStyleSheet(sSheet, "." + masterObj.className, true);
	if (cssRule)
	{
		try
		{
			adjust.objBorderTopWidth = parseInt(cssRule.style.borderTopWidth.replace(/px/gi, ""));
			adjust.objBorderBottomWidth = parseInt(cssRule.style.borderBottomWidth.replace(/px/gi, ""));
			adjust.objBorderLeftWidth = parseInt(cssRule.style.borderLeftWidth.replace(/px/gi, ""));
			adjust.objBorderRightWidth = parseInt(cssRule.style.borderRightWidth.replace(/px/gi, ""));
		}
		catch (e)
		{
			alert(e);
		}
	}
	return adjust;
	//alert("objBorderTopWidth=["+objBorderTopWidth+"]\n objBorderBottomWidth=["+objBorderBottomWidth+"]\n objBorderLeftWidth=["+objBorderLeftWidth+"]");
}

function setAndGrowVisibleOverlay(masterObj, copyObj, iFrameWinObj)
{
	copyObj.calculatingPosition = true;
	copyObj.movingBack = false;
	var iFrameDocObj = document.getElementById(iFrameWinObj.name);
	var iFramePos = findPos(iFrameDocObj);
	var masterObjPos = findPos(masterObj);
	var masterOrigY = masterObjPos[1];
	
	var adjust = adjustForImageBorder(iFrameWinObj.document, masterObj);
	var xAdjust = adjust.objBorderLeftWidth;
	var yAdjust = adjust.objBorderTopWidth;

	//	Adjust for potential original image border	
	masterObjPos[0] = masterObjPos[0] + xAdjust;
	masterObjPos[1] = masterObjPos[1] + yAdjust;

	//	Adjust for copy image border	
	if (masterObjPos[1] < FLOATING_IMAGE_BORDER_WIDTH)
	{
		masterObjPos[1] = FLOATING_IMAGE_BORDER_WIDTH;
	}
	
	copyObj.x = copyObj.returnX = iFramePos[0] + masterObjPos[0] - FLOATING_IMAGE_BORDER_WIDTH;
	copyObj.y = iFramePos[1] + masterObjPos[1] - FLOATING_IMAGE_BORDER_WIDTH;
	
	//alert("masterObj.offsetWidth=["+masterObj.offsetWidth+"] masterObj.width=["+masterObj.width+"]");
	//	Set Size
	//		Set Width
	var winWidth = getClientWindowWidth();
	var isIE = (getMSIEVersionNumber() != -1) ? true : false;
	if ((iFramePos[0] + masterObjPos[0] + masterObj.width + FLOATING_IMAGE_BORDER_WIDTH) > winWidth)
	{
		// Help iFrame NOT wide enough
		copyObj.xWidth = winWidth + (isIE ? FLOATING_IMAGE_BORDER_WIDTH : -FLOATING_IMAGE_BORDER_WIDTH) - (iFramePos[0] + masterObjPos[0]);
	}
	else
	{
		//	Help iFrame Wide enough
		copyObj.xWidth = masterObj.width + (2 * (isIE ? FLOATING_IMAGE_BORDER_WIDTH : 0));	
	}
	
	//	This position function sets position and width
	copyObj.position();
	//alert("x=["+copyObj.x+"]\n y=["+copyObj.y+"]\n xWidth=["+copyObj.xWidth+"]");

	//		Set Height & Background Position
	var borderOrigin = masterOrigY + yAdjust - FLOATING_IMAGE_BORDER_WIDTH;
	var imgPlusBorderHeight = masterObj.height + (FLOATING_IMAGE_BORDER_WIDTH * 2);
	var imgPlusBorderBottom = borderOrigin + imgPlusBorderHeight;
	var imgBottom = masterOrigY + yAdjust + masterObj.height;
	var shiftBackground = false;
	//var debugStr = "iFrameDocObj.offsetHeight=["+iFrameDocObj.offsetHeight+"]\n imgPlusBorderBottom=["+imgPlusBorderBottom+"]\n imgPlusBorderHeight=["+imgPlusBorderHeight+"]\n borderOrigin=["+borderOrigin+"]\n ";

	//	Option 1: Image height fully visible
	var copyHeight = masterObj.height;
	var backgroundPos = "0px 0px";

	/*
		Option 2: Image Origin (top left corner including border) is NOT
		visible in the iFrame but the image bottom IS visible
	*/
	if (borderOrigin < 0 && imgPlusBorderBottom <= iFrameDocObj.offsetHeight)
	{
		copyHeight = imgBottom - FLOATING_IMAGE_BORDER_WIDTH;
		backgroundPos = "0px " + (copyHeight - masterObj.height) + "px";
		//alert("Option 2: copyHeight=["+copyHeight+"] " + debugStr);
	}
	/*
		Option 3: Image Origin (top left corner including border) IS visible
		in the iFrame but the image bottom is NOT visible
	*/
	else if (borderOrigin >= 0 && imgPlusBorderBottom > iFrameDocObj.offsetHeight)
	{
		copyHeight = iFrameDocObj.offsetHeight - masterOrigY - yAdjust - FLOATING_IMAGE_BORDER_WIDTH;
		//alert("Option 3: copyHeight=["+copyHeight+"] " + debugStr);
	} 
	/*
		Option 4: Image Origin (top left corner including border) is NOT 
		visible in the iFrame and the image bottom is NOT visible
		but a portion of the image height IS visible.
	*/
	else if (borderOrigin < 0 && imgPlusBorderBottom > iFrameDocObj.offsetHeight)
	{
		copyHeight = iFrameDocObj.offsetHeight - (2 * FLOATING_IMAGE_BORDER_WIDTH);
		backgroundPos = "0px " + borderOrigin + "px";
		//alert("Option 4: copyHeight=["+copyHeight+"] " + debugStr);
	}
	
	copyObj.style.backgroundPosition =  backgroundPos;

	copyHeight = isIE ? copyHeight + (2 * FLOATING_IMAGE_BORDER_WIDTH) : copyHeight;
	
	copyObj.style.height = copyHeight;
	copyObj.calculatingPosition = false;
	copyObj.style.display = "block";

	copyObj.stopX = copyObj.x - ((masterObj.width + FLOATING_IMAGE_BORDER_WIDTH) - (getPassedWindowWidth(iFrameWinObj) - masterObjPos[0]));
	growMoveView(copyObj, copyObj.x, copyObj.stopX, FLOAT_STEPS, FLOAT_TIME_INTERVAL, FLOAT_EXPONENT);
}

//	Here the image is moving back when the user returns the mouse to the moving image
function reMoveGrow(event)
{
	event = getEvent(event);
	var copyObj = getEventTarget(event);

	window.clearInterval(copyObj.returnDelayInt);	//	Clear code to hide image.
	growMoveView(copyObj, copyObj.x, copyObj.stopX, FLOAT_STEPS, FLOAT_TIME_INTERVAL, FLOAT_EXPONENT);
}

//**************************************************************
//	Returns the real position of the object relative to the document.
//	in an array. e.g. [left, top] (x,y)
//**************************************************************
function findPos(obj)
{
	var curleft = curtop = 0;
	if (obj.offsetParent)
	{
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


function smoothIncrement(startVal, stopVal, steps, exponent, currStep)
{ 
	var delta = stopVal - startVal; 
	var increment = startVal + (Math.pow(((1 / steps) * currStep), exponent) * delta); 
	return Math.ceil(increment); 
}

function changePos(obj, startX, stopX, startY, stopY, steps, timeGapMills, exponentX, exponentY)
{
	//alert("Changing obj.id="+obj.id+" from ("+startX+", "+startY+") to ("+stopX+", "+stopY+")\nsteps=["+steps+"]\ntimeGapMills=["+timeGapMills+"]\nexponentX=["+exponentX+"]\nexponentY=["+exponentY+"]"); 
	if (obj.xPosChangePersistInt)
	{
		window.clearInterval(obj.xPosChangePersistInt);
	}
	
	var currStep = 0;
	obj.isMoving = true;
	obj.xPosChangePersistInt = window.setInterval(
			function()
			{ 
				obj.x = smoothIncrement(startX, stopX, steps, exponentX, currStep);
				obj.y = smoothIncrement(startY, stopY, steps, exponentY, currStep);
				obj.position(); 
				currStep++;
				if (currStep > steps)
				{
					window.clearInterval(obj.xPosChangePersistInt);
					obj.isMoving = false;
				}
			} 
			, timeGapMills);
}

function growMoveView(obj, startX, stopX, steps, timeGapMills, exponentX)
{
	//alert("Changing obj.id="+obj.id+" from ("+startX+", "+startY+") to ("+stopX+", "+stopY+")\nsteps=["+steps+"]\ntimeGapMills=["+timeGapMills+"]\nexponentX=["+exponentX+"]\nexponentY=["+exponentY+"]"); 
	if (obj.xPosChangePersistInt)
	{
		window.clearInterval(obj.xPosChangePersistInt);
	}
	
	var currStep = 0;
	obj.isMoving = true;
	obj.movingBack = stopX > startX;
	obj.xPosChangePersistInt = window.setInterval(
			function()
			{
				if (0 != startX - stopX)
				{
					obj.prevX = obj.x;
					obj.x = smoothIncrement(startX, stopX, steps, exponentX, currStep);
					//alert("obj.xWidth=["+obj.xWidth+"]\n startX=["+startX+"]\n incrementX=["+obj.x+"]\n (obj.xWidth + Math.abs(startX - obj.x))=["+(obj.xWidth + Math.abs(startX - obj.x))+"]");
					obj.xWidth = obj.xWidth + (obj.prevX - obj.x);
					
				}
			 
				obj.position();
				currStep++;
				if (currStep > steps)
				{
					window.clearInterval(obj.xPosChangePersistInt);
					obj.isMoving = false;
				}
			} 
			, timeGapMills);
}

function getHelpFrameSize()
{
	var helpFrameHeight = 0;
	var helpObj = document.getElementById('help');
	var helpHead = document.getElementById('helpheaderbackground');
	var helpTabs = document.getElementById('helptabs');
	var helpScrollButtons = document.getElementById('helpScrollButtons');

	if (helpObj) helpFrameHeight = helpObj.offsetHeight;
	if (helpHead) helpFrameHeight -= helpHead.offsetHeight;
	if (helpTabs) helpFrameHeight -= helpTabs.offsetHeight;
	if (helpScrollButtons) helpFrameHeight -= helpScrollButtons.offsetHeight;
	//alert("helpFrameHeight=["+helpFrameHeight+"]\n helpTabs.offsetHeight=["+helpTabs.offsetHeight+"]\n helpHead.offsetHeight=["+helpHead.offsetHeight+"]");
	return helpFrameHeight;
}

function regInternalLinks()
{
	for (var i = 0; i < document.links.length; i++)
	{
		var lnk = document.links[i];
		if (	(lnk.href && lnk.href.indexOf('#') != -1)
			&&	(		(lnk.pathname == location.pathname)
					||	('/'+lnk.pathname == location.pathname) 
				)
			&&	(lnk.search == location.search)					)
		{
			//alert("registerInteralLinks:lnk.href=["+lnk.href+"]\n lnk.href.indexOf('#')=["+lnk.href.indexOf('#')+"]\n lnk.pathname=["+lnk.pathname +"]\n location.pathname=["+location.pathname+"]\n lnk.search=["+lnk.search+"]\n location.search=["+location.search+"]");
			addEvent(lnk, 'click', internalLink, false);
		}
	}	
}

function internalLink(event)
{
//	alert("internalLink("+event+")");
	if (!event) event = window.event;

	//	Clear any existing interval.
	if (parent.HELP_MAIN_DIV.intervalCode)
	{
		parent.clearInterval(parent.HELP_MAIN_DIV.intervalCode);
	}
	
	linkObj = (!window.event) ? event.target : event.srcElement;
	anchorObj = document.getElementById(linkObj.hash.substr(1));
	moveToInternalLink(anchorObj);

	// cancel link
	if (!window.event) event.preventDefault();
	else event.returnValue = false;
	return false;	
}

function moveToInternalLink(anchorObj)
{
	if (anchorObj)
	{
		//	Clear any existing interval.
		if (parent.HELP_MAIN_DIV.intervalCode)
		{
			parent.clearInterval(parent.HELP_MAIN_DIV.intervalCode);
		}
		
		//parent.HELP_MAIN_DIV.showPos();
		parent.HELP_MAIN_DIV.y = 0;
		dy = -anchorObj.offsetTop;
		//alert("anchorObj.offsetTop=["+anchorObj.offsetTop+"]\n anchorObj.offsetParent=["+anchorObj.offsetParent+"]\n anchorObj.offsetParent.id=["+anchorObj.offsetParent.id+"]\n dy=["+dy+"]");
		parent.scrollVert(parent.HELP_MAIN_DIV, dy);
		//parent.HELP_MAIN_DIV.showPos();
	}
}

function doManualInternalLink(anchorId)
{
	//alert("anchorId=["+anchorId+"]");
	var anchorObj = document.getElementById(anchorId);	
	moveToInternalLink(anchorObj);
}

function scrollVert(obj, dy)
{
	//alert("scrollVert("+obj+", "+dy+") \n canScroll(obj, dy)=["+canScroll(obj, dy)+"]");
	if (canScroll(obj, dy))
	{
		//alert("dy=["+dy+"]\n obj.y=["+obj.y+"]\n HELP_FRAME_HEIGHT=["+HELP_FRAME_HEIGHT+"]\n obj.offsetHeight=["+obj.offsetHeight+"]");
		temp = dy;
		dy = adjustScroll(obj, dy);
		//alert("before adjustScroll: dy=["+temp+"]\n after adjustScroll dy=["+dy+"]");
		//obj.setPos();
		obj.y += dy;
		obj.setPos();
	}
}

function canScroll(obj, dy)
{
	var canScrollNow = false;
	try
	{
		//obj.setPos();
		//alert("canScroll("+obj+", "+dy+")\n HELP_FRAME_HEIGHT=["+HELP_FRAME_HEIGHT+"]\n obj.id=["+obj.id+"]\n obj.offsetHeight=["+obj.offsetHeight+"]\n obj.y=["+obj.y+"]");
		canScrollNow = (dy > 0 && obj.y < 0) || (dy < 0 && (HELP_FRAME_HEIGHT - obj.y) < obj.offsetHeight);
	}
	catch (e){/*This generates an error to be ignored if the help div is still loading*/}
	return canScrollNow;
}

function adjustScroll(obj, dy)
{
	if (dy + obj.y > 0)
	{
		dy = -obj.y;
	}
	else if (HELP_FRAME_HEIGHT - (dy + obj.y) > obj.offsetHeight)
	{
		dy = -obj.y - (obj.offsetHeight - HELP_FRAME_HEIGHT);
	}
	return dy;
}

function showPosition()
{
	alert("("+this.x+", "+this.y+") hash="+window.location.hash+"");
}

function doIFrameOnLoad(event)
{
	//	Get event.
	if (!event) { event = window.event; }
	
	pageDownCell = document.getElementById('helpScrollPageDown');
	pageUpCell = document.getElementById('helpScrollPageUp');
	scrollUpCell = document.getElementById('helpScrollUp');
	scrollDownCell = document.getElementById('helpScrollDown');
	
	addEvent(pageDownCell, "mousedown", scrollPageDown, false);
	addEvent(pageDownCell, "mouseup", stopScrollPageDown, false);
	addEvent(pageDownCell, "mouseout", stopScrollPageDown, false);
	addEvent(pageDownCell, "click", clickScrollPageDown, false);

	addEvent(pageUpCell, "mousedown", scrollPageUp, false);
	addEvent(pageUpCell, "mouseup", stopScrollPageUp, false);
	addEvent(pageUpCell, "mouseout", stopScrollPageUp, false);
	addEvent(pageUpCell, "click", clickScrollPageUp, false);

	addEvent(scrollUpCell, "mousedown", scrollUp, false);
	addEvent(scrollUpCell, "mouseup", stopScrollUp, false);
	addEvent(scrollUpCell, "mouseout", stopScrollUp, false);
	addEvent(scrollUpCell, "click", clickScrollUp, false);

	addEvent(scrollDownCell, "mousedown", scrollDown, false);
	addEvent(scrollDownCell, "mouseup", stopScrollDown, false);
	addEvent(scrollDownCell, "mouseout", stopScrollDown, false);
	addEvent(scrollDownCell, "click", clickScrollDown, false);
}

function doHelpInPageOnLoad(id)
{
	//alert("HelpInPage.jsp body onload");
	parent.HELP_MAIN_DIV = document.getElementById(id);
	parent.HELP_MAIN_DIV.showPos = showPosition;
	parent.HELP_MAIN_DIV.setPos = positionDefaultZero;
	parent.HELP_MAIN_DIV.setPos();
	
	//** Initialization code. 
	if (parent.HELP_MAIN_DIV.addEventListener)
	{
		/** DOMMouseScroll is for mozilla. */
		parent.HELP_MAIN_DIV.addEventListener("DOMMouseScroll", wheel, false);
	}
	else
	{
		/** IE/Opera. */
		parent.HELP_MAIN_DIV.onmousewheel = wheel;
	}
	
	regInternalLinks();
	//alert("doHelpInPageOnLoad() document.offsetHeight=["+document.offsetHeight+"]\n HELP_FRAME_HEIGHT=["+HELP_FRAME_HEIGHT+"]\n parent.HELP_FRAME_HEIGHT=["+parent.HELP_FRAME_HEIGHT+"]");	
}

/** This is high-level function.
 * It must react to delta being more/less than zero.
 */
function handleWheel(event, obj, delta)
{
	//	Clear any existing interval.
	if (obj.intervalCode)
	{
		window.clearInterval(obj.intervalCode);
	}
	
	delta *= 30;
	parent.scrollVert(obj, delta);
}

/** Event handler for mouse wheel event.
 */
function wheel(event, obj)
{
        var delta = 0;
        if (!event) /* For IE. */
                event = window.event;
        if (event.wheelDelta) { /* IE/Opera. */
                delta = event.wheelDelta/120;
                /** In Opera 9, delta differs in sign as compared to IE.
                 */
                if (window.opera)
                        delta = -delta;
        } else if (event.detail) { /** Mozilla case. */
                /** In Mozilla, sign of delta is different than in IE.
                 * Also, delta is multiple of 3.
                 */
                delta = -event.detail/3;
        }
        /** If delta is nonzero, handle it.
         * Basically, delta is now positive if wheel was scrolled up,
         * and negative, if wheel was scrolled down.
         */
        if (delta)
                handleWheel(event, this, delta);
        /** Prevent default actions caused by mouse wheel.
         * That might be ugly, but we handle scrolls somehow
         * anyway, so don't bother here..
         */
        if (event.preventDefault)
                event.preventDefault();
	event.returnValue = false;
}

function clickScrollUp(event)
{
	return clickScroll(DELTA_Y);
}

function clickScrollDown(event)
{
	return clickScroll(-DELTA_Y);
}

function clickScroll(dy)
{
	//	Clear any existing interval.
	stopScroll();
	
	scrollVert(HELP_MAIN_DIV, dy);
	return false;
}

function stopScrollUp(event)
{
	changeStyle(document.getElementById("helpScrollUpButtonCenter"), "helpscrollbuttonoff");	
	changeStyle(document.getElementById("helpScrollUpButtonRight"), "helpscrollbuttonrightedge");	
	changeStyle(document.getElementById("helpScrollUpButtonLeft"), "helpscrollbuttonleftedge");
	document.getElementById("helpScrollUpButtonCenterImg").src = "/xtol/images/helpscrollupoff.gif";
	return stopScroll();
}

function scrollUp(event)
{
	changeStyle(document.getElementById("helpScrollUpButtonCenter"), "helpscrollbuttonon");	
	changeStyle(document.getElementById("helpScrollUpButtonRight"), "helpscrollbuttonrightedgeon");	
	changeStyle(document.getElementById("helpScrollUpButtonLeft"), "helpscrollbuttonleftedgeon");
	document.getElementById("helpScrollUpButtonCenterImg").src = "/xtol/images/helpscrollupon.gif";
		
	return scrollObj(event, DELTA_Y, DELTA_T, HELP_MAIN_DIV);
}

function stopScrollDown(event)
{
	changeStyle(document.getElementById("helpScrollDownButtonCenter"), "helpscrollbuttonoff");	
	changeStyle(document.getElementById("helpScrollDownButtonRight"), "helpscrollbuttonrightedge");	
	changeStyle(document.getElementById("helpScrollDownButtonLeft"), "helpscrollbuttonleftedge");
	document.getElementById("helpScrollDownButtonCenterImg").src = "/xtol/images/helpscrolldownoff.gif";
	return stopScroll();
}

function scrollDown(event)
{
	changeStyle(document.getElementById("helpScrollDownButtonCenter"), "helpscrollbuttonon");	
	changeStyle(document.getElementById("helpScrollDownButtonRight"), "helpscrollbuttonrightedgeon");	
	changeStyle(document.getElementById("helpScrollDownButtonLeft"), "helpscrollbuttonleftedgeon");
	document.getElementById("helpScrollDownButtonCenterImg").src = "/xtol/images/helpscrolldownon.gif";
		
	return scrollObj(event, -DELTA_Y, DELTA_T, HELP_MAIN_DIV);
}

function scrollPageDown(event)
{
	changeStyle(getEventTarget(event), "helpscrollpagedownon");
	return scrollObj(event, -HELP_FRAME_HEIGHT, DELTA_T_PAGING, HELP_MAIN_DIV);
}

function scrollPageUp(event)
{
	changeStyle(getEventTarget(event), "helpscrollpageupon");
	return scrollObj(event, HELP_FRAME_HEIGHT, DELTA_T_PAGING, HELP_MAIN_DIV);
}

function stopScrollPageDown(event)
{
	changeStyle(getEventTarget(event), "helpscrollpagedownoff");	
	stopScroll();
}

function stopScrollPageUp(event)
{
	changeStyle(getEventTarget(event), "helpscrollpageupoff");	
	stopScroll();
}

function clickScrollPageDown(event)
{
	return clickScroll(-HELP_FRAME_HEIGHT);
}

function clickScrollPageUp(event)
{
	return clickScroll(HELP_FRAME_HEIGHT);
}

function stopScroll()
{
	return stopScrollObj(HELP_MAIN_DIV);
}

function stopScrollObj(obj)
{
	try
	{
		if (obj && obj.intervalCode)
		{
			window.clearInterval(obj.intervalCode);
		}
	}
	catch (e){/*This generates an error to be ignored if the help div is still loading*/}
	return false;
}

function scrollObj(event, deltaY, deltaT, obj)
{
	//alert("down");
	if (!event) event = window.event;
	
	var func = function (event) {scrollVert(obj, deltaY);};

	//	Clear any existing interval.
	stopScrollObj(obj);

	//HELP_MAIN_DIV.setPos = position;
	obj.intervalCode = window.setInterval(func, deltaT);
	return false;
}

function releaseHelpScrollButton(event)
{
	changeStyle(document.getElementById(""), "helpscrollbutton");	
	changeStyle(document.getElementById(""), "helpscrollbuttonrightedge");	
	changeStyle(document.getElementById(""), "helpscrollbuttonleftedge");	
}

//	Returns true if the calling page is within the help system
//	(topic page or other help frame). Otherwise returns false.
function isHelpIFrame(thisWindow)
{
	var retVal = false;
	if (	thisWindow
		&&	thisWindow.name
		&&	HELP_IN_PAGE_WINDOW_NAME == thisWindow.name)
	{
		retVal = true;
	}
	return retVal;
	
}
		


