function AnalyticsManager()
{
	this.errorReporting = false;
	this.inited = false;
	this.q = [];
	this.trackingCodes = [];
	this.trackers = [];

	this.InitEvents();
}

//----------------------------------------------------------------------------
AnalyticsManager.TrackingKey = null;
AnalyticsManager.TrackingDomain = null;

//----------------------------------------------------------------------------
AnalyticsManager.Scope = {
	VISITOR: 1,
	SESSION: 2,
	PAGE: 3
};

AnalyticsManager.Index = {
	PROMOID: 1,
	ORDERID: 2,
	TRANSACTIONID: 3,
	CAMPAIGNTYPE: 4,
	UNUSED: 5
}; 

AnalyticsManager.TrackingType =
{
	Event: 1,
	PageView: 2,
	Both: 3
};


//----------------------------------------------------------------------------
AnalyticsManager.prototype.Initialize =
function() {
	if (this.inited) return;
	
	window._gaq = window._gaq || [];
	var gaq = window._gaq,
		analyticsManager = AnalyticsManager,
		scope = analyticsManager.Scope,
		index = analyticsManager.Index;

	try {
		if (analyticsManager.TrackingKey)
			this.trackingCodes.push(analyticsManager.TrackingKey);
		if (typeof (DigitalCommerce_AnalyticsCode) == 'String' && DigitalCommerce_AnalyticsCode)
			this.trackingCodes.push(DigitalCommerce_AnalyticsCode);
		if (typeof (DigitalCommerce_AnalyticsCode) != 'undefined' && Object.isArray(DigitalCommerce_AnalyticsCode) && DigitalCommerce_AnalyticsCode.length > 0)
			this.trackingCodes.push(DigitalCommerce_AnalyticsCode);
		if (typeof (CampaignInfo) != 'undefined' && CampaignInfo.gaCode)
			this.trackingCodes.push(CampaignInfo.gaCode);

		this.trackingCodes = this.trackingCodes.flatten().uniq();
		/*
		if (!analyticsManager.TrackingKey) {
		if (typeof (DigitalCommerce_AnalyticsCode) != 'undefined' && DigitalCommerce_AnalyticsCode != '')
		analyticsManager.TrackingKey = DigitalCommerce_AnalyticsCode;
		else if (typeof (CampaignInfo) != 'undefined' && CampaignInfo.gaCode)
		analyticsManager.TrackingKey = CampaignInfo.gaCode;
		}
		*/
	}
	catch (e) {
		if (this.errorReporting) alert(e);
	}

	try {
		if (this.trackingCodes.length > 0) {
			//this.InitEvents();

			//set up trackers
			//first tracker is default, global, doesn't need a name
			this.trackers.push('');
			gaq.push(['_setAccount', this.trackingCodes[0]]);

			//other trackers are named
			for (var i = 1; i < this.trackingCodes.length; i++) {
				var trackerName = String.fromCharCode(96 + i);
				_gat._createTracker(this.trackingCodes[i], trackerName);
				this.trackers.push(trackerName);
			}

			//gaq.push(['_setAccount', analyticsManager.TrackingKey]);

			if (!analyticsManager.TrackingDomain)
				analyticsManager.TrackingDomain = '.' + location.host.split(".").slice(location.host.split(".").length - 2).join(".");

			if (analyticsManager.TrackingDomain)
				this.Push(['_setDomainName', analyticsManager.TrackingDomain]);

			this.Push(['_setAllowLinker', true], ['_setAllowHash', false], ['_setClientInfo', true], ['_setDetectFlash', false]);


			try {
				if (typeof (CampaignInfo) != 'undefined' && CampaignInfo) {
					if (CampaignInfo.promoid) {
						this.Push(['_setCustomVar', index.PROMOID, 'PromoID', CampaignInfo.promoid, scope.SESSION]);
					}

					if (CampaignInfo.orderid) {
						this.Push(['_setCustomVar', index.ORDERID, 'OrderID', CampaignInfo.orderid, scope.SESSION]);
					}

					if (CampaignInfo.campaignType) {
						this.Push(['_setCustomVar', index.CAMPAIGNTYPE, 'CampaignType', CampaignInfo.campaignType, scope.SESSION]);
					}
				}

				if (typeof (Acceller) != 'undefined' && Acceller.TransactionID && (Acceller.TransactionID > 0)) {
					this.Push(['_setCustomVar', index.TRANSACTIONID, 'TransactionID', CampaignInfo.TransactionID, scope.SESSION]);
				}
				else {
					this.Push(['_deleteCustomVar', index.TRANSACTIONID]);
				}
			} catch (e) { if (this.errorReporting) alert(e); }

			this.Push(['_trackPageview']);

			this.inited = true;

			this.q.each(function(activity) { this.TrackActivity(null, activity); }, this);
			this.q = null;

		}
	} catch (e) {
		if (this.errorReporting) alert(e);
	}
};

