//*****************************************************************************
//*
//*		DISPLAY_UTILS.JS
//*
//*		Javascript functions for PopUp user controls
//*
//*		Requires: utility.js
//*
//*		(C)2004-2007 CarboniSoftware, LLC
//*
//*		If you understand this code, feel free to use, modify, or disect at will
//*		as there are no radically new or complicated ideas here.  If you don't
//*		understand this code, please leave as is with author reference.
//*
//*****************************************************************************


var PopId="";  //global popup identifier - change this to array if more than one popup is visible
var SelId="";  //kludge fix for IE - if popup is over a select element, need to clip this element
var selCtrlIDs=new Array();  //more IE kludge - controls to hide if popup covers them
var clipWidth=0;
var clipHeight=0;
var xClip=0;
var yClip=0;
var Loaded=false;
var PopOn=false;
var PopX;
var PopY;
var PopXStart;
var PopYStart;
var PopXOffset;
var PopYOffset;

/////////////////////////////////////////////////////////////////////
// This allows the popup(s) to be hidden by clicking off the popup
// on the document.  Comment this out to make popup(s) strictly
// modal.  See also information about Mozilla bug in hideAllPopups.
document.onclick = hideAllPopups;
/////////////////////////////////////////////////////////////////////

var timer;
function timeKill(){
	timer = setTimeout('hideAllPopups()',250);
}
function resetTimer(){
	if (timer) clearTimeout(timer);
}

