 /**********************************************
@title:  reportingService.js
@author:  Andrew Southwick
@date:    02-11-2007
@rev:     1.2
@desc:    Reporting Service - this is the principle JS Controller framework file for reporting and references on all
* other <view type>Manager.js files for runtime (the core view managers and have been seperated into other js files.
@assumes: prototype.js 1.5 rel.
@assumes: commonManager.js,<list others here>
********************************/
 

var ReportingService = Class.create();

ReportingService.prototype = {
    isActive: true,
    initialize:function() {
		
	},
	model:{
		reportRegistry:[],
		reportsWaiting:[],
		reportsToClean:[]
	},
	controller: {
		init:{},
		reportingManager:{},
		viewManagers:{
			commonViewManager:{},
			framesetViewManager:{},
			errorPageViewManager:{},
			categorySearchViewManager:{},
			categoryViewManager:{},
			siteSearchViewManager:{},
			productLoaderViewManager:{},
			productpageViewManager:{},
			productImageLoaderViewManager:{},
			viewLargerViewManager:{},
			altViewsViewManager:{},
			zoomViewViewManager:{},
			quicklookViewManager:{},
			outfitViewManager:{},
			inlineBagAddViewManager:{},
			shoppingBagViewManager:{},
			firstCheckoutPageViewManager:{},
			checkoutOrderModuleViewManager:{},
			orderConfirmViewManager:{},
			reviewsWrapperViewManager:{},
			reviewsProfileViewManager:{},
			reviewsVoteViewManager:{}
		},
		appManagers:{
			shopBySizeAppManager:{},
			searchAppManager:{},
			checkoutAppManager:{}
		},
		AbstractReportViewManager:null,
		AbstractReportAppManager:null,
		AbstractABTestManager:null
	},
	constants:{
		viewTypes:{
			COMMON_VIEW:"common",
			FRAMESET_VIEW:"frameset",
			ERROR_PAGE_VIEW:"errorPage",
			CATEGORY_SEARCH_VIEW:"categorySearch",
			CATEGORY_VIEW:"category",
			SITE_SEARCH_VIEW:"siteSearch",
			PRODUCT_LOADER_VIEW:"productLoader",
			PRODUCT_VIEW:"product",
			PRODUCT_IMAGE_LOADER_VIEW:"productImageLoader",
			VIEW_LARGER_VIEW:"viewLarger",
			ALT_VIEWS_VIEW:"altViews",
			ZOOM_VIEW_VIEW:"zoomView",
			QUICKLOOK_VIEW:"quicklook",
			OUTFIT_VIEW:"outfit",
			INLINE_BAG_ADD_VIEW:"inlineBagAdd",
			SHOPPING_BAG_VIEW:"shoppingBag",
			FIRST_CHECKOUT_PAGE_VIEW:"firstCheckoutPage",
			CHECKOUT_ORDER_MODULE_VIEW:"checkoutOrderModule",
			ORDER_CONFIRM_VIEW:"orderConfirm",
            ERROR_VIEW:"error",
            REVIEWS_WRAPPER_VIEW:"reviewsWrapper",
            REVIEWS_PROFILE_VIEW:"reviewsProfile",
            REVIEWS_VOTE_VIEW:"reviewsVote"
        },
		reportingServiceTypes:{
			REPORTING_SERVICE_TYPE_G:"g",
			REPORTING_SERVICE_TYPE_H:"h"
		}
	}
}

var reportingService = new ReportingService();
reportingService.controller.AbstractReportViewManager = Class.create();
reportingService.controller.AbstractReportViewManager.prototype = {
	reportName:null,
	isReadyForTransmission:false,
	isWaitReport:false,
	isWaitComplete:false,
	initialize:function() {
		
	},
	model: {},
	controller: {
		setReportModel:null,
		setReportTransmissionVars:null,
		setCleanUp:null
	}
}

reportingService.controller.AbstractReportAppManager = Class.create();
reportingService.controller.AbstractReportAppManager.prototype = {
	reportName:null,
	initialize:function() {
		
	},
	model: {},
	controller: {
		setReportModel:null,
		setReportTransmissionVars:null
	}
}

reportingService.controller.AbstractReportProcessingLog = Class.create();
reportingService.controller.AbstractReportProcessingLog.prototype = {
	reportRegistry:[],
	reportsToClean:[],
	reportsWaiting:[],
	reportTime:null,
	initialize:function() {
		
	}
}

reportingService.controller.AbstractOmniStub = Class.create();
reportingService.controller.AbstractOmniStub.prototype = {
	strCurrentPageName:null,
	initialize:function() {
		
	}
}
	
Object.extend(
	reportingService.controller.init, {
		main:function() {
			Event.onDOMReady(this.setDomReadyHandler);
			
			
			
			omni = new reportingService.controller.AbstractOmniStub();
		},
		setDomReadyHandler:function() {
			var reportingManager = reportingService.controller.reportingManager;

			var categoryOrCheckoutRegExp = /(browse\/search\.do)|(browse\/category(Search)?\.do)|(checkout\/order\.do)/;
			
			
			if (clientBrowser.isIE6up && categoryOrCheckoutRegExp.test(window.location)) {
				setTimeout("reportingService.controller.reportingManager.getReportingRequest()",1000);
			} else {
				reportingManager.getReportingRequest();
			}
		}
	}
);