AnalyticsManager.prototype.InitEvents =
function() {
	try {
		this.TrackActivity = this._trackActivity.bind(this);
		this.TrackOrder = this._trackOrder.bind(this);
	
		if (typeof (OfferManager) != 'undefined') {
			OfferManager.Instance().observe("trackOrder", this.TrackOrder);
			ActivityManager.observe("activity", this.TrackActivity);
		}
	} catch (e) { }
};

AnalyticsManager.prototype.Push =
function(item) {
	$A(arguments).each(function(itm) {
		this.trackers.each(function(tracker) {
			var i = item.clone();
			if (tracker != '')
				i[0] = tracker + '.' + i[0];

			_gaq.push(i);
		}, this);
	}, this);
}

AnalyticsManager.prototype.TrackPageView = 
function( url )
{
    try { 
        if (url)
        	this.Push(['_trackPageview', url]);
        else
        	this.Push(['_trackPageview']);
    } catch(e) { if (this.errorReporting) alert(e); }
};

AnalyticsManager.prototype._trackActivity =
function(ctx, activity) {
	//do not let errors out of here so it does not affect other loggers
	try {
		if (!this.inited) {
			this.q.push(activity);
			return;
		}

		var evt = this.translateActivity(activity);
		if (evt) {
			if (evt.trackingType & AnalyticsManager.TrackingType.Event)
				this.TrackEvent(evt.category, evt.action, evt.label, evt.value);

			if (evt.trackingType & AnalyticsManager.TrackingType.PageView)
				this.TrackPageView(evt.url);
		}
	}
	catch (ex) {
	}
};

var GAEvent = function() {
	this.category = null;
	this.action = null;
	this.label = null;
	this.value = null;
	this.url = null;
	this.trackingType = null;
};

AnalyticsManager.prototype.translateActivity =
function(activity) {
	var evt,
		actType = activity.ActivityType,
		activityCategory = AnalyticsManager.activityCategories.get(actType),
		trackingType,
		action,
		lbl,
		val;

	if (activityCategory !== undefined) {
		evt = new GAEvent();
		trackingType = AnalyticsManager.activityTrackingType.get(actType) || AnalyticsManager.TrackingType.Event;
		evt.category = activityCategory;
		evt.trackingType = trackingType;

		action = AnalyticsManager.activityTrackingName.get(activity.ActivityType) || actType;
		if (Object.isFunction(action))
			action = action(activity);
		evt.action = action;
		lbl = AnalyticsManager.activityLabels.get(actType);
		if (lbl)
			evt.label = lbl.interpolate(activity);

		val = AnalyticsManager.activityValues.get(actType);
		if (val) {
			val = parseInt(val.interpolate(activity), 10);
			if (Object.isNumber(val))
				evt.value = val;
		}
		evt.url = AnalyticsManager.pageViewUrl.get(actType);
		if (evt.url) {
			if (Object.isFunction(evt.url))
				evt.url = evt.url(activity);
			else
				evt.url = evt.url.interpolate(activity);
		}
	}

	return evt;
};

