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="../../../net/Uri.ts" />
/// <reference path="../../../templating/Template.ts" />
var econda;
(function (econda) {
    var recengine;
    (function (recengine) {
        var widget;
        (function (widget_1) {
            var renderer;
            (function (renderer) {
                var Uri = econda.net.Uri;
                /**
                 * Renderer for template based rendering. Do not use this class directly,
                 * see {@link econda.recengine.Widget} for details.
                 *
                 *    var widget = new econda.recengine.Widget({
                 *      [...]
                 *      element: '#id-of-element',
                 *      renderer: {
                 *          type: 'template',
                 *          uri: '/path/to/template.html'
                 *      }
                 *    });
                 *    widget.render();
                 *
                 * @class econda.recengine.widget.renderer.TemplateRenderer
                 * @extends econda.base.BaseClass
                 */
                var TemplateRenderer = (function (_super) {
                    __extends(TemplateRenderer, _super);
                    function TemplateRenderer(cfg) {
                        _super.call(this);
                        /**
                         * Widget reference
                         * @cfg {econda.recengine.Widget} widget
                         * @private
                         * @accessor
                         */
                        this._widget = null;
                        /**
                         * Absolute or relative uri of template file
                         * @cfg {econda.net.Uri/String} uri
                         * @accessor
                         */
                        this._uri = null;
                        /**
                         * Template source code
                         * @cfg {String} template
                         * @accessor
                         */
                        this._template = null;
                        if (cfg instanceof TemplateRenderer) {
                            return cfg;
                        }
                        this.initConfig(cfg);
                    }
                    TemplateRenderer.prototype.setWidget = function (widget) {
                        this._widget = widget;
                    };
                    TemplateRenderer.prototype.setUri = function (uri) {
                        this._uri = (uri == null) ? null : new Uri(uri);
                        return this;
                    };
                    TemplateRenderer.prototype.getUri = function () {
                        return this._uri;
                    };
                    TemplateRenderer.prototype.getTemplate = function () {
                        return this._template;
                    };
                    TemplateRenderer.prototype.setTemplate = function (html) {
                        this._template = html;
                        return this;
                    };
                    TemplateRenderer.prototype.getElement = function () {
                        return this._element;
                    };
                    TemplateRenderer.prototype.setElement = function (element) {
                        this._element = element;
                        return this;
                    };
                    /**
                     * Render response using specified template.
                     * @method
                     */
                    TemplateRenderer.prototype.render = function (response, success) {
                        var _this = this;
                        var uri = this.getUri();
                        var template = this.getTemplate();
                        var element = this.getElement();
                        var t = new econda.templating.Template({
                            uri: uri,
                            template: template,
                            element: element
                        });
                        // execute errFn if exception in Template
                        try {
                            t.render(response, success, function (err) {
                                var errorFn = _this._widget.getError();
                                if (errorFn) {
                                    errorFn();
                                }
                            });
                        }
                        catch (exception) {
                            var errorFn = this._widget.getError();
                            if (errorFn) {
                                errorFn();
                            }
                        }
                    };
                    return TemplateRenderer;
                }(econda.base.BaseClass));
                renderer.TemplateRenderer = TemplateRenderer; // 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