var PopupGenerator = function()
/* A contructor to create a PopupGenerator, an object that displays pop-ups
 *
 */
{
	this.displayPopup = function(contentNode, title, onclose)
	/* Displays an in-page pop-up whose content is contentNode
	 *
	 * @param contentNode	An HTML node to be displayed
	 *						The node will be appended to the pop-up, and will therefore be removed from its previous position (if any)
	 *
	 * @return true if a pop-up was displayed, false otherwise (if a pop-up is already open)
	 *
	 */
	{
		if (popupOpen)
		{
			return false;
		}
		
		popupClose.onclick = function(event)
		{
			if (onclose)
			{
				onclose();
			}
			
			_closePopup();
		};
		
		if (popupTitle.firstChild)
		{
			popupTitle.replaceChild(document.createTextNode(title), popupTitle.firstChild);
		}
		else
		{
			popupTitle.appendChild(document.createTextNode(title));
		}
		
		if (popupContents)
		{
			popupBox.removeChild(popupContents);
		}
		
		popupBox.appendChild(contentNode);
		
		var flashContents = document.getElementsByName('flashContent');
		
		for (var i = 0; i < flashContents.length; i++)
		{
			flashContents[i].style.display = 'none';
		}
		
		document.body.appendChild(popup);
		document.body.appendChild(popupBG);
		
		popupOpen = true;
		
		if (Nifty)
		{
			Nifty('#popup-top-bar', 'transparent');
		}
		
		return true;
	}
	
	
	this.closePopup = function()
	/* Closes the pop-up previously opened by displayPopup()
	 * This is the public version of _closePopup()
	 *
	 * @return true if the pop-up was closed, false otherwise (if no pop-up was open)
	 *
	 */
	{
		return _closePopup();
	}
	
	
	this.popupOpen = function()
	/* Return true if a pop-up is open, otherwise return false
	 *
	 * @return true if a pop-up is open, otherwise return false
	 *
	 */
	{
		return popupOpen;
	}
	
	
	var _closePopup = function()
	/* Closes the pop-up previously opened by displayPopup()
	 * This is the private version of this.closePopup()
	 *
	 * @return true if the pop-up was closed, false otherwise (if no pop-up was open)
	 *
	 */
	{
		if (!popupOpen)
		{
			return false;
		}
		
		document.body.removeChild(popup);
		document.body.removeChild(popupBG);
		
		var flashContents = document.getElementsByName('flashContent');
		
		for (var i = 0; i < flashContents.length; i++)
		{
			flashContents[i].style.display = 'block';
		}
		
		popupOpen = false;
		
		return true;
	};
	
	var popupOpen = false;
	var popupContents = null;
	
	var popup = document.createElement('div');
	var popupBox = document.createElement('div');
	var popupBG = document.createElement('div');
	var popupTopBar = document.createElement('div');
	var popupTitle = document.createElement('div');
	var popupClose = document.createElement('a');
	var popupClear = document.createElement('div');
	
	popup.id = 'popup';
	popupBox.id = 'popup-box';
	popupBG.id = 'popup-bg';
	popupTopBar.id = 'popup-top-bar';
	popupTitle.id = 'popup-title';
	popupClose.id = 'popup-close';
	
	popupClear.className = 'clear';
	
	popupClose.href = 'javascript:;';
	popupClose.appendChild(document.createTextNode('Close'));
	
	popupTopBar.appendChild(popupTitle);
	popupTopBar.appendChild(popupClose);
	popupTopBar.appendChild(popupClear);
	
	popupBox.appendChild(popupTopBar);
	
	popup.appendChild(popupBox);
};

popupGenerator = new PopupGenerator();