AnalyticsManager.activityTrackingName = new Hash({
	CustomizationSubGroupActive: "ValidationNext",
	SubmitOrderClick: "ValidateOrder",
	AnalyticsClickOffer: "ClickOffer",
	QuickViewOpen: "OpenCategoryQuickview",
	CategorySelected: AnalyticsManager.translateOpenCategoryTrackingName,
	AnalyticsClickBuyflowOffer: "ClickBuyflowOffer",
	OfferSelected: AnalyticsManager.translateOfferSelectedTrackingName,
	OfferUnSelected: "RemoveOffer",
	AnalyticsOfferDetailsTab: "OfferDetailsTab",
	FilterClicked: "FilterProvider"
});

AnalyticsManager.activityTrackingType = new Hash({
	OfferDetails: AnalyticsManager.TrackingType.Both,
	OfferSelected: AnalyticsManager.TrackingType.Both,
	CustomizationSubGroupActive: AnalyticsManager.TrackingType.Both
});

AnalyticsManager.activityCategories = new Hash({
	SessionEmailClick: "Offer",
	SessionEmailSubmit: "Offer",
	ValidationNext: "Order",
	ValidateOrder: "Order",
	ClickOffer: "Offer",
	AnalyticsWhatHappensNext: "Order",
	CheckoutByOffer: "Order",
	CustomizationSubGroupActive: "Order",
	SubmitOrderClick: "Order",
	OfferDetails: "Offer",
	AnalyticsClickOffer: "Offer",
	QuickViewOpen: "Category",
	CategorySelected: "Category",
	AnalyticsClickBuyflowOffer: "Offer",
	OfferSelected: "Offer",
	OfferUnSelected: "Offer",
	CheckoutWhatHappensNext: "Order",
	ProviderViewSwitch: "Personalization",
	AnalyticsOfferDetailsTab: "Offer",
	SubFilterClicked: "Personalization",
	FilterClicked: "Personalization",
	QuickViewSwitchAway: "Category",
	QuickViewSwitchTo: "Category"
});

AnalyticsManager.activityLabels = new Hash({
	SessionEmailClick: "#{ProviderID} - #{ProviderOfferCd}",
	SessionEmailSubmit: "#{ProviderID} - #{ProviderOfferCd}",
	ValidationNext: "#{CustomizationSubGroupName}",
	ValidateOrder: "#{TransactionID}",
	ClickOffer: "#{ProviderID} - #{ProviderOfferCd}",
	AnalyticsWhatHappensNext: "#{TransactionID}",
	CheckoutByOffer: "#{TransactionID} - #{ProviderID} - #{ProviderOfferCd}",
	CustomizationSubGroupActive: "#{CustomizationSubGroupName}",
	SubmitOrderClick: "#{TransactionID}",
	OfferDetails: "#{ProviderID} - #{ProviderOfferCd}",
	AnalyticsClickOffer: "#{ProviderID} - #{ProviderOfferCd}",
	QuickViewOpen: "#{OfferCategoryType}",
	CategorySelected: "#{OfferCategoryType}",
	AnalyticsClickBuyflowOffer: "#{ProviderID} - #{ProviderOfferCd}",
	OfferSelected: "#{ProviderID} - #{ProviderOfferCd}",
	OfferUnSelected: "#{ProviderID} - #{ProviderOfferCd}",
	AnalyticsOfferDetailsTab: "#{ProviderID} - #{ProviderOfferCd}, tab ##{ClickID}",
	SubFilterClicked: "#{OfferCategoryType}",
	FilterClicked: "#{OfferCategoryType}",
	QuickViewSwitchAway: "#{OfferCategoryType}",
	QuickViewSwitchTo: "#{OfferCategoryType}"
});

AnalyticsManager.activityValues = new Hash({
	OfferDetails: "#{ClickID}"

});

AnalyticsManager.translateProviderName =
function(format, activity) {
	var om = OfferManager.Instance(),
		provider,
		providerName;
	if (om) {
		provider = om.GetProvider(activity.ProviderID);
		if (provider) {
			providerName = provider.name.replace(" ", "");
			return format.interpolate({ ProviderName: providerName });
		}
	}

	return format;
};

