﻿function createDefaultOmnitureTracker() {
	return new omnitureTracker('mxmacromedia', 'mxbusinesscatalystv3'); // Production
	//return new omnitureTracker(null, 'mxbusinesscatalystv3qa'); // QA
}

function omnitureTracker(adobeAccount, bcAccount) {
    
    // PRIVATE FIELDS
    var adobeState = {}; // gather data for tracking on the Adobe Omniture account
    var bcState = {};    // gather data for tracking on the BC Omniture account

    // PRIVATE METHODS
    function initTrackingAdobe() {
        if (adobeAccount == null || adobeAccount == "") {
            return null;
        }

        var s = s_gi(adobeAccount);

        s.charSet = "UTF-8";
        /* Conversion Config */
        s.currencyCode = "USD";
        /* Link Tracking Config */
        s.trackDownloadLinks = true;
        s.trackExternalLinks = true;
        s.trackInlineStats = true;
        s.linkDownloadFileTypes = "exe,zip,wav,mp3,mov,mpg,avi,wmv,doc,pdf,xls";
        s.linkInternalFilters = "javascript:,macromedia.com,adobe.com,photoshop.com,acrobat.com,businesscatalyst.com,testsuite.biz,worldsecuresystems.com";
        s.linkLeaveQueryString = false;
        s.linkTrackVars = "None";
        s.linkTrackEvents = "None";

        s.trackingServer = "stats.adobe.com";
        s.trackingServerSecure = "sstats.adobe.com";
        s.dc = 112;

        s_initPlugins(s);
        s.usePlugins = true;
        s.doPlugins = doPluginsAdobe;

        clearTrackerObject(s);

        return s;
    }
    function initTrackingBC() {
        if (bcAccount == null || bcAccount == "") {
            return;
        }

        var s = s_gi(bcAccount);

        s.charSet = "UTF-8";
        /* Conversion Config */
        s.currencyCode = "USD";
        /* Link Tracking Config */
        s.trackDownloadLinks = true;
        s.trackExternalLinks = true;
        s.trackInlineStats = true;
        s.linkDownloadFileTypes = "exe,zip,wav,mp3,mov,mpg,avi,wmv,doc,pdf,xls";
        s.linkInternalFilters = "javascript:,macromedia.com,adobe.com,photoshop.com,acrobat.com,businesscatalyst.com,testsuite.biz,worldsecuresystems.com";
        s.linkLeaveQueryString = false;
        s.linkTrackVars = "None";
        s.linkTrackEvents = "None";

        s.trackingServer = "stats.adobe.com";
        s.trackingServerSecure = "sstats.adobe.com";
        s.dc = 112;

        s_initPlugins(s);
        s.usePlugins = true;
        s.doPlugins = doPluginsBC;

        clearTrackerObject(s);

        return s;
    }

    function clearTrackerObject(s) {
        // NOTE: The tracker object needs to be manually cleared when tracking multiple page views without server postbacks
        s.events = null;
    }

    function trackInternal(s, state) {
        if (s == null) {
            return;
        }

        for (var property in state) {
            s[property] = state[property];
        }

        var s_code = s.t();
        if (s_code) {
            document.write(s_code)
        }
    }
    function trackLinkInternal(s, linkObject, linkType, linkName) {
        if (s == null) {
            return;
        }

        s.tl(linkObject, linkType, linkName);
    }

    function trackToAdobe() {
        trackInternal(initTrackingAdobe(), adobeState);
    }
    function trackToBC() {
        trackInternal(initTrackingBC(), bcState);
    }

    function trackLinkToAdobe(linkObject, linkType, linkName) {
        trackLinkInternal(initTrackingAdobe(), linkObject, linkType, linkName);
    }
    function trackLinkToBC(linkObject, linkType, linkName) {
        trackLinkInternal(initTrackingBC(), linkObject, linkType, linkName);
    }

    function doPluginsAdobe(s) {
        // nothing to do
    }
    function doPluginsBC(s) {
        // Internal campaign tracking - this is done in doPlugins because we use the getValOnce plugin
        if (s.getQueryParam('trackingid')) {
            s.campaign = s.getQueryParam('trackingid');
            s.campaign = s.getValOnce(s.campaign, 's_campaign', 0);
        }

        // External campaing tracking 
        if (s.getQueryParam('sdid')) {
            s.eVar9 = s.getQueryParam('sdid');
            s.eVar9 = s.getValOnce(s.eVar9, 'eVar9', 0);
        }
        var relativePath = s.getRelativePath();
        if (relativePath) {
            window.s_objectID = relativePath;
        }
    }

    // PUBLIC METHODS

    // ==============
    // == Tracking ==
    // ==============
    this.track = function (pageState) {
        if (window.trackPage && trackPage(this, pageState)) {
			trackToBC();
            trackToAdobe();
        }
    }
    this.trackLink = function (linkObject, linkType, linkName) {
        //trackLinkToAdobe(linkObject, linkType, linkName);
        trackLinkToBC(linkObject, linkType, linkName);
    }
    this.trackForced = function () {
		trackToBC();
        trackToAdobe();
    }
    this.clear = function () {
        adobeState = {};
        bcState = {};
    }

    // ================================
    // == Variable and event setting ==
    // ================================
    this.setChannel = function (channel) {
        adobeState.channel = channel;
        bcState.channel = channel;
    }

    this.setPageName = function (pageName) {
        adobeState.pageName = "BC > " + pageName;
        bcState.pageName = "BC > " + pageName;

        var parts = pageName.split(">");
        for (var i = 0; i < parts.length; i++) {
            parts[i] = parts[i].replace(/^\s+|\s+$/g, ""); // trim spaces
        }

        var partProperties = ["prop72", "prop73", "prop74", "prop75"];

        for (var i = 0; i < partProperties.length; i++) {
            var value = parts.slice(0, Math.min(i + 1, parts.length)).join(" > ");
            //adobeState[partProperties[i]] = value;
            bcState[partProperties[i]] = value;
        }
    }

    this.setUserType = function (userType) {
        bcState.prop70 = userType;
    }

    this.setSiteType = function (siteType) {
        bcState.prop71 = siteType;
    }

    this.setSourceFromHybrid = function (source) {
        bcState.prop67 = source.menu;
        bcState.eVar67 = source.menu;
        bcState.prop68 = source.recent;
        bcState.eVar68 = source.recent;
    }

    this.setProductEvent = function (product, price, events) {
        if (price != null) {
            bcState.products = ";" + product + ";;" + price;
        } else {
            bcState.products = ";" + product + ";;";
        }

        if (arguments.length > 2) {
			var productEvents = argsToArray(arguments).slice(2).join(",");
			if (bcState.events != null && bcState.events != "") {
				bcState.events = bcState.events + "," + productEvents;
			} else {
				bcState.events = productEvents;
			}
        }
    }
	
	/*
		Appends incrementator to the last product (which is expected to have all fields before - eventually empty), or creates a new product if bcState.products is empty.
		Notes:
			- the event being incremented should also be present into the .events variable (which is usually set using the setCustomEvent function)
	*/
	this.setCustomEventValue = function (event, value) {		
		if (bcState.products != null && bcState.products != "") {
			bcState.products = bcState.products + ";";
		}
		else {
			bcState.products = ";;;;";
		}		
		bcState.products = bcState.products + event.bc + "=" + value;		
	}

    this.setCurrencyCode = function (currencyCode) {
        bcState.currencyCode = currencyCode;
    }

    this.setPurchaseIdentifier = function (purchaseId) {
		if (purchaseId != null) {
			bcState.purchaseID = purchaseId;
		}
    }

    this.setCustomEvent = function (eventParams) {
        if (arguments.length > 0) {
            var events = argsToArray(arguments);

            var adobeEvents = where(select(events, function (e) { return e.adobe }), function (e) { return e != null });
            if (adobeEvents.length > 0) {
                adobeState.events = adobeEvents.join(",");
            }

            var bcEvents = where(select(events, function (e) { return e.bc }), function (e) { return e != null });
            if (bcEvents.length > 0) {
                bcState.events = bcEvents.join(",");
            }
        }
    }

    this.setPartnerPlan = function (partnerPlan) {
        bcState.eVar27 = partnerPlan;
    }

    this.setSitePlan = function (sitePlan) {
        bcState.eVar26 = sitePlan;
    }

    this.setPromoCode = function (promoCode) {
        bcState.eVar2 = promoCode;
    }

    this.setBillingMethod = function (billingMethod) {
        bcState.eVar19 = billingMethod;
    }

    this.setConversionError = function (error) {
        bcState.eVar11 = error;
    }

    this.setGuidedTourStep = function (step) {
        // NO eVar
    }

    this.setSiteCreationMethod = function (siteCreationMethod) {
        bcState.eVar14 = siteCreationMethod;
    }

    this.setCountry = function (country) {
        bcState.eVar5 = country;
		bcState.prop69 = country;
    }

    this.setReferredPartner = function (referredPartner) {
        bcState.eVar39 = referredPartner;
    }

    this.setPartnerDiscountCode = function (partnerDiscountCode) {
        bcState.eVar3 = partnerDiscountCode;
    }
	
	this.setSearchKeywords = function (keywords) {
		bcState.prop65 = keywords;
		bcState.eVar65 = keywords;
	}
	
	this.setSearchResultCount = function (resultCount) {
		bcState.prop66 = resultCount;
	}
	
	this.setOldSitePlan = function (oldPlan) {
		bcState.eVar66 = oldPlan;
	}
}