Object.extend(
	reportingService.controller.reportingManager, {
		reportingAccount:null,
		currencyType:null,
		registryHasWaitReports:false,
		reportProcessingLogs:[],
		inspectReportRegistry:function() {
            if(!window['s']) { return; }
			var reportingManager = reportingService.controller.reportingManager;
			var reportRegistry = reportingService.model.reportRegistry;
			var reportsWaiting = reportingService.model.reportsWaiting;
			var registryIterator = null;
			reportingManager.registryHasWaitReports = false;

			registryIterator = function(viewManager, registryIndex) {
				var viewManagerController = viewManager.controller;
				var reportName =  viewManager.reportName;
				var reportingManager = reportingService.controller.reportingManager;
				if (viewManager.isReadyForTransmission == false) {
					if ((viewManager.isWaitReport == true) && (viewManager.isWaitComplete == false)) {
						reportingManager.registryHasWaitReports = true;
						reportsWaiting.push(viewManager);
					}
					else {
						reportingManager.processReport(viewManager);
					}
				}
				else {
					
					reportingManager.processReport(viewManager);
				}
			}

			reportRegistry.each(registryIterator);
			
			if (reportingManager.registryHasWaitReports == true) {
				
			}
			else {
				/* No reportsWaiting found in registry inspection so transmit request
				 * immediately.
				 */
				
				
				reportingManager.setABTestingOverrideVariables();
				reportingManager.transmitRequest();
			}
		},
		processReport:function(viewManager) {
			var viewManagerController = viewManager.controller;
			var reportsToClean = reportingService.model.reportsToClean;
			if (viewManagerController) {
				if (viewManagerController.setReportModel && viewManagerController.setReportTransmissionVars) {
					viewManagerController.setReportModel();
					viewManagerController.setReportTransmissionVars();
					viewManager.isReadyForTransmission = true;
				}
				else {
					
				}
				if (viewManagerController.setCleanUp) {
					reportsToClean.push(viewManager);
				}
			}
		},
		setViewManagerToReportRegistry:function(viewManager) {
			var reportRegistry = reportingService.model.reportRegistry;
			var reportRegistrySize = null;
			var nextReportIndex = null;
			if (reportRegistry == null) {
				reportingService.model.reportRegistry = new Array();
				reportRegistry = reportingService.model.reportRegistry;
			}
			reportRegistry.push(viewManager);
		},
		getReportingRequest:function(viewManagers) {
			var reportingManager = reportingService.controller.reportingManager;
			var reportRegistry = reportingService.model.reportRegistry;
			var viewManager = null;
			if (viewManagers instanceof Array) {
				if (viewManagers) {
					for (var viewManagerCount = 0;viewManagerCount < viewManagers.length;viewManagerCount++) {
						viewManager = viewManagers[viewManagerCount];
						reportingManager.setViewManagerToReportRegistry(viewManager);
					}
				}
			}
			else if (viewManagers instanceof Object) {
				viewManager = viewManagers;
				reportingManager.setViewManagerToReportRegistry(viewManager);
			}
			reportingManager.inspectReportRegistry();
		},
		/**
		 * setABTestingOverrideVariables reads values from a globally scoped object to override values.
		 * 
		 * Modified 8/26/09 Byung -- relaxed the eVar restriction to allow overriding of any value 
		 */
		setABTestingOverrideVariables:function() {
			if (window["ABTestVariables"]) {
				var evars = Object.keys(ABTestVariables);
				evars.each(function(evar) {
					if (evar) s[evar] = ABTestVariables[evar];
				});
			}
		},
		transmitRequest:function() {
			/* Omniture sCode transmission code here.
			 * After transmission call the setCleanUp() method on each viewManager in the reportRegistry.
			 * After setCleanUp clear the reportRegistry, reportsToClean, and reportsWaiting.
			 */
			var reportingManager = reportingService.controller.reportingManager;
			var reportRegistry = reportingService.model.reportRegistry;
			var reportsToClean = reportingService.model.reportsToClean;
			var reportsWaiting = reportingService.model.reportsWaiting;
			var reportProcessingLogs = reportingService.controller.reportingManager.reportProcessingLogs;
			var reportsToCleanIterator = null;
			var reportProcessingLog = null;
			
			reportingManager.sendAnalyticsEvent();
			
			reportsToCleanIterator = function(viewManager, reportIndex) {
				if (viewManager.controller.setCleanUp) {
					viewManager.controller.setCleanUp();
				}
			}
			
			reportsToClean.each(reportsToCleanIterator);
			reportProcessingLog = new reportingService.controller.AbstractReportProcessingLog();
			reportProcessingLog.reportRegistry = reportRegistry;
			reportProcessingLog.reportsToClean = reportsToClean;
			reportProcessingLog.reportsWaiting = reportsWaiting;
			reportProcessingLog.reportTime = new Date();
			reportProcessingLogs.push(reportProcessingLog);

			reportingService.model.reportRegistry = new Array();
			reportingService.model.reportsToClean = new Array();
			reportingService.model.reportsWaiting = new Array();
			
		},
		sendAnalyticsEvent:function() {
			if (!$('omniSendAnalytics')) {
				var reportingNode = document.createElement('div');
				reportingNode.id = "omniSendAnalytics";
				document.body.appendChild(reportingNode);
			}
			s_code = s.t();
						
			if (s_code) {
				$('omniSendAnalytics').innerHTML = s_code;
			}
		}
	}
);

reportingService.controller.init.main();