AnalyticsManager.pageViewUrl = new Hash({
	OfferDetails: AnalyticsManager.translateProviderName.curry("ViewOfferDetails-#{ProviderName}.aspx"),
	OfferSelected: AnalyticsManager.translateProviderName.curry("AddToCart-#{ProviderName}.aspx"),
	CustomizationSubGroupActive: "ValidationNext-#{CustomizationSubGroupName}.aspx"
});

//AnalyticsManager.activityValues = new Hash({
//});

AnalyticsManager.translateOpenCategoryTrackingName =
function(activity) {
	var activityType = activity.ActivityType,
		om = OfferManager.Instance(),
		cat;
	if (om) {
		cat = om.Categories.find(function(c) { return c.name == activity.OfferCategoryType; });

		if (cat.quickView)
			activityType = "OpenCategoryQuickview";
		else
			activityType = "OpenCategoryStandard";
	}

	return activityType;
};

AnalyticsManager.translateOfferSelectedTrackingName =
function(activity) {
	var activityType = activity.ActivityType;
	if (activity.ClickID == OfferManager.OfferManager.ChooseOfferClickID.OfferDetails || activity.ClickID == OfferManager.OfferManager.ChooseOfferClickID.UpsellDetails)
		activityType = "OfferSelectedFromDetails";

	return activityType;
};

AnalyticsManager.prototype.GetLinkerUrl =
function(url) {
var tracker = (typeof (_gat) != 'undefined') ? _gat._getTrackerByName() : null;
	try {
		if (tracker)
			url = tracker._getLinkerUrl(url);
	}
	catch (ex)
	{
	}
		
	return url;
};

AnalyticsManager.prototype.TrackEvent =
function(category, action, label, extraValue) {
	label = label || null;
	try {
		this.Push(['_trackEvent', category, action, label, extraValue]);
	} catch (e) { if (this.errorReporting) alert(e); }
};

AnalyticsManager.prototype._trackOrder =
function() {
	var orderID = Acceller.TransactionID;
	try {
		if (!orderID || (typeof (orderID) == 'undefined'))
			_gaq.push(['_getVisitorCustomVar', AnalyticsManager.Index.TRANSACTIONID]);
		if (!orderID || (typeof (orderID) == 'undefined'))
			orderID = window.orderID; // Failsafe
	} catch (e) { if (this.errorReporting) alert(e); }

	try {
		var om = OfferManager.Instance(),
			priceTotal = 0.0,
			priceTax = 0.0,
			priceShipping = 0.0,
			city = "",
			state = "",
			country = "";
		
		om.Offers.values().each(function(offer) {
			priceTotal += offer.GetLongTermPrice();
			priceTax += offer.GetLongTermTax();
			priceShipping += offer.GetShipping();
		});

		if (SearchPanelControl && SearchPanelControl.Instance) {
			city = SearchPanelControl.Instance.city;
			state = SearchPanelControl.Instance.state;
		}
		country = "United States";

		this.Push(['_addTrans', orderID, Acceller.ApplicationName, priceTotal, priceTax, priceShipping, city, state, country]);

		om.Offers.values().each(function(offer) {
		var cat = om.Categories.get(offer.categoryID),
			offerName = offer.name.replace(/[\(\)]/g, "");

			this.Push(['_addItem', orderID, offer.providerID + " - " + offer.offerCode, offerName, offer.type, offer.GetLongTermPrice(), "1"]);
		}, this);

		this.Push(['_trackTrans']);
	} catch (e) { if (this.errorReporting) alert(e); }
};

//----------------------------------------------------------------------------
AnalyticsManager.Instance = 
function()
{
	if(!window["analyticsManager"])
		window["analyticsManager"] = new AnalyticsManager();
	return window["analyticsManager"];
};

AnalyticsManager.Instance();
Event.observe(window, "load", function() { AnalyticsManager.Instance().Initialize(); });

if (typeof (gaJsHost) == 'undefined') {
	(function() {
		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
	})();
}
