var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
import { r as registerInstance, c as createEvent, h, g as getElement } from './chunk-82a2445c.js';
import './chunk-d7ac2f15.js';
import { D as DomUtil, S as StringUtil } from './chunk-18ca1c85.js';
var Svg = /** @class */ (function () {
    function Svg(hostRef) {
        registerInstance(this, hostRef);
        this.type = 'template';
        this.svgElementClick = createEvent(this, "svgElementClick", 7);
    }
    Svg.prototype.componentDidLoad = function () { };
    Svg.prototype.componentDidUpdate = function () { };
    Svg.prototype.loadSvg = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        this.loading = true;
                        return [4 /*yield*/, fetch("" + this.src).then(function (response) {
                                return response.text();
                            })
                                .catch(function (error) { return console.error('Error:', error); })];
                    case 1:
                        result = _a.sent();
                        this.loading = false;
                        return [2 /*return*/, result];
                }
            });
        });
    };
    Svg.prototype.parseSvg = function (svgResult) {
        var _this = this;
        var su = StringUtil;
        this._svg = svgResult;
        // illustrator fix
        svgResult = svgResult.replace(']>', '');
        // remove whitespaces around data properties
        svgResult = su.replaceAll(svgResult, '{{ ', '{{');
        svgResult = su.replaceAll(svgResult, '{{  ', '{{');
        svgResult = su.replaceAll(svgResult, ' }}', '}}');
        svgResult = su.replaceAll(svgResult, '  }}', '}}');
        // setVar dynamic data
        if (this.data) {
            Object.keys(this.data).forEach(function (k) {
                svgResult = su.replaceAll(svgResult, '{{' + k + '}}', _this.data[k]);
            });
        }
        this.svgResult = svgResult;
        setTimeout(function (arg) {
            _this.el.querySelector('.embedded').innerHTML = svgResult;
            _this.getElements();
            if (_this.el.querySelector('svg')) {
                _this._svgElement = _this.el.querySelector('svg');
                _this.renderSvg();
            }
        }, 20);
    };
    Svg.prototype.getElements = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ignoredArr, elements;
            var _this = this;
            return __generator(this, function (_a) {
                this.elements = [];
                ignoredArr = ['Shape', 'Oval', 'Rectangle', 'Line', 'Group'];
                elements = this.el.querySelectorAll('*');
                Array.prototype.forEach.call(elements, function (el) {
                    if (DomUtil.getAttributes(el)['id']) {
                        var id_1 = DomUtil.getAttributes(el)['id'];
                        var ignored_1 = false;
                        ignoredArr.forEach(function (ignore) {
                            if (id_1.match(ignore)) {
                                ignored_1 = true;
                            }
                        });
                        if (!ignored_1) {
                            if (id_1.match('btn-')) {
                                el.style.cursor = 'pointer';
                                el.style.opacity = '0';
                            }
                            _this.elements.push({
                                id: id_1,
                                el: el
                            });
                        }
                    }
                });
                this.setClickHandlers();
                return [2 /*return*/, this.elements];
            });
        });
    };
    Svg.prototype.svgElementClickHandler = function (e) {
        var detail;
        e.stopPropagation();
        this.elements.forEach(function (element) {
            if (element.el === e.target) {
                detail = element;
            }
        });
        if (detail) {
            this.svgElementClick.emit(detail);
        }
    };
    Svg.prototype.setClickHandlers = function () {
        var _this = this;
        this.elements.forEach(function (element) {
            if (document.getElementById(element.id)) {
                document.getElementById(element.id).addEventListener('click', function (e) {
                    _this.svgElementClickHandler(e);
                });
                if (element.id.match('btn-'))
                    ;
            }
        });
    };
    Svg.prototype.renderSvg = function () {
        var $svg = this._svgElement;
        var responsive = !(this.el.className.indexOf('img-responsive') === -1);
        var viewBox;
        if ($svg.getAttribute('viewBox')) {
            viewBox = $svg.getAttribute('viewBox');
        }
        // console.log('--------------');
        // console.log('svg: type=' + this.type);
        // console.log('responsive=' + responsive);
        // console.log('viewBox=' + viewBox);
        var w, h;
        // fixme ??
        if (viewBox) {
            w = viewBox.split(' ')[2];
            h = viewBox.split(' ')[3];
            if (responsive === false) {
                // 100%
                this.el.style.width = w + 'px';
                this.el.style.maxWidth = w + 'px';
                this.el.style.height = h + 'px';
                this.el.style.maxHeight = h + 'px';
                $svg.style.width = w + 'px';
                $svg.style.maxWidth = w + 'px';
                $svg.style.height = h + 'px';
                $svg.style.maxHeight = h + 'px';
                var att = void 0;
                att = document.createAttribute('width');
                att.value = w;
                // att.value = w+'px';
                $svg.setAttributeNode(att);
                att = document.createAttribute('height');
                att.value = h;
                // att.value = h+'px';
                $svg.setAttributeNode(att);
            }
            // console.log($svg.getAttribute('width'));
            // console.log($svg.getAttribute('height'));
        }
        // replace Illustrator fonts: fixme: check + remove jQuery dependency
        // if (this.settings.font_replace_map && (<any>window)['$']) {
        //     _.each(this.settings.font_replace_map, function(obj){
        //         _.each(obj, function(v, k){
        //             // presentation export:
        //             $(self.el).find('svg text').each(function(){
        //                 if ($(this).attr('font-family')) {
        //                     if ($(this).attr('font-family').match(k)) {
        //                         // console.log('v',v);
        //                         // console.log('k',k);
        //                         $(this).attr('font-family', $(this).attr('font-family').replace(k, v));
        //                         $(this).css('font-family:' + v);
        //                     }
        //                 }
        //             });
        //             // styles export:
        //             $(self.el).find('svg style').each(function(){
        //                 $(this).text($(this).text().replace(k, v));
        //             });
        //         });
        //     });
        // }
    };
    Svg.prototype.render = function () {
        var _this = this;
        if (this.dataJson) {
            this.data = JSON.parse(this.dataJson);
        }
        if (this.src) {
            this.loadSvg().then(function (res) {
                _this.parseSvg(res);
            });
        }
        return (h("div", { class: "svg-container embedded" }));
    };
    Object.defineProperty(Svg.prototype, "el", {
        get: function () { return getElement(this); },
        enumerable: true,
        configurable: true
    });
    return Svg;
}());
export { Svg as ema_svg };
