////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2006 CA
// Project:  content filter driver
// File:     xpopup.js
// Platform: JavaScript
// Abstract: Popup blocker
////////////////////////////////////////////////////////////////////////////////////////////////////

var _orig_windowOpen = window.open;
var _orig_windowSetTimeout = window.setTimeout;
var _orig_windowSetInterval = window.setInterval;

var _orig_onUnload;
var _orig_onLoad;

var _tmpWindowOpen;

function _emptyWindow( hOpener )
{
	this.focus = _safe_focus;
	this.blur = _safe_blur;

	// set to main (parent) window
	this.opener = hOpener;

	// create dummy document object
	this.document = new Object();
	this.document.open = _safe_documentOpen;
	this.document.close = _safe_documentClose;
	this.document.write = _safe_documentWrite;
	this.document.writeln = _safe_documentWriteln;
}

// dummy implementations
function _safe_blur()
{
}

function _safe_focus()
{
}

function _safe_documentOpen( sUrl, sName, sFeatures, bReplace )
{
}

function _safe_documentClose()
{
}

function _safe_documentWrite( sText )
{
}

function _safe_documentWriteln( sText )
{
}

function _isOpenAllowed( sName )
{
	return ( sName != '' && sName == window.name) || sName == '_top' || sName == '_self';
}

function _safe_open( sURL, sName, sFeatures )
{
	if ( _isOpenAllowed( sName ) )
		return _orig_windowOpen(sURL, sName, sFeatures);
	else
		return ( new _emptyWindow( this.window ));
}

function _block_windowOpen()
{
	// save window open handler
	_tmpWindowOpen = window.open;
	window.open    = _safe_open;
}

function _unblock_windowOpen()
{
	// restore window open handler
	window.open = _tmpWindowOpen;
}

function _safe_setInterval( sCode, iMilliSeconds )
{
	// first block window.open -> execute the code -> unblock window.open
	return (_orig_windowSetInterval("_block_windowOpen(); " + sCode + "; _unblock_windowOpen();", iMilliSeconds ));
}

function _safe_setTimeout( sCode, iMilliSeconds )
{
	// first block window.open -> execute the code -> unblock window.open
	return (_orig_windowSetTimeout("_block_windowOpen(); " + sCode + "; _unblock_windowOpen();", iMilliSeconds ));
}

function _safe_onLoad()
{
	// start blocking
	_block_windowOpen();

	// run original handler
	if (_orig_onLoad)
		_orig_onLoad();

	// stop blocking
	_unblock_windowOpen();
}

function _safe_onUnload()
{
	// start blocking
	_block_windowOpen();

	// run original handler
	if (_orig_onUnload)
		_orig_onUnload();

	// stop blocking
	_unblock_windowOpen();
}

var m_bRunOnlyOne = false;

function _popupControl()
{
	if ( !m_bRunOnlyOne )
	{
		m_bRunOnlyOne = true;

		// page is processed, allow popup windows
		window.open = _orig_windowOpen;

		// save onload and onunload event handlers
		_orig_onLoad = window.onload;
		_orig_onUnload = window.onunload;

		// replace handlers
		window.onunload = _safe_onUnload;
		window.onload = _safe_onLoad;
	}
}

window.setTimeout = _safe_setTimeout;
window.setInterval = _safe_setInterval;
window.open = _safe_open;

