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];
}

var LL = 1;
var LR = 2;
var RL = 4;
var RR = 8;
var TT = 16;
var TB = 32;
var BT = 64;
var BB = 128;
var HC = 256;
var VC = 512;

function showPopup(span,popupId,content,alignment,hPad,vPad,className,zIndex)
{
	var popup =	document.getElementById(popupId);
	if(popup==undefined)
	{
		popup = document.createElement('div');
		popup.id=popupId;
		popup.style.visibility='hidden';
		document.getElementsByTagName('body')[0].appendChild(popup);
	}
	if(className!=undefined)
	{
		popup.className = className;
	}
	if(hPad==undefined) hPad=0;
	if(vPad==undefined) vPad=0;

	if(isString(content))
	{	
		popup.innerHTML = content;
	}
	else
	{
		// assume it's a dom element and try and add it
		while(popup.childNodes.length>0) popup.removeChild(popup.firstChild);
		popup.appendChild(content);
	}
	
	popup.style.position = 'absolute';
	var pos = findPos(span);

	if(alignment==undefined || (alignment & LL) > 0)
	{
		popup.style.left = (pos[0] + hPad)+ 'px';
	}
	else if((alignment & LR) > 0)
	{
		popup.style.left = (pos[0] - popup.offsetWidth - hPad)+ 'px';
	}
	else if((alignment & RL) > 0)
	{
		popup.style.left = (pos[0] + span.offsetWidth + hPad)+ 'px';
	}
	else if((alignment & RR) > 0)
	{
		popup.style.left = (pos[0] + span.offsetWidth - popup.offsetWidth - hPad)+ 'px';
	}
	else if((alignment & HC) > 0)
	{
		popup.style.left = ( pos[0]+(span.offsetWidth/2) - (popup.offsetWidth/2) )+ 'px';
	}

	if(alignment==undefined || (alignment & TT) > 0)
	{
		popup.style.top = (pos[1] + vPad) + 'px';
	}
	else if((alignment & TB) > 0)
	{
		popup.style.top = Math.max(0,(pos[1] - popup.offsetHeight - vPad)) + 'px';
	}
	else if((alignment & BT) > 0)
	{
		popup.style.top = (pos[1] + span.offsetHeight + vPad) + 'px';
	}
	else if((alignment & BB) > 0)
	{
		popup.style.top = (pos[1] + span.offsetHeight - popup.offsetHeight - vPad) + 'px';
	}
	else if((alignment & VC) > 0)
	{
		popup.style.top = (pos[1] + (span.offsetHeight/2) - (popup.offsetHeight/2)) + 'px';
	}

	var ppos = findPos(popup);
	if(ppos[0]<0)
	{
		popup.style.left='0px';
	}
	
	popup.style.zIndex = zIndex!=undefined?zIndex:10;

	if(isIE6())
	{	
		if(popup.shim==undefined)
		{
			popup.shim = document.createElement('iframe');
			popup.shim.frameBorder=0;
			popup.shim.style.position='absolute';
			popup.shim.style.top = popup.offsetTop+'px';
			popup.shim.style.left = popup.offsetLeft+'px';
			popup.shim.style.width = popup.offsetWidth+'px';
			popup.shim.style.height = popup.offsetHeight+'px';
			popup.shim.style.zIndex = popup.style.zIndex-1;
			document.getElementsByTagName('body')[0].appendChild(popup.shim);
		}
		//alert('ie!');
	}
	
	setPopupVisible(popup.id);
	
	return popup;
}

function setPopupVisible(popupId,show)
{
	if(show!=undefined&&show==false)
	{
		hidePopup(popupId);
	}
	else
	{
		var popup = document.getElementById(popupId);
		if(popup==undefined)
		{
			alert('popup not found');
			return;
		}
		
		if(popup.shim!=undefined)
		{
			popup.shim.style.visibility='visible';
		}
		
		popup.style.visibility='visible';
	}
}

function hidePopup(popupId)
{
	var popup =	document.getElementById(popupId);
	if(popup.shim!=undefined)
	{
		popup.shim.style.visibility='hidden';
	}
	popup.style.visibility='hidden';
	//popup.innerHTML='';
}

function isString()
{
	if (typeof arguments[0] == 'string') return true
	if (typeof arguments[0] == 'object')
	{
		if(arguments[0].constructor!=undefined)
		{
			var criterion = arguments[0].constructor.toString().match(/string/i); 
	 		return (criterion != null);
 		}
 	}
 	return false;
}

function isIE6()
{
	// not sure if this returns true for IE<6 but it should return false for IE7+
	return (window.external && (typeof window.XMLHttpRequest == "undefined"));
}

function isIE7()
{
	// returns true for IE7+ (ie: not IE6 or older)
	return (window.external && (typeof window.XMLHttpRequest == "object"));
}

