// <script language="Javascript">
//<!-- Copyright 1999-2003 Alexa Internet, Inc.  All Rights Reserved.
// constants
var EVT_ACTIVATE			= "activate";
var EVT_DEACTIVATE			= "deactivate";
var EVT_PAGETURN			= "onPageTurn";
var EVT_DATALOAD_PREFIX		= "onDataLoaded_";
var EVT_LOAD				= "onLoad";
var EVT_LABELCHANGE			= "onLabelChange";
var EVT_BEFORENAVIGATE		= "onBeforeNavigate";
var EVT_DOCUMENTCOMPLETE	= "onDocumentComplete";
var EVT_DOWNLOADBEGIN		= "onDownloadBegin";
var EVT_DOWNLOADCOMPLETE	= "onDownloadComplete";
var EVT_POPUP				= "onPopup";
var EVT_NEWWINDOW			= "onNewWindow";
var EVT_NAVIGATECOMPLETE	= "onNavigateComplete";
var EVT_STATUSTEXTCHANGE	= "onStatusTextChange";
var EVT_VISIBLECHANGE		= "onVisibleChange";
var EVT_ACTIVEDOCUMENTCOMPLETE = "onActiveDocumentComplete";
var EVT_ACTIVEDESTROYED		= "onActiveDestroyed";
var EVT_SECUREDOCUMENT		= "onSecureDocument";
var EVT_ERROR				= "onError";
var EVT_RESIZE				= "onresize";
var EVT_CLICK				= "onclick";
var EVT_MOUSEOVER			= "onmouseover";
var EVT_MOUSEOUT			= "onmouseout";
function EventTrap() {
	var o = new AlxObj(); o.oType="EventTrap";
//	o.events=new Array('onLabelChange','onBeforeNavigate','onPageTurn','onDocumentComplete','onDownloadBegin','onDownloadComplete','onNavigateComplete','onStatusTextChange','onVisibleChange','onActiveDocumentComplete','onActiveDestroyed','onSecureDocument','onDataLoaded_DadDSN','onDataLoaded_AdDSN','onDataLoaded_MenuDSN','onLoad','deactivate','activate','onerror','onresize','onclick','onmouseover','onmouseout');
	o.events=new Array(EVT_POPUP, 
						EVT_NEWWINDOW, 
						EVT_LABELCHANGE, 
						EVT_BEFORENAVIGATE,
						EVT_PAGETURN,
						EVT_DOCUMENTCOMPLETE, 
						EVT_DOWNLOADBEGIN, 
						EVT_DOWNLOADCOMPLETE, 
						EVT_NAVIGATECOMPLETE,
						EVT_STATUSTEXTCHANGE, 
						EVT_VISIBLECHANGE, 
						EVT_ACTIVEDOCUMENTCOMPLETE,
						EVT_ACTIVEDESTROYED,
						EVT_SECUREDOCUMENT,
						EVT_DATALOAD_PREFIX+"DadDSN",
						EVT_DATALOAD_PREFIX+"AdDSN",
						EVT_DATALOAD_PREFIX+"MenuDSN",
						EVT_LOAD, 
						EVT_DEACTIVATE, 
						EVT_ACTIVATE, 
						EVT_ERROR, 
						EVT_RESIZE, 
						EVT_CLICK, 
						EVT_MOUSEOVER, 
						EVT_MOUSEOUT, 
						EVT_DATALOAD_PREFIX+"HintDSN");
	o.passThrough = new Array(EVT_RESIZE, EVT_CLICK, EVT_MOUSEOVER, EVT_MOUSEOUT, EVT_ACTIVATE);
	o.lists=new Array(); o.active=true; var si='';
	for (si in o.events) { o.lists[o.events[si]]=new ObserverList(); }       
	o.exec=EventTrap_exec;
	o.activate=EventTrap_activate;
	o.deactivate=EventTrap_deactivate;
	o.register=EventTrap_register;
	o.unregister=EventTrap_unregister;
	o.check=EventTrap_check;
	o.create();
	return o;
	function EventTrap_check(sEvent,oObj) {
		if (!this.lists[sEvent]) { return false; }
		if (!this.lists[sEvent].observers) { return false; }
		var rVal = false;
		for (var si in this.lists[sEvent].observers) {
			if (!this.lists[sEvent].observers[si].oID) {
				return false;
			}
			if (this.lists[sEvent].observers[si].oID == oObj.oID) {
				rVal = true;
				break;
			}
		}
		return rVal;
	}
	function EventTrap_activate() {
		g_oLogger.out(this,"execing activate");
		this.active=true;
		g_bIsOn=true;
		if (g_oCookie.readPersist(REG_ENABLEPOPUP) != "false") {
			BrowserProxy.Host.IEEventSink.KillPopups = true;
		} else { 
			BrowserProxy.Host.IEEventSink.KillPopups = false;
		}
		this.exec(EVT_ACTIVATE,new Array(true));
		// give it time to breathe.
		//setTimeout('BP_onNavigateComplete(null, BrowserProxy.Host.Browser, BrowserProxy.Host.Location)',100);
		BP_onNavigateComplete(null, BrowserProxy.Host.Browser, BrowserProxy.Host.Location);
	}
	function EventTrap_deactivate() {
		g_bIsOn=false;
		BrowserProxy.Host.IEEventSink.KillPopups = false;
		this.exec(EVT_DEACTIVATE, new Array(true));	
		this.active=false;
	}
	function EventTrap_exec(sEvent, aArgs) {
		if ((this.active!=false) || (array_contains(this.passThrough,sEvent))) {
			var rVal = false;
			var si='';
			for (si in this.lists[sEvent].observers) {
				if (this.lists[sEvent].observers[si][sEvent]) { rVal = this.lists[sEvent].observers[si][sEvent](aArgs); }  
			}
		} else {
			g_oLogger.out(this, "got event " + sEvent + ", while inactive - ignoring.");
		}
		return rVal;
	}
	function EventTrap_register(sEvent, oObject) { 
		this.lists[sEvent].add(oObject); return true; 
	}
	function EventTrap_unregister(sEvent, oObject) { this.lists[sEvent].remove(oObject); return true; }
}

