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="IRenderer.ts" />
/// <reference path="../../../base/BaseClass.ts" />
/// <reference path="../../response/Response.ts" />
/// <reference path="../../Widget.ts" />
/// <reference path="../../../util/DomHelper.ts" />
/// <reference path="../../../util/StringUtils.ts" />
var econda;
(function (econda) {
    var recengine;
    (function (recengine) {
        var widget;
        (function (widget_1) {
            var renderer;
            (function (renderer) {
                /**
                 * Class to render widgets using a javascript function.
                 * @class econda.recengine.widget.renderer.FunctionRenderer
                 * @extends econda.base.BaseClass
                 */
                var FunctionRenderer = (function (_super) {
                    __extends(FunctionRenderer, _super);
                    function FunctionRenderer(cfg) {
                        if (cfg === void 0) { cfg = null; }
                        _super.call(this);
                        /**
                         * Widget instance containing response data and target element information
                         * @private
                         */
                        this.widget = null;
                        /**
                         * Function to call for rendering.
                         * @cfg {Function} rendererFn
                         * @accessor
                         */
                        this.rendererFn = null;
                        /**
                         * Scope in which to call {@link #rendererFn}
                         * @cfg {Object} scope
                         * @accessor
                         */
                        this.scope = null;
                        if (cfg instanceof FunctionRenderer) {
                            return cfg;
                        }
                        this.initConfig(cfg);
                    }
                    FunctionRenderer.prototype.getWidget = function () {
                        return this.widget;
                    };
                    FunctionRenderer.prototype.setWidget = function (widget) {
                        this.widget = widget;
                    };
                    FunctionRenderer.prototype.getRendererFn = function () {
                        return this.rendererFn;
                    };
                    FunctionRenderer.prototype.setRendererFn = function (fn) {
                        this.rendererFn = fn;
                        return this;
                    };
                    FunctionRenderer.prototype.getScope = function () {
                        return this.scope;
                    };
                    FunctionRenderer.prototype.setScope = function (scope) {
                        this.scope = scope;
                        return this;
                    };
                    FunctionRenderer.prototype.render = function (result, success) {
                        if (!this.rendererFn) {
                            throw "Widget FunctionRenderer requires a renderer function to be set. No renderer function found. Check widget.renderer.rendererFn.";
                        }
                        // provide target element
                        var targetElement = econda.util.DomHelper.element(this.getWidget().getElement());
                        // setup helper functions
                        var escapeHelper = econda.util.StringUtils;
                        // do rendering
                        var html = this.rendererFn.call(this.scope || this, result, targetElement, escapeHelper);
                        success(html);
                    };
                    return FunctionRenderer;
                }(econda.base.BaseClass));
                renderer.FunctionRenderer = FunctionRenderer; // end of class
            })(renderer = widget_1.renderer || (widget_1.renderer = {}));
        })(widget = recengine.widget || (recengine.widget = {}));
    })(recengine = econda.recengine || (econda.recengine = {}));
})(econda || (econda = {})); // end of module