///<reference path="./IMacroReaderConfigOptions.ts" />
///<reference path="./IMacroReaderResult.ts" />
///<reference path="./CookieReader.ts" />
///<reference path="./DataLayerReader.ts" />
///<reference path="./EventDataReader.ts" />
///<reference path="./JsVariableReader.ts" />
///<reference path="./DomElementReader.ts" />
///<reference path="./MetaDataReader.ts" />
///<reference path="./MacroReader.ts" />
///<reference path="./JsSnippetReader.ts" />
///<reference path="./NullReader.ts" />
///<reference path="./UrlReader.ts" />
///<reference path="../Macro.ts" />
var econda;
(function (econda) {
    var tagmanager;
    (function (tagmanager) {
        var macro;
        (function (macro) {
            var reader;
            (function (reader_1) {
                var Macro = econda.tagmanager.macro.Macro;
                /**
                 * Read value for given macro definition. It will use specialized readers internally.
                 * @class econda.tagmanager.macro.reader.Reader
                 * @private
                 */
                var Reader = (function () {
                    function Reader(cfg) {
                        this.readers = [];
                        this.nullReader = null;
                        this.config = cfg;
                        this.initReaders();
                    }
                    /**
                     * We initialize all readers one time. This is the place, where we can set global config options.
                     */
                    Reader.prototype.initReaders = function () {
                        var config = this.config;
                        var r = this.readers;
                        r[Macro.SOURCE_URL] = new econda.tagmanager.macro.reader.UrlReader();
                        // url reader will read url param if patternSourceName is not empty
                        r[Macro.SOURCE_URL_PARAMETER] = r[Macro.SOURCE_URL];
                        r[Macro.SOURCE_COOKIE] = new econda.tagmanager.macro.reader.CookieReader();
                        r[Macro.SOURCE_DATA_LAYER] = new econda.tagmanager.macro.reader.DataLayerReader({
                            dataLayer: config.dataLayer
                        });
                        r[Macro.SOURCE_JAVASCRIPT_VARIABLE] = new econda.tagmanager.macro.reader.JsVariableReader({
                            globalVariableParent: config.globalVariableParent
                        });
                        r[Macro.SOURCE_DOM_ELEMENT] = new econda.tagmanager.macro.reader.DomElementReader();
                        r[Macro.SOURCE_META_ELEMENT] = new econda.tagmanager.macro.reader.MetaDataReader();
                        r[Macro.SOURCE_MACRO] = new econda.tagmanager.macro.reader.MacroReader({
                            container: config.container
                        });
                        r[Macro.SOURCE_JAVASCRIPT_SNIPPET] = new econda.tagmanager.macro.reader.JsSnippetReader();
                        r[Macro.SOURCE_CURRENT_EVENT] = new econda.tagmanager.macro.reader.EventDataReader();
                        this.nullReader = new econda.tagmanager.macro.reader.NullReader();
                    };
                    Reader.prototype.readValue = function (macroDefinition, eventData) {
                        if (eventData === void 0) { eventData = null; }
                        var reader = this.readers[macroDefinition.patternSource] || this.nullReader;
                        if (eventData === null) {
                            return reader.readValue(macroDefinition);
                        }
                        else {
                            return reader.readValueWithEvent(macroDefinition, eventData);
                        }
                    };
                    return Reader;
                }());
                reader_1.Reader = Reader;
            })(reader = macro.reader || (macro.reader = {}));
        })(macro = tagmanager.macro || (tagmanager.macro = {}));
    })(tagmanager = econda.tagmanager || (econda.tagmanager = {}));
})(econda || (econda = {}));