/**
*
* IdPop - singleton
*
* Small bug popup that appears when hovering over any case id in FogBugz
*
*/
this.IdPop = new function()
{
	var oIdPop;			// case id popup container
	var oIdPopContent;	// case id popup content
	
	var oIdLink;		// case id link that initiated popup
	var pxLeftLink;
	var pxTopLink;
	
	var rgsIdPopHTML = new Array();	// cache of case id popup HTML
	var oAjaxIdPopup = new AjaxRequest(); // AjaxRequest for case id popups
	
	var ixLastIdRequest;
	var ixLastFulfilledRequest;
	var bPositioned;
	var bShowing;
	
	var pxWidthOriginal;
	var pxHeightOriginal;
	
	var pxLeft;
	var pxTop;
	
	var PX_SHADOW_OFFSET = 18;
	var POPUP_PADDING = 4;
	
	this.init = function()
	{
		if (!oIdPop) oIdPop = elById("caseIdPopup");
		if (!oIdPopContent) oIdPopContent = elById("caseIdContent");
	}
	
	this.hide = function()
	{
		ixLastIdRequest = null;
		setTimeout(this.doHide, 200);
	}

	this.hideNow = function()
	{
		ixLastIdRequest = null;
		this.doHide();
	}

	this.doHide = function()
	{
		if (ixLastIdRequest != null) return;
		IdPop.init();
		if (oAjaxIdPopup && oAjaxIdPopup.isBusy()) oAjaxIdPopup.abort();
		bShowing = false;
		ShadowManager.hideShadow('idPop');
		FadeManager.startFadeOut('idPop', oIdPop, null);
		if (window.ie) theMgr.showSelects();
	}

	this.stopHide = function()
	{
		if (bShowing) ixLastIdRequest = ixLastFulfilledRequest;
	}
	
	this.show = function()
	{
		if (bShowing) return;
		
		this.init();
		bPositioned = false;
		// position popup away from mouse at start so it doesn't initially popup under mouse during fade in
		ShadowManager.hideShadow('idPop');
		positionElement(oIdPop, (xMouse + POPUP_PADDING), (yMouse + POPUP_PADDING));
		FadeManager.startFadeIn('idPop', oIdPop, IdPop.setPosition, true, IdPop.setShadow);
		bShowing = true;
		if (window.ie) theMgr.hideSelects();
	}
	
	this.setShadow = function()
	{
		ShadowManager.applyShadow('idPop', pxLeft, pxTop, oIdPop);
	}
	
	this.setPosition = function()
	{
		if (bPositioned || oIdPop.style.display == "none") return; // already positioned, or not yet ready
		
		IdPop.setSize();
		
		var pxLeftTemp = inBounds(pxLeftLink, scrollLeft() + PX_SHADOW_OFFSET, windowWidthCorrected() + scrollLeft() - oIdPop.offsetWidth - PX_SHADOW_OFFSET);
		var pxTopTemp = inBounds((pxTopLink - (2*POPUP_PADDING)), scrollTop() + PX_SHADOW_OFFSET, windowHeightCorrected() + scrollTop() - oIdPop.offsetHeight - PX_SHADOW_OFFSET);
		
		if (IdPop.hasRoom("right"))
		{
			pxLeftTemp = (pxLeftLink + oIdLink.offsetWidth + POPUP_PADDING + PX_SHADOW_OFFSET);
		}
		else if (IdPop.hasRoom("left"))
		{
			pxLeftTemp = (pxLeftLink - POPUP_PADDING - PX_SHADOW_OFFSET - oIdPop.offsetWidth);
		}
		else if (IdPop.hasRoom("top"))
		{
			pxTopTemp = (pxTopLink - POPUP_PADDING - oIdPop.offsetHeight - PX_SHADOW_OFFSET);
		}
		else if (IdPop.hasRoom("bottom"))
		{
			pxTopTemp = (pxTopLink + oIdLink.offsetHeight + POPUP_PADDING + PX_SHADOW_OFFSET);
		}
		else
		{
			pxLeftTemp = (pxLeftLink + oIdLink.offsetWidth + POPUP_PADDING + PX_SHADOW_OFFSET);
			pxTopTemp = (pxTopLink - (2*POPUP_PADDING) - PX_SHADOW_OFFSET);
		}
		
		positionElement(oIdPop, pxLeftTemp, pxTopTemp);
		pxLeft = pxLeftTemp;
		pxTop = pxTopTemp;
		
		bPositioned = true;
	}
	
	this.setSize = function()
	{
		sizeElement(oIdPop, null, oIdPopContent.offsetHeight);
	}
	
	this.hasRoom = function( sDirection )
	{
		if (sDirection == "left")
			return (scrollLeft() < (pxLeftLink - POPUP_PADDING - oIdPop.offsetWidth - PX_SHADOW_OFFSET));
		else if (sDirection == "right")
			return ((pxLeftLink + oIdLink.offsetWidth + POPUP_PADDING) < (scrollLeft() + windowWidthCorrected() - oIdPop.offsetWidth - PX_SHADOW_OFFSET));	
		else if (sDirection == "top")
			return (scrollTop() < (pxTopLink - POPUP_PADDING - oIdPop.offsetHeight - PX_SHADOW_OFFSET));
		else if (sDirection == "bottom")
			return ((pxTopLink + oIdLink.offsetHeight + POPUP_PADDING) < (scrollTop() + windowHeightCorrected() - oIdPop.offsetHeight - PX_SHADOW_OFFSET));
		else
			return false;
	}
	
	this.startTimer = function( ixBug, oLink )
	{
		this.init();
		oIdLink = oLink;
		pxLeftLink = calculateOffset(oIdLink, "offsetLeft");
		pxTopLink = calculateOffset(oIdLink, "offsetTop");
		
		ixLastIdRequest = ixBug;
		bShowing = false;
		
		// Get popup data if necessary
		if (!rgsIdPopHTML[ixBug]) setTimeout("IdPop.sendIdPopRequest(" + ixBug + ")", 150);
		
		setTimeout("IdPop.fill(" + ixBug + ")", 500);
	}
	
	this.fill = function( ixBug )
	{
		if (ixBug != ixLastIdRequest) return;
		if (!rgsIdPopHTML[ixBug])
		{
			// data isn't ready yet
			setTimeout("IdPop.fill(" + ixBug + ")", 200);
			return;
		}
		oIdPopContent.innerHTML = rgsIdPopHTML[ixBug];
		ixLastFulfilledRequest = ixBug;
		this.show();
	}
	
	this.sendIdPopRequest = function( ixBug )
	{
		if (ixBug != ixLastIdRequest) return;
		
		if (!oAjaxIdPopup) oAjaxIdPopup = new AjaxRequest();
		if (oAjaxIdPopup && oAjaxIdPopup.isBusy()) oAjaxIdPopup.abort();
		oAjaxIdPopup.initialize();
		oAjaxIdPopup.bDefaultFailureBehavior = false;
		oAjaxIdPopup.onreadystatechange(this.resultIdPopRequest);
		oAjaxIdPopup.open("GET", sDefaultURI + "?fAlaCarte=1&pg=pgAlaCarteBugDetails&ixBug=" + ixBug, true);
		oAjaxIdPopup.send(null);
	}
	
	this.resultIdPopRequest = function()
	{
		if (typeof XMLParser == 'undefined') return; // in case request returns after unload
		if (!oAjaxIdPopup || !oAjaxIdPopup.isReady()) return;
	
		var ixBug = XMLParser.getTextFrom(oAjaxIdPopup.responseXML(), "ixBug");
		if (ixBug != ixLastIdRequest) return;
	
		var sHTML = XMLParser.getCDataFrom(oAjaxIdPopup.responseXML(), "sHTML");
		if (!sHTML || !sHTML.length) return;
		
		rgsIdPopHTML[ixBug] = sHTML;
	}
} // end of IdPop singleton
