var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/// <reference path="../../base/BaseClass.ts" />
/// <reference path="../macro/output/IOutputFormatter.ts" />
/// <reference path="../macro/output/BooleanFormatter.ts" />
/// <reference path="../macro/output/RawFormatter.ts" />
/// <reference path="../macro/output/UrlFormatter.ts" />
/// <reference path="../macro/output/HtmlFormatter.ts" />
/// <reference path="../macro/output/JsonFormatter.ts" />
/// <reference path="../macro/output/JsFormatter.ts" />
var econda;
(function (econda) {
    var tagmanager;
    (function (tagmanager) {
        var tag;
        (function (tag) {
            /**
             * Replaces macro values in tags
             * @class econda.tagmanager.tag.MacroProcessor
             */
            var MacroProcessor = (function (_super) {
                __extends(MacroProcessor, _super);
                function MacroProcessor(cfg) {
                    _super.call(this);
                    this._containerVarName = null;
                    this._formatters = {};
                    if (cfg instanceof MacroProcessor) {
                        return this;
                    }
                    this.initConfig(cfg);
                    this.initOutputFormatters();
                }
                //noinspection JSUnusedGlobalSymbols
                MacroProcessor.prototype.setContainerVarName = function (varName) {
                    this._containerVarName = varName;
                    return this;
                };
                //noinspection JSUnusedGlobalSymbols
                MacroProcessor.prototype.getContainerVarName = function () {
                    return this._containerVarName;
                };
                /**
                 * Accepts tag source code and replaces placeholders and returns modifed code
                 * {% macroname %}
                 * {% macroname | escaper %}
                 */
                MacroProcessor.prototype.replaceMacroPlaceholders = function (tagSourceCode, currentEvent) {
                    var _this = this;
                    if (currentEvent === void 0) { currentEvent = null; }
                    return String(tagSourceCode).replace(MacroProcessor.MACRO_PLACEHOLDER_REGEX, function (placeholder, macroName, formatterName, formatterParamsString) {
                        var macroValue = window[_this._containerVarName].getValueByName(macroName, currentEvent);
                        formatterName = String((typeof formatterName !== 'undefined') ? formatterName : 'raw').toLowerCase();
                        if (typeof _this._formatters[formatterName] === 'undefined') {
                            formatterName = 'raw';
                        }
                        var formatterParams = MacroProcessor.parseFormatterParamsString(formatterParamsString);
                        return _this._formatters[formatterName].format(macroName, macroValue, formatterParams);
                    });
                };
                MacroProcessor.parseFormatterParamsString = function (paramsString) {
                    if (typeof paramsString != 'string') {
                        return [];
                    }
                    var params = paramsString.split(',');
                    for (var i = 0; i < params.length; i++) {
                        params[i] = String(params[i]).replace(/^[\s"']+|[\s"']+$/g, '');
                    }
                    return params;
                };
                MacroProcessor.prototype.initOutputFormatters = function () {
                    this._formatters['boolean'] = new econda.tagmanager.macro.output.BooleanFormatter();
                    this._formatters['html'] = new econda.tagmanager.macro.output.HtmlFormatter();
                    this._formatters['js'] = new econda.tagmanager.macro.output.JsFormatter({
                        containerVarName: this._containerVarName
                    });
                    this._formatters['json'] = new econda.tagmanager.macro.output.JsonFormatter();
                    this._formatters['raw'] = new econda.tagmanager.macro.output.RawFormatter();
                    this._formatters['url'] = new econda.tagmanager.macro.output.UrlFormatter();
                };
                MacroProcessor.MACRO_PLACEHOLDER_REGEX = /(?:\{%|###)\s*(\w+)(?:\s*(?:\||:)\s*(\w+)(?:\((.*)\))?)?\s*(?:%\}|###)/g;
                return MacroProcessor;
            }(econda.base.BaseClass));
            tag.MacroProcessor = MacroProcessor;
        })(tag = tagmanager.tag || (tagmanager.tag = {}));
    })(tagmanager = econda.tagmanager || (econda.tagmanager = {}));
})(econda || (econda = {}));