// <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._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));
	}
	function EventTrap_activate() {
		this._activate();
		BP_onNavigateComplete(null, BrowserProxy.Host.Browser.Parent, 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)) || (sEvent == EVT_ACTIVATE)) {
			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); 
					g_oLogger.out(this.lists[sEvent].observers[si], "Sending event " + sEvent);
				}  
			}
		} else {
			g_oLogger.out(this, "got event " + sEvent + ", while inactive - ignoring.");
		}
		return rVal;
	}
	function EventTrap_register(sEvent, oObject) { 
		g_oLogger.out(this, "registering " + oObject.oType + " for event " + sEvent);
		this.lists[sEvent].add(oObject); return true; 
	}
	function EventTrap_unregister(sEvent, oObject) { 
		g_oLogger.out(this, "unregistering " + oObject.oType + " for event " + sEvent);
		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 normalizeUrl(sURL) {
	while (unescape(sURL).indexOf("{{") > -1) {
		sURL = unescape(sURL).replace("{{","");
	}
	while (sURL.indexOf("}}") > -1) {
		sURL = sURL.replace("}}","");
	}
	return sURL;
}

function BP_onNavigateComplete(oParentWebBrowser2, oWebBrowser2, sURL) {
	et.exec(EVT_NAVIGATECOMPLETE, new Array(oParentWebBrowser2, oWebBrowser2, sURL));
	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/holiday/config.html") == 0)) {
				nav_main_wnd(RESOURCE_URI + "/CHTML/config.html#"+sURL.toString().substring(sURL.indexOf("redir=")));
				//nav_main_wnd("http://client.alexa.com/holiday/script/CHTML/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.Parent, 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 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));
}

function isIframe(oParentWebBrowser2) {
	if ((oParentWebBrowser2.document) && (oParentWebBrowser2.document.body) && (oParentWebBrowser2.document.body.tagName=='BODY')) {
		// iframe, ignore request
		//
		return true;
	} 
	return false;
}


function SecurityInterceptor() {
	var o = new AlxObj();
	o.oType = "SecurityInterceptor";
	o.getIsSecure = SecurityInterceptor_getIsSecure;
	o.getIsIframe = SecurityInterceptor_getIsIframe;
	o.getIsIntranetSite = SecurityInterceptor_getIsIntranetSite;
	o.getIsOffline = SecurityInterceptor_getIsOffline;
	o.onNavigateComplete = SecurityInterceptor_onNavigateComplete;
	o.create();
	et.register(EVT_NAVIGATECOMPLETE, o);
	return o;

	function SecurityInterceptor_getIsSecure(sURL) {
		var aURL=sURL.split('//');
		if (aURL[0]!='http:') {
			// TODO: should we check for toplevel document here?
			//
			return true;
		} 
		return false;
	}

	function SecurityInterceptor_getIsIframe(oParentWebBrowser2, oWebBrowser2) {
		var retVal = false;
		// TopLevelContainer is unreliable -- use parent body check for iframe
		if (oWebBrowser2.TopLevelContainer == false) {
			try {
				var bIframe = isIframe(oParentWebBrowser2);
				if (bIframe) {
					retVal = true;
				}
			} catch(ex) {
				// cross-site iframe in SP2... do nothing
			}
		}
		return retVal;
	}
	function SecurityInterceptor_getIsIntranetSite(sURL) {
		var retVal = false;
		var aURL=sURL.split('//');
		if (aURL.length < 2) {
			return false;
		}
		var nSlash=aURL[1].indexOf('/');
		if(nSlash == -1) { nSlash=aURL[1].length - 1; }
		var sServer=aURL[1].substr(0,nSlash);
		if(sServer.indexOf('.')!=-1) { 
			// UGLY HACK. because GetSecurityZoneName expects a string...
			var zoneID = (BrowserProxy.system.GetSecurityZone(sURL)) + "";
			try {
				// GetSecurityZoneName takes a string!
				var zoneName = BrowserProxy.system.GetSecurityZoneName(zoneID);
				if (zoneName != null) {
					if (zoneName.toLowerCase().indexOf("intranet") > -1) {
						g_oLogger.out(this, "In intranet zone.");
						retVal = true;
					}
				}
			} catch(ex) {
			}
			return retVal;
		}
	}

	function SecurityInterceptor_getIsOffline(sURL, oParentWebBrowser2) {
		return  ((sURL=='about:blank') || (sURL.indexOf("javascript:") == 0));
	}

	function SecurityInterceptor_onNavigateComplete(aArgs) {

		var oParentWebBrowser2 = aArgs[0];
		var oWebBrowser2 = aArgs[1];
		var sURL = aArgs[2];


		if (this.isOff) {
			// toolbar is off -- don't hand off event
			//
			return true;
		}

		if (this.getIsIframe(oParentWebBrowser2, oWebBrowser2)) {
			// ignore requests for iframes
			//
			return true;
		}


		var isIntranet = this.getIsIntranetSite(sURL);
		var isSecure = this.getIsSecure(sURL);
		var isOffline = this.getIsOffline(sURL, oParentWebBrowser2);

		if ((isSecure || isIntranet || isOffline)) {
			// secure/offline
			//
			g_oLogger.out(this,"onNavigateComplete1: secure/offline.");
			if (!this.timeout) {
				this.timeout = setTimeout('et.exec(EVT_SECUREDOCUMENT, new Array(true)); et.exec(EVT_DEACTIVATE, new Array(true));',40);
				g_oLogger.out(this,"secure / timeout");
			} else {
				g_oLogger.out(this, "secure / definitive.");
				et.exec(EVT_SECUREDOCUMENT, new Array(true)); 
				et.exec(EVT_DEACTIVATE, new Array(true));
			}
			return true;
		}

		// at this point we have a valid request, reactivate the bar if it was deactivated
		//
		clearTimeout(this.timeout);
		et.exec(EVT_ACTIVATE, new Array(true));
		
		if (!oParentWebBrowser2) {
			// this is the top level frame.. set it
			BP_oEventSink.Active=oWebBrowser2;	    
		} else {
			g_oLargestFrame=BP_oEventSink.Active;
			if (!g_oLargestFrame) { 
				BP_oEventSink.Active=oWebBrowser2; 
				return true; 
			}
			if (oParentWebBrowser2 != oWebBrowser2) {
				// not a top level
				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); }
			}
		}
		if (BrowserProxy.Visible) {
			var rVal2 = et.exec(EVT_PAGETURN, aArgs);
		} else {
			// toolbar is not visible.. no data being sent.
			et.deactivate();
		}
		return false;
	}
}

if ( typeof(oScriptReport) == 'object' )
	oScriptReport.load('evt.class.js');