function showPop(pID, selID, eventObj, bTimer, offX, offY, bVAlign, ctrlIDs, bAnimate, bMoveable) 
{
	/////////////////////////////////////////////////////////////////
	// First make sure no other popup is active.  If multi-popups are
	// allowed by changing PopId to array, this can be removed.
	if (PopId != "")
	{
		hideAllPopups();
	}

	//////////////////////////////////////	
	// These are global vars
	PopId = pID;
	SelId = selID;

	if (ctrlIDs != null)
		registerIEWindowCtrls(ctrlIDs);
	//////////////////////////////////////

	var obj = getObject(PopId);
	if (!obj)
	{
		alert('No popup found: ' + pID);
		return;
	}

	var styobj = getStyleObject(PopId);
	if (!styobj)
	{
		alert('No popup style:' + pID);
		return;
	}	

	/////////////////////////////////////////////////////////////////
	// Popups can be auto closed after a specific time.  Timer
	// count starts when mouse leaves the popup area.
	if (bTimer)
	{
		obj.onmouseout = timeKill;
 		obj.onmouseover = resetTimer;
	}

	var viewWidth  = (ie)?document.body.clientWidth:window.innerWidth;
	var viewHeight = (ie)?document.body.clientHeight:window.innerHeight;

	/////////////////////////////////////////////////////////////////
	// Popup positioning - the popup is initially positioned as 
	// close to the point of the event as possible.  The caller
	// can offset this position by passing in values.  If no event
	// object is defined, the position defaults to screen center.
	var x=0;
	var y=0;
	if ((eventObj != null))
	{
		x = (nav)?eventObj.pageX:event.clientX+document.body.scrollLeft;
		y = (nav)?eventObj.pageY:event.clientY+document.body.scrollTop;
		x += offX;
		y += offY;
	}
	else
	{
		x = viewWidth/2;
		x += (ie)?document.body.scrollLeft:window.pageXOffset;
		x -= obj.offsetWidth/2;
		if (x<0) x=0;
		y = viewHeight/2;
		y += (ie)?document.body.scrollTop:window.pageYOffset;
		y -= obj.offsetHeight/2;
		if (y<0) y=0;
	}

	if(mac&&ie){//mac ie bug fix
		winWidth = document.body.clientWidth;
		if(winWidth > 612) x -= (winWidth - 612)/2;
	}

	/////////////////////////////////////////////////////////////////
	// If the x-position will cause the popup to disappear off the
	// right side of the window, try to move the popup to the left
	// so that the maximum amount of popup will be visible.
	if ((x+obj.offsetWidth) > viewWidth)
	{
		x -= ((x+obj.offsetWidth) - viewWidth);
		x -= 40;
		if (x < 0) x=5;
	}

	/////////////////////////////////////////////////////////////////
	// Caller can specify that the popup is vertically aligned in
	// the visible browser window.
	if (bVAlign)
	{	
		y = viewHeight/2;
		y += (ie)?document.body.scrollTop:window.pageYOffset;
		y -= obj.offsetHeight/2;
		if (y<0) y=0;
	}

	/////////////////////////////////////////////////////////////////
	// Move the popup to final x,y position
    moveObject(PopId, x, y);
	PopX = x;
	PopY = y;

	/////////////////////////////////////////////////////////////////
	// IE 6 bug fix.  Selection controls (listboxes, droplists) do not
	// have valid z-orders in IE.  These controls will always display
	// on top of other controls.  Therefore, these type of controls
	// need to be hidden if the popup overlaps them.  
	//
	// There are two types of selection items that can be referenced
	// from this function.  The first type is a known selection control
	// position that the popup will overlap.  This control is much
	// larger than the popup, and is clipped rather than fully hidden.
	if ((SelId != '') && ie && !browser.isIE7x)
	{
		// The selection control is referenced in global SelId
		var selDim = getStyleObject(SelId);
		if (selDim)
		{
			selDim.position = 'absolute';
			nObjHeight = obj.offsetHeight - 20;
			selDim.clip = 'rect(' + nObjHeight + ' auto auto auto)';
		}
	}
	//
	// The second type of selection control(s) are controls that
	// are known to be somewhere on the display, and may or may
	// not interfere with the popup.  These controls are checked
	// one at a time for location and overlap with the popup.  If
	// the controls overlap, only then are they hidden.
	if (ie && !browser.isIE7x && (selCtrlIDs.length > 0))
		hideSelectObjects(x, y, obj.offsetWidth, obj.offsetHeight);		 
	//
	/////////////////////////////////////////////////////////////////

	if (styobj.display == 'none')
		styobj.display='inline';
		
	if (bMoveable)
	{
		obj.onmousedown = startPopMove;
	}
		
	if (!bAnimate)
	{
		/////////////////////////////////////////////////////////////////
		// Make the popup visible
		if(changeObjectVisibility(PopId, 'visible')) 
		{
			if (eventObj != null)
				eventObj.cancelBubble = true;
			Loaded = true;
			return true;
		} 
		else 
		{
			return false;
		}
	}
	else
	{
		clipWidth  = obj.offsetWidth;
		clipHeight = obj.offsetHeight;	
		xClip = 0;
		yClip = 0;
		setTimeout('showClip()', 2);
		return true;
	}
}

function showClip()
{
	var styobj = getStyleObject(PopId);
	if (!styobj)
		return;

	styobj.visibility = 'visible';
	
	var ratio = (clipWidth >= clipHeight) ? clipWidth / clipHeight : clipHeight / clipWidth;
	var xMod = (clipWidth <= clipHeight) ? 1 : ratio;
	var yMod = (clipHeight <= clipWidth) ? 1 : ratio;
	
	styobj.clip = 'rect(auto ' + xClip + ' ' + yClip + ' auto)';
	if (xClip < clipWidth)
		xClip += xMod * 6;
	else
		xClip = clipWidth;
	if (yClip < clipHeight)
		yClip += yMod * 6;
	else
		yClip = clipHeight;
	if ((yClip < clipHeight) || (xClip < clipWidth))
	{
		setTimeout('showClip()', 1);
		return;
	}
	
	styobj.clip = 'rect(auto auto auto auto)';
	Loaded = true;
}

