function PopupFrame(url, mask, frame)
{
	mask.element = createMask(mask);
	frame.element = createFrame(url, frame);

	function createMask(mask)
	{
		var element = document.createElement('div');
		element.id = mask.id;
		element.className = mask.className;
		// FF musn't use position: fixed or cursors disappear
		if (navigator.userAgent && navigator.userAgent.indexOf("Firefox") >= 0)
		{			
			var viewportHeight = document.documentElement.scrollHeight;
			element.style.position = "absolute";
			element.style.height = viewportHeight + "px";
		}
		document.body.appendChild(element);
		return element;
	}

	function createFrame(url, frame)
	{
		// Create element
		var element = document.createElement('iframe');
		element.src = url;
		element.scrolling = 'no';
		element.setAttribute('frameBorder', '0');
		element.setAttribute('allowTransparency', 'true');
		element.id = frame.id;
		element.className = frame.className;
		element.style.visibility = 'hidden';
		document.body.appendChild(element);

		// Position
		frame.position = function ()
		{
			var width = element.offsetWidth;
			var height = element.offsetHeight;
			var viewWidth  = window.innerWidth  || document.documentElement.clientWidth; 
			var viewHeight = window.innerHeight || document.documentElement.clientHeight; 
			var left = frame.left || Math.round((viewWidth - width) / 2);
			var top = frame.top || Math.round((viewHeight - height) / 2);
			element.style.left = left + "px";
			element.style.top = top + "px";
		};
		window.onresize = frame.position;
		frame.position();
		element.style.visibility = 'visible';
		
		// Done
		return element;
	}

	this.remove = function()
	{
		mask.element.parentNode.removeChild(mask.element);
		frame.element.parentNode.removeChild(frame.element);
		if (frame.closeUrl)
		{
			window.location = frame.closeUrl;
		}
		this.frame = null;
		this.mask = null;
		window.onresize = null;
	}
}