/// <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