function startPopMove(eventObj)
{
	var obj = getObject(PopId);
	if (!obj || !Loaded)
	{
		alert("bad start");
		return;
	}

	var x = (nav)?eventObj.pageX:event.clientX+document.body.scrollLeft;
	var y = (nav)?eventObj.pageY:event.clientY+document.body.scrollTop;
	
	if (y>PopY+20)
		return;
	
	var styobj = getStyleObject(PopId);
	if (styobj)
	{
		if (browser.isIE)		
			styobj.cursor = "move";
		else if (browser.equivalentMozilla)
			styobj.cursor = "-moz-grab";
		else
			styobj.cursor = "move";
	}
		
	PopXStart = x;
	PopYStart = y;
	PopXOffset = x - PopX;
	PopYOffset = y - PopY;
	
	document.onmousemove = movePop;
	document.onmouseup = endPopMove;
	PopOn = true;
}

function movePop(eventObj)
{
	x = (nav)?eventObj.pageX:event.clientX+document.body.scrollLeft;
	y = (nav)?eventObj.pageY:event.clientY+document.body.scrollTop;
	
	if (y-PopYOffset > 0)
		moveObject(PopId, x-PopXOffset, y-PopYOffset);

	var obj = getObject(PopId);
	if (ie && !browser.isIE7x && (selCtrlIDs.length > 0))
		hideSelectObjects(x, y, obj.offsetWidth, obj.offsetHeight);		 
}

function endPopMove(eventObj)
{
	var obj = getObject(PopId);
	if (obj && Loaded)
	{
		var styobj = getStyleObject(PopId);
		if (styobj)
			styobj.cursor = 'default';

		x = (nav)?eventObj.pageX:event.clientX+document.body.scrollLeft;
		y = (nav)?eventObj.pageY:event.clientY+document.body.scrollTop;

		PopX = x-PopXOffset;
		PopY = y-PopYOffset;
		moveObject(PopId, PopX, PopY);

		obj.onmouseup = null;
		obj.onmousemove = null;

		if (ie && !browser.isIE7x && (selCtrlIDs.length > 0))
		{
			showSelectObjects();
			hideSelectObjects(x, y, obj.offsetWidth, obj.offsetHeight);		 
		}
	}
	
	PopXStart=0;
	PopYStart=0;
	PopXOffset=0;
	PopYOffset=0;
	
	PopOn=false;
	
	document.onmouseup = null;
	document.onmousemove = null;
}

function hidePop(pID)
{
	changeObjectVisibility(pID, 'hidden');
	
	if (PopOn)
		endPopMove(event);
	
	if (pID == PopId)
	{
		PopId = '';
		Loaded = false;
		
		if (ie && (SelId != '')){
			selcIdStyle = getStyleObject(SelId);
			if (selcIdStyle)
			{
				selcIdStyle.position = '';
				selcIdStyle.clip = 'rect(auto auto auto auto)';
			}
			
			//changeObjectVisibility(SelId, 'visible');
		}
		if (ie && !browser.isIE7x && (selCtrlIDs.length > 0))
			showSelectObjects();
			
	}
}

function hideSelectObjects(x, y, width, height)
{
	var i=0;
	var selCtrlID;
	var objCtrlID;
	for (i=0; i<selCtrlIDs.length; i++)
	{
		var hidden = false;
		selCtrlID = selCtrlIDs[i];
		objCtrlID = getObject(selCtrlID);
		if (objCtrlID)
		{
			if ((hLineInElement(x, x+width, y, selCtrlID)) ||
				(hLineInElement(x, x+width, y+height, selCtrlID)) ||
				(vLineInElement(y, y+height, x+width, selCtrlID)) ||
				(vLineInElement(y, y+height, x, selCtrlID)))
			{
				hidden = true;
			}
				
			var objPos = getElementPosition(selCtrlID);
			var objX = objPos.left;
			var objY = objPos.top;
			if ((objX >= x) && (objX <= x+width) && (objY >= y) && (objY <= y+height))
				hidden = true;
			
			if (hidden)
			{
			    var styCtrlID = getStyleObject(selCtrlID);
			    if (styCtrlID)
					styCtrlID.visibility = 'hidden';
			}
		}
	}
}