function ObserverList() {
	var o=new AlxObj();
	o.oType='ObserverList';
	o.observers=new Array();
	o.add=ObserverList_add;
	o.remove=ObserverList_remove;
	o.isEmpty=ObserverList_isEmpty;
	o.clear=ObserverList_clear;
	o.create(); return o;
	function ObserverList_add(oObject) { this.observers[oObject.oID]=oObject; return true; }
	function ObserverList_remove(oObject) {
		for (var si in this.observers) {
			if (this.observers[si].oID == oObject.oID) { delete this.observers[si]; CollectGarbage(); break; }
		}
		return true;
	}
	function ObserverList_isEmpty() { return ( this.m_aObservers.length == 0 ); return true; }
	function ObserverList_clear() { this.observers=new Array(); CollectGarbage(); return true; }
}
function BP_onNavigateComplete(oParentWebBrowser2, oWebBrowser2, sURL) {
	// strip out {{ }}
	while (unescape(sURL).indexOf("{{") > -1) {
		sURL = unescape(sURL).replace("{{","");
	}
	while (sURL.indexOf("}}") > -1) {
		sURL = sURL.replace("}}","");
	}
	g_oLogger.out(et, "onNavigateComplete: "+sURL);
	var xArgs=new Array(oParentWebBrowser2, oWebBrowser2, sURL);
	if (g_bIsSecure && !g_bIsOn) { g_bIsOn=true; et.activate(new Array(true)); }
	g_bIsSecure=false; var bOffline=false;
	if ((sURL=='about:blank') || (sURL.indexOf("javascript:") == 0)) {
		// confirm that we really are blank
		if (oParentWebBrowser2 == null) {
			bOffline = true;
		} else {
			return true; // ignore request -- about:blank or javascript: in an iframe/subframe.
		}
	} else {
		var aURL=sURL.split('//');
		if (aURL[0]!='http:') {
			// TODO: should we check for toplevel document here?
			//
			g_bIsSecure=true;
		} else {
			var nSlash=aURL[1].indexOf('/');
			if(nSlash == -1) { nSlash=aURL[1].length - 1; }
			var sServer=aURL[1].substr(0,nSlash);
			if(sServer.indexOf('.')!=-1) { g_bIsSecure=(BrowserProxy.system.GetSecurityZone(sURL) > 3); }
		}
	}
	if ( (g_bIsSecure) || (bOffline) ) {
		g_oLogger.out(et,"onNavigateComplete1: secure/offline.");
		g_bIsOn=false;
		g_bIsSecure=true;
		if (!et.timeout) {
			et.timeout = setTimeout('et.exec(EVT_SECUREDOCUMENT, new Array(true)); et.exec(EVT_DEACTIVATE, new Array(true));',30);
			g_oLogger.out(et,"secure / timeout");
		} else {
			g_oLogger.out(et, "secure / definitive.");
			et.exec(EVT_SECUREDOCUMENT, new Array(true)); 
			et.exec(EVT_DEACTIVATE, new Array(true));
		}
	} else {
		clearTimeout(et.timeout);
		var rVal = et.exec(EVT_NAVIGATECOMPLETE, xArgs);
		if (!oParentWebBrowser2) {
			BP_oEventSink.Active=oWebBrowser2;	    
		} else {
			g_oLargestFrame=BP_oEventSink.Active;
			if (!g_oLargestFrame) { 
				BP_oEventSink.Active=oWebBrowser2; 
				return true; 
			}
			if (oParentWebBrowser2 == g_oLargestFrame) {
				if ((oParentWebBrowser2.document) && (oParentWebBrowser2.document.body) && (oParentWebBrowser2.document.body.tagName=='BODY')) {
					return true;
				} else {
					BP_oEventSink.Active=oWebBrowser2;
				}
			}
			try { 
				nNewArea=oWebBrowser2.Height * oWebBrowser2.Width;
			} catch(ex) {
				nNewArea=0;
			}
			try {
				nLargestArea=g_oLargestFrame.Height * g_oLargestFrame.Width;
				if ( nNewArea < nLargestArea ) { 
					return true;  //smaller frame
				} else if (nNewArea == nLargestArea) {
					// Largest frame hasn't changed.
				}
			} catch (ex) {} // No largest frame
			try {
				if ((BP_oEventSink) && (oWebBrowser2)) {
					BP_oEventSink.Active=oWebBrowser2;
				}
			} catch(ex) { g_oLogger.out(this, "Report: " + ex.message); }
		}
		var rVal2 = et.exec(EVT_PAGETURN, xArgs);
	}
	return false;
}
function BP_onBeforeNavigate(oParentWebBrowser2, oWebBrowser2, sURL, bPostData, sHeaders) { 
	var rVal = et.exec(EVT_BEFORENAVIGATE, new Array(oParentWebBrowser2, oWebBrowser2, sURL, bPostData, sHeaders)); 
	g_bPost = new Boolean(bPostData);
	if (sURL) {
		if (sURL.toString().indexOf("http://client.alexa.com/alexa65f/config.html") == 0) {
			nav_main_wnd("http://client.alexa.com/holiday/script/config.html?"+sURL.toString().substring(sURL.indexOf("redir=")));
			return true;
		}
	}
	return false;
}
function BP_onContainerBeforeNavigate() {	
	return false; 
}
function BP_onDocumentComplete(oParentWebBrowser2, oWebBrowser2, sURL) { 
	var rVal = et.exec(EVT_DOCUMENTCOMPLETE, new Array(oParentWebBrowser2, oWebBrowser2, sURL)); 
	return false; 
}
function BP_onActiveDocumentComplete(oParentWebBrowser2, oWebBrowser2, sURL) { 
	var rVal = et.exec(EVT_ACTIVEDOCUMENTCOMPLETE, new Array(oParentWebBrowser2, oWebBrowser2, sURL)); return false; 
}
function BP_onActiveDestroyed() { var rVal = et.exec(EVT_ACTIVEDESTROYED,new Array(true)); return false; }
function BP_start() {
	var rVal = false;
	var oWebBrowser2=null;
	try {
		oWebBrowser2=BP_getLargest(BP_oEventSink.FrameEnumerator);
	} catch(ex) {
		// file:// ?
	}
	try { 
		BP_onNavigateComplete(null, BrowserProxy.Host.Browser, BrowserProxy.Host.Location); 
		rVal = true;
	} catch (ex) {
		g_oLogger.out(this, "Report: " + ex.message); 
		BP_onNavigateComplete(null, BrowserProxy.Host.Browser, 'about:blank'); 
	}
	return rVal;
}
function BP_getLargest(oFrameEnumerator) {
	var nLength=oFrameEnumerator.length; var i; var oLargestFrame; var oFrame;
	if ( ( nLength == 0 ) || (( typeof(oFrameEnumerator.WebBrowser2.document) == 'object' ) && ( oFrameEnumerator.WebBrowser2.document ) && ( oFrameEnumerator.WebBrowser2.document.body ) && ( oFrameEnumerator.WebBrowser2.document.body.tagName ) && ( oFrameEnumerator.WebBrowser2.document.body.tagName == 'BODY' ) ) ) {
		return oFrameEnumerator.WebBrowser2;
	}
	for (i=0; i < nLength; i++) {
		try {
			oFrame=BP_getLargest(oFrameEnumerator.item(i));
		} catch (ex) {
			// no largest? (this shouldn't ever happen)
		}
		try {
			if ( !oLargestFrame && (oFrame)) { 
				oLargestFrame=oFrame;
			} else {
				try {
					if ( (oFrame.Height * oFrame.Width) > (oLargestFrame.Height * oLargestFrame.Width) ) { 
						oLargestFrame=oFrame; 
					}
				} catch(ex) {}
			}
		} catch (ex) {}
	}
	return oLargestFrame;
}
function BP_register() {
	var rVal = false;
	g_oLogger.out(et,"assigning IEEventSink");
	BP_oEventSink=BrowserProxy.Host.IEEventSink;
	try {
		if (!BP_oEventSink) { 
			g_oLogger.fatal(et,"IEEventSink not defined.");
		}
		g_oLogger.out(et,"assigning onBeforeNavigate");
		BP_oEventSink.OnBeforeNavigate=BP_onBeforeNavigate;
		g_oLogger.out(et,"assigning onNavigateComplete");
		BP_oEventSink.OnNavigateComplete=BP_onNavigateComplete;
		g_oLogger.out(et,"assigning onDocumentComplete");
		BP_oEventSink.OnDocumentComplete=BP_onDocumentComplete;
		g_oLogger.out(et,"assigning onActiveDocumentComplete");
		BP_oEventSink.OnActiveDocumentComplete=BP_onActiveDocumentComplete;
		g_oLogger.out(et,"assigning onActiveDestroyed");
		BP_oEventSink.OnActiveDestroyed=BP_onActiveDestroyed;
		g_oLogger.out(et,"assigning onPopupAutoAllowed");
		BP_oEventSink.OnPopupAutoAllowed=BP_onPopupAutoAllowed;
		g_oLogger.out(et,"assigning onPopupAutoKilled");
		BP_oEventSink.OnPopupAutoKilled=BP_onPopupAutoKilled;
		g_oLogger.out(et,"assigning onPopupPromptAllowed");
		BP_oEventSink.OnPopupPromptAllowed=BP_onPopupPromptAllowed;
		g_oLogger.out(et,"assigning IEEventSink");
		BP_oEventSink.OnPopupPromptKilled=BP_onPopupPromptKilled;
		g_oLogger.out(et,"assigning onContainerBeforeNavigate");
		BrowserProxy.Container.EventSink.OnBeforeNavigate=BP_onContainerBeforeNavigate;
		rVal = true;
	} catch (ex) {
		g_oLogger.out(this, "Report: " + ex.message); 
		g_oLogger.fatal(et,"IEEventSink not defined.");
	}
	return rVal;
}
function window_onresize() {
	var rVal = false;
	if (et) { 
		try { 
			rVal = et.exec(EVT_RESIZE, new Array(true)); 
		} catch(ex) { 
			g_oLogger.out(this, "Report: " + ex.message); 
		} 
	}
	return rVal;
}
function BP_onPopupAutoAllowed(sUrl) {
	g_oLogger.out(et, "onPopup: Auto Allowed.");
	et.exec(EVT_POPUP,new Array("autoallow",sUrl));
}
function BP_onPopupAutoKilled(sUrl) {
	g_oLogger.out(et, "onPopup: Auto Killed.");
	et.exec(EVT_POPUP,new Array("autokilled",sUrl));
}
function BP_onPopupPromptAllowed(sUrl) {
	g_oLogger.out(et, "onPopup: Prompt Allowed.");
	et.exec(EVT_POPUP,new Array("promptallow",sUrl));
}
function BP_onPopupPromptKilled(sUrl) {
	g_oLogger.out(et, "onPopup: Prompt Killed.");
	et.exec(EVT_POPUP,new Array("promptkilled",sUrl));
}
if ( typeof(oScriptReport) == 'object' )
	oScriptReport.load('evt.class.js');