// ENUMS
productEvents = {
    view: 'prodView',
    addToCart: 'scAdd',
    purchase: 'purchase',
    checkout: 'scCheckout'
};

customEvents = {
    partnerUpgradeFailure: { adobe: null, bc: 'event80' },
    siteUpgradeFailure: { adobe: null, bc: 'event80' },
    partnerSignupInitiation: { adobe: null, bc: 'event77' },
    partnerSignupSuccess: { adobe: null, bc: 'event78' },
    partnerSignupFailure: { adobe: null, bc: 'event80' },
    guidedTourPause: { adobe: null, bc: null },
    guidedTourCompletion: { adobe: null, bc: 'event5' },
    guidedTourAbort: { adobe: null, bc: null },
    siteCreationSuccess: { adobe: null, bc: 'event79' },
    siteCreationFailure: { adobe: null, bc: 'event80' },
    rebrandedSiteCreationSuccess: { adobe: null, bc: 'event4' },
    rebrandedSiteCreationFailure: { adobe: null, bc: 'event80' },
    loginToPP: { adobe: null, bc: 'event81' },
    returnToAdmin: { adobe: null, bc: 'event82' },
    editPage: { adobe: null, bc: 'event83' },
    editLayout: { adobe: null, bc: 'event84' },
    getHelp: { adobe: null, bc: 'event85' },
    insertModule: { adobe: null, bc: 'event86' },
    siteCancellation: { adobe: null, bc: 'event87' },
    lostRevenue: { adobe: null, bc: 'event89' },
	changeSitePlan: { adobe: null, bc: 'event76' },
	partnerActivationSuccess: { adobe: null, bc: 'event90' }
};

// GENERAL HELPERS
function isNull(o, defaultValue) {
    return o ? o : defaultValue;
}

function argsToArray(argumentsObject) {
    return Array.prototype.slice.call(argumentsObject);
}

function where(array, predicate) {
    if (array == null) {
        return null;
    }

    var result = [];
    var resultIndex = 0;

    for (var i = 0; i < array.length; i++) {
        if (predicate(array[i])) {
            result[resultIndex] = array[i];
            resultIndex++;
        }
    }

    return result;
}

function select(array, projection) {
    if (array == null) {
        return null;
    }

    var result = [];
    
    for (var i = 0; i < array.length; i++) {
        result[i] = projection(array[i]);
    }

    return result;
}

function getQSParameter(name) {
    var qs = window.location.search.substring(1);
    var qsParts = qs.split("&");
    for (i = 0; i < qsParts.length; i++) {
        var qsParamParts = qsParts[i].split("=");
        if (qsParamParts[0] == name) {
            return qsParamParts[1];
        }
    }

    return null;
}




