if (!window.EventManager) {
	var EventManager = {
		eventNameRoot : 'com.cobaltgroup.ws.view',
		pageViewToken : 'page',
		conversionToken : 'conversion',
		handlerArray : null,
		handlersRegistered : false,
		eventQueue : [],
		callbackTimeout : 200,
		//
		subscribe : function(paramOb) {
			var eventName = paramOb.eventName;
			var callback = paramOb.callback;
			var scope = (!paramOb.scope) ? null : paramOb.scope;
			var subscriberData = (!paramOb.subscriberData) ? null : paramOb.subscriberData;
			var filter = (!paramOb.filter) ? null : paramOb.filter;
			//
			return OpenAjax.hub.subscribe(eventName, callback, scope, subscriberData, filter);
		},
		unsubscribe : function(sub) {
			OpenAjax.hub.unsubscribe(sub);
		},
		publish : function(paramOb) {
			if (EventManager.handlersRegistered) {
				var eventName = paramOb.eventName;
				var publisherData = (!paramOb.publisherData) ? null : paramOb.publisherData;
				//
				OpenAjax.hub.publish(eventName, publisherData);
				// At this point all handlers have been executed.
				// check here for callBack, execute it after a short delay if callbackTimeout is set (this will allow any image requests to complete)
				if (paramOb.callback) {
					if (EventManager.callbackTimeout > 0) {
						var t = setTimeout(paramOb.callback, EventManager.callbackTimeout);
					} else {
						paramOb.callback();
					}
				}
			} else {
				// queue event
				EventManager.eventQueue.push(paramOb);
			}
		},
		bindEvent : function(eventOb) {
			jQuery(eventOb.elementSelector).bind(eventOb.eventType, function(e){
				EventManager.publish({
					eventName : eventOb.eventName,
					publisherData : e
				});
			});
		},
		/** 
		*	Store the handler array
		*/
		setHandlerArray : function(arr) {
			EventManager.handlerArray = arr;
		},
		/**
		* Set the EventManager to wait until the doc is ready before registering handlers.
		*
		* @param handlerArray	An array of handler objects
		*/
		addHandlers : function(handlerArray) {
			EventManager.setHandlerArray(handlerArray);
		},
		/**
		*	Init will be executed at window onload (see code below EventManager)
		*/
		init : function() {
			if (EventManager.handlerArray) {
				EventManager.registerHandlers(EventManager.handlerArray);
			} 
			EventManager.handlersRegistered = true;
			EventManager.publishQueueEvents();
			EventManager.publishPageView();
		},
		/**
		* Register an array of handler objects to the event hub.
		*
		* @param handlerArray	An array of handler objects
		*/
		registerHandlers : function(handlerArray) {
			var i;
			var len = handlerArray.length;
			var newHandler;
			for (i=0; i < len; i++) {
				newHandler = EventManager.getEventHandlerInstance(handlerArray[i].source, handlerArray[i].handler);
				//
				EventManager.subscribe({
					eventName : handlerArray[i].eventName,
					callback : 'execute',
					scope : newHandler
				});
			}
		},
		/**
		* Create a new instance of EventHandler
		*/
		getEventHandlerInstance : function(source, handler) {
			if (!EventHandler) {return;}

			var i = new EventHandler(source);
			// override doHandler
			i.doHandler = handler;
			return i;
		},
		/**
		*	Publish any queued events
		*/
		publishQueueEvents : function() {
			var i, len = EventManager.eventQueue.length;
			if (len > 0) {
				for (i=0; i < len; i++) {
					EventManager.publish(EventManager.eventQueue[i]);
				}
			}
		},
		/**
		* Publish the pageView or conversion event
		*/
		publishPageView : function() {
			var pageLayout = (ContextManager && ContextManager.getPageLayout()) ? ContextManager.getPageLayout() : "";
			var token = (pageLayout.indexOf('ThankYou') != -1) ? EventManager.conversionToken : EventManager.pageViewToken;
			var eventName = EventManager.eventNameRoot + "." + token;
			if(token == EventManager.pageViewToken){
				ContextManager.setPageMonitoring(true);	
			}
			EventManager.publish({
				eventName : eventName
			});
		}
	};
	
	if (window.attachEvent) {
		window.attachEvent('onload', EventManager.init);
	} else if (window.addEventListener) {
		window.addEventListener('load', EventManager.init, false);
	} else {
		document.addEventListener('load', EventManager.init, false);
	} 
}


