/// <reference path="optimizely.d.ts" /> /// <reference path="../util/ArrayUtils.ts" /> var econda; (function (econda) { var abtest; (function (abtest) { /** * Helper class to track optimizely a/b/n test using econda web tracking. * This class will read running experiments and variations from optimizely and transform them in * a data structure as expected by econda ab test tracking. * * var emospro = { * content: "company/about us", * siteid: "my-domain.com" * }; * emospro.abtest = econda.abtest.Optimizely.getTrackingData(); * window.emos3.send(emospro); * * @static * @class econda.abtest.Optimizely */ var Optimizely = (function () { function Optimizely() { } /** * It's better to cache variations data due to object tree layout in optimizely data. * @static * @private */ Optimizely.initVariationsCache = function () { var vcache = econda.abtest.Optimizely.variationsCache; if (vcache == null) { vcache = optimizely.data.variations; for (var sectionId in optimizely.data.sections) { var sectionData = optimizely.data.sections[sectionId]; for (var n = 0; n < sectionData.variation_ids.length; n++) { vcache[sectionData.variation_ids[n]].sectionName = sectionData.name; } } } return vcache; }; Optimizely.getExperimentById = function (id) { if (typeof (optimizely.data.experiments[id]) == "undefined") { return null; } else { var ret = optimizely.data.experiments[id]; ret.id = id; return ret; } }; Optimizely.getVariationById = function (id) { var vcache = this.initVariationsCache(); if (typeof (vcache[id]) == "undefined") { return null; } else { var ret = vcache[id]; ret.id = id; return ret; } }; Optimizely.getActiveVariationsFor = function (experimentId) { if (typeof optimizely.data.state.variationIdsMap[experimentId] == "undefined") { return []; } else { var variationIds = optimizely.data.state.variationIdsMap[experimentId]; var ret = []; for (var n = 0; n < variationIds.length; n++) { ret.push(this.getVariationById(variationIds[n])); } return ret; } }; /** * Get active experiments with their active variations. Return value is NOT intended to be * used directly in econda tracking. See {@link #getTrackingData}. * @private * @static * @return {Object} */ Optimizely.getState = function () { if (typeof optimizely == "undefined") { return null; } var activeExperimentIds = optimizely.data.state.activeExperiments; if (econda.util.ArrayUtils.isArray(activeExperimentIds) == false) { return null; } var data = []; for (var n = 0; n < activeExperimentIds.length; n++) { var current = this.getExperimentById(activeExperimentIds[n]); current.activeVariations = this.getActiveVariationsFor(current.id); data.push(current); } return data; }; /** * Returns data as expected by econda tracking. * * emospro.abtest = econda.abtest.Optimizely.getTrackingData(); * * @static */ Optimizely.getTrackingData = function () { var state = this.getState(); var ret = []; if (econda.util.ArrayUtils.isArray(state)) { for (var n = 0; n < state.length; n++) { ret.push(this.convertExperimentToTrackingData(state[n])); } } return ret; }; /** * Converts a single experiment (incl. active variations) into tracking data as required by econda tracking * @static * @param {Object} experiment * @private */ Optimizely.convertExperimentToTrackingData = function (experiment) { var c = this.cleanTextData; var variantNames = []; for (var n = 0; n < experiment.activeVariations.length; n++) { var av = experiment.activeVariations[n]; variantNames.push(av.sectionName != null ? (c(av.sectionName) + ": " + c(av.name)) : c(av.name)); } var ret = []; ret[0] = experiment.name; ret[1] = variantNames.join('/'); return ret; }; /** * Removes characters that are not allowed in section and variation names. * @static * @private * @param {String} text * @return {String} */ Optimizely.cleanTextData = function (text) { return text.replace(/[:\/]/, ""); }; /** * Variation id to variation object cache * @static * @private */ Optimizely.variationsCache = null; return Optimizely; }()); abtest.Optimizely = Optimizely; // end of class })(abtest = econda.abtest || (econda.abtest = {})); })(econda || (econda = {})); // end of module