function showSelectObjects()
{
	var i=0;
	var selCtrlID;
	var styCtrlID;
	for (i=0; i<selCtrlIDs.length; i++)
	{
		selCtrlID = selCtrlIDs[i];
		styCtrlID = getStyleObject(selCtrlID);
		if (styCtrlID)
			styCtrlID.visibility = 'visible';
	}
}

function registerIEWindowCtrls(ctrlIDs)
{
	var i=0, j=0;
	var bFound = false;
	for (i=0; i<ctrlIDs.length; i++)
	{
		for (j=0; j<selCtrlIDs.length; j++)
		{
			if (selCtrlIDs[j] == ctrlIDs[i])
			{
				bFound = true;
				break;
			}
		}
		
		if (!bFound)
			selCtrlIDs[selCtrlIDs.length] = ctrlIDs[i];
	}
}

function hideAllPopups(eventObj) 
{
	if ((PopId == '') || (Loaded == false))
		return;

	if (PopOn)
		endPopMove(eventObj);
	
	if (!ie)
	{
		// Fix for bug in Mozilla browers.  Description of bug:
		// http://www.howtocreate.co.uk/mozBugs/testcapture.html
		// Workaround is to see if mouse was clicked inside of
		// popup window.  If so, ignore the click and return.
		
		if (!eventObj) eventObj = window.event;
		
		if (eventObj)
		{
			var mouseX=(nav)?eventObj.pageX:event.clientX+document.body.scrollLeft;
			var mouseY=(nav)?eventObj.pageY:event.clientY+document.body.scrollTop;
			var menuPos = getElementPosition(PopId);
			
			
			objMenu = getObject(PopId);
			if (objMenu)
			{
				if ((mouseX > menuPos.left) && (mouseX < (menuPos.left + objMenu.clientWidth)) &&
					(mouseY > menuPos.top)  && (mouseY < (menuPos.top  + objMenu.clientHeight)))
				{
					return;
				}
			}
		}
	}
	
	Loaded = false;
	
	changeObjectVisibility(PopId, 'hidden');
	PopId = '';
	if (ie && (SelId != '')){
		selcIdStyle = getStyleObject(SelId);
		if (selcIdStyle)
		{
			selcIdStyle.position = '';
			selcIdStyle.clip = 'rect(auto auto auto auto)';
		}
		
		//changeObjectVisibility(SelId, 'visible');
	}
	if (ie && !browser.isIE7x && (selCtrlIDs.length > 0))
		showSelectObjects();

/*		
	if(nav)
	{
   		document.releaseEvents(Event.MOUSEMOVE);
		document.releaseEvents(Event.MOUSEOVER);
	}
*/	
}

function setmsg(msg) {
  window.status=msg
  return true
}

var WorkingWindow = null; 

function showWorking(gifPath)
{
	if (WorkingWindow != null)
	{
		WorkingWindow.close();
		WorkingWindow = null;
	}
		
	WorkingWindow = window.open(gifPath, "Working", 
		"menubar=no,height=120,width=160,scrollbars=no,status=no,resizable=yes" );
		
}

function hideWorking(gifPath)
{
	if (WorkingWindow != null)
	{
		WorkingWindow.close();
		WorkingWindow = null;
		return;
	}
		
	WorkingWindow = window.open(gifPath, "Working", 
		"menubar=no,height=120,width=160,scrollbars=no,status=no,resizable=yes" );
	WorkingWindow.close();	
}

function addWorkingImage(locID, workClass)
{
	var locObj = getObject(locID);
	if (locObj)
	{
		if (ie)
		{
			while (locObj.childNodes[0])
				locObj.removeChild(locObj.childNodes[0]);
		}
		else
		{
			location = document.location;
		}
		locObj.className = workClass;
		pause(100);
	}
